add dynect DNS provider with session request implemented

This commit is contained in:
Michael Hale 2011-02-07 22:12:56 -05:00 committed by geemus
parent 0776800b94
commit 4906eae3df
8 changed files with 143 additions and 1 deletions

View File

@ -73,3 +73,4 @@ require 'fog/bin/vcloud'
require 'fog/bin/virtual_box'
require 'fog/bin/voxel'
require 'fog/bin/zerigo'
require 'fog/bin/dynect'

32
lib/fog/bin/dynect.rb Normal file
View File

@ -0,0 +1,32 @@
require 'fog/dns/dynect'
class Dynect < Fog::Bin
class << self
def class_for(key)
case key
when :dns
Fog::Dynect::DNS
else
raise ArgumentError, "Unrecognized service: #{key}"
end
end
def [](service)
@@connections ||= Hash.new do |hash, key|
hash[key] = case key
when :dns
Fog::DNS.new(:provider => 'Dynect')
else
raise ArgumentError, "Unrecognized service: #{service}"
end
end
@@connections[service]
end
def services
[:dns]
end
end
end

View File

@ -29,6 +29,9 @@ module Fog
when :zerigo
require 'fog/dns/zerigo'
Fog::DNS::Zerigo.new(attributes)
when 'Dynect'
require 'fog/dns/dynect'
Fog::Dynect::DNS.new(attributes)
else
raise ArgumentError.new("#{provider} is not a recognized dns provider")
end

57
lib/fog/dns/dynect.rb Normal file
View File

@ -0,0 +1,57 @@
module Fog
module Dynect
class DNS < Fog::Service
requires :dynect_customer, :dynect_username, :dynect_password
recognizes :timeout, :persistent
recognizes :provider # remove post deprecation
# model_path 'fog/dns/models/dynect'
# model :record
# collection :records
# model :zone
# collection :zones
request_path 'fog/dns/requests/dynect'
request :session
class Real
def initialize(options={})
@dynect_customer = options[:dynect_customer]
@dynect_username = options[:dynect_username]
@dynect_password = options[:dynect_password]
@host = "api2.dynect.net"
@port = options[:port] || 443
@scheme = options[:scheme] || 'https'
@version = options[:version] || '2.3.1'
@connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent] || true)
end
def request(params)
begin
params[:headers] ||= {}
params[:headers]['Content-Type'] = 'text/xml'
params[:headers]['API-Version'] = @version
response = @connection.request(params.merge!({:host => @host}))
rescue Excon::Errors::HTTPStatusError => error
raise case error
when Excon::Errors::NotFound
Fog::Dynect::DNS::NotFound.slurp(error)
else
error
end
end
response
end
end
class Mock
def zones
end
end
end
end
end

View File

@ -0,0 +1,32 @@
module Fog
module Dynect
class DNS
class Real
def session
builder = Builder::XmlMarkup.new
xml = builder.parameters do |root|
root.customer_name(@dynect_customer)
root.user_name( @dynect_username)
root.password(@dynect_password)
end
request(
:expects => 200,
:method => "POST",
:path => "/REST/Session/",
:body => xml
)
end
end
class Mock
def session
Fog::Mock.not_implemented
end
end
end
end
end

View File

@ -26,6 +26,9 @@ def dns_providers
},
:zerigo => {
:mocked => false
},
Dynect => {
:mocked => false
}
}
end

View File

@ -0,0 +1,14 @@
Shindo.tests('Dynect::dns | DNS requests', ['dynect', 'dns']) do
tests( 'success') do
test ('start api session') do
pending if Fog.mocking?
response = Dynect[:dns].session
if response.status == 200
@auth_token = response.body['token']
end
response.status == 200
end
end
end

View File

@ -8,7 +8,7 @@ def lorem_file
end
# check to see which credentials are available and add others to the skipped tags list
all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'ecloud', 'gogrid', 'google', 'linode', 'local', 'ninefold', 'newservers', 'rackspace', 'slicehost', 'stormondemand', 'voxel', 'zerigo']
all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'dynect', 'ecloud', 'gogrid', 'google', 'linode', 'local', 'ninefold', 'newservers', 'rackspace', 'slicehost', 'stormondemand', 'voxel', 'zerigo']
available_providers = Fog.available_providers.map {|provider| provider.downcase}
for provider in (all_providers - available_providers)
Formatador.display_line("[yellow]Skipping tests for [bold]#{provider}[/] [yellow]due to lacking credentials (add some to '~/.fog' to run them)[/]")