From eec7cadb8664a446b741f94590fcfbd20ba36cfc Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Fri, 6 Oct 2023 15:10:47 -0700 Subject: [PATCH] refactor filter based processors to pull out shared logic --- octodns/processor/filter.py | 117 ++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 60 deletions(-) diff --git a/octodns/processor/filter.py b/octodns/processor/filter.py index f661dbf..078fcf5 100644 --- a/octodns/processor/filter.py +++ b/octodns/processor/filter.py @@ -7,7 +7,41 @@ from re import compile as re_compile from .base import BaseProcessor -class TypeAllowlistFilter(BaseProcessor): +class AllowsMixin: + def matches(self, zone, record): + pass + + def doesnt_match(self, zone, record): + zone.remove_record(record) + + +class RejectsMixin: + def matches(self, zone, record): + zone.remove_record(record) + + def doesnt_match(self, zone, record): + pass + + +class _TypeBaseFilter(BaseProcessor): + def __init__(self, name, _list): + super().__init__(name) + self._list = set(_list) + + def _process(self, zone, *args, **kwargs): + for record in zone.records: + if record._type in self._list: + self.matches(zone, record) + else: + self.doesnt_match(zone, record) + + return zone + + process_source_zone = _process + process_target_zone = _process + + +class TypeAllowlistFilter(_TypeBaseFilter, AllowsMixin): '''Only manage records of the specified type(s). Example usage: @@ -30,21 +64,10 @@ class TypeAllowlistFilter(BaseProcessor): ''' def __init__(self, name, allowlist): - super().__init__(name) - self.allowlist = set(allowlist) - - def _process(self, zone, *args, **kwargs): - for record in zone.records: - if record._type not in self.allowlist: - zone.remove_record(record) - - return zone - - process_source_zone = _process - process_target_zone = _process + super().__init__(name, allowlist) -class TypeRejectlistFilter(BaseProcessor): +class TypeRejectlistFilter(_TypeBaseFilter, RejectsMixin): '''Ignore records of the specified type(s). Example usage: @@ -66,18 +89,7 @@ class TypeRejectlistFilter(BaseProcessor): ''' def __init__(self, name, rejectlist): - super().__init__(name) - self.rejectlist = set(rejectlist) - - def _process(self, zone, *args, **kwargs): - for record in zone.records: - if record._type in self.rejectlist: - zone.remove_record(record) - - return zone - - process_source_zone = _process - process_target_zone = _process + super().__init__(name, rejectlist) class _NameBaseFilter(BaseProcessor): @@ -93,8 +105,25 @@ class _NameBaseFilter(BaseProcessor): self.exact = exact self.regex = regex + def _process(self, zone, *args, **kwargs): + for record in zone.records: + name = record.name + if name in self.exact: + self.matches(zone, record) + continue + elif any(r.search(name) for r in self.regex): + self.matches(zone, record) + continue -class NameAllowlistFilter(_NameBaseFilter): + self.doesnt_match(zone, record) + + return zone + + process_source_zone = _process + process_target_zone = _process + + +class NameAllowlistFilter(_NameBaseFilter, AllowsMixin): '''Only manage records with names that match the provider patterns Example usage: @@ -125,23 +154,8 @@ class NameAllowlistFilter(_NameBaseFilter): def __init__(self, name, allowlist): super().__init__(name, allowlist) - def _process(self, zone, *args, **kwargs): - for record in zone.records: - name = record.name - if name in self.exact: - continue - elif any(r.search(name) for r in self.regex): - continue - zone.remove_record(record) - - return zone - - process_source_zone = _process - process_target_zone = _process - - -class NameRejectlistFilter(_NameBaseFilter): +class NameRejectlistFilter(_NameBaseFilter, RejectsMixin): '''Reject managing records with names that match the provider patterns Example usage: @@ -172,23 +186,6 @@ class NameRejectlistFilter(_NameBaseFilter): def __init__(self, name, rejectlist): super().__init__(name, rejectlist) - def _process(self, zone, *args, **kwargs): - for record in zone.records: - name = record.name - if name in self.exact: - zone.remove_record(record) - continue - - for regex in self.regex: - if regex.search(name): - zone.remove_record(record) - break - - return zone - - process_source_zone = _process - process_target_zone = _process - class IgnoreRootNsFilter(BaseProcessor): '''Do not manage Root NS Records.