| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| |
| import sys |
| import unittest |
| |
| from libcloud.dns.drivers.digitalocean import DigitalOceanDNSDriver |
| from libcloud.dns.types import RecordType |
| from libcloud.test import LibcloudTestCase, MockHttp |
| from libcloud.test.file_fixtures import DNSFileFixtures |
| from libcloud.test.secrets import DIGITALOCEAN_v2_PARAMS |
| from libcloud.utils.py3 import httplib |
| |
| |
| class DigitalOceanDNSTests(LibcloudTestCase): |
| |
| def setUp(self): |
| DigitalOceanDNSDriver.connectionCls.conn_class = DigitalOceanDNSMockHttp |
| DigitalOceanDNSMockHttp.type = None |
| self.driver = DigitalOceanDNSDriver(*DIGITALOCEAN_v2_PARAMS) |
| |
| def test_list_zones(self): |
| zones = self.driver.list_zones() |
| self.assertTrue(len(zones) >= 1) |
| |
| def test_get_zone(self): |
| zone = self.driver.get_zone('testdomain') |
| self.assertEqual(zone.id, 'testdomain') |
| |
| def test_get_zone_not_found(self): |
| DigitalOceanDNSMockHttp.type = 'NOT_FOUND' |
| self.assertRaises(Exception, self.driver.get_zone, 'testdomain') |
| |
| def test_list_records(self): |
| zone = self.driver.get_zone('testdomain') |
| records = self.driver.list_records(zone) |
| self.assertTrue(len(records) >= 1) |
| self.assertEqual(records[1].ttl, 1800) |
| self.assertEqual(records[4].ttl, None) |
| |
| def test_get_record(self): |
| record = self.driver.get_record('testdomain', '1234564') |
| self.assertEqual(record.id, '1234564') |
| self.assertEqual(record.type, RecordType.A) |
| self.assertEqual(record.data, '123.45.67.89') |
| self.assertEqual(record.ttl, 1800) |
| |
| def test_get_record_not_found(self): |
| DigitalOceanDNSMockHttp.type = 'NOT_FOUND' |
| self.assertRaises(Exception, self.driver.get_zone, 'testdomain') |
| |
| def test_create_zone(self): |
| DigitalOceanDNSMockHttp.type = 'CREATE' |
| zone = self.driver.create_zone('testdomain') |
| self.assertEqual(zone.id, 'testdomain') |
| |
| def test_create_record(self): |
| zone = self.driver.get_zone('testdomain') |
| |
| DigitalOceanDNSMockHttp.type = 'CREATE' |
| record = self.driver.create_record('sub', zone, |
| RecordType.A, '234.56.78.90', |
| extra={'ttl': 60}) |
| self.assertEqual(record.id, '1234565') |
| self.assertEqual(record.type, RecordType.A) |
| self.assertEqual(record.data, '234.56.78.90') |
| self.assertEqual(record.ttl, 60) |
| |
| def test_update_record(self): |
| record = self.driver.get_record('testdomain', '1234564') |
| |
| DigitalOceanDNSMockHttp.type = 'UPDATE' |
| record = self.driver.update_record(record, data="234.56.78.90", |
| extra={'ttl': 60}) |
| self.assertEqual(record.id, '1234564') |
| self.assertEqual(record.data, "234.56.78.90") |
| self.assertEqual(record.ttl, 60) |
| |
| def test_delete_zone(self): |
| zone = self.driver.get_zone('testdomain') |
| |
| DigitalOceanDNSMockHttp.type = 'DELETE' |
| self.assertTrue(self.driver.delete_zone(zone)) |
| |
| def test_delete_record(self): |
| record = self.driver.get_record('testdomain', '1234564') |
| |
| DigitalOceanDNSMockHttp.type = 'DELETE' |
| self.assertTrue(self.driver.delete_record(record)) |
| |
| |
| class DigitalOceanDNSMockHttp(MockHttp): |
| fixtures = DNSFileFixtures('digitalocean') |
| |
| response_map = { |
| None: httplib.OK, |
| 'CREATE': httplib.CREATED, |
| 'DELETE': httplib.NO_CONTENT, |
| 'EMPTY': httplib.OK, |
| 'NOT_FOUND': httplib.NOT_FOUND, |
| 'UNAUTHORIZED': httplib.UNAUTHORIZED, |
| 'UPDATE': httplib.OK, |
| 'UNPROCESSABLE': httplib.UNPROCESSABLE_ENTITY, |
| } |
| |
| def _v2_domains(self, method, url, body, headers): |
| body = self.fixtures.load('_v2_domains.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_CREATE(self, method, url, body, headers): |
| if body is None: |
| body = self.fixtures.load('_v2_domains_UNPROCESSABLE_ENTITY.json') |
| return (self.response_map['UNPROCESSABLE'], body, {}, |
| httplib.responses[self.response_map['UNPROCESSABLE']]) |
| body = self.fixtures.load('_v2_domains_CREATE.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain(self, method, url, body, headers): |
| body = self.fixtures.load('_v2_domains_testdomain.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain_DELETE(self, method, url, body, headers): |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain_NOT_FOUND(self, method, url, body, headers): |
| body = self.fixtures.load('_v2_domains_testdomain_NOT_FOUND.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain_records(self, method, url, body, headers): |
| body = self.fixtures.load('_v2_domains_testdomain_records.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain_records_CREATE(self, method, url, |
| body, headers): |
| if body is None: |
| body = self.fixtures.load('_v2_domains_UNPROCESSABLE_ENTITY.json') |
| return (self.response_map['UNPROCESSABLE'], body, {}, |
| httplib.responses[self.response_map['UNPROCESSABLE']]) |
| body = self.fixtures.load('_v2_domains_testdomain_records_CREATE.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain_records_1234564( |
| self, method, url, body, headers): |
| body = self.fixtures.load( |
| '_v2_domains_testdomain_records_1234564.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain_records_1234564_DELETE( |
| self, method, url, body, headers): |
| self.type = 'DELETE' |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| def _v2_domains_testdomain_records_1234564_UPDATE( |
| self, method, url, body, headers): |
| if body is None: |
| body = self.fixtures.load('_v2_domains_UNPROCESSABLE_ENTITY.json') |
| return (self.response_map['UNPROCESSABLE'], body, {}, |
| httplib.responses[self.response_map['UNPROCESSABLE']]) |
| body = self.fixtures.load( |
| '_v2_domains_testdomain_records_1234564_UPDATE.json') |
| return (self.response_map[self.type], body, {}, |
| httplib.responses[self.response_map[self.type]]) |
| |
| if __name__ == '__main__': |
| sys.exit(unittest.main()) |