Browse Source

Switch to an explicit SUPPORTS setup

pull/72/head
Ross McFarland 9 years ago
parent
commit
852c101388
11 changed files with 32 additions and 16 deletions
  1. +2
    -5
      octodns/provider/cloudflare.py
  2. +2
    -0
      octodns/provider/dnsimple.py
  3. +2
    -0
      octodns/provider/dyn.py
  4. +3
    -3
      octodns/provider/ns1.py
  5. +2
    -0
      octodns/provider/powerdns.py
  6. +2
    -3
      octodns/provider/route53.py
  7. +2
    -0
      octodns/provider/yaml.py
  8. +4
    -3
      octodns/source/base.py
  9. +1
    -0
      octodns/source/tinydns.py
  10. +1
    -0
      tests/helpers.py
  11. +11
    -2
      tests/test_octodns_provider_base.py

+ 2
- 5
octodns/provider/cloudflare.py View File

@ -36,7 +36,7 @@ class CloudflareProvider(BaseProvider):
''' '''
SUPPORTS_GEO = False SUPPORTS_GEO = False
# TODO: support SRV # TODO: support SRV
UNSUPPORTED_TYPES = ('ALIAS', 'NAPTR', 'PTR', 'SOA', 'SRV', 'SSHFP')
SUPPORTS = set(('A', 'AAAA', 'CNAME', 'MX', 'NS', 'SPF', 'TXT'))
MIN_TTL = 120 MIN_TTL = 120
TIMEOUT = 15 TIMEOUT = 15
@ -56,9 +56,6 @@ class CloudflareProvider(BaseProvider):
self._zones = None self._zones = None
self._zone_records = {} self._zone_records = {}
def supports(self, record):
return record._type not in self.UNSUPPORTED_TYPES
def _request(self, method, path, params=None, data=None): def _request(self, method, path, params=None, data=None):
self.log.debug('_request: method=%s, path=%s', method, path) self.log.debug('_request: method=%s, path=%s', method, path)
@ -167,7 +164,7 @@ class CloudflareProvider(BaseProvider):
for record in records: for record in records:
name = zone.hostname_from_fqdn(record['name']) name = zone.hostname_from_fqdn(record['name'])
_type = record['type'] _type = record['type']
if _type not in self.UNSUPPORTED_TYPES:
if _type in self.SUPPORTS:
values[name][record['type']].append(record) values[name][record['type']].append(record)
for name, types in values.items(): for name, types in values.items():


+ 2
- 0
octodns/provider/dnsimple.py View File

@ -91,6 +91,8 @@ class DnsimpleProvider(BaseProvider):
account: 42 account: 42
''' '''
SUPPORTS_GEO = False SUPPORTS_GEO = False
SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR',
'SPF', 'SRV', 'SSHFP', 'TXT'))
def __init__(self, id, token, account, *args, **kwargs): def __init__(self, id, token, account, *args, **kwargs):
self.log = logging.getLogger('DnsimpleProvider[{}]'.format(id)) self.log = logging.getLogger('DnsimpleProvider[{}]'.format(id))


+ 2
- 0
octodns/provider/dyn.py View File

@ -106,6 +106,7 @@ class DynProvider(BaseProvider):
than one account active at a time. See DynProvider._check_dyn_sess for some than one account active at a time. See DynProvider._check_dyn_sess for some
related bits. related bits.
''' '''
RECORDS_TO_TYPE = { RECORDS_TO_TYPE = {
'a_records': 'A', 'a_records': 'A',
'aaaa_records': 'AAAA', 'aaaa_records': 'AAAA',
@ -121,6 +122,7 @@ class DynProvider(BaseProvider):
'txt_records': 'TXT', 'txt_records': 'TXT',
} }
TYPE_TO_RECORDS = {v: k for k, v in RECORDS_TO_TYPE.items()} TYPE_TO_RECORDS = {v: k for k, v in RECORDS_TO_TYPE.items()}
SUPPORTS = set(TYPE_TO_RECORDS.keys())
# https://help.dyn.com/predefined-geotm-regions-groups/ # https://help.dyn.com/predefined-geotm-regions-groups/
REGION_CODES = { REGION_CODES = {


+ 3
- 3
octodns/provider/ns1.py View File

@ -22,6 +22,9 @@ class Ns1Provider(BaseProvider):
api_key: env/NS1_API_KEY api_key: env/NS1_API_KEY
''' '''
SUPPORTS_GEO = False SUPPORTS_GEO = False
SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR',
'SPF', 'SRV', 'TXT'))
ZONE_NOT_FOUND_MESSAGE = 'server error: zone not found' ZONE_NOT_FOUND_MESSAGE = 'server error: zone not found'
def __init__(self, id, api_key, *args, **kwargs): def __init__(self, id, api_key, *args, **kwargs):
@ -30,9 +33,6 @@ class Ns1Provider(BaseProvider):
super(Ns1Provider, self).__init__(id, *args, **kwargs) super(Ns1Provider, self).__init__(id, *args, **kwargs)
self._client = NSONE(apiKey=api_key) self._client = NSONE(apiKey=api_key)
def supports(self, record):
return record._type != 'SSHFP'
def _data_for_A(self, _type, record): def _data_for_A(self, _type, record):
return { return {
'ttl': record['ttl'], 'ttl': record['ttl'],


+ 2
- 0
octodns/provider/powerdns.py View File

@ -14,6 +14,8 @@ from .base import BaseProvider
class PowerDnsBaseProvider(BaseProvider): class PowerDnsBaseProvider(BaseProvider):
SUPPORTS_GEO = False SUPPORTS_GEO = False
SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR',
'SPF', 'SSHFP', 'SRV', 'TXT'))
TIMEOUT = 5 TIMEOUT = 5
def __init__(self, id, host, api_key, port=8081, *args, **kwargs): def __init__(self, id, host, api_key, port=8081, *args, **kwargs):


+ 2
- 3
octodns/provider/route53.py View File

@ -220,6 +220,8 @@ class Route53Provider(BaseProvider):
In general the account used will need full permissions on Route53. In general the account used will need full permissions on Route53.
''' '''
SUPPORTS_GEO = True SUPPORTS_GEO = True
SUPPORTS = set(('A', 'AAAA', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR', 'SPF',
'SRV', 'TXT'))
# This should be bumped when there are underlying changes made to the # This should be bumped when there are underlying changes made to the
# health check config. # health check config.
@ -239,9 +241,6 @@ class Route53Provider(BaseProvider):
self._r53_rrsets = {} self._r53_rrsets = {}
self._health_checks = None self._health_checks = None
def supports(self, record):
return record._type not in ('ALIAS', 'SSHFP')
@property @property
def r53_zones(self): def r53_zones(self):
if self._r53_zones is None: if self._r53_zones is None:


+ 2
- 0
octodns/provider/yaml.py View File

@ -31,6 +31,8 @@ class YamlProvider(BaseProvider):
enforce_order: True enforce_order: True
''' '''
SUPPORTS_GEO = True SUPPORTS_GEO = True
SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR',
'SSHFP', 'SPF', 'SRV', 'TXT'))
def __init__(self, id, directory, default_ttl=3600, enforce_order=True, def __init__(self, id, directory, default_ttl=3600, enforce_order=True,
*args, **kwargs): *args, **kwargs):


+ 4
- 3
octodns/source/base.py View File

@ -16,6 +16,9 @@ class BaseSource(object):
if not hasattr(self, 'SUPPORTS_GEO'): if not hasattr(self, 'SUPPORTS_GEO'):
raise NotImplementedError('Abstract base class, SUPPORTS_GEO ' raise NotImplementedError('Abstract base class, SUPPORTS_GEO '
'property missing') 'property missing')
if not hasattr(self, 'SUPPORTS'):
raise NotImplementedError('Abstract base class, SUPPORTS '
'property missing')
def populate(self, zone, target=False): def populate(self, zone, target=False):
''' '''
@ -25,9 +28,7 @@ class BaseSource(object):
'missing') 'missing')
def supports(self, record): def supports(self, record):
# Unless overriden and handled appropriaitely we'll assume that all
# record types are supported
return True
return record._type in self.SUPPORTS
def __repr__(self): def __repr__(self):
return self.__class__.__name__ return self.__class__.__name__

+ 1
- 0
octodns/source/tinydns.py View File

@ -19,6 +19,7 @@ from .base import BaseSource
class TinyDnsBaseSource(BaseSource): class TinyDnsBaseSource(BaseSource):
SUPPORTS_GEO = False SUPPORTS_GEO = False
SUPPORTS = set(('A', 'CNAME', 'MX', 'NS'))
split_re = re.compile(r':+') split_re = re.compile(r':+')


+ 1
- 0
tests/helpers.py View File

@ -17,6 +17,7 @@ class SimpleSource(object):
class SimpleProvider(object): class SimpleProvider(object):
SUPPORTS_GEO = False SUPPORTS_GEO = False
SUPPORTS = set(('A',))
def __init__(self, id='test'): def __init__(self, id='test'):
pass pass


+ 11
- 2
tests/test_octodns_provider_base.py View File

@ -16,6 +16,8 @@ from octodns.zone import Zone
class HelperProvider(BaseProvider): class HelperProvider(BaseProvider):
log = getLogger('HelperProvider') log = getLogger('HelperProvider')
SUPPORTS = set(('A',))
def __init__(self, extra_changes, apply_disabled=False, def __init__(self, extra_changes, apply_disabled=False,
include_change_callback=None): include_change_callback=None):
self.__extra_changes = extra_changes self.__extra_changes = extra_changes
@ -58,10 +60,17 @@ class TestBaseProvider(TestCase):
zone = Zone('unit.tests.', []) zone = Zone('unit.tests.', [])
with self.assertRaises(NotImplementedError) as ctx: with self.assertRaises(NotImplementedError) as ctx:
HasSupportsGeo('hassupportesgeo').populate(zone) HasSupportsGeo('hassupportesgeo').populate(zone)
self.assertEquals('Abstract base class, SUPPORTS property missing',
ctx.exception.message)
class HasSupports(HasSupportsGeo):
SUPPORTS = set(('A',))
with self.assertRaises(NotImplementedError) as ctx:
HasSupports('hassupportes').populate(zone)
self.assertEquals('Abstract base class, populate method missing', self.assertEquals('Abstract base class, populate method missing',
ctx.exception.message) ctx.exception.message)
class HasPopulate(HasSupportsGeo):
class HasPopulate(HasSupports):
def populate(self, zone, target=False): def populate(self, zone, target=False):
zone.add_record(Record.new(zone, '', { zone.add_record(Record.new(zone, '', {
@ -81,7 +90,7 @@ class TestBaseProvider(TestCase):
'value': '1.2.3.4' 'value': '1.2.3.4'
})) }))
self.assertTrue(HasSupportsGeo('hassupportesgeo')
self.assertTrue(HasSupports('hassupportesgeo')
.supports(list(zone.records)[0])) .supports(list(zone.records)[0]))
plan = HasPopulate('haspopulate').plan(zone) plan = HasPopulate('haspopulate').plan(zone)


Loading…
Cancel
Save