def test_apply_handles_existing_zone_directory(self): with TemporaryDirectory() as td: provider = SplitYamlProvider('test', join(td.dirname, 'config')) makedirs(join(td.dirname, 'config', 'does.exist.')) zone = Zone('does.exist.', []) self.assertTrue(isdir(provider._zone_directory(zone))) provider.apply(Plan(None, zone, [], True)) self.assertTrue(isdir(provider._zone_directory(zone)))
def test_provider(self): source = SplitYamlProvider('test', join(dirname(__file__), 'config/split'), extension='.tst') zone = Zone('unit.tests.', []) dynamic_zone = Zone('dynamic.tests.', []) # With target we don't add anything source.populate(zone, target=source) self.assertEqual(0, len(zone.records)) # without it we see everything source.populate(zone) self.assertEqual(20, len(zone.records)) source.populate(dynamic_zone) self.assertEqual(5, len(dynamic_zone.records)) with TemporaryDirectory() as td: # Add some subdirs to make sure that it can create them directory = join(td.dirname, 'sub', 'dir') zone_dir = join(directory, 'unit.tests.tst') dynamic_zone_dir = join(directory, 'dynamic.tests.tst') target = SplitYamlProvider('test', directory, extension='.tst', supports_root_ns=False) # We add everything plan = target.plan(zone) self.assertEqual( 17, len([c for c in plan.changes if isinstance(c, Create)])) self.assertFalse(isdir(zone_dir)) # Now actually do it self.assertEqual(17, target.apply(plan)) # Dynamic plan plan = target.plan(dynamic_zone) self.assertEqual( 5, len([c for c in plan.changes if isinstance(c, Create)])) self.assertFalse(isdir(dynamic_zone_dir)) # Apply it self.assertEqual(5, target.apply(plan)) self.assertTrue(isdir(dynamic_zone_dir)) # There should be no changes after the round trip reloaded = Zone('unit.tests.', []) target.populate(reloaded) self.assertDictEqual( {'included': ['test']}, [x for x in reloaded.records if x.name == 'included'][0]._octodns, ) # manually copy over the root since it will have been ignored # when things were written out reloaded.add_record(zone.root_ns) self.assertFalse(zone.changes(reloaded, target=source)) # A 2nd sync should still create everything plan = target.plan(zone) self.assertEqual( 17, len([c for c in plan.changes if isinstance(c, Create)])) yaml_file = join(zone_dir, '$unit.tests.yaml') self.assertTrue(isfile(yaml_file)) with open(yaml_file) as fh: data = safe_load(fh.read()) roots = sorted(data.pop(''), key=lambda r: r['type']) self.assertTrue('values' in roots[0]) # A self.assertTrue('geo' in roots[0]) # geo made the trip self.assertTrue('value' in roots[1]) # CAA self.assertTrue('values' in roots[2]) # SSHFP # These records are stored as plural "values." Check each file to # ensure correctness. for record_name in ( '_srv._tcp', 'mx', 'naptr', 'sub', 'txt', 'urlfwd', ): yaml_file = join(zone_dir, f'{record_name}.yaml') self.assertTrue(isfile(yaml_file)) with open(yaml_file) as fh: data = safe_load(fh.read()) self.assertTrue('values' in data.pop(record_name)) # These are stored as singular "value." Again, check each file. for record_name in ( 'aaaa', 'cname', 'dname', 'included', 'ptr', 'spf', 'www.sub', 'www', ): yaml_file = join(zone_dir, f'{record_name}.yaml') self.assertTrue(isfile(yaml_file)) with open(yaml_file) as fh: data = safe_load(fh.read()) self.assertTrue('value' in data.pop(record_name)) # Again with the plural, this time checking dynamic.tests. for record_name in ('a', 'aaaa', 'real-ish-a'): yaml_file = join(dynamic_zone_dir, f'{record_name}.yaml') self.assertTrue(isfile(yaml_file)) with open(yaml_file) as fh: data = safe_load(fh.read()) dyna = data.pop(record_name) self.assertTrue('values' in dyna) self.assertTrue('dynamic' in dyna) # Singular again. for record_name in ('cname', 'simple-weighted'): yaml_file = join(dynamic_zone_dir, f'{record_name}.yaml') self.assertTrue(isfile(yaml_file)) with open(yaml_file) as fh: data = safe_load(fh.read()) dyna = data.pop(record_name) self.assertTrue('value' in dyna) self.assertTrue('dynamic' in dyna)