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:54 UTC

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

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