From 9cb690d64cd8bb29c6530da609bcedff93a8ef76 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 29 Jul 2023 12:02:26 -0700 Subject: [PATCH 01/10] Remove a python 3.7 import work-around --- octodns/manager.py | 14 ++------------ setup.py | 2 +- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/octodns/manager.py b/octodns/manager.py index b8fb0ff..230a495 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -5,6 +5,8 @@ from collections import deque from concurrent.futures import ThreadPoolExecutor from importlib import import_module +from importlib.metadata import PackageNotFoundError +from importlib.metadata import version as module_version from logging import getLogger from os import environ from sys import stdout @@ -19,18 +21,6 @@ from .record import Record from .yaml import safe_load from .zone import Zone -# TODO: this can go away once we no longer support python 3.7 -try: # pragma: no cover - from importlib.metadata import PackageNotFoundError - from importlib.metadata import version as module_version -except ModuleNotFoundError: # pragma: no cover - - class PackageNotFoundError(Exception): - pass - - def module_version(*args, **kargs): - raise PackageNotFoundError('placeholder') - class _AggregateTarget(object): id = 'aggregate' diff --git a/setup.py b/setup.py index 78ed20d..aa02a1a 100644 --- a/setup.py +++ b/setup.py @@ -99,7 +99,7 @@ setup( long_description_content_type='text/markdown', name='octodns', packages=find_packages(), - python_requires='>=3.6', + python_requires='>=3.8', tests_require=tests_require, url='https://github.com/octodns/octodns', version=version(), From 15390a667926ceb97577acc0c9427fcf0c9f9a95 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 29 Jul 2023 17:28:36 -0700 Subject: [PATCH 02/10] CHANGELOG entry about py 3.8 req --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d50860..264a923 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## v1.0.0 - 2023-??-?? - The One + +#### Stuff + +* Removal of a Python 3.7 specific import work-around now that it's no longer an + active/supported version. Also bumps required minimum version of Python 3.8 + ## v1.0.0.rc1 - 2023-07-20 - The last one before the 1s * Record and Zone validation now ensures there's no whitespace in names From f94ae67d77d7cd30ae8080e60f70280587e8e7a9 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 29 Jul 2023 17:48:21 -0700 Subject: [PATCH 03/10] Remove Dyn related logging quell --- octodns/cmds/args.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/octodns/cmds/args.py b/octodns/cmds/args.py index 89a30bd..ddfefc3 100644 --- a/octodns/cmds/args.py +++ b/octodns/cmds/args.py @@ -105,5 +105,3 @@ class ArgumentParser(_Base): # TODO: these should move out of octoDNS core... # boto is noisy, set it to warn getLogger('botocore').level = WARNING - # DynectSession is noisy too - getLogger('DynectSession').level = WARNING From abb80e509db6baa9d0e9f0da62c9ff3833203db9 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 29 Jul 2023 17:48:26 -0700 Subject: [PATCH 04/10] Remove old non-actionable TODO --- octodns/provider/plan.py | 1 - 1 file changed, 1 deletion(-) diff --git a/octodns/provider/plan.py b/octodns/provider/plan.py index 7a13da5..e0f235d 100644 --- a/octodns/provider/plan.py +++ b/octodns/provider/plan.py @@ -79,7 +79,6 @@ class Plan(object): ) def raise_if_unsafe(self): - # TODO: what is safe really? if ( self.existing and len(self.existing.records) >= self.MIN_EXISTING_RECORDS From c649a9c9993f371c0b885b0a7a0a4e76ab2c2ca6 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 29 Jul 2023 17:57:35 -0700 Subject: [PATCH 05/10] Formally deprecate Zone._remove_record in favor of Zone.remove_record --- octodns/zone.py | 8 ++++++-- tests/test_octodns_zone.py | 10 +++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/octodns/zone.py b/octodns/zone.py index 9cbc712..8855986 100644 --- a/octodns/zone.py +++ b/octodns/zone.py @@ -161,8 +161,12 @@ class Zone(object): self._records[record.name].discard(record) - # TODO: delete this - _remove_record = remove_record + # TODO: delete this at v2.0.0rc0 + def _remove_record(self, record): + self.log.warning( + '_remove_record: method has been deprecated, used remove_record instead' + ) + return self.remove_record(record) def changes(self, desired, target): self.log.debug('changes: zone=%s, target=%s', self, target) diff --git a/tests/test_octodns_zone.py b/tests/test_octodns_zone.py index 93d8a87..6563105 100644 --- a/tests/test_octodns_zone.py +++ b/tests/test_octodns_zone.py @@ -125,7 +125,7 @@ class TestZone(TestCase): # add a record, delete a record -> [Delete, Create] c = ARecord(before, 'c', {'ttl': 42, 'value': '1.1.1.1'}) after.add_record(c) - after._remove_record(b) + after.remove_record(b) self.assertEqual(after.records, set([a, c])) changes = before.changes(after, target) self.assertEqual(2, len(changes)) @@ -154,6 +154,14 @@ class TestZone(TestCase): self.assertFalse(changed.changes(update.new, target)) update.__repr__() + def test_deprecated__remove_record(self): + zone = Zone('unit.tests.', []) + a = ARecord(zone, 'a', {'ttl': 42, 'value': '1.1.1.1'}) + zone.add_record(a) + self.assertEqual({a}, zone.records) + zone._remove_record(a) + self.assertEqual(set(), zone.records) + def test_unsupporting(self): class NoAaaaProvider(object): id = 'no-aaaa' From 6a7d5349e0a0b69a64a90eaa00fdd0c6f3bc759e Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 29 Jul 2023 18:02:10 -0700 Subject: [PATCH 06/10] Remove botocore logging quell, moved to octodns-route53 --- octodns/cmds/args.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/octodns/cmds/args.py b/octodns/cmds/args.py index ddfefc3..52b42da 100644 --- a/octodns/cmds/args.py +++ b/octodns/cmds/args.py @@ -101,7 +101,3 @@ class ArgumentParser(_Base): # we still want plans to come out during quite so set the plan # logger output to info in case the PlanLogger is being used getLogger('Plan').setLevel(INFO) - - # TODO: these should move out of octoDNS core... - # boto is noisy, set it to warn - getLogger('botocore').level = WARNING From c908d9065613b5ca0577d266d480150f3fa61fcd Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sat, 29 Jul 2023 18:16:56 -0700 Subject: [PATCH 07/10] Uncomment some lightweight dynamic yaml tests that were TODO'd --- tests/test_octodns_provider_yaml.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/tests/test_octodns_provider_yaml.py b/tests/test_octodns_provider_yaml.py index 1796bb4..998d797 100644 --- a/tests/test_octodns_provider_yaml.py +++ b/tests/test_octodns_provider_yaml.py @@ -139,32 +139,31 @@ class TestYamlProvider(TestCase): with open(dynamic_yaml_file) as fh: data = safe_load(fh.read()) - # make sure new dynamic records made the trip + # make sure dynamic records made the trip dyna = data.pop('a') self.assertTrue('values' in dyna) - # self.assertTrue('dynamic' in dyna) - # TODO: + self.assertTrue('dynamic' in dyna) - # make sure new dynamic records made the trip + # make sure dynamic records made the trip dyna = data.pop('aaaa') self.assertTrue('values' in dyna) - # self.assertTrue('dynamic' in dyna) + self.assertTrue('dynamic' in dyna) dyna = data.pop('cname') self.assertTrue('value' in dyna) - # self.assertTrue('dynamic' in dyna) + self.assertTrue('dynamic' in dyna) dyna = data.pop('real-ish-a') self.assertTrue('values' in dyna) - # self.assertTrue('dynamic' in dyna) + self.assertTrue('dynamic' in dyna) dyna = data.pop('simple-weighted') self.assertTrue('value' in dyna) - # self.assertTrue('dynamic' in dyna) + self.assertTrue('dynamic' in dyna) dyna = data.pop('pool-only-in-fallback') self.assertTrue('value' in dyna) - # self.assertTrue('dynamic' in dyna) + self.assertTrue('dynamic' in dyna) # make sure nothing is left self.assertEqual([], list(data.keys())) From f9b49b68abd0c8745c17a0652ebafe950f43f67b Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 30 Jul 2023 06:22:32 -0700 Subject: [PATCH 08/10] Comment out netbox modules ci run --- .github/workflows/modules.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/modules.yml b/.github/workflows/modules.yml index 223feee..e084a7b 100644 --- a/.github/workflows/modules.yml +++ b/.github/workflows/modules.yml @@ -37,7 +37,10 @@ jobs: - octodns/octodns-selectel - octodns/octodns-transip - octodns/octodns-ultra - - sukiyaki/octodns-netbox + # has been failing for a while now and afaict not related to octoDNS + # changes commenting out on 2023-07-30, will check on it again in at + # some point in the future and either re-enable or delete it. + #- sukiyaki/octodns-netbox steps: - uses: actions/checkout@master - name: Setup python From 303bc7740d7fee7ae82b668dd8f66a103366ac35 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 30 Jul 2023 06:40:17 -0700 Subject: [PATCH 09/10] Deprecate geo records in favor of dynamic --- CHANGELOG.md | 4 ++++ octodns/record/geo.py | 3 +++ tests/test_octodns_record_geo.py | 25 ++++++++++++++++--------- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 264a923..2449878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## v1.0.0 - 2023-??-?? - The One +#### Noteworthy changes + +* `geo` records are deprecated. + #### Stuff * Removal of a Python 3.7 specific import work-around now that it's no longer an diff --git a/octodns/record/geo.py b/octodns/record/geo.py index 0123b91..af8337c 100644 --- a/octodns/record/geo.py +++ b/octodns/record/geo.py @@ -141,6 +141,9 @@ class _GeoMixin(ValuesMixin): reasons = super().validate(name, fqdn, data) try: geo = dict(data['geo']) + cls.log.warning( + 'NOTICE: `geo` record support is deprecated and should be migrated to `dynamic` records' + ) for code, values in geo.items(): reasons.extend(GeoValue._validate_geo(code)) reasons.extend(cls._value_type.validate(values, cls._type)) diff --git a/tests/test_octodns_record_geo.py b/tests/test_octodns_record_geo.py index b7701c8..420570e 100644 --- a/tests/test_octodns_record_geo.py +++ b/tests/test_octodns_record_geo.py @@ -213,15 +213,22 @@ class TestRecordGeoCodes(TestCase): self.assertTrue(c >= b) def test_validation(self): - Record.new( - self.zone, - '', - { - 'geo': {'NA': ['1.2.3.5'], 'NA-US': ['1.2.3.5', '1.2.3.6']}, - 'type': 'A', - 'ttl': 600, - 'value': '1.2.3.4', - }, + with self.assertLogs('Record', level='WARNING') as cm: + Record.new( + self.zone, + '', + { + 'geo': {'NA': ['1.2.3.5'], 'NA-US': ['1.2.3.5', '1.2.3.6']}, + 'type': 'A', + 'ttl': 600, + 'value': '1.2.3.4', + }, + ) + self.assertEqual( + [ + 'WARNING:Record:NOTICE: `geo` record support is deprecated and should be migrated to `dynamic` records' + ], + cm.output, ) # invalid ip address From 9fac14af085b36023500c06de56f8cedeb8578d6 Mon Sep 17 00:00:00 2001 From: Ross McFarland Date: Sun, 30 Jul 2023 07:09:55 -0700 Subject: [PATCH 10/10] v1.0.0 version bump and changelog update --- CHANGELOG.md | 7 ++++++- octodns/__init__.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2449878..577afec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ -## v1.0.0 - 2023-??-?? - The One +## v1.0.0 - 2023-07-30 - The One + +1.0 marks a point at which we can formally deprecate things that will be +going away with 2.0 more than specific functionality that has been added or +having reached a notable level of stability (beyond what is normal.) It is also +long (years) overdue. #### Noteworthy changes diff --git a/octodns/__init__.py b/octodns/__init__.py index f045bfc..9fb2bbb 100644 --- a/octodns/__init__.py +++ b/octodns/__init__.py @@ -1,3 +1,3 @@ 'OctoDNS: DNS as code - Tools for managing DNS across multiple providers' -__VERSION__ = '1.0.0rc1' +__VERSION__ = '1.0.0'