|
|
|
@ -5,174 +5,12 @@ |
|
|
|
from __future__ import absolute_import, division, print_function, \ |
|
|
|
unicode_literals |
|
|
|
|
|
|
|
from os import path |
|
|
|
from os.path import dirname, isfile |
|
|
|
from unittest import TestCase |
|
|
|
|
|
|
|
from octodns.provider.etc_hosts import EtcHostsProvider |
|
|
|
from octodns.provider.plan import Plan |
|
|
|
from octodns.record import Record |
|
|
|
from octodns.zone import Zone |
|
|
|
|
|
|
|
from helpers import TemporaryDirectory |
|
|
|
class TestEtcHostsShim(TestCase): |
|
|
|
|
|
|
|
|
|
|
|
class TestEtcHostsProvider(TestCase): |
|
|
|
|
|
|
|
def test_provider(self): |
|
|
|
source = EtcHostsProvider('test', path.join(dirname(__file__), |
|
|
|
'config')) |
|
|
|
|
|
|
|
zone = Zone('unit.tests.', []) |
|
|
|
|
|
|
|
# We never populate anything, when acting as a source |
|
|
|
source.populate(zone, target=source) |
|
|
|
self.assertEquals(0, len(zone.records)) |
|
|
|
# Same if we're acting as a target |
|
|
|
source.populate(zone) |
|
|
|
self.assertEquals(0, len(zone.records)) |
|
|
|
|
|
|
|
record = Record.new(zone, '', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'ALIAS', |
|
|
|
'value': 'www.unit.tests.' |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
|
|
|
|
record = Record.new(zone, 'www', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'AAAA', |
|
|
|
'value': '2001:4860:4860::8888', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
record = Record.new(zone, 'www', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'A', |
|
|
|
'values': ['1.1.1.1', '2.2.2.2'], |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
|
|
|
|
record = record.new(zone, 'v6', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'AAAA', |
|
|
|
'value': '2001:4860:4860::8844', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
|
|
|
|
record = record.new(zone, 'start', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'CNAME', |
|
|
|
'value': 'middle.unit.tests.', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
record = record.new(zone, 'middle', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'CNAME', |
|
|
|
'value': 'unit.tests.', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
|
|
|
|
record = record.new(zone, 'ext', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'CNAME', |
|
|
|
'value': 'github.com.', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
|
|
|
|
record = record.new(zone, '*', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'A', |
|
|
|
'value': '3.3.3.3', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
|
|
|
|
with TemporaryDirectory() as td: |
|
|
|
# Add some subdirs to make sure that it can create them |
|
|
|
directory = path.join(td.dirname, 'sub', 'dir') |
|
|
|
hosts_file = path.join(directory, 'unit.tests.hosts') |
|
|
|
target = EtcHostsProvider('test', directory) |
|
|
|
|
|
|
|
# We add everything |
|
|
|
plan = target.plan(zone) |
|
|
|
self.assertEquals(len(zone.records), len(plan.changes)) |
|
|
|
self.assertFalse(isfile(hosts_file)) |
|
|
|
|
|
|
|
# Now actually do it |
|
|
|
self.assertEquals(len(zone.records), target.apply(plan)) |
|
|
|
self.assertTrue(isfile(hosts_file)) |
|
|
|
|
|
|
|
with open(hosts_file) as fh: |
|
|
|
data = fh.read() |
|
|
|
# v6 |
|
|
|
self.assertTrue('2001:4860:4860::8844\tv6.unit.tests' in data) |
|
|
|
# www |
|
|
|
self.assertTrue('1.1.1.1\twww.unit.tests' in data) |
|
|
|
# root ALIAS |
|
|
|
self.assertTrue('# unit.tests -> www.unit.tests' in data) |
|
|
|
self.assertTrue('1.1.1.1\tunit.tests' in data) |
|
|
|
|
|
|
|
self.assertTrue('# start.unit.tests -> middle.unit.tests' in |
|
|
|
data) |
|
|
|
self.assertTrue('# middle.unit.tests -> unit.tests' in data) |
|
|
|
self.assertTrue('# unit.tests -> www.unit.tests' in data) |
|
|
|
self.assertTrue('1.1.1.1 start.unit.tests' in data) |
|
|
|
|
|
|
|
# second empty run that won't create dirs and overwrites file |
|
|
|
plan = Plan(zone, zone, [], True) |
|
|
|
self.assertEquals(0, target.apply(plan)) |
|
|
|
|
|
|
|
def test_cname_loop(self): |
|
|
|
source = EtcHostsProvider('test', path.join(dirname(__file__), |
|
|
|
'config')) |
|
|
|
|
|
|
|
zone = Zone('unit.tests.', []) |
|
|
|
|
|
|
|
# We never populate anything, when acting as a source |
|
|
|
source.populate(zone, target=source) |
|
|
|
self.assertEquals(0, len(zone.records)) |
|
|
|
# Same if we're acting as a target |
|
|
|
source.populate(zone) |
|
|
|
self.assertEquals(0, len(zone.records)) |
|
|
|
|
|
|
|
record = Record.new(zone, 'start', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'CNAME', |
|
|
|
'value': 'middle.unit.tests.', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
record = Record.new(zone, 'middle', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'CNAME', |
|
|
|
'value': 'loop.unit.tests.', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
record = Record.new(zone, 'loop', { |
|
|
|
'ttl': 60, |
|
|
|
'type': 'CNAME', |
|
|
|
'value': 'start.unit.tests.', |
|
|
|
}) |
|
|
|
zone.add_record(record) |
|
|
|
|
|
|
|
with TemporaryDirectory() as td: |
|
|
|
# Add some subdirs to make sure that it can create them |
|
|
|
directory = path.join(td.dirname, 'sub', 'dir') |
|
|
|
hosts_file = path.join(directory, 'unit.tests.hosts') |
|
|
|
target = EtcHostsProvider('test', directory) |
|
|
|
|
|
|
|
# We add everything |
|
|
|
plan = target.plan(zone) |
|
|
|
self.assertEquals(len(zone.records), len(plan.changes)) |
|
|
|
self.assertFalse(isfile(hosts_file)) |
|
|
|
|
|
|
|
# Now actually do it |
|
|
|
self.assertEquals(len(zone.records), target.apply(plan)) |
|
|
|
self.assertTrue(isfile(hosts_file)) |
|
|
|
|
|
|
|
with open(hosts_file) as fh: |
|
|
|
data = fh.read() |
|
|
|
self.assertTrue('# loop.unit.tests -> start.unit.tests ' |
|
|
|
'**loop**' in data) |
|
|
|
self.assertTrue('# middle.unit.tests -> loop.unit.tests ' |
|
|
|
'**loop**' in data) |
|
|
|
self.assertTrue('# start.unit.tests -> middle.unit.tests ' |
|
|
|
'**loop**' in data) |
|
|
|
def test_missing(self): |
|
|
|
with self.assertRaises(ModuleNotFoundError): |
|
|
|
from octodns.provider.etc_hosts import EtcHostsProvider |
|
|
|
EtcHostsProvider |