mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
Add dynamic recordA validation to ensure last rule is a catch-all
This commit is contained in:
@@ -282,6 +282,9 @@ class _DynamicMixin(object):
|
|||||||
|
|
||||||
geos_seen[geo] = rule_num
|
geos_seen[geo] = rule_num
|
||||||
|
|
||||||
|
if 'geos' in rules[-1]:
|
||||||
|
reasons.append('final rule has "geos" and is not catchall')
|
||||||
|
|
||||||
return reasons, pools_seen
|
return reasons, pools_seen
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ pool-only-in-fallback:
|
|||||||
- geos:
|
- geos:
|
||||||
- AS-SG
|
- AS-SG
|
||||||
pool: three
|
pool: three
|
||||||
|
- pool: one
|
||||||
ttl: 300
|
ttl: 300
|
||||||
type: A
|
type: A
|
||||||
values: [4.4.4.4]
|
values: [4.4.4.4]
|
||||||
|
|||||||
@@ -946,6 +946,7 @@ class TestRecordDynamic(TestCase):
|
|||||||
{'geos': ['EU'], 'pool': 'two'},
|
{'geos': ['EU'], 'pool': 'two'},
|
||||||
{'geos': ['AF'], 'pool': 'one'},
|
{'geos': ['AF'], 'pool': 'one'},
|
||||||
{'geos': ['OC'], 'pool': 'one'},
|
{'geos': ['OC'], 'pool': 'one'},
|
||||||
|
{'pool': 'one'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'ttl': 60,
|
'ttl': 60,
|
||||||
@@ -1294,6 +1295,7 @@ class TestRecordDynamic(TestCase):
|
|||||||
rules = [
|
rules = [
|
||||||
{'geos': ('AS', 'NA-CA', 'NA-US-OR'), 'pool': 'sfo'},
|
{'geos': ('AS', 'NA-CA', 'NA-US-OR'), 'pool': 'sfo'},
|
||||||
{'geos': ('EU', 'NA'), 'pool': 'iad'},
|
{'geos': ('EU', 'NA'), 'pool': 'iad'},
|
||||||
|
{'pool': 'iad'},
|
||||||
]
|
]
|
||||||
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
||||||
self.assertFalse(reasons)
|
self.assertFalse(reasons)
|
||||||
@@ -1304,6 +1306,7 @@ class TestRecordDynamic(TestCase):
|
|||||||
rules = [
|
rules = [
|
||||||
{'geos': ('AS', 'NA'), 'pool': 'sfo'},
|
{'geos': ('AS', 'NA'), 'pool': 'sfo'},
|
||||||
{'geos': ('EU', 'NA-CA'), 'pool': 'iad'},
|
{'geos': ('EU', 'NA-CA'), 'pool': 'iad'},
|
||||||
|
{'pool': 'iad'},
|
||||||
]
|
]
|
||||||
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@@ -1314,8 +1317,11 @@ class TestRecordDynamic(TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# this one targets NA and NA-US in rule 0
|
# this one targets NA and NA-US in rule 0
|
||||||
pools = {'sfo'}
|
pools = {'iad', 'sfo'}
|
||||||
rules = [{'geos': ('AS', 'NA-US', 'NA'), 'pool': 'sfo'}]
|
rules = [
|
||||||
|
{'geos': ('AS', 'NA-US', 'NA'), 'pool': 'sfo'},
|
||||||
|
{'pool': 'iad'},
|
||||||
|
]
|
||||||
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
[
|
[
|
||||||
@@ -1329,9 +1335,19 @@ class TestRecordDynamic(TestCase):
|
|||||||
rules = [
|
rules = [
|
||||||
{'geos': ('AS', 'NA'), 'pool': 'sfo'},
|
{'geos': ('AS', 'NA'), 'pool': 'sfo'},
|
||||||
{'geos': ('EU', 'NA'), 'pool': 'iad'},
|
{'geos': ('EU', 'NA'), 'pool': 'iad'},
|
||||||
|
{'pool': 'iad'},
|
||||||
]
|
]
|
||||||
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
['rule 2 targets geo NA which has previously been seen in rule 1'],
|
['rule 2 targets geo NA which has previously been seen in rule 1'],
|
||||||
reasons,
|
reasons,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# this one doesn't have a catch-all rule at the end
|
||||||
|
pools = {'iad', 'sfo'}
|
||||||
|
rules = [
|
||||||
|
{'geos': ('AS', 'NA-CA', 'NA-US-OR'), 'pool': 'sfo'},
|
||||||
|
{'geos': ('EU', 'NA'), 'pool': 'iad'},
|
||||||
|
]
|
||||||
|
reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules)
|
||||||
|
self.assertEqual(['final rule has "geos" and is not catchall'], reasons)
|
||||||
|
|||||||
Reference in New Issue
Block a user