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