diff --git a/octodns/record.py b/octodns/record.py index 665ceba..2395cf0 100644 --- a/octodns/record.py +++ b/octodns/record.py @@ -262,7 +262,7 @@ class _ValuesMixin(object): except KeyError: values = [] - reasons.extend(cls._value_type.validate(values)) + reasons.extend(cls._value_type.validate(values, cls)) return reasons @@ -317,7 +317,7 @@ class _GeoMixin(_ValuesMixin): # TODO: validate legal codes for code, values in geo.items(): reasons.extend(GeoValue._validate_geo(code)) - reasons.extend(cls._value_type.validate(values)) + reasons.extend(cls._value_type.validate(values, cls)) except KeyError: pass return reasons @@ -408,7 +408,7 @@ class _DynamicMixin(object): reasons.append('missing pools') else: for pool in sorted(pools.values()): - reasons.extend(cls._value_type.validate(pool)) + reasons.extend(cls._value_type.validate(pool, cls)) try: rules = data['dynamic']['rules'] @@ -459,7 +459,7 @@ class _DynamicMixin(object): class Ipv4List(object): @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not isinstance(data, (list, tuple)): data = (data,) if len(data) == 0: @@ -485,7 +485,7 @@ class Ipv4List(object): class Ipv6List(object): @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not isinstance(data, (list, tuple)): data = (data,) if len(data) == 0: @@ -536,7 +536,7 @@ class ARecord(_DynamicMixin, _GeoMixin, Record): _value_type = Ipv4List -class AaaaRecord(_GeoMixin, Record): +class AaaaRecord(_DynamicMixin, _GeoMixin, Record): _type = 'AAAA' _value_type = Ipv6List @@ -554,7 +554,7 @@ class CaaValue(object): # https://tools.ietf.org/html/rfc6844#page-5 @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not isinstance(data, (list, tuple)): data = (data,) reasons = [] @@ -605,7 +605,7 @@ class CaaRecord(_ValuesMixin, Record): _value_type = CaaValue -class CnameRecord(_ValueMixin, Record): +class CnameRecord(_DynamicMixin, _ValueMixin, Record): _type = 'CNAME' _value_type = CnameValue @@ -621,7 +621,7 @@ class CnameRecord(_ValueMixin, Record): class MxValue(object): @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not isinstance(data, (list, tuple)): data = (data,) reasons = [] @@ -689,7 +689,7 @@ class NaptrValue(object): VALID_FLAGS = ('S', 'A', 'U', 'P') @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not isinstance(data, (list, tuple)): data = (data,) reasons = [] @@ -774,7 +774,7 @@ class NaptrRecord(_ValuesMixin, Record): class _NsValue(object): @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not data: return ['missing value(s)'] elif not isinstance(data, (list, tuple)): @@ -810,7 +810,7 @@ class SshfpValue(object): VALID_FINGERPRINT_TYPES = (1, 2) @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not isinstance(data, (list, tuple)): data = (data,) reasons = [] @@ -893,7 +893,7 @@ class _ChunkedValue(object): _unescaped_semicolon_re = re.compile(r'\w;') @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not data: return ['missing value(s)'] elif not isinstance(data, (list, tuple)): @@ -922,7 +922,7 @@ class SpfRecord(_ChunkedValuesMixin, Record): class SrvValue(object): @classmethod - def validate(cls, data): + def validate(cls, data, record_cls): if not isinstance(data, (list, tuple)): data = (data,) reasons = [] diff --git a/tests/config/dynamic.tests.yaml b/tests/config/dynamic.tests.yaml index 18db9c9..3b9632d 100644 --- a/tests/config/dynamic.tests.yaml +++ b/tests/config/dynamic.tests.yaml @@ -32,14 +32,10 @@ a: cname: dynamic: pools: - ams: - value: target-ams.unit.tests. - iad: - value: target-iad.unit.tests. - lax: - value: target-lax.unit.tests. - sea: - value: target-sea.unit.tests. + ams: target-ams.unit.tests. + iad: target-iad.unit.tests. + lax: target-lax.unit.tests. + sea: target-sea.unit.tests. rules: - geo: EU-UK pools: @@ -63,10 +59,8 @@ cname: simple-weighted: dynamic: pools: - one: - value: one.unit.tests. - two: - value: two.unit.tests. + one: one.unit.tests. + two: two.unit.tests. rules: - pools: 100: one