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/05/11 11:24:35 UTC
[PATCH core] Initial POST body XML support for creating new instances
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
server/lib/deltacloud/drivers/mock/mock_driver.rb | 71 +++++++++++++++------
server/lib/sinatra/rabbit.rb | 2 +-
server/server.rb | 1 +
3 files changed, 54 insertions(+), 20 deletions(-)
diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb b/server/lib/deltacloud/drivers/mock/mock_driver.rb
index 83a7404..a3522fa 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
@@ -21,6 +21,8 @@ require 'yaml'
module Deltacloud
module Drivers
module Mock
+ require 'nokogiri'
+
class MockDriver < Deltacloud::BaseDriver
# If the provider is set to storage, pretend to be a storage-only
@@ -197,37 +199,38 @@ class MockDriver < Deltacloud::BaseDriver
count = 0
while true
next_id = "inst" + count.to_s
- if not ids.include?(next_id)
- break
- end
- count = count + 1
- end
-
- realm_id = opts[:realm_id]
- if ( realm_id.nil? )
- realm = realms(credentials).first
- ( realm_id = realm.id ) if realm
+ break if not ids.include?(next_id)
+ count += 1
end
- hwp = find_hardware_profile(credentials, opts[:hwp_id], image_id)
-
- name = opts[:name] || "i-#{Time.now.to_i}"
-
instance = {
- :name=>name,
- :state=>'RUNNING',
- :image_id=>image_id,
+ :state => 'RUNNING',
:owner_id=>credentials.user,
:public_addresses=>["#{image_id}.#{next_id}.public.com"],
: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' )
}
+
+ if opts[:instance]
+ instance.merge!(convert_instance_xml(opts[:instance]))
+ raise Deltacloud::Validation::Failure.new(:image_id, 'Required element <image id=""/> not found') if instance[:image_id] == ''
+ else
+ realm_id = opts[:realm_id] ? opts[:realm_id] : realms(credentials).first.id
+ hwp = find_hardware_profile(credentials, opts[:hwp_id], image_id)
+ name = opts[:name] || "i-#{Time.now.to_i}"
+ instance.merge!({
+ :name=>name,
+ :image_id=>image_id,
+ :instance_profile => InstanceProfile.new(hwp.name, opts),
+ :realm_id=>realm_id,
+ })
+ end
+
File.open( "#{@storage_root}/instances/#{next_id}.yml", 'w' ) {|f|
YAML.dump( instance, f )
}
+
instance[:id] = next_id
Instance.new( instance )
end
@@ -503,6 +506,36 @@ class MockDriver < Deltacloud::BaseDriver
end
end
+ # Convert POST XML to instance
+ #
+ # XML example:
+ #
+ # <instance>
+ # <name>inst10</name>
+ # <image id="img1"/>
+ # <realm id="us"/>
+ # <hardware_profile id="m1-small">
+ # <memory>512<memory>
+ # <cpu>2<cpu>
+ # <storage>10<storage>
+ # <architecture>i386<architecture>
+ # </hardware_profile>
+ # </instance>
+ #
+ def convert_instance_xml(instance_xml)
+ doc = (Nokogiri::XML(instance_xml)/'instance')
+ hwp_opts = {}
+ (doc/'hardware_profile/*').each do |attr|
+ hwp_opts[:"hwp_#{attr.name}"] = attr.text
+ end
+ {
+ :name => (doc/'name').text,
+ :image_id => (doc/'image/@id').text,
+ :realm_id => (doc/'realm/@id').text,
+ :instace_profile => InstanceProfile.new((doc/'image/@id').text, hwp_opts),
+ }
+ end
+
exceptions do
on /AuthFailure/ do
diff --git a/server/lib/sinatra/rabbit.rb b/server/lib/sinatra/rabbit.rb
index 3d40112..bfe58b9 100644
--- a/server/lib/sinatra/rabbit.rb
+++ b/server/lib/sinatra/rabbit.rb
@@ -110,7 +110,7 @@ module Sinatra
@control = Proc.new do
op.collection.check_supported(driver)
op.check_capability(driver)
- op.validate(op.effective_params(driver), params)
+ op.validate(op.effective_params(driver), params) unless request.body.length > 0
instance_eval(&block)
end
end
diff --git a/server/server.rb b/server/server.rb
index 4da8357..02c12f1 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -381,6 +381,7 @@ END
param :realm_id, :string, :optional
param :hwp_id, :string, :optional
control do
+ params[:instance] = request.body.read if request.body.length > 0
@instance = driver.create_instance(credentials, params[:image_id], params)
respond_to do |format|
format.xml do
--
1.7.4.1