From: David Lutterkort lutter@redhat.com
--- server/lib/converters/xml_converter.rb | 7 ++++ .../deltacloud/helpers/hardware_profiles_helper.rb | 17 +++++++++- server/server.rb | 6 ++++ server/views/instances/new.html.haml | 32 +++++++++++++++---- server/views/instances/show.html.haml | 6 ++++ 5 files changed, 59 insertions(+), 9 deletions(-)
diff --git a/server/lib/converters/xml_converter.rb b/server/lib/converters/xml_converter.rb index 0b11fd7..4b8e78e 100644 --- a/server/lib/converters/xml_converter.rb +++ b/server/lib/converters/xml_converter.rb @@ -82,6 +82,13 @@ module Converters builder.owner_id( obj.owner_id ) builder.image( :href=>@link_builder.send( :image_url, obj.image_id ) ) builder.flavor( :href=>@link_builder.send( :flavor_url, obj.flavor_id ) ) + builder.__send__( 'hardware-profile', :href=>@link_builder.send( :hardware_profile_url, obj.instance_profile.name) ) do + builder.id( obj.instance_profile.name ) + obj.instance_profile.overrides.each do |p, v| + u = ::Deltacloud::HardwareProfile::unit(p) + builder.property( :kind=>:fixed, :name=>p, :unit=>u, :value=>v ) + end + end builder.realm( :href=>@link_builder.send( :realm_url, obj.realm_id ) ) if obj.realm_id builder.state( obj.state ) builder.actions { diff --git a/server/lib/deltacloud/helpers/hardware_profiles_helper.rb b/server/lib/deltacloud/helpers/hardware_profiles_helper.rb index 6269c23..ff7f239 100644 --- a/server/lib/deltacloud/helpers/hardware_profiles_helper.rb +++ b/server/lib/deltacloud/helpers/hardware_profiles_helper.rb @@ -13,10 +13,23 @@ module HardwareProfilesHelper end end
+ def format_instance_profile(ip) + o = ip.overrides.collect do |p, v| + u = hardware_property_unit(p) + "#{p} = #{v} #{u}" + end + if o.empty? + "" + else + "with #{o.join(", ")}" + end + end + + private def hardware_property_unit(prop) - u = prop.unit + u = ::Deltacloud::HardwareProfile::unit(prop) u = "" if ["label", "count"].include?(u) - u = "vcpus" if prop.name == :cpu + u = "vcpus" if prop == :cpu u end end diff --git a/server/server.rb b/server/server.rb index 7151f47..5c1bd73 100644 --- a/server/server.rb +++ b/server/server.rb @@ -203,6 +203,7 @@ get "/api/instances/new" do @instance = Instance.new( { :id=>params[:id], :image_id=>params[:image_id] } ) @image = driver.image( credentials, :id => params[:image_id] ) @flavors = driver.flavors( credentials, { :architecture=>@image.architecture } ) + @hardware_profiles = driver.hardware_profiles(credentials, :architecture => @image.architecture ) @realms = driver.realms(credentials) respond_to do |format| format.html { haml :"instances/new" } @@ -238,7 +239,12 @@ collection :instances do param :image_id, :string, :required param :realm_id, :string, :optional param :flavor_id, :string, :optional + param :hwp_id, :string, :optional control do + # FIXME: Strictly speaking, we'd need to check that only either + # hwp_id or flavor_id are set, but not both. Since flavors will go + # away shortly, we can be a little sloppy + params[:hwp_id] = params[:flavor_id] if params[:flavor_id] @image = driver.image(credentials, :id => params[:image_id]) instance = driver.create_instance(credentials, @image.id, params) respond_to do |format| diff --git a/server/views/instances/new.html.haml b/server/views/instances/new.html.haml index ded9106..c746475 100644 --- a/server/views/instances/new.html.haml +++ b/server/views/instances/new.html.haml @@ -8,16 +8,34 @@ %label Instance Name: %input{ :name => 'name', :size => 30 }/ - - if !@flavors.empty? - %h3 What flavor of machine? - - for flavor in @flavors + - if !@hardware_profiles.empty? + %h3 What size machine? + - for hwp in @hardware_profiles .radio-group - %label{ :for => "flavor_id_#{flavor.id}" } - %input{ :type => :radio, :name => 'flavor_id', :value => flavor.id }/ - = flavor.id + %label{ :for => "hwp_id_#{hwp.name}" } + %input{ :type => :radio, :name => 'hwp_id', :value => hwp.name }/ + = hwp.name %br/ %span.radio-group-details - = "#{flavor.architecture}, #{flavor.memory} GB, #{flavor.storage} GB" + - first = true + - hwp.properties.select { |prop| prop.fixed? }.each do |prop| + - unless first + , + - first = false + = format_hardware_property prop + - hwp.properties.reject { |prop| prop.fixed? }.each do |prop| + %span.radio-group-details + %label{ :for => "#{prop.param}_#{hwp.name}" } + = prop.name + - if prop.kind == :enum + %select{ :size => 1, :name => prop.param } + - for v in prop.values + %option= v + = prop.unit + - else + %input{ :name => prop.param, :size => 10, :value => "#{prop.default}" } + = prop.unit + (value must be between #{prop.first} #{prop.unit} and #{prop.last} #{prop.unit}) - if !@realms.empty? %h3 Where do you want it? - for realm in @realms diff --git a/server/views/instances/show.html.haml b/server/views/instances/show.html.haml index aa285e8..2a81c12 100644 --- a/server/views/instances/show.html.haml +++ b/server/views/instances/show.html.haml @@ -19,6 +19,12 @@ %dd = @instance.flavor_id ? link_to(@instance.flavor_id, flavor_url(@instance.flavor_id)) : 'default' %di + %dt Hardware Profile + %dd + - prof = @instance.instance_profile + = link_to(prof.name, hardware_profile_url(prof.name)) + = format_instance_profile(prof) + %di %dt Realm %dd = @instance.realm_id ? link_to(@instance.realm_id, realm_url(@instance.realm_id)) : 'default'