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/15 17:18:53 UTC

Added XForms representation of new instance form

Hi,

This patch will provide the XForms[1] 1.0 representation of the 'new instance'
form. It's equivalent to HTML form but this one is dedicated to XML media
type consumers like desktop applications or web applications which need
form representation to build their own forms for new instance.

[1] http://www.w3.org/TR/xforms11

 -- Michal


[PATCH core] Added XForms representation of XML new instance form

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


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/deltacloud/hardware_profile.rb          |    8 ++
 .../lib/deltacloud/helpers/application_helper.rb   |    6 +-
 server/server.rb                                   |    5 +-
 server/views/instances/new.xml.haml                |   99 ++++++++++++++++++++
 4 files changed, 114 insertions(+), 4 deletions(-)
 create mode 100644 server/views/instances/new.xml.haml

diff --git a/server/lib/deltacloud/hardware_profile.rb b/server/lib/deltacloud/hardware_profile.rb
index e304d7c..0c2bac9 100644
--- a/server/lib/deltacloud/hardware_profile.rb
+++ b/server/lib/deltacloud/hardware_profile.rb
@@ -68,6 +68,14 @@ module Deltacloud
         kind == :fixed
       end
 
+      def range?
+        kind == :range
+      end
+
+      def enum?
+        kind == :enum
+      end
+
       def to_param
         return nil if kind == :fixed
         if kind == :range
diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index 7c621e9..0b8d76c 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -49,13 +49,17 @@ module ApplicationHelper
   end
 
   def driver_has_feature?(feature_name, collection_name = :instances)
-    not driver.features(collection_name).select{ |f| f.name.eql?(feature_name) }.empty?
+    driver_feature(collection_name, feature_name)
   end
 
   def driver_has_auth_features?
     driver_has_feature?(:authentication_password) || driver_has_feature?(:authentication_key)
   end
 
+  def driver_feature(collection_name, feature_name)
+    driver.features(collection_name).select{ |f| f.name.eql?(feature_name) }.first
+  end
+
   def driver_auth_feature_name
     return 'key' if driver_has_feature?(:authentication_key)
     return 'password' if driver_has_feature?(:authentication_password)
diff --git a/server/server.rb b/server/server.rb
index 2355278..1bbbe51 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -400,9 +400,8 @@ END
       @keys = driver.keys(credentials) if driver_has_feature?(:authentication_key)
       @firewalls = driver.firewalls(credentials) if driver_has_feature?(:firewalls)
       respond_to do |format|
-        format.html do
-          haml :'instances/new'
-        end
+        format.xml { haml :'instances/new' }
+        format.html { haml :'instances/new' }
       end
     end
   end
diff --git a/server/views/instances/new.xml.haml b/server/views/instances/new.xml.haml
new file mode 100644
index 0000000..498dec2
--- /dev/null
+++ b/server/views/instances/new.xml.haml
@@ -0,0 +1,99 @@
+%xforms{ :'xmlns:xf' => "http://www.w3.org/2002/xforms", :'xmlns:xsd' => "http://www.w3.org/2001/XMLSchema", :'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance"}
+  %model
+    %submission{ :id =>"new_instance", :method => "GET",  :action => create_instance_url }
+    %instance
+      %instance
+        %image_id{ :'xsi:type' => 'xsd:token' }=@image ? @image.id : nil
+        - if driver_has_feature?(:user_name) and driver_feature(:instances, :user_name).constraints[:max_length]
+          %xsd:element{ :name => :name }
+            %xsd:simpleType
+              %xsd:restriction{ :base => "xs:string" }
+                %xsd:maxLength{ :value => driver_feature(:instances, :user_name).constraints[:max_length] }
+        - if driver_has_feature?(:user_name)
+          %name{ :'xsi:type' => 'xsd:token' }
+        - if driver_has_feature?(:user_data)
+          %user_data{ :'xsi:type' => 'xsd:base64Binary' }
+        - if driver_has_feature?(:instance_count)
+          %instance_count{ :'xsi:type' => 'xsd:decimal' }
+        - if driver_has_feature?(:authentication_key)
+          %keyname{ :'xsi:type' => 'xsd:token' }
+        - if driver_has_feature?(:register_to_load_balancer)
+          %load_balancer_id{ :'xsi:type' => 'xsd:token' }
+        - if driver_has_feature?(:firewalls)
+          - @firewalls.each_index do |i|
+            ='<firewalls'+i+' xsi:type="xsd:boolean" />'
+        - unless @realms.empty?
+          %realm_id{ :'xsi:type' => 'xsd:token'}=@realms.first.id
+        - unless @hardware_profiles.empty?
+          - @hardware_profiles.each do |profile|
+            %hwp_id{ :'xsi:type' => 'xsd:token', :type => profile.name }
+              - profile.properties.reject { |prop| prop.fixed? }.each do |prop|
+                - if prop.name == :architecture
+                  %hwp_architecture{ :'xsi:type' => 'xsd:token'}=prop.value
+                - else
+                  ='<hwp_'+prop.name.to_s+' xsi:type="xsd:decimal"/>'
+              - profile.properties.select { |prop| prop.fixed? }.each do |prop|
+                - if prop.name == :architecture
+                  %hwp_architecture{ :'xsi:type' => 'xsd:token'}=prop.value
+                - else
+                  ='<hwp_'+prop.name.to_s+' xsi:type="xsd:decimal">'+prop.value.to_s+'</hwp_'+prop.name.to_s+'>'
+  %bind{ :nodeset => "instance/image_id", :required => 'true()'}
+  - if driver_has_feature?(:user_name) and driver_feature(:instances, :user_name).constraints[:max_length]
+    %bind{ :nodeset => "user_name:to", :constraints => ". > ../user_name:from" }
+  %input{ :model => :instance, :ref => "image_id" }
+    %label Image ID
+  - if driver_has_feature?(:user_name)
+    %input{ :model => :instance, :ref => "name" }
+      %label Instance name
+  - if driver_has_feature?(:user_data)
+    %input{ :model => :instance, :ref => "user_data"}
+      %label User data
+  - if driver_has_feature?(:instance_count)
+    %input{ :model => :instance, :ref => "instance_count"}
+      %label Number of instances to launch
+  - unless @realms.empty?
+    %select1{ :model => :instance, :ref => :realm_id}
+      %label Place instance into realm
+      - @realms.each do |realm|
+        %item
+          %name=realm.name
+          %value=realm.id
+  - if driver_has_feature?(:authentication_key)
+    %select1{ :model => :instance, :ref => :authentication_key}
+      %label Instance authentication key
+      - @keys.each do |key|
+        %item
+          %name=key.id
+          %value=key.id
+  - if driver_has_feature?(:register_to_load_balancer)
+    %select1{ :model => :instance, :ref => :load_balancer_id}
+      %label Register instance to loadbalancers
+      - @load_balancers.each do |load_balancer|
+        %item
+          %name=load_balancer.id
+          %value=load_balancer.id
+  - if driver_has_feature?(:firewalls)
+    - @firewalls.each_index do |i|
+      %input{ :model => :instance, :ref => "firewalls#{i}"}
+        %label="Assign to firewall #{i}"
+  - unless @hardware_profiles.empty?
+    %select1{ :model => :instance, :ref => "hwp_id" }
+      %label Hardware Profile
+      - @hardware_profiles.each do |profile|
+        %item{ :type => profile.name}
+          %value=profile.name
+          - profile.properties.select { |prop| prop.fixed? }.each do |prop|
+            %select1{ :model => :instance, :ref => "hwp_id[@type=#{profile.name}]/hwp_#{prop.name}"}
+              %label="#{prop.name.to_s.capitalize}"
+              %item
+                %value=prop.value
+          - profile.properties.reject { |prop| prop.fixed? }.each do |prop|
+            - if prop.range?
+              %range{ :ref => "hwp_id[@type=#{profile.name}]/hwp_#{prop.name}", :model => :instance, :start => prop.first, :end => prop.last, :step => 1}
+                %label="#{prop.name.to_s.capitalize}"
+            -if prop.enum?
+              %select{ :ref => "hwp_id[@type=#{profile.name}]/hwp_#{prop.name}", :model => :instance}
+                %label="#{prop.name.to_s.capitalize}"
+                - prop.values.each do |v|
+                  %item
+                    %value=v
-- 
1.7.4.1