mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
* [dreamhost|dns] initial import
This commit is contained in:
parent
21b8f59f90
commit
782b935a9b
14 changed files with 424 additions and 0 deletions
|
@ -50,6 +50,7 @@ Gem::Specification.new do |s|
|
|||
s.add_dependency('net-ssh', '>=2.1.3')
|
||||
s.add_dependency('nokogiri', '~>1.5.0')
|
||||
s.add_dependency('ruby-hmac')
|
||||
s.add_dependency('uuid')
|
||||
|
||||
## List your development dependencies here. Development dependencies are
|
||||
## those that are only needed during development
|
||||
|
|
|
@ -65,6 +65,7 @@ require 'fog/bin/cloudstack'
|
|||
require 'fog/bin/clodo'
|
||||
require 'fog/bin/dnsimple'
|
||||
require 'fog/bin/dnsmadeeasy'
|
||||
require 'fog/bin/dreamhost'
|
||||
require 'fog/bin/dynect'
|
||||
require 'fog/bin/ecloud'
|
||||
require 'fog/bin/glesys'
|
||||
|
|
31
lib/fog/bin/dreamhost.rb
Normal file
31
lib/fog/bin/dreamhost.rb
Normal file
|
@ -0,0 +1,31 @@
|
|||
class Dreamhost < Fog::Bin
|
||||
class << self
|
||||
|
||||
def class_for(key)
|
||||
case key
|
||||
when :dns
|
||||
Fog::DNS::Dreamhost
|
||||
else
|
||||
raise ArgumentError, "Unrecognized service: #{key}"
|
||||
end
|
||||
end
|
||||
|
||||
def [](service)
|
||||
@@connections ||= Hash.new do |hash, key|
|
||||
hash[key] = case key
|
||||
when :dns
|
||||
Fog::Logger.warning("Dreamhost[:dns] is not recommended, use DNS[:dreamhost] for portability")
|
||||
Fog::DNS.new(:provider => 'Dreamhost')
|
||||
else
|
||||
raise ArgumentError, "Unrecognized service: #{key.inspect}"
|
||||
end
|
||||
end
|
||||
@@connections[service]
|
||||
end
|
||||
|
||||
def services
|
||||
Fog::Dreamhost.services
|
||||
end
|
||||
|
||||
end
|
||||
end
|
|
@ -80,6 +80,7 @@ An alternate file may be used by placing its path in the FOG_RC environment vari
|
|||
:dnsimple_password:
|
||||
:dnsmadeeasy_api_key:
|
||||
:dnsmadeeasy_secret_key:
|
||||
:dreamhost_api_key:
|
||||
:cloudstack_host:
|
||||
:cloudstack_api_key:
|
||||
:cloudstack_secret_access_key:
|
||||
|
|
|
@ -20,6 +20,9 @@ module Fog
|
|||
when :dnsmadeeasy
|
||||
require 'fog/dnsmadeeasy/dns'
|
||||
Fog::DNS::DNSMadeEasy.new(attributes)
|
||||
when :dreamhost
|
||||
require 'fog/dreamhost/dns'
|
||||
Fog::DNS::Dreamhost.new(attributes)
|
||||
when :dynect
|
||||
require 'fog/dynect/dns'
|
||||
Fog::DNS::Dynect.new(attributes)
|
||||
|
|
11
lib/fog/dreamhost.rb
Normal file
11
lib/fog/dreamhost.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
require(File.expand_path(File.join(File.dirname(__FILE__), 'core')))
|
||||
|
||||
module Fog
|
||||
module Dreamhost
|
||||
|
||||
extend Fog::Provider
|
||||
|
||||
service(:dns, 'dreamhost/dns', 'DNS')
|
||||
|
||||
end
|
||||
end
|
97
lib/fog/dreamhost/dns.rb
Normal file
97
lib/fog/dreamhost/dns.rb
Normal file
|
@ -0,0 +1,97 @@
|
|||
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'dreamhost'))
|
||||
require 'fog/dns'
|
||||
require 'uuid'
|
||||
|
||||
module Fog
|
||||
module DNS
|
||||
class Dreamhost < Fog::Service
|
||||
|
||||
requires :dreamhost_api_key
|
||||
|
||||
model_path 'fog/dreamhost/models/dns'
|
||||
model :record
|
||||
collection :records
|
||||
|
||||
request_path 'fog/dreamhost/requests/dns'
|
||||
request :create_record
|
||||
request :list_records
|
||||
request :delete_record
|
||||
request :get_record
|
||||
|
||||
class Mock
|
||||
|
||||
def self.data
|
||||
@data ||= Hash.new do |hash, key|
|
||||
hash[key] = {}
|
||||
end
|
||||
end
|
||||
|
||||
def self.reset
|
||||
@data = nil
|
||||
end
|
||||
|
||||
def initialize(options={})
|
||||
@dreamhost_api_key = options[:dreamhost_api_key]
|
||||
end
|
||||
|
||||
def data
|
||||
self.class.data
|
||||
end
|
||||
|
||||
def reset_data
|
||||
self.class.data.delete
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class Real
|
||||
|
||||
def initialize(options={})
|
||||
require 'multi_json'
|
||||
|
||||
@dreamhost_api_key = options[:dreamhost_api_key]
|
||||
if options[:dreamhost_url]
|
||||
uri = URI.parse(options[:dreamhost_url])
|
||||
options[:host] = uri.host
|
||||
options[:port] = uri.port
|
||||
options[:scheme] = uri.scheme
|
||||
end
|
||||
@host = options[:host] || "api.dreamhost.com"
|
||||
@persistent = options[:persistent] || false
|
||||
@port = options[:port] || 443
|
||||
@scheme = options[:scheme] || 'https'
|
||||
@connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent)
|
||||
end
|
||||
|
||||
def reload
|
||||
@connection.reset
|
||||
end
|
||||
|
||||
def request(params)
|
||||
#response = @connection.request(params.merge!({:host => @host}))
|
||||
params[:query].merge!( { :key => @dreamhost_api_key,
|
||||
:format => 'json',
|
||||
:unique_id => UUID.generate } )
|
||||
response = @connection.request(params)
|
||||
|
||||
unless response.body.empty?
|
||||
response.body = MultiJson.decode(response.body)
|
||||
end
|
||||
if ENV['DEBUG_DREAMHOST']
|
||||
require 'pp'
|
||||
puts "--- REQUEST PARAMS ---"
|
||||
pp params
|
||||
puts "--- END PARAMS --- "
|
||||
puts "--- REQUEST RESPONSE ---"
|
||||
pp response
|
||||
puts "--- END RESPONSE --- "
|
||||
end
|
||||
if response.body['result'] != 'success'
|
||||
raise response.body['data']
|
||||
end
|
||||
response
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
34
lib/fog/dreamhost/models/dns/record.rb
Normal file
34
lib/fog/dreamhost/models/dns/record.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
require 'fog/core/model'
|
||||
|
||||
module Fog
|
||||
module DNS
|
||||
class Dreamhost
|
||||
|
||||
class Record < Fog::Model
|
||||
|
||||
identity :name, :aliases => 'record'
|
||||
|
||||
attribute :value
|
||||
attribute :zone
|
||||
attribute :type
|
||||
attribute :editable
|
||||
attribute :account_id
|
||||
attribute :comment
|
||||
|
||||
def destroy
|
||||
connection.delete_record(name, type, value)
|
||||
true
|
||||
end
|
||||
|
||||
def save
|
||||
requires :name, :type, :value
|
||||
|
||||
data = connection.create_record(name, type, value, comment)
|
||||
true
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
33
lib/fog/dreamhost/models/dns/records.rb
Normal file
33
lib/fog/dreamhost/models/dns/records.rb
Normal file
|
@ -0,0 +1,33 @@
|
|||
require 'fog/core/collection'
|
||||
require 'fog/dreamhost/models/dns/record'
|
||||
|
||||
module Fog
|
||||
module DNS
|
||||
class Dreamhost
|
||||
|
||||
class Records < Fog::Collection
|
||||
|
||||
model Fog::DNS::Dreamhost::Record
|
||||
|
||||
def all(filter = {})
|
||||
clear
|
||||
if filter[:zone]
|
||||
data = connection.list_records.body['data'].find_all { |r| r['zone'] == filter[:zone] }
|
||||
else
|
||||
data = connection.list_records.body['data']
|
||||
end
|
||||
load(data)
|
||||
end
|
||||
|
||||
def get(record_name)
|
||||
data = connection.get_record(record_name).body['data'].find { |r| r['record'] == record_name }
|
||||
new(data)
|
||||
rescue Excon::Errors::NotFound
|
||||
nil
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
32
lib/fog/dreamhost/requests/dns/create_record.rb
Normal file
32
lib/fog/dreamhost/requests/dns/create_record.rb
Normal file
|
@ -0,0 +1,32 @@
|
|||
module Fog
|
||||
module DNS
|
||||
class Dreamhost
|
||||
|
||||
class Mock
|
||||
|
||||
def create_record(record, type, value, comment = "")
|
||||
Fog::Mock.not_implemented
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class Real
|
||||
|
||||
def create_record(record, type, value, comment = "")
|
||||
request( :expects => 200,
|
||||
:method => 'GET',
|
||||
:path => "/",
|
||||
:query => {
|
||||
:record => record,
|
||||
:type => type,
|
||||
:value => value,
|
||||
:cmd => 'dns-add_record',
|
||||
:comment => comment
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
31
lib/fog/dreamhost/requests/dns/delete_record.rb
Normal file
31
lib/fog/dreamhost/requests/dns/delete_record.rb
Normal file
|
@ -0,0 +1,31 @@
|
|||
module Fog
|
||||
module DNS
|
||||
class Dreamhost
|
||||
|
||||
class Mock
|
||||
|
||||
def delete_record(name, type, value)
|
||||
raise Fog::Mock.not_implemented
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class Real
|
||||
|
||||
def delete_record(name, type, value)
|
||||
request( :expects => 200,
|
||||
:method => "GET",
|
||||
:path => "/",
|
||||
:query => {
|
||||
:cmd => 'dns-remove_record',
|
||||
:type => type,
|
||||
:record => name,
|
||||
:value => value,
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
16
lib/fog/dreamhost/requests/dns/get_record.rb
Normal file
16
lib/fog/dreamhost/requests/dns/get_record.rb
Normal file
|
@ -0,0 +1,16 @@
|
|||
module Fog
|
||||
module DNS
|
||||
class Dreamhost
|
||||
class Real
|
||||
|
||||
def get_record(record_name)
|
||||
data = request( :expects => 200,
|
||||
:method => "GET",
|
||||
:path => "/",
|
||||
:query => { :cmd => 'dns-list_records' } )
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
25
lib/fog/dreamhost/requests/dns/list_records.rb
Normal file
25
lib/fog/dreamhost/requests/dns/list_records.rb
Normal file
|
@ -0,0 +1,25 @@
|
|||
module Fog
|
||||
module DNS
|
||||
class Dreamhost
|
||||
|
||||
class Mock
|
||||
|
||||
def request(*args)
|
||||
Fog::Mock.not_implemented
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class Real
|
||||
|
||||
def list_records
|
||||
request( :expects => 200,
|
||||
:method => "GET",
|
||||
:path => "/",
|
||||
:query => { :cmd => 'dns-list_records' } )
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
108
tests/dreamhost/requests/dns/dns_tests.rb
Normal file
108
tests/dreamhost/requests/dns/dns_tests.rb
Normal file
|
@ -0,0 +1,108 @@
|
|||
Shindo.tests('Fog::DNS[:dreamhost] | DNS requests', ['dreamhost', 'dns']) do
|
||||
|
||||
tests("success") do
|
||||
|
||||
test("list records") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
response = Fog::DNS[:dreamhost].list_records
|
||||
|
||||
if response.status == 200
|
||||
@records = response.body["data"]
|
||||
end
|
||||
|
||||
(response.status == 200) and (response.body.size == 2)
|
||||
end
|
||||
|
||||
test("list all the records") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
Fog::DNS[:dreamhost].records.all.size > 0
|
||||
end
|
||||
|
||||
test("list records from existing zone") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
Fog::DNS[:dreamhost].records.all(:zone => 'rbel.co').size > 0
|
||||
end
|
||||
|
||||
test("list records from nonexistent zone") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
Fog::DNS[:dreamhost].records.all(:zone => 'foozoone.local').size == 0
|
||||
end
|
||||
|
||||
test("create an A resource record without comment") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
name = "foo.testing.rbel.co"
|
||||
type = "A"
|
||||
value = "1.2.3.4"
|
||||
response = Fog::DNS[:dreamhost].create_record(name, type, value)
|
||||
|
||||
response.body['result'] == 'success'
|
||||
end
|
||||
|
||||
test("create an A resource record with comment") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
name = "foo2.testing.rbel.co"
|
||||
type = "A"
|
||||
value = "1.2.3.4"
|
||||
comment = "test"
|
||||
response = Fog::DNS[:dreamhost].create_record(name, type, value, comment)
|
||||
|
||||
response.body['result'] == 'success'
|
||||
end
|
||||
|
||||
test("create TXT record") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
name = "txt.testing.rbel.co"
|
||||
type = "txt"
|
||||
value = "foobar"
|
||||
comment = "test"
|
||||
response = Fog::DNS[:dreamhost].create_record(name, type, value, comment)
|
||||
|
||||
response.body['result'] == 'success'
|
||||
end
|
||||
|
||||
test("TXT record found") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
rec = Fog::DNS[:dreamhost].records.get 'txt.testing.rbel.co'
|
||||
|
||||
rec != nil
|
||||
end
|
||||
|
||||
test("delete testing records") do
|
||||
pending if Fog.mocking?
|
||||
|
||||
sleep 5
|
||||
|
||||
success = true
|
||||
r = %w(
|
||||
foo.testing.rbel.co
|
||||
foo2.testing.rbel.co
|
||||
txt.testing.rbel.co
|
||||
)
|
||||
r.each do |rec|
|
||||
name = rec
|
||||
@records.each do |record|
|
||||
if record['record'] == name
|
||||
response = Fog::DNS[:dreamhost].delete_record(name, record["type"], record["value"])
|
||||
success = false if (response.body['result'] != 'success')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
success
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
tests( 'failure') do
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in a new issue