From ea179666a47835caf82fec8d285d1d7bbd4cf1e1 Mon Sep 17 00:00:00 2001 From: Jesse Scott Date: Tue, 11 Sep 2012 09:45:14 -0700 Subject: [PATCH 1/3] Implemented bootstrap method for Rackspace Compute v2. Added ability to set "metadata" and "personality" fields when creating a server on Rackspace Compute v2. Improved response parsing when dealing with Rackspace DNS service. --- lib/fog/rackspace/models/compute_v2/server.rb | 2 +- lib/fog/rackspace/models/compute_v2/servers.rb | 7 +++++++ lib/fog/rackspace/models/dns/record.rb | 8 +++++++- lib/fog/rackspace/requests/compute_v2/create_server.rb | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/fog/rackspace/models/compute_v2/server.rb b/lib/fog/rackspace/models/compute_v2/server.rb index d4d7fb1ea..3c445cb15 100644 --- a/lib/fog/rackspace/models/compute_v2/server.rb +++ b/lib/fog/rackspace/models/compute_v2/server.rb @@ -54,7 +54,7 @@ module Fog def create requires :name, :image_id, :flavor_id - data = connection.create_server(name, image_id, flavor_id, 1, 1) + data = connection.create_server(name, image_id, flavor_id, 1, 1, attributes) merge_attributes(data.body['server']) true end diff --git a/lib/fog/rackspace/models/compute_v2/servers.rb b/lib/fog/rackspace/models/compute_v2/servers.rb index b1bd69eb2..75bfec9ae 100644 --- a/lib/fog/rackspace/models/compute_v2/servers.rb +++ b/lib/fog/rackspace/models/compute_v2/servers.rb @@ -13,6 +13,13 @@ module Fog load(data) end + def bootstrap(new_attributes = {}) + server = create(new_attributes) + server.wait_for { ready? } + #server.setup(:password => server.password) + server + end + def get(server_id) data = connection.get_server(server_id).body['server'] new(data) diff --git a/lib/fog/rackspace/models/dns/record.rb b/lib/fog/rackspace/models/dns/record.rb index 2666924d6..f23ed172c 100644 --- a/lib/fog/rackspace/models/dns/record.rb +++ b/lib/fog/rackspace/models/dns/record.rb @@ -1,5 +1,6 @@ require 'fog/core/model' require 'fog/rackspace/models/dns/callback' +require 'ipaddr' module Fog module DNS @@ -55,7 +56,12 @@ module Fog end response = wait_for_job connection.add_records(@zone.identity, [options]).body['jobId'] - merge_attributes(response.body['response']['records'].select {|record| record['name'] == self.name && record['type'] == self.type && record['data'] == self.value}.first) + + if ['A', 'AAAA'].include?(self.type.upcase) + merge_attributes(response.body['response']['records'].select {|record| record['name'] == self.name && record['type'] == self.type && IPAddr.new(record['data']) == IPAddr.new(self.value)}.first) + else + merge_attributes(response.body['response']['records'].select {|record| record['name'] == self.name && record['type'] == self.type && record['data'] == self.value}.first) + end true end diff --git a/lib/fog/rackspace/requests/compute_v2/create_server.rb b/lib/fog/rackspace/requests/compute_v2/create_server.rb index b9e300764..f52bfc1a2 100644 --- a/lib/fog/rackspace/requests/compute_v2/create_server.rb +++ b/lib/fog/rackspace/requests/compute_v2/create_server.rb @@ -14,6 +14,8 @@ module Fog } data['server']['diskConfig'] = options[:disk_config] unless options[:disk_config].nil? + data['server']['metadata'] = options[:metadata] unless options[:metadata].nil? + data['server']['personality'] = options[:personality] unless options[:personality].nil? request( :body => Fog::JSON.encode(data), From 9abb53d75dcfac608f5ee64d7c431a4667d3c234 Mon Sep 17 00:00:00 2001 From: Jesse Scott Date: Wed, 17 Oct 2012 11:36:33 -0700 Subject: [PATCH 2/3] Removed the commented out password setting line for Rackspace Compute v2 bootstrap method. --- lib/fog/rackspace/models/compute_v2/servers.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/fog/rackspace/models/compute_v2/servers.rb b/lib/fog/rackspace/models/compute_v2/servers.rb index 75bfec9ae..76e0b0edc 100644 --- a/lib/fog/rackspace/models/compute_v2/servers.rb +++ b/lib/fog/rackspace/models/compute_v2/servers.rb @@ -16,7 +16,6 @@ module Fog def bootstrap(new_attributes = {}) server = create(new_attributes) server.wait_for { ready? } - #server.setup(:password => server.password) server end From 29aeb20f9f7ce4cc3b79bcd6fe60bffccca9b7ab Mon Sep 17 00:00:00 2001 From: Jesse Scott Date: Wed, 17 Oct 2012 11:37:14 -0700 Subject: [PATCH 3/3] Clarified the logic for finding the newly created DNS record for Rackspace Cloud DNS. --- lib/fog/rackspace/models/dns/record.rb | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/fog/rackspace/models/dns/record.rb b/lib/fog/rackspace/models/dns/record.rb index f23ed172c..f0e5fc5b8 100644 --- a/lib/fog/rackspace/models/dns/record.rb +++ b/lib/fog/rackspace/models/dns/record.rb @@ -57,11 +57,18 @@ module Fog response = wait_for_job connection.add_records(@zone.identity, [options]).body['jobId'] - if ['A', 'AAAA'].include?(self.type.upcase) - merge_attributes(response.body['response']['records'].select {|record| record['name'] == self.name && record['type'] == self.type && IPAddr.new(record['data']) == IPAddr.new(self.value)}.first) - else - merge_attributes(response.body['response']['records'].select {|record| record['name'] == self.name && record['type'] == self.type && record['data'] == self.value}.first) + matching_record = response.body['response']['records'].find do |record| + if ['A', 'AAAA'].include?(self.type.upcase) + # If this is an A or AAAA record, match by normalized IP address value. + (record['name'] == self.name) && (record['type'] == self.type) && (IPAddr.new(record['data']) == IPAddr.new(self.value)) + else + # Other record types are matched by the raw value. + (record['name'] == self.name) && (record['type'] == self.type) && (record['data'] == self.value) + end end + + merge_attributes(matching_record) + true end