From bec8c086da738d86ee0ab0ffd3bc483c6abc12b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20H=C3=BCgli?= Date: Tue, 10 Dec 2019 15:33:41 +0100 Subject: [PATCH 1/5] add new value delegation_set_id to aws provider --- octodns/provider/route53.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/octodns/provider/route53.py b/octodns/provider/route53.py index 66da6b5..e4e4b50 100644 --- a/octodns/provider/route53.py +++ b/octodns/provider/route53.py @@ -618,8 +618,9 @@ class Route53Provider(BaseProvider): def __init__(self, id, access_key_id=None, secret_access_key=None, max_changes=1000, client_max_attempts=None, - session_token=None, *args, **kwargs): + session_token=None, delegation_set_id=None, *args, **kwargs): self.max_changes = max_changes + self.delegation_set_id = delegation_set_id _msg = 'access_key_id={}, secret_access_key=***, ' \ 'session_token=***'.format(access_key_id) use_fallback_auth = access_key_id is None and \ @@ -676,7 +677,12 @@ class Route53Provider(BaseProvider): ref = uuid4().hex self.log.debug('_get_zone_id: no matching zone, creating, ' 'ref=%s', ref) + if self.delegation_set_id: resp = self._conn.create_hosted_zone(Name=name, + CallerReference=ref, + DelegationSetId=self.delegation_set_id) + else: + resp = self._conn.create_hosted_zone(Name=name, CallerReference=ref) self.r53_zones[name] = id = resp['HostedZone']['Id'] return id From 65922bbe5cd29702ea7a927e058372079474c00f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20H=C3=BCgli?= Date: Tue, 10 Dec 2019 15:45:16 +0100 Subject: [PATCH 2/5] fix lint --- octodns/provider/route53.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/octodns/provider/route53.py b/octodns/provider/route53.py index e4e4b50..9677ff0 100644 --- a/octodns/provider/route53.py +++ b/octodns/provider/route53.py @@ -678,9 +678,11 @@ class Route53Provider(BaseProvider): self.log.debug('_get_zone_id: no matching zone, creating, ' 'ref=%s', ref) if self.delegation_set_id: - resp = self._conn.create_hosted_zone(Name=name, + resp = self._conn.create_hosted_zone( + Name=name, CallerReference=ref, - DelegationSetId=self.delegation_set_id) + DelegationSetId=self.delegation_set_id + ) else: resp = self._conn.create_hosted_zone(Name=name, CallerReference=ref) From fcf32e2d445e39c1963e4d63a1023f62fca53d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20H=C3=BCgli?= Date: Tue, 10 Dec 2019 16:00:03 +0100 Subject: [PATCH 3/5] final fix lint --- octodns/provider/route53.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/octodns/provider/route53.py b/octodns/provider/route53.py index 9677ff0..3d658d0 100644 --- a/octodns/provider/route53.py +++ b/octodns/provider/route53.py @@ -675,17 +675,16 @@ class Route53Provider(BaseProvider): return id if create: ref = uuid4().hex + del_set = self.delegation_set_id self.log.debug('_get_zone_id: no matching zone, creating, ' 'ref=%s', ref) if self.delegation_set_id: - resp = self._conn.create_hosted_zone( - Name=name, + resp = self._conn.create_hosted_zone(Name=name, CallerReference=ref, - DelegationSetId=self.delegation_set_id - ) + DelegationSetId=del_set) else: resp = self._conn.create_hosted_zone(Name=name, - CallerReference=ref) + CallerReference=ref) self.r53_zones[name] = id = resp['HostedZone']['Id'] return id return None From b9d0586c7f5043e8fd922a5b408518ccdcfbdf4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20H=C3=BCgli?= Date: Tue, 10 Dec 2019 17:03:31 +0100 Subject: [PATCH 4/5] Update octodns/provider/route53.py Co-Authored-By: Ross McFarland --- octodns/provider/route53.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/octodns/provider/route53.py b/octodns/provider/route53.py index 3d658d0..89fb7a8 100644 --- a/octodns/provider/route53.py +++ b/octodns/provider/route53.py @@ -678,7 +678,7 @@ class Route53Provider(BaseProvider): del_set = self.delegation_set_id self.log.debug('_get_zone_id: no matching zone, creating, ' 'ref=%s', ref) - if self.delegation_set_id: + if del_set: resp = self._conn.create_hosted_zone(Name=name, CallerReference=ref, DelegationSetId=del_set) From b57f2a64ad4089313073d68f1863b9a8bcf0bb55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20H=C3=BCgli?= Date: Fri, 20 Dec 2019 17:19:40 +0100 Subject: [PATCH 5/5] create/copy test with delegation set support --- tests/test_octodns_provider_route53.py | 96 ++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/tests/test_octodns_provider_route53.py b/tests/test_octodns_provider_route53.py index 7691804..b7e075d 100644 --- a/tests/test_octodns_provider_route53.py +++ b/tests/test_octodns_provider_route53.py @@ -370,6 +370,16 @@ class TestRoute53Provider(TestCase): return (provider, stubber) + def _get_stubbed_delegation_set_provider(self): + provider = Route53Provider('test', 'abc', '123', + delegation_set_id="ABCDEFG123456") + + # Use the stubber + stubber = Stubber(provider._conn) + stubber.activate() + + return (provider, stubber) + def _get_stubbed_fallback_auth_provider(self): provider = Route53Provider('test') @@ -913,6 +923,92 @@ class TestRoute53Provider(TestCase): self.assertEquals(9, provider.apply(plan)) stubber.assert_no_pending_responses() + def test_sync_create_with_delegation_set(self): + provider, stubber = self._get_stubbed_delegation_set_provider() + + got = Zone('unit.tests.', []) + + list_hosted_zones_resp = { + 'HostedZones': [], + 'Marker': 'm', + 'IsTruncated': False, + 'MaxItems': '100', + } + stubber.add_response('list_hosted_zones', list_hosted_zones_resp, + {}) + + plan = provider.plan(self.expected) + self.assertEquals(9, len(plan.changes)) + self.assertFalse(plan.exists) + for change in plan.changes: + self.assertIsInstance(change, Create) + stubber.assert_no_pending_responses() + + create_hosted_zone_resp = { + 'HostedZone': { + 'Name': 'unit.tests.', + 'Id': 'z42', + 'CallerReference': 'abc', + }, + 'ChangeInfo': { + 'Id': 'a12', + 'Status': 'PENDING', + 'SubmittedAt': '2017-01-29T01:02:03Z', + 'Comment': 'hrm', + }, + 'DelegationSet': { + 'Id': 'b23', + 'CallerReference': 'blip', + 'NameServers': [ + 'n12.unit.tests.', + ], + }, + 'Location': 'us-east-1', + } + stubber.add_response('create_hosted_zone', + create_hosted_zone_resp, { + 'Name': got.name, + 'CallerReference': ANY, + 'DelegationSetId': 'ABCDEFG123456' + }) + + list_resource_record_sets_resp = { + 'ResourceRecordSets': [{ + 'Name': 'a.unit.tests.', + 'Type': 'A', + 'GeoLocation': { + 'ContinentCode': 'NA', + }, + 'ResourceRecords': [{ + 'Value': '2.2.3.4', + }], + 'TTL': 61, + }], + 'IsTruncated': False, + 'MaxItems': '100', + } + stubber.add_response('list_resource_record_sets', + list_resource_record_sets_resp, + {'HostedZoneId': 'z42'}) + + stubber.add_response('list_health_checks', + { + 'HealthChecks': self.health_checks, + 'IsTruncated': False, + 'MaxItems': '100', + 'Marker': '', + }) + + stubber.add_response('change_resource_record_sets', + {'ChangeInfo': { + 'Id': 'id', + 'Status': 'PENDING', + 'SubmittedAt': '2017-01-29T01:02:03Z', + }}, {'HostedZoneId': 'z42', 'ChangeBatch': ANY}) + + self.assertEquals(9, provider.apply(plan)) + stubber.assert_no_pending_responses() + def test_health_checks_pagination(self): provider, stubber = self._get_stubbed_provider()