1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

Implemented mocks for Zerigo.

This commit is contained in:
Kevin Menard 2011-10-08 20:19:32 -04:00
parent 09b2266371
commit 25562a42b4
16 changed files with 352 additions and 16 deletions

View file

@ -34,7 +34,7 @@ module Fog
def self.data
@data ||= Hash.new do |hash, key|
hash[key] = {}
hash[key] = key == :zones ? [] : {}
end
end
@ -48,13 +48,24 @@ module Fog
end
def data
self.class.data[@zerigo_email]
self.class.data
end
def reset_data
self.class.data.delete(@zerigo_email)
self.class.reset
end
def find_by_zone_id(zone_id)
self.data[:zones].find { |z| z['id'] == zone_id }
end
def find_by_domain(domain)
self.data[:zones].find { |z| z['domain'] == domain }
end
def find_host(host_id)
self.data[:zones].collect { |z| z['hosts'].find { |h| h['id'] == host_id } }.compact
end
end
class Real

View file

@ -14,8 +14,8 @@ module Fog
load(data)
end
def get(zone_id)
data = connection.get_zone(zone_id).body
def get(zone_id_or_domain)
data = connection.get_zone(zone_id_or_domain).body
zone = new(data)
zone.records.load(data['hosts'])
zone

View file

@ -23,6 +23,25 @@ module Fog
end
end
class Mock # :nodoc:all
def count_hosts(zone_id)
zone = find_by_zone_id(zone_id)
response = Excon::Response.new
if zone
response.status = 200
response.body = {
'count' => zone['hosts'].size
}
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -13,7 +13,7 @@ module Fog
# * body<~Hash>
# * 'count'<~Integer>
# * 'status'<~Integer> - 200 indicates success
def count_zones()
def count_zones
request(
:expects => 200,
:method => 'GET',
@ -23,6 +23,17 @@ module Fog
end
end
class Mock # :nodoc:all
def count_zones
response = Excon::Response.new
response.status = 200
response.body = { 'count' => self.data[:zones].size }
response
end
end
end
end
end

View file

@ -11,7 +11,7 @@ module Fog
# * zone_id<~Integer>
# * host_type<~String>
# * data<~String>
# * options<~Hash> - optional paramaters
# * options<~Hash> - optional parameters
# * hostname<~String> - Note: normally this is set/required!!
# * notes<~String>
# * priority<~Integer> - Note: required for MX or SRV records
@ -57,6 +57,72 @@ module Fog
end
end
class Mock # :nodoc:all
def valid_host_types
%w[A AAAA CNAME GEO MX NS SPF SRV TXT URL PTR CNAME NS]
end
def create_host(zone_id, host_type, data, options = {})
zone = find_by_zone_id(zone_id)
response = Excon::Response.new
# Handle error cases.
# Zone doesn't exist.
unless zone
response.status = 404
return response
end
# Bad host type.
unless valid_host_types.include?(host_type)
response.status = 422
response.body = {
'errors' => [
'error' => 'Host type is not included in the list'
]
}
return response
end
# Missing or bad priority value for MX or SRV records.
if %w[MX SRV].include?(host_type) && options['priority'].to_s !~ /\d+/
response.status = 422
response.body = {
'errors' => [
'error' => 'Priority is not a number'
]
}
return response
end
# Successful case.
now = Time.now
host = {
'id' => rand(10000000),
'fqdn' => options[:hostname] ? "#{options[:hostname]}.#{zone['domain']}" : zone['domain'],
'data' => data,
'hostname' => options[:hostname],
'ttl' => options[:ttl].to_i,
'host-type' => host_type,
'created-at' => now,
'updated-at' => now,
'notes' => options[:notes],
'priority' => options[:priority].to_i,
'zone-id' => zone_id
}
zone['hosts'] << host
response.status = 201
response.body = host
response
end
end
end
end
end

View file

@ -84,6 +84,49 @@ module Fog
end
end
class Mock # :nodoc:all
def create_zone(domain, default_ttl, ns_type, options = {})
now = Time.now
zone = {
'id' => rand(10000000),
'domain' => domain,
'created-at' => now,
'updated-at' => now,
'ns1' => options[:ns1],
'nx-ttl' => options[:nx_ttl].to_i,
'default-ttl' => default_ttl.to_i,
'ns-type' => ns_type,
'hosts' => options[:hosts] || [],
'hosts-count' => (options[:hosts] || []).size,
'notes' => options[:notes],
'slave-nameservers' => options[:slave_nameservers],
'tag-list' => options[:tag_list]
}
response = Excon::Response.new
if self.data[:zones].any? {|z| z['domain'] == zone['domain'] }
response.status = 422
response.body = {
'errors' => [
'error' => 'Domain is already associated to another account',
'error' => 'Domain already exists. If it was just deleted, wait a minute and try again'
]
}
else
self.data[:zones] << zone
response.status = 201
response.headers = { 'Location' => "http://ns.zerigo.com/api/1.1/zones/#{zone['id']}" }
response.body = zone['hosts'].empty? ? zone.merge(:hosts => nil) : zone # Zerigo returns nil, not an empty list only on the create command.
end
response
end
end
end
end
end

View file

@ -19,6 +19,25 @@ module Fog
end
end
class Mock # :nodoc:all
def delete_host(host_id)
host = find_host(host_id)
response = Excon::Response.new
if host
zone = find_by_zone_id(host['zone-id'])
zone['hosts'].delete(host)
response.status = 200
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -20,6 +20,23 @@ module Fog
end
end
class Mock # :nodoc:all
def delete_zone(zone_id)
zone = find_by_zone_id(zone_id)
response = Excon::Response.new
if zone
self.data[:zones].delete(zone)
response.status = 200
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -50,6 +50,27 @@ module Fog
end
end
class Mock # :nodoc:all
def find_hosts(fqdn, zone_id = nil)
response = Excon::Response.new
zone = find_by_zone_id(zone_id)
if zone_id && !zone
response.status = 404
else
hosts = zone ? zone['hosts'].select { |z| z['fqdn'] == fqdn } :
self.data[:zones].collect { |z| z['hosts'].find { |h| h['fqdn'] == fqdn } }.compact
response.status = 200
response.body = {
'hosts' => hosts
}
end
response
end
end
end
end
end

View file

@ -34,6 +34,23 @@ module Fog
end
end
class Mock # :nodoc:all
def get_host(host_id)
host = find_host(host_id)
response = Excon::Response.new
if host
response.status = 200
response.body = host
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -34,16 +34,33 @@ module Fog
# * 'restrict-axfr'<~String>
# * 'status'<~Integer> - 200 indicates success
def get_zone(zone)
def get_zone(zone_id_or_domain)
request(
:expects => 200,
:method => 'GET',
:parser => Fog::Parsers::DNS::Zerigo::GetZone.new,
:path => "/api/1.1/zones/#{zone}.xml"
:path => "/api/1.1/zones/#{zone_id_or_domain}.xml"
)
end
end
class Mock # :nodoc:all
def get_zone(zone_id_or_domain)
zone = find_by_zone_id(zone_id_or_domain) || find_by_domain(zone_id_or_domain)
response = Excon::Response.new
if zone
response.status = 200
response.body = zone
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -31,6 +31,29 @@ module Fog
end
end
class Mock # :nodoc:all
def get_zone_stats(zone_id)
zone = find_by_zone_id(zone_id)
response = Excon::Response.new
if zone
response.status = 200
response.body = {
'id' => zone,
'domain' => zone['domain'],
'period-begin' => zone['created-at'].strftime("%F"),
'period-end' => Date.today.to_s,
'queries' => 0
}
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -35,6 +35,25 @@ module Fog
end
end
class Mock # :nodoc:all
def list_hosts(zone_id)
zone = find_by_zone_id(zone_id)
response = Excon::Response.new
if zone
response.status = 200
response.body = {
'hosts' => zone['hosts']
}
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -40,6 +40,21 @@ module Fog
end
end
class Mock # :nodoc:all
def list_zones
response = Excon::Response.new
response.status = 200
response.body = {
'zones' => self.data[:zones]
}
response
end
end
end
end
end

View file

@ -47,6 +47,25 @@ module Fog
end
end
class Mock # :nodoc:all
def update_host(host_id, options = {})
host = find_host(host_id)
response = Excon::Response.new
if host
options.each { |k, v| host[k.to_s] = v } # Deal with symbols in requests but strings in responses.
host['updated-at'] = Time.now
response.status = 200
else
response.status = 404
end
response
end
end
end
end
end

View file

@ -65,6 +65,25 @@ module Fog
end
end
class Mock # :nodoc:all
def update_zone(zone_id, options = {})
zone = find_by_zone_id(zone_id)
response = Excon::Response.new
if zone
options.each { |k, v| zone[k.to_s] = v } # Deal with symbols in requests but strings in responses.
zone['updated-at'] = Time.now
response.status = 200
else
response.status = 404
end
response
end
end
end
end
end