From c20f380bc39a72aa73ad6cb17c7e2e70265f5c43 Mon Sep 17 00:00:00 2001 From: John Lane Date: Mon, 10 Feb 2020 16:18:59 +0000 Subject: [PATCH 1/4] Support DNSimple sandbox An optional parameter 'sandbox' can be used to select the base URL for the Sandbox API (see https://developer.dnsimple.com/sandbox ). --- octodns/provider/dnsimple.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/octodns/provider/dnsimple.py b/octodns/provider/dnsimple.py index e3b0a20..bdb276e 100644 --- a/octodns/provider/dnsimple.py +++ b/octodns/provider/dnsimple.py @@ -30,13 +30,16 @@ class DnsimpleClientUnauthorized(DnsimpleClientException): class DnsimpleClient(object): - BASE = 'https://api.dnsimple.com/v2/' - def __init__(self, token, account): + def __init__(self, token, account, sandbox): self.account = account sess = Session() sess.headers.update({'Authorization': 'Bearer {}'.format(token)}) self._sess = sess + if sandbox: + self.BASE = 'https://api.sandbox.dnsimple.com/v2/' + else: + self.BASE = 'https://api.dnsimple.com/v2/' def _request(self, method, path, params=None, data=None): url = '{}{}{}'.format(self.BASE, self.account, path) @@ -89,17 +92,19 @@ class DnsimpleProvider(BaseProvider): token: letmein # Your account number (required) account: 42 + # Use sandbox (optional) + sandbox: true ''' SUPPORTS_GEO = False SUPPORTS_DYNAMIC = False SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CAA', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR', 'SPF', 'SRV', 'SSHFP', 'TXT')) - def __init__(self, id, token, account, *args, **kwargs): + def __init__(self, id, token, account, sandbox=False, *args, **kwargs): self.log = logging.getLogger('DnsimpleProvider[{}]'.format(id)) self.log.debug('__init__: id=%s, token=***, account=%s', id, account) super(DnsimpleProvider, self).__init__(id, *args, **kwargs) - self._client = DnsimpleClient(token, account) + self._client = DnsimpleClient(token, account, sandbox) self._zone_records = {} From 2d09a01c74994e5cdadbe7b3a9a720c26ab26893 Mon Sep 17 00:00:00 2001 From: John Lane Date: Mon, 10 Feb 2020 16:28:43 +0000 Subject: [PATCH 2/4] Tests for DNSimple sandbox --- tests/test_octodns_provider_dnsimple.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_octodns_provider_dnsimple.py b/tests/test_octodns_provider_dnsimple.py index e3a9b8d..2b0781a 100644 --- a/tests/test_octodns_provider_dnsimple.py +++ b/tests/test_octodns_provider_dnsimple.py @@ -38,6 +38,10 @@ class TestDnsimpleProvider(TestCase): break def test_populate(self): + + # Sandbox + provider = DnsimpleProvider('test', 'token', 42, 'true') + provider = DnsimpleProvider('test', 'token', 42) # Bad auth From 3d871a5bad15f699fe0ce0d51c6c2536c9eec8a4 Mon Sep 17 00:00:00 2001 From: John Lane Date: Mon, 10 Feb 2020 17:14:57 +0000 Subject: [PATCH 3/4] Improve test; downcase instance variable --- octodns/provider/dnsimple.py | 6 +++--- tests/test_octodns_provider_dnsimple.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/octodns/provider/dnsimple.py b/octodns/provider/dnsimple.py index bdb276e..f83098e 100644 --- a/octodns/provider/dnsimple.py +++ b/octodns/provider/dnsimple.py @@ -37,12 +37,12 @@ class DnsimpleClient(object): sess.headers.update({'Authorization': 'Bearer {}'.format(token)}) self._sess = sess if sandbox: - self.BASE = 'https://api.sandbox.dnsimple.com/v2/' + self.base = 'https://api.sandbox.dnsimple.com/v2/' else: - self.BASE = 'https://api.dnsimple.com/v2/' + self.base = 'https://api.dnsimple.com/v2/' def _request(self, method, path, params=None, data=None): - url = '{}{}{}'.format(self.BASE, self.account, path) + url = '{}{}{}'.format(self.base, self.account, path) resp = self._sess.request(method, url, params=params, json=data) if resp.status_code == 401: raise DnsimpleClientUnauthorized() diff --git a/tests/test_octodns_provider_dnsimple.py b/tests/test_octodns_provider_dnsimple.py index 2b0781a..975cb26 100644 --- a/tests/test_octodns_provider_dnsimple.py +++ b/tests/test_octodns_provider_dnsimple.py @@ -41,6 +41,7 @@ class TestDnsimpleProvider(TestCase): # Sandbox provider = DnsimpleProvider('test', 'token', 42, 'true') + self.assertTrue('sandbox' in provider._client.base) provider = DnsimpleProvider('test', 'token', 42) From b16f54d0842acf0001685dbf21c0f00819da7b7c Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Mon, 10 Feb 2020 09:18:52 -0800 Subject: [PATCH 4/4] Makes sure !sandbox on a normal provider. --- tests/test_octodns_provider_dnsimple.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_octodns_provider_dnsimple.py b/tests/test_octodns_provider_dnsimple.py index 975cb26..b918962 100644 --- a/tests/test_octodns_provider_dnsimple.py +++ b/tests/test_octodns_provider_dnsimple.py @@ -44,6 +44,7 @@ class TestDnsimpleProvider(TestCase): self.assertTrue('sandbox' in provider._client.base) provider = DnsimpleProvider('test', 'token', 42) + self.assertFalse('sandbox' in provider._client.base) # Bad auth with requests_mock() as mock: