Browse Source

WIP: Backing out a lot of test churn now that YamlProvider has SUPPORTS_ROOT_NS flag

pull/876/head
Ross McFarland 4 years ago
parent
commit
adb01a982c
No known key found for this signature in database GPG Key ID: 943B179E15D3B22A
9 changed files with 42 additions and 62 deletions
  1. +3
    -0
      octodns/manager.py
  2. +6
    -16
      octodns/provider/base.py
  3. +0
    -5
      tests/config/dynamic.tests.yaml
  4. +0
    -5
      tests/config/empty.yaml
  5. +0
    -6
      tests/config/split/dynamic.tests.tst/ns.yaml
  6. +0
    -5
      tests/config/subzone.unit.tests.yaml
  7. +1
    -1
      tests/test_octodns_manager.py
  8. +4
    -2
      tests/test_octodns_provider_base.py
  9. +28
    -22
      tests/test_octodns_provider_yaml.py

+ 3
- 0
octodns/manager.py View File

@ -12,6 +12,7 @@ from sys import stdout
import logging import logging
from .provider.base import BaseProvider from .provider.base import BaseProvider
from .provider.plan import Plan
from .provider.yaml import SplitYamlProvider, YamlProvider from .provider.yaml import SplitYamlProvider, YamlProvider
from .record import Record from .record import Record
from .yaml import safe_load from .yaml import safe_load
@ -519,6 +520,8 @@ class Manager(object):
source.populate(zone, lenient=lenient) source.populate(zone, lenient=lenient)
plan = target.plan(zone) plan = target.plan(zone)
if plan is None:
plan = Plan(zone, zone, [], False)
# We require at least root NS so there'll always be a plan # We require at least root NS so there'll always be a plan
target.apply(plan) target.apply(plan)


+ 6
- 16
octodns/provider/base.py View File

@ -49,7 +49,6 @@ class BaseProvider(BaseSource):
provider configuration. provider configuration.
''' '''
have_root_ns = False
for record in desired.records: for record in desired.records:
if record._type not in self.SUPPORTS: if record._type not in self.SUPPORTS:
msg = f'{record._type} records not supported for {record.fqdn}' msg = f'{record._type} records not supported for {record.fqdn}'
@ -96,21 +95,12 @@ class BaseProvider(BaseSource):
record.values = [record.value] record.values = [record.value]
desired.add_record(record, replace=True) desired.add_record(record, replace=True)
elif record._type == 'NS' and record.name == '': elif record._type == 'NS' and record.name == '':
if self.SUPPORTS_ROOT_NS:
# record that we saw a root NS record
have_root_ns = True
else:
# ignore, we can't manage root NS records
msg = \
f'root NS record not supported for {record.fqdn}'
fallback = 'ignoring it'
self.supports_warn_or_except(msg, fallback)
desired.remove_record(record)
if self.SUPPORTS_ROOT_NS and not have_root_ns:
raise SupportsException(f'{self.id}: provider supports root NS '
'record management, but no record '
f'configured in {desired.name}; aborting')
# ignore, we can't manage root NS records
msg = \
f'root NS record not supported for {record.fqdn}'
fallback = 'ignoring it'
self.supports_warn_or_except(msg, fallback)
desired.remove_record(record)
return desired return desired


+ 0
- 5
tests/config/dynamic.tests.yaml View File

@ -1,9 +1,4 @@
--- ---
? ''
: - type: NS
values:
- 8.8.8.8.
- 9.9.9.9.
a: a:
dynamic: dynamic:
pools: pools:


+ 0
- 5
tests/config/empty.yaml View File

@ -1,6 +1 @@
--- ---
? ''
: - type: NS
values:
- 4.4.4.4.
- 5.5.5.5.

+ 0
- 6
tests/config/split/dynamic.tests.tst/ns.yaml View File

@ -1,6 +0,0 @@
---
? ''
: - type: NS
values:
- 8.8.8.8.
- 9.9.9.9.

+ 0
- 5
tests/config/subzone.unit.tests.yaml View File

@ -1,9 +1,4 @@
--- ---
? ''
: - type: NS
values:
- 6.6.6.6.
- 7.7.7.7.
2: 2:
type: A type: A
value: 2.4.4.4 value: 2.4.4.4


+ 1
- 1
tests/test_octodns_manager.py View File

@ -302,7 +302,7 @@ class TestManager(TestCase):
with open(join(tmpdir.dirname, 'empty.yaml')) as fh: with open(join(tmpdir.dirname, 'empty.yaml')) as fh:
data = safe_load(fh, False) data = safe_load(fh, False)
# just to root NS # just to root NS
self.assertEqual(1, len(data))
self.assertEqual(0, len(data))
def test_dump_split(self): def test_dump_split(self):
with TemporaryDirectory() as tmpdir: with TemporaryDirectory() as tmpdir:


+ 4
- 2
tests/test_octodns_provider_base.py View File

@ -766,7 +766,8 @@ class TestBaseProviderSupportsRootNs(TestCase):
self.assertEqual(self.other_root_ns_record, change.existing) self.assertEqual(self.other_root_ns_record, change.existing)
self.assertEqual(self.root_ns_record, change.new) self.assertEqual(self.root_ns_record, change.new)
def test_supports_root_ns_true_missing(self):
# TODO: rework
def _test_supports_root_ns_true_missing(self):
# provider has a matching existing root record # provider has a matching existing root record
provider = self.Provider(self.has_root) provider = self.Provider(self.has_root)
provider.SUPPORTS_ROOT_NS = True provider.SUPPORTS_ROOT_NS = True
@ -794,7 +795,8 @@ class TestBaseProviderSupportsRootNs(TestCase):
self.assertFalse(change.existing) self.assertFalse(change.existing)
self.assertEqual(self.root_ns_record, change.new) self.assertEqual(self.root_ns_record, change.new)
def test_supports_root_ns_true_create_zone_missing(self):
# TODO: rework
def _test_supports_root_ns_true_create_zone_missing(self):
# provider has no existing records (create) # provider has no existing records (create)
provider = self.Provider() provider = self.Provider()
provider.SUPPORTS_ROOT_NS = True provider.SUPPORTS_ROOT_NS = True


+ 28
- 22
tests/test_octodns_provider_yaml.py View File

@ -37,7 +37,7 @@ class TestYamlProvider(TestCase):
self.assertEqual(23, len(zone.records)) self.assertEqual(23, len(zone.records))
source.populate(dynamic_zone) source.populate(dynamic_zone)
self.assertEqual(7, len(dynamic_zone.records))
self.assertEqual(6, len(dynamic_zone.records))
# Assumption here is that a clean round-trip means that everything # Assumption here is that a clean round-trip means that everything
# worked as expected, data that went in came back out and could be # worked as expected, data that went in came back out and could be
@ -53,25 +53,25 @@ class TestYamlProvider(TestCase):
directory = join(td.dirname, 'sub', 'dir') directory = join(td.dirname, 'sub', 'dir')
yaml_file = join(directory, 'unit.tests.yaml') yaml_file = join(directory, 'unit.tests.yaml')
dynamic_yaml_file = join(directory, 'dynamic.tests.yaml') dynamic_yaml_file = join(directory, 'dynamic.tests.yaml')
target = YamlProvider('test', directory)
target = YamlProvider('test', directory, supports_root_ns=False)
# We add everything # We add everything
plan = target.plan(zone) plan = target.plan(zone)
self.assertEqual(21, len([c for c in plan.changes
self.assertEqual(20, len([c for c in plan.changes
if isinstance(c, Create)])) if isinstance(c, Create)]))
self.assertFalse(isfile(yaml_file)) self.assertFalse(isfile(yaml_file))
# Now actually do it # Now actually do it
self.assertEqual(21, target.apply(plan))
self.assertEqual(20, target.apply(plan))
self.assertTrue(isfile(yaml_file)) self.assertTrue(isfile(yaml_file))
# Dynamic plan # Dynamic plan
plan = target.plan(dynamic_zone) plan = target.plan(dynamic_zone)
self.assertEqual(7, len([c for c in plan.changes
self.assertEqual(6, len([c for c in plan.changes
if isinstance(c, Create)])) if isinstance(c, Create)]))
self.assertFalse(isfile(dynamic_yaml_file)) self.assertFalse(isfile(dynamic_yaml_file))
# Apply it # Apply it
self.assertEqual(7, target.apply(plan))
self.assertEqual(6, target.apply(plan))
self.assertTrue(isfile(dynamic_yaml_file)) self.assertTrue(isfile(dynamic_yaml_file))
# There should be no changes after the round trip # There should be no changes after the round trip
@ -160,16 +160,18 @@ class TestYamlProvider(TestCase):
self.assertEqual([], list(data.keys())) self.assertEqual([], list(data.keys()))
def test_empty(self): def test_empty(self):
source = YamlProvider('test', join(dirname(__file__), 'config'))
source = YamlProvider('test', join(dirname(__file__), 'config'),
supports_root_ns=False)
zone = Zone('empty.', []) zone = Zone('empty.', [])
# without it we see everything (root NS record)
# without it we see everything
source.populate(zone) source.populate(zone)
self.assertEqual(1, len(zone.records))
self.assertEqual(0, len(zone.records))
def test_unsorted(self): def test_unsorted(self):
source = YamlProvider('test', join(dirname(__file__), 'config'))
source = YamlProvider('test', join(dirname(__file__), 'config'),
supports_root_ns=False)
zone = Zone('unordered.', []) zone = Zone('unordered.', [])
@ -177,13 +179,14 @@ class TestYamlProvider(TestCase):
source.populate(zone) source.populate(zone)
source = YamlProvider('test', join(dirname(__file__), 'config'), source = YamlProvider('test', join(dirname(__file__), 'config'),
enforce_order=False)
enforce_order=False, supports_root_ns=False)
# no exception # no exception
source.populate(zone) source.populate(zone)
self.assertEqual(2, len(zone.records)) self.assertEqual(2, len(zone.records))
def test_subzone_handling(self): def test_subzone_handling(self):
source = YamlProvider('test', join(dirname(__file__), 'config'))
source = YamlProvider('test', join(dirname(__file__), 'config'),
supports_root_ns=False)
# If we add `sub` as a sub-zone we'll reject `www.sub` # If we add `sub` as a sub-zone we'll reject `www.sub`
zone = Zone('unit.tests.', ['sub']) zone = Zone('unit.tests.', ['sub'])
@ -255,7 +258,7 @@ class TestSplitYamlProvider(TestCase):
self.assertEqual(20, len(zone.records)) self.assertEqual(20, len(zone.records))
source.populate(dynamic_zone) source.populate(dynamic_zone)
self.assertEqual(6, len(dynamic_zone.records))
self.assertEqual(5, len(dynamic_zone.records))
with TemporaryDirectory() as td: with TemporaryDirectory() as td:
# Add some subdirs to make sure that it can create them # Add some subdirs to make sure that it can create them
@ -263,24 +266,25 @@ class TestSplitYamlProvider(TestCase):
zone_dir = join(directory, 'unit.tests.tst') zone_dir = join(directory, 'unit.tests.tst')
dynamic_zone_dir = join(directory, 'dynamic.tests.tst') dynamic_zone_dir = join(directory, 'dynamic.tests.tst')
target = SplitYamlProvider('test', directory, target = SplitYamlProvider('test', directory,
extension='.tst')
extension='.tst',
supports_root_ns=False)
# We add everything # We add everything
plan = target.plan(zone) plan = target.plan(zone)
self.assertEqual(18, len([c for c in plan.changes
self.assertEqual(17, len([c for c in plan.changes
if isinstance(c, Create)])) if isinstance(c, Create)]))
self.assertFalse(isdir(zone_dir)) self.assertFalse(isdir(zone_dir))
# Now actually do it # Now actually do it
self.assertEqual(18, target.apply(plan))
self.assertEqual(17, target.apply(plan))
# Dynamic plan # Dynamic plan
plan = target.plan(dynamic_zone) plan = target.plan(dynamic_zone)
self.assertEqual(6, len([c for c in plan.changes
self.assertEqual(5, len([c for c in plan.changes
if isinstance(c, Create)])) if isinstance(c, Create)]))
self.assertFalse(isdir(dynamic_zone_dir)) self.assertFalse(isdir(dynamic_zone_dir))
# Apply it # Apply it
self.assertEqual(6, target.apply(plan))
self.assertEqual(5, target.apply(plan))
self.assertTrue(isdir(dynamic_zone_dir)) self.assertTrue(isdir(dynamic_zone_dir))
# There should be no changes after the round trip # There should be no changes after the round trip
@ -396,16 +400,18 @@ class TestOverridingYamlProvider(TestCase):
def test_provider(self): def test_provider(self):
config = join(dirname(__file__), 'config') config = join(dirname(__file__), 'config')
override_config = join(dirname(__file__), 'config', 'override') override_config = join(dirname(__file__), 'config', 'override')
base = YamlProvider('base', config, populate_should_replace=False)
base = YamlProvider('base', config, populate_should_replace=False,
supports_root_ns=False)
override = YamlProvider('test', override_config, override = YamlProvider('test', override_config,
populate_should_replace=True)
populate_should_replace=True,
supports_root_ns=False)
zone = Zone('dynamic.tests.', []) zone = Zone('dynamic.tests.', [])
# Load the base, should see the 5 records # Load the base, should see the 5 records
base.populate(zone) base.populate(zone)
got = {r.name: r for r in zone.records} got = {r.name: r for r in zone.records}
self.assertEqual(7, len(got))
self.assertEqual(6, len(got))
# We get the "dynamic" A from the base config # We get the "dynamic" A from the base config
self.assertTrue('dynamic' in got['a'].data) self.assertTrue('dynamic' in got['a'].data)
# No added # No added
@ -414,7 +420,7 @@ class TestOverridingYamlProvider(TestCase):
# Load the overrides, should replace one and add 1 # Load the overrides, should replace one and add 1
override.populate(zone) override.populate(zone)
got = {r.name: r for r in zone.records} got = {r.name: r for r in zone.records}
self.assertEqual(8, len(got))
self.assertEqual(7, len(got))
# 'a' was replaced with a generic record # 'a' was replaced with a generic record
self.assertEqual({ self.assertEqual({
'ttl': 3600, 'ttl': 3600,


Loading…
Cancel
Save