Browse Source

Merge pull request #1279 from octodns/fix-alias-templating

Fix issue with using Templating processor on aliased zones
pull/1282/head
Ross McFarland 5 months ago
committed by GitHub
parent
commit
a89f635206
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 69 deletions
  1. +4
    -0
      .changelog/519279fa6fa94b2fb61bd3552084dbd6.md
  2. +3
    -5
      octodns/processor/templating.py
  3. +11
    -64
      tests/test_octodns_processor_templating.py

+ 4
- 0
.changelog/519279fa6fa94b2fb61bd3552084dbd6.md View File

@ -0,0 +1,4 @@
---
type: minor
---
Fix issues with using Templating processor on alias zones

+ 3
- 5
octodns/processor/templating.py View File

@ -72,8 +72,7 @@ class Templating(BaseProcessor):
self.trailing_dots = trailing_dots self.trailing_dots = trailing_dots
self.context = context 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_name = desired.decoded_name
zone_decoded_name = desired.decoded_name zone_decoded_name = desired.decoded_name
zone_encoded_name = desired.name zone_encoded_name = desired.name
@ -86,12 +85,11 @@ class Templating(BaseProcessor):
'zone_decoded_name': zone_decoded_name, 'zone_decoded_name': zone_decoded_name,
'zone_encoded_name': zone_encoded_name, 'zone_encoded_name': zone_encoded_name,
'zone_num_records': len(desired.records), '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 # add any extra context provided to us, if the value is a callable
# object call it passing our params so that arbitrary dynamic # object call it passing our params so that arbitrary dynamic
# context can be added for use in formatting # 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() for k, v in self.context.items()
}, },
} }
@ -149,4 +147,4 @@ class Templating(BaseProcessor):
new.value = new_value new.value = new_value
desired.add_record(new, replace=True) desired.add_record(new, replace=True)
return desired
return desired, existing

+ 11
- 64
tests/test_octodns_processor_templating.py View File

@ -91,7 +91,7 @@ class TemplatingTest(TestCase):
) )
zone.add_record(noop) 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') cname = _find(got, 'cname')
self.assertEqual('_cname.unit.tests.something.else.', cname.value) self.assertEqual('_cname.unit.tests.something.else.', cname.value)
noop = _find(got, 'noop') noop = _find(got, 'noop')
@ -118,7 +118,7 @@ class TemplatingTest(TestCase):
) )
zone.add_record(noop) 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') txt = _find(got, 'txt')
self.assertEqual('There are 2 record(s) in unit.tests.', txt.values[0]) self.assertEqual('There are 2 record(s) in unit.tests.', txt.values[0])
noop = _find(got, 'noop') noop = _find(got, 'noop')
@ -138,56 +138,12 @@ class TemplatingTest(TestCase):
# this should check for the template method on our values that don't # this should check for the template method on our values that don't
# have one # 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 # and these should make sure that the value types were asked if they
# have a template method # have a template method
self.assertEqual({'template'}, s.value._asked_for) self.assertEqual({'template'}, s.value._asked_for)
self.assertEqual({'template'}, m.values[0]._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') @patch('octodns.record.TxtValue.template')
def test_trailing_dots(self, mock_template): def test_trailing_dots(self, mock_template):
templ = Templating('test', trailing_dots=False) templ = Templating('test', trailing_dots=False)
@ -206,9 +162,7 @@ class TemplatingTest(TestCase):
) )
zone.add_record(txt) 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() mock_template.assert_called_once()
self.assertEqual( self.assertEqual(
call( call(
@ -219,14 +173,13 @@ class TemplatingTest(TestCase):
'record_fqdn': 'txt.unit.tests', 'record_fqdn': 'txt.unit.tests',
'record_decoded_fqdn': 'txt.unit.tests', 'record_decoded_fqdn': 'txt.unit.tests',
'record_encoded_fqdn': 'txt.unit.tests', 'record_encoded_fqdn': 'txt.unit.tests',
'record_source_id': 'record',
'record_type': 'TXT', 'record_type': 'TXT',
'record_ttl': 42, 'record_ttl': 42,
'record_source_id': 'record',
'zone_name': 'unit.tests', 'zone_name': 'unit.tests',
'zone_decoded_name': 'unit.tests', 'zone_decoded_name': 'unit.tests',
'zone_encoded_name': 'unit.tests', 'zone_encoded_name': 'unit.tests',
'zone_num_records': 1, 'zone_num_records': 1,
'zone_source_ids': 'record, other',
} }
), ),
mock_template.call_args, mock_template.call_args,
@ -241,7 +194,7 @@ class TemplatingTest(TestCase):
# dynamic # dynamic
'the_date': lambda _, __: 'today', 'the_date': lambda _, __: 'today',
# uses a param # uses a param
'num_sources': lambda z, ss: len(ss),
'provider': lambda _, pro: pro,
}, },
) )
@ -255,18 +208,16 @@ class TemplatingTest(TestCase):
'values': ( 'values': (
'the_answer: {the_answer}', 'the_answer: {the_answer}',
'the_date: {the_date}', 'the_date: {the_date}',
'num_sources: {num_sources}',
'provider: {provider}',
), ),
}, },
) )
zone.add_record(txt) 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') txt = _find(got, 'txt')
self.assertEqual(3, len(txt.values)) 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_answer: 42', txt.values[1])
self.assertEqual('the_date: today', txt.values[2]) self.assertEqual('the_date: today', txt.values[2])
@ -282,9 +233,7 @@ class TemplatingTest(TestCase):
zone.add_record(txt) zone.add_record(txt)
with self.assertRaises(TemplatingError) as ctx: 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( self.assertEqual(
'Invalid record "txt.unit.tests.", undefined template parameter "bad" in value', 'Invalid record "txt.unit.tests.", undefined template parameter "bad" in value',
str(ctx.exception), str(ctx.exception),
@ -304,9 +253,7 @@ class TemplatingTest(TestCase):
zone.add_record(cname) zone.add_record(cname)
with self.assertRaises(TemplatingError) as ctx: 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( self.assertEqual(
'Invalid record "cname.unit.tests.", undefined template parameter "bad" in value', 'Invalid record "cname.unit.tests.", undefined template parameter "bad" in value',
str(ctx.exception), str(ctx.exception),


Loading…
Cancel
Save