mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
Hook up new GeoCodes validation to _DynamicMixin
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user