Browse Source

Hook up new GeoCodes validation to _DynamicMixin

pull/307/head
Ross McFarland 7 years ago
parent
commit
388e9a67e0
No known key found for this signature in database GPG Key ID: 61C10C4FC8FE4A89
4 changed files with 36 additions and 34 deletions
  1. +4
    -5
      octodns/record/__init__.py
  2. +6
    -5
      octodns/record/geo.py
  3. +1
    -1
      tests/test_octodns_record.py
  4. +25
    -23
      tests/test_octodns_record_geo.py

+ 4
- 5
octodns/record/__init__.py View File

@ -9,6 +9,8 @@ from ipaddress import IPv4Address, IPv6Address
from logging import getLogger
import re
from .geo import GeoCodes
class Change(object):
@ -563,11 +565,8 @@ class _DynamicMixin(object):
.format(rule_num))
else:
for geo in geos:
# TODO: ideally this would validate the actual code...
match = cls.geo_re.match(geo)
if not match:
reasons.append('rule {} invalid geo "{}"'
.format(rule_num, geo))
reasons.extend(GeoCodes.validate(geo, 'rule {} '
.format(rule_num)))
return reasons


+ 6
- 5
octodns/record/geo.py View File

@ -9,7 +9,7 @@ class GeoCodes(object):
__COUNTRIES = None
@classmethod
def validate(cls, code):
def validate(cls, code, prefix):
'''
Validates an octoDNS geo code making sure that it is a valid and
corresponding:
@ -22,13 +22,14 @@ class GeoCodes(object):
pieces = code.split('-')
n = len(pieces)
if n > 3:
reasons.append('Invalid geo code "{}"'.format(code))
reasons.append('{}invalid geo code "{}"'.format(prefix, code))
elif n > 0 and pieces[0] not in geo_data:
reasons.append('Unknown continent code "{}"'.format(code))
reasons.append('{}unknown continent code "{}"'
.format(prefix, code))
elif n > 1 and pieces[1] not in geo_data[pieces[0]]:
reasons.append('Unknown country code "{}"'.format(code))
reasons.append('{}unknown country code "{}"'.format(prefix, code))
elif n > 2 and \
pieces[2] not in geo_data[pieces[0]][pieces[1]]['provinces']:
reasons.append('Unknown province code "{}"'.format(code))
reasons.append('{}unknown province code "{}"'.format(prefix, code))
return reasons

+ 1
- 1
tests/test_octodns_record.py View File

@ -2863,7 +2863,7 @@ class TestDynamicRecords(TestCase):
}
with self.assertRaises(ValidationError) as ctx:
Record.new(self.zone, 'bad', a_data)
self.assertEquals(['rule 1 invalid geo "invalid"'],
self.assertEquals(['rule 1 unknown continent code "invalid"'],
ctx.exception.reasons)
# multiple default rules


+ 25
- 23
tests/test_octodns_record_geo.py View File

@ -13,39 +13,41 @@ from octodns.record.geo import GeoCodes
class TestRecordGeoCodes(TestCase):
def test_validate(self):
prefix = 'xyz '
# All valid
self.assertEquals([], GeoCodes.validate('NA'))
self.assertEquals([], GeoCodes.validate('NA-US'))
self.assertEquals([], GeoCodes.validate('NA-US-OR'))
self.assertEquals([], GeoCodes.validate('NA', prefix))
self.assertEquals([], GeoCodes.validate('NA-US', prefix))
self.assertEquals([], GeoCodes.validate('NA-US-OR', prefix))
# Just plain bad
self.assertEquals(['Invalid geo code "XX-YY-ZZ-AA"'],
GeoCodes.validate('XX-YY-ZZ-AA'))
self.assertEquals(['Unknown continent code "X-Y-Z"'],
GeoCodes.validate('X-Y-Z'))
self.assertEquals(['Unknown continent code "XXX-Y-Z"'],
GeoCodes.validate('XXX-Y-Z'))
self.assertEquals(['xyz invalid geo code "XX-YY-ZZ-AA"'],
GeoCodes.validate('XX-YY-ZZ-AA', prefix))
self.assertEquals(['xyz unknown continent code "X-Y-Z"'],
GeoCodes.validate('X-Y-Z', prefix))
self.assertEquals(['xyz unknown continent code "XXX-Y-Z"'],
GeoCodes.validate('XXX-Y-Z', prefix))
# Bad continent
self.assertEquals(['Unknown continent code "XX"'],
GeoCodes.validate('XX'))
self.assertEquals(['xyz unknown continent code "XX"'],
GeoCodes.validate('XX', prefix))
# Bad continent good country
self.assertEquals(['Unknown continent code "XX-US"'],
GeoCodes.validate('XX-US'))
self.assertEquals(['xyz unknown continent code "XX-US"'],
GeoCodes.validate('XX-US', prefix))
# Bad continent good country and province
self.assertEquals(['Unknown continent code "XX-US-OR"'],
GeoCodes.validate('XX-US-OR'))
self.assertEquals(['xyz unknown continent code "XX-US-OR"'],
GeoCodes.validate('XX-US-OR', prefix))
# Bad country, good continent
self.assertEquals(['Unknown country code "NA-XX"'],
GeoCodes.validate('NA-XX'))
self.assertEquals(['xyz unknown country code "NA-XX"'],
GeoCodes.validate('NA-XX', prefix))
# Bad country, good continent and state
self.assertEquals(['Unknown country code "NA-XX-OR"'],
GeoCodes.validate('NA-XX-OR'))
self.assertEquals(['xyz unknown country code "NA-XX-OR"'],
GeoCodes.validate('NA-XX-OR', prefix))
# Good country, good continent, but bad match
self.assertEquals(['Unknown country code "NA-GB"'],
GeoCodes.validate('NA-GB'))
self.assertEquals(['xyz unknown country code "NA-GB"'],
GeoCodes.validate('NA-GB', prefix))
# Bad province code, good continent and country
self.assertEquals(['Unknown province code "NA-US-XX"'],
GeoCodes.validate('NA-US-XX'))
self.assertEquals(['xyz unknown province code "NA-US-XX"'],
GeoCodes.validate('NA-US-XX', prefix))

Loading…
Cancel
Save