From 10452d1546e64e42c725ad837f0c2f27dc4e2028 Mon Sep 17 00:00:00 2001 From: Adam Smith Date: Sat, 2 Mar 2019 16:34:36 -0800 Subject: [PATCH] CloudflareProvider: unpack long SRV records correctly --- octodns/provider/cloudflare.py | 15 +++++- tests/test_octodns_provider_cloudflare.py | 58 +++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/octodns/provider/cloudflare.py b/octodns/provider/cloudflare.py index 430d59d..881c2fd 100644 --- a/octodns/provider/cloudflare.py +++ b/octodns/provider/cloudflare.py @@ -340,13 +340,24 @@ class CloudflareProvider(BaseProvider): } def _contents_for_SRV(self, record): - service, proto = record.name.split('.', 2) + try: + service, proto, subdomain = record.name.split('.', 2) + # We have a SRV in a sub-zone + except ValueError: + # We have a SRV in the zone + service, proto = record.name.split('.', 1) + subdomain = None + + name = record.zone.name + if subdomain: + name = subdomain + for value in record.values: yield { 'data': { 'service': service, 'proto': proto, - 'name': record.zone.name, + 'name': name, 'priority': value.priority, 'weight': value.weight, 'port': value.port, diff --git a/tests/test_octodns_provider_cloudflare.py b/tests/test_octodns_provider_cloudflare.py index f186309..25f2b58 100644 --- a/tests/test_octodns_provider_cloudflare.py +++ b/tests/test_octodns_provider_cloudflare.py @@ -509,6 +509,64 @@ class TestCloudflareProvider(TestCase): 'fc12ab34cd5611334422ab3322997653') ]) + def test_srv(self): + provider = CloudflareProvider('test', 'email', 'token') + + zone = Zone('unit.tests.', []) + # SRV record not under a sub-domain + srv_record = Record.new(zone, '_example._tcp', { + 'ttl': 300, + 'type': 'SRV', + 'value': { + 'port': 1234, + 'priority': 0, + 'target': 'nc.unit.tests.', + 'weight': 5 + } + }) + # SRV record under a sub-domain + srv_record_with_sub = Record.new(zone, '_example._tcp.sub', { + 'ttl': 300, + 'type': 'SRV', + 'value': { + 'port': 1234, + 'priority': 0, + 'target': 'nc.unit.tests.', + 'weight': 5 + } + }) + + srv_record_contents = provider._gen_data(srv_record) + srv_record_with_sub_contents = provider._gen_data(srv_record_with_sub) + self.assertEquals({ + 'name': '_example._tcp.unit.tests', + 'ttl': 300, + 'type': 'SRV', + 'data': { + 'service': '_example', + 'proto': '_tcp', + 'name': 'unit.tests.', + 'priority': 0, + 'weight': 5, + 'port': 1234, + 'target': 'nc.unit.tests' + } + }, list(srv_record_contents)[0]) + self.assertEquals({ + 'name': '_example._tcp.sub.unit.tests', + 'ttl': 300, + 'type': 'SRV', + 'data': { + 'service': '_example', + 'proto': '_tcp', + 'name': 'sub', + 'priority': 0, + 'weight': 5, + 'port': 1234, + 'target': 'nc.unit.tests' + } + }, list(srv_record_with_sub_contents)[0]) + def test_alias(self): provider = CloudflareProvider('test', 'email', 'token')