1
0
mirror of https://github.com/github/octodns.git synced 2024-05-11 05:55:00 +00:00

Rework TransipProvider to support mocking and avoid network calls during __init__

This commit is contained in:
Ross McFarland
2021-09-02 10:03:39 -07:00
parent c878ec6eee
commit 2efb550686
2 changed files with 30 additions and 15 deletions

View File

@@ -57,26 +57,38 @@ class TransipProvider(BaseProvider):
TIMEOUT = 15
ROOT_RECORD = '@'
def __init__(self, id, account, key=None, key_file=None, *args, **kwargs):
def __init__(self, id, account, key=None, key_file=None, *args, **kwargs):
self.log = getLogger('TransipProvider[{}]'.format(id))
self.log.debug('__init__: id=%s, account=%s, token=***', id,
account)
super(TransipProvider, self).__init__(id, *args, **kwargs)
if key_file is not None:
self._client = DomainService(account, private_key_file=key_file)
elif key is not None:
self._client = DomainService(account, private_key=key)
else:
if key is None and key_file is None:
raise TransipConfigException(
'Missing `key` of `key_file` parameter in config'
'Missing `key` or `key_file` parameter in config'
)
self.account = account
self.key = key
self.key_file = key_file
self._client = None
self._currentZone = {}
@property
def client(self):
# This can't happen in __init__ b/c it makes network calls during the
# construction of the object and that before the tests have had a
# chance to install the mock client
if self._client is None:
if self.key_file is not None:
self._client = DomainService(self.account,
private_key_file=self.key_file)
else: # we checked key in __init__ so can assume it's not None
self._client = DomainService(self.account,
private_key=self.key)
return self._client
def populate(self, zone, target=False, lenient=False):
exists = False
@@ -86,7 +98,7 @@ class TransipProvider(BaseProvider):
before = len(zone.records)
try:
zoneInfo = self._client.get_info(zone.name[:-1])
zoneInfo = self.client.get_info(zone.name[:-1])
except WebFault as e:
if e.fault.faultcode == '102' and target is False:
# Zone not found in account, and not a target so just
@@ -136,7 +148,7 @@ class TransipProvider(BaseProvider):
self._currentZone = plan.desired
try:
self._client.get_info(plan.desired.name[:-1])
self.client.get_info(plan.desired.name[:-1])
except WebFault as e:
self.log.exception('_apply: get_info failed')
raise e
@@ -155,7 +167,7 @@ class TransipProvider(BaseProvider):
_dns_entries.extend(entries_for(name, record))
try:
self._client.set_dns_entries(plan.desired.name[:-1], _dns_entries)
self.client.set_dns_entries(plan.desired.name[:-1], _dns_entries)
except WebFault as e:
self.log.warning(('_apply: Set DNS returned ' +
'one or more errors: {}').format(

View File

@@ -15,7 +15,6 @@ from unittest import TestCase
from octodns.provider.transip import TransipProvider
from octodns.provider.yaml import YamlProvider
from octodns.zone import Zone
from transip.service.domain import DomainService
from transip.service.objects import DnsEntry
@@ -32,12 +31,11 @@ class MockResponse(object):
dnsEntries = []
class MockDomainService(DomainService):
class MockDomainService(object):
def __init__(self, *args, **kwargs):
super(MockDomainService, self).__init__('MockDomainService', *args,
**kwargs)
self.mockupEntries = []
self.throw_auth_fault = False
def mockup(self, records):
@@ -67,6 +65,9 @@ class MockDomainService(DomainService):
# Skips authentication layer and returns the entries loaded by "Mockup"
def get_info(self, domain_name):
if self.throw_auth_fault:
self.raiseInvalidAuth()
# Special 'domain' to trigger error
if str(domain_name) == str('notfound.unit.tests'):
self.raiseZoneNotFound()
@@ -140,7 +141,7 @@ N4OiVz1I3rbZGYa396lpxO6ku8yCglisL1yrSP6DdEUp66ntpKVd
TransipProvider('test', 'unittest')
self.assertEquals(
str('Missing `key` of `key_file` parameter in config'),
str('Missing `key` or `key_file` parameter in config'),
str(ctx.exception))
TransipProvider('test', 'unittest', key=self.bogus_key)
@@ -155,6 +156,8 @@ N4OiVz1I3rbZGYa396lpxO6ku8yCglisL1yrSP6DdEUp66ntpKVd
# Live test against API, will fail in an unauthorized error
with self.assertRaises(WebFault) as ctx:
provider = TransipProvider('test', 'unittest', self.bogus_key)
provider._client = MockDomainService('unittest', self.bogus_key)
provider._client.throw_auth_fault = True
zone = Zone('unit.tests.', [])
provider.populate(zone, True)