diff --git a/octodns/manager.py b/octodns/manager.py index 1fe8378..3b4ab8f 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -528,8 +528,7 @@ class Manager(object): for source in sources: if not hasattr(source, 'list_zones'): raise ManagerException( - f'dynamic zone=%s includes a source that does not support `list_zones`', - name, + f'dynamic zone={name} includes a source that does not support `list_zones`', ) for zone_name in source.list_zones(): if zone_name in zones: diff --git a/octodns/provider/yaml.py b/octodns/provider/yaml.py index 88d9023..1d495a9 100644 --- a/octodns/provider/yaml.py +++ b/octodns/provider/yaml.py @@ -192,7 +192,7 @@ class YamlProvider(BaseProvider): def list_zones(self): for filename in listdir(self.directory): - if not filename.endswith('.yaml'): + if not filename.endswith('.yaml') or filename.count('.') < 2: continue yield filename[:-4] @@ -330,6 +330,13 @@ class SplitYamlProvider(YamlProvider): filename = f'{zone.name[:-1]}{self.extension}' return join(self.directory, filename) + def list_zones(self): + n = len(self.extension) - 1 + for filename in listdir(self.directory): + if not filename.endswith(self.extension): + continue + yield filename[:-n] + def populate(self, zone, target=False, lenient=False): self.log.debug( 'populate: name=%s, target=%s, lenient=%s', diff --git a/tests/config/split/other.thing/.gitkeep b/tests/config/split/other.thing/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_octodns_provider_yaml.py b/tests/test_octodns_provider_yaml.py index 1796bb4..b2a4433 100644 --- a/tests/test_octodns_provider_yaml.py +++ b/tests/test_octodns_provider_yaml.py @@ -296,6 +296,18 @@ xn--dj-kia8a: self.assertTrue(source.supports(DummyType(source))) self.assertTrue(source.supports(DummyType(self))) + def test_list_zones(self): + provider = YamlProvider('test', 'tests/config') + self.assertEqual( + [ + 'dynamic.tests.', + 'sub.txt.unit.tests.', + 'subzone.unit.tests.', + 'unit.tests.', + ], + sorted(provider.list_zones()), + ) + class TestSplitYamlProvider(TestCase): def test_list_all_yaml_files(self): @@ -570,6 +582,21 @@ class TestSplitYamlProvider(TestCase): ) self.assertEqual(source.supports_root_ns, copy.supports_root_ns) + def test_list_zones(self): + provider = SplitYamlProvider( + 'test', 'tests/config/split', extension='.tst' + ) + self.assertEqual( + [ + 'dynamic.tests.', + 'empty.', + 'subzone.unit.tests.', + 'unit.tests.', + 'unordered.', + ], + sorted(provider.list_zones()), + ) + class TestOverridingYamlProvider(TestCase): def test_provider(self):