From ded53023e7e9b1941fef171d6f86631a20c05f9d Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 15 Oct 2023 13:23:57 -0700 Subject: [PATCH] add support for chunked values to ValuesMixin.rrs --- CHANGELOG.md | 2 ++ octodns/record/base.py | 5 ++++- octodns/record/chunked.py | 3 +++ tests/test_octodns_record_txt.py | 36 ++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0ab5d2..2155ed8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ * Added ZoneNameFilter processor to enable ignoring/alerting on type-os like octodns.com.octodns.com +* Fixed issues with handling of chunking large TXT values for providers that use + the in-built `rrs` method ## v1.2.1 - 2023-09-29 - Now with fewer stale files diff --git a/octodns/record/base.py b/octodns/record/base.py index 16e6718..30ff3c4 100644 --- a/octodns/record/base.py +++ b/octodns/record/base.py @@ -312,13 +312,16 @@ class ValuesMixin(object): return ret + def rr_values(self): + return self.values + @property def rrs(self): return ( self.fqdn, self.ttl, self._type, - [v.rdata_text for v in self.values], + [v.rdata_text for v in self.rr_values()], ) def __repr__(self): diff --git a/octodns/record/chunked.py b/octodns/record/chunked.py index 8eef6fb..021d26e 100644 --- a/octodns/record/chunked.py +++ b/octodns/record/chunked.py @@ -27,6 +27,9 @@ class _ChunkedValuesMixin(ValuesMixin): values.append(self.chunked_value(v)) return values + def rr_values(self): + return self.chunked_values + class _ChunkedValue(str): _unescaped_semicolon_re = re.compile(r'\w;') diff --git a/tests/test_octodns_record_txt.py b/tests/test_octodns_record_txt.py index 1d46426..3d96352 100644 --- a/tests/test_octodns_record_txt.py +++ b/tests/test_octodns_record_txt.py @@ -142,3 +142,39 @@ class TestRecordTxt(TestCase): self.assertEqual(single.values, chunked.values) # should be chunked values, with quoting self.assertEqual(single.chunked_values, chunked.chunked_values) + + def test_rr(self): + zone = Zone('unit.tests.', []) + + # simple TXT + record = Record.new( + zone, + 'txt', + {'ttl': 42, 'type': 'TXT', 'values': ['short 1', 'short 2']}, + ) + self.assertEqual( + ('txt.unit.tests.', 42, 'TXT', ['"short 1"', '"short 2"']), + record.rrs, + ) + + # long chunked text + record = Record.new( + zone, + 'txt', + { + 'ttl': 42, + 'type': 'TXT', + 'values': [ + 'before', + 'v=DKIM1\\; h=sha256\\; k=rsa\\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx78E7PtJvr8vpoNgHdIAe+llFKoy8WuTXDd6Z5mm3D4AUva9MBt5fFetxg/kcRy3KMDnMw6kDybwbpS/oPw1ylk6DL1xit7Cr5xeYYSWKukxXURAlHwT2K72oUsFKRUvN1X9lVysAeo+H8H/22Z9fJ0P30sOuRIRqCaiz+OiUYicxy4xrpfH2s9a+o3yRwX3zhlp8GjRmmmyK5mf7CkQTCfjnKVsYtB7mabXXmClH9tlcymnBMoN9PeXxaS5JRRysVV8RBCC9/wmfp9y//cck8nvE/MavFpSUHvv+TfTTdVKDlsXPjKX8iZQv0nO3xhspgkqFquKjydiR8nf4meHhwIDAQAB', + 'z after', + ], + }, + ) + vals = [ + '"before"', + '"v=DKIM1\\; h=sha256\\; k=rsa\\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx78E7PtJvr8vpoNgHdIAe+llFKoy8WuTXDd6Z5mm3D4AUva9MBt5fFetxg/kcRy3KMDnMw6kDybwbpS/oPw1ylk6DL1xit7Cr5xeYYSWKukxXURAlHwT2K72oUsFKRUvN1X9lVysAeo+H8H/22Z9fJ0P30sOuRIRqCaiz+OiUYicxy4xrpfH" ' + '"2s9a+o3yRwX3zhlp8GjRmmmyK5mf7CkQTCfjnKVsYtB7mabXXmClH9tlcymnBMoN9PeXxaS5JRRysVV8RBCC9/wmfp9y//cck8nvE/MavFpSUHvv+TfTTdVKDlsXPjKX8iZQv0nO3xhspgkqFquKjydiR8nf4meHhwIDAQAB"', + '"z after"', + ] + self.assertEqual(('txt.unit.tests.', 42, 'TXT', vals), record.rrs)