From 74a13e4a196c367f08da8dea86fa76f2f21a1f0c Mon Sep 17 00:00:00 2001 From: Daniel Weissengruber Date: Mon, 18 May 2020 11:17:40 +0200 Subject: [PATCH] Cloudflare: Add Support for PTR Records --- README.md | 4 ++- octodns/provider/cloudflare.py | 7 +++-- .../cloudflare-dns_records-page-1.json | 2 +- .../cloudflare-dns_records-page-2.json | 21 +++++++++++-- tests/test_octodns_provider_cloudflare.py | 31 +++++++++++++++---- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index c2983fd..ce9be86 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ It is similar to [Netflix/denominator](https://github.com/Netflix/denominator). ## Table of Contents +- [DNS as code - Tools for managing DNS across multiple providers](#dns-as-code---tools-for-managing-dns-across-multiple-providers) +- [Table of Contents](#table-of-contents) - [Getting started](#getting-started) - [Workspace](#workspace) - [Config](#config) @@ -178,7 +180,7 @@ The above command pulled the existing data out of Route53 and placed the results |--|--|--|--|--| | [AzureProvider](/octodns/provider/azuredns.py) | azure-mgmt-dns | A, AAAA, CAA, CNAME, MX, NS, PTR, SRV, TXT | No | | | [Akamai](/octodns/provider/edgedns.py) | edgegrid-python | A, AAAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, SSHFP, TXT | No | | -| [CloudflareProvider](/octodns/provider/cloudflare.py) | | A, AAAA, ALIAS, CAA, CNAME, MX, NS, SPF, SRV, TXT | No | CAA tags restricted | +| [CloudflareProvider](/octodns/provider/cloudflare.py) | | A, AAAA, ALIAS, CAA, CNAME, MX, NS, PTR, SPF, SRV, TXT | No | CAA tags restricted | | [ConstellixProvider](/octodns/provider/constellix.py) | | A, AAAA, ALIAS (ANAME), CAA, CNAME, MX, NS, PTR, SPF, SRV, TXT | No | CAA tags restricted | | [DigitalOceanProvider](/octodns/provider/digitalocean.py) | | A, AAAA, CAA, CNAME, MX, NS, TXT, SRV | No | CAA tags restricted | | [DnsMadeEasyProvider](/octodns/provider/dnsmadeeasy.py) | | A, AAAA, ALIAS (ANAME), CAA, CNAME, MX, NS, PTR, SPF, SRV, TXT | No | CAA tags restricted | diff --git a/octodns/provider/cloudflare.py b/octodns/provider/cloudflare.py index e52771c..e38177e 100644 --- a/octodns/provider/cloudflare.py +++ b/octodns/provider/cloudflare.py @@ -60,8 +60,8 @@ class CloudflareProvider(BaseProvider): ''' SUPPORTS_GEO = False SUPPORTS_DYNAMIC = False - SUPPORTS = set(('ALIAS', 'A', 'AAAA', 'CAA', 'CNAME', 'MX', 'NS', 'SRV', - 'SPF', 'TXT')) + SUPPORTS = set(('ALIAS', 'A', 'AAAA', 'CAA', 'CNAME', 'MX', 'NS', 'PTR', + 'SRV', 'SPF', 'TXT')) MIN_TTL = 120 TIMEOUT = 15 @@ -173,6 +173,7 @@ class CloudflareProvider(BaseProvider): } _data_for_ALIAS = _data_for_CNAME + _data_for_PTR = _data_for_CNAME def _data_for_MX(self, _type, records): values = [] @@ -339,6 +340,8 @@ class CloudflareProvider(BaseProvider): def _contents_for_CNAME(self, record): yield {'content': record.value} + _contents_for_PTR = _contents_for_CNAME + def _contents_for_MX(self, record): for value in record.values: yield { diff --git a/tests/fixtures/cloudflare-dns_records-page-1.json b/tests/fixtures/cloudflare-dns_records-page-1.json index 3c423e2..efe0654 100644 --- a/tests/fixtures/cloudflare-dns_records-page-1.json +++ b/tests/fixtures/cloudflare-dns_records-page-1.json @@ -180,7 +180,7 @@ "per_page": 10, "total_pages": 2, "count": 10, - "total_count": 19 + "total_count": 20 }, "success": true, "errors": [], diff --git a/tests/fixtures/cloudflare-dns_records-page-2.json b/tests/fixtures/cloudflare-dns_records-page-2.json index 558aa2c..b0bbaef 100644 --- a/tests/fixtures/cloudflare-dns_records-page-2.json +++ b/tests/fixtures/cloudflare-dns_records-page-2.json @@ -157,6 +157,23 @@ "auto_added": false } }, + { + "id": "fc12ab34cd5611334422ab3322997677", + "type": "PTR", + "name": "ptr.unit.tests", + "content": "foo.bar.com", + "proxiable": true, + "proxied": false, + "ttl": 300, + "locked": false, + "zone_id": "ff12ab34cd5611334422ab3322997650", + "zone_name": "unit.tests", + "modified_on": "2017-03-11T18:01:43.940682Z", + "created_on": "2017-03-11T18:01:43.940682Z", + "meta": { + "auto_added": false + } + }, { "id": "fc12ab34cd5611334422ab3322997656", "type": "SRV", @@ -212,8 +229,8 @@ "page": 2, "per_page": 11, "total_pages": 2, - "count": 9, - "total_count": 21 + "count": 10, + "total_count": 20 }, "success": true, "errors": [], diff --git a/tests/test_octodns_provider_cloudflare.py b/tests/test_octodns_provider_cloudflare.py index 5bcf25f..d1069eb 100644 --- a/tests/test_octodns_provider_cloudflare.py +++ b/tests/test_octodns_provider_cloudflare.py @@ -149,7 +149,7 @@ class TestCloudflareProvider(TestCase): zone = Zone('unit.tests.', []) provider.populate(zone) - self.assertEquals(12, len(zone.records)) + self.assertEquals(13, len(zone.records)) changes = self.expected.changes(zone, provider) @@ -158,7 +158,7 @@ class TestCloudflareProvider(TestCase): # re-populating the same zone/records comes out of cache, no calls again = Zone('unit.tests.', []) provider.populate(again) - self.assertEquals(12, len(again.records)) + self.assertEquals(13, len(again.records)) def test_apply(self): provider = CloudflareProvider('test', 'email', 'token') @@ -172,12 +172,12 @@ class TestCloudflareProvider(TestCase): 'id': 42, } }, # zone create - ] + [None] * 20 # individual record creates + ] + [None] * 22 # individual record creates # non-existent zone, create everything plan = provider.plan(self.expected) - self.assertEquals(12, len(plan.changes)) - self.assertEquals(12, provider.apply(plan)) + self.assertEquals(13, len(plan.changes)) + self.assertEquals(13, provider.apply(plan)) self.assertFalse(plan.exists) provider._request.assert_has_calls([ @@ -203,7 +203,7 @@ class TestCloudflareProvider(TestCase): }), ], True) # expected number of total calls - self.assertEquals(22, provider._request.call_count) + self.assertEquals(23, provider._request.call_count) provider._request.reset_mock() @@ -510,6 +510,25 @@ class TestCloudflareProvider(TestCase): 'fc12ab34cd5611334422ab3322997653') ]) + def test_ptr(self): + provider = CloudflareProvider('test', 'email', 'token') + + zone = Zone('unit.tests.', []) + # PTR record + ptr_record = Record.new(zone, 'ptr', { + 'ttl': 300, + 'type': 'PTR', + 'value': 'foo.bar.com.' + }) + + ptr_record_contents = provider._gen_data(ptr_record) + self.assertEquals({ + 'name': 'ptr.unit.tests', + 'ttl': 300, + 'type': 'PTR', + 'content': 'foo.bar.com.' + }, list(ptr_record_contents)[0]) + def test_srv(self): provider = CloudflareProvider('test', 'email', 'token')