diff --git a/octodns/record/dynamic.py b/octodns/record/dynamic.py index d4e6dd4..fbb3ca8 100644 --- a/octodns/record/dynamic.py +++ b/octodns/record/dynamic.py @@ -282,6 +282,9 @@ class _DynamicMixin(object): geos_seen[geo] = rule_num + if 'geos' in rules[-1]: + reasons.append('final rule has "geos" and is not catchall') + return reasons, pools_seen @classmethod diff --git a/tests/config/dynamic.tests.yaml b/tests/config/dynamic.tests.yaml index d25f63a..f30a2ed 100644 --- a/tests/config/dynamic.tests.yaml +++ b/tests/config/dynamic.tests.yaml @@ -129,6 +129,7 @@ pool-only-in-fallback: - geos: - AS-SG pool: three + - pool: one ttl: 300 type: A values: [4.4.4.4] diff --git a/tests/test_octodns_record_dynamic.py b/tests/test_octodns_record_dynamic.py index d5082f6..ceb65bf 100644 --- a/tests/test_octodns_record_dynamic.py +++ b/tests/test_octodns_record_dynamic.py @@ -946,6 +946,7 @@ class TestRecordDynamic(TestCase): {'geos': ['EU'], 'pool': 'two'}, {'geos': ['AF'], 'pool': 'one'}, {'geos': ['OC'], 'pool': 'one'}, + {'pool': 'one'}, ], }, 'ttl': 60, @@ -1294,6 +1295,7 @@ class TestRecordDynamic(TestCase): rules = [ {'geos': ('AS', 'NA-CA', 'NA-US-OR'), 'pool': 'sfo'}, {'geos': ('EU', 'NA'), 'pool': 'iad'}, + {'pool': 'iad'}, ] reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules) self.assertFalse(reasons) @@ -1304,6 +1306,7 @@ class TestRecordDynamic(TestCase): rules = [ {'geos': ('AS', 'NA'), 'pool': 'sfo'}, {'geos': ('EU', 'NA-CA'), 'pool': 'iad'}, + {'pool': 'iad'}, ] reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules) self.assertEqual( @@ -1314,8 +1317,11 @@ class TestRecordDynamic(TestCase): ) # this one targets NA and NA-US in rule 0 - pools = {'sfo'} - rules = [{'geos': ('AS', 'NA-US', 'NA'), 'pool': 'sfo'}] + pools = {'iad', 'sfo'} + rules = [ + {'geos': ('AS', 'NA-US', 'NA'), 'pool': 'sfo'}, + {'pool': 'iad'}, + ] reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules) self.assertEqual( [ @@ -1329,9 +1335,19 @@ class TestRecordDynamic(TestCase): rules = [ {'geos': ('AS', 'NA'), 'pool': 'sfo'}, {'geos': ('EU', 'NA'), 'pool': 'iad'}, + {'pool': 'iad'}, ] reasons, pools_seen = _DynamicMixin._validate_rules(pools, rules) self.assertEqual( ['rule 2 targets geo NA which has previously been seen in rule 1'], 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)