mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
Added server version checking
This commit is contained in:
@@ -41,11 +41,94 @@ with open('./tests/fixtures/powerdns-full-data.json') as fh:
|
||||
|
||||
class TestPowerDnsProvider(TestCase):
|
||||
|
||||
def test_provider_version_detection(self):
|
||||
provider = PowerDnsProvider('test', 'non.existent', 'api-key',
|
||||
nameserver_values=['8.8.8.8.',
|
||||
'9.9.9.9.'])
|
||||
# Bad auth
|
||||
with requests_mock() as mock:
|
||||
mock.get(ANY, status_code=401, text='Unauthorized')
|
||||
|
||||
with self.assertRaises(Exception) as ctx:
|
||||
provider.detect_version()
|
||||
self.assertTrue('unauthorized' in text_type(ctx.exception))
|
||||
|
||||
# Api not found
|
||||
with requests_mock() as mock:
|
||||
mock.get(ANY, status_code=404, text='Not Found')
|
||||
|
||||
with self.assertRaises(Exception) as ctx:
|
||||
provider.detect_version()
|
||||
self.assertTrue('404' in text_type(ctx.exception))
|
||||
|
||||
# Test version detection
|
||||
with requests_mock() as mock:
|
||||
mock.get('http://non.existent:8081/api/v1/servers/localhost',
|
||||
status_code=200, json={'version': "4.1.10"})
|
||||
|
||||
provider.detect_version()
|
||||
self.assertEquals(provider.version_detected, '4.1.10')
|
||||
|
||||
# Test version detection for second time (should stay at 4.1.10)
|
||||
with requests_mock() as mock:
|
||||
mock.get('http://non.existent:8081/api/v1/servers/localhost',
|
||||
status_code=200, json={'version': "4.2.0"})
|
||||
provider.detect_version()
|
||||
self.assertEquals(provider.version_detected, '4.1.10')
|
||||
|
||||
# Test version detection
|
||||
with requests_mock() as mock:
|
||||
mock.get('http://non.existent:8081/api/v1/servers/localhost',
|
||||
status_code=200, json={'version': "4.2.0"})
|
||||
|
||||
# Reset version, so detection will try again
|
||||
provider.version_detected = ''
|
||||
provider.detect_version()
|
||||
self.assertNotEquals(provider.version_detected, '4.1.10')
|
||||
|
||||
def test_provider_version_config(self):
|
||||
provider = PowerDnsProvider('test', 'non.existent', 'api-key',
|
||||
nameserver_values=['8.8.8.8.',
|
||||
'9.9.9.9.'])
|
||||
|
||||
provider.check_status_not_found = None
|
||||
provider.soa_edit_api = 'something else'
|
||||
|
||||
# Test version 4.1.0
|
||||
provider.configure_for_version("4.1.0")
|
||||
self.assertEquals(provider.soa_edit_api, 'INCEPTION-INCREMENT')
|
||||
self.assertFalse(
|
||||
provider.check_status_not_found,
|
||||
'check_status_not_found should be false '
|
||||
'for version 4.1.x and below')
|
||||
|
||||
# Test version 4.2.0
|
||||
provider.configure_for_version("4.2.0")
|
||||
self.assertEquals(provider.soa_edit_api, 'INCEPTION-INCREMENT')
|
||||
self.assertTrue(
|
||||
provider.check_status_not_found,
|
||||
'check_status_not_found should be true for version 4.2.x')
|
||||
|
||||
# Test version 4.3.0
|
||||
provider.configure_for_version("4.3.0")
|
||||
self.assertEquals(provider.soa_edit_api, 'DEFAULT')
|
||||
self.assertTrue(
|
||||
provider.check_status_not_found,
|
||||
'check_status_not_found should be true for version 4.3.x')
|
||||
|
||||
def test_provider(self):
|
||||
provider = PowerDnsProvider('test', 'non.existent', 'api-key',
|
||||
nameserver_values=['8.8.8.8.',
|
||||
'9.9.9.9.'])
|
||||
|
||||
# Test version detection
|
||||
with requests_mock() as mock:
|
||||
mock.get('http://non.existent:8081/api/v1/servers/localhost',
|
||||
status_code=200, json={'version': "4.1.10"})
|
||||
|
||||
provider.detect_version()
|
||||
self.assertEquals(provider.version_detected, '4.1.10')
|
||||
|
||||
# Bad auth
|
||||
with requests_mock() as mock:
|
||||
mock.get(ANY, status_code=401, text='Unauthorized')
|
||||
@@ -68,18 +151,19 @@ class TestPowerDnsProvider(TestCase):
|
||||
with requests_mock() as mock:
|
||||
mock.get(ANY, status_code=422,
|
||||
json={'error': "Could not find domain 'unit.tests.'"})
|
||||
|
||||
zone = Zone('unit.tests.', [])
|
||||
provider.populate(zone)
|
||||
self.assertEquals(set(), zone.records)
|
||||
|
||||
# Non-existent zone in PowerDNS >=4.3.0 doesn't populate anything
|
||||
# Non-existent zone in PowerDNS >=4.2.0 doesn't populate anything
|
||||
|
||||
with requests_mock() as mock:
|
||||
mock.get(ANY, status_code=404, text='Not Found')
|
||||
|
||||
provider.configure_for_version("4.2.0")
|
||||
zone = Zone('unit.tests.', [])
|
||||
provider.populate(zone)
|
||||
self.assertEquals(set(), zone.records)
|
||||
provider.configure_for_version("4.1.0")
|
||||
|
||||
# The rest of this is messy/complicated b/c it's dealing with mocking
|
||||
|
||||
@@ -124,7 +208,7 @@ class TestPowerDnsProvider(TestCase):
|
||||
not_found = {'error': "Could not find domain 'unit.tests.'"}
|
||||
with requests_mock() as mock:
|
||||
# get 422's, unknown zone
|
||||
mock.get(ANY, status_code=422, text='')
|
||||
mock.get(ANY, status_code=422, text=dumps(not_found))
|
||||
# patch 422's, unknown zone
|
||||
mock.patch(ANY, status_code=422, text=dumps(not_found))
|
||||
# post 201, is response to the create with data
|
||||
@@ -136,6 +220,7 @@ class TestPowerDnsProvider(TestCase):
|
||||
self.assertFalse(plan.exists)
|
||||
|
||||
with requests_mock() as mock:
|
||||
provider.configure_for_version('4.2.0')
|
||||
# get 404's, unknown zone
|
||||
mock.get(ANY, status_code=404, text='')
|
||||
# patch 404's, unknown zone
|
||||
@@ -147,10 +232,11 @@ class TestPowerDnsProvider(TestCase):
|
||||
self.assertEquals(expected_n, len(plan.changes))
|
||||
self.assertEquals(expected_n, provider.apply(plan))
|
||||
self.assertFalse(plan.exists)
|
||||
provider.configure_for_version('4.1.0')
|
||||
|
||||
with requests_mock() as mock:
|
||||
# get 422's, unknown zone
|
||||
mock.get(ANY, status_code=422, text='')
|
||||
mock.get(ANY, status_code=422, text=dumps(not_found))
|
||||
# patch 422's,
|
||||
data = {'error': "Key 'name' not present or not a String"}
|
||||
mock.patch(ANY, status_code=422, text=dumps(data))
|
||||
@@ -164,7 +250,7 @@ class TestPowerDnsProvider(TestCase):
|
||||
|
||||
with requests_mock() as mock:
|
||||
# get 422's, unknown zone
|
||||
mock.get(ANY, status_code=422, text='')
|
||||
mock.get(ANY, status_code=422, text=dumps(not_found))
|
||||
# patch 500's, things just blew up
|
||||
mock.patch(ANY, status_code=500, text='')
|
||||
|
||||
@@ -174,7 +260,7 @@ class TestPowerDnsProvider(TestCase):
|
||||
|
||||
with requests_mock() as mock:
|
||||
# get 422's, unknown zone
|
||||
mock.get(ANY, status_code=422, text='')
|
||||
mock.get(ANY, status_code=422, text=dumps(not_found))
|
||||
# patch 500's, things just blew up
|
||||
mock.patch(ANY, status_code=422, text=dumps(not_found))
|
||||
# post 422's, something wrong with create
|
||||
@@ -195,6 +281,8 @@ class TestPowerDnsProvider(TestCase):
|
||||
# A small change to a single record
|
||||
with requests_mock() as mock:
|
||||
mock.get(ANY, status_code=200, text=FULL_TEXT)
|
||||
mock.get('http://non.existent:8081/api/v1/servers/localhost',
|
||||
status_code=200, json={'version': '4.1.0'})
|
||||
|
||||
missing = Zone(expected.name, [])
|
||||
# Find and delete the SPF record
|
||||
@@ -266,6 +354,8 @@ class TestPowerDnsProvider(TestCase):
|
||||
}]
|
||||
}
|
||||
mock.get(ANY, status_code=200, json=data)
|
||||
mock.get('http://non.existent:8081/api/v1/servers/localhost',
|
||||
status_code=200, json={'version': '4.1.0'})
|
||||
|
||||
unrelated_record = Record.new(expected, '', {
|
||||
'type': 'A',
|
||||
@@ -299,6 +389,8 @@ class TestPowerDnsProvider(TestCase):
|
||||
}]
|
||||
}
|
||||
mock.get(ANY, status_code=200, json=data)
|
||||
mock.get('http://non.existent:8081/api/v1/servers/localhost',
|
||||
status_code=200, json={'version': '4.1.0'})
|
||||
|
||||
plan = provider.plan(expected)
|
||||
self.assertEquals(1, len(plan.changes))
|
||||
@@ -312,22 +404,3 @@ class TestPowerDnsProvider(TestCase):
|
||||
|
||||
plan = provider.plan(expected)
|
||||
self.assertEquals(1, len(plan.changes))
|
||||
|
||||
def test_soa_edit_api(self):
|
||||
provider = PowerDnsProvider('test', 'non.existent', 'api-key',
|
||||
soa_edit_api='DEFAULT')
|
||||
|
||||
def assert_soa_edit_api_callback(request, context):
|
||||
data = loads(request.body)
|
||||
self.assertEquals('DEFAULT', data['soa_edit_api'])
|
||||
return ''
|
||||
|
||||
with requests_mock() as mock:
|
||||
mock.get(ANY, status_code=404)
|
||||
mock.patch(ANY, status_code=404)
|
||||
mock.post(ANY, status_code=204, text=assert_soa_edit_api_callback)
|
||||
zone = Zone('unit.tests.', [])
|
||||
source = YamlProvider('test', join(dirname(__file__), 'config'))
|
||||
source.populate(zone)
|
||||
plan = provider.plan(zone)
|
||||
provider.apply(plan)
|
||||
|
||||
Reference in New Issue
Block a user