blob: 7a4e7c14c511dd3f37ae8eb4213f90d016b71d8b [file] [log] [blame]
# 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())