mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
179 lines
5.9 KiB
Python
179 lines
5.9 KiB
Python
#
|
|
#
|
|
#
|
|
|
|
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 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)
|