blob: 9035c8332908c415cb2ee1fa0a7cb636f639c2c4 [file] [log] [blame]
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +01001# Copyright 2016 Hewlett Packard Enterprise Development Company, L.P.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
sonu.kumard8471de2016-04-14 19:20:17 +090014import six
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010015from tempest import test
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +010016from tempest import config
Maksym Shalamov2da1d6e2018-12-05 17:17:58 +020017from tempest.lib.common.utils import test_utils as utils
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010018
Michael Johnsondf9fda12021-07-09 16:39:08 +000019from designate_tempest_plugin.services.dns.query.query_client import \
20 QueryClient
Michael Johnsonbf2379b2021-08-27 00:04:50 +000021from designate_tempest_plugin.tests import rbac_utils
Michael Johnsondf9fda12021-07-09 16:39:08 +000022
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010023
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +010024CONF = config.CONF
25
26
Dmitry Galkin9a0a3602018-11-13 19:42:29 +000027class AssertRaisesDns(test.BaseTestCase):
Kiall Mac Innes4a376792016-05-19 18:05:54 +010028 def __init__(self, test_class, exc, type_, code):
29 self.test_class = test_class
30 self.exc = exc
31 self.type_ = type_
32 self.code = code
33
34 def __enter__(self):
35 pass
36
37 def __exit__(self, exc_type, exc_value, traceback):
38 if exc_type is None:
39 try:
40 exc_name = self.exc.__name__
41 except AttributeError:
42 exc_name = str(self.exc)
43 raise self.failureException(
44 "{0} not raised".format(exc_name))
45
46 if issubclass(exc_type, self.exc):
47 self.test_class.assertEqual(
48 self.code, exc_value.resp_body['code'])
49
50 self.test_class.assertEqual(
51 self.type_, exc_value.resp_body['type'])
52
53 return True
54
55 # Unexpected exceptions will be reraised
56 return False
57
58
Michael Johnsonbf2379b2021-08-27 00:04:50 +000059class BaseDnsTest(rbac_utils.RBACTestsMixin, test.BaseTestCase):
Kiall Mac Innes560c89b2016-04-13 11:21:56 +010060 """Base class for DNS tests."""
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010061
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010062 # NOTE(andreaf) credentials holds a list of the credentials to be allocated
63 # at class setup time. Credential types can be 'primary', 'alt', 'admin' or
64 # a list of roles - the first element of the list being a label, and the
65 # rest the actual roles.
Graham Hayesbbc01e32018-02-15 14:40:54 +000066 # NOTE(kiall) primary will result in a manager @ cls.os_primary, alt will
67 # have cls.os_alt, and admin will have cls.os_admin.
Michael Johnsonbf2379b2021-08-27 00:04:50 +000068 # NOTE(johnsom) We will allocate most credentials here so that each test
69 # can test for allowed and disallowed RBAC policies.
70 credentials = ['admin', 'primary']
71 if CONF.dns_feature_enabled.enforce_new_defaults:
72 credentials.extend(['system_admin', 'system_reader', 'project_reader'])
73
74 # A tuple of credentials that will be allocated by tempest using the
75 # 'credentials' list above. These are used to build RBAC test lists.
76 allocated_creds = []
77 for cred in credentials:
78 if isinstance(cred, list):
79 allocated_creds.append('os_roles_' + cred[0])
80 else:
81 allocated_creds.append('os_' + cred)
82 # Tests shall not mess with the list of allocated credentials
83 allocated_credentials = tuple(allocated_creds)
sonu.kumard8471de2016-04-14 19:20:17 +090084
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +010085 @classmethod
86 def skip_checks(cls):
87 super(BaseDnsTest, cls).skip_checks()
88
89 if not CONF.service_available.designate:
90 skip_msg = ("%s skipped as designate is not available"
91 % cls.__name__)
92 raise cls.skipException(skip_msg)
93
Michael Johnsondf9fda12021-07-09 16:39:08 +000094 @classmethod
95 def setup_clients(cls):
96 super(BaseDnsTest, cls).setup_clients()
97 # The Query Client is not an OpenStack client which means
98 # we should not set it up through the tempest client manager.
99 # Set it up here so all tests have access to it.
100 cls.query_client = QueryClient(
101 nameservers=CONF.dns.nameservers,
102 query_timeout=CONF.dns.query_timeout,
103 build_interval=CONF.dns.build_interval,
104 build_timeout=CONF.dns.build_timeout,
105 )
106
sonu.kumard8471de2016-04-14 19:20:17 +0900107 def assertExpected(self, expected, actual, excluded_keys):
108 for key, value in six.iteritems(expected):
109 if key not in excluded_keys:
110 self.assertIn(key, actual)
111 self.assertEqual(value, actual[key], key)
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +0100112
Kiall Mac Innes4a376792016-05-19 18:05:54 +0100113 def assertRaisesDns(self, exc, type_, code, callable_=None, *args,
114 **kwargs):
115 """
116 Checks the response that a api call with a exception contains the
117 expected data
118
119 Usable as both a ordinary function, and a context manager
120 """
121 context = AssertRaisesDns(self, exc, type_, code)
122
123 if callable_ is None:
124 return context
125
126 with context:
127 callable_(*args, **kwargs)
128
Erik Olof Gunnar Anderssonfa6f78c2021-06-19 00:05:51 -0700129 def transfer_request_delete(self, transfer_client, transfer_request_id):
130 return utils.call_and_ignore_notfound_exc(
131 transfer_client.delete_transfer_request, transfer_request_id)
132
Maksym Shalamov2da1d6e2018-12-05 17:17:58 +0200133 def wait_zone_delete(self, zone_client, zone_id, **kwargs):
Erik Olof Gunnar Anderssone8ba5cc2021-06-14 23:02:17 -0700134 self._delete_zone(zone_client, zone_id, **kwargs)
Maksym Shalamov2da1d6e2018-12-05 17:17:58 +0200135 utils.call_until_true(self._check_zone_deleted,
136 CONF.dns.build_timeout,
137 CONF.dns.build_interval,
138 zone_client,
139 zone_id)
140
zahlabut52602272021-08-04 17:07:29 +0300141 def wait_recordset_delete(self, recordset_client, zone_id,
142 recordset_id, **kwargs):
143 self._delete_recordset(
144 recordset_client, zone_id, recordset_id, **kwargs)
145 utils.call_until_true(self._check_recordset_deleted,
146 CONF.dns.build_timeout,
147 CONF.dns.build_interval,
148 recordset_client,
149 zone_id,
150 recordset_id)
151
Erik Olof Gunnar Andersson3bfce9b2022-01-08 23:11:13 -0800152 def unset_ptr(self, ptr_client, fip_id, **kwargs):
153 return utils.call_and_ignore_notfound_exc(
154 ptr_client.unset_ptr_record, fip_id, **kwargs)
155
Erik Olof Gunnar Anderssone8ba5cc2021-06-14 23:02:17 -0700156 def _delete_zone(self, zone_client, zone_id, **kwargs):
157 return utils.call_and_ignore_notfound_exc(zone_client.delete_zone,
158 zone_id, **kwargs)
159
Maksym Shalamov2da1d6e2018-12-05 17:17:58 +0200160 def _check_zone_deleted(self, zone_client, zone_id):
161 return utils.call_and_ignore_notfound_exc(zone_client.show_zone,
162 zone_id) is None
163
zahlabut52602272021-08-04 17:07:29 +0300164 def _delete_recordset(self, recordset_client, zone_id,
165 recordset_id, **kwargs):
166 return utils.call_and_ignore_notfound_exc(
167 recordset_client.delete_recordset,
168 zone_id, recordset_id, **kwargs)
169
170 def _check_recordset_deleted(
171 self, recordset_client, zone_id, recordset_id):
172 return utils.call_and_ignore_notfound_exc(
173 recordset_client.show_recordset, zone_id, recordset_id) is None
174
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +0100175
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +0100176class BaseDnsV2Test(BaseDnsTest):
177 """Base class for DNS V2 API tests."""
178
Michael Johnsona3a23632021-07-21 21:55:32 +0000179 all_projects_header = {'X-Auth-All-Projects': True}
180
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +0100181 @classmethod
182 def skip_checks(cls):
183 super(BaseDnsV2Test, cls).skip_checks()
184
185 if not CONF.dns_feature_enabled.api_v2:
186 skip_msg = ("%s skipped as designate v2 API is not available"
187 % cls.__name__)
188 raise cls.skipException(skip_msg)
189
190
191class BaseDnsAdminTest(BaseDnsTest):
192 """Base class for DNS Admin API tests."""
193
Kiall Mac Innes8ae796c2016-04-21 13:47:25 +0100194 @classmethod
195 def skip_checks(cls):
196 super(BaseDnsAdminTest, cls).skip_checks()
197 if not CONF.dns_feature_enabled.api_admin:
198 skip_msg = ("%s skipped as designate admin API is not available"
199 % cls.__name__)
200 raise cls.skipException(skip_msg)