From: Michal Fojtik <[email protected]> The new 'root_type' attribute in case of Image contains information about the root device type. There are two possible values:
persistent - Volume or other 'persistent' storage type (EBS) transient - Default device that is part of the Image itself (instance-store) In case of HardwareProfile this attribute is presented as a fixed 'property' called 'root_type'. The possible values are the same as above. The hardware profile and image root_type attributes *must* match in order to create a new instance. In other case an HTTP 400 (Bad Request) will be returned to client. Signed-off-by: Michal fojtik <[email protected]> --- server/lib/deltacloud/collections/instances.rb | 2 +- server/lib/deltacloud/drivers/ec2/ec2_driver.rb | 13 ++++++++++++- server/lib/deltacloud/models/hardware_profile.rb | 4 ++++ server/lib/deltacloud/models/image.rb | 6 ++++++ server/tests/drivers/ec2/images_test.rb | 7 +++++++ server/views/images/show.html.haml | 5 ++++- server/views/images/show.xml.haml | 1 + server/views/instances/new.html.haml | 2 +- 8 files changed, 36 insertions(+), 4 deletions(-) diff --git a/server/lib/deltacloud/collections/instances.rb b/server/lib/deltacloud/collections/instances.rb index ffdf09d..adddacf 100644 --- a/server/lib/deltacloud/collections/instances.rb +++ b/server/lib/deltacloud/collections/instances.rb @@ -23,7 +23,7 @@ module Deltacloud::Collections new_route_for(:instances) do @instance = Instance.new( { :id=>params[:id], :image_id=>params[:image_id] } ) - @image = Image.new( :id => params[:image_id] ) + @image = driver.image(credentials, :id => params[:image_id]) @hardware_profiles = driver.hardware_profiles(credentials, :architecture => @image.architecture ) @realms = [Realm.new(:id => params[:realm_id])] if params[:realm_id] @realms ||= driver.realms(credentials) diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb index 9c10ff8..cd048c9 100644 --- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb +++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb @@ -53,6 +53,7 @@ module Deltacloud memory 613 storage 160 architecture ['i386','x86_64'] + root_type :persistent end define_hardware_profile('m1.small') do @@ -938,10 +939,15 @@ module Deltacloud :owner_id => image[:aws_owner], :architecture => image[:aws_architecture], :hardware_profiles => image_profiles(image, profiles), - :state => image[:aws_state] + :state => image[:aws_state], + :root_type => convert_root_type(image[:aws_root_device_type]) ) end + def convert_root_type(type) + type == 'ebs' ? 'persistent' : 'transient' + end + def convert_instance(instance) can_create_image = 'ebs'.eql?(instance[:root_device_type]) and 'RUNNING'.eql?(convert_state(instance[:aws_state])) inst_profile_opts={} @@ -1146,6 +1152,11 @@ module Deltacloud end exceptions do + + on /root device is not supported for the instance/ do + status 400 + end + on /(AuthFailure|InvalidAccessKeyId)/ do status 401 end diff --git a/server/lib/deltacloud/models/hardware_profile.rb b/server/lib/deltacloud/models/hardware_profile.rb index 5b4aa4e..9d76a2e 100644 --- a/server/lib/deltacloud/models/hardware_profile.rb +++ b/server/lib/deltacloud/models/hardware_profile.rb @@ -46,11 +46,15 @@ module Deltacloud property :architecture property :memory property :storage + property :root_type def initialize(profile_id, &block) @properties = {} super(:id => profile_id) result = instance_eval(&block) if block_given? + unless @properties.include? :root_type + root_type(:transient) + end @name ||= profile_id result end diff --git a/server/lib/deltacloud/models/image.rb b/server/lib/deltacloud/models/image.rb index 551d861..6359661 100644 --- a/server/lib/deltacloud/models/image.rb +++ b/server/lib/deltacloud/models/image.rb @@ -24,6 +24,11 @@ class Image < BaseModel attr_accessor :state attr_accessor :hardware_profiles attr_accessor :creation_time + attr_accessor :root_type + + def root_type + @root_type || 'transient' + end def to_hash(context) { @@ -34,6 +39,7 @@ class Image < BaseModel :owner => owner_id, :architecture => architecture, :state => state, + :root_type => storage_type, :creation_time => creation_time, :hardware_profiles => hardware_profiles.map { |p| { :id => p.id, :href => context.hardware_profile_url(p.id), :rel => :hardware_profile } diff --git a/server/tests/drivers/ec2/images_test.rb b/server/tests/drivers/ec2/images_test.rb index 857ede7..cf56c9f 100644 --- a/server/tests/drivers/ec2/images_test.rb +++ b/server/tests/drivers/ec2/images_test.rb @@ -45,4 +45,11 @@ describe 'Ec2Driver Images' do @driver.image(:id => 'unknown').must_be_nil end + it 'must advertise the image storage_type' do + VCR.insert_cassette 'test_0004_must_allow_to_retrieve_single_image' + @driver.image(:id => 'ami-aecd60c7').wont_be_nil + @driver.image(:id => 'ami-aecd60c7').storage_type.wont_be_nil + @driver.image(:id => 'ami-aecd60c7').storage_type.must_equal 'ebs' + end + end diff --git a/server/views/images/show.html.haml b/server/views/images/show.html.haml index f12ecb4..4ee622d 100644 --- a/server/views/images/show.html.haml +++ b/server/views/images/show.html.haml @@ -21,11 +21,14 @@ %li{ :'data-role' => 'list-divider'} Creation Time %li %p{ :'data-role' => 'fieldcontain'}[email protected]_time + %li{ :'data-role' => 'list-divider'} Root Device Type + %li + %p{ :'data-role' => 'fieldcontain'}[email protected]_type %li{ :'data-role' => 'list-divider'} Architecture %li %p{ :'data-role' => 'fieldcontain'}[email protected] - if @image.hardware_profiles - %li{ :'data-role' => 'list-divider'} Hardware Profiles + %li{ :'data-role' => 'list-divider'} Compatible Hardware Profiles %li %div{ :'data-role' => 'controlgroup', :'data-type' => "horizontal" } - @image.hardware_profiles.each do |hwp| diff --git a/server/views/images/show.xml.haml b/server/views/images/show.xml.haml index db33666..ac014af 100644 --- a/server/views/images/show.xml.haml +++ b/server/views/images/show.xml.haml @@ -13,6 +13,7 @@ %hardware_profiles - @image.hardware_profiles.each do |profile| %hardware_profile{ :href => hardware_profile_url(profile.id), :id => profile.id, :rel => :hardware_profile } + %[email protected]_type %actions %link{ :rel => 'create_instance', :method => :post, :href => "#{instances_url};image_id=#{@image.id}"} - if driver.respond_to? :destroy_image diff --git a/server/views/instances/new.html.haml b/server/views/instances/new.html.haml index 77881ea..f6f674e 100644 --- a/server/views/instances/new.html.haml +++ b/server/views/instances/new.html.haml @@ -2,7 +2,7 @@ =subheader "#{@image.id}" .hidden_content - - @hardware_profiles.each do |profile| + - @image.hardware_profiles.each do |profile| %div{ :'data-role' => :fieldcontain, :id => "hwp_properties_#{profile.name}", :class => 'property_block'} - profile.properties.reject { |prop| prop.fixed? }.each do |prop| %label{ :for => "#{prop.param}_#{profile.name}", :class => 'ui-input-text' }=prop.name -- 1.8.1
