From 47de105a2924ac84507b8bfef26f7f5eb117d2cc Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Mon, 23 Aug 2021 12:26:09 -0700 Subject: [PATCH 1/3] POC supports & dynamic checking in _process_desired_zone --- octodns/provider/base.py | 20 ++++++++--- tests/helpers.py | 2 +- tests/test_octodns_provider_base.py | 53 +++++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/octodns/provider/base.py b/octodns/provider/base.py index b636d65..da33aaa 100644 --- a/octodns/provider/base.py +++ b/octodns/provider/base.py @@ -50,12 +50,24 @@ class BaseProvider(BaseSource): that are made to have them logged or throw errors depending on the provider configuration. ''' - if self.SUPPORTS_MUTLIVALUE_PTR: - # nothing do here - return desired for record in desired.records: - if record._type == 'PTR' and len(record.values) > 1: + if record._type not in self.SUPPORTS: + msg = '{} records not supported for {}'.format(record._type, + record.fqdn) + fallback = 'omitting record' + self.supports_warn_or_except(msg, fallback) + desired.remove_record(record) + elif getattr(record, 'dynamic', False) and not self.SUPPORTS_DYNAMIC: + msg = 'dynamic records not supported for {}'\ + .format(record.fqdn) + fallback = 'falling back to simple record' + self.supports_warn_or_except(msg, fallback) + record = record.copy() + record.dynamic = None + desired.add_record(record, replace=True) + elif record._type == 'PTR' and len(record.values) > 1 and \ + not self.SUPPORTS_MUTLIVALUE_PTR: # replace with a single-value copy msg = 'multi-value PTR records not supported for {}' \ .format(record.fqdn) diff --git a/tests/helpers.py b/tests/helpers.py index eedfd8b..17b0115 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -107,7 +107,7 @@ class PlannableProvider(BaseProvider): SUPPORTS_GEO = False SUPPORTS_DYNAMIC = False - SUPPORTS = set(('A',)) + SUPPORTS = set(('A', 'AAAA', 'TXT')) def __init__(self, *args, **kwargs): super(PlannableProvider, self).__init__(*args, **kwargs) diff --git a/tests/test_octodns_provider_base.py b/tests/test_octodns_provider_base.py index cee7c2c..47cc3b9 100644 --- a/tests/test_octodns_provider_base.py +++ b/tests/test_octodns_provider_base.py @@ -21,7 +21,10 @@ from octodns.zone import Zone class HelperProvider(BaseProvider): log = getLogger('HelperProvider') - SUPPORTS = set(('A',)) + SUPPORTS = set(('A', 'PTR')) + SUPPORTS_MUTLIVALUE_PTR = False + SUPPORTS_DYNAMIC = False + id = 'test' strict_supports = False @@ -234,6 +237,10 @@ class TestBaseProvider(TestCase): self.assertFalse(plan) def test_process_desired_zone(self): + provider = HelperProvider('test') + + # SUPPORTS_MUTLIVALUE_PTR + provider.SUPPORTS_MUTLIVALUE_PTR = False zone1 = Zone('unit.tests.', []) record1 = Record.new(zone1, 'ptr', { 'type': 'PTR', @@ -242,11 +249,51 @@ class TestBaseProvider(TestCase): }) zone1.add_record(record1) - zone2 = HelperProvider('hasptr')._process_desired_zone(zone1) + zone2 = provider._process_desired_zone(zone1.copy()) record2 = list(zone2.records)[0] - self.assertEqual(len(record2.values), 1) + provider.SUPPORTS_MUTLIVALUE_PTR = True + zone2 = provider._process_desired_zone(zone1.copy()) + record2 = list(zone2.records)[0] + from pprint import pprint + pprint([ + record1, record2 + ]) + self.assertEqual(len(record2.values), 2) + + # SUPPORTS_DYNAMIC + provider.SUPPORTS_DYNAMIC = False + zone1 = Zone('unit.tests.', []) + record1 = Record.new(zone1, 'a', { + 'dynamic': { + 'pools': { + 'one': { + 'values': [{ + 'value': '1.1.1.1', + }], + }, + }, + 'rules': [{ + 'pool': 'one', + }], + }, + 'type': 'A', + 'ttl': 3600, + 'values': ['2.2.2.2'], + }) + self.assertTrue(record1.dynamic) + zone1.add_record(record1) + + zone2 = provider._process_desired_zone(zone1.copy()) + record2 = list(zone2.records)[0] + self.assertFalse(record2.dynamic) + + provider.SUPPORTS_DYNAMIC = True + zone2 = provider._process_desired_zone(zone1.copy()) + record2 = list(zone2.records)[0] + self.assertTrue(record2.dynamic) + def test_safe_none(self): # No changes is safe Plan(None, None, [], True).raise_if_unsafe() From c6e8ee48f53b2accd0688209475450d818e893f4 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Tue, 7 Sep 2021 13:24:29 -0700 Subject: [PATCH 2/3] quell lint indention alignment warnings --- octodns/provider/base.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/octodns/provider/base.py b/octodns/provider/base.py index da33aaa..e0c0db2 100644 --- a/octodns/provider/base.py +++ b/octodns/provider/base.py @@ -58,7 +58,8 @@ class BaseProvider(BaseSource): fallback = 'omitting record' self.supports_warn_or_except(msg, fallback) desired.remove_record(record) - elif getattr(record, 'dynamic', False) and not self.SUPPORTS_DYNAMIC: + elif getattr(record, 'dynamic', False) and \ + not self.SUPPORTS_DYNAMIC: msg = 'dynamic records not supported for {}'\ .format(record.fqdn) fallback = 'falling back to simple record' @@ -67,7 +68,7 @@ class BaseProvider(BaseSource): record.dynamic = None desired.add_record(record, replace=True) elif record._type == 'PTR' and len(record.values) > 1 and \ - not self.SUPPORTS_MUTLIVALUE_PTR: + not self.SUPPORTS_MUTLIVALUE_PTR: # replace with a single-value copy msg = 'multi-value PTR records not supported for {}' \ .format(record.fqdn) From bc6c874cc7322fd2c97d765dd75c00443afdae0c Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Tue, 7 Sep 2021 13:24:41 -0700 Subject: [PATCH 3/3] transip no longer needs to check supports --- octodns/provider/transip.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/octodns/provider/transip.py b/octodns/provider/transip.py index d3e2018..176da88 100644 --- a/octodns/provider/transip.py +++ b/octodns/provider/transip.py @@ -145,16 +145,14 @@ class TransipProvider(BaseProvider): _dns_entries = [] for record in plan.desired.records: - if record._type in self.SUPPORTS: - entries_for = getattr(self, - '_entries_for_{}'.format(record._type)) + entries_for = getattr(self, '_entries_for_{}'.format(record._type)) - # Root records have '@' as name - name = record.name - if name == '': - name = self.ROOT_RECORD + # Root records have '@' as name + name = record.name + if name == '': + name = self.ROOT_RECORD - _dns_entries.extend(entries_for(name, record)) + _dns_entries.extend(entries_for(name, record)) try: self._client.set_dns_entries(plan.desired.name[:-1], _dns_entries)