You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2011/08/02 15:29:19 UTC

[PATCH core 1/5] New UI for error reporting

From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 .../lib/deltacloud/helpers/application_helper.rb   |   13 ++++
 server/views/error.html.haml                       |   59 ++++++++-------
 server/views/errors/400.html.haml                  |   55 ++++++++++----
 server/views/errors/401.html.haml                  |   48 ++++++++++---
 server/views/errors/403.html.haml                  |   54 +++++++++++----
 server/views/errors/404.html.haml                  |   40 +++++++---
 server/views/errors/405.html.haml                  |   46 +++++++-----
 server/views/errors/500.html.haml                  |   76 +++++++++++---------
 server/views/errors/502.html.haml                  |   57 +++++++++++----
 .../errors/backend_capability_failure.html.haml    |   36 +++++++---
 10 files changed, 328 insertions(+), 156 deletions(-)

diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index c2cf7c3..37bfec4 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -263,4 +263,17 @@ module ApplicationHelper
     end
   end
 
+  def translate_error_code(code)
+    case code
+      when 400; { :message => "Bad Request" }
+      when 401; { :message => "Unauthorized" }
+      when 403; { :message => "Forbidden" }
+      when 404; { :message => "Not Found" }
+      when 405; { :message => "Method Not Allowed" }
+      when 406; { :message => "Not Acceptable" }
+      when 500; { :message => "Internal Server Error" }
+      when 502; { :message => "Backend Server Error" }
+    end
+  end
+
 end
diff --git a/server/views/error.html.haml b/server/views/error.html.haml
index 155180d..fa82481 100644
--- a/server/views/error.html.haml
+++ b/server/views/error.html.haml
@@ -1,31 +1,36 @@
-!!!
-!!! XML
-
+!!!5
 %html
   %head
-    = stylesheet_link_tag '/stylesheets/compiled/screen.css', :media => 'screen, projection'
-    = stylesheet_link_tag '/stylesheets/compiled/print.css', :media => 'print'
-    /[if lt IE 8]
-      = stylesheet_link_tag '/stylesheets/compiled/ie.css', :media => 'screen, projection'
-    = stylesheet_link_tag '/stylesheets/compiled/application.css', :media => 'screen, projection'
-    %script{:type => "text/javascript", :src => "/javascripts/jquery-1.4.2.min.js" }
+    %title Deltacloud API #{settings.version}
+    = stylesheet_link_tag '/stylesheets/jquery.mobile-1.0b1.min.css'
+    = stylesheet_link_tag '/stylesheets/new.css'
+    %script{:type => "text/javascript", :src => "/javascripts/jquery.min.js" }
     %script{:type => "text/javascript", :src => "/javascripts/application.js" }
+    %script{:type => "text/javascript", :src => "/javascripts/jquery.mobile-1.0b1.min.js" }
+    :javascript
+      $(document).ready(function() {
+        $(document).bind("mobileinit", function(){
+          $.mobile.ajaxEnabled = false;
+          $.mobile.hashListeningEnabled = false;
+        });
+      })
   %body
-    #wrapper
-      #header
-        = link_to image_tag( "/images/logo-wide.png" ), root_url
-      = bread_crumb
-      #content{:class => :error}
-        = yield
-      #footer
-        #formats
-          Format:
-          =link_to_format(:xml)
-          |
-          =link_to_format(:json)
-        #driver_info
-          Driver: #{driver_symbol} | API version: #{settings.version}
-        #copyright
-          Copyright 2009-2011
-          %a{:href => 'http://incubator.apache.org/deltacloud/'} The Apache Software Foundation
-          and individual contributors.
+    %div{ 'data-role' => :page, :'data-theme' => 'e', :class => :error }
+      =header "#{response.status} - #{translate_error_code(response.status)[:message]}"
+      - if @error
+        =subheader @error.message
+      - elsif response.status.to_s =~ /4(\d{2})/
+        =subheader request.env['REQUEST_URI']
+      = yield
+      %div{ 'data-role' => :footer, :'data-theme' => 'a'}
+        %div{ 'data-role' => :navbar}
+          %ul
+            %li
+              %a{ :'data-icon' => 'home', :href => api_url_for(''), :'data-ajax' => 'false'} Home
+            %li=link_to_format(:xml)
+            %li=link_to_format(:json)
+        %div{ 'data-role' => :header, 'data-theme' => 'a' }
+          #copyright
+            Copyright 2009-2011
+            %a{:href => 'http://incubator.apache.org/deltacloud/'} The Apache Software Foundation
+            and individual contributors.
diff --git a/server/views/errors/400.html.haml b/server/views/errors/400.html.haml
index 0743859..1a135f9 100644
--- a/server/views/errors/400.html.haml
+++ b/server/views/errors/400.html.haml
@@ -1,18 +1,41 @@
-%h1 Bad Request
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3=[@error.class.name, @error.message].join(' - ')
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
+    %li{ :'data-role' => 'list-divider'} Error details
+    %li
+      - if @error.class.method_defined? :details
+        %p= @error.details
+      - else
+        %em No details
 
-%p= @error.message
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Backtrace
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      %li
+        %pre=@error.backtrace.join("\n")
 
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Parameter
-    %dd= @error.name
-  %di
-    %dt Status code
-    %dd= response.status
-  %di
-    %dt Explanation
-    %dd
-      The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
+
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
diff --git a/server/views/errors/401.html.haml b/server/views/errors/401.html.haml
index ae1aab2..1a135f9 100644
--- a/server/views/errors/401.html.haml
+++ b/server/views/errors/401.html.haml
@@ -1,11 +1,41 @@
-%h1 Authentication Failure
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3=[@error.class.name, @error.message].join(' - ')
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
+    %li{ :'data-role' => 'list-divider'} Error details
+    %li
+      - if @error.class.method_defined? :details
+        %p= @error.details
+      - else
+        %em No details
 
-%p= @error.message
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Backtrace
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      %li
+        %pre=@error.backtrace.join("\n")
 
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Status code
-    %dd= response.status
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
+
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
diff --git a/server/views/errors/403.html.haml b/server/views/errors/403.html.haml
index c47ab53..1a135f9 100644
--- a/server/views/errors/403.html.haml
+++ b/server/views/errors/403.html.haml
@@ -1,13 +1,41 @@
-%h1 Forbidden
-
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Status code
-    %dd= response.status
-  %di
-    %dt Explanation
-    %dd
-      The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3=[@error.class.name, @error.message].join(' - ')
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
+    %li{ :'data-role' => 'list-divider'} Error details
+    %li
+      - if @error.class.method_defined? :details
+        %p= @error.details
+      - else
+        %em No details
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Backtrace
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      %li
+        %pre=@error.backtrace.join("\n")
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
+
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
diff --git a/server/views/errors/404.html.haml b/server/views/errors/404.html.haml
index 6dc6efc..a9bbe34 100644
--- a/server/views/errors/404.html.haml
+++ b/server/views/errors/404.html.haml
@@ -1,13 +1,29 @@
-%h1 Resource not found
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3 Not Found
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
 
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Status code
-    %dd= response.status
-  %di
-    %dt Explanation
-    %dd
-      The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent. 
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
+
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
diff --git a/server/views/errors/405.html.haml b/server/views/errors/405.html.haml
index 4227818..12e51b0 100644
--- a/server/views/errors/405.html.haml
+++ b/server/views/errors/405.html.haml
@@ -1,21 +1,29 @@
-%h1 Method Not Allowed
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3 Method not allowed on given resource
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
 
-%p
-  A 405 status code is returned when the client has tried to use a request method that the server does not allow. Request methods that are allowed should be sent with the response (common request methods are POST and GET).
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
 
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Request headers
-    %dd
-      %pre
-        =request.env.inspect
-  %di
-    %dt Status code
-    %dd= response.status
-  %di
-    %dt Explanation
-    %dd
-      The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. The response MUST include an Allow header containing a list of valid methods for the requested resource.
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
diff --git a/server/views/errors/500.html.haml b/server/views/errors/500.html.haml
index ec34ce2..19cf090 100644
--- a/server/views/errors/500.html.haml
+++ b/server/views/errors/500.html.haml
@@ -1,37 +1,43 @@
-%h1 Internal Server Error
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3=[@error.class.name, @error.message].join(' - ')
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
+    %li{ :'data-role' => 'list-divider'} Error details
+    %li
+      - if @error.class.method_defined? :details
+        %p= @error.details
+      - else
+        %em No details
 
-%p= "#{@error.class}: #{@error.message}"
-- if @error.class.method_defined? :details
-  %p= @error.details
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Backtrace
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      %li
+        %pre=@error.backtrace.join("\n")
 
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Request headers
-    %dd
-      %pre
-        =request.env.inspect
-  %di
-    %dt Parameters
-    %dd
-      %pre
-        =params.inspect
-  %di
-    %dt Response headers
-    %dd
-      %pre
-        =response.headers.inspect
-  %di
-    %dt Code
-    %dd 500
-  %di
-    %dt Backtrace
-    %dd
-      %pre
-        =@error.backtrace.join("\n")
-  %di
-    %dt Explanation
-    %dd
-      The server encountered an unexpected condition which prevented it from fulfilling the request.
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        - next if value.inspect.to_s == '#'
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
+
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        - next if value.inspect.to_s == '#'
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
diff --git a/server/views/errors/502.html.haml b/server/views/errors/502.html.haml
index 31eac25..19cf090 100644
--- a/server/views/errors/502.html.haml
+++ b/server/views/errors/502.html.haml
@@ -1,18 +1,43 @@
-%h1 Backend provider error
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3=[@error.class.name, @error.message].join(' - ')
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
+    %li{ :'data-role' => 'list-divider'} Error details
+    %li
+      - if @error.class.method_defined? :details
+        %p= @error.details
+      - else
+        %em No details
 
-%p= @error.message
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Backtrace
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      %li
+        %pre=@error.backtrace.join("\n")
 
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Parameters
-    %dd= params.inspect
-  %di
-    %dt Code
-    %dd= @error.code
-  %di
-    %dt Explanation
-    %dd
-      The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request.
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        - next if value.inspect.to_s == '#'
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
+
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        - next if value.inspect.to_s == '#'
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
diff --git a/server/views/errors/backend_capability_failure.html.haml b/server/views/errors/backend_capability_failure.html.haml
index dc830d8..3659ac5 100644
--- a/server/views/errors/backend_capability_failure.html.haml
+++ b/server/views/errors/backend_capability_failure.html.haml
@@ -1,11 +1,29 @@
-%h1 Backend Capability Failure
+%div{ :'data-role' => :content, :'data-theme' => 'b'}
+  %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+    %li{ :'data-role' => 'list-divider'} Server message
+    %li
+      %h3 Backend capability failure
+    %li{ :'data-role' => 'list-divider'} Original request URI
+    %li
+      %a{ :href => request.env['REQUEST_URI'], :'data-ajax' => 'false'}
+        %span=request.env['REQUEST_URI']
+        %span{ :class => 'ui-li-count'} Retry
 
-%p= @error.message
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Parameters
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - if params.keys.empty?
+        %li{ :'data-role' => 'list-divider'} No parameters
+      - params.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
 
-%dl
-  %di
-    %dt Request URL
-    %dd= request.env['REQUEST_URI']
-  %di
-    %dt Capability
-    %dd= @error.capability
+
+  %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
+    %h3 Request details
+    %ul{ :'data-role' => :listview , :'data-inset' => :true, :'data-divider-theme' => 'e'}
+      - request.env.each do |key, value|
+        %li{ :'data-role' => 'list-divider'}=key
+        %li
+          %span{:style => 'font-weight:normal;'}=value.inspect
-- 
1.7.4.1


Re: [PATCH core 3/5] RHEVM: Added VNC address type for VNC access

Posted by David Lutterkort <lu...@redhat.com>.
On Tue, 2011-08-02 at 15:29 +0200, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> 
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
>  .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |    6 +++++-
>  .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |    1 +
>  .../lib/deltacloud/helpers/application_helper.rb   |    1 +
>  3 files changed, 7 insertions(+), 1 deletions(-)

ACK. One comment:

> diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> index cadaaff..c5ffebe 100644
> --- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
>
> diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> index c0087e8..832620a 100644
> --- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> @@ -213,6 +213,7 @@ class RHEVMDriver < Deltacloud::BaseDriver
>      # If everything fails fallback to report MAC address
>      public_addresses = inst.macs if public_addresses.empty?
>      public_addresses.flatten!
> +    public_addresses << inst.vnc if inst.vnc
>      Instance.new(
>        :id => inst.id,
>        :name => inst.name,
> diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
> index 37bfec4..4b13d48 100644
> --- a/server/lib/deltacloud/helpers/application_helper.rb
> +++ b/server/lib/deltacloud/helpers/application_helper.rb
> @@ -250,6 +250,7 @@ module ApplicationHelper
>    def address_type(address)
>      case address
>        when /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?$/; :ipv4
> +      when /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?:([\-\d]+)$/; :vnc
>        when /^(\S{1,2}:\S{1,2}:\S{1,2}:\S{1,2}:\S{1,2}:\S{1,2})?$/; :mac
>        else :hostname
>      end

It would be cleaner if we stored the type of address explicitly in
public_addresses instead of guessing it; especially since now a RHEV-M
vnc address in theory could look like type ipv4.

Instead of pushing just the address onto public_addresses, we should
just push a pair [type, address], i.e. [:vnc, "172.16.0.1"] or a hash
{ :vnc => "172.16.0.1" }

Since this will be fairly invasive across all drivers, this should wait
until after the next release. When you commit the patch, just put a
FIXME comment into address_type

David



[PATCH core 3/5] RHEVM: Added VNC address type for VNC access

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |    6 +++++-
 .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |    1 +
 .../lib/deltacloud/helpers/application_helper.rb   |    1 +
 3 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
index cadaaff..c5ffebe 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
@@ -197,7 +197,7 @@ module RHEVM
   class VM < BaseObject
     attr_reader :description, :status, :memory, :profile, :display, :host, :cluster, :template, :macs
     attr_reader :storage, :cores, :username, :creation_time
-    attr_reader :ip
+    attr_reader :ip, :vnc
 
     def initialize(client, xml)
       super(client, xml[:id], xml[:href], (xml/'name').first.text)
@@ -227,6 +227,10 @@ module RHEVM
       @macs = (xml/'nics/nic/mac').collect { |mac| mac[:address] }
       @creation_time = (xml/'creation_time').text
       @ip = ((xml/'guest_info/ip').first[:address] rescue nil)
+      unless @ip
+        @vnc = ((xml/'display/address').first.text rescue "127.0.0.1")
+        @vnc += ":#{((xml/'display/port').first.text rescue "5890")}"
+      end
     end
 
   end
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
index c0087e8..832620a 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
@@ -213,6 +213,7 @@ class RHEVMDriver < Deltacloud::BaseDriver
     # If everything fails fallback to report MAC address
     public_addresses = inst.macs if public_addresses.empty?
     public_addresses.flatten!
+    public_addresses << inst.vnc if inst.vnc
     Instance.new(
       :id => inst.id,
       :name => inst.name,
diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index 37bfec4..4b13d48 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -250,6 +250,7 @@ module ApplicationHelper
   def address_type(address)
     case address
       when /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?$/; :ipv4
+      when /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?:([\-\d]+)$/; :vnc
       when /^(\S{1,2}:\S{1,2}:\S{1,2}:\S{1,2}:\S{1,2}:\S{1,2})?$/; :mac
       else :hostname
     end
-- 
1.7.4.1


Re: [PATCH core 2/5] Fixed create image UI

Posted by David Lutterkort <lu...@redhat.com>.
On Tue, 2011-08-02 at 15:29 +0200, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> 
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
>  server/views/images/new.html.haml |   25 ++++++++++++-------------
>  1 files changed, 12 insertions(+), 13 deletions(-)

ACK



[PATCH core 2/5] Fixed create image UI

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/views/images/new.html.haml |   25 ++++++++++++-------------
 1 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/server/views/images/new.html.haml b/server/views/images/new.html.haml
index 728fa5d..263caf2 100644
--- a/server/views/images/new.html.haml
+++ b/server/views/images/new.html.haml
@@ -1,14 +1,13 @@
-%h1 Create image from #{@instance.id}
+=header "Create new image"
+=subheader "#{@instance.id}"
 
-%form{ :action => images_url, :method => :post, :class => :new_instance }
-  %input{ :name => :instance_id, :type => :hidden, :value => @instance.id }/
-  %p
-    %label
-      Name:
-    %input{ :name => :name, :size => 30, :type => :text }/
-  %p
-    %label
-      Description:
-    %textarea{ :name => :description, :cols => 70, :rows => 20}
-  %p
-    %input{ :type => :submit, :value => 'Create' }
+%div{ :'data-role' => :content, :'data-theme' => 'c', :class => 'middle-dialog'}
+  %form{ :action => images_url, :method => :post}
+    %input{ :type => :hidden, :name => :instance_id, :value => @instance.id}
+    %div{ 'data-role' => :fieldcontain }
+      %label{ :for => :name} Name:
+      %input{ :type => :text, :id => :name, :name => :name, :value => '' }
+    %div{ 'data-role' => :fieldcontain }
+      %label{ :for => :description} Description:
+      %input{ :type => :text, :id => :description, :name => :description, :value => '' }
+    %button{ :type => :submit} Create
-- 
1.7.4.1


Re: [PATCH core 4/5] RHEVM: Added create_image from instance

Posted by David Lutterkort <lu...@redhat.com>.
On Tue, 2011-08-02 at 15:29 +0200, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> 
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
>  .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |   22 ++++++++++++++++++++
>  .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   21 ++++++++++++++++++-
>  2 files changed, 42 insertions(+), 1 deletions(-)

ACK
 
> @@ -299,6 +314,10 @@ class RHEVMDriver < Deltacloud::BaseDriver
>        status 500
>      end
>  
> +    on /ERROR:(.*)/ do
> +      status 500
> +    end
> +

Wouldn't 400 Bad request or 404 Not found be more appropriate ?

David



[PATCH core 4/5] RHEVM: Added create_image from instance

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |   22 ++++++++++++++++++++
 .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   21 ++++++++++++++++++-
 2 files changed, 42 insertions(+), 1 deletions(-)

diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
index c5ffebe..04bd5b4 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
@@ -74,6 +74,28 @@ module RHEVM
       RHEVM::VM::new(self, Nokogiri::XML(vm).root)
     end
 
+    def create_template(vm_id, opts={})
+      opts ||= {}
+      puts vm_id
+      puts opts.inspect
+      builder = Nokogiri::XML::Builder.new do
+        template_ {
+          name opts[:name]
+          description opts[:description]
+          vm(:id => vm_id)
+        }
+      end
+      headers = opts[:headers] || {}
+      headers.merge!({
+        :content_type => 'application/xml',
+        :accept => 'application/xml',
+      })
+      headers.merge!(auth_header)
+      template = RHEVM::client(@api_entrypoint)["/templates"].post(Nokogiri::XML(builder.to_xml).root.to_s, headers)
+      puts template
+      RHEVM::Template::new(self, Nokogiri::XML(template).root)
+    end
+
     def templates(opts={})
       headers = {
         :accept => "application/xml"
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
index 832620a..bf81683 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
@@ -102,6 +102,20 @@ class RHEVMDriver < Deltacloud::BaseDriver
     img_arr.sort_by{|e| [e.owner_id, e.name]}
   end
 
+  def create_image(credentials, opts={})
+    client = new_client(credentials)
+    unless opts[:name]
+      instance = instances(credentials, :id => opts[:id])
+      raise "ERROR: Unknown instance ID"
+      template_name = "#{instance.first.name}-template"
+    end
+    safely do
+      new_image = client.create_template(opts[:id], :name => (opts[:name] || template_name),
+                                         :description => opts[:description])
+      convert_image(client, new_image)
+    end
+  end
+
   def instances(credentials, opts={})
     client = new_client(credentials)
     inst_arr = []
@@ -226,7 +240,8 @@ class RHEVMDriver < Deltacloud::BaseDriver
       :hardware_profile_id => profile.id,
       :actions=>instance_actions_for( state ),
       :public_addresses => public_addresses,
-      :private_addresses => []
+      :private_addresses => [],
+      :create_image => true
     )
   end
 
@@ -299,6 +314,10 @@ class RHEVMDriver < Deltacloud::BaseDriver
       status 500
     end
 
+    on /ERROR:(.*)/ do
+      status 500
+    end
+
     on /Parameter name/ do
       status 400
     end
-- 
1.7.4.1


Re: [PATCH core 5/5] RHEVM: Added destroy_image action

Posted by David Lutterkort <lu...@redhat.com>.
On Tue, 2011-08-02 at 15:29 +0200, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> 
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
>  .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |   10 ++++++++++
>  .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |    9 +++++++++
>  2 files changed, 19 insertions(+), 0 deletions(-)

ACK



[PATCH core 5/5] RHEVM: Added destroy_image action

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |   10 ++++++++++
 .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |    9 +++++++++
 2 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
index 04bd5b4..b4a2a80 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
@@ -96,6 +96,16 @@ module RHEVM
       RHEVM::Template::new(self, Nokogiri::XML(template).root)
     end
 
+    def destroy_template(id, headers={})
+      headers.merge!({
+        :content_type => 'application/xml',
+        :accept => 'application/xml',
+      })
+      headers.merge!(auth_header)
+      RHEVM::client(@api_entrypoint)["/templates/%s" % id].delete(headers)
+      return true
+    end
+
     def templates(opts={})
       headers = {
         :accept => "application/xml"
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
index bf81683..1a8eaab 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
@@ -116,6 +116,15 @@ class RHEVMDriver < Deltacloud::BaseDriver
     end
   end
 
+  def destroy_image(credentials, image_id)
+    client = new_client(credentials)
+    safely do
+      unless client.destroy_template(image_id)
+        raise "ERROR: Unable to remove image"
+      end
+    end
+  end
+
   def instances(credentials, opts={})
     client = new_client(credentials)
     inst_arr = []
-- 
1.7.4.1


Re: [PATCH core 1/5] New UI for error reporting

Posted by David Lutterkort <lu...@redhat.com>.
On Tue, 2011-08-02 at 15:29 +0200, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> 
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
>  .../lib/deltacloud/helpers/application_helper.rb   |   13 ++++
>  server/views/error.html.haml                       |   59 ++++++++-------
>  server/views/errors/400.html.haml                  |   55 ++++++++++----
>  server/views/errors/401.html.haml                  |   48 ++++++++++---
>  server/views/errors/403.html.haml                  |   54 +++++++++++----
>  server/views/errors/404.html.haml                  |   40 +++++++---
>  server/views/errors/405.html.haml                  |   46 +++++++-----
>  server/views/errors/500.html.haml                  |   76 +++++++++++---------
>  server/views/errors/502.html.haml                  |   57 +++++++++++----
>  .../errors/backend_capability_failure.html.haml    |   36 +++++++---
>  10 files changed, 328 insertions(+), 156 deletions(-)

ACK