blob: 4a258b1c203047319fb9ceb1696b461fdc9981a6 [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())