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.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

+ 11
- 64
tests/test_octodns_processor_templating.py View File

@ -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),


Loading…
Cancel
Save