diff --git a/.changelog/519279fa6fa94b2fb61bd3552084dbd6.md b/.changelog/519279fa6fa94b2fb61bd3552084dbd6.md new file mode 100644 index 0000000..c264805 --- /dev/null +++ b/.changelog/519279fa6fa94b2fb61bd3552084dbd6.md @@ -0,0 +1,4 @@ +--- +type: minor +--- +Fix issues with using Templating processor on alias zones \ No newline at end of file diff --git a/octodns/processor/templating.py b/octodns/processor/templating.py index 616a715..88d902d 100644 --- a/octodns/processor/templating.py +++ b/octodns/processor/templating.py @@ -72,8 +72,7 @@ class Templating(BaseProcessor): self.trailing_dots = trailing_dots self.context = context - def process_source_zone(self, desired, sources): - sources = sources or [] + def process_source_and_target_zones(self, desired, existing, provider): zone_name = desired.decoded_name zone_decoded_name = desired.decoded_name zone_encoded_name = desired.name @@ -86,12 +85,11 @@ class Templating(BaseProcessor): 'zone_decoded_name': zone_decoded_name, 'zone_encoded_name': zone_encoded_name, 'zone_num_records': len(desired.records), - 'zone_source_ids': ', '.join(s.id for s in sources), # add any extra context provided to us, if the value is a callable # object call it passing our params so that arbitrary dynamic # context can be added for use in formatting **{ - k: (v(desired, sources) if callable(v) else v) + k: (v(desired, provider) if callable(v) else v) for k, v in self.context.items() }, } @@ -149,4 +147,4 @@ class Templating(BaseProcessor): new.value = new_value desired.add_record(new, replace=True) - return desired + return desired, existing diff --git a/tests/test_octodns_processor_templating.py b/tests/test_octodns_processor_templating.py index f959964..a9dcaed 100644 --- a/tests/test_octodns_processor_templating.py +++ b/tests/test_octodns_processor_templating.py @@ -91,7 +91,7 @@ class TemplatingTest(TestCase): ) zone.add_record(noop) - got = templ.process_source_zone(zone, None) + got, _ = templ.process_source_and_target_zones(zone, None, None) cname = _find(got, 'cname') self.assertEqual('_cname.unit.tests.something.else.', cname.value) noop = _find(got, 'noop') @@ -118,7 +118,7 @@ class TemplatingTest(TestCase): ) zone.add_record(noop) - got = templ.process_source_zone(zone, None) + got, _ = templ.process_source_and_target_zones(zone, None, None) txt = _find(got, 'txt') self.assertEqual('There are 2 record(s) in unit.tests.', txt.values[0]) noop = _find(got, 'noop') @@ -138,56 +138,12 @@ class TemplatingTest(TestCase): # this should check for the template method on our values that don't # have one - templ.process_source_zone(zone, None) + templ.process_source_and_target_zones(zone, None, None) # and these should make sure that the value types were asked if they # have a template method self.assertEqual({'template'}, s.value._asked_for) self.assertEqual({'template'}, m.values[0]._asked_for) - @patch('octodns.record.TxtValue.template') - def test_params(self, mock_template): - templ = Templating('test') - - zone = Zone('unit.tests.', []) - record_source = DummySource('record') - txt = Record.new( - zone, - 'txt', - { - 'type': 'TXT', - 'ttl': 42, - 'value': 'There are {zone_num_records} record(s) in {zone_name}', - }, - source=record_source, - ) - zone.add_record(txt) - - templ.process_source_zone( - zone, sources=[record_source, DummySource('other')] - ) - mock_template.assert_called_once() - self.assertEqual( - call( - { - 'record_name': 'txt', - 'record_decoded_name': 'txt', - 'record_encoded_name': 'txt', - 'record_fqdn': 'txt.unit.tests.', - 'record_decoded_fqdn': 'txt.unit.tests.', - 'record_encoded_fqdn': 'txt.unit.tests.', - 'record_type': 'TXT', - 'record_ttl': 42, - 'record_source_id': 'record', - 'zone_name': 'unit.tests.', - 'zone_decoded_name': 'unit.tests.', - 'zone_encoded_name': 'unit.tests.', - 'zone_num_records': 1, - 'zone_source_ids': 'record, other', - } - ), - mock_template.call_args, - ) - @patch('octodns.record.TxtValue.template') def test_trailing_dots(self, mock_template): templ = Templating('test', trailing_dots=False) @@ -206,9 +162,7 @@ class TemplatingTest(TestCase): ) zone.add_record(txt) - templ.process_source_zone( - zone, sources=[record_source, DummySource('other')] - ) + templ.process_source_and_target_zones(zone, None, None) mock_template.assert_called_once() self.assertEqual( call( @@ -219,14 +173,13 @@ class TemplatingTest(TestCase): 'record_fqdn': 'txt.unit.tests', 'record_decoded_fqdn': 'txt.unit.tests', 'record_encoded_fqdn': 'txt.unit.tests', + 'record_source_id': 'record', 'record_type': 'TXT', 'record_ttl': 42, - 'record_source_id': 'record', 'zone_name': 'unit.tests', 'zone_decoded_name': 'unit.tests', 'zone_encoded_name': 'unit.tests', 'zone_num_records': 1, - 'zone_source_ids': 'record, other', } ), mock_template.call_args, @@ -241,7 +194,7 @@ class TemplatingTest(TestCase): # dynamic 'the_date': lambda _, __: 'today', # uses a param - 'num_sources': lambda z, ss: len(ss), + 'provider': lambda _, pro: pro, }, ) @@ -255,18 +208,16 @@ class TemplatingTest(TestCase): 'values': ( 'the_answer: {the_answer}', 'the_date: {the_date}', - 'num_sources: {num_sources}', + 'provider: {provider}', ), }, ) zone.add_record(txt) - got = templ.process_source_zone( - zone, tuple(DummySource(i) for i in range(3)) - ) + got, _ = templ.process_source_and_target_zones(zone, None, 'da-pro') txt = _find(got, 'txt') self.assertEqual(3, len(txt.values)) - self.assertEqual('num_sources: 3', txt.values[0]) + self.assertEqual('provider: da-pro', txt.values[0]) self.assertEqual('the_answer: 42', txt.values[1]) self.assertEqual('the_date: today', txt.values[2]) @@ -282,9 +233,7 @@ class TemplatingTest(TestCase): zone.add_record(txt) with self.assertRaises(TemplatingError) as ctx: - templ.process_source_zone( - zone, tuple(DummySource(i) for i in range(3)) - ) + templ.process_source_and_target_zones(zone, None, None) self.assertEqual( 'Invalid record "txt.unit.tests.", undefined template parameter "bad" in value', str(ctx.exception), @@ -304,9 +253,7 @@ class TemplatingTest(TestCase): zone.add_record(cname) with self.assertRaises(TemplatingError) as ctx: - templ.process_source_zone( - zone, tuple(DummySource(i) for i in range(3)) - ) + templ.process_source_and_target_zones(zone, None, None) self.assertEqual( 'Invalid record "cname.unit.tests.", undefined template parameter "bad" in value', str(ctx.exception),