From dcffbc75848206a7f464dc0eea5d12ab3a0350db Mon Sep 17 00:00:00 2001 From: Joonas Reynders Date: Mon, 30 Sep 2013 10:16:40 +0300 Subject: [PATCH 1/2] [rackspace] A test to reveal a bug in server.create --- tests/rackspace/models/compute_v2/server_tests.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/rackspace/models/compute_v2/server_tests.rb b/tests/rackspace/models/compute_v2/server_tests.rb index 623f59151..048a3ca94 100644 --- a/tests/rackspace/models/compute_v2/server_tests.rb +++ b/tests/rackspace/models/compute_v2/server_tests.rb @@ -9,7 +9,7 @@ Shindo.tests('Fog::Compute::RackspaceV2 | server', ['rackspace']) do options = { :name => "fog_server_#{Time.now.to_i.to_s}", :flavor_id => rackspace_test_flavor_id(service), - :image_id => rackspace_test_image_id(service), + :image_id => rackspace_test_image_id(service), :metadata => { 'fog_test' => 'true' }, :networks => [@network.id] } @@ -76,6 +76,13 @@ Shindo.tests('Fog::Compute::RackspaceV2 | server', ['rackspace']) do @instance.addresses.keys.include?(@network.label) end + tests('#create').succeeds do + pending unless Fog.mocking? + original_options = Marshal.load(Marshal.dump(options)) + @instance.create(options) + returns(true) { original_options == options } + end + tests('#update').succeeds do new_name = "fog_server_update#{Time.now.to_i.to_s}" @instance.name = new_name From 0d5ad6c05b7dc77e02a860a1abf5129b79304369 Mon Sep 17 00:00:00 2001 From: Joonas Reynders Date: Mon, 30 Sep 2013 10:22:43 +0300 Subject: [PATCH 2/2] [rackspace] Fixes issue #2187 Compute.servers.bootstrap mutates the :networks option Server.create modified the options it got. Most modifications were reusable in succeeding invocations but mapping the :network ids to json was not. It is safer to use a copy for all the values anyway --- lib/fog/rackspace/models/compute_v2/server.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/fog/rackspace/models/compute_v2/server.rb b/lib/fog/rackspace/models/compute_v2/server.rb index ce8c99dcf..5ffab613f 100644 --- a/lib/fog/rackspace/models/compute_v2/server.rb +++ b/lib/fog/rackspace/models/compute_v2/server.rb @@ -198,17 +198,18 @@ module Fog # * BUILD -> ERROR (on error) def create(options) requires :name, :image_id, :flavor_id + modified_options = Marshal.load(Marshal.dump(options)) - options[:networks] ||= attributes[:networks] - options[:disk_config] = disk_config unless disk_config.nil? - options[:metadata] = metadata.to_hash unless @metadata.nil? - options[:personality] = personality unless personality.nil? - options[:keypair] ||= attributes[:keypair] + modified_options[:networks] ||= attributes[:networks] + modified_options[:disk_config] = disk_config unless disk_config.nil? + modified_options[:metadata] = metadata.to_hash unless @metadata.nil? + modified_options[:personality] = personality unless personality.nil? + modified_options[:keypair] ||= attributes[:keypair] - if options[:networks] - options[:networks].map! { |id| { :uuid => id } } + if modified_options[:networks] + modified_options[:networks].map! { |id| { :uuid => id } } end - data = service.create_server(name, image_id, flavor_id, 1, 1, options) + data = service.create_server(name, image_id, flavor_id, 1, 1, modified_options) merge_attributes(data.body['server']) true end