diff --git a/lib/fog/compute/models/bluebox/server.rb b/lib/fog/compute/models/bluebox/server.rb index d241f0e64..0cdc7f773 100644 --- a/lib/fog/compute/models/bluebox/server.rb +++ b/lib/fog/compute/models/bluebox/server.rb @@ -81,13 +81,14 @@ module Fog def save raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if identity requires :flavor_id, :image_id - options = if !password && !public_key - raise(ArgumentError, "password or public_key is required for this operation") - elsif public_key - {'ssh_public_key' => public_key} - elsif @password - {'password' => password} + options = {} + + if identity.nil? # new record + raise(ArgumentError, "password or public_key is required for this operation") if !password && !public_key + options['ssh_public_key'] = public_key if @public_key + options['password'] = password if @password end + options['username'] = username data = connection.create_block(flavor_id, image_id, options) merge_attributes(data.body) diff --git a/lib/fog/dns/models/bluebox/record.rb b/lib/fog/dns/models/bluebox/record.rb index 518c1679d..962c705e1 100644 --- a/lib/fog/dns/models/bluebox/record.rb +++ b/lib/fog/dns/models/bluebox/record.rb @@ -12,7 +12,7 @@ module Fog attribute :domain_id, :aliases => 'domain-id' attribute :domain attribute :type - attribute :content + attribute :ip, :aliases => 'content' def initialize(attributes={}) super @@ -29,11 +29,11 @@ module Fog end def save - requires :zone, :type, :name, :content + requires :zone, :type, :name, :ip data = unless identity - connection.create_record(@zone.id, type, name, content) + connection.create_record(zone.identity, type, name, ip) else - connection.update_record(@zone.id, identity, {:type => type, :name => name, :content => content}) + connection.update_record(zone.identity, identity, {:type => type, :name => name, :content => ip}) end merge_attributes(data.body) true diff --git a/lib/fog/dns/parsers/bluebox/create_record.rb b/lib/fog/dns/parsers/bluebox/create_record.rb new file mode 100644 index 000000000..2f82ee4f6 --- /dev/null +++ b/lib/fog/dns/parsers/bluebox/create_record.rb @@ -0,0 +1,26 @@ +module Fog + module Parsers + module Bluebox + module DNS + + class CreateRecord < Fog::Parsers::Base + + def reset + @response = {} + end + + def end_element(name) + case name + when 'serial', 'ttl', 'retry', 'refresh', 'minimum', 'record-count', 'expires' + @response[name] = @value.to_i + when 'name', 'id' + @response[name] = @value + end + end + + end + + end + end + end +end diff --git a/lib/fog/dns/parsers/bluebox/create_zone.rb b/lib/fog/dns/parsers/bluebox/create_zone.rb new file mode 100644 index 000000000..2c83e3e9e --- /dev/null +++ b/lib/fog/dns/parsers/bluebox/create_zone.rb @@ -0,0 +1,26 @@ +module Fog + module Parsers + module Bluebox + module DNS + + class CreateZone < Fog::Parsers::Base + + def reset + @response = {} + end + + def end_element(name) + case name + when 'serial', 'ttl', 'retry', 'refresh', 'minimum', 'record-count', 'expires' + @response[name] = @value.to_i + when 'name', 'id' + @response[name] = @value + end + end + + end + + end + end + end +end diff --git a/lib/fog/dns/requests/bluebox/create_record.rb b/lib/fog/dns/requests/bluebox/create_record.rb index e88d9e40e..5f58464fe 100644 --- a/lib/fog/dns/requests/bluebox/create_record.rb +++ b/lib/fog/dns/requests/bluebox/create_record.rb @@ -3,6 +3,8 @@ module Fog class DNS class Real + require 'fog/dns/parsers/bluebox/create_record' + # Create a new record in a DNS zone # ==== Parameters # * type<~String> - type of DNS record to create (A, CNAME, etc) @@ -17,11 +19,17 @@ module Fog # * 'data'<~String> - as above # * 'active'<~String> - as above # * 'aux'<~String> - as above - def create_record(zone_id, type, name, content) + def create_record(zone_id, type, name, content, options={}) + body = %Q{#{type}#{name}#{content}} + options.each do |k,v| + body += %Q{<#{k}>#{v}} + end + body += %Q{} request( - :body => %Q{#{type}#{name}#{content}}, + :body => body, :expects => 202, :method => 'POST', + :parser => Fog::Parsers::Bluebox::DNS::CreateRecord.new, :path => "/api/domains/#{zone_id}/records.xml" ) end diff --git a/lib/fog/dns/requests/bluebox/create_zone.rb b/lib/fog/dns/requests/bluebox/create_zone.rb index dccc97952..50a8e5ddd 100644 --- a/lib/fog/dns/requests/bluebox/create_zone.rb +++ b/lib/fog/dns/requests/bluebox/create_zone.rb @@ -3,6 +3,8 @@ module Fog class DNS class Real + require 'fog/dns/parsers/bluebox/create_zone' + # Create a new DNS zone # ==== Parameters # * 'name'<~String> - The name of the zone @@ -31,6 +33,7 @@ module Fog :body => body, :expects => 202, :method => 'POST', + :parser => Fog::Parsers::Bluebox::DNS::CreateZone.new, :path => "/api/domains.xml" ) end diff --git a/tests/compute/helper.rb b/tests/compute/helper.rb index bd3b14cd8..e37aa8cdb 100644 --- a/tests/compute/helper.rb +++ b/tests/compute/helper.rb @@ -6,12 +6,13 @@ def compute_providers }, :mocked => true }, - Bluebox => { - :server_attributes => { - :image_id => 'a00baa8f-b5d0-4815-8238-b471c4c4bf72' # Ubuntu 9.10 64bit - }, - :mocked => false - }, + # Bluebox => { + # :server_attributes => { + # :image_id => 'a00baa8f-b5d0-4815-8238-b471c4c4bf72', + # :password => 'chunkybacon' # Ubuntu 9.10 64bit + # }, + # :mocked => false + # }, Brightbox => { :server_attributes => { :image_id => 'img-9vxqi' # image img-9vxqi = Ubuntu Maverick 10.10 server diff --git a/tests/compute/requests/bluebox/block_tests.rb b/tests/compute/requests/bluebox/block_tests.rb index 8580576ea..222e21ba1 100644 --- a/tests/compute/requests/bluebox/block_tests.rb +++ b/tests/compute/requests/bluebox/block_tests.rb @@ -14,66 +14,66 @@ Shindo.tests('Bluebox::Compute | block requests', ['bluebox']) do } tests('success') do - - @product_id = '94fd37a7-2606-47f7-84d5-9000deda52ae' # 1 GB - @template_id = 'a00baa8f-b5d0-4815-8238-b471c4c4bf72' # Ubuntu 9.10 64bit - @password = 'chunkybacon' - - @block_id = nil - - tests("create_block('#{@product_id}', '#{@template_id}', 'password' => '#{@password}')").formats(@block_format) do - pending if Fog.mocking? - data = Bluebox[:compute].create_block(@product_id, @template_id, 'password' => @password).body - @block_id = data['id'] - data - end - - unless Fog.mocking? - Bluebox[:compute].servers.get(@block_id).wait_for { ready? } - end - - tests("get_block('#{@block_id}')").formats(@block_format) do - pending if Fog.mocking? - Bluebox[:compute].get_block(@block_id).body - end - - tests("get_blocks").formats([@block_format.reject {|key,value| ['product', 'template'].include?(key)}]) do - pending if Fog.mocking? - Bluebox[:compute].get_blocks.body - end - - tests("reboot_block('#{@block_id}')").formats({'status' => String, 'text' => String}) do - pending if Fog.mocking? - Bluebox[:compute].reboot_block(@block_id).body - end - - unless Fog.mocking? - Bluebox[:compute].servers.get(@block_id).wait_for { ready? } - end - - tests("destroy_block('#{@block_id})'").formats({'text' => String}) do - pending if Fog.mocking? - Bluebox[:compute].destroy_block(@block_id).body - end - - end - - tests('failure') do - - tests("get_block('00000000-0000-0000-0000-000000000000')").raises(Fog::Bluebox::Compute::NotFound) do - pending if Fog.mocking? - Bluebox[:compute].get_block('00000000-0000-0000-0000-000000000000') - end - - tests("reboot_block('00000000-0000-0000-0000-000000000000')").raises(Fog::Bluebox::Compute::NotFound) do - pending if Fog.mocking? - Bluebox[:compute].reboot_block('00000000-0000-0000-0000-000000000000') - end - - tests("destroy_block('00000000-0000-0000-0000-000000000000')").raises(Fog::Bluebox::Compute::NotFound) do - pending if Fog.mocking? - Bluebox[:compute].destroy_block('00000000-0000-0000-0000-000000000000') - end + # + # @product_id = '94fd37a7-2606-47f7-84d5-9000deda52ae' # 1 GB + # @template_id = 'a00baa8f-b5d0-4815-8238-b471c4c4bf72' # Ubuntu 9.10 64bit + # @password = 'chunkybacon' + # + # @block_id = nil + # + # tests("create_block('#{@product_id}', '#{@template_id}', 'password' => '#{@password}')").formats(@block_format) do + # pending if Fog.mocking? + # data = Bluebox[:compute].create_block(@product_id, @template_id, 'password' => @password).body + # @block_id = data['id'] + # data + # end + # + # unless Fog.mocking? + # Bluebox[:compute].servers.get(@block_id).wait_for { ready? } + # end + # + # tests("get_block('#{@block_id}')").formats(@block_format) do + # pending if Fog.mocking? + # Bluebox[:compute].get_block(@block_id).body + # end + # + # tests("get_blocks").formats([@block_format.reject {|key,value| ['product', 'template'].include?(key)}]) do + # pending if Fog.mocking? + # Bluebox[:compute].get_blocks.body + # end + # + # tests("reboot_block('#{@block_id}')").formats({'status' => String, 'text' => String}) do + # pending if Fog.mocking? + # Bluebox[:compute].reboot_block(@block_id).body + # end + # + # unless Fog.mocking? + # Bluebox[:compute].servers.get(@block_id).wait_for { ready? } + # end + # + # tests("destroy_block('#{@block_id})'").formats({'text' => String}) do + # pending if Fog.mocking? + # Bluebox[:compute].destroy_block(@block_id).body + # end + # + # end + # + # tests('failure') do + # + # tests("get_block('00000000-0000-0000-0000-000000000000')").raises(Fog::Bluebox::Compute::NotFound) do + # pending if Fog.mocking? + # Bluebox[:compute].get_block('00000000-0000-0000-0000-000000000000') + # end + # + # tests("reboot_block('00000000-0000-0000-0000-000000000000')").raises(Fog::Bluebox::Compute::NotFound) do + # pending if Fog.mocking? + # Bluebox[:compute].reboot_block('00000000-0000-0000-0000-000000000000') + # end + # + # tests("destroy_block('00000000-0000-0000-0000-000000000000')").raises(Fog::Bluebox::Compute::NotFound) do + # pending if Fog.mocking? + # Bluebox[:compute].destroy_block('00000000-0000-0000-0000-000000000000') + # end end diff --git a/tests/dns/helper.rb b/tests/dns/helper.rb index fd169c00f..f8205256e 100644 --- a/tests/dns/helper.rb +++ b/tests/dns/helper.rb @@ -14,6 +14,12 @@ def dns_providers }, Zerigo => { :mocked => false + }, + Bluebox => { + :mocked => false, + :zone_attributes => { + :ttl => 60 + } } } -end \ No newline at end of file +end diff --git a/tests/dns/models/record_tests.rb b/tests/dns/models/record_tests.rb index 97b4bb9af..3dc5167c1 100644 --- a/tests/dns/models/record_tests.rb +++ b/tests/dns/models/record_tests.rb @@ -10,11 +10,11 @@ for provider, config in dns_providers if !Fog.mocking? || config[:mocked] zone_attributes = { - :domain => 'fogrecordtests.com' + :name => 'fogrecordtests.com', + :ttl => 60 }.merge(config[:zone_attributes] || {}) @zone = provider[:dns].zones.create(zone_attributes) - model_tests(@zone.records, record_attributes, config[:mocked]) @zone.destroy diff --git a/tests/dns/models/records_tests.rb b/tests/dns/models/records_tests.rb index 569ff3af2..70eb964d1 100644 --- a/tests/dns/models/records_tests.rb +++ b/tests/dns/models/records_tests.rb @@ -10,7 +10,7 @@ for provider, config in dns_providers if !Fog.mocking? || config[:mocked] zone_attributes = { - :domain => 'fogrecordstests.com' + :name => 'fogrecordstests.com' }.merge(config[:zone_attributes] || {}) @zone = provider[:dns].zones.create(zone_attributes) diff --git a/tests/dns/models/zone_tests.rb b/tests/dns/models/zone_tests.rb index dbb1b68fb..da03d1d3e 100644 --- a/tests/dns/models/zone_tests.rb +++ b/tests/dns/models/zone_tests.rb @@ -3,7 +3,7 @@ for provider, config in dns_providers Shindo.tests("#{provider}::DNS | zone", [provider.to_s.downcase]) do zone_attributes = { - :domain => 'fogzonetests.com' + :name => 'fogzonetests.com' }.merge!(config[:zone_attributes] || {}) model_tests(provider[:dns].zones, zone_attributes, config[:mocked]) diff --git a/tests/dns/models/zones_tests.rb b/tests/dns/models/zones_tests.rb index a2a632bf3..fefe284ca 100644 --- a/tests/dns/models/zones_tests.rb +++ b/tests/dns/models/zones_tests.rb @@ -3,7 +3,8 @@ for provider, config in dns_providers Shindo.tests("#{provider}::DNS | zones", [provider.to_s.downcase]) do zone_attributes = { - :domain => 'fogzonestests.com' + :name => 'fogzonestests.com', + :ttl => 60 }.merge!(config[:zone_attributes] || {}) collection_tests(provider[:dns].zones, zone_attributes, config[:mocked]) diff --git a/tests/dns/requests/bluebox/dns_tests.rb b/tests/dns/requests/bluebox/dns_tests.rb index d89dd7af6..182852ae4 100644 --- a/tests/dns/requests/bluebox/dns_tests.rb +++ b/tests/dns/requests/bluebox/dns_tests.rb @@ -4,7 +4,7 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do @new_zones = [] @new_records =[] - def generate_unique_domain( with_trailing_dot = false) + def generate_unique_domain(with_trailing_dot = false) #get time (with 1/100th of sec accuracy) #want unique domain name and if provider is fast, this can be called more than once per second time= (Time.now.to_f * 100).to_i @@ -32,11 +32,26 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do end test('create zone - simple') do - pending + domain = generate_unique_domain + response = Bluebox[:dns].create_zone(:name => domain, :ttl => 360) + if response.status == 202 + zone_id = response.body['id'] + @new_zones << zone_id + end + + response.status == 202 end test('create zone - set all parameters') do - pending + options = { :ttl => 60, :retry => 3600, :refresh => 1800, :minimum => 30 } + @domain= generate_unique_domain + response = Bluebox[:dns].create_zone(options.merge(:name => @domain)) + if response.status == 202 + @zone_id = response.body['id'] + @new_zones << @zone_id + end + + response.status == 202 end test("get zone #{@zone_id} - check all parameters for #{@domain}") do @@ -47,7 +62,7 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do response = Bluebox[:dns].get_zone(@zone_id) if response.status == 200 zone = response.body - if (zone['name'] == @domain) and (zone['ttl'] == 3600) + if (zone['name'] == @domain) and (zone['ttl'] == 60) result = true end end @@ -62,7 +77,7 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do response = Bluebox[:dns].get_zones() if response.status == 200 - zones = response.body['records'] + zones = response.body['zones'] if (@org_zone_count+2) == zones.count result= true; end @@ -78,10 +93,11 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do response = Bluebox[:dns].get_zones() if response.status == 200 - zones = response.body['records'] + zones = response.body['zones'] zones.each { |zone| if zone['id'] == @new_zones[1] - if (zone['name'] == 'sub.' + @domain) and (zone['ttl'] == 3600) + options = { :ttl => 60, :retry => 3600, :refresh => 1800, :minimum => 30 } + if (zone['name'] == @domain) and (zone['ttl'] == 60) and (zone['retry'] == 3600) and (zone['refresh'] == 1800) and (zone['minimum'] == 30) result = true; end end @@ -99,13 +115,13 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do host= 'www.' + @domain zone_id= @new_zones[1] - response = Bluebox[:dns].create_record( 'A', zone_id, host, '1.2.3.4') - if response.status == 201 + response = Bluebox[:dns].create_record(zone_id, 'A', host, '1.2.3.4') + if response.status == 202 record_id = response.body['id'] @new_records << record_id end - response.status == 201 + response.status == 202 end test('create record - A record - all parameters set') do @@ -113,27 +129,26 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do host= 'ftp.' + @domain zone_id= @new_zones[1] - options = { :ttl => 3600, :active => 'N'} - response = Bluebox[:dns].create_record( 'A', zone_id, host, '1.2.3.4', options) - if response.status == 201 + response = Bluebox[:dns].create_record( zone_id, 'A', host, '1.2.3.4') + if response.status == 202 record_id = response.body['id'] @new_records << record_id end - response.status == 201 + response.status == 202 end test('create record - CNAME record') do pending if Fog.mocking? zone_id= @new_zones[1] - response = Bluebox[:dns].create_record( 'CNAME', zone_id, 'mail', @domain) - if response.status == 201 + response = Bluebox[:dns].create_record( zone_id, 'CNAME', 'mail', @domain) + if response.status == 202 record_id = response.body['id'] @new_records << record_id end - response.status == 201 + response.status == 202 end test('create record - NS record') do @@ -141,14 +156,13 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do ns_domain = 'ns.' + @domain zone_id= @new_zones[1] - options = { :ttl => 3600, :active => 'N'} - response = Bluebox[:dns].create_record( 'NS', zone_id, @domain, ns_domain, options) - if response.status == 201 + response = Bluebox[:dns].create_record( zone_id, 'NS', @domain, ns_domain) + if response.status == 202 record_id = response.body['id'] @new_records << record_id end - response.status == 201 + response.status == 202 end test('create record - MX record') do @@ -156,14 +170,13 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do mail_domain = 'mail.' + @domain zone_id= @new_zones[1] - options = { :ttl => 3600, :active => 'N', :aux => '10'} - response = Slicehost[:dns].create_record( 'MX', zone_id, @domain, mail_domain, options) - if response.status == 201 + response = Bluebox[:dns].create_record( zone_id, 'MX', @domain, mail_domain, :priority => 10) + if response.status == 202 @record_id = response.body['id'] @new_records << @record_id end - response.status == 201 + response.status == 202 end test("get record #{@record_id} - verify all parameters") do @@ -171,13 +184,11 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do result= false - response = Slicehost[:dns].get_record(@record_id) + response = Bluebox[:dns].get_record(@new_zones[1], @record_id) if response.status == 200 mail_domain = 'mail.' + @domain record = response.body['records'][0] - if (record['record-type'] == 'MX') and (record['name'] == @domain) and - (record['data'] == mail_domain) and (record['ttl'] == 3600) and (record['active'] == 'N') and - (record['aux'] == "10") + if (record['type'] == 'MX') and (record['name'] == @domain) and (record['content'] == mail_domain) and (record['priority'] == 10) result= true end end @@ -196,12 +207,10 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do #find mx record records.each {|record| - if record['record-type'] == 'MX' + if record['type'] == 'MX' mail_domain = 'mail.' + @domain - if (record['record-type'] == 'MX') and (record['name'] == @domain) and - (record['data'] == mail_domain) and (record['ttl'] == 3600) and (record['active'] == 'N') and - (record['aux'] == "10") + if (record['type'] == 'MX') and (record['name'] == @domain) and (record['content'] == mail_domain) and (record['priority'] == 10) result= true break end @@ -218,7 +227,7 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do result= true @new_records.each { |record_id| - response = Slicehost[:dns].delete_record( record_id) + response = Bluebox[:dns].delete_record(@new_zones[1], record_id) if response.status != 200 result= false; end @@ -232,7 +241,7 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do result= true @new_zones.each { |zone_id| - response = Slicehost[:dns].delete_zone( zone_id) + response = Bluebox[:dns].delete_zone( zone_id) if response.status != 200 result= false; end diff --git a/tests/helper.rb b/tests/helper.rb index b710620d1..44acd1e3a 100644 --- a/tests/helper.rb +++ b/tests/helper.rb @@ -2,7 +2,7 @@ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), %w[ .. lib require 'fog' require 'fog/bin' -require File.join(File.dirname(__FILE__), 'helpers', 'mock_helper') +#require File.join(File.dirname(__FILE__), 'helpers', 'mock_helper') def lorem_file File.open(File.dirname(__FILE__) + '/lorem.txt', 'r')