You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by mf...@apache.org on 2011/03/07 13:58:38 UTC
svn commit: r1078765 - in /incubator/deltacloud/trunk/server: ./
lib/deltacloud/drivers/ec2/ lib/deltacloud/drivers/gogrid/
lib/deltacloud/drivers/mock/ lib/deltacloud/drivers/mock/data/instances/
lib/deltacloud/drivers/rackspace/ lib/deltacloud/models...
Author: mfojtik
Date: Mon Mar 7 12:58:38 2011
New Revision: 1078765
URL: http://svn.apache.org/viewvc?rev=1078765&view=rev
Log:
Added Image creation from Instances (EC2, Mock, GoGrid, Rackspace)
Added:
incubator/deltacloud/trunk/server/views/images/new.html.haml
Modified:
incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
incubator/deltacloud/trunk/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst0.yml
incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst1.yml
incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst2.yml
incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb
incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
incubator/deltacloud/trunk/server/lib/deltacloud/models/instance.rb
incubator/deltacloud/trunk/server/server.rb
incubator/deltacloud/trunk/server/views/images/index.xml.haml
incubator/deltacloud/trunk/server/views/images/show.xml.haml
incubator/deltacloud/trunk/server/views/instances/index.xml.haml
incubator/deltacloud/trunk/server/views/instances/show.html.haml
incubator/deltacloud/trunk/server/views/instances/show.xml.haml
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb Mon Mar 7 12:58:38 2011
@@ -155,6 +155,15 @@ module Deltacloud
end
end
+ def create_image(credentials, opts={})
+ ec2 = new_client(credentials)
+ instance = instance(credentials, :id => opts[:id])
+ safely do
+ new_image_id = ec2.create_image(instance.id, opts[:name], opts[:description])
+ image(credentials, :id => new_image_id)
+ end
+ end
+
def instances(credentials, opts={})
ec2 = new_client(credentials)
inst_arr = []
@@ -598,6 +607,7 @@ module Deltacloud
end
def convert_instance(instance)
+ can_create_image = 'ebs'.eql?(instance[:root_device_type]) and 'RUNNING'.eql?(convert_state(instance[:aws_state]))
Instance.new(
:id => instance[:aws_instance_id],
:name => instance[:aws_image_id],
@@ -610,7 +620,8 @@ module Deltacloud
:instance_profile => InstanceProfile.new(instance[:aws_instance_type]),
:realm_id => instance[:aws_availability_zone],
:private_addresses => instance[:private_dns_name],
- :public_addresses => instance[:dns_name]
+ :public_addresses => instance[:dns_name],
+ :create_image => can_create_image
)
end
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb Mon Mar 7 12:58:38 2011
@@ -446,7 +446,8 @@ class GogridDriver < Deltacloud::BaseDri
:public_addresses => [ instance['ip']['ip'] ],
:private_addresses => [],
:username => instance['username'],
- :password => instance['password']
+ :password => instance['password'],
+ :create_image => 'true'.eql?(instance['isSandbox'])
)
end
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst0.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst0.yml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst0.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst0.yml Mon Mar 7 12:58:38 2011
@@ -14,3 +14,4 @@
:actions:
- :reboot
- :stop
+:create_image: true
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst1.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst1.yml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst1.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst1.yml Mon Mar 7 12:58:38 2011
@@ -7,3 +7,4 @@
:realm_id: us
:instance_profile: !ruby/object:InstanceProfile
id: m1-small
+:create_image: true
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst2.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst2.yml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst2.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/instances/inst2.yml Mon Mar 7 12:58:38 2011
@@ -7,3 +7,4 @@
:realm_id: us
:instance_profile: !ruby/object:InstanceProfile
id: m1-large
+:create_image: true
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb Mon Mar 7 12:58:38 2011
@@ -135,6 +135,33 @@ class MockDriver < Deltacloud::BaseDrive
images.sort_by{|e| [e.owner_id,e.description]}
end
+ def create_image(credentials, opts={})
+ check_credentials(credentials)
+ instance = instance(credentials, :id => opts[:instance_id])
+ raise BackendError::new(500, 'CreateImageNotSupported', '', '') unless instance.can_create_image?
+ ids = Dir[ "#{@storage_root}/images/*.yml" ].collect{|e| File.basename( e, ".yml" )}
+ count = 0
+ while true
+ next_id = "img#{count}"
+ break if not ids.include?(next_id)
+ count += 1
+ end
+ safely do
+ image = {
+ :name => opts[:name],
+ :owner_id => 'root',
+ :description => opts[:description],
+ :architecture => 'i386',
+ :state => 'UP'
+ }
+ File.open( "#{@storage_root}/images/#{next_id}.yml", 'w' ) do |f|
+ YAML.dump( image, f )
+ end
+ image[:id] = next_id
+ Image.new(image)
+ end
+ end
+
#
# Instances
#
@@ -197,6 +224,7 @@ class MockDriver < Deltacloud::BaseDrive
:private_addresses=>["#{image_id}.#{next_id}.private.com"],
:instance_profile => InstanceProfile.new(hwp.name, opts),
:realm_id=>realm_id,
+ :create_image=>true,
:actions=>instance_actions_for( 'RUNNING' )
}
File.open( "#{@storage_root}/instances/#{next_id}.yml", 'w' ) {|f|
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb Mon Mar 7 12:58:38 2011
@@ -91,23 +91,21 @@ class RackspaceDriver < Deltacloud::Base
result
end
- # TODO: This action is reserved for create image from instance
- #
- #def create_image(credentials, opts={})
- # rs = new_client(credentials)
- # safely do
- # server = rs.get_server(opts[:id].to_i)
- # image = server.create_image(opts[:name])
- # Image.new(
- # :id => image.id.to_s,
- # :name => image.name,
- # :description => image.name,
- # :owner_id => credentials.user,
- # :state => image.status,
- # :architecture => 'x86_64'
- # )
- # end
- #end
+ def create_image(credentials, opts={})
+ rs = new_client(credentials)
+ safely do
+ server = rs.get_server(opts[:id].to_i)
+ image = server.create_image(opts[:name])
+ Image.new(
+ :id => image.id.to_s,
+ :name => image.name,
+ :description => image.name,
+ :owner_id => credentials.user,
+ :state => image.status,
+ :architecture => 'x86_64'
+ )
+ end
+ end
def run_on_instance(credentials, opts={})
target = instance(credentials, :id => opts[:id])
@@ -359,6 +357,7 @@ private
:password => password ? password : nil
)
inst.actions = instance_actions_for(inst.state)
+ inst.create_image = 'RUNNING'.eql?(inst.state)
inst
end
@@ -376,6 +375,7 @@ private
:public_addresses => server[:addresses][:public],
:private_addresses => server[:addresses][:private]
)
+ inst.create_image = 'RUNNING'.eql?(inst.state)
inst.actions = instance_actions_for(inst.state)
inst
end
Modified: incubator/deltacloud/trunk/server/lib/deltacloud/models/instance.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/models/instance.rb?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/models/instance.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/models/instance.rb Mon Mar 7 12:58:38 2011
@@ -32,6 +32,11 @@ class Instance < BaseModel
attr_accessor :authn_error
attr_accessor :username
attr_accessor :password
+ attr_accessor :create_image
+
+ def can_create_image?
+ self.create_image
+ end
def to_s
name
Modified: incubator/deltacloud/trunk/server/server.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/server.rb?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/server.rb (original)
+++ incubator/deltacloud/trunk/server/server.rb Mon Mar 7 12:58:38 2011
@@ -140,6 +140,13 @@ END
end
+get "/api/images/new" do
+ @instance = Instance.new( :id => params[:instance_id] )
+ respond_to do |format|
+ format.html { haml :"images/new" }
+ end
+end
+
collection :images do
description <<END
An image is a platonic form of a machine. Images are not directly executable,
@@ -165,6 +172,25 @@ END
control { show(:image) }
end
+ operation :create do
+ description 'Create image from instance'
+ with_capability :create_image
+ param :instance_id, :string, :required
+ param :name, :string, :optional
+ param :description, :string, :optional
+ control do
+ @image = driver.create_image(credentials, {
+ :id => params[:instance_id],
+ :name => params[:name],
+ :description => params[:description]
+ })
+ respond_to do |format|
+ format.xml { haml :"images/show" }
+ format.html { haml :"images/show" }
+ end
+ end
+ end
+
end
collection :instance_states do
Modified: incubator/deltacloud/trunk/server/views/images/index.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/images/index.xml.haml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/images/index.xml.haml (original)
+++ incubator/deltacloud/trunk/server/views/images/index.xml.haml Mon Mar 7 12:58:38 2011
@@ -9,4 +9,5 @@
- haml_concat image.send(attribute)
- else
- haml_concat image.send(attribute)
+ %link{ :rel => 'create_instance', :method => :post, :href => "#{instances_url};image_id=#{image.id}"}
Added: incubator/deltacloud/trunk/server/views/images/new.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/images/new.html.haml?rev=1078765&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/views/images/new.html.haml (added)
+++ incubator/deltacloud/trunk/server/views/images/new.html.haml Mon Mar 7 12:58:38 2011
@@ -0,0 +1,14 @@
+%h1 Create image from #{@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' }
Modified: incubator/deltacloud/trunk/server/views/images/show.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/images/show.xml.haml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/images/show.xml.haml (original)
+++ incubator/deltacloud/trunk/server/views/images/show.xml.haml Mon Mar 7 12:58:38 2011
@@ -3,3 +3,4 @@
- @image.attributes.select{ |attr| attr!=:id }.each do |attribute|
- haml_tag(attribute, :<) do
- haml_concat @image.send(attribute)
+ %link{ :rel => 'create_instance', :method => :post, :href => "#{instances_url};image_id=#{@image.id}"}
Modified: incubator/deltacloud/trunk/server/views/instances/index.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/instances/index.xml.haml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/instances/index.xml.haml (original)
+++ incubator/deltacloud/trunk/server/views/instances/index.xml.haml Mon Mar 7 12:58:38 2011
@@ -13,6 +13,10 @@
%actions
- instance.actions.compact.each do |action|
%link{:rel => action, :href => self.send("#{action}_instance_url", instance.id), :method => instance_action_method(action)}
+ - if driver.respond_to?(:run_on_instance)
+ %link{:rel => 'run', :method => :post, :href => run_instance_url(instance.id)}
+ - if instance.can_create_image?
+ %link{:rel => 'create_image', :method => :post, :href => "#{create_image_url};instance_id=#{instance.id}"}
%public_addresses
- instance.public_addresses.each do |address|
%address #{address}
Modified: incubator/deltacloud/trunk/server/views/instances/show.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/instances/show.html.haml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/instances/show.html.haml (original)
+++ incubator/deltacloud/trunk/server/views/instances/show.html.haml Mon Mar 7 12:58:38 2011
@@ -50,3 +50,8 @@
%dd
-@instance.actions.each do |action|
=link_to_action action, self.send(:"#{action}_instance_url", @instance.id), instance_action_method(action)
+ %dt
+ %dd
+ - if @instance.can_create_image?
+ =link_to_action 'Create Image', url_for("/api/images/new?instance_id=#{@instance.id}"), :get
+
Modified: incubator/deltacloud/trunk/server/views/instances/show.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/instances/show.xml.haml?rev=1078765&r1=1078764&r2=1078765&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/instances/show.xml.haml (original)
+++ incubator/deltacloud/trunk/server/views/instances/show.xml.haml Mon Mar 7 12:58:38 2011
@@ -23,6 +23,8 @@
%link{:rel => instance_action, :method => instance_action_method(instance_action), :href => self.send("#{instance_action}_instance_url", @instance.id)}
- if driver.respond_to?(:run_on_instance)
%link{:rel => 'run', :method => :post, :href => run_instance_url(@instance.id)}
+ - if @instance.can_create_image?
+ %link{:rel => 'create_image', :method => :post, :href => "#{create_image_url};instance_id=#{@instance.id}"}
- if @instance.instance_variables.include?("@launch_time")
%launch_time<
=@instance.launch_time