From 81563a2ae5c469f66815bd06b187b1521e49b247 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 11 Oct 2025 15:17:31 -0700 Subject: [PATCH] move Manager.dump's sources and Manager.sync's eligible_sources to Manager(active_sources) --- octodns/cmds/dump.py | 3 +- octodns/cmds/sync.py | 3 +- octodns/manager.py | 30 ++++++------- tests/test_octodns_manager.py | 83 ++++++++++++++--------------------- 4 files changed, 49 insertions(+), 70 deletions(-) diff --git a/octodns/cmds/dump.py b/octodns/cmds/dump.py index 1c788fd..dcae5c8 100755 --- a/octodns/cmds/dump.py +++ b/octodns/cmds/dump.py @@ -47,14 +47,13 @@ def main(): args = parser.parse_args() - manager = Manager(args.config_file) + manager = Manager(args.config_file, active_sources=args.source) manager.dump( zone=args.zone, output_dir=args.output_dir, output_provider=args.output_provider, lenient=args.lenient, split=args.split, - sources=args.source, ) diff --git a/octodns/cmds/sync.py b/octodns/cmds/sync.py index d98862b..dcc6af6 100755 --- a/octodns/cmds/sync.py +++ b/octodns/cmds/sync.py @@ -58,10 +58,9 @@ def main(): args = parser.parse_args() - manager = Manager(args.config_file) + manager = Manager(args.config_file, active_sources=args.source) manager.sync( eligible_zones=args.zone, - eligible_sources=args.source, eligible_targets=args.target, dry_run=not args.doit, force=args.force, diff --git a/octodns/manager.py b/octodns/manager.py index bcdb849..4ba582e 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -98,12 +98,18 @@ class Manager(object): include_meta=False, auto_arpa=False, enable_checksum=False, + active_sources=None, ): version = self._try_version('octodns', version=__version__) self.log.info( - '__init__: config_file=%s, (octoDNS %s)', config_file, version + '__init__: config_file=%s, active_sources=%s (octoDNS %s)', + config_file, + active_sources, + version, ) + self.active_sources = active_sources + self._configured_sub_zones = None # Read our config file @@ -673,7 +679,6 @@ class Manager(object): def sync( self, eligible_zones=[], - eligible_sources=[], eligible_targets=[], dry_run=True, force=False, @@ -692,7 +697,7 @@ class Manager(object): zones = self.config['zones'] - zones = self._preprocess_zones(zones, eligible_sources) + zones = self._preprocess_zones(zones, self.active_sources) if eligible_zones: zones = IdnaDict({n: zones.get(n) for n in eligible_zones}) @@ -706,9 +711,9 @@ class Manager(object): raise ManagerException( 'ARPA zones cannot be synced during partial runs when auto_arpa is enabled' ) - if eligible_sources: + if self.active_sources: raise ManagerException( - 'eligible_sources is incompatible with auto_arpa' + 'active_sources is incompatible with auto_arpa' ) if eligible_targets: raise ManagerException( @@ -747,7 +752,7 @@ class Manager(object): lenient = config.get('lenient', False) sources = self._get_sources( - decoded_zone_name, config, eligible_sources + decoded_zone_name, config, self.active_sources ) try: @@ -944,30 +949,23 @@ class Manager(object): return zb.changes(za, _AggregateTarget(a + b)) def dump( - self, - zone, - output_dir, - sources, - lenient=False, - split=False, - output_provider=None, + self, zone, output_dir, lenient=False, split=False, output_provider=None ): ''' Dump zone data from the specified source ''' self.log.info( 'dump: zone=%s, output_dir=%s, output_provider=%s, ' - 'lenient=%s, split=%s, sources=%s', + 'lenient=%s, split=%s', zone, output_dir, output_provider, lenient, split, - sources, ) try: - sources = [self.providers[s] for s in sources] + sources = [self.providers[s] for s in self.active_sources] except KeyError as e: raise ManagerException(f'Unknown source: {e.args[0]}') diff --git a/tests/test_octodns_manager.py b/tests/test_octodns_manager.py index 9cc3272..cdd617e 100644 --- a/tests/test_octodns_manager.py +++ b/tests/test_octodns_manager.py @@ -278,9 +278,9 @@ class TestManager(TestCase): environ['YAML_TMP_DIR'] = tmpdir.dirname environ['YAML_TMP_DIR2'] = tmpdir.dirname # Only allow a target that doesn't exist - tc = Manager(get_config_filename('simple.yaml')).sync( - eligible_sources=['foo'] - ) + tc = Manager( + get_config_filename('simple.yaml'), active_sources=['foo'] + ).sync() self.assertEqual(0, tc) def test_eligible_targets(self): @@ -417,30 +417,25 @@ class TestManager(TestCase): with TemporaryDirectory() as tmpdir: environ['YAML_TMP_DIR'] = tmpdir.dirname environ['YAML_TMP_DIR2'] = tmpdir.dirname - manager = Manager(get_config_filename('simple.yaml')) + manager = Manager( + get_config_filename('simple.yaml'), active_sources=['nope'] + ) with self.assertRaises(ManagerException) as ctx: manager.dump( - zone='unit.tests.', - output_dir=tmpdir.dirname, - split=True, - sources=['nope'], + zone='unit.tests.', output_dir=tmpdir.dirname, split=True ) self.assertEqual('Unknown source: nope', str(ctx.exception)) # specific zone + manager.active_sources = ['in'] manager.dump( - zone='unit.tests.', - output_dir=tmpdir.dirname, - split=True, - sources=['in'], + zone='unit.tests.', output_dir=tmpdir.dirname, split=True ) self.assertEqual(['unit.tests.'], listdir(tmpdir.dirname)) # all configured zones - manager.dump( - zone='*', output_dir=tmpdir.dirname, split=True, sources=['in'] - ) + manager.dump(zone='*', output_dir=tmpdir.dirname, split=True) self.assertEqual( [ 'empty.', @@ -455,22 +450,19 @@ class TestManager(TestCase): # when trying to find sub zones with self.assertRaises(ManagerException): manager.dump( - zone='unknown.zone.', - output_dir=tmpdir.dirname, - split=True, - sources=['in'], + zone='unknown.zone.', output_dir=tmpdir.dirname, split=True ) def test_dump_empty(self): with TemporaryDirectory() as tmpdir: environ['YAML_TMP_DIR'] = tmpdir.dirname environ['YAML_TMP_DIR2'] = tmpdir.dirname - manager = Manager(get_config_filename('simple.yaml')) - - manager.dump( - zone='empty.', output_dir=tmpdir.dirname, sources=['in'] + manager = Manager( + get_config_filename('simple.yaml'), active_sources=['in'] ) + manager.dump(zone='empty.', output_dir=tmpdir.dirname) + with open(join(tmpdir.dirname, 'empty.yaml')) as fh: data = safe_load(fh, False) self.assertFalse(data) @@ -481,7 +473,9 @@ class TestManager(TestCase): # this time we'll use seperate tmp dirs with TemporaryDirectory() as tmpdir2: environ['YAML_TMP_DIR2'] = tmpdir2.dirname - manager = Manager(get_config_filename('simple.yaml')) + manager = Manager( + get_config_filename('simple.yaml'), active_sources=['in'] + ) # we're going to tell it to use dump2 to do the dumping, but a # copy should be made and directory set to tmpdir.dirname @@ -490,7 +484,6 @@ class TestManager(TestCase): zone='unit.tests.', output_dir=tmpdir.dirname, output_provider='dump2', - sources=['in'], ) self.assertTrue(isfile(join(tmpdir.dirname, 'unit.tests.yaml'))) @@ -504,7 +497,6 @@ class TestManager(TestCase): zone='unit.tests.', output_dir=tmpdir2.dirname, output_provider='dump2', - sources=['in'], ) self.assertTrue( isfile(join(tmpdir2.dirname, 'unit.tests.yaml')) @@ -516,7 +508,6 @@ class TestManager(TestCase): zone='unit.tests.', output_dir=tmpdir.dirname, output_provider='nope', - sources=['in'], ) self.assertEqual( 'Unknown output_provider: nope', str(ctx.exception) @@ -529,7 +520,6 @@ class TestManager(TestCase): zone='unit.tests.', output_dir=tmpdir.dirname, output_provider='simple', - sources=['in'], ) self.assertEqual( 'output_provider=simple, does not support ' @@ -545,7 +535,6 @@ class TestManager(TestCase): zone='unit.tests.', output_dir=tmpdir.dirname, output_provider='simple', - sources=['in'], ) self.assertEqual( 'output_provider=simple, does not support copy method', @@ -556,32 +545,27 @@ class TestManager(TestCase): with TemporaryDirectory() as tmpdir: environ['YAML_TMP_DIR'] = tmpdir.dirname environ['YAML_TMP_DIR2'] = tmpdir.dirname - manager = Manager(get_config_filename('simple-split.yaml')) + manager = Manager( + get_config_filename('simple-split.yaml'), + active_sources=['nope'], + ) with self.assertRaises(ManagerException) as ctx: manager.dump( - zone='unit.tests.', - output_dir=tmpdir.dirname, - split=True, - sources=['nope'], + zone='unit.tests.', output_dir=tmpdir.dirname, split=True ) self.assertEqual('Unknown source: nope', str(ctx.exception)) + manager.active_sources = ['in'] manager.dump( - zone='unit.tests.', - output_dir=tmpdir.dirname, - split=True, - sources=['in'], + zone='unit.tests.', output_dir=tmpdir.dirname, split=True ) # make sure this fails with an ManagerException and not a KeyError # when trying to find sub zones with self.assertRaises(ManagerException): manager.dump( - zone='unknown.zone.', - output_dir=tmpdir.dirname, - split=True, - sources=['in'], + zone='unknown.zone.', output_dir=tmpdir.dirname, split=True ) def test_validate_configs(self): @@ -1057,24 +1041,22 @@ class TestManager(TestCase): str(ctx.exception), ) - # same for eligible_sources + # same for active_sources reset(tmpdir.dirname) - tc = manager.sync( - dry_run=False, - eligible_zones=['unit.tests.'], - eligible_sources=['in'], - ) + manager.active_sources = ['in'] + tc = manager.sync(dry_run=False, eligible_zones=['unit.tests.']) self.assertEqual(22, tc) # can't do partial syncs that include arpa zones with self.assertRaises(ManagerException) as ctx: - manager.sync(dry_run=False, eligible_sources=['in']) + manager.sync(dry_run=False) self.assertEqual( - 'eligible_sources is incompatible with auto_arpa', + 'active_sources is incompatible with auto_arpa', str(ctx.exception), ) # same for eligible_targets reset(tmpdir.dirname) + manager.active_sources = None tc = manager.sync( dry_run=False, eligible_zones=['unit.tests.'], @@ -1091,6 +1073,7 @@ class TestManager(TestCase): # full sync with arpa is fine, 2 extra records from it reset(tmpdir.dirname) + manager.active_sources = None tc = manager.sync(dry_run=False) self.assertEqual(26, tc)