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

Validate dynamic rules do not reuse pools

This commit is contained in:
Ross McFarland
2020-03-20 13:15:14 -07:00
parent 7c9d89b826
commit aa58631dcd
6 changed files with 56 additions and 9 deletions

View File

@@ -579,6 +579,7 @@ class _DynamicMixin(object):
# TODO: don't allow 'default' as a pool name, reserved
# TODO: warn or error on unused pools?
pools_seen = set()
for i, rule in enumerate(rules):
rule_num = i + 1
try:
@@ -590,9 +591,15 @@ class _DynamicMixin(object):
if not isinstance(pool, string_types):
reasons.append('rule {} invalid pool "{}"'
.format(rule_num, pool))
elif pool not in pools:
reasons.append('rule {} undefined pool "{}"'
.format(rule_num, pool))
else:
if pool not in pools:
reasons.append('rule {} undefined pool "{}"'
.format(rule_num, pool))
pools_seen.add(pool)
elif pool in pools_seen:
reasons.append('rule {} invalid, target pool "{}" '
'reused'.format(rule_num, pool))
pools_seen.add(pool)
try:
geos = rule['geos']

View File

@@ -23,7 +23,7 @@ a:
rules:
- geos:
- EU-GB
pool: iad
pool: lax
- geos:
- EU
pool: ams
@@ -60,7 +60,7 @@ aaaa:
rules:
- geos:
- EU-GB
pool: iad
pool: lax
- geos:
- EU
pool: ams
@@ -96,7 +96,7 @@ cname:
rules:
- geos:
- EU-GB
pool: iad
pool: lax
- geos:
- EU
pool: ams

View File

@@ -29,7 +29,7 @@ a:
rules:
- geos:
- EU-GB
pool: iad
pool: lax
- geos:
- EU
pool: ams

View File

@@ -29,7 +29,7 @@ aaaa:
rules:
- geos:
- EU-GB
pool: iad
pool: lax
- geos:
- EU
pool: ams

View File

@@ -27,7 +27,7 @@ cname:
rules:
- geos:
- EU-GB
pool: iad
pool: lax
- geos:
- EU
pool: ams

View File

@@ -3377,6 +3377,46 @@ class TestDynamicRecords(TestCase):
self.assertEquals(['rule 2 duplicate default'],
ctx.exception.reasons)
# repeated pool in rules
a_data = {
'dynamic': {
'pools': {
'one': {
'values': [{
'value': '3.3.3.3',
}]
},
'two': {
'values': [{
'value': '4.4.4.4',
}, {
'value': '5.5.5.5',
}]
},
},
'rules': [{
'geos': ['EU'],
'pool': 'two',
}, {
'geos': ['AF'],
'pool': 'one',
}, {
'pool': 'one',
}],
},
'ttl': 60,
'type': 'A',
'values': [
'1.1.1.1',
'2.2.2.2',
],
}
print('\n*** start ***')
with self.assertRaises(ValidationError) as ctx:
Record.new(self.zone, 'bad', a_data)
self.assertEquals(['rule 3 invalid, target pool "one" reused'],
ctx.exception.reasons)
def test_dynamic_lenient(self):
# Missing pools
a_data = {