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

Merge branch 'master' into split-the-yaml

This commit is contained in:
Christian Funkhouser
2019-04-09 09:02:56 -04:00
committed by GitHub
2 changed files with 37 additions and 15 deletions

View File

@@ -624,10 +624,12 @@ class DynProvider(BaseProvider):
zone.name, lenient) zone.name, lenient)
td_records = set() td_records = set()
for fqdn, types in self.traffic_directors.items(): for fqdn, types in self.traffic_directors.items():
# TODO: skip subzones
if not fqdn.endswith(zone.name):
continue
for _type, td in types.items(): for _type, td in types.items():
# Does this TD belong to the current zone
td_zone = '{}.'.format(td.nodes[0]['zone'])
if td_zone != zone.name:
# Doesn't belong to the current zone, skip it
continue
# critical to call rulesets once, each call loads them :-( # critical to call rulesets once, each call loads them :-(
rulesets = td.rulesets rulesets = td.rulesets
if self._is_traffic_director_dyanmic(td, rulesets): if self._is_traffic_director_dyanmic(td, rulesets):
@@ -927,9 +929,8 @@ class DynProvider(BaseProvider):
# We don't have this pool and thus need to create it # We don't have this pool and thus need to create it
records_for = getattr(self, '_dynamic_records_for_{}'.format(_type)) records_for = getattr(self, '_dynamic_records_for_{}'.format(_type))
records = records_for(values, record_extras) records = records_for(values, record_extras)
record_set = DSFRecordSet(_type, label, record_set = DSFRecordSet(_type, label, serve_count=1, records=records,
serve_count=min(len(records), 2), dsf_monitor_id=monitor_id)
records=records, dsf_monitor_id=monitor_id)
chain = DSFFailoverChain(label, record_sets=[record_set]) chain = DSFFailoverChain(label, record_sets=[record_set])
pool = DSFResponsePool(label, rs_chains=[chain]) pool = DSFResponsePool(label, rs_chains=[chain])
pool.create(td) pool.create(td)

View File

@@ -980,26 +980,34 @@ class TestDynProviderGeo(TestCase):
provider = DynProvider('test', 'cust', 'user', 'pass', provider = DynProvider('test', 'cust', 'user', 'pass',
traffic_directors_enabled=True) traffic_directors_enabled=True)
got = Zone('unit.tests.', [])
zone_name = got.name[:-1]
# only traffic director # only traffic director
mock.side_effect = [ mock.side_effect = [
# get traffic directors # get traffic directors
self.traffic_directors_response, self.traffic_directors_response,
# get traffic director # get the first td's nodes
{'data': [{'fqdn': zone_name, 'zone': zone_name}]},
# get traffic director, b/c ^ matches
self.traffic_director_response, self.traffic_director_response,
# get the next td's nodes, not a match
{'data': [{'fqdn': 'other', 'zone': 'other'}]},
# get zone # get zone
{'data': {}}, {'data': {}},
# get records # get records
{'data': {}}, {'data': {}},
] ]
got = Zone('unit.tests.', [])
provider.populate(got) provider.populate(got)
self.assertEquals(1, len(got.records)) self.assertEquals(1, len(got.records))
self.assertFalse(self.expected_geo.changes(got, provider)) self.assertFalse(self.expected_geo.changes(got, provider))
mock.assert_has_calls([ mock.assert_has_calls([
call('/DSF/', 'GET', {'detail': 'Y'}),
call('/DSFNode/2ERWXQNsb_IKG2YZgYqkPvk0PBM', 'GET', {}),
call('/DSF/2ERWXQNsb_IKG2YZgYqkPvk0PBM/', 'GET', call('/DSF/2ERWXQNsb_IKG2YZgYqkPvk0PBM/', 'GET',
{'pending_changes': 'Y'}), {'pending_changes': 'Y'}),
call('/DSFNode/3ERWXQNsb_IKG2YZgYqkPvk0PBM', 'GET', {}),
call('/Zone/unit.tests/', 'GET', {}), call('/Zone/unit.tests/', 'GET', {}),
call('/AllRecord/unit.tests/unit.tests./', 'GET', {'detail': 'Y'}), call('/AllRecord/unit.tests/unit.tests./', 'GET', {'detail': 'Y'})
]) ])
@patch('dyn.core.SessionEngine.execute') @patch('dyn.core.SessionEngine.execute')
@@ -1035,8 +1043,12 @@ class TestDynProviderGeo(TestCase):
mock.side_effect = [ mock.side_effect = [
# get traffic directors # get traffic directors
self.traffic_directors_response, self.traffic_directors_response,
# get traffic director # grab its nodes, matches
{'data': [{'fqdn': 'unit.tests', 'zone': 'unit.tests'}]},
# get traffic director b/c match
self.traffic_director_response, self.traffic_director_response,
# grab next td's nodes, not a match
{'data': [{'fqdn': 'other', 'zone': 'other'}]},
# get zone # get zone
{'data': {}}, {'data': {}},
# get records # get records
@@ -1047,10 +1059,13 @@ class TestDynProviderGeo(TestCase):
self.assertEquals(1, len(got.records)) self.assertEquals(1, len(got.records))
self.assertFalse(self.expected_geo.changes(got, provider)) self.assertFalse(self.expected_geo.changes(got, provider))
mock.assert_has_calls([ mock.assert_has_calls([
call('/DSF/', 'GET', {'detail': 'Y'}),
call('/DSFNode/2ERWXQNsb_IKG2YZgYqkPvk0PBM', 'GET', {}),
call('/DSF/2ERWXQNsb_IKG2YZgYqkPvk0PBM/', 'GET', call('/DSF/2ERWXQNsb_IKG2YZgYqkPvk0PBM/', 'GET',
{'pending_changes': 'Y'}), {'pending_changes': 'Y'}),
call('/DSFNode/3ERWXQNsb_IKG2YZgYqkPvk0PBM', 'GET', {}),
call('/Zone/unit.tests/', 'GET', {}), call('/Zone/unit.tests/', 'GET', {}),
call('/AllRecord/unit.tests/unit.tests./', 'GET', {'detail': 'Y'}), call('/AllRecord/unit.tests/unit.tests./', 'GET', {'detail': 'Y'})
]) ])
@patch('dyn.core.SessionEngine.execute') @patch('dyn.core.SessionEngine.execute')
@@ -1085,8 +1100,10 @@ class TestDynProviderGeo(TestCase):
mock.side_effect = [ mock.side_effect = [
# get traffic directors # get traffic directors
self.traffic_directors_response, self.traffic_directors_response,
{'data': [{'fqdn': 'unit.tests', 'zone': 'unit.tests'}]},
# get traffic director # get traffic director
busted_traffic_director_response, busted_traffic_director_response,
{'data': [{'fqdn': 'other', 'zone': 'other'}]},
# get zone # get zone
{'data': {}}, {'data': {}},
# get records # get records
@@ -1099,10 +1116,13 @@ class TestDynProviderGeo(TestCase):
# so just compare set contents (which does name and type) # so just compare set contents (which does name and type)
self.assertEquals(self.expected_geo.records, got.records) self.assertEquals(self.expected_geo.records, got.records)
mock.assert_has_calls([ mock.assert_has_calls([
call('/DSF/', 'GET', {'detail': 'Y'}),
call('/DSFNode/2ERWXQNsb_IKG2YZgYqkPvk0PBM', 'GET', {}),
call('/DSF/2ERWXQNsb_IKG2YZgYqkPvk0PBM/', 'GET', call('/DSF/2ERWXQNsb_IKG2YZgYqkPvk0PBM/', 'GET',
{'pending_changes': 'Y'}), {'pending_changes': 'Y'}),
call('/DSFNode/3ERWXQNsb_IKG2YZgYqkPvk0PBM', 'GET', {}),
call('/Zone/unit.tests/', 'GET', {}), call('/Zone/unit.tests/', 'GET', {}),
call('/AllRecord/unit.tests/unit.tests./', 'GET', {'detail': 'Y'}), call('/AllRecord/unit.tests/unit.tests./', 'GET', {'detail': 'Y'})
]) ])
@patch('dyn.core.SessionEngine.execute') @patch('dyn.core.SessionEngine.execute')
@@ -1625,11 +1645,12 @@ class DummyRuleset(object):
class DummyTrafficDirector(object): class DummyTrafficDirector(object):
def __init__(self, rulesets=[], response_pools=[], ttl=42): def __init__(self, zone_name, rulesets=[], response_pools=[], ttl=42):
self.label = 'dummy:abcdef1234567890' self.label = 'dummy:abcdef1234567890'
self.rulesets = rulesets self.rulesets = rulesets
self.all_response_pools = response_pools self.all_response_pools = response_pools
self.ttl = ttl self.ttl = ttl
self.nodes = [{'zone': zone_name[:-1]}]
class TestDynProviderDynamic(TestCase): class TestDynProviderDynamic(TestCase):
@@ -1880,9 +1901,9 @@ class TestDynProviderDynamic(TestCase):
}, },
}), }),
] ]
td = DummyTrafficDirector(rulesets, [default_response_pool,
pool1_response_pool])
zone = Zone('unit.tests.', []) zone = Zone('unit.tests.', [])
td = DummyTrafficDirector(zone.name, rulesets,
[default_response_pool, pool1_response_pool])
record = provider._populate_dynamic_traffic_director(zone, fqdn, 'A', record = provider._populate_dynamic_traffic_director(zone, fqdn, 'A',
td, rulesets, td, rulesets,
True) True)