From 52bf685764a71ef749c596fcafb46232e8b637a6 Mon Sep 17 00:00:00 2001 From: ggoodale Date: Mon, 24 Jan 2011 17:30:57 -0800 Subject: [PATCH 1/8] Basic framework, including all query mechanisms --- lib/fog/dns.rb | 3 + lib/fog/dns/bluebox.rb | 107 ++++++++ lib/fog/dns/models/bluebox/record.rb | 59 ++++ lib/fog/dns/models/bluebox/records.rb | 36 +++ lib/fog/dns/models/bluebox/zone.rb | 54 ++++ lib/fog/dns/models/bluebox/zones.rb | 28 ++ lib/fog/dns/parsers/bluebox/create_record.rb | 0 lib/fog/dns/parsers/bluebox/delete_record.rb | 0 lib/fog/dns/parsers/bluebox/get_record.rb | 21 ++ lib/fog/dns/parsers/bluebox/get_records.rb | 27 ++ lib/fog/dns/parsers/bluebox/get_zone.rb | 23 ++ lib/fog/dns/parsers/bluebox/get_zones.rb | 30 ++ lib/fog/dns/requests/bluebox/create_record.rb | 0 lib/fog/dns/requests/bluebox/delete_record.rb | 0 lib/fog/dns/requests/bluebox/get_record.rb | 40 +++ lib/fog/dns/requests/bluebox/get_records.rb | 41 +++ lib/fog/dns/requests/bluebox/get_zone.rb | 44 +++ lib/fog/dns/requests/bluebox/get_zones.rb | 43 +++ tests/dns/requests/bluebox/dns_tests.rb | 258 ++++++++++++++++++ 19 files changed, 814 insertions(+) create mode 100644 lib/fog/dns/bluebox.rb create mode 100644 lib/fog/dns/models/bluebox/record.rb create mode 100644 lib/fog/dns/models/bluebox/records.rb create mode 100644 lib/fog/dns/models/bluebox/zone.rb create mode 100644 lib/fog/dns/models/bluebox/zones.rb create mode 100644 lib/fog/dns/parsers/bluebox/create_record.rb create mode 100644 lib/fog/dns/parsers/bluebox/delete_record.rb create mode 100644 lib/fog/dns/parsers/bluebox/get_record.rb create mode 100644 lib/fog/dns/parsers/bluebox/get_records.rb create mode 100644 lib/fog/dns/parsers/bluebox/get_zone.rb create mode 100644 lib/fog/dns/parsers/bluebox/get_zones.rb create mode 100644 lib/fog/dns/requests/bluebox/create_record.rb create mode 100644 lib/fog/dns/requests/bluebox/delete_record.rb create mode 100644 lib/fog/dns/requests/bluebox/get_record.rb create mode 100644 lib/fog/dns/requests/bluebox/get_records.rb create mode 100644 lib/fog/dns/requests/bluebox/get_zone.rb create mode 100644 lib/fog/dns/requests/bluebox/get_zones.rb create mode 100644 tests/dns/requests/bluebox/dns_tests.rb diff --git a/lib/fog/dns.rb b/lib/fog/dns.rb index 89ca606db..089211849 100644 --- a/lib/fog/dns.rb +++ b/lib/fog/dns.rb @@ -7,6 +7,9 @@ module Fog when 'AWS' require 'fog/dns/aws' Fog::AWS::DNS.new(attributes) + when 'Bluebox' + require 'fog/dns/bluebox' + Fog::Bluebox::DNS.new(attributes) when 'Linode' require 'fog/dns/linode' Fog::Linode::DNS.new(attributes) diff --git a/lib/fog/dns/bluebox.rb b/lib/fog/dns/bluebox.rb new file mode 100644 index 000000000..61c4c79bb --- /dev/null +++ b/lib/fog/dns/bluebox.rb @@ -0,0 +1,107 @@ +module Fog + module Bluebox + class DNS < Fog::Service + requires :bluebox_api_key, :bluebox_customer_id + recognizes :bluebox_host, :bluebox_port, :bluebox_scheme, :persistent + recognizes :provider # remove post deprecation + + model_path 'fog/dns/models/bluebox' + model :record + collection :records + model :zone + collection :zones + + request_path 'fog/dns/requests/bluebox' + request :create_record + request :delete_record + request :get_record + request :get_records + request :get_zone + request :get_zones + + class Mock + def self.data + @data ||= Hash.new do |hash, key| + hash[key] = {} + end + end + + def self.reset_data(keys=data.keys) + for key in [*keys] + data.delete(key) + end + end + + def initialize(options={}) + unless options.delete(:provider) + location = caller.first + warning = "[yellow][WARN] Fog::Bluebox::DNS.new is deprecated, use Fog::DNS.new(:provider => 'Bluebox') instead[/]" + warning << " [light_black](" << location << ")[/] " + Formatador.display_line(warning) + end + + @bluebox_customer_id = options[:bluebox_customer_id] + @bluebox_api_key = options[:bluebox_api_key] + @data = self.class.data[@bluebox_customer_id] + @data = self.class.data[@bluebox_api_key] + end + end + + class Real + def initialize(options ={}) + unless options.delete(:provider) + location = caller.first + warning = "[yellow][WARN] Fog::Bluebox::DNS.new is deprecated, use Fog::DNS.new(:provider => 'Bluebox') instead[/]" + warning << " [light_black](" << location << ")[/] " + Formatador.display_line(warning) + end + + @bluebox_customer_id = options[:bluebox_customer_id] + @bluebox_api_key = options[:bluebox_api_key] + + @host = options[:host] || "boxpanel.bluebox.net" + @port = options[:port] || 443 + @scheme = options[:scheme] || 'https' + @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent]) + end + + def reload + @connection.reset + end + + def request(params) + params[:headers] ||= {} + + params[:headers]['Authorization'] = "Basic #{auth_header}" + + case params[:method] + when 'DELETE', 'GET', 'HEAD' + params[:headers]['Accept'] = 'application/xml' + when 'POST', 'PUT' + params[:headers]['Content-Type'] = 'application/xml' + end + + begin + response = @connection.request(params.merge!({:host => @host})) + rescue Excon::Errors::HTTPStatusError => error + raise case error + when Excon::Errors::NotFound + Fog::Bluebox::DNS::NotFound.slurp(error) + else + error + end + end + + response + end + + protected + + def auth_header + @auth_header ||= Base64.encode64("#{@bluebox_customer_id}:#{@bluebox_api_key}").gsub("\n",'') + end + + end + end + end +end \ No newline at end of file diff --git a/lib/fog/dns/models/bluebox/record.rb b/lib/fog/dns/models/bluebox/record.rb new file mode 100644 index 000000000..11e1fe75c --- /dev/null +++ b/lib/fog/dns/models/bluebox/record.rb @@ -0,0 +1,59 @@ +require 'fog/core/model' + +module Fog + module Bluebox + class DNS + + class Record < Fog::Model + + identity :id + + attribute :name + attribute :domain_id, :aliases => 'domain-id' + attribute :domain + attribute :type + attribute :content + + def initialize(attributes={}) + super + end + + def destroy + requires :identity + connection.delete_record(identity) + true + end + + def zone + @zone + end + + def save + requires :zone, :type, :ip + options = {} + options[:hostname] = name if name + options[:notes] = description if description + options[:priority] = priority if priority + options[:ttl] = ttl if ttl + data = unless identity + connection.create_record(@zone.id, type, ip, options) + else + options[:host_type] = type + options[:data] = data + connection.update_record(identity, options) + end + merge_attributes(data.body) + true + end + + private + + def zone=(new_zone) + @zone = new_zone + end + + end + + end + end +end diff --git a/lib/fog/dns/models/bluebox/records.rb b/lib/fog/dns/models/bluebox/records.rb new file mode 100644 index 000000000..dd93548d0 --- /dev/null +++ b/lib/fog/dns/models/bluebox/records.rb @@ -0,0 +1,36 @@ +require 'fog/core/collection' +require 'fog/dns/models/bluebox/record' + +module Fog + module Bluebox + class DNS + + class Records < Fog::Collection + + attribute :zone + + model Fog::Bluebox::DNS::Record + + def all + requires :zone + data = connection.get_records(zone.identity).body['records'] + load(data) + end + + def get(record_id) + data = connection.get_record(zone.identity, record_id).body + new(data) + rescue Fog::Service::NotFound + nil + end + + def new(attributes = {}) + requires :zone + super({ :zone => zone }.merge!(attributes)) + end + + end + + end + end +end diff --git a/lib/fog/dns/models/bluebox/zone.rb b/lib/fog/dns/models/bluebox/zone.rb new file mode 100644 index 000000000..599518307 --- /dev/null +++ b/lib/fog/dns/models/bluebox/zone.rb @@ -0,0 +1,54 @@ +require 'fog/core/model' +require 'fog/dns/models/bluebox/records' + +module Fog + module Bluebox + class DNS + + class Zone < Fog::Model + + identity :id + + attribute :name + attribute :serial + attribute :ttl + attribute :retry + attribute :expires + attribute :record_count, :aliases => 'record-count' + attribute :refresh + attribute :minimum + + def initialize(attributes = {}) + super(attributes) + end + + def destroy + raise Fog::Errors::Error.new('Not implemented') + end + + def records + @records ||= begin + Fog::Bluebox::DNS::Records.new( + :zone => self, + :connection => connection + ) + end + end + + def nameservers + [ + 'ns1.blueblxgrid.com', + 'ns2.blueblxgrid.com', + 'ns3.blueblxgrid.com' + ] + end + + def save + raise Fog::Errors::Error.new('Not implemented') + end + + end + + end + end +end diff --git a/lib/fog/dns/models/bluebox/zones.rb b/lib/fog/dns/models/bluebox/zones.rb new file mode 100644 index 000000000..3a6ac9b43 --- /dev/null +++ b/lib/fog/dns/models/bluebox/zones.rb @@ -0,0 +1,28 @@ +require 'fog/core/collection' +require 'fog/dns/models/bluebox/zone' + +module Fog + module Bluebox + class DNS + + class Zones < Fog::Collection + + model Fog::Bluebox::DNS::Zone + + def all + data = connection.get_zones.body['zones'] + load(data) + end + + def get(zone_id) + data = connection.get_zone(zone_id).body + new(data) + rescue Fog::Service::NotFound + nil + end + + end + + end + end +end 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..e69de29bb diff --git a/lib/fog/dns/parsers/bluebox/delete_record.rb b/lib/fog/dns/parsers/bluebox/delete_record.rb new file mode 100644 index 000000000..e69de29bb diff --git a/lib/fog/dns/parsers/bluebox/get_record.rb b/lib/fog/dns/parsers/bluebox/get_record.rb new file mode 100644 index 000000000..0b3a705fc --- /dev/null +++ b/lib/fog/dns/parsers/bluebox/get_record.rb @@ -0,0 +1,21 @@ +module Fog + module Parsers + module Bluebox + module DNS + + class GetRecord < Fog::Parsers::Base + + def reset + @response = { } + end + + def end_element(name) + @response[name] = @value + end + + end + + end + end + end +end diff --git a/lib/fog/dns/parsers/bluebox/get_records.rb b/lib/fog/dns/parsers/bluebox/get_records.rb new file mode 100644 index 000000000..29641cbde --- /dev/null +++ b/lib/fog/dns/parsers/bluebox/get_records.rb @@ -0,0 +1,27 @@ +module Fog + module Parsers + module Bluebox + module DNS + + class GetRecords < Fog::Parsers::Base + + def reset + @record = {} + @response = { 'records' => [] } + end + + def end_element(name) + case name + when 'record' + @response['records'] << @record + @record = {} + else + @record[name] = @value + end + end + end + + end + end + end +end diff --git a/lib/fog/dns/parsers/bluebox/get_zone.rb b/lib/fog/dns/parsers/bluebox/get_zone.rb new file mode 100644 index 000000000..6a3fbdbbe --- /dev/null +++ b/lib/fog/dns/parsers/bluebox/get_zone.rb @@ -0,0 +1,23 @@ +module Fog + module Parsers + module Bluebox + module DNS + class GetZone < Fog::Parsers::Base + + def reset + @response = {} + end + + def end_element(name) + case name + when 'serial', 'ttl', 'retry', 'expires', 'record-count', 'refresh', 'minimum' + @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/get_zones.rb b/lib/fog/dns/parsers/bluebox/get_zones.rb new file mode 100644 index 000000000..ade93a420 --- /dev/null +++ b/lib/fog/dns/parsers/bluebox/get_zones.rb @@ -0,0 +1,30 @@ +module Fog + module Parsers + module Bluebox + module DNS + + class GetZones < Fog::Parsers::Base + + def reset + @zone = {} + @response = { 'zones' => [] } + end + + def end_element(name) + case name + when 'serial', 'ttl', 'retry', 'expires', 'record-count', 'refresh', 'minimum' + @zone[name] = @value.to_i + when 'name', 'id' + @zone[name] = @value + when 'record' + @response['zones'] << @zone + @zone = {} + 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 new file mode 100644 index 000000000..e69de29bb diff --git a/lib/fog/dns/requests/bluebox/delete_record.rb b/lib/fog/dns/requests/bluebox/delete_record.rb new file mode 100644 index 000000000..e69de29bb diff --git a/lib/fog/dns/requests/bluebox/get_record.rb b/lib/fog/dns/requests/bluebox/get_record.rb new file mode 100644 index 000000000..fca904080 --- /dev/null +++ b/lib/fog/dns/requests/bluebox/get_record.rb @@ -0,0 +1,40 @@ +module Fog + module Bluebox + class DNS + class Real + + require 'fog/dns/parsers/bluebox/get_record' + + # Get an individual DNS record from the specified zone + # + # ==== Returns + # * response<~Excon::Response>: + # * hash<~Hash>: + # * 'id'<~String> - The id of this record + # * 'type'<~String> - type of DNS record to create (A, CNAME, etc) + # * 'domain-id'<~Integer> - ID of the zone + # * 'name'<~String> - empty? + # * 'domain'<~String> - The domain name + # * 'type'<~String> - The type of DNS record (e.g. A, MX, NS, etc.) + # * 'content'<~String> - data for the DNS record (ie for an A record, the IP address) + def get_record(zone_id, record_id) + request( + :expects => 200, + :method => 'GET', + :parser => Fog::Parsers::Bluebox::DNS::GetRecord.new, + :path => "/api/domains/#{zone_id}/records/#{record_id}.xml" + ) + end + + end + + class Mock + + def get_record(record_id) + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/lib/fog/dns/requests/bluebox/get_records.rb b/lib/fog/dns/requests/bluebox/get_records.rb new file mode 100644 index 000000000..186638e3f --- /dev/null +++ b/lib/fog/dns/requests/bluebox/get_records.rb @@ -0,0 +1,41 @@ +module Fog + module Bluebox + class DNS + class Real + + require 'fog/dns/parsers/bluebox/get_records' + + # Get all the DNS records across all the DNS zones for this account + # + # ==== Returns + # * response<~Excon::Response>: + # * body<~Array>: + # * 'addresses'<~Array> - Ip addresses for the slice + # * 'backup-id'<~Integer> - Id of backup slice was booted from + # * 'flavor_id'<~Integer> - Id of flavor slice was booted from + # * 'id'<~Integer> - Id of the slice + # * 'image-id'<~Integer> - Id of image slice was booted from + # * 'name'<~String> - Name of the slice + # * 'progress'<~Integer> - Progress of current action, in percentage + # * 'status'<~String> - Current status of the slice + def get_records(zone_id) + request( + :expects => 200, + :method => 'GET', + :parser => Fog::Parsers::Bluebox::DNS::GetRecords.new, + :path => "/api/domains/#{zone_id}/records.xml" + ) + end + + end + + class Mock + + def get_records + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/lib/fog/dns/requests/bluebox/get_zone.rb b/lib/fog/dns/requests/bluebox/get_zone.rb new file mode 100644 index 000000000..b98086cfb --- /dev/null +++ b/lib/fog/dns/requests/bluebox/get_zone.rb @@ -0,0 +1,44 @@ +module Fog + module Bluebox + class DNS + class Real + + require 'fog/dns/parsers/bluebox/get_zone' + + # Get details of a DNS zone + # + # ==== Parameters + # * zone_id<~Integer> - Id of zone to lookup + # + # ==== Returns + # * response<~Excon::Response>: + # * hash<~Hash>: + # * 'name'<~String> - The name of the zone + # * 'serial'<~Integer> - Serial number of the zone + # * 'ttl'<~Integer> - TimeToLive (ttl) for the domain, in seconds + # * 'retry'<~Integer> - Retry interval for the domain, in seconds + # * 'record-count'<~Integer> - Number of records in the zone + # * 'id'<~String> - Id for the zone + # * 'refresh'<~Integer> - Refresh interval for the zone + # * 'minimum'<~Integer> - Minimum refresh interval for the zone + def get_zone(zone_id) + request( + :expects => 200, + :method => 'GET', + :parser => Fog::Parsers::Bluebox::DNS::GetZone.new, + :path => "/api/domains/#{zone_id}.xml" + ) + end + + end + + class Mock + + def get_zone(zone_id) + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/lib/fog/dns/requests/bluebox/get_zones.rb b/lib/fog/dns/requests/bluebox/get_zones.rb new file mode 100644 index 000000000..9f7750890 --- /dev/null +++ b/lib/fog/dns/requests/bluebox/get_zones.rb @@ -0,0 +1,43 @@ +module Fog + module Bluebox + class DNS + class Real + + require 'fog/dns/parsers/bluebox/get_zones' + + # Get list of all DNS zones hosted on Bluebox (for this account) + # + # ==== Returns + # * response<~Excon::Response>: + # * 'records'<~Array> + # * 'record' + # * 'name'<~String> - name of the zone + # * 'serial'<~Integer> - Serial # for the zone + # * 'ttl'<~Integer> - TTL for the zone record in seconds + # * 'retry'<~Integer> - Retry interval for the zone record in seconds + # * 'expires'<~Integer> - Expiration interval for the zone record in seconds + # * 'record-count'<~Integer> - # of records in this zone + # * 'id'<~String> - Id for the zone record + # * 'refresh'<~Integer> - default refresh interval for this zone, in seconds + # * 'minimum'<~Integer> - minimum value for intervals for this zone, in seconds + def get_zones + request( + :expects => 200, + :method => 'GET', + :parser => Fog::Parsers::Bluebox::DNS::GetZones.new, + :path => '/api/domains.xml' + ) + end + + end + + class Mock + + def get_zones + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/tests/dns/requests/bluebox/dns_tests.rb b/tests/dns/requests/bluebox/dns_tests.rb new file mode 100644 index 000000000..d89dd7af6 --- /dev/null +++ b/tests/dns/requests/bluebox/dns_tests.rb @@ -0,0 +1,258 @@ +Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do + + @domain = '' + @new_zones = [] + @new_records =[] + + 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 + domain = 'test-' + time.to_s + '.com' + if with_trailing_dot + domain+= '.' + end + + domain + end + + tests( 'success') do + + test('get current zone count') do + pending if Fog.mocking? + + @org_zone_count= 0 + response = Bluebox[:dns].get_zones() + if response.status == 200 + zones = response.body['zones'] + @org_zone_count = zones.count + end + + response.status == 200 + end + + test('create zone - simple') do + pending + end + + test('create zone - set all parameters') do + pending + end + + test("get zone #{@zone_id} - check all parameters for #{@domain}") do + pending if Fog.mocking? + + result = false + + response = Bluebox[:dns].get_zone(@zone_id) + if response.status == 200 + zone = response.body + if (zone['name'] == @domain) and (zone['ttl'] == 3600) + result = true + end + end + + result + end + + test('get zones - make sure total count is correct') do + pending if Fog.mocking? + + result = false + + response = Bluebox[:dns].get_zones() + if response.status == 200 + zones = response.body['records'] + if (@org_zone_count+2) == zones.count + result= true; + end + end + + result + end + + test('get zones - check all parameters for a zone') do + pending if Fog.mocking? + + result= false + + response = Bluebox[:dns].get_zones() + if response.status == 200 + zones = response.body['records'] + zones.each { |zone| + if zone['id'] == @new_zones[1] + if (zone['name'] == 'sub.' + @domain) and (zone['ttl'] == 3600) + result = true; + end + end + } + if (@org_zone_count+2) == zones.count + result = true; + end + end + + result + end + + test('create record - simple A record') do + pending if Fog.mocking? + + 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 + record_id = response.body['id'] + @new_records << record_id + end + + response.status == 201 + end + + test('create record - A record - all parameters set') do + pending if Fog.mocking? + + 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 + record_id = response.body['id'] + @new_records << record_id + end + + response.status == 201 + 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 + record_id = response.body['id'] + @new_records << record_id + end + + response.status == 201 + end + + test('create record - NS record') do + pending if Fog.mocking? + + 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 + record_id = response.body['id'] + @new_records << record_id + end + + response.status == 201 + end + + test('create record - MX record') do + pending if Fog.mocking? + + 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 + @record_id = response.body['id'] + @new_records << @record_id + end + + response.status == 201 + end + + test("get record #{@record_id} - verify all parameters") do + pending if Fog.mocking? + + result= false + + response = Slicehost[:dns].get_record(@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") + result= true + end + end + + result + end + + test('get records - verify all parameters for one record') do + pending if Fog.mocking? + + result= false + + response = Bluebox[:dns].get_records() + if response.status == 200 + records = response.body['records'] + + #find mx record + records.each {|record| + if record['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") + result= true + break + end + + end + } + end + + result + end + + test("delete #{@new_records.count} records created") do + pending if Fog.mocking? + + result= true + @new_records.each { |record_id| + response = Slicehost[:dns].delete_record( record_id) + if response.status != 200 + result= false; + end + } + result + end + + test("delete #{@new_zones.count} zones created") do + pending if Fog.mocking? + + result= true + + @new_zones.each { |zone_id| + response = Slicehost[:dns].delete_zone( zone_id) + if response.status != 200 + result= false; + end + } + + result + end + + end + + + tests( 'failure') do + + #create a zone with invalid parameters + #get zonfo info with invalid zone id + #delete a zone with an invalid zone id + + tests('#create_zone') do + end + + end + +end From 4168265be8643c5f6b7d1d5c79854c8fc53cbe1b Mon Sep 17 00:00:00 2001 From: ggoodale Date: Mon, 24 Jan 2011 18:23:58 -0800 Subject: [PATCH 2/8] Added support for creating and deleting records --- lib/fog/dns/bluebox.rb | 3 +- lib/fog/dns/models/bluebox/record.rb | 15 ++----- lib/fog/dns/parsers/bluebox/create_record.rb | 0 lib/fog/dns/parsers/bluebox/delete_record.rb | 0 lib/fog/dns/requests/bluebox/create_record.rb | 40 +++++++++++++++++++ lib/fog/dns/requests/bluebox/delete_record.rb | 31 ++++++++++++++ 6 files changed, 76 insertions(+), 13 deletions(-) delete mode 100644 lib/fog/dns/parsers/bluebox/create_record.rb delete mode 100644 lib/fog/dns/parsers/bluebox/delete_record.rb diff --git a/lib/fog/dns/bluebox.rb b/lib/fog/dns/bluebox.rb index 61c4c79bb..1779c03f0 100644 --- a/lib/fog/dns/bluebox.rb +++ b/lib/fog/dns/bluebox.rb @@ -74,9 +74,8 @@ module Fog params[:headers]['Authorization'] = "Basic #{auth_header}" + params[:headers]['Accept'] = 'application/xml' case params[:method] - when 'DELETE', 'GET', 'HEAD' - params[:headers]['Accept'] = 'application/xml' when 'POST', 'PUT' params[:headers]['Content-Type'] = 'application/xml' end diff --git a/lib/fog/dns/models/bluebox/record.rb b/lib/fog/dns/models/bluebox/record.rb index 11e1fe75c..31abe4b09 100644 --- a/lib/fog/dns/models/bluebox/record.rb +++ b/lib/fog/dns/models/bluebox/record.rb @@ -20,7 +20,7 @@ module Fog def destroy requires :identity - connection.delete_record(identity) + connection.delete_record(@zone.identity, identity) true end @@ -29,18 +29,11 @@ module Fog end def save - requires :zone, :type, :ip - options = {} - options[:hostname] = name if name - options[:notes] = description if description - options[:priority] = priority if priority - options[:ttl] = ttl if ttl + requires :zone, :type, :domain, :content data = unless identity - connection.create_record(@zone.id, type, ip, options) + connection.create_record(@zone.id, type, domain, content) else - options[:host_type] = type - options[:data] = data - connection.update_record(identity, options) + connection.update_record(identity) 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 deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/fog/dns/parsers/bluebox/delete_record.rb b/lib/fog/dns/parsers/bluebox/delete_record.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/fog/dns/requests/bluebox/create_record.rb b/lib/fog/dns/requests/bluebox/create_record.rb index e69de29bb..49ed5e8f6 100644 --- a/lib/fog/dns/requests/bluebox/create_record.rb +++ b/lib/fog/dns/requests/bluebox/create_record.rb @@ -0,0 +1,40 @@ +module Fog + module Bluebox + class DNS + class Real + + # Create a new record in a DNS zone + # ==== Parameters + # * type<~String> - type of DNS record to create (A, CNAME, etc) + # * name<~String> - host name this DNS record is for + # * content<~String> - data for the DNS record (ie for an A record, the IP address) + # ==== Returns + # * response<~Excon::Response>: + # * body<~Hash>: + # * 'name'<~String> - as above + # * 'id'<~Integer> - Id of zone/domain - used in future API calls for this zone + # * 'ttl'<~Integer> - as above + # * 'data'<~String> - as above + # * 'active'<~String> - as above + # * 'aux'<~String> - as above + def create_record(zone_id, type, domain, content) + request( + :body => %Q{#{type}#{domain}#{content}}, + :expects => 202, + :method => 'POST', + :path => "/api/domains/#{zone_id}/records.xml" + ) + end + + end + + class Mock + + def create_record(zone_id, type, domain, content) + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/lib/fog/dns/requests/bluebox/delete_record.rb b/lib/fog/dns/requests/bluebox/delete_record.rb index e69de29bb..eead95ad9 100644 --- a/lib/fog/dns/requests/bluebox/delete_record.rb +++ b/lib/fog/dns/requests/bluebox/delete_record.rb @@ -0,0 +1,31 @@ +module Fog + module Bluebox + class DNS + class Real + + # Delete a record from the specified DNS zone + # ==== Parameters + # * record_id<~Integer> - Id of DNS record to delete + # + # ==== Returns + # * response<~Excon::Response>: - HTTP status code will be result + def delete_record(zone_id, record_id) + request( + :expects => 200, + :method => 'DELETE', + :path => "/api/domains/#{zone_id}/records/#{record_id}.xml" + ) + end + + end + + class Mock + + def delete_record(zone_id, record_id) + Fog::Mock.not_implemented + end + + end + end + end +end From c823ab8f7f30df938ee9f87255c0580981b6cb03 Mon Sep 17 00:00:00 2001 From: ggoodale Date: Mon, 24 Jan 2011 18:25:12 -0800 Subject: [PATCH 3/8] removed call to missing update api --- lib/fog/dns/models/bluebox/record.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/fog/dns/models/bluebox/record.rb b/lib/fog/dns/models/bluebox/record.rb index 31abe4b09..b096b2477 100644 --- a/lib/fog/dns/models/bluebox/record.rb +++ b/lib/fog/dns/models/bluebox/record.rb @@ -30,11 +30,7 @@ module Fog def save requires :zone, :type, :domain, :content - data = unless identity - connection.create_record(@zone.id, type, domain, content) - else - connection.update_record(identity) - end + data = connection.create_record(@zone.id, type, domain, content) merge_attributes(data.body) true end From 181a7849ddce44c69f1bd11af464ae727a49d106 Mon Sep 17 00:00:00 2001 From: ggoodale Date: Mon, 24 Jan 2011 18:35:51 -0800 Subject: [PATCH 4/8] Slight tweaks to param names; added update support --- lib/fog/dns/bluebox.rb | 7 ++-- lib/fog/dns/models/bluebox/record.rb | 8 +++-- lib/fog/dns/requests/bluebox/create_record.rb | 6 ++-- lib/fog/dns/requests/bluebox/update_record.rb | 34 +++++++++++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 lib/fog/dns/requests/bluebox/update_record.rb diff --git a/lib/fog/dns/bluebox.rb b/lib/fog/dns/bluebox.rb index 1779c03f0..dc32541c8 100644 --- a/lib/fog/dns/bluebox.rb +++ b/lib/fog/dns/bluebox.rb @@ -13,6 +13,7 @@ module Fog request_path 'fog/dns/requests/bluebox' request :create_record + request :update_record request :delete_record request :get_record request :get_records @@ -59,9 +60,9 @@ module Fog @bluebox_customer_id = options[:bluebox_customer_id] @bluebox_api_key = options[:bluebox_api_key] - @host = options[:host] || "boxpanel.bluebox.net" - @port = options[:port] || 443 - @scheme = options[:scheme] || 'https' + @host = options[:bluebox_host] || "boxpanel.bluebox.net" + @port = options[:bluebox_port] || 443 + @scheme = options[:bluebox_scheme] || 'https' @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent]) end diff --git a/lib/fog/dns/models/bluebox/record.rb b/lib/fog/dns/models/bluebox/record.rb index b096b2477..518c1679d 100644 --- a/lib/fog/dns/models/bluebox/record.rb +++ b/lib/fog/dns/models/bluebox/record.rb @@ -29,8 +29,12 @@ module Fog end def save - requires :zone, :type, :domain, :content - data = connection.create_record(@zone.id, type, domain, content) + requires :zone, :type, :name, :content + data = unless identity + connection.create_record(@zone.id, type, name, content) + else + connection.update_record(@zone.id, identity, {:type => type, :name => name, :content => content}) + end merge_attributes(data.body) true end diff --git a/lib/fog/dns/requests/bluebox/create_record.rb b/lib/fog/dns/requests/bluebox/create_record.rb index 49ed5e8f6..e88d9e40e 100644 --- a/lib/fog/dns/requests/bluebox/create_record.rb +++ b/lib/fog/dns/requests/bluebox/create_record.rb @@ -17,9 +17,9 @@ module Fog # * 'data'<~String> - as above # * 'active'<~String> - as above # * 'aux'<~String> - as above - def create_record(zone_id, type, domain, content) + def create_record(zone_id, type, name, content) request( - :body => %Q{#{type}#{domain}#{content}}, + :body => %Q{#{type}#{name}#{content}}, :expects => 202, :method => 'POST', :path => "/api/domains/#{zone_id}/records.xml" @@ -30,7 +30,7 @@ module Fog class Mock - def create_record(zone_id, type, domain, content) + def create_record(zone_id, type, name, content) Fog::Mock.not_implemented end diff --git a/lib/fog/dns/requests/bluebox/update_record.rb b/lib/fog/dns/requests/bluebox/update_record.rb new file mode 100644 index 000000000..b69c8d6ca --- /dev/null +++ b/lib/fog/dns/requests/bluebox/update_record.rb @@ -0,0 +1,34 @@ +module Fog + module Bluebox + class DNS + class Real + + # Updates an existing record in a DNS zone + # ==== Parameters + # * type<~String> - type of DNS record (A, CNAME, etc) + # * name<~String> - host name for this DNS record + # * content<~String> - data for the DNS record (ie for an A record, the IP address) + def update_record(zone_id, record_id, options) + body = %Q{} + options.each {|k,v| body += "<#{k}>#{v}"} + body += "" + request( + :body => body, + :expects => 202, + :method => 'PUT', + :path => "/api/domains/#{zone_id}/records/#{record_id}.xml" + ) + end + + end + + class Mock + + def create_record(zone_id, type, domain, content) + Fog::Mock.not_implemented + end + + end + end + end +end From 356b11af382ad2664b84296345f1b25ba2303e5a Mon Sep 17 00:00:00 2001 From: ggoodale Date: Wed, 16 Feb 2011 22:43:38 -0800 Subject: [PATCH 5/8] Added dns support to bluebox bin scripts --- lib/fog/bin/bluebox.rb | 8 ++++++-- lib/fog/providers/bluebox.rb | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/fog/bin/bluebox.rb b/lib/fog/bin/bluebox.rb index 6590e9dc4..b25caccc5 100644 --- a/lib/fog/bin/bluebox.rb +++ b/lib/fog/bin/bluebox.rb @@ -5,7 +5,9 @@ class Bluebox < Fog::Bin case key when :blocks, :compute Fog::Bluebox::Compute - else + when :dns + Fog::Bluebox::DNS + else raise ArgumentError, "Unsupported #{self} service: #{key}" end end @@ -21,6 +23,8 @@ class Bluebox < Fog::Bin Fog::Compute.new(:provider => 'Bluebox') when :compute Fog::Compute.new(:provider => 'Bluebox') + when :dns + Fog::DNS.new(:provider => 'Bluebox') else raise ArgumentError, "Unrecognized service: #{service}" end @@ -29,7 +33,7 @@ class Bluebox < Fog::Bin end def services - [:compute] + [:compute, :dns] end end diff --git a/lib/fog/providers/bluebox.rb b/lib/fog/providers/bluebox.rb index 5b0dc9942..aad472de7 100644 --- a/lib/fog/providers/bluebox.rb +++ b/lib/fog/providers/bluebox.rb @@ -6,6 +6,7 @@ module Fog extend Fog::Provider service(:compute, 'compute/bluebox') + service(:dns, 'dns/bluebox') def self.new(attributes = {}) location = caller.first From bc85596cb4ff0fecdf021d8bf5d65911ec646c02 Mon Sep 17 00:00:00 2001 From: ggoodale Date: Wed, 16 Feb 2011 23:27:23 -0800 Subject: [PATCH 6/8] Added the remaining crud operations for zones --- lib/fog/dns/bluebox.rb | 3 ++ lib/fog/dns/models/bluebox/zone.rb | 14 ++++-- lib/fog/dns/requests/bluebox/create_zone.rb | 49 +++++++++++++++++++++ lib/fog/dns/requests/bluebox/delete_zone.rb | 31 +++++++++++++ lib/fog/dns/requests/bluebox/update_zone.rb | 30 +++++++++++++ 5 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 lib/fog/dns/requests/bluebox/create_zone.rb create mode 100644 lib/fog/dns/requests/bluebox/delete_zone.rb create mode 100644 lib/fog/dns/requests/bluebox/update_zone.rb diff --git a/lib/fog/dns/bluebox.rb b/lib/fog/dns/bluebox.rb index dc32541c8..24eb7a086 100644 --- a/lib/fog/dns/bluebox.rb +++ b/lib/fog/dns/bluebox.rb @@ -15,6 +15,9 @@ module Fog request :create_record request :update_record request :delete_record + request :create_zone + request :update_zone + request :delete_zone request :get_record request :get_records request :get_zone diff --git a/lib/fog/dns/models/bluebox/zone.rb b/lib/fog/dns/models/bluebox/zone.rb index 599518307..a61a8fa89 100644 --- a/lib/fog/dns/models/bluebox/zone.rb +++ b/lib/fog/dns/models/bluebox/zone.rb @@ -43,12 +43,20 @@ module Fog ] end - def save - raise Fog::Errors::Error.new('Not implemented') + def destroy + requires :identity + connection.delete_zone(identity) + true end + def save + requires :name, :ttl + options = attributes.inject({}) {|h, kv| h[kv[0]] = kv[1]; h} + data = identity.nil? ? connection.create_zone(options) : connection.update_zone(identity, options) + merge_attributes(data.body) + true + end end - end end end diff --git a/lib/fog/dns/requests/bluebox/create_zone.rb b/lib/fog/dns/requests/bluebox/create_zone.rb new file mode 100644 index 000000000..dccc97952 --- /dev/null +++ b/lib/fog/dns/requests/bluebox/create_zone.rb @@ -0,0 +1,49 @@ +module Fog + module Bluebox + class DNS + class Real + + # Create a new DNS zone + # ==== Parameters + # * 'name'<~String> - The name of the zone + # * 'ttl'<~Integer> - TimeToLive (ttl) for the domain, in seconds + # * 'retry'<~Integer> - Retry interval for the domain, in seconds + # * 'refresh'<~Integer> - Refresh interval for the zone + # * 'minimum'<~Integer> - Minimum refresh interval for the zone + # ==== Returns + # * response<~Excon::Response>: + # * body<~Hash>: + # * 'name'<~String> - The name of the zone + # * 'serial'<~Integer> - Serial number of the zone + # * 'ttl'<~Integer> - TimeToLive (ttl) for the domain, in seconds + # * 'retry'<~Integer> - Retry interval for the domain, in seconds + # * 'record-count'<~Integer> - Number of records in the zone + # * 'id'<~String> - Id for the zone + # * 'refresh'<~Integer> - Refresh interval for the zone + # * 'minimum'<~Integer> - Minimum refresh interval for the zone + def create_zone(options) + body = %Q{#{options[:name]}#{options[:ttl]}} + body += %Q{#{options[:retry]}} if options[:retry] + body += %Q{#{options[:retry]}} if options[:refresh] + body += %Q{#{options[:minimum]}} if options[:minimum] + body += %Q{} + request( + :body => body, + :expects => 202, + :method => 'POST', + :path => "/api/domains.xml" + ) + end + + end + + class Mock + + def create_zone(options) + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/lib/fog/dns/requests/bluebox/delete_zone.rb b/lib/fog/dns/requests/bluebox/delete_zone.rb new file mode 100644 index 000000000..f6ac37270 --- /dev/null +++ b/lib/fog/dns/requests/bluebox/delete_zone.rb @@ -0,0 +1,31 @@ +module Fog + module Bluebox + class DNS + class Real + + # Delete a zone from DNS + # ==== Parameters + # * zone_id<~Integer> - Id of zone to delete + # + # ==== Returns + # * response<~Excon::Response>: - HTTP status code will be result + def delete_zone(zone_id) + request( + :expects => 200, + :method => 'DELETE', + :path => "/api/domains/#{zone_id}.xml" + ) + end + + end + + class Mock + + def delete_zone(zone_id) + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/lib/fog/dns/requests/bluebox/update_zone.rb b/lib/fog/dns/requests/bluebox/update_zone.rb new file mode 100644 index 000000000..51438ae90 --- /dev/null +++ b/lib/fog/dns/requests/bluebox/update_zone.rb @@ -0,0 +1,30 @@ +module Fog + module Bluebox + class DNS + class Real + + # Updates an existing DNS zone + def update_zone(zone_id, options) + body = %Q{} + options.each {|k,v| body += "<#{k}>#{v}"} + body += "" + request( + :body => body, + :expects => 202, + :method => 'PUT', + :path => "/api/domains/#{zone_id}.xml" + ) + end + + end + + class Mock + + def create_record(zone_id, type, domain, content) + Fog::Mock.not_implemented + end + + end + end + end +end From fc18e38dea572a055542384ba57ba91127fb75d3 Mon Sep 17 00:00:00 2001 From: ggoodale Date: Thu, 17 Feb 2011 21:22:43 -0800 Subject: [PATCH 7/8] Bug fixes; Better tests --- lib/fog/compute/models/bluebox/server.rb | 13 +- lib/fog/dns/models/bluebox/record.rb | 8 +- lib/fog/dns/parsers/bluebox/create_record.rb | 26 ++++ lib/fog/dns/parsers/bluebox/create_zone.rb | 26 ++++ lib/fog/dns/requests/bluebox/create_record.rb | 12 +- lib/fog/dns/requests/bluebox/create_zone.rb | 3 + tests/compute/helper.rb | 13 +- tests/compute/requests/bluebox/block_tests.rb | 120 +++++++++--------- tests/dns/helper.rb | 8 +- tests/dns/models/record_tests.rb | 4 +- tests/dns/models/records_tests.rb | 2 +- tests/dns/models/zone_tests.rb | 2 +- tests/dns/models/zones_tests.rb | 3 +- tests/dns/requests/bluebox/dns_tests.rb | 79 +++++++----- tests/helper.rb | 2 +- 15 files changed, 201 insertions(+), 120 deletions(-) create mode 100644 lib/fog/dns/parsers/bluebox/create_record.rb create mode 100644 lib/fog/dns/parsers/bluebox/create_zone.rb 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') From 9fb34868d21913b0fcc01130cd10074c28e9a6de Mon Sep 17 00:00:00 2001 From: ggoodale Date: Tue, 22 Feb 2011 17:08:56 -0800 Subject: [PATCH 8/8] Test tweaks --- tests/compute/requests/bluebox/block_tests.rb | 120 +++++++++--------- tests/dns/requests/bluebox/dns_tests.rb | 12 +- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/tests/compute/requests/bluebox/block_tests.rb b/tests/compute/requests/bluebox/block_tests.rb index 222e21ba1..8580576ea 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/requests/bluebox/dns_tests.rb b/tests/dns/requests/bluebox/dns_tests.rb index 182852ae4..7c9fa2093 100644 --- a/tests/dns/requests/bluebox/dns_tests.rb +++ b/tests/dns/requests/bluebox/dns_tests.rb @@ -186,9 +186,9 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do 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['type'] == 'MX') and (record['name'] == @domain) and (record['content'] == mail_domain) and (record['priority'] == 10) + mail_domain = 'mail.' + @domain + "." + record = response.body + if (record['type'] == 'MX') and (record['name'] == @domain) and (record['content'] == mail_domain) and (record['priority'] == '10') result= true end end @@ -201,7 +201,7 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do result= false - response = Bluebox[:dns].get_records() + response = Bluebox[:dns].get_records(@new_zones[1]) if response.status == 200 records = response.body['records'] @@ -209,8 +209,8 @@ Shindo.tests('Bluebox::dns | DNS requests', ['bluebox', 'dns']) do records.each {|record| if record['type'] == 'MX' - mail_domain = 'mail.' + @domain - if (record['type'] == 'MX') and (record['name'] == @domain) and (record['content'] == mail_domain) and (record['priority'] == 10) + mail_domain = 'mail.' + @domain + "." + if (record['type'] == 'MX') and (record['name'] == @domain) and (record['content'] == mail_domain) and (record['priority'] == '10') result= true break end