diff --git a/lib/fog/rackspace/models/compute_v2/server.rb b/lib/fog/rackspace/models/compute_v2/server.rb index 7a690cb2d..edbc35574 100644 --- a/lib/fog/rackspace/models/compute_v2/server.rb +++ b/lib/fog/rackspace/models/compute_v2/server.rb @@ -33,6 +33,7 @@ module Fog attribute :tenant_id attribute :links attribute :metadata + attribute :personality attribute :ipv4_address, :aliases => 'accessIPv4' attribute :ipv6_address, :aliases => 'accessIPv6' attribute :disk_config, :aliases => 'OS-DCF:diskConfig' @@ -54,9 +55,12 @@ module Fog def create requires :name, :image_id, :flavor_id + options = {} options[:disk_config] = disk_config unless disk_config.nil? options[:metadata] = metadata unless metadata.nil? + options[:personality] = personality unless personality.nil? + data = connection.create_server(name, image_id, flavor_id, 1, 1, options) merge_attributes(data.body['server']) true diff --git a/lib/fog/rackspace/models/compute_v2/servers.rb b/lib/fog/rackspace/models/compute_v2/servers.rb index b1bd69eb2..76e0b0edc 100644 --- a/lib/fog/rackspace/models/compute_v2/servers.rb +++ b/lib/fog/rackspace/models/compute_v2/servers.rb @@ -13,6 +13,12 @@ module Fog load(data) end + def bootstrap(new_attributes = {}) + server = create(new_attributes) + server.wait_for { ready? } + 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..f0e5fc5b8 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,19 @@ 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) + + 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 diff --git a/lib/fog/rackspace/requests/compute_v2/create_server.rb b/lib/fog/rackspace/requests/compute_v2/create_server.rb index 1fefcb647..90438a3f1 100644 --- a/lib/fog/rackspace/requests/compute_v2/create_server.rb +++ b/lib/fog/rackspace/requests/compute_v2/create_server.rb @@ -15,6 +15,8 @@ module Fog data['server']['metadata'] = options[:metadata] unless options[:metadata].nil? data['server']['OS-DCF: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),