1
0
mirror of https://github.com/github/octodns.git synced 2024-05-11 05:55:00 +00:00

Support upgrade of filter chain

This commit is contained in:
Pavan Chandrashekar
2020-03-25 12:36:44 -07:00
parent 0ada5a9ad9
commit a7f01d4c76
2 changed files with 234 additions and 93 deletions

View File

@@ -316,6 +316,7 @@ class TestNs1Provider(TestCase):
# Fails, general error
zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock()
zone_retrieve_mock.side_effect = ResourceException('boom')
with self.assertRaises(ResourceException) as ctx:
@@ -324,6 +325,7 @@ class TestNs1Provider(TestCase):
# Fails, bad auth
zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock()
zone_retrieve_mock.side_effect = \
ResourceException('server error: zone not found')
@@ -334,6 +336,7 @@ class TestNs1Provider(TestCase):
# non-existent zone, create
zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock()
zone_retrieve_mock.side_effect = \
ResourceException('server error: zone not found')
@@ -364,6 +367,7 @@ class TestNs1Provider(TestCase):
# Update & delete
zone_retrieve_mock.reset_mock()
record_retrieve_mock.reset_mock()
zone_create_mock.reset_mock()
ns1_zone = {
@@ -389,7 +393,7 @@ class TestNs1Provider(TestCase):
}
ns1_zone['records'][0]['short_answers'][0] = '2.2.2.2'
record_retrieve_mock.side_effect = [{
ns1_record = {
"domain": "geo.unit.tests",
"zone": "unit.tests",
"type": "A",
@@ -404,8 +408,9 @@ class TestNs1Provider(TestCase):
],
'tier': 3,
'ttl': 34,
}]
}
record_retrieve_mock.side_effect = [ns1_record, ns1_record]
zone_retrieve_mock.side_effect = [ns1_zone, ns1_zone]
plan = provider.plan(desired)
self.assertEquals(3, len(plan.changes))
@@ -427,6 +432,8 @@ class TestNs1Provider(TestCase):
None,
]
record_retrieve_mock.side_effect = [ns1_record, ns1_record]
zone_retrieve_mock.side_effect = [ns1_zone, ns1_zone]
got_n = provider.apply(plan)
self.assertEquals(3, got_n)
@@ -958,7 +965,8 @@ class TestNs1ProviderDynamic(TestCase):
rule0['geos'] = ['AF', 'EU']
ret, _ = provider._params_for_A(self.record)
self.assertEquals(ret['filters'],
Ns1Provider._FILTER_CHAIN_WITH_REGION)
Ns1Provider._FILTER_CHAIN_WITH_REGION(provider,
True))
rule0['geos'] = saved_geos
@patch('octodns.provider.ns1.Ns1Provider._monitor_sync')
@@ -999,7 +1007,8 @@ class TestNs1ProviderDynamic(TestCase):
# When rules has 'OC', it is converted to list of countries in the
# params. Look if the returned filters is the filter chain with country
self.assertEquals(ret['filters'],
Ns1Provider._FILTER_CHAIN_WITH_COUNTRY)
Ns1Provider._FILTER_CHAIN_WITH_COUNTRY(provider,
True))
rule0['geos'] = saved_geos
@patch('octodns.provider.ns1.Ns1Provider._monitor_sync')
@@ -1031,7 +1040,8 @@ class TestNs1ProviderDynamic(TestCase):
# Given that self.record has both country and region in the rules,
# the returned filter chain should be one with region and country
self.assertEquals(ret['filters'],
Ns1Provider._FILTER_CHAIN_WITH_REGION_AND_COUNTRY)
Ns1Provider._FILTER_CHAIN_WITH_REGION_AND_COUNTRY(
provider, True))
monitors_for_mock.assert_has_calls([call(self.record)])
monitors_sync_mock.assert_has_calls([
@@ -1057,7 +1067,7 @@ class TestNs1ProviderDynamic(TestCase):
ns1_record = {
'answers': [],
'domain': 'unit.tests',
'filters': Ns1Provider._BASIC_FILTER_CHAIN,
'filters': Ns1Provider._BASIC_FILTER_CHAIN(provider, True),
'regions': {},
'ttl': 42,
}
@@ -1191,20 +1201,29 @@ class TestNs1ProviderDynamic(TestCase):
self.assertTrue(
'OC-{}'.format(c) in data4['dynamic']['rules'][0]['geos'])
@patch('ns1.rest.records.Records.retrieve')
@patch('ns1.rest.zones.Zones.retrieve')
@patch('octodns.provider.ns1.Ns1Provider._monitors_for')
def test_extra_changes(self, monitors_for_mock):
def test_extra_changes(self, monitors_for_mock, zones_retrieve_mock,
records_retrieve_mock):
provider = Ns1Provider('test', 'api-key')
desired = Zone('unit.tests.', [])
# Empty zone and no changes
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
extra = provider._extra_changes(desired, [])
self.assertFalse(extra)
monitors_for_mock.assert_not_called()
# Simple record, ignored
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
simple = Record.new(desired, '', {
'ttl': 32,
'type': 'A',
@@ -1247,6 +1266,8 @@ class TestNs1ProviderDynamic(TestCase):
# untouched, but everything in sync so no change needed
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
# Generate what we expect to have
gend = provider._monitor_gen(dynamic, '1.2.3.4')
gend.update({
@@ -1265,6 +1286,8 @@ class TestNs1ProviderDynamic(TestCase):
# If we don't have a notify list we're broken and we'll expect to see
# an Update
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
del gend['notify_list']
monitors_for_mock.side_effect = [{
'1.2.3.4': gend,
@@ -1279,6 +1302,8 @@ class TestNs1ProviderDynamic(TestCase):
# Add notify_list back and change the healthcheck protocol, we'll still
# expect to see an update
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
gend['notify_list'] = 'xyz'
dynamic._octodns['healthcheck']['protocol'] = 'HTTPS'
del gend['notify_list']
@@ -1294,10 +1319,74 @@ class TestNs1ProviderDynamic(TestCase):
# If it's in the changed list, it'll be ignored
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
extra = provider._extra_changes(desired, [update])
self.assertFalse(extra)
monitors_for_mock.assert_not_called()
# Test changes in filters
# No change in filters
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
ns1_zone = {
'records': [{
"domain": "dyn.unit.tests",
"zone": "unit.tests",
"type": "A",
"tier": 3,
"filters": Ns1Provider._BASIC_FILTER_CHAIN(provider, True)
}],
}
monitors_for_mock.side_effect = [{}]
zones_retrieve_mock.side_effect = [ns1_zone]
records_retrieve_mock.side_effect = ns1_zone['records']
extra = provider._extra_changes(desired, [])
self.assertFalse(extra)
# filters need an update
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
ns1_zone = {
'records': [{
"domain": "dyn.unit.tests",
"zone": "unit.tests",
"type": "A",
"tier": 3,
"filters": Ns1Provider._BASIC_FILTER_CHAIN(provider, False)
}],
}
monitors_for_mock.side_effect = [{}]
zones_retrieve_mock.side_effect = [ns1_zone]
records_retrieve_mock.side_effect = ns1_zone['records']
extra = provider._extra_changes(desired, [])
self.assertTrue(extra)
# Mixed disabled in filters. Raise Ns1Exception
monitors_for_mock.reset_mock()
zones_retrieve_mock.reset_mock()
records_retrieve_mock.reset_mock()
ns1_zone = {
'records': [{
"domain": "dyn.unit.tests",
"zone": "unit.tests",
"type": "A",
"tier": 3,
"filters": Ns1Provider._BASIC_FILTER_CHAIN(provider, True)
}],
}
del ns1_zone['records'][0]['filters'][0]['disabled']
monitors_for_mock.side_effect = [{}]
zones_retrieve_mock.side_effect = [ns1_zone]
records_retrieve_mock.side_effect = ns1_zone['records']
with self.assertRaises(Ns1Exception) as ctx:
extra = provider._extra_changes(desired, [])
self.assertTrue('Mixed disabled flag in filters' in
text_type(ctx.exception))
DESIRED = Zone('unit.tests.', [])
SIMPLE = Record.new(DESIRED, 'sim', {