mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
Refactor thin Ns1Client wrapper out of provider
This commit is contained in:
@@ -19,6 +19,56 @@ from ..record import Record
|
||||
from .base import BaseProvider
|
||||
|
||||
|
||||
class Ns1Client(object):
|
||||
log = getLogger('NS1Client')
|
||||
|
||||
def __init__(self, api_key, retry_delay=1):
|
||||
self.retry_delay = retry_delay
|
||||
|
||||
client = NS1(apiKey=api_key)
|
||||
self._records = client.records()
|
||||
self._zones = client.zones()
|
||||
|
||||
def zones_retrieve(self, name):
|
||||
return self._zones.retrieve(name)
|
||||
|
||||
def zones_create(self, name):
|
||||
return self._zones.create(name)
|
||||
|
||||
def records_retrieve(self, zone, domain, _type):
|
||||
return self._records.retrieve(zone, domain, _type)
|
||||
|
||||
def records_create(self, zone, domain, _type, **params):
|
||||
try:
|
||||
return self._records.create(zone, domain, _type, **params)
|
||||
except RateLimitException as e:
|
||||
period = float(e.period)
|
||||
self.log.warn('_apply_Create: rate limit encountered, pausing '
|
||||
'for %ds and trying again', period)
|
||||
sleep(period)
|
||||
return self._records.create(zone, domain, _type, **params)
|
||||
|
||||
def records_update(self, zone, domain, _type, **params):
|
||||
try:
|
||||
return self._records.update(zone, domain, _type, **params)
|
||||
except RateLimitException as e:
|
||||
period = float(e.period)
|
||||
self.log.warn('_apply_Update: rate limit encountered, pausing '
|
||||
'for %ds and trying again', period)
|
||||
sleep(period)
|
||||
return self._records.update(zone, domain, _type, **params)
|
||||
|
||||
def records_delete(self, zone, domain, _type):
|
||||
try:
|
||||
return self._records.delete(zone, domain, _type)
|
||||
except RateLimitException as e:
|
||||
period = float(e.period)
|
||||
self.log.warn('_apply_Delete: rate limit encountered, pausing '
|
||||
'for %ds and trying again', period)
|
||||
sleep(period)
|
||||
return self._records.delete(zone, domain, _type)
|
||||
|
||||
|
||||
class Ns1Provider(BaseProvider):
|
||||
'''
|
||||
Ns1 provider
|
||||
@@ -34,13 +84,12 @@ class Ns1Provider(BaseProvider):
|
||||
|
||||
ZONE_NOT_FOUND_MESSAGE = 'server error: zone not found'
|
||||
|
||||
def __init__(self, id, api_key, *args, **kwargs):
|
||||
def __init__(self, id, api_key, retry_delay=1, *args, **kwargs):
|
||||
self.log = getLogger('Ns1Provider[{}]'.format(id))
|
||||
self.log.debug('__init__: id=%s, api_key=***', id)
|
||||
self.log.debug('__init__: id=%s, api_key=***, retry_delay=%d', id,
|
||||
retry_delay)
|
||||
super(Ns1Provider, self).__init__(id, *args, **kwargs)
|
||||
client = NS1(apiKey=api_key)
|
||||
self._records = client.records()
|
||||
self._zones = client.zones()
|
||||
self._client = Ns1Client(api_key, retry_delay)
|
||||
|
||||
def _data_for_A(self, _type, record):
|
||||
# record meta (which would include geo information is only
|
||||
@@ -192,7 +241,7 @@ class Ns1Provider(BaseProvider):
|
||||
|
||||
try:
|
||||
ns1_zone_name = zone.name[:-1]
|
||||
ns1_zone = self._zones.retrieve(ns1_zone_name)
|
||||
ns1_zone = self._client.zones_retrieve(ns1_zone_name)
|
||||
|
||||
records = []
|
||||
geo_records = []
|
||||
@@ -207,9 +256,9 @@ class Ns1Provider(BaseProvider):
|
||||
|
||||
if record.get('tier', 1) > 1:
|
||||
# Need to get the full record data for geo records
|
||||
record = self._records.retrieve(ns1_zone_name,
|
||||
record['domain'],
|
||||
record['type'])
|
||||
record = self._client.records_retrieve(ns1_zone_name,
|
||||
record['domain'],
|
||||
record['type'])
|
||||
geo_records.append(record)
|
||||
else:
|
||||
records.append(record)
|
||||
@@ -318,14 +367,7 @@ class Ns1Provider(BaseProvider):
|
||||
domain = new.fqdn[:-1]
|
||||
_type = new._type
|
||||
params = getattr(self, '_params_for_{}'.format(_type))(new)
|
||||
try:
|
||||
self._records.create(zone, domain, _type, **params)
|
||||
except RateLimitException as e:
|
||||
period = float(e.period)
|
||||
self.log.warn('_apply_Create: rate limit encountered, pausing '
|
||||
'for %ds and trying again', period)
|
||||
sleep(period)
|
||||
self._records.create(zone, domain, _type, **params)
|
||||
self._client.records_create(zone, domain, _type, **params)
|
||||
|
||||
def _apply_Update(self, ns1_zone, change):
|
||||
new = change.new
|
||||
@@ -333,28 +375,14 @@ class Ns1Provider(BaseProvider):
|
||||
domain = new.fqdn[:-1]
|
||||
_type = new._type
|
||||
params = getattr(self, '_params_for_{}'.format(_type))(new)
|
||||
try:
|
||||
self._records.update(zone, domain, _type, **params)
|
||||
except RateLimitException as e:
|
||||
period = float(e.period)
|
||||
self.log.warn('_apply_Update: rate limit encountered, pausing '
|
||||
'for %ds and trying again', period)
|
||||
sleep(period)
|
||||
self._records.update(zone, domain, _type, **params)
|
||||
self._client.records_update(zone, domain, _type, **params)
|
||||
|
||||
def _apply_Delete(self, ns1_zone, change):
|
||||
existing = change.existing
|
||||
zone = existing.zone.name[:-1]
|
||||
domain = existing.fqdn[:-1]
|
||||
_type = existing._type
|
||||
try:
|
||||
self._records.delete(zone, domain, _type)
|
||||
except RateLimitException as e:
|
||||
period = float(e.period)
|
||||
self.log.warn('_apply_Delete: rate limit encountered, pausing '
|
||||
'for %ds and trying again', period)
|
||||
sleep(period)
|
||||
self._records.delete(zone, domain, _type)
|
||||
self._client.records_delete(zone, domain, _type)
|
||||
|
||||
def _apply(self, plan):
|
||||
desired = plan.desired
|
||||
@@ -364,12 +392,12 @@ class Ns1Provider(BaseProvider):
|
||||
|
||||
domain_name = desired.name[:-1]
|
||||
try:
|
||||
ns1_zone = self._zones.retrieve(domain_name)
|
||||
ns1_zone = self._client.zones_retrieve(domain_name)
|
||||
except ResourceException as e:
|
||||
if e.message != self.ZONE_NOT_FOUND_MESSAGE:
|
||||
raise
|
||||
self.log.debug('_apply: no matching zone, creating')
|
||||
ns1_zone = self._zones.create(domain_name)
|
||||
ns1_zone = self._client.zones_create(domain_name)
|
||||
|
||||
for change in changes:
|
||||
class_name = change.__class__.__name__
|
||||
|
Reference in New Issue
Block a user