Browse Source

Invalidate NS1 dynamic records with missing notes

pull/799/head
Viranch Mehta 4 years ago
parent
commit
ab897f65d9
No known key found for this signature in database GPG Key ID: D83D1392AE9F93B4
2 changed files with 51 additions and 4 deletions
  1. +11
    -3
      octodns/provider/ns1.py
  2. +40
    -1
      tests/test_octodns_provider_ns1.py

+ 11
- 3
octodns/provider/ns1.py View File

@ -771,13 +771,21 @@ class Ns1Provider(BaseProvider):
def _data_for_CNAME(self, _type, record): def _data_for_CNAME(self, _type, record):
if record.get('tier', 1) > 1: if record.get('tier', 1) > 1:
# Advanced dynamic record
return self._data_for_dynamic(_type, record)
# Advanced record, see if it's first answer has a note
try:
first_answer_note = record['answers'][0]['meta']['note']
except (IndexError, KeyError):
first_answer_note = ''
# If that note includes a `pool` it's a valid dynamic record
if 'pool:' in first_answer_note:
return self._data_for_dynamic(_type, record)
# If not, it can't be parsed. Let it be an empty record
try: try:
value = record['short_answers'][0] value = record['short_answers'][0]
except IndexError:
except (IndexError, KeyError):
value = None value = None
return { return {
'ttl': record['ttl'], 'ttl': record['ttl'],
'type': _type, 'type': _type,


+ 40
- 1
tests/test_octodns_provider_ns1.py View File

@ -1961,7 +1961,7 @@ class TestNs1ProviderDynamic(TestCase):
'meta': { 'meta': {
'priority': 1, 'priority': 1,
'weight': 12, 'weight': 12,
'note': f'from:{catchall_pool_name}',
'note': f'pool:iad from:{catchall_pool_name}',
'up': {}, 'up': {},
}, },
'region': catchall_pool_name, 'region': catchall_pool_name,
@ -2009,6 +2009,45 @@ class TestNs1ProviderDynamic(TestCase):
'value': 'value.unit.tests.', 'value': 'value.unit.tests.',
}, data) }, data)
def test_data_for_invalid_dynamic_CNAME(self):
provider = Ns1Provider('test', 'api-key')
# Potential setup created outside of octoDNS, so it could be missing
# notes and region names can be arbitrary
filters = provider._get_updated_filter_chain(False, False)
ns1_record = {
'answers': [{
'answer': ['iad.unit.tests.'],
'meta': {
'priority': 1,
'weight': 12,
'up': {},
},
'region': 'global',
}, {
'answer': ['value.unit.tests.'],
'meta': {
'priority': 2,
'up': {},
},
'region': 'global',
}],
'domain': 'foo.unit.tests',
'filters': filters,
'regions': {
'global': {},
},
'tier': 3,
'ttl': 44,
'type': 'CNAME',
}
data = provider._data_for_CNAME('CNAME', ns1_record)
self.assertEquals({
'ttl': 44,
'type': 'CNAME',
'value': None,
}, data)
@patch('ns1.rest.records.Records.retrieve') @patch('ns1.rest.records.Records.retrieve')
@patch('ns1.rest.zones.Zones.retrieve') @patch('ns1.rest.zones.Zones.retrieve')
@patch('octodns.provider.ns1.Ns1Provider._monitors_for') @patch('octodns.provider.ns1.Ns1Provider._monitors_for')


Loading…
Cancel
Save