From 2e6ddc5dc5b770f8cae6d5fc6ef58a8b41da5c5c Mon Sep 17 00:00:00 2001 From: Eric Johnson Date: Thu, 8 May 2014 19:35:19 +0000 Subject: [PATCH 1/5] [LIBCLOUD-551] Fix Google DNS to use valid record split character --- libcloud/dns/drivers/google.py | 2 +- libcloud/test/dns/test_google.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libcloud/dns/drivers/google.py b/libcloud/dns/drivers/google.py index aabc783098..e6f3105106 100644 --- a/libcloud/dns/drivers/google.py +++ b/libcloud/dns/drivers/google.py @@ -124,7 +124,7 @@ def get_record(self, zone_id, record_id): :rtype: :class:`Record` """ - (record_name, record_type) = record_id.split('-') + (record_type, record_name) = record_id.split(':', 1) params = { 'name': record_name, diff --git a/libcloud/test/dns/test_google.py b/libcloud/test/dns/test_google.py index 2a4b8c7d34..bda5aeeddd 100644 --- a/libcloud/test/dns/test_google.py +++ b/libcloud/test/dns/test_google.py @@ -74,7 +74,7 @@ def test_get_zone_does_not_exist(self): def test_get_record(self): GoogleDNSMockHttp.type = 'FILTER_ZONES' zone = self.driver.list_zones()[0] - record = self.driver.get_record(zone.id, "foo.example.com.-A") + record = self.driver.get_record(zone.id, "A:foo.example.com.") self.assertEqual(record.name, 'foo.example.com.') self.assertEqual(record.type, 'A') @@ -82,7 +82,7 @@ def test_get_record_zone_does_not_exist(self): GoogleDNSMockHttp.type = 'ZONE_DOES_NOT_EXIST' try: - self.driver.get_record(2, 'a-a') + self.driver.get_record(2, 'a:a') except ZoneDoesNotExistError: e = sys.exc_info()[1] self.assertEqual(e.zone_id, 2) @@ -92,10 +92,10 @@ def test_get_record_zone_does_not_exist(self): def test_get_record_record_does_not_exist(self): GoogleDNSMockHttp.type = 'RECORD_DOES_NOT_EXIST' try: - self.driver.get_record(1, "foo-A") + self.driver.get_record(1, "A:foo") except RecordDoesNotExistError: e = sys.exc_info()[1] - self.assertEqual(e.record_id, 'foo-A') + self.assertEqual(e.record_id, 'A:foo') else: self.fail('Exception not thrown') From 4a055ecf54784aa1d117feb17c0019bb4e759b74 Mon Sep 17 00:00:00 2001 From: Eric Johnson Date: Thu, 8 May 2014 20:46:51 +0000 Subject: [PATCH 2/5] found another spot to fix --- libcloud/dns/drivers/google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcloud/dns/drivers/google.py b/libcloud/dns/drivers/google.py index e6f3105106..36ccd2a166 100644 --- a/libcloud/dns/drivers/google.py +++ b/libcloud/dns/drivers/google.py @@ -330,7 +330,7 @@ def _to_records(self, response, zone): return records def _to_record(self, r, zone): - record_id = '%s-%s' % (r['name'], r['type']) + record_id = '%s:%s' % (r['type'], r['name']) return Record(id=record_id, name=r['name'], type=r['type'], data=r, zone=zone, driver=self, extra={}) From 3377561a30d0b11d14f61bfe270a8c75103e6e88 Mon Sep 17 00:00:00 2001 From: Eric Johnson Date: Thu, 8 May 2014 21:56:10 +0000 Subject: [PATCH 3/5] one last little fix --- libcloud/dns/drivers/google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcloud/dns/drivers/google.py b/libcloud/dns/drivers/google.py index 36ccd2a166..8181246da8 100644 --- a/libcloud/dns/drivers/google.py +++ b/libcloud/dns/drivers/google.py @@ -260,7 +260,7 @@ def delete_record(self, record): } ] } - request = '/managedZones/%s/changes' % (record.zone.id) + request = '/managedZones/%s/changes' % (record.zone) response = self.connection.request(request, method='POST', data=data) return response.success() From e522c8967e987ec9514807a670ec06c842cda4ed Mon Sep 17 00:00:00 2001 From: Eric Johnson Date: Fri, 9 May 2014 16:06:17 +0000 Subject: [PATCH 4/5] update Zone to match model and use name as id --- libcloud/dns/drivers/google.py | 8 ++-- .../google/get_zone_does_not_exists.json | 4 +- libcloud/test/dns/fixtures/google/zone.json | 1 + libcloud/test/dns/test_google.py | 39 +++++++++++-------- 4 files changed, 31 insertions(+), 21 deletions(-) create mode 100644 libcloud/test/dns/fixtures/google/zone.json diff --git a/libcloud/dns/drivers/google.py b/libcloud/dns/drivers/google.py index 8181246da8..44a1231db5 100644 --- a/libcloud/dns/drivers/google.py +++ b/libcloud/dns/drivers/google.py @@ -142,7 +142,8 @@ def get_record(self, zone_id, record_id): zone_id=zone_id) if len(response['rrsets']) > 0: - return self._to_record(response['rrsets'][0], zone_id) + zone = self.get_zone(zone_id) + return self._to_record(response['rrsets'][0], zone) raise RecordDoesNotExistError(value='', driver=self.connection.driver, record_id=record_id) @@ -260,7 +261,7 @@ def delete_record(self, record): } ] } - request = '/managedZones/%s/changes' % (record.zone) + request = '/managedZones/%s/changes' % (record.zone.id) response = self.connection.request(request, method='POST', data=data) return response.success() @@ -319,8 +320,9 @@ def _to_zone(self, r): extra['creationTime'] = r.get('creationTime') extra['nameServers'] = r.get('nameServers') + extra['id'] = r.get('id') - return Zone(id=r['id'], domain=r['dnsName'], + return Zone(id=r['name'], domain=r['dnsName'], type='master', ttl=0, driver=self, extra=extra) def _to_records(self, response, zone): diff --git a/libcloud/test/dns/fixtures/google/get_zone_does_not_exists.json b/libcloud/test/dns/fixtures/google/get_zone_does_not_exists.json index ddd959d4bc..a38eb6aac1 100644 --- a/libcloud/test/dns/fixtures/google/get_zone_does_not_exists.json +++ b/libcloud/test/dns/fixtures/google/get_zone_does_not_exists.json @@ -4,10 +4,10 @@ { "domain": "global", "reason": "notFound", - "message": "The 'parameters.managedZone' resource named '2' does not exist." + "message": "The 'parameters.managedZone' resource named 'example-com' does not exist." } ], "code": 404, - "message": "The 'parameters.managedZone' resource named '2' does not exist." + "message": "The 'parameters.managedZone' resource named 'example-com' does not exist." } } diff --git a/libcloud/test/dns/fixtures/google/zone.json b/libcloud/test/dns/fixtures/google/zone.json new file mode 100644 index 0000000000..a380c6ee38 --- /dev/null +++ b/libcloud/test/dns/fixtures/google/zone.json @@ -0,0 +1 @@ +{"kind": "dns#managedZone", "name": "example-com", "nameServers": ["ns-cloud-e1.googledomains.com.", "ns-cloud-e2.googledomains.com.", "ns-cloud-e3.googledomains.com.", "ns-cloud-e4.googledomains.com."], "creationTime": "2014-03-29T22:45:47.618Z", "dnsName": "example.com.", "id": "1", "description": ""} diff --git a/libcloud/test/dns/test_google.py b/libcloud/test/dns/test_google.py index bda5aeeddd..6e0ccdfd11 100644 --- a/libcloud/test/dns/test_google.py +++ b/libcloud/test/dns/test_google.py @@ -56,18 +56,18 @@ def test_list_records(self): self.assertEqual(len(records), 3) def test_get_zone(self): - zone = self.driver.get_zone(1) - self.assertEqual(zone.id, '1') + zone = self.driver.get_zone('example-com') + self.assertEqual(zone.id, 'example-com') self.assertEqual(zone.domain, 'example.com.') def test_get_zone_does_not_exist(self): GoogleDNSMockHttp.type = 'ZONE_DOES_NOT_EXIST' try: - self.driver.get_zone(2) + self.driver.get_zone('example-com') except ZoneDoesNotExistError: e = sys.exc_info()[1] - self.assertEqual(e.zone_id, 2) + self.assertEqual(e.zone_id, 'example-com') else: self.fail('Exception not thrown') @@ -75,24 +75,26 @@ def test_get_record(self): GoogleDNSMockHttp.type = 'FILTER_ZONES' zone = self.driver.list_zones()[0] record = self.driver.get_record(zone.id, "A:foo.example.com.") + self.assertEqual(record.id, 'A:foo.example.com.') self.assertEqual(record.name, 'foo.example.com.') self.assertEqual(record.type, 'A') + self.assertEqual(record.zone.id, 'example-com') def test_get_record_zone_does_not_exist(self): GoogleDNSMockHttp.type = 'ZONE_DOES_NOT_EXIST' try: - self.driver.get_record(2, 'a:a') + self.driver.get_record('example-com', 'a:a') except ZoneDoesNotExistError: e = sys.exc_info()[1] - self.assertEqual(e.zone_id, 2) + self.assertEqual(e.zone_id, 'example-com') else: self.fail('Exception not thrown') def test_get_record_record_does_not_exist(self): GoogleDNSMockHttp.type = 'RECORD_DOES_NOT_EXIST' try: - self.driver.get_record(1, "A:foo") + self.driver.get_record('example-com', "A:foo") except RecordDoesNotExistError: e = sys.exc_info()[1] self.assertEqual(e.record_id, 'A:foo') @@ -107,7 +109,7 @@ def test_create_zone(self): self.assertEqual(len(zone.extra['nameServers']), 4) def test_delete_zone(self): - zone = self.driver.get_zone(1) + zone = self.driver.get_zone('example-com') res = self.driver.delete_zone(zone) self.assertTrue(res) @@ -128,17 +130,17 @@ def _dns_v1beta1_projects_project_name_managedZones_FILTER_ZONES( body = self.fixtures.load('zone_list.json') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - def _dns_v1beta1_projects_project_name_managedZones_1_rrsets_FILTER_ZONES( + def _dns_v1beta1_projects_project_name_managedZones_example_com_rrsets_FILTER_ZONES( self, method, url, body, headers): body = self.fixtures.load('record.json') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - def _dns_v1beta1_projects_project_name_managedZones_1_rrsets( + def _dns_v1beta1_projects_project_name_managedZones_example_com_rrsets( self, method, url, body, headers): body = self.fixtures.load('records_list.json') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - def _dns_v1beta1_projects_project_name_managedZones_1(self, method, + def _dns_v1beta1_projects_project_name_managedZones_example_com(self, method, url, body, headers): if method == 'GET': @@ -147,33 +149,38 @@ def _dns_v1beta1_projects_project_name_managedZones_1(self, method, body = None return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - def _dns_v1beta1_projects_project_name_managedZones_2_ZONE_DOES_NOT_EXIST( + def _dns_v1beta1_projects_project_name_managedZones_example_com_ZONE_DOES_NOT_EXIST( self, method, url, body, headers): body = self.fixtures.load('get_zone_does_not_exists.json') return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.NOT_FOUND]) - def _dns_v1beta1_projects_project_name_managedZones_3_ZONE_DOES_NOT_EXIST( + def _dns_v1beta1_projects_project_name_managedZones_example_com_ZONE_DOES_NOT_EXIST( self, method, url, body, headers): body = self.fixtures.load('get_zone_does_not_exists.json') return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.NOT_FOUND]) - def _dns_v1beta1_projects_project_name_managedZones_1_RECORD_DOES_NOT_EXIST( + def _dns_v1beta1_projects_project_name_managedZones_example_com_RECORD_DOES_NOT_EXIST( self, method, url, body, headers): body = self.fixtures.load('managed_zones_1.json') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - def _dns_v1beta1_projects_project_name_managedZones_1_rrsets_RECORD_DOES_NOT_EXIST( + def _dns_v1beta1_projects_project_name_managedZones_example_com_rrsets_RECORD_DOES_NOT_EXIST( self, method, url, body, headers): body = self.fixtures.load('no_record.json') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - def _dns_v1beta1_projects_project_name_managedZones_2_rrsets_ZONE_DOES_NOT_EXIST( + def _dns_v1beta1_projects_project_name_managedZones_example_com_rrsets_ZONE_DOES_NOT_EXIST( self, method, url, body, headers): body = self.fixtures.load('get_zone_does_not_exists.json') return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.NOT_FOUND]) + def _dns_v1beta1_projects_project_name_managedZones_example_com_FILTER_ZONES( + self, method, url, body, headers): + body = self.fixtures.load('zone.json') + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + if __name__ == '__main__': sys.exit(unittest.main()) From 6afaef123a00d8a1e44dc8c4e36f6f3847bc75f2 Mon Sep 17 00:00:00 2001 From: Eric Johnson Date: Fri, 9 May 2014 16:22:32 +0000 Subject: [PATCH 5/5] fix tox errors reported by travis --- libcloud/test/dns/test_google.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/libcloud/test/dns/test_google.py b/libcloud/test/dns/test_google.py index 6e0ccdfd11..e6d0595bac 100644 --- a/libcloud/test/dns/test_google.py +++ b/libcloud/test/dns/test_google.py @@ -140,9 +140,8 @@ def _dns_v1beta1_projects_project_name_managedZones_example_com_rrsets( body = self.fixtures.load('records_list.json') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - def _dns_v1beta1_projects_project_name_managedZones_example_com(self, method, - url, body, - headers): + def _dns_v1beta1_projects_project_name_managedZones_example_com( + self, method, url, body, headers): if method == 'GET': body = self.fixtures.load('managed_zones_1.json') elif method == 'DELETE': @@ -155,12 +154,6 @@ def _dns_v1beta1_projects_project_name_managedZones_example_com_ZONE_DOES_NOT_EX return (httplib.NOT_FOUND, body, {}, httplib.responses[httplib.NOT_FOUND]) - def _dns_v1beta1_projects_project_name_managedZones_example_com_ZONE_DOES_NOT_EXIST( - self, method, url, body, headers): - body = self.fixtures.load('get_zone_does_not_exists.json') - return (httplib.NOT_FOUND, body, {}, - httplib.responses[httplib.NOT_FOUND]) - def _dns_v1beta1_projects_project_name_managedZones_example_com_RECORD_DOES_NOT_EXIST( self, method, url, body, headers): body = self.fixtures.load('managed_zones_1.json')