Browse Source

implement & use NS1Client.reset_caches

pull/760/head
Ross McFarland 4 years ago
parent
commit
9522da210d
No known key found for this signature in database GPG Key ID: 943B179E15D3B22A
2 changed files with 28 additions and 1 deletions
  1. +3
    -1
      octodns/provider/ns1.py
  2. +25
    -0
      tests/test_octodns_provider_ns1.py

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

@ -80,8 +80,10 @@ class Ns1Client(object):
self._datasource = client.datasource() self._datasource = client.datasource()
self._datafeed = client.datafeed() self._datafeed = client.datafeed()
self._datasource_id = None
self.reset_caches()
def reset_caches(self):
self._datasource_id = None
self._feeds_for_monitors = None self._feeds_for_monitors = None
self._monitors_cache = None self._monitors_cache = None
self._notifylists_cache = None self._notifylists_cache = None


+ 25
- 0
tests/test_octodns_provider_ns1.py View File

@ -198,6 +198,7 @@ class TestNs1Provider(TestCase):
provider = Ns1Provider('test', 'api-key') provider = Ns1Provider('test', 'api-key')
# Bad auth # Bad auth
provider._client.reset_caches()
zone_retrieve_mock.side_effect = AuthException('unauthorized') zone_retrieve_mock.side_effect = AuthException('unauthorized')
zone = Zone('unit.tests.', []) zone = Zone('unit.tests.', [])
with self.assertRaises(AuthException) as ctx: with self.assertRaises(AuthException) as ctx:
@ -205,6 +206,7 @@ class TestNs1Provider(TestCase):
self.assertEquals(zone_retrieve_mock.side_effect, ctx.exception) self.assertEquals(zone_retrieve_mock.side_effect, ctx.exception)
# General error # General error
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
zone_retrieve_mock.side_effect = ResourceException('boom') zone_retrieve_mock.side_effect = ResourceException('boom')
zone = Zone('unit.tests.', []) zone = Zone('unit.tests.', [])
@ -214,6 +216,7 @@ class TestNs1Provider(TestCase):
self.assertEquals(('unit.tests',), zone_retrieve_mock.call_args[0]) self.assertEquals(('unit.tests',), zone_retrieve_mock.call_args[0])
# Non-existent zone doesn't populate anything # Non-existent zone doesn't populate anything
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
zone_retrieve_mock.side_effect = \ zone_retrieve_mock.side_effect = \
ResourceException('server error: zone not found') ResourceException('server error: zone not found')
@ -224,6 +227,7 @@ class TestNs1Provider(TestCase):
self.assertFalse(exists) self.assertFalse(exists)
# Existing zone w/o records # Existing zone w/o records
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock() record_retrieve_mock.reset_mock()
ns1_zone = { ns1_zone = {
@ -255,6 +259,7 @@ class TestNs1Provider(TestCase):
'geo.unit.tests', 'A')]) 'geo.unit.tests', 'A')])
# Existing zone w/records # Existing zone w/records
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock() record_retrieve_mock.reset_mock()
ns1_zone = { ns1_zone = {
@ -286,6 +291,7 @@ class TestNs1Provider(TestCase):
'geo.unit.tests', 'A')]) 'geo.unit.tests', 'A')])
# Test skipping unsupported record type # Test skipping unsupported record type
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock() record_retrieve_mock.reset_mock()
ns1_zone = { ns1_zone = {
@ -341,6 +347,7 @@ class TestNs1Provider(TestCase):
self.assertTrue(plan.exists) self.assertTrue(plan.exists)
# Fails, general error # Fails, general error
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock() record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock() zone_create_mock.reset_mock()
@ -350,6 +357,7 @@ class TestNs1Provider(TestCase):
self.assertEquals(zone_retrieve_mock.side_effect, ctx.exception) self.assertEquals(zone_retrieve_mock.side_effect, ctx.exception)
# Fails, bad auth # Fails, bad auth
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock() record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock() zone_create_mock.reset_mock()
@ -361,6 +369,7 @@ class TestNs1Provider(TestCase):
self.assertEquals(zone_create_mock.side_effect, ctx.exception) self.assertEquals(zone_create_mock.side_effect, ctx.exception)
# non-existent zone, create # non-existent zone, create
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock() record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock() zone_create_mock.reset_mock()
@ -395,6 +404,7 @@ class TestNs1Provider(TestCase):
]) ])
# Update & delete # Update & delete
provider._client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock() record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock() zone_create_mock.reset_mock()
@ -1304,6 +1314,7 @@ class TestNs1ProviderDynamic(TestCase):
# provider._params_for_A() calls provider._monitors_for() and # provider._params_for_A() calls provider._monitors_for() and
# provider._monitor_sync(). Mock their return values so that we don't # provider._monitor_sync(). Mock their return values so that we don't
# make NS1 API calls during tests # make NS1 API calls during tests
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
monitor_sync_mock.reset_mock() monitor_sync_mock.reset_mock()
monitors_for_mock.side_effect = [{ monitors_for_mock.side_effect = [{
@ -1944,6 +1955,7 @@ class TestNs1ProviderDynamic(TestCase):
monitors_for_mock.assert_not_called() monitors_for_mock.assert_not_called()
# Non-existent zone. No changes # Non-existent zone. No changes
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.side_effect = \ zones_retrieve_mock.side_effect = \
ResourceException('server error: zone not found') ResourceException('server error: zone not found')
@ -1952,6 +1964,7 @@ class TestNs1ProviderDynamic(TestCase):
self.assertFalse(extra) self.assertFalse(extra)
# Unexpected exception message # Unexpected exception message
provider._client.reset_caches()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
zones_retrieve_mock.side_effect = ResourceException('boom') zones_retrieve_mock.side_effect = ResourceException('boom')
with self.assertRaises(ResourceException) as ctx: with self.assertRaises(ResourceException) as ctx:
@ -1959,6 +1972,7 @@ class TestNs1ProviderDynamic(TestCase):
self.assertEquals(zones_retrieve_mock.side_effect, ctx.exception) self.assertEquals(zones_retrieve_mock.side_effect, ctx.exception)
# Simple record, ignored, filter update lookups ignored # Simple record, ignored, filter update lookups ignored
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2006,6 +2020,7 @@ class TestNs1ProviderDynamic(TestCase):
desired.add_record(dynamic) desired.add_record(dynamic)
# untouched, but everything in sync so no change needed # untouched, but everything in sync so no change needed
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2026,6 +2041,7 @@ class TestNs1ProviderDynamic(TestCase):
# If we don't have a notify list we're broken and we'll expect to see # If we don't have a notify list we're broken and we'll expect to see
# an Update # an Update
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2042,6 +2058,7 @@ class TestNs1ProviderDynamic(TestCase):
# Add notify_list back and change the healthcheck protocol, we'll still # Add notify_list back and change the healthcheck protocol, we'll still
# expect to see an update # expect to see an update
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2059,6 +2076,7 @@ class TestNs1ProviderDynamic(TestCase):
monitors_for_mock.assert_has_calls([call(dynamic)]) monitors_for_mock.assert_has_calls([call(dynamic)])
# If it's in the changed list, it'll be ignored # If it's in the changed list, it'll be ignored
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2069,6 +2087,7 @@ class TestNs1ProviderDynamic(TestCase):
# Test changes in filters # Test changes in filters
# No change in filters # No change in filters
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2088,6 +2107,7 @@ class TestNs1ProviderDynamic(TestCase):
self.assertFalse(extra) self.assertFalse(extra)
# filters need an update # filters need an update
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2107,6 +2127,7 @@ class TestNs1ProviderDynamic(TestCase):
self.assertTrue(extra) self.assertTrue(extra)
# Mixed disabled in filters. Raise Ns1Exception # Mixed disabled in filters. Raise Ns1Exception
provider._client.reset_caches()
monitors_for_mock.reset_mock() monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock() zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock() records_retrieve_mock.reset_mock()
@ -2234,12 +2255,14 @@ class TestNs1Client(TestCase):
client = Ns1Client('dummy-key') client = Ns1Client('dummy-key')
# No retry required, just calls and is returned # No retry required, just calls and is returned
client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
zone_retrieve_mock.side_effect = ['foo'] zone_retrieve_mock.side_effect = ['foo']
self.assertEquals('foo', client.zones_retrieve('unit.tests')) self.assertEquals('foo', client.zones_retrieve('unit.tests'))
zone_retrieve_mock.assert_has_calls([call('unit.tests')]) zone_retrieve_mock.assert_has_calls([call('unit.tests')])
# One retry required # One retry required
client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
zone_retrieve_mock.side_effect = [ zone_retrieve_mock.side_effect = [
RateLimitException('boo', period=0), RateLimitException('boo', period=0),
@ -2249,6 +2272,7 @@ class TestNs1Client(TestCase):
zone_retrieve_mock.assert_has_calls([call('unit.tests')]) zone_retrieve_mock.assert_has_calls([call('unit.tests')])
# Two retries required # Two retries required
client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
zone_retrieve_mock.side_effect = [ zone_retrieve_mock.side_effect = [
RateLimitException('boo', period=0), RateLimitException('boo', period=0),
@ -2258,6 +2282,7 @@ class TestNs1Client(TestCase):
zone_retrieve_mock.assert_has_calls([call('unit.tests')]) zone_retrieve_mock.assert_has_calls([call('unit.tests')])
# Exhaust our retries # Exhaust our retries
client.reset_caches()
zone_retrieve_mock.reset_mock() zone_retrieve_mock.reset_mock()
zone_retrieve_mock.side_effect = [ zone_retrieve_mock.side_effect = [
RateLimitException('first', period=0), RateLimitException('first', period=0),


Loading…
Cancel
Save