From c54904fa68fd1afb8d29e7942cac7e73af66732d Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Wed, 30 May 2018 13:28:55 -0700 Subject: [PATCH 1/2] Apply sub-zones before parents --- octodns/manager.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/octodns/manager.py b/octodns/manager.py index 027df54..6497ff2 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -65,6 +65,13 @@ class MainThreadExecutor(object): class Manager(object): log = logging.getLogger('Manager') + @classmethod + def _plan_keyer(cls, p): + try: + return len(p[1].changes[0].record.zone.name) + except (AttributeError, IndexError): + return 0 + def __init__(self, config_file, max_workers=None, include_meta=False): self.log.info('__init__: config_file=%s', config_file) @@ -288,6 +295,13 @@ class Manager(object): # plan pairs. plans = [p for f in futures for p in f.result()] + # Best effort sort plans children first so that we create/update + # children zones before parents which should allow us to more safely + # extract things into sub-zones. Combining a child back into a parent + # can't really be done all that safely in general so we'll optimize for + # this direction. + plans.sort(key=self._plan_keyer, reverse=True) + for output in self.plan_outputs.values(): output.run(plans=plans, log=self.log) From b4176382b53f7309a53632fa115bda3c73cc3c94 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Wed, 30 May 2018 13:35:19 -0700 Subject: [PATCH 2/2] Cleaner impl for _plan_keyer --- octodns/manager.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/octodns/manager.py b/octodns/manager.py index 6497ff2..c3fecf4 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -67,10 +67,8 @@ class Manager(object): @classmethod def _plan_keyer(cls, p): - try: - return len(p[1].changes[0].record.zone.name) - except (AttributeError, IndexError): - return 0 + plan = p[1] + return len(plan.changes[0].record.zone.name) if plan.changes else 0 def __init__(self, config_file, max_workers=None, include_meta=False): self.log.info('__init__: config_file=%s', config_file)