Port V1 Tempest test from designate's contrib folder
These are a close to a straight port as was possible, no cleanup was
performed where it wasn't absolutly necessary.
In addition, we add flags to enable V1, V2, Admin API tests, and a
V1 servers API flag, as these tests have proved particularly
susceptible to race conditions.
Change-Id: Idc31c00c95fde96087f4f222ae9c17e554e6b1fc
diff --git a/designate_tempest_plugin/tests/api/admin/test_quotas.py b/designate_tempest_plugin/tests/api/admin/test_quotas.py
index e2d89af..ba77711 100644
--- a/designate_tempest_plugin/tests/api/admin/test_quotas.py
+++ b/designate_tempest_plugin/tests/api/admin/test_quotas.py
@@ -20,7 +20,7 @@
LOG = logging.getLogger(__name__)
-class BaseQuotasTest(base.BaseDnsTest):
+class BaseQuotasTest(base.BaseDnsAdminTest):
# see: https://bugs.launchpad.net/designate/+bug/1573141
excluded_keys = ['api_expected_size']
diff --git a/designate_tempest_plugin/tests/api/v1/__init__.py b/designate_tempest_plugin/tests/api/v1/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/designate_tempest_plugin/tests/api/v1/__init__.py
diff --git a/designate_tempest_plugin/tests/api/v1/test_domains.py b/designate_tempest_plugin/tests/api/v1/test_domains.py
new file mode 100644
index 0000000..132df39
--- /dev/null
+++ b/designate_tempest_plugin/tests/api/v1/test_domains.py
@@ -0,0 +1,82 @@
+# Copyright 2014 Hewlett-Packard Development Company, L.P
+# All Rights Reserved.
+# Copyright 2016 Hewlett Packard Enterprise Development Company, L.P.
+#
+# Licensed 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 limitations
+# under the License.
+
+import six
+from tempest.common.utils import data_utils
+from tempest.lib import exceptions as lib_exc
+from tempest import test
+
+from designate_tempest_plugin.tests import base
+
+
+class DnsDomainsTest(base.BaseDnsV1Test):
+ @classmethod
+ def setup_clients(cls):
+ super(DnsDomainsTest, cls).setup_clients()
+
+ cls.client = cls.os.domains_client
+
+ @classmethod
+ def setUpClass(cls):
+ super(DnsDomainsTest, cls).setUpClass()
+ cls.setup_domains = list()
+ for i in range(2):
+ name = data_utils.rand_name('domain') + '.com.'
+ email = data_utils.rand_name('dns') + '@testmail.com'
+ _, domain = cls.client.create_domain(name, email)
+ cls.setup_domains.append(domain)
+
+ @classmethod
+ def tearDownClass(cls):
+ for domain in cls.setup_domains:
+ cls.client.delete_domain(domain['id'])
+ super(DnsDomainsTest, cls).tearDownClass()
+
+ def _delete_domain(self, domain_id):
+ self.client.delete_domain(domain_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.client.get_domain, domain_id)
+
+ @test.attr(type='smoke')
+ @test.idempotent_id('a78a4a6a-77a6-4dab-a61a-17df9731bca8')
+ def test_list_domains(self):
+ # Get a list of domains
+ _, domains = self.client.list_domains()
+ # Verify domains created in setup class are in the list
+ for domain in self.setup_domains:
+ self.assertIn(domain['id'],
+ six.moves.map(lambda x: x['id'], domains))
+
+ @test.attr(type='smoke')
+ @test.idempotent_id('29f76dd4-2456-4e42-b0ca-bbffcc6bbf59')
+ def test_create_update_get_domain(self):
+ # Create Domain
+ d_name = data_utils.rand_name('domain') + '.com.'
+ d_email = data_utils.rand_name('dns') + '@testmail.com'
+ _, domain = self.client.create_domain(name=d_name, email=d_email)
+ self.addCleanup(self._delete_domain, domain['id'])
+ self.assertEqual(d_name, domain['name'])
+ self.assertEqual(d_email, domain['email'])
+ # Update Domain with ttl
+ d_ttl = 3600
+ _, update_domain = self.client.update_domain(domain['id'],
+ ttl=d_ttl)
+ self.assertEqual(d_ttl, update_domain['ttl'])
+ # Get the details of Domain
+ _, get_domain = self.client.get_domain(domain['id'])
+ self.assertEqual(update_domain['name'], get_domain['name'])
+ self.assertEqual(update_domain['email'], get_domain['email'])
+ self.assertEqual(update_domain['ttl'], get_domain['ttl'])
diff --git a/designate_tempest_plugin/tests/api/v1/test_records.py b/designate_tempest_plugin/tests/api/v1/test_records.py
new file mode 100644
index 0000000..21bffa4
--- /dev/null
+++ b/designate_tempest_plugin/tests/api/v1/test_records.py
@@ -0,0 +1,111 @@
+# Copyright 2014 Hewlett-Packard Development Company, L.P
+# All Rights Reserved.
+# Copyright 2016 Hewlett Packard Enterprise Development Company, L.P.
+#
+# Licensed 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 limitations
+# under the License.
+
+import six
+from tempest.common.utils import data_utils
+from tempest import test
+
+from designate_tempest_plugin.tests import base
+
+
+class RecordsTest(base.BaseDnsV1Test):
+ @classmethod
+ def setup_clients(cls):
+ super(RecordsTest, cls).setup_clients()
+
+ cls.client = cls.os.records_client
+
+ @classmethod
+ def setUpClass(cls):
+ super(RecordsTest, cls).setUpClass()
+
+ # Creates domains and Records for testcase
+ cls.setup_records = list()
+ name = data_utils.rand_name('domain') + '.com.'
+ email = data_utils.rand_name('dns') + '@testmail.com'
+ _, cls.domain = cls.os.domains_client.create_domain(name, email)
+ # Creates a record with type as A
+ r_name = 'www.' + name
+ data1 = "192.0.2.3"
+ _, record = cls.client.create_record(
+ cls.domain['id'], name=r_name, data=data1,
+ type='A')
+ cls.setup_records.append(record)
+ # Creates a record with type AAAA
+ data2 = "2001:db8:0:1234:0:5678:9:12"
+ _, record = cls.client.create_record(
+ cls.domain['id'], name=r_name,
+ data=data2, type='AAAA')
+ cls.setup_records.append(record)
+
+ @classmethod
+ def tearDownClass(cls):
+ for record in cls.setup_records:
+ cls.client.delete_record(cls.domain['id'], record['id'])
+ cls.os.domains_client.delete_domain(cls.domain['id'])
+
+ def _delete_record(self, domain_id, record_id):
+ self.client.delete_record(domain_id, record_id)
+ # TODO(kiall): Records in v1 should 404 immediatly after deletion.
+ # self.assertRaises(lib_exc.NotFound,
+ # self.client.get_record, domain_id, record_id)
+
+ @test.attr(type='smoke')
+ @test.idempotent_id('4c7bee47-68a4-4668-81f9-fa973ddfa1f1')
+ def test_list_records_for_domain(self):
+ # Get a list of records for a domain
+ _, records = self.client.list_records(self.domain['id'])
+ # Verify records created in setup class are in the list
+ for record in self.setup_records:
+ self.assertIn(record['id'],
+ six.moves.map(lambda x: x['id'], records))
+
+ @test.attr(type='smoke')
+ @test.idempotent_id('1714fe3a-8a29-420e-a7dc-8209c7c174de')
+ def test_create_update_get_delete_record(self):
+ # Create Domain
+ name = data_utils.rand_name('domain') + '.com.'
+ email = data_utils.rand_name('dns') + '@testmail.com'
+ _, domain = self.os.domains_client.create_domain(name, email)
+ self.addCleanup(self.os.domains_client.delete_domain, domain['id'])
+ # Create Record
+ r_name = 'www.' + name
+ r_data = "192.0.2.4"
+ _, record = self.client.create_record(domain['id'],
+ name=r_name, data=r_data,
+ type='A')
+ self.addCleanup(self._delete_record, domain['id'], record['id'])
+ self.assertIsNotNone(record['id'])
+ self.assertEqual(domain['id'], record['domain_id'])
+ self.assertEqual(r_name, record['name'])
+ self.assertEqual(r_data, record['data'])
+ self.assertEqual('A', record['type'])
+ # Update Record with data and ttl
+ r_data1 = "192.0.2.5"
+ r_ttl = 3600
+ _, update_record = self.client.update_record(domain['id'],
+ record['id'],
+ name=r_name, type='A',
+ data=r_data1, ttl=r_ttl)
+ self.assertEqual(r_data1, update_record['data'])
+ self.assertEqual(r_ttl, update_record['ttl'])
+ # GET record
+ _, get_record = self.client.get_record(domain['id'], record['id'])
+ self.assertEqual(update_record['data'], get_record['data'])
+ self.assertEqual(update_record['name'], get_record['name'])
+ self.assertEqual(update_record['type'], get_record['type'])
+ self.assertEqual(update_record['ttl'], get_record['ttl'])
+ self.assertEqual(update_record['domain_id'], get_record['domain_id'])
diff --git a/designate_tempest_plugin/tests/api/v1/test_servers.py b/designate_tempest_plugin/tests/api/v1/test_servers.py
new file mode 100644
index 0000000..a2ac54c
--- /dev/null
+++ b/designate_tempest_plugin/tests/api/v1/test_servers.py
@@ -0,0 +1,97 @@
+# Copyright 2014 Hewlett-Packard Development Company, L.P.
+# Copyright 2016 Hewlett Packard Enterprise Development Company, L.P.
+#
+# Licensed 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 limitations
+# under the License.
+
+import six
+from tempest.common.utils import data_utils
+from tempest.lib import exceptions as lib_exc
+from tempest import test
+from tempest import config
+
+from designate_tempest_plugin.tests import base
+
+
+CONF = config.CONF
+
+
+class ServersAdminTest(base.BaseDnsV1Test):
+ """
+ Tests Servers API Create, Get, List and Delete
+ that require admin privileges
+ """
+ credentials = ['admin']
+
+ @classmethod
+ def setup_clients(cls):
+ super(ServersAdminTest, cls).setup_clients()
+
+ cls.client = cls.os_adm.servers_client
+
+ @classmethod
+ def skip_checks(cls):
+ super(ServersAdminTest, cls).skip_checks()
+
+ if not CONF.dns_feature_enabled.api_v1_servers:
+ skip_msg = ("%s skipped as designate V1 servers API is not "
+ "available" % cls.__name__)
+ raise cls.skipException(skip_msg)
+
+ @classmethod
+ def setUpClass(cls):
+ super(ServersAdminTest, cls).setUpClass()
+
+ cls.setup_servers = list()
+ for i in range(2):
+ name = data_utils.rand_name('dns-server') + '.com.'
+ _, server = cls.client.create_server(name)
+ cls.setup_servers.append(server)
+
+ @classmethod
+ def tearDownClass(cls):
+ for server in cls.setup_servers:
+ cls.client.delete_server(server['id'])
+ super(ServersAdminTest, cls).tearDownClass()
+
+ def _delete_server(self, server_id):
+ self.client.delete_server(server_id)
+ self.assertRaises(lib_exc.NotFound,
+ self.client.get_server, server_id)
+
+ @test.attr(type='smoke')
+ @test.idempotent_id('0296fb0c-f400-4b52-9be4-a24f37646e3f')
+ def test_list_servers(self):
+ # Get a list of servers
+ _, servers = self.client.list_servers()
+ # Verify servers created in setup class are in the list
+ for server in self.setup_servers:
+ self.assertIn(server['id'],
+ six.moves.map(lambda x: x['id'], servers))
+
+ @test.attr(type='smoke')
+ @test.idempotent_id('7d18fdfc-3959-4c3f-9855-0bf2f8c9ade2')
+ def test_create_update_get_delete_server(self):
+ # Create Dns Server
+ s_name1 = data_utils.rand_name('dns-server') + '.com.'
+ _, server = self.client.create_server(s_name1)
+ self.addCleanup(self._delete_server, server['id'])
+ self.assertEqual(s_name1, server['name'])
+ self.assertIsNotNone(server['id'])
+ # Update Dns Server
+ s_name2 = data_utils.rand_name('update-dns-server') + '.com.'
+ _, update_server = self.client.update_server(server['id'],
+ name=s_name2)
+ self.assertEqual(s_name2, update_server['name'])
+ # Get the details of Server
+ _, get_server = self.client.get_server(server['id'])
+ self.assertEqual(update_server['name'], get_server['name'])
diff --git a/designate_tempest_plugin/tests/api/v2/test_blacklists.py b/designate_tempest_plugin/tests/api/v2/test_blacklists.py
index 791a22c..81178cf 100644
--- a/designate_tempest_plugin/tests/api/v2/test_blacklists.py
+++ b/designate_tempest_plugin/tests/api/v2/test_blacklists.py
@@ -22,7 +22,7 @@
LOG = logging.getLogger(__name__)
-class BaseBlacklistsTest(base.BaseDnsTest):
+class BaseBlacklistsTest(base.BaseDnsV2Test):
excluded_keys = ['created_at', 'updated_at', 'links']
diff --git a/designate_tempest_plugin/tests/api/v2/test_pool.py b/designate_tempest_plugin/tests/api/v2/test_pool.py
index 47e3324..a5c6e66 100644
--- a/designate_tempest_plugin/tests/api/v2/test_pool.py
+++ b/designate_tempest_plugin/tests/api/v2/test_pool.py
@@ -23,7 +23,7 @@
LOG = logging.getLogger(__name__)
-class BasePoolTest(base.BaseDnsTest):
+class BasePoolTest(base.BaseDnsV2Test):
excluded_keys = ['created_at', 'updated_at', 'links', 'ns_records']
def _assertExpectedNSRecords(self, expected, actual, expected_key):
diff --git a/designate_tempest_plugin/tests/api/v2/test_recordset.py b/designate_tempest_plugin/tests/api/v2/test_recordset.py
index 1c9d87d..4e0f0fb 100644
--- a/designate_tempest_plugin/tests/api/v2/test_recordset.py
+++ b/designate_tempest_plugin/tests/api/v2/test_recordset.py
@@ -21,7 +21,7 @@
LOG = logging.getLogger(__name__)
-class BaseRecordsetsTest(base.BaseDnsTest):
+class BaseRecordsetsTest(base.BaseDnsV2Test):
excluded_keys = ['created_at', 'updated_at', 'version', 'links',
'type']
diff --git a/designate_tempest_plugin/tests/api/v2/test_tld.py b/designate_tempest_plugin/tests/api/v2/test_tld.py
index 46e5b48..bdec93e 100644
--- a/designate_tempest_plugin/tests/api/v2/test_tld.py
+++ b/designate_tempest_plugin/tests/api/v2/test_tld.py
@@ -21,7 +21,7 @@
LOG = logging.getLogger(__name__)
-class BaseTldTest(base.BaseDnsTest):
+class BaseTldTest(base.BaseDnsV2Test):
excluded_keys = ['created_at', 'updated_at', 'links']
diff --git a/designate_tempest_plugin/tests/api/v2/test_zones.py b/designate_tempest_plugin/tests/api/v2/test_zones.py
index f97e256..62f188e 100644
--- a/designate_tempest_plugin/tests/api/v2/test_zones.py
+++ b/designate_tempest_plugin/tests/api/v2/test_zones.py
@@ -22,7 +22,7 @@
LOG = logging.getLogger(__name__)
-class BaseZonesTest(base.BaseDnsTest):
+class BaseZonesTest(base.BaseDnsV2Test):
excluded_keys = ['created_at', 'updated_at', 'version', 'links',
'status', 'action']
diff --git a/designate_tempest_plugin/tests/api/v2/test_zones_exports.py b/designate_tempest_plugin/tests/api/v2/test_zones_exports.py
index d11bb64..c9350e6 100644
--- a/designate_tempest_plugin/tests/api/v2/test_zones_exports.py
+++ b/designate_tempest_plugin/tests/api/v2/test_zones_exports.py
@@ -21,7 +21,7 @@
LOG = logging.getLogger(__name__)
-class BaseZoneExportsTest(base.BaseDnsTest):
+class BaseZoneExportsTest(base.BaseDnsV2Test):
excluded_keys = ['created_at', 'updated_at', 'version', 'links',
'status', 'location']
diff --git a/designate_tempest_plugin/tests/api/v2/test_zones_imports.py b/designate_tempest_plugin/tests/api/v2/test_zones_imports.py
index c2b5585..ff2d5ef 100644
--- a/designate_tempest_plugin/tests/api/v2/test_zones_imports.py
+++ b/designate_tempest_plugin/tests/api/v2/test_zones_imports.py
@@ -21,7 +21,7 @@
LOG = logging.getLogger(__name__)
-class BaseZonesImportTest(base.BaseDnsTest):
+class BaseZonesImportTest(base.BaseDnsV2Test):
excluded_keys = ['created_at', 'updated_at', 'version', 'links',
'status', 'message']
diff --git a/designate_tempest_plugin/tests/base.py b/designate_tempest_plugin/tests/base.py
index 6519a4f..9f24d62 100644
--- a/designate_tempest_plugin/tests/base.py
+++ b/designate_tempest_plugin/tests/base.py
@@ -13,16 +13,17 @@
# under the License.
import six
from tempest import test
+from tempest import config
from designate_tempest_plugin import clients
+CONF = config.CONF
+
+
class BaseDnsTest(test.BaseTestCase):
"""Base class for DNS tests."""
- # Use the Designate Client Manager
- client_manager = clients.Manager
-
# NOTE(andreaf) credentials holds a list of the credentials to be allocated
# at class setup time. Credential types can be 'primary', 'alt', 'admin' or
# a list of roles - the first element of the list being a label, and the
@@ -33,8 +34,64 @@
# credentials in the tests that require them.
credentials = ['primary']
+ @classmethod
+ def skip_checks(cls):
+ super(BaseDnsTest, cls).skip_checks()
+
+ if not CONF.service_available.designate:
+ skip_msg = ("%s skipped as designate is not available"
+ % cls.__name__)
+ raise cls.skipException(skip_msg)
+
def assertExpected(self, expected, actual, excluded_keys):
for key, value in six.iteritems(expected):
if key not in excluded_keys:
self.assertIn(key, actual)
self.assertEqual(value, actual[key], key)
+
+
+class BaseDnsV1Test(BaseDnsTest):
+ """Base class for DNS V1 API tests."""
+
+ # Use the Designate V1 Client Manager
+ client_manager = clients.ManagerV1
+
+ @classmethod
+ def skip_checks(cls):
+ super(BaseDnsV1Test, cls).skip_checks()
+
+ if not CONF.dns_feature_enabled.api_v1:
+ skip_msg = ("%s skipped as designate v1 API is not available"
+ % cls.__name__)
+ raise cls.skipException(skip_msg)
+
+
+class BaseDnsV2Test(BaseDnsTest):
+ """Base class for DNS V2 API tests."""
+
+ # Use the Designate V2 Client Manager
+ client_manager = clients.ManagerV2
+
+ @classmethod
+ def skip_checks(cls):
+ super(BaseDnsV2Test, cls).skip_checks()
+
+ if not CONF.dns_feature_enabled.api_v2:
+ skip_msg = ("%s skipped as designate v2 API is not available"
+ % cls.__name__)
+ raise cls.skipException(skip_msg)
+
+
+class BaseDnsAdminTest(BaseDnsTest):
+ """Base class for DNS Admin API tests."""
+
+ # Use the Designate V2 Client Manager
+ client_manager = clients.ManagerV2
+
+ @classmethod
+ def skip_checks(cls):
+ super(BaseDnsAdminTest, cls).skip_checks()
+ if not CONF.dns_feature_enabled.api_admin:
+ skip_msg = ("%s skipped as designate admin API is not available"
+ % cls.__name__)
+ raise cls.skipException(skip_msg)
diff --git a/designate_tempest_plugin/tests/scenario/v2/test_zones.py b/designate_tempest_plugin/tests/scenario/v2/test_zones.py
index ea807d8..afd5b40 100644
--- a/designate_tempest_plugin/tests/scenario/v2/test_zones.py
+++ b/designate_tempest_plugin/tests/scenario/v2/test_zones.py
@@ -21,7 +21,7 @@
LOG = logging.getLogger(__name__)
-class ZonesTest(base.BaseDnsTest):
+class ZonesTest(base.BaseDnsV2Test):
@classmethod
def setup_clients(cls):
super(ZonesTest, cls).setup_clients()