1
0
mirror of https://github.com/github/octodns.git synced 2024-05-11 05:55:00 +00:00

Sketch out an option for dynamic zone config

This commit is contained in:
Ross McFarland
2023-07-21 13:26:29 -07:00
parent 49aca9db10
commit da5b7d0d1e
3 changed files with 68 additions and 24 deletions

View File

@@ -466,6 +466,36 @@ class Manager(object):
# Return the zone as it's the desired state
return plans, zone
def _get_sources(self, decoded_zone_name, config, eligible_sources):
try:
sources = config['sources']
except KeyError:
raise ManagerException(
f'Zone {decoded_zone_name} is missing sources'
)
if eligible_sources and not [
s for s in sources if s in eligible_sources
]:
return None
self.log.info('sync: sources=%s', sources)
try:
# rather than using a list comprehension, we break this loop
# out so that the `except` block below can reference the
# `source`
collected = []
for source in sources:
collected.append(self.providers[source])
sources = collected
except KeyError:
raise ManagerException(
f'Zone {decoded_zone_name}, unknown ' f'source: {source}'
)
return sources
def sync(
self,
eligible_zones=[],
@@ -486,6 +516,31 @@ class Manager(object):
)
zones = self.config['zones']
for name, config in list(zones.items()):
if not name.startswith('*'):
continue
# we've found a dynamic config element
# find its sources
sources = self._get_sources(name, config, eligible_sources)
self.log.info('sync: dynamic zone=%s, sources=%s', name, sources)
for source in sources:
for zone_name in source.list_zones():
if zone_name in zones:
self.log.info(
'sync: zone=%s already in config, ignoring',
zone_name,
)
continue
self.log.info(
'sync: adding dynamic zone=%s', zone_name
)
zones[zone_name] = config
# remove the dynamic config element so we don't try and populate it
del zones[name]
if eligible_zones:
zones = IdnaDict({n: zones.get(n) for n in eligible_zones})
@@ -532,12 +587,10 @@ class Manager(object):
continue
lenient = config.get('lenient', False)
try:
sources = config['sources']
except KeyError:
raise ManagerException(
f'Zone {decoded_zone_name} is missing sources'
)
sources = self._get_sources(
decoded_zone_name, config, eligible_sources
)
try:
targets = config['targets']
@@ -548,9 +601,7 @@ class Manager(object):
processors = config.get('processors', [])
if eligible_sources and not [
s for s in sources if s in eligible_sources
]:
if not sources:
self.log.info('sync: no eligible sources, skipping')
continue
@@ -564,7 +615,7 @@ class Manager(object):
self.log.info('sync: no eligible targets, skipping')
continue
self.log.info('sync: sources=%s -> targets=%s', sources, targets)
self.log.info('sync: targets=%s', targets)
try:
collected = []
@@ -577,19 +628,6 @@ class Manager(object):
f'processor: {processor}'
)
try:
# rather than using a list comprehension, we break this loop
# out so that the `except` block below can reference the
# `source`
collected = []
for source in sources:
collected.append(self.providers[source])
sources = collected
except KeyError:
raise ManagerException(
f'Zone {decoded_zone_name}, unknown ' f'source: {source}'
)
try:
trgs = []
for target in targets: