From 5e4d68094fe3e782540e623ab6fd303c37be5c19 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 24 Jun 2017 17:14:48 -0700 Subject: [PATCH] Add meta record support with provider id to zone Support replace=True in zone.add_record --- octodns/manager.py | 14 +++++++++++++- octodns/zone.py | 7 ++++++- tests/test_octodns_manager.py | 6 ++++++ tests/test_octodns_zone.py | 6 ++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/octodns/manager.py b/octodns/manager.py index 07719dd..e6fe253 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -13,6 +13,7 @@ import logging from .provider.base import BaseProvider from .provider.yaml import YamlProvider +from .record import Record from .yaml import safe_load from .zone import Zone @@ -59,7 +60,7 @@ class MainThreadExecutor(object): class Manager(object): log = logging.getLogger('Manager') - def __init__(self, config_file, max_workers=None): + def __init__(self, config_file, max_workers=None, include_meta=False): self.log.info('__init__: config_file=%s', config_file) # Read our config file @@ -75,6 +76,10 @@ class Manager(object): else: self._executor = MainThreadExecutor() + self.include_meta = include_meta or manager_config.get('include_meta', + False) + self.log.info('__init__: max_workers=%s', self.include_meta) + self.log.debug('__init__: configuring providers') self.providers = {} for provider_name, provider_config in self.config['providers'].items(): @@ -176,6 +181,13 @@ class Manager(object): plans = [] for target in targets: + if self.include_meta: + meta = Record.new(zone, 'octodns-meta', { + 'type': 'TXT', + 'ttl': 60, + 'value': 'provider={}'.format(target.id) + }) + zone.add_record(meta, replace=True) plan = target.plan(zone) if plan: plans.append((target, plan)) diff --git a/octodns/zone.py b/octodns/zone.py index 03bc41c..9d405bb 100644 --- a/octodns/zone.py +++ b/octodns/zone.py @@ -49,9 +49,13 @@ class Zone(object): def hostname_from_fqdn(self, fqdn): return self._name_re.sub('', fqdn) - def add_record(self, record): + def add_record(self, record, replace=False): name = record.name last = name.split('.')[-1] + + if replace and record in self.records: + self.records.remove(record) + if last in self.sub_zones: if name != last: # it's a record for something under a sub-zone @@ -63,6 +67,7 @@ class Zone(object): raise SubzoneRecordException('Record {} a managed sub-zone ' 'and not of type NS' .format(record.fqdn)) + # TODO: this is pretty inefficent for existing in self.records: if record == existing: raise DuplicateRecordException('Duplicate record {}, type {}' diff --git a/tests/test_octodns_manager.py b/tests/test_octodns_manager.py index 641c1ff..45a3b55 100644 --- a/tests/test_octodns_manager.py +++ b/tests/test_octodns_manager.py @@ -128,6 +128,12 @@ class TestManager(TestCase): .sync(dry_run=False, force=True) self.assertEquals(19, tc) + # Include meta + tc = Manager(get_config_filename('simple.yaml'), max_workers=1, + include_meta=True) \ + .sync(dry_run=False, force=True) + self.assertEquals(23, tc) + def test_eligible_targets(self): with TemporaryDirectory() as tmpdir: environ['YAML_TMP_DIR'] = tmpdir.dirname diff --git a/tests/test_octodns_zone.py b/tests/test_octodns_zone.py index a4d7300..f310397 100644 --- a/tests/test_octodns_zone.py +++ b/tests/test_octodns_zone.py @@ -39,6 +39,7 @@ class TestZone(TestCase): a = ARecord(zone, 'a', {'ttl': 42, 'value': '1.1.1.1'}) b = ARecord(zone, 'b', {'ttl': 42, 'value': '1.1.1.1'}) + c = ARecord(zone, 'a', {'ttl': 43, 'value': '2.2.2.2'}) zone.add_record(a) self.assertEquals(zone.records, set([a])) @@ -48,6 +49,11 @@ class TestZone(TestCase): self.assertEquals('Duplicate record a.unit.tests., type A', ctx.exception.message) self.assertEquals(zone.records, set([a])) + + # can add duplicate with replace=True + zone.add_record(c, replace=True) + self.assertEquals('2.2.2.2', list(zone.records)[0].values[0]) + # Can add dup name, with different type zone.add_record(b) self.assertEquals(zone.records, set([a, b]))