Skip to content

Commit b590330

Browse files
committed
Merge pull request #1140 from tseaver/dns-zone
Add 'ManagedZone' and related support
2 parents 5ec3d11 + 3f8f4c0 commit b590330

File tree

5 files changed

+762
-1
lines changed

5 files changed

+762
-1
lines changed

gcloud/dns/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from gcloud.dns.client import Client
2323
from gcloud.dns.connection import Connection
24+
from gcloud.dns.zone import ManagedZone
2425

2526

2627
SCOPE = Connection.SCOPE

gcloud/dns/client.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717

1818
from gcloud.client import JSONClient
1919
from gcloud.dns.connection import Connection
20+
from gcloud.dns.zone import ManagedZone
2021

2122

2223
class Client(JSONClient):
2324
"""Client to bundle configuration needed for API requests.
2425
2526
:type project: string
2627
:param project: the project which the client acts on behalf of. Will be
27-
passed when creating a dataset / job. If not passed,
28+
passed when creating a zone. If not passed,
2829
falls back to the default inferred from the environment.
2930
3031
:type credentials: :class:`oauth2client.client.OAuth2Credentials` or
@@ -56,3 +57,53 @@ def quotas(self):
5657
resp = self.connection.api_request(method='GET', path=path)
5758
return dict([(key, int(value))
5859
for key, value in resp['quota'].items()])
60+
61+
def list_zones(self, max_results=None, page_token=None):
62+
"""List zones for the project associated with this client.
63+
64+
See:
65+
https://cloud.google.com/dns/api/v1/managedZones/list
66+
67+
:type max_results: int
68+
:param max_results: maximum number of zones to return, If not
69+
passed, defaults to a value set by the API.
70+
71+
:type page_token: string
72+
:param page_token: opaque marker for the next "page" of zones. If
73+
not passed, the API will return the first page of
74+
zones.
75+
76+
:rtype: tuple, (list, str)
77+
:returns: list of :class:`gcloud.dns.zone.ManagedZone`, plus a
78+
"next page token" string: if the token is not None,
79+
indicates that more zones can be retrieved with another
80+
call (pass that value as ``page_token``).
81+
"""
82+
params = {}
83+
84+
if max_results is not None:
85+
params['maxResults'] = max_results
86+
87+
if page_token is not None:
88+
params['pageToken'] = page_token
89+
90+
path = '/projects/%s/managedZones' % (self.project,)
91+
resp = self.connection.api_request(method='GET', path=path,
92+
query_params=params)
93+
zones = [ManagedZone.from_api_repr(resource, self)
94+
for resource in resp['managedZones']]
95+
return zones, resp.get('nextPageToken')
96+
97+
def zone(self, name, dns_name):
98+
"""Construct a zone bound to this client.
99+
100+
:type name: string
101+
:param name: Name of the zone.
102+
103+
:type dns_name: string
104+
:param dns_name: DNS name of the zone.
105+
106+
:rtype: :class:`gcloud.dns.zone.ManagedZone`
107+
:returns: a new ``ManagedZone`` instance
108+
"""
109+
return ManagedZone(name, dns_name, client=self)

gcloud/dns/test_client.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,106 @@ def test_quotas_defaults(self):
6868
self.assertEqual(req['method'], 'GET')
6969
self.assertEqual(req['path'], '/%s' % PATH)
7070

71+
def test_list_zones_defaults(self):
72+
from gcloud.dns.zone import ManagedZone
73+
PROJECT = 'PROJECT'
74+
ID_1 = '123'
75+
ZONE_1 = 'zone_one'
76+
DNS_1 = 'one.example.com'
77+
ID_2 = '234'
78+
ZONE_2 = 'zone_two'
79+
DNS_2 = 'two.example.com'
80+
PATH = 'projects/%s/managedZones' % PROJECT
81+
TOKEN = 'TOKEN'
82+
DATA = {
83+
'nextPageToken': TOKEN,
84+
'managedZones': [
85+
{'kind': 'dns#managedZone',
86+
'id': ID_1,
87+
'name': ZONE_1,
88+
'dnsName': DNS_1},
89+
{'kind': 'dns#managedZone',
90+
'id': ID_2,
91+
'name': ZONE_2,
92+
'dnsName': DNS_2},
93+
]
94+
}
95+
creds = _Credentials()
96+
client = self._makeOne(PROJECT, creds)
97+
conn = client.connection = _Connection(DATA)
98+
99+
zones, token = client.list_zones()
100+
101+
self.assertEqual(len(zones), len(DATA['managedZones']))
102+
for found, expected in zip(zones, DATA['managedZones']):
103+
self.assertTrue(isinstance(found, ManagedZone))
104+
self.assertEqual(found.zone_id, expected['id'])
105+
self.assertEqual(found.name, expected['name'])
106+
self.assertEqual(found.dns_name, expected['dnsName'])
107+
self.assertEqual(token, TOKEN)
108+
109+
self.assertEqual(len(conn._requested), 1)
110+
req = conn._requested[0]
111+
self.assertEqual(req['method'], 'GET')
112+
self.assertEqual(req['path'], '/%s' % PATH)
113+
114+
def test_list_zones_explicit(self):
115+
from gcloud.dns.zone import ManagedZone
116+
PROJECT = 'PROJECT'
117+
ID_1 = '123'
118+
ZONE_1 = 'zone_one'
119+
DNS_1 = 'one.example.com'
120+
ID_2 = '234'
121+
ZONE_2 = 'zone_two'
122+
DNS_2 = 'two.example.com'
123+
PATH = 'projects/%s/managedZones' % PROJECT
124+
TOKEN = 'TOKEN'
125+
DATA = {
126+
'managedZones': [
127+
{'kind': 'dns#managedZone',
128+
'id': ID_1,
129+
'name': ZONE_1,
130+
'dnsName': DNS_1},
131+
{'kind': 'dns#managedZone',
132+
'id': ID_2,
133+
'name': ZONE_2,
134+
'dnsName': DNS_2},
135+
]
136+
}
137+
creds = _Credentials()
138+
client = self._makeOne(PROJECT, creds)
139+
conn = client.connection = _Connection(DATA)
140+
141+
zones, token = client.list_zones(max_results=3, page_token=TOKEN)
142+
143+
self.assertEqual(len(zones), len(DATA['managedZones']))
144+
for found, expected in zip(zones, DATA['managedZones']):
145+
self.assertTrue(isinstance(found, ManagedZone))
146+
self.assertEqual(found.zone_id, expected['id'])
147+
self.assertEqual(found.name, expected['name'])
148+
self.assertEqual(found.dns_name, expected['dnsName'])
149+
self.assertEqual(token, None)
150+
151+
self.assertEqual(len(conn._requested), 1)
152+
req = conn._requested[0]
153+
self.assertEqual(req['method'], 'GET')
154+
self.assertEqual(req['path'], '/%s' % PATH)
155+
self.assertEqual(req['query_params'],
156+
{'maxResults': 3, 'pageToken': TOKEN})
157+
158+
def test_zone(self):
159+
from gcloud.dns.zone import ManagedZone
160+
PROJECT = 'PROJECT'
161+
ZONE_NAME = 'zone-name'
162+
DNS_NAME = 'test.example.com'
163+
creds = _Credentials()
164+
client = self._makeOne(PROJECT, creds)
165+
dataset = client.zone(ZONE_NAME, DNS_NAME)
166+
self.assertTrue(isinstance(dataset, ManagedZone))
167+
self.assertEqual(dataset.name, ZONE_NAME)
168+
self.assertEqual(dataset.dns_name, DNS_NAME)
169+
self.assertTrue(dataset._client is client)
170+
71171

72172
class _Credentials(object):
73173

0 commit comments

Comments
 (0)