diff --git a/octodns/provider/mythicbeasts.py b/octodns/provider/mythicbeasts.py index 3470ff1..17029db 100644 --- a/octodns/provider/mythicbeasts.py +++ b/octodns/provider/mythicbeasts.py @@ -174,6 +174,19 @@ class MythicBeastsProvider(BaseProvider): max([raw_values['ttl'] for raw_values in data['raw_values']]), } + @staticmethod + def _data_for_TXT(_type, data): + return { + 'type': _type, + 'values': + [ + str(raw_values['value']).replace(';', '\\;') + for raw_values in data['raw_values'] + ], + 'ttl': + max([raw_values['ttl'] for raw_values in data['raw_values']]), + } + @staticmethod def _data_for_MX(_type, data): ttl = max([raw_values['ttl'] for raw_values in data['raw_values']]) @@ -296,7 +309,6 @@ class MythicBeastsProvider(BaseProvider): {'raw_values': [{'value': value, 'ttl': ttl}]}) _data_for_NS = _data_for_multiple - _data_for_TXT = _data_for_multiple _data_for_A = _data_for_multiple _data_for_AAAA = _data_for_multiple @@ -331,9 +343,6 @@ class MythicBeastsProvider(BaseProvider): _ttl = int(match.group('ttl')) _value = match.group('value').strip() - if _type == 'TXT': - _value = _value.replace(';', '\\;') - if hasattr(self, '_data_for_{}'.format(_type)): if _name not in data[_type]: data[_type][_name] = { @@ -383,6 +392,11 @@ class MythicBeastsProvider(BaseProvider): base = '{} {} {} {}'.format(action, hostname, ttl, _type) + # Unescape TXT records + if _type == 'TXT': + values = [value.replace('\\;', ';') for value in values] + + # Handle specific types or default if _type == 'SSHFP': data = values[0].data commands.append('{} {} {} {}'.format( diff --git a/tests/test_octodns_provider_mythicbeasts.py b/tests/test_octodns_provider_mythicbeasts.py index 8181562..5acbc55 100644 --- a/tests/test_octodns_provider_mythicbeasts.py +++ b/tests/test_octodns_provider_mythicbeasts.py @@ -61,6 +61,18 @@ class TestMythicBeastsProvider(TestCase): self.assertTrue(isinstance(test_multiple, dict)) self.assertEquals(2, len(test_multiple['values'])) + def test_data_for_txt(self): + test_data = { + 'raw_values': [ + {'value': 'v=DKIM1; k=rsa; p=prawf', 'ttl': 60}, + {'value': 'prawf prawf dyma prawf', 'ttl': 300}], + 'zone': 'unit.tests.', + } + test_txt = MythicBeastsProvider._data_for_TXT('', test_data) + self.assertTrue(isinstance(test_txt, dict)) + self.assertEquals(2, len(test_txt['values'])) + self.assertEquals('v=DKIM1\\; k=rsa\\; p=prawf', test_txt['values'][0]) + def test_data_for_MX(self): test_data = { 'raw_values': [ @@ -193,6 +205,11 @@ class TestMythicBeastsProvider(TestCase): 'type': 'TXT', 'value': 'prawf prawf dyma prawf', })) + zone.add_record(Record.new(zone, 'prawf-txt2', { + 'ttl': 60, + 'type': 'TXT', + 'value': 'v=DKIM1\\; k=rsa\\; p=prawf', + })) with requests_mock() as mock: mock.post(ANY, status_code=200, text='') @@ -219,6 +236,7 @@ class TestMythicBeastsProvider(TestCase): 'ADD prawf-aaaa.unit.tests 60 AAAA b:b::b', 'ADD prawf-aaaa.unit.tests 60 AAAA c:c::c:c', 'ADD prawf-txt.unit.tests 60 TXT prawf prawf dyma prawf', + 'ADD prawf-txt2.unit.tests 60 TXT v=DKIM1; k=rsa; p=prawf', ] generated_commands.sort() @@ -231,6 +249,7 @@ class TestMythicBeastsProvider(TestCase): # Now test deletion existing = 'prawf-txt 300 TXT prawf prawf dyma prawf\n' \ + 'prawf-txt2 300 TXT v=DKIM1; k=rsa; p=prawf\n' \ 'prawf-a 60 A 1.2.3.4' with requests_mock() as mock: @@ -249,6 +268,7 @@ class TestMythicBeastsProvider(TestCase): expected_commands = [ 'DELETE prawf-a.unit.tests 60 A 1.2.3.4', 'DELETE prawf-txt.unit.tests 300 TXT prawf prawf dyma prawf', + 'DELETE prawf-txt2.unit.tests 300 TXT v=DKIM1; k=rsa; p=prawf', ] generated_commands.sort()