1
0
mirror of https://github.com/github/octodns.git synced 2024-05-11 05:55:00 +00:00

Add support for ignored records.

```yaml
ignored:
  octodns:
    ignored: true
  type: A
  value: 1.2.3.4
```
This commit is contained in:
Ross McFarland
2017-06-04 19:03:38 -07:00
parent 1e329f1345
commit ff2fec72d8
7 changed files with 58 additions and 10 deletions

View File

@@ -112,6 +112,9 @@ class Record(object):
raise Exception('Invalid record {}, missing ttl'.format(self.fqdn)) raise Exception('Invalid record {}, missing ttl'.format(self.fqdn))
self.source = source self.source = source
octodns = data.get('octodns', {})
self.ignored = octodns.get('ignored', False)
def _data(self): def _data(self):
return {'ttl': self.ttl} return {'ttl': self.ttl}

View File

@@ -76,8 +76,12 @@ class Zone(object):
# Find diffs & removes # Find diffs & removes
for record in filter(_is_eligible, self.records): for record in filter(_is_eligible, self.records):
if record.ignored:
continue
try: try:
desired_record = desired_records[record] desired_record = desired_records[record]
if desired_record.ignored:
continue
except KeyError: except KeyError:
if not target.supports(record): if not target.supports(record):
self.log.debug('changes: skipping record=%s %s - %s does ' self.log.debug('changes: skipping record=%s %s - %s does '
@@ -103,6 +107,8 @@ class Zone(object):
# This uses set math and our special __hash__ and __cmp__ functions as # This uses set math and our special __hash__ and __cmp__ functions as
# well # well
for record in filter(_is_eligible, desired.records - self.records): for record in filter(_is_eligible, desired.records - self.records):
if record.ignored:
continue
if not target.supports(record): if not target.supports(record):
self.log.debug('changes: skipping record=%s %s - %s does not ' self.log.debug('changes: skipping record=%s %s - %s does not '
'support it', record.fqdn, record._type, 'support it', record.fqdn, record._type,

View File

@@ -51,6 +51,11 @@ cname:
ttl: 300 ttl: 300
type: CNAME type: CNAME
value: unit.tests. value: unit.tests.
ignored:
octodns:
ignored: true
type: A
value: 9.9.9.9
mx: mx:
ttl: 300 ttl: 300
type: MX type: MX

View File

@@ -129,8 +129,8 @@ class TestDnsimpleProvider(TestCase):
] ]
plan = provider.plan(self.expected) plan = provider.plan(self.expected)
# No root NS # No root NS, no ignored
n = len(self.expected.records) - 1 n = len(self.expected.records) - 2
self.assertEquals(n, len(plan.changes)) self.assertEquals(n, len(plan.changes))
self.assertEquals(n, provider.apply(plan)) self.assertEquals(n, provider.apply(plan))

View File

@@ -78,7 +78,8 @@ class TestPowerDnsProvider(TestCase):
expected = Zone('unit.tests.', []) expected = Zone('unit.tests.', [])
source = YamlProvider('test', join(dirname(__file__), 'config')) source = YamlProvider('test', join(dirname(__file__), 'config'))
source.populate(expected) source.populate(expected)
self.assertEquals(14, len(expected.records)) expected_n = len(expected.records) - 1
self.assertEquals(14, expected_n)
# No diffs == no changes # No diffs == no changes
with requests_mock() as mock: with requests_mock() as mock:
@@ -93,7 +94,7 @@ class TestPowerDnsProvider(TestCase):
# Used in a minute # Used in a minute
def assert_rrsets_callback(request, context): def assert_rrsets_callback(request, context):
data = loads(request.body) data = loads(request.body)
self.assertEquals(len(expected.records), len(data['rrsets'])) self.assertEquals(expected_n, len(data['rrsets']))
return '' return ''
# No existing records -> creates for every record in expected # No existing records -> creates for every record in expected
@@ -103,8 +104,8 @@ class TestPowerDnsProvider(TestCase):
mock.patch(ANY, status_code=201, text=assert_rrsets_callback) mock.patch(ANY, status_code=201, text=assert_rrsets_callback)
plan = provider.plan(expected) plan = provider.plan(expected)
self.assertEquals(len(expected.records), len(plan.changes)) self.assertEquals(expected_n, len(plan.changes))
self.assertEquals(len(expected.records), provider.apply(plan)) self.assertEquals(expected_n, provider.apply(plan))
# Non-existent zone -> creates for every record in expected # Non-existent zone -> creates for every record in expected
# OMG this is fucking ugly, probably better to ditch requests_mocks and # OMG this is fucking ugly, probably better to ditch requests_mocks and
@@ -121,8 +122,8 @@ class TestPowerDnsProvider(TestCase):
mock.post(ANY, status_code=201, text=assert_rrsets_callback) mock.post(ANY, status_code=201, text=assert_rrsets_callback)
plan = provider.plan(expected) plan = provider.plan(expected)
self.assertEquals(len(expected.records), len(plan.changes)) self.assertEquals(expected_n, len(plan.changes))
self.assertEquals(len(expected.records), provider.apply(plan)) self.assertEquals(expected_n, provider.apply(plan))
with requests_mock() as mock: with requests_mock() as mock:
# get 422's, unknown zone # get 422's, unknown zone
@@ -166,7 +167,7 @@ class TestPowerDnsProvider(TestCase):
expected = Zone('unit.tests.', []) expected = Zone('unit.tests.', [])
source = YamlProvider('test', join(dirname(__file__), 'config')) source = YamlProvider('test', join(dirname(__file__), 'config'))
source.populate(expected) source.populate(expected)
self.assertEquals(14, len(expected.records)) self.assertEquals(15, len(expected.records))
# A small change to a single record # A small change to a single record
with requests_mock() as mock: with requests_mock() as mock:

View File

@@ -30,7 +30,7 @@ class TestYamlProvider(TestCase):
# without it we see everything # without it we see everything
source.populate(zone) source.populate(zone)
self.assertEquals(14, len(zone.records)) self.assertEquals(15, len(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

View File

@@ -172,3 +172,36 @@ class TestZone(TestCase):
with self.assertRaises(SubzoneRecordException) as ctx: with self.assertRaises(SubzoneRecordException) as ctx:
zone.add_record(record) zone.add_record(record)
self.assertTrue('under a managed sub-zone', ctx.exception.message) self.assertTrue('under a managed sub-zone', ctx.exception.message)
def test_ignored_records(self):
zone_normal = Zone('unit.tests.', [])
zone_ignored = Zone('unit.tests.', [])
zone_missing = Zone('unit.tests.', [])
normal = Record.new(zone_normal, 'www', {
'ttl': 60,
'type': 'A',
'value': '9.9.9.9',
})
zone_normal.add_record(normal)
ignored = Record.new(zone_ignored, 'www', {
'octodns': {
'ignored': True
},
'ttl': 60,
'type': 'A',
'value': '9.9.9.9',
})
zone_ignored.add_record(ignored)
provider = SimpleProvider()
self.assertFalse(zone_normal.changes(zone_ignored, provider))
self.assertTrue(zone_normal.changes(zone_missing, provider))
self.assertFalse(zone_ignored.changes(zone_normal, provider))
self.assertFalse(zone_ignored.changes(zone_missing, provider))
self.assertTrue(zone_missing.changes(zone_normal, provider))
self.assertFalse(zone_missing.changes(zone_ignored, provider))