Browse Source

Record.name/decoded_name pattern implemented

pull/922/head
Ross McFarland 3 years ago
parent
commit
f00474cca4
No known key found for this signature in database GPG Key ID: 943B179E15D3B22A
2 changed files with 25 additions and 8 deletions
  1. +23
    -7
      octodns/record/__init__.py
  2. +2
    -1
      octodns/zone.py

+ 23
- 7
octodns/record/__init__.py View File

@ -16,6 +16,7 @@ import re
from fqdn import FQDN from fqdn import FQDN
from ..equality import EqualityTupleMixin from ..equality import EqualityTupleMixin
from ..idna import idna_decode, idna_encode
from .geo import GeoCodes from .geo import GeoCodes
@ -105,7 +106,11 @@ class Record(EqualityTupleMixin):
@classmethod @classmethod
def new(cls, zone, name, data, source=None, lenient=False): def new(cls, zone, name, data, source=None, lenient=False):
name = str(name).lower() name = str(name).lower()
fqdn = f'{name}.{zone.name}' if name else zone.name
fqdn = (
f'{idna_decode(name)}.{zone.decoded_name}'
if name
else zone.decoded_name
)
try: try:
_type = data['type'] _type = data['type']
except KeyError: except KeyError:
@ -169,8 +174,13 @@ class Record(EqualityTupleMixin):
name, name,
) )
self.zone = zone self.zone = zone
# force everything lower-case just to be safe
self.name = str(name).lower() if name else name
if name:
# internally everything is idna
self.name = idna_encode(str(name))
# we'll keep a decoded version around for logs and errors
self.decoded_name = idna_decode(self.name)
else:
self.name = self.decoded_name = name
self.source = source self.source = source
self.ttl = int(data['ttl']) self.ttl = int(data['ttl'])
@ -189,6 +199,12 @@ class Record(EqualityTupleMixin):
return f'{self.name}.{self.zone.name}' return f'{self.name}.{self.zone.name}'
return self.zone.name return self.zone.name
@property
def decoded_fqdn(self):
if self.decoded_name:
return f'{self.decoded_name}.{self.zone.decoded_name}'
return self.zone.decoded_name
@property @property
def ignored(self): def ignored(self):
return self._octodns.get('ignored', False) return self._octodns.get('ignored', False)
@ -350,7 +366,7 @@ class ValuesMixin(object):
def __repr__(self): def __repr__(self):
values = "', '".join([str(v) for v in self.values]) values = "', '".join([str(v) for v in self.values])
klass = self.__class__.__name__ klass = self.__class__.__name__
return f"<{klass} {self._type} {self.ttl}, {self.fqdn}, ['{values}']>"
return f"<{klass} {self._type} {self.ttl}, {self.decoded_fqdn}, ['{values}']>"
class _GeoMixin(ValuesMixin): class _GeoMixin(ValuesMixin):
@ -400,7 +416,7 @@ class _GeoMixin(ValuesMixin):
if self.geo: if self.geo:
klass = self.__class__.__name__ klass = self.__class__.__name__
return ( return (
f'<{klass} {self._type} {self.ttl}, {self.fqdn}, '
f'<{klass} {self._type} {self.ttl}, {self.decoded_fqdn}, '
f'{self.values}, {self.geo}>' f'{self.values}, {self.geo}>'
) )
return super(_GeoMixin, self).__repr__() return super(_GeoMixin, self).__repr__()
@ -432,7 +448,7 @@ class ValueMixin(object):
def __repr__(self): def __repr__(self):
klass = self.__class__.__name__ klass = self.__class__.__name__
return f'<{klass} {self._type} {self.ttl}, {self.fqdn}, {self.value}>'
return f'<{klass} {self._type} {self.ttl}, {self.decoded_fqdn}, {self.value}>'
class _DynamicPool(object): class _DynamicPool(object):
@ -760,7 +776,7 @@ class _DynamicMixin(object):
klass = self.__class__.__name__ klass = self.__class__.__name__
return ( return (
f'<{klass} {self._type} {self.ttl}, {self.fqdn}, '
f'<{klass} {self._type} {self.ttl}, {self.decoded_fqdn}, '
f'{values}, {self.dynamic}>' f'{values}, {self.dynamic}>'
) )
return super(_DynamicMixin, self).__repr__() return super(_DynamicMixin, self).__repr__()


+ 2
- 1
octodns/zone.py View File

@ -35,8 +35,9 @@ class Zone(object):
def __init__(self, name, sub_zones): def __init__(self, name, sub_zones):
if not name[-1] == '.': if not name[-1] == '.':
raise Exception(f'Invalid zone name {name}, missing ending dot') raise Exception(f'Invalid zone name {name}, missing ending dot')
# Force everything to lowercase just to be safe
# internally everything is idna
self.name = str(name).lower() if name else name self.name = str(name).lower() if name else name
# we'll keep a decoded version around for logs and errors
self.decoded_name = idna_decode(self.name) self.decoded_name = idna_decode(self.name)
self.sub_zones = sub_zones self.sub_zones = sub_zones
# We're grouping by node, it allows us to efficiently search for # We're grouping by node, it allows us to efficiently search for


Loading…
Cancel
Save