diff --git a/octodns/processor/arpa.py b/octodns/processor/arpa.py index 2675f0d..d360b19 100644 --- a/octodns/processor/arpa.py +++ b/octodns/processor/arpa.py @@ -12,7 +12,12 @@ from .base import BaseProcessor class AutoArpa(BaseProcessor): def __init__( - self, name, ttl=3600, populate_should_replace=False, max_auto_arpa=999, inherit_ttl=False + self, + name, + ttl=3600, + populate_should_replace=False, + max_auto_arpa=999, + inherit_ttl=False, ): super().__init__(name) self.log = getLogger(f'AutoArpa[{name}]') @@ -61,10 +66,10 @@ class AutoArpa(BaseProcessor): # order the fqdns making a copy so we can reset the list below ordered = sorted(fqdns) fqdns = [] - for _, _, fqdn in ordered: + for _, record_ttl, fqdn in ordered: if fqdn in seen: continue - fqdns.append(fqdn) + fqdns.append((record_ttl, fqdn)) seen.add(fqdn) if len(seen) >= max_auto_arpa: break @@ -85,13 +90,16 @@ class AutoArpa(BaseProcessor): for arpa, fqdns in self._records.items(): if arpa.endswith(f'.{zone_name}'): name = arpa[:-n] - _, record_ttl, _ = fqdns[0] - # Note: this takes a list of (priority, fqdn) tuples and returns the ordered and uniqified list of fqdns. + # Note: this takes a list of (priority, ttl, fqdn) tuples and returns the ordered and uniqified list of fqdns. fqdns = self._order_and_unique_fqdns(fqdns, self.max_auto_arpa) record = Record.new( zone, name, - {'ttl': record_ttl, 'type': 'PTR', 'values': fqdns}, + { + 'ttl': fqdns[0][0], + 'type': 'PTR', + 'values': [fqdn[1] for fqdn in fqdns], + }, lenient=lenient, ) zone.add_record( @@ -99,7 +107,6 @@ class AutoArpa(BaseProcessor): replace=self.populate_should_replace, lenient=lenient, ) - self.log.info( 'populate: found %s records', len(zone.records) - before ) diff --git a/tests/test_octodns_processor_arpa.py b/tests/test_octodns_processor_arpa.py index 463ecc6..be4c2fd 100644 --- a/tests/test_octodns_processor_arpa.py +++ b/tests/test_octodns_processor_arpa.py @@ -27,7 +27,8 @@ class TestAutoArpa(TestCase): aa = AutoArpa('auto-arpa') aa.process_source_zone(zone, []) self.assertEqual( - {'4.3.2.1.in-addr.arpa.': [(999, 3600, 'a.unit.tests.')]}, aa._records + {'4.3.2.1.in-addr.arpa.': [(999, 3600, 'a.unit.tests.')]}, + aa._records, ) # matching zone @@ -81,7 +82,9 @@ class TestAutoArpa(TestCase): aa = AutoArpa('auto-arpa') aa.process_source_zone(zone, []) ip6_arpa = '2.0.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.0.0.0.f.f.0.0.ip6.arpa.' - self.assertEqual({ip6_arpa: [(999, 3600, 'aaaa.unit.tests.')]}, aa._records) + self.assertEqual( + {ip6_arpa: [(999, 3600, 'aaaa.unit.tests.')]}, aa._records + ) # matching zone arpa = Zone('c.0.0.0.f.f.0.0.ip6.arpa.', []) @@ -176,7 +179,7 @@ class TestAutoArpa(TestCase): unique_values = aa._order_and_unique_fqdns( aa._records[f'{zone}'], 999 ) - self.assertEqual([('dynamic.unit.tests.')], unique_values) + self.assertEqual([(3600, 'dynamic.unit.tests.')], unique_values) def test_multiple_names(self): zone = Zone('unit.tests.', []) @@ -219,7 +222,8 @@ class TestAutoArpa(TestCase): aa = AutoArpa('auto-arpa') aa.process_source_zone(zone, []) self.assertEqual( - {'4.3.20.10.in-addr.arpa.': [(999, 3600, 'a.unit.tests.')]}, aa._records + {'4.3.20.10.in-addr.arpa.': [(999, 3600, 'a.unit.tests.')]}, + aa._records, ) # matching zone @@ -259,7 +263,11 @@ class TestAutoArpa(TestCase): aa = AutoArpa('auto-arpa') aa.process_source_zone(zone, []) self.assertEqual( - {'4.3.2.1.in-addr.arpa.': [(999, 3600, 'a with spaces.unit.tests.')]}, + { + '4.3.2.1.in-addr.arpa.': [ + (999, 3600, 'a with spaces.unit.tests.') + ] + }, aa._records, ) @@ -275,9 +283,12 @@ class TestAutoArpa(TestCase): def test_arpa_priority(self): aa = AutoArpa('auto-arpa') - duplicate_values = [(999, 3600, 'a.unit.tests.'), (1, 3600, 'a.unit.tests.')] + duplicate_values = [ + (999, 3600, 'a.unit.tests.'), + (1, 3600, 'a.unit.tests.'), + ] self.assertEqual( - ['a.unit.tests.'], + [(3600, 'a.unit.tests.')], aa._order_and_unique_fqdns(duplicate_values, max_auto_arpa=999), ) @@ -290,29 +301,38 @@ class TestAutoArpa(TestCase): ] self.assertEqual( [ - 'dup.unit.tests.', - 'c.unit.tests.', - 'a.unit.tests.', - 'd.unit.tests.', + (3600, 'dup.unit.tests.'), + (3600, 'c.unit.tests.'), + (3600, 'a.unit.tests.'), + (3600, 'd.unit.tests.'), ], aa._order_and_unique_fqdns(duplicate_values, max_auto_arpa=999), ) - duplicate_values_2 = [(999, 3600, 'a.unit.tests.'), (999, 3600, 'a.unit.tests.')] + duplicate_values_2 = [ + (999, 3600, 'a.unit.tests.'), + (999, 3600, 'a.unit.tests.'), + ] self.assertEqual( - ['a.unit.tests.'], + [(3600, 'a.unit.tests.')], aa._order_and_unique_fqdns(duplicate_values_2, max_auto_arpa=999), ) - ordered_values = [(999, 3600, 'a.unit.tests.'), (1, 3600, 'b.unit.tests.')] + ordered_values = [ + (999, 3600, 'a.unit.tests.'), + (1, 3600, 'b.unit.tests.'), + ] self.assertEqual( - ['b.unit.tests.', 'a.unit.tests.'], + [(3600, 'b.unit.tests.'), (3600, 'a.unit.tests.')], aa._order_and_unique_fqdns(ordered_values, max_auto_arpa=999), ) - max_one_value = [(999, 3600, 'a.unit.tests.'), (1, 3600, 'b.unit.tests.')] + max_one_value = [ + (999, 3600, 'a.unit.tests.'), + (1, 3600, 'b.unit.tests.'), + ] self.assertEqual( - ['b.unit.tests.'], + [(3600, 'b.unit.tests.')], aa._order_and_unique_fqdns(max_one_value, max_auto_arpa=1), ) @@ -323,7 +343,27 @@ class TestAutoArpa(TestCase): ) zone.add_record(record) - aa = AutoArpa('auto-arpa', 3600, 999, True) - aa.populate(zone) - (ptr,) = zone.records - self.assertEqual(32, ptr.ttl) + record2 = Record.new( + zone, + 'a2', + { + 'ttl': 64, + 'type': 'A', + 'value': '1.2.3.4', + 'octodns': {'auto_arpa_priority': 1}, + }, + ) + zone.add_record(record2) + + record3 = Record.new( + zone, 'a3', {'ttl': 128, 'type': 'A', 'value': '1.2.3.4'} + ) + zone.add_record(record3) + + aa = AutoArpa('auto-arpa', 3600, False, 999, True) + aa.process_source_zone(zone, []) + + arpa = Zone('3.2.1.in-addr.arpa.', []) + aa.populate(arpa) + (ptr,) = arpa.records + self.assertEqual(64, ptr.ttl)