2012-05-15 14:54:20 -04:00
require 'fog/rackspace'
2011-08-31 16:52:53 -04:00
require 'fog/dns'
2011-08-15 22:22:35 -04:00
module Fog
module DNS
class Rackspace < Fog :: Service
2011-11-24 11:29:12 -05:00
class CallbackError < Fog :: Errors :: Error
attr_reader :response , :message , :details
def initialize ( response )
@response = response
@message = response . body [ 'error' ] [ 'message' ]
@details = response . body [ 'error' ] [ 'details' ]
end
end
2011-08-15 22:22:35 -04:00
US_ENDPOINT = 'https://dns.api.rackspacecloud.com/v1.0'
UK_ENDPOINT = 'https://lon.dns.api.rackspacecloud.com/v1.0'
requires :rackspace_api_key , :rackspace_username
2013-03-13 17:01:32 -04:00
recognizes :rackspace_auth_url , :rackspace_auth_token , :rackspace_dns_endpoint , :rackspace_dns_url , :rackspace_region
2011-08-15 22:22:35 -04:00
2011-08-29 11:37:01 -04:00
model_path 'fog/rackspace/models/dns'
2011-08-28 15:41:48 -04:00
model :record
collection :records
2011-08-27 22:06:46 -04:00
model :zone
collection :zones
2011-08-15 22:22:35 -04:00
2011-08-29 11:37:01 -04:00
request_path 'fog/rackspace/requests/dns'
2011-08-28 10:53:43 -04:00
#TODO - Import/Export, modify multiple domains, modify multiple records
2011-08-27 18:46:15 -04:00
request :callback
2011-08-16 20:59:57 -04:00
request :list_domains
2011-08-27 18:46:15 -04:00
request :list_domain_details
request :modify_domain
request :create_domains
2011-08-28 10:53:43 -04:00
request :remove_domain
request :remove_domains
2011-08-27 18:46:15 -04:00
request :list_subdomains
2011-08-28 10:53:43 -04:00
request :list_records
request :list_record_details
request :modify_record
request :remove_record
request :remove_records
request :add_records
2011-08-16 20:59:57 -04:00
2013-03-13 17:01:32 -04:00
class Mock < Fog :: Rackspace :: Service
2011-09-22 20:46:54 -04:00
def initialize ( options = { } )
2011-09-23 11:59:30 -04:00
@rackspace_api_key = options [ :rackspace_api_key ]
@rackspace_username = options [ :rackspace_username ]
@rackspace_auth_url = options [ :rackspace_auth_url ]
@connection_options = options [ :connection_options ] || { }
end
def self . data
@data || = {
}
end
def self . reset
@data = nil
end
def data
self . class . data
end
def reset_data
self . class . reset
2011-09-22 20:46:54 -04:00
end
2011-08-16 20:59:57 -04:00
end
2011-08-15 22:22:35 -04:00
2013-03-13 17:01:32 -04:00
class Real < Fog :: Rackspace :: Service
def service_name
:cloudDNS
end
def region
#Note: DNS does not currently support multiple regions
@rackspace_region
end
2011-08-15 22:22:35 -04:00
def initialize ( options = { } )
@rackspace_api_key = options [ :rackspace_api_key ]
@rackspace_username = options [ :rackspace_username ]
@rackspace_auth_url = options [ :rackspace_auth_url ]
2011-09-12 11:01:48 -04:00
@connection_options = options [ :connection_options ] || { }
2013-03-18 11:37:05 -04:00
@rackspace_endpoint = options [ :rackspace_dns_url ] || options [ :rackspace_dns_endpoint ]
2013-03-13 17:01:32 -04:00
@rackspace_region = options [ :rackspace_region ]
2011-08-15 22:22:35 -04:00
2013-03-13 17:01:32 -04:00
authenticate
deprecation_warnings ( options )
2011-08-15 22:22:35 -04:00
2011-09-12 11:01:48 -04:00
@connection_options [ :headers ] || = { }
2013-03-13 17:01:32 -04:00
@connection_options [ :headers ] . merge! ( { 'Content-Type' = > 'application/json' , 'X-Auth-Token' = > auth_token } )
@persistent = options [ :persistent ] || false
@connection = Fog :: Connection . new ( endpoint_uri . to_s , @persistent , @connection_options )
end
2011-09-12 11:01:48 -04:00
2013-03-13 17:01:32 -04:00
def endpoint_uri ( service_endpoint_url = nil )
@uri = super ( @rackspace_endpoint || service_endpoint_url , :rackspace_dns_url )
2011-08-15 22:22:35 -04:00
end
private
def request ( params )
#TODO - Unify code with other rackspace services
begin
response = @connection . request ( params . merge! ( {
2013-03-13 17:01:32 -04:00
:path = > " #{ endpoint_uri . path } / #{ params [ :path ] } "
2011-08-15 22:22:35 -04:00
} ) )
2011-08-16 22:33:15 -04:00
rescue Excon :: Errors :: BadRequest = > error
raise Fog :: Rackspace :: Errors :: BadRequest . slurp error
2011-08-27 18:46:15 -04:00
rescue Excon :: Errors :: Conflict = > error
raise Fog :: Rackspace :: Errors :: Conflict . slurp error
rescue Excon :: Errors :: NotFound = > error
raise Fog :: Rackspace :: Errors :: NotFound . slurp error
2011-08-27 22:06:46 -04:00
rescue Excon :: Errors :: ServiceUnavailable = > error
raise Fog :: Rackspace :: Errors :: ServiceUnavailable . slurp error
2011-08-15 22:22:35 -04:00
end
unless response . body . empty?
2012-04-25 10:31:28 -04:00
response . body = Fog :: JSON . decode ( response . body )
2011-08-15 22:22:35 -04:00
end
response
end
2011-08-27 18:46:15 -04:00
def array_to_query_string ( arr )
arr . collect { | k , v | " #{ k } = #{ v } " } . join ( '&' )
end
2011-08-28 10:53:43 -04:00
def validate_path_fragment ( name , fragment )
if fragment . nil? or fragment . to_s . empty?
2011-08-31 13:37:50 -04:00
raise ArgumentError . new ( " #{ name } cannot be null or empty " )
2011-08-28 10:53:43 -04:00
end
end
2013-03-13 17:01:32 -04:00
private
def deprecation_warnings ( options )
Fog :: Logger . deprecation ( " The :rackspace_dns_endpoint option is deprecated. Please use :rackspace_dns_url for custom endpoints " ) if options [ :rackspace_dns_endpoint ]
end
def setup_endpoint ( credentials )
account_id = credentials [ 'X-Server-Management-Url' ] . match ( / .* \/ ([ \ d]+)$ / ) [ 1 ]
2013-03-18 11:37:05 -04:00
@uri = URI . parse ( @rackspace_endpoint || US_ENDPOINT )
2013-03-13 17:01:32 -04:00
@uri . path = " #{ @uri . path } / #{ account_id } "
end
def authenticate_v1 ( options )
credentials = Fog :: Rackspace . authenticate ( options , @connection_options )
setup_endpoint credentials
@auth_token = credentials [ 'X-Auth-Token' ]
end
def authenticate
options = {
:rackspace_api_key = > @rackspace_api_key ,
:rackspace_username = > @rackspace_username ,
:rackspace_auth_url = > @rackspace_auth_url
}
super ( options )
end
2011-08-15 22:22:35 -04:00
end
end
end
end