Browse Source

Merge branch 'master' into dyn-dynamic-serve-count-1

pull/339/head
Ross McFarland 7 years ago
committed by GitHub
parent
commit
99bb14b4df
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 12 deletions
  1. +5
    -3
      octodns/provider/dyn.py
  2. +30
    -9
      tests/test_octodns_provider_dyn.py

+ 5
- 3
octodns/provider/dyn.py 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):


+ 30
- 9
tests/test_octodns_provider_dyn.py 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)


Loading…
Cancel
Save