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

Add support for dynamic CNAME records in NS1

This commit is contained in:
Viranch Mehta
2021-04-30 16:53:37 -07:00
parent 3e888b18e1
commit 40569945d2
2 changed files with 138 additions and 4 deletions

View File

@@ -1270,6 +1270,63 @@ class TestNs1ProviderDynamic(TestCase):
params, _ = provider._params_for_geo_A(record)
self.assertEquals([], params['filters'])
@patch('octodns.provider.ns1.Ns1Provider._monitor_sync')
@patch('octodns.provider.ns1.Ns1Provider._monitors_for')
def test_params_for_dynamic_CNAME(self, monitors_for_mock,
monitor_sync_mock):
provider = Ns1Provider('test', 'api-key')
# pre-fill caches to avoid extranious calls (things we're testing
# elsewhere)
provider._client._datasource_id = 'foo'
provider._client._feeds_for_monitors = {
'mon-id': 'feed-id',
}
# provider._params_for_A() calls provider._monitors_for() and
# provider._monitor_sync(). Mock their return values so that we don't
# make NS1 API calls during tests
monitors_for_mock.reset_mock()
monitor_sync_mock.reset_mock()
monitors_for_mock.side_effect = [{
'iad.unit.tests.': 'mid-1',
}]
monitor_sync_mock.side_effect = [
('mid-1', 'fid-1'),
]
record = Record.new(self.zone, 'foo', {
'dynamic': {
'pools': {
'iad': {
'values': [{
'value': 'iad.unit.tests.',
}],
},
},
'rules': [{
'pool': 'iad',
}],
},
'octodns': {
'healthcheck': {
'host': 'send.me',
'path': '/_ping',
'port': 80,
'protocol': 'HTTP',
}
},
'ttl': 32,
'type': 'CNAME',
'value': 'value.unit.tests.',
'meta': {},
})
ret, _ = provider._params_for_CNAME(record)
# Check if the default value was correctly read and populated
# All other dynamic record test cases are covered by dynamic_A tests
self.assertEquals(ret['answers'][1]['answer'][0], 'value.unit.tests.')
def test_data_for_dynamic_A(self):
provider = Ns1Provider('test', 'api-key')
@@ -1471,6 +1528,67 @@ class TestNs1ProviderDynamic(TestCase):
self.assertTrue(
'OC-{}'.format(c) in data4['dynamic']['rules'][0]['geos'])
def test_data_for_dynamic_CNAME(self):
provider = Ns1Provider('test', 'api-key')
# Test out a small setup that just covers default value validation
# Everything else is same as dynamic A whose tests will cover all
# other options and test cases
# Not testing for geo/region specific cases
filters = provider._get_updated_filter_chain(False, False)
catchall_pool_name = 'iad__catchall'
ns1_record = {
'answers': [{
'answer': ['2.3.4.5.unit.tests.'],
'meta': {
'priority': 1,
'weight': 12,
'note': 'from:{}'.format(catchall_pool_name),
},
'region': catchall_pool_name,
}, {
'answer': ['1.2.3.4.unit.tests.'],
'meta': {
'priority': 2,
'note': 'from:--default--',
},
'region': catchall_pool_name,
}],
'domain': 'foo.unit.tests',
'filters': filters,
'regions': {
catchall_pool_name: {
'meta': {
'note': 'rule-order:1',
},
}
},
'tier': 3,
'ttl': 42,
'type': 'CNAME',
}
data = provider._data_for_CNAME('CNAME', ns1_record)
self.assertEquals({
'dynamic': {
'pools': {
'iad': {
'fallback': None,
'values': [{
'value': '2.3.4.5.unit.tests.',
'weight': 12,
}],
},
},
'rules': [{
'_order': '1',
'pool': 'iad',
}],
},
'ttl': 42,
'type': 'CNAME',
'value': '1.2.3.4.unit.tests.',
}, data)
@patch('ns1.rest.records.Records.retrieve')
@patch('ns1.rest.zones.Zones.retrieve')
@patch('octodns.provider.ns1.Ns1Provider._monitors_for')