def test_plan_processors_fallback(self): with TemporaryDirectory() as tmpdir: environ['YAML_TMP_DIR'] = tmpdir.dirname # Only allow a target that doesn't exist manager = Manager(get_config_filename('simple.yaml')) class NoProcessors(SimpleProvider): def plan(self, zone): pass # This should be ok, we'll fall back to not passing it manager._populate_and_plan('unit.tests.', [], [], [NoProcessors()]) class OtherType(SimpleProvider): def plan(self, zone, processors): raise TypeError('something else') # This will blow up, we don't fallback for source with self.assertRaises(TypeError) as ctx: manager._populate_and_plan('unit.tests.', [], [], [OtherType()]) self.assertEquals('something else', text_type(ctx.exception))
def test_processors(self): manager = Manager(get_config_filename('simple.yaml')) targets = [PlannableProvider('prov')] zone = Zone('unit.tests.', []) record = Record.new(zone, 'a', { 'ttl': 30, 'type': 'A', 'value': '1.2.3.4', }) # muck with sources class MockProcessor(BaseProcessor): def process_source_zone(self, zone, sources): zone = zone.copy() zone.add_record(record) return zone mock = MockProcessor('mock') plans, zone = manager._populate_and_plan('unit.tests.', [mock], [], targets) # Our mock was called and added the record self.assertEquals(record, list(zone.records)[0]) # We got a create for the thing added to the expected state (source) self.assertIsInstance(plans[0][1].changes[0], Create) # muck with targets class MockProcessor(BaseProcessor): def process_target_zone(self, zone, target): zone = zone.copy() zone.add_record(record) return zone mock = MockProcessor('mock') plans, zone = manager._populate_and_plan('unit.tests.', [mock], [], targets) # No record added since it's target this time self.assertFalse(zone.records) # We got a delete for the thing added to the existing state (target) self.assertIsInstance(plans[0][1].changes[0], Delete) # muck with plans class MockProcessor(BaseProcessor): def process_target_zone(self, zone, target): zone = zone.copy() zone.add_record(record) return zone def process_plan(self, plans, sources, target): # get rid of the change plans.changes.pop(0) mock = MockProcessor('mock') plans, zone = manager._populate_and_plan('unit.tests.', [mock], [], targets) # We planned a delete again, but this time removed it from the plan, so # no plans self.assertFalse(plans)
def test_populate_lenient_fallback(self): with TemporaryDirectory() as tmpdir: environ['YAML_TMP_DIR'] = tmpdir.dirname # Only allow a target that doesn't exist manager = Manager(get_config_filename('simple.yaml')) class NoLenient(SimpleProvider): def populate(self, zone, source=False): pass # This should be ok, we'll fall back to not passing it manager._populate_and_plan('unit.tests.', [NoLenient()], []) class NoZone(SimpleProvider): def populate(self, lenient=False): pass # This will blow up, we don't fallback for source with self.assertRaises(TypeError): manager._populate_and_plan('unit.tests.', [NoZone()], [])