Skip to content

Commit 6f8c0e6

Browse files
committed
Support pagination on Zerigo DNS zones
For Zerigo accounts with more than 100 domains, the previous zones.all method was unable to get to records beyond 100. This adds pagination per the Zerigo API doc with :per_page and :page parameters. You can then use count_zones to get the total zone count, divide by your :per_page, and iterate over all pages to fetch all your zones. https://www.zerigo.com/docs/apis/dns/1.1/zones/index
1 parent 55c720b commit 6f8c0e6

File tree

3 files changed

+72
-16
lines changed

3 files changed

+72
-16
lines changed

lib/fog/zerigo/models/dns/zones.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ class Zones < Fog::Collection
99

1010
model Fog::DNS::Zerigo::Zone
1111

12-
def all
13-
data = service.list_zones.body['zones']
12+
def all(options = {})
13+
data = service.list_zones(options).body['zones']
1414
load(data)
1515
end
1616

lib/fog/zerigo/requests/dns/list_zones.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,18 @@ class Real
3030
# * 'axfr-ips'<~String>
3131
# * 'restrict-axfr'<~String>
3232
# * 'status'<~Integer> - 200 indicates success
33-
def list_zones
33+
def list_zones(options = {})
34+
parameters = {}
35+
options.each do |option, value|
36+
case option
37+
when :per_page
38+
parameters[:per_page] = value
39+
when :page
40+
parameters[:page] = value
41+
end
42+
end
3443
request(
44+
:query => parameters,
3545
:expects => 200,
3646
:method => 'GET',
3747
:parser => Fog::Parsers::DNS::Zerigo::ListZones.new,

tests/zerigo/requests/dns/dns_tests.rb

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Shindo.tests('Fog::DNS[:zerigo] | DNS requests', ['zerigo', 'dns']) do
22

33
# tests assume have a free acccount - ie need to limit # of zones to max of 3
4-
4+
MAX_ZONE_COUNT = 3
55
@domain = ''
66
@org_zone_count = 0
77
@new_zones = []
@@ -156,21 +156,67 @@ def generate_unique_domain( with_trailing_dot = false)
156156

157157
end
158158

159-
test('list zones - make sure total count is correct') do
160-
pending if Fog.mocking?
159+
test("list zones - make sure total count is #{@org_zone_count+1}") do
160+
pending if Fog.mocking?
161161

162-
result= false
162+
result= false
163163

164-
response = Fog::DNS[:zerigo].list_zones()
165-
if response.status == 200
166-
zones = response.body['zones']
167-
if (@org_zone_count+1) == zones.count
168-
result= true;
169-
end
170-
end
164+
response = Fog::DNS[:zerigo].list_zones()
165+
if response.status == 200
166+
zones = response.body['zones']
167+
if (@org_zone_count+1) == zones.count
168+
result= true;
169+
end
170+
end
171171

172-
result
173-
end
172+
result
173+
end
174+
175+
test('list zones with pagination') do
176+
pending if Fog.mocking?
177+
178+
result = false
179+
180+
# make enough zones to paginate
181+
number_zones_to_create = MAX_ZONE_COUNT-@org_zone_count-1
182+
number_zones_to_create.times do |i|
183+
domain = generate_unique_domain
184+
options = { :nx_ttl => 1800, :active => 'N', :hostmaster => "netops@#{domain}",
185+
:notes => 'for client ABC', :tag_list=> "sample-tag-#{i}" }
186+
response = Fog::DNS[:zerigo].create_zone( domain, 14400, 'pri', options )
187+
if response.status == 201
188+
@new_zones << response.body['id']
189+
else
190+
return false
191+
end
192+
end
193+
194+
total_zone_count_response = Fog::DNS[:zerigo].list_zones()
195+
if total_zone_count_response.status == 200
196+
if number_zones_to_create > 0
197+
zones_we_should_see = @new_zones.dup
198+
total_zone_count = total_zone_count_response.headers['X-Query-Count'].to_i
199+
else
200+
zones_we_should_see = total_zone_count_response.body['zones'].collect {|z| z['id']}
201+
total_zone_count = zones_we_should_see.count
202+
end
203+
204+
total_zone_count.times do |i|
205+
# zerigo pages are 1-indexed, not 0-indexed
206+
response = Fog::DNS[:zerigo].list_zones(:per_page => 1, :page => i+1)
207+
zones = response.body['zones']
208+
if 1 == zones.count
209+
zones_we_should_see.delete(zones.first['id'])
210+
end
211+
end
212+
213+
if zones_we_should_see.empty?
214+
result = true
215+
end
216+
end
217+
218+
result
219+
end
174220

175221
test('create record - simple A record') do
176222
pending if Fog.mocking?

0 commit comments

Comments
 (0)