diff --git a/octodns/provider/ns1.py b/octodns/provider/ns1.py index 2f0a024..3b8ad00 100644 --- a/octodns/provider/ns1.py +++ b/octodns/provider/ns1.py @@ -7,7 +7,8 @@ from __future__ import absolute_import, division, print_function, \ from logging import getLogger from nsone import NSONE -from nsone.rest.errors import ResourceException +from nsone.rest.errors import RateLimitException, ResourceException +from time import sleep from ..record import Record from .base import BaseProvider @@ -25,6 +26,7 @@ class Ns1Provider(BaseProvider): SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR', 'SPF', 'SRV', 'TXT')) + RATE_LIMIT_DELAY = 1 ZONE_NOT_FOUND_MESSAGE = 'server error: zone not found' def __init__(self, id, api_key, *args, **kwargs): @@ -171,7 +173,14 @@ class Ns1Provider(BaseProvider): name = self._get_name(new) _type = new._type params = getattr(self, '_params_for_{}'.format(_type))(new) - getattr(nsone_zone, 'add_{}'.format(_type))(name, **params) + meth = getattr(nsone_zone, 'add_{}'.format(_type)) + try: + meth(name, **params) + except RateLimitException: + self.log.warn('_apply_Create: rate limit encountered, pausing ' + 'and trying again') + sleep(self.RATE_LIMIT_DELAY) + meth(name, **params) def _apply_Update(self, nsone_zone, change): existing = change.existing @@ -180,14 +189,26 @@ class Ns1Provider(BaseProvider): record = nsone_zone.loadRecord(name, _type) new = change.new params = getattr(self, '_params_for_{}'.format(_type))(new) - record.update(**params) + try: + record.update(**params) + except RateLimitException: + self.log.warn('_apply_Update: rate limit encountered, pausing ' + 'and trying again') + sleep(self.RATE_LIMIT_DELAY) + record.update(**params) def _apply_Delete(self, nsone_zone, change): existing = change.existing name = self._get_name(existing) _type = existing._type record = nsone_zone.loadRecord(name, _type) - record.delete() + try: + record.delete() + except RateLimitException: + self.log.warn('_apply_Delete: rate limit encountered, pausing ' + 'and trying again') + sleep(self.RATE_LIMIT_DELAY) + record.delete() def _apply(self, plan): desired = plan.desired diff --git a/requirements.txt b/requirements.txt index b10ca4c..93a8521 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ incf.countryutils==1.0 ipaddress==1.0.18 jmespath==0.9.0 natsort==5.0.3 -nsone==0.9.10 +nsone==0.9.14 python-dateutil==2.6.0 requests==2.13.0 s3transfer==0.1.10