Browse Source

Rework TransipProvider to support mocking and avoid network calls during __init__

pull/769/head
Ross McFarland 4 years ago
parent
commit
2efb550686
No known key found for this signature in database GPG Key ID: 943B179E15D3B22A
2 changed files with 30 additions and 15 deletions
  1. +22
    -10
      octodns/provider/transip.py
  2. +8
    -5
      tests/test_octodns_provider_transip.py

+ 22
- 10
octodns/provider/transip.py View File

@ -57,26 +57,38 @@ class TransipProvider(BaseProvider):
TIMEOUT = 15 TIMEOUT = 15
ROOT_RECORD = '@' 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 = getLogger('TransipProvider[{}]'.format(id))
self.log.debug('__init__: id=%s, account=%s, token=***', id, self.log.debug('__init__: id=%s, account=%s, token=***', id,
account) account)
super(TransipProvider, self).__init__(id, *args, **kwargs) 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( raise TransipConfigException(
'Missing `key` of `key_file` parameter in config'
'Missing `key` or `key_file` parameter in config'
) )
self.account = account self.account = account
self.key = key self.key = key
self.key_file = key_file
self._client = None
self._currentZone = {} 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): def populate(self, zone, target=False, lenient=False):
exists = False exists = False
@ -86,7 +98,7 @@ class TransipProvider(BaseProvider):
before = len(zone.records) before = len(zone.records)
try: try:
zoneInfo = self._client.get_info(zone.name[:-1])
zoneInfo = self.client.get_info(zone.name[:-1])
except WebFault as e: except WebFault as e:
if e.fault.faultcode == '102' and target is False: if e.fault.faultcode == '102' and target is False:
# Zone not found in account, and not a target so just # Zone not found in account, and not a target so just
@ -136,7 +148,7 @@ class TransipProvider(BaseProvider):
self._currentZone = plan.desired self._currentZone = plan.desired
try: try:
self._client.get_info(plan.desired.name[:-1])
self.client.get_info(plan.desired.name[:-1])
except WebFault as e: except WebFault as e:
self.log.exception('_apply: get_info failed') self.log.exception('_apply: get_info failed')
raise e raise e
@ -155,7 +167,7 @@ class TransipProvider(BaseProvider):
_dns_entries.extend(entries_for(name, record)) _dns_entries.extend(entries_for(name, record))
try: 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: except WebFault as e:
self.log.warning(('_apply: Set DNS returned ' + self.log.warning(('_apply: Set DNS returned ' +
'one or more errors: {}').format( 'one or more errors: {}').format(


+ 8
- 5
tests/test_octodns_provider_transip.py View File

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


Loading…
Cancel
Save