From fc39697bddd6149ca50a0f7f11b3e47ca5e235d3 Mon Sep 17 00:00:00 2001 From: Viranch Mehta Date: Mon, 16 Aug 2021 20:33:22 -0700 Subject: [PATCH] consider only first PTR value for getting changes --- octodns/manager.py | 26 ++------------------------ octodns/provider/base.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/octodns/manager.py b/octodns/manager.py index a991b4b..104e445 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -294,30 +294,8 @@ class Manager(object): for processor in processors: plan = processor.process_plan(plan, sources=sources, target=target) - if not plan: - continue - - # Multi value PTR check - for change in plan.changes: - record = change.new - if not record: - # Delete - doesn't need to be checked - continue - - if record._type == 'PTR' and len(record.values) > 1 and not \ - target.SUPPORTS_MUTLIVALUE_PTR: - self.log.warn('target=%s does not support multi-value PTR ' - 'record %s; using %s as its only answer', - target, record.fqdn, record.value) - # Make a new copy of the record so as to not change a - # potentially shared object - change.new = Record.new(record.zone, record.name, { - 'type': record._type, - 'ttl': record.ttl, - 'value': record.value, - }, source=record.source, lenient=lenient) - - plans.append((target, plan)) + if plan: + plans.append((target, plan)) # Return the zone as it's the desired state return plans, zone diff --git a/octodns/provider/base.py b/octodns/provider/base.py index 729c9ee..fcb557a 100644 --- a/octodns/provider/base.py +++ b/octodns/provider/base.py @@ -7,6 +7,7 @@ from __future__ import absolute_import, division, print_function, \ from six import text_type +from ..record import Record from ..source.base import BaseSource from ..zone import Zone from .plan import Plan @@ -44,6 +45,35 @@ class BaseProvider(BaseSource): ''' return [] + def _process_change(self, change): + ''' + Process/manipulate each change for feature-specific corner cases + ''' + if not self._include_change(change): + return False + + # Multi value PTR records + record = change.new + if record and record._type == 'PTR' and len(record.values) > 1 and \ + not self.SUPPORTS_MUTLIVALUE_PTR: + # replace with a single-value copy + change.new = Record.new(record.zone, record.name, { + 'type': 'PTR', + 'ttl': record.ttl, + 'values': [record.value], + }, source=record.source) + + existing = change.existing + if existing and not existing.changes(change.new, self): + # if new single-value replacement turns out to be the same, + # skip the change + return False + + self.log.warn('does not support multi-value PTR records; will ' + 'use only %s for %s', record.value, record.fqdn) + + return True + def plan(self, desired, processors=[]): self.log.info('plan: desired=%s', desired.name) @@ -63,7 +93,7 @@ class BaseProvider(BaseSource): # allow the provider to filter out false positives before = len(changes) - changes = [c for c in changes if self._include_change(c)] + changes = [c for c in changes if self._process_change(c)] after = len(changes) if before != after: self.log.info('plan: filtered out %s changes', before - after)