blob: 9cdd917d9ab03317e493fa25ee17b2f9fa26a8a7 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipesf38eaac2012-06-21 13:37:35 -04002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Matthew Treinishdb2c5972014-01-31 22:18:59 +000016from tempest import config
Ken'ichi Ohmichi7bd25752017-03-10 10:45:39 -080017from tempest.lib.common.utils import data_utils
Samantha Blancodf33c782017-03-06 14:29:52 -050018from tempest.lib.common.utils import test_utils
Attila Fazekasdc216422013-01-29 15:12:14 +010019import tempest.test
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070020
Matthew Treinishdb2c5972014-01-31 22:18:59 +000021CONF = config.CONF
22
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070023
Chris Hoge4f6117a2015-03-20 12:39:33 -050024class BaseIdentityTest(tempest.test.BaseTestCase):
Jay Pipesf38eaac2012-06-21 13:37:35 -040025
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070026 @classmethod
Jordan Pittierf7da5e52016-09-06 18:00:52 +020027 def setup_credentials(cls):
28 # Create no network resources for these test.
29 cls.set_network_resources()
30 super(BaseIdentityTest, cls).setup_credentials()
31
32 @classmethod
Matthew Treinishdb2c5972014-01-31 22:18:59 +000033 def disable_user(cls, user_name):
34 user = cls.get_user_by_name(user_name)
ghanshyam9c257a72016-06-21 10:15:10 +090035 cls.users_client.update_user_enabled(user['id'], enabled=False)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070036
Matthew Treinishdb2c5972014-01-31 22:18:59 +000037 @classmethod
38 def disable_tenant(cls, tenant_name):
39 tenant = cls.get_tenant_by_name(tenant_name)
Daniel Melladob04da902015-11-20 17:43:12 +010040 cls.tenants_client.update_tenant(tenant['id'], enabled=False)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070041
Matthew Treinishdb2c5972014-01-31 22:18:59 +000042 @classmethod
Tom Cocozzello5544c172016-02-23 17:50:28 -060043 def get_user_by_name(cls, name, domain_id=None):
44 if domain_id:
45 params = {'domain_id': domain_id}
ghanshyam7f817db2016-08-01 18:37:13 +090046 users = cls.users_client.list_users(**params)['users']
Tom Cocozzello5544c172016-02-23 17:50:28 -060047 else:
48 users = cls.users_client.list_users()['users']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070049 user = [u for u in users if u['name'] == name]
Masayuki Igawa0c0f0142017-04-10 17:22:02 +090050 if user:
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070051 return user[0]
52
Matthew Treinishdb2c5972014-01-31 22:18:59 +000053 @classmethod
54 def get_tenant_by_name(cls, name):
55 try:
Daniel Melladob04da902015-11-20 17:43:12 +010056 tenants = cls.tenants_client.list_tenants()['tenants']
Matthew Treinishdb2c5972014-01-31 22:18:59 +000057 except AttributeError:
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060058 tenants = cls.projects_client.list_projects()['projects']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070059 tenant = [t for t in tenants if t['name'] == name]
Masayuki Igawa0c0f0142017-04-10 17:22:02 +090060 if tenant:
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070061 return tenant[0]
62
Matthew Treinishdb2c5972014-01-31 22:18:59 +000063 @classmethod
64 def get_role_by_name(cls, name):
Daniel Mellado6b16b922015-12-07 12:43:08 +000065 roles = cls.roles_client.list_roles()['roles']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070066 role = [r for r in roles if r['name'] == name]
Masayuki Igawa0c0f0142017-04-10 17:22:02 +090067 if role:
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070068 return role[0]
69
zhufl75d51a92017-04-11 16:02:39 +080070 def create_test_user(self, **kwargs):
Nicolas Helgesondffb8672017-01-26 14:43:06 -080071 if kwargs.get('password', None) is None:
zhufl75d51a92017-04-11 16:02:39 +080072 kwargs['password'] = data_utils.rand_password()
73 if 'name' not in kwargs:
Martin Kopec213d0a42023-11-30 10:28:14 +010074 kwargs['name'] = data_utils.rand_name(
75 name='test_user', prefix=CONF.resource_name_prefix)
zhufl75d51a92017-04-11 16:02:39 +080076 if 'email' not in kwargs:
77 kwargs['email'] = kwargs['name'] + '@testmail.tm'
78
Castulo J. Martineze3adee42016-07-14 10:40:08 -070079 user = self.users_client.create_user(**kwargs)['user']
80 # Delete the user at the end of the test
Samantha Blancodf33c782017-03-06 14:29:52 -050081 self.addCleanup(
82 test_utils.call_and_ignore_notfound_exc,
83 self.users_client.delete_user, user['id'])
Castulo J. Martineze3adee42016-07-14 10:40:08 -070084 return user
85
zhufl66b616a2017-04-11 15:00:32 +080086 def setup_test_role(self, name=None, domain_id=None):
Castulo J. Martineze3adee42016-07-14 10:40:08 -070087 """Set up a test role."""
Martin Kopec213d0a42023-11-30 10:28:14 +010088 params = {'name': name or data_utils.rand_name(
89 name='test_role', prefix=CONF.resource_name_prefix)}
Rodrigo Duarte34a65122017-01-27 11:28:26 -030090 if domain_id:
91 params['domain_id'] = domain_id
92
93 role = self.roles_client.create_role(**params)['role']
Castulo J. Martineze3adee42016-07-14 10:40:08 -070094 # Delete the role at the end of the test
Samantha Blancodf33c782017-03-06 14:29:52 -050095 self.addCleanup(
96 test_utils.call_and_ignore_notfound_exc,
97 self.roles_client.delete_role, role['id'])
Castulo J. Martineze3adee42016-07-14 10:40:08 -070098 return role
99
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700100
Chris Hoge4f6117a2015-03-20 12:39:33 -0500101class BaseIdentityV2Test(BaseIdentityTest):
102
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000103 credentials = ['primary']
104
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100105 # identity v2 tests should obtain tokens and create accounts via v2
106 # regardless of the configured CONF.identity.auth_version
107 identity_version = 'v2'
Rohan Kanadeb645e172015-02-05 17:38:59 +0530108
109 @classmethod
110 def setup_clients(cls):
Chris Hoge4f6117a2015-03-20 12:39:33 -0500111 super(BaseIdentityV2Test, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200112 cls.non_admin_client = cls.os_primary.identity_public_client
113 cls.non_admin_token_client = cls.os_primary.token_client
114 cls.non_admin_tenants_client = cls.os_primary.tenants_public_client
115 cls.non_admin_users_client = cls.os_primary.users_public_client
Chris Hoge4f6117a2015-03-20 12:39:33 -0500116
Chris Hoge4f6117a2015-03-20 12:39:33 -0500117
118class BaseIdentityV2AdminTest(BaseIdentityV2Test):
119
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100120 credentials = ['primary', 'admin']
Chris Hoge4f6117a2015-03-20 12:39:33 -0500121
Andrea Frittoli00882b62016-12-19 23:22:44 +0000122 # NOTE(andreaf) Identity tests work with credentials, so it is safer
123 # for them to always use disposable credentials. Forcing dynamic creds
124 # on regular identity tests would be however to restrictive, since it
125 # would prevent any identity test from being executed against clouds where
126 # admin credentials are not available.
127 # Since All admin tests require admin credentials to be
128 # executed, so this will not impact the ability to execute tests.
129 force_tenant_isolation = True
130
Chris Hoge4f6117a2015-03-20 12:39:33 -0500131 @classmethod
Andrea Frittoli1413ba92017-04-21 14:33:23 +0100132 def skip_checks(cls):
133 super(BaseIdentityV2AdminTest, cls).skip_checks()
134 if not CONF.identity_feature_enabled.api_v2_admin:
135 raise cls.skipException('Identity v2 admin not available')
136
137 @classmethod
Chris Hoge4f6117a2015-03-20 12:39:33 -0500138 def setup_clients(cls):
Rohan Kanadeb645e172015-02-05 17:38:59 +0530139 super(BaseIdentityV2AdminTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200140 cls.client = cls.os_admin.identity_client
141 cls.non_admin_client = cls.os_primary.identity_client
142 cls.token_client = cls.os_admin.token_client
143 cls.tenants_client = cls.os_admin.tenants_client
144 cls.non_admin_tenants_client = cls.os_primary.tenants_client
145 cls.roles_client = cls.os_admin.roles_client
146 cls.non_admin_roles_client = cls.os_primary.roles_client
147 cls.users_client = cls.os_admin.users_client
148 cls.non_admin_users_client = cls.os_primary.users_client
149 cls.services_client = cls.os_admin.identity_services_client
150 cls.endpoints_client = cls.os_admin.endpoints_client
Rohan Kanadeb645e172015-02-05 17:38:59 +0530151
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000152 @classmethod
Rohan Kanadeb645e172015-02-05 17:38:59 +0530153 def resource_setup(cls):
154 super(BaseIdentityV2AdminTest, cls).resource_setup()
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700155 cls.projects_client = cls.tenants_client
Rohan Kanadeb645e172015-02-05 17:38:59 +0530156
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700157 def setup_test_user(self, password=None):
158 """Set up a test user."""
159 tenant = self.setup_test_tenant()
zhufl75d51a92017-04-11 16:02:39 +0800160 user = self.create_test_user(tenantId=tenant['id'], password=password)
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700161 return user
162
zhufl963d2c32017-04-20 15:44:58 +0800163 def setup_test_tenant(self, **kwargs):
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700164 """Set up a test tenant."""
zhufl963d2c32017-04-20 15:44:58 +0800165 if 'name' not in kwargs:
Martin Kopec213d0a42023-11-30 10:28:14 +0100166 kwargs['name'] = data_utils.rand_name(
167 name='test_tenant',
168 prefix=CONF.resource_name_prefix)
zhufl963d2c32017-04-20 15:44:58 +0800169 if 'description' not in kwargs:
Martin Kopec213d0a42023-11-30 10:28:14 +0100170 kwargs['description'] = data_utils.rand_name(
171 name='desc', prefix=CONF.resource_name_prefix)
zhufl963d2c32017-04-20 15:44:58 +0800172 tenant = self.projects_client.create_tenant(**kwargs)['tenant']
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700173 # Delete the tenant at the end of the test
Samantha Blancodf33c782017-03-06 14:29:52 -0500174 self.addCleanup(
175 test_utils.call_and_ignore_notfound_exc,
176 self.tenants_client.delete_tenant, tenant['id'])
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700177 return tenant
178
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000179
Chris Hoge4f6117a2015-03-20 12:39:33 -0500180class BaseIdentityV3Test(BaseIdentityTest):
181
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000182 credentials = ['primary']
183
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100184 # identity v3 tests should obtain tokens and create accounts via v3
185 # regardless of the configured CONF.identity.auth_version
186 identity_version = 'v3'
Rohan Kanadeb645e172015-02-05 17:38:59 +0530187
188 @classmethod
189 def setup_clients(cls):
Chris Hoge4f6117a2015-03-20 12:39:33 -0500190 super(BaseIdentityV3Test, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200191 cls.non_admin_client = cls.os_primary.identity_v3_client
192 cls.non_admin_users_client = cls.os_primary.users_v3_client
193 cls.non_admin_token = cls.os_primary.token_v3_client
194 cls.non_admin_projects_client = cls.os_primary.projects_client
Megan Guineyd0295162017-05-23 23:57:53 -0700195 cls.non_admin_catalog_client = cls.os_primary.catalog_client
Jordan Pittier8160d312017-04-18 11:52:23 +0200196 cls.non_admin_versions_client =\
197 cls.os_primary.identity_versions_v3_client
Colleen Murphy0e52d4e2018-02-17 21:29:40 +0100198 cls.non_admin_app_creds_client = \
199 cls.os_primary.application_credentials_client
Colleen Murphyd2cbd3a2019-12-17 16:31:14 -0800200 cls.non_admin_access_rules_client = cls.os_primary.access_rules_client
Chris Hoge4f6117a2015-03-20 12:39:33 -0500201
Chris Hoge4f6117a2015-03-20 12:39:33 -0500202
203class BaseIdentityV3AdminTest(BaseIdentityV3Test):
204
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100205 credentials = ['primary', 'admin']
Chris Hoge4f6117a2015-03-20 12:39:33 -0500206
Andrea Frittoli00882b62016-12-19 23:22:44 +0000207 # NOTE(andreaf) Identity tests work with credentials, so it is safer
208 # for them to always use disposable credentials. Forcing dynamic creds
209 # on regular identity tests would be however to restrictive, since it
210 # would prevent any identity test from being executed against clouds where
211 # admin credentials are not available.
212 # Since All admin tests require admin credentials to be
213 # executed, so this will not impact the ability to execute tests.
214 force_tenant_isolation = True
215
Chris Hoge4f6117a2015-03-20 12:39:33 -0500216 @classmethod
217 def setup_clients(cls):
Rohan Kanadeb645e172015-02-05 17:38:59 +0530218 super(BaseIdentityV3AdminTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200219 cls.client = cls.os_admin.identity_v3_client
220 cls.domains_client = cls.os_admin.domains_client
221 cls.users_client = cls.os_admin.users_v3_client
222 cls.trusts_client = cls.os_admin.trusts_client
223 cls.roles_client = cls.os_admin.roles_v3_client
224 cls.inherited_roles_client = cls.os_admin.inherited_roles_client
225 cls.token = cls.os_admin.token_v3_client
226 cls.endpoints_client = cls.os_admin.endpoints_v3_client
227 cls.regions_client = cls.os_admin.regions_client
228 cls.services_client = cls.os_admin.identity_services_v3_client
229 cls.policies_client = cls.os_admin.policies_client
230 cls.creds_client = cls.os_admin.credentials_client
231 cls.groups_client = cls.os_admin.groups_client
232 cls.projects_client = cls.os_admin.projects_client
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300233 cls.role_assignments = cls.os_admin.role_assignments_client
Jordan Pittier8160d312017-04-18 11:52:23 +0200234 cls.oauth_consumers_client = cls.os_admin.oauth_consumers_client
Hemanth Nakkinad9594f52017-04-19 11:14:40 +0530235 cls.oauth_token_client = cls.os_admin.oauth_token_client
Jordan Pittier8160d312017-04-18 11:52:23 +0200236 cls.domain_config_client = cls.os_admin.domain_config_client
237 cls.endpoint_filter_client = cls.os_admin.endpoint_filter_client
Chi Lod0ed8b02017-04-22 05:35:53 -0500238 cls.endpoint_groups_client = cls.os_admin.endpoint_groups_client
Felipe Monteiroa3b2d8e2018-03-15 04:47:52 +0000239 cls.project_tags_client = cls.os_admin.project_tags_client
Jordan Pittier8160d312017-04-18 11:52:23 +0200240
Andrea Frittoli (andreaf)100d18d2016-05-05 23:34:52 +0100241 if CONF.identity.admin_domain_scope:
242 # NOTE(andreaf) When keystone policy requires it, the identity
243 # admin clients for these tests shall use 'domain' scoped tokens.
244 # As the client manager is already created by the base class,
245 # we set the scope for the inner auth provider.
Jordan Pittier8160d312017-04-18 11:52:23 +0200246 cls.os_admin.auth_provider.scope = 'domain'
Yaroslav Lobankov997a1452015-11-19 17:11:37 +0300247
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300248 @classmethod
Tom Cocozzello5544c172016-02-23 17:50:28 -0600249 def disable_user(cls, user_name, domain_id=None):
250 user = cls.get_user_by_name(user_name, domain_id)
ghanshyam7f817db2016-08-01 18:37:13 +0900251 cls.users_client.update_user(user['id'], name=user_name, enabled=False)
BinBin Congc6e8ef52015-11-20 02:08:46 -0500252
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700253 @classmethod
zhufl2b33c1a2017-04-24 17:33:48 +0800254 def create_domain(cls, **kwargs):
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700255 """Create a domain."""
zhufl2b33c1a2017-04-24 17:33:48 +0800256 if 'name' not in kwargs:
Martin Kopec213d0a42023-11-30 10:28:14 +0100257 kwargs['name'] = data_utils.rand_name(
258 name='test_domain', prefix=CONF.resource_name_prefix)
zhufl2b33c1a2017-04-24 17:33:48 +0800259 if 'description' not in kwargs:
Martin Kopec213d0a42023-11-30 10:28:14 +0100260 kwargs['description'] = data_utils.rand_name(
261 name='desc', prefix=CONF.resource_name_prefix)
zhufl2b33c1a2017-04-24 17:33:48 +0800262 domain = cls.domains_client.create_domain(**kwargs)['domain']
zhufleed21d72017-11-07 13:03:31 +0800263 cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
264 cls.delete_domain, domain['id'])
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700265 return domain
266
zhufleed21d72017-11-07 13:03:31 +0800267 @classmethod
268 def delete_domain(cls, domain_id):
Martin Pavlasek4c3f2ab2014-04-15 17:15:15 +0200269 # NOTE(mpavlase) It is necessary to disable the domain before deleting
270 # otherwise it raises Forbidden exception
zhufleed21d72017-11-07 13:03:31 +0800271 cls.domains_client.update_domain(domain_id, enabled=False)
272 cls.domains_client.delete_domain(domain_id)
Martin Pavlasek4c3f2ab2014-04-15 17:15:15 +0200273
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700274 def setup_test_user(self, password=None):
275 """Set up a test user."""
276 project = self.setup_test_project()
zhufl75d51a92017-04-11 16:02:39 +0800277 user = self.create_test_user(project_id=project['id'],
278 password=password)
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700279 return user
280
zhuflf2f47052017-04-20 15:08:02 +0800281 def setup_test_project(self, **kwargs):
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700282 """Set up a test project."""
zhuflf2f47052017-04-20 15:08:02 +0800283 if 'name' not in kwargs:
Martin Kopec213d0a42023-11-30 10:28:14 +0100284 kwargs['name'] = data_utils.rand_name(
285 name='test_project', prefix=CONF.resource_name_prefix)
zhuflf2f47052017-04-20 15:08:02 +0800286 if 'description' not in kwargs:
Martin Kopec213d0a42023-11-30 10:28:14 +0100287 kwargs['description'] = data_utils.rand_name(
288 name='test_description', prefix=CONF.resource_name_prefix)
zhuflf2f47052017-04-20 15:08:02 +0800289 project = self.projects_client.create_project(**kwargs)['project']
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700290 # Delete the project at the end of the test
Samantha Blancodf33c782017-03-06 14:29:52 -0500291 self.addCleanup(
292 test_utils.call_and_ignore_notfound_exc,
293 self.projects_client.delete_project, project['id'])
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700294 return project
295
296 def setup_test_domain(self):
297 """Set up a test domain."""
298 domain = self.create_domain()
299 # Delete the domain at the end of the test
Samantha Blancodf33c782017-03-06 14:29:52 -0500300 self.addCleanup(
301 test_utils.call_and_ignore_notfound_exc,
302 self.delete_domain, domain['id'])
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700303 return domain
Colleen Murphy0e52d4e2018-02-17 21:29:40 +0100304
Felipe Monteirod4415072018-07-03 14:09:02 -0400305 def setup_test_group(self, **kwargs):
306 """Set up a test group."""
307 if 'name' not in kwargs:
308 kwargs['name'] = data_utils.rand_name(
Martin Kopec213d0a42023-11-30 10:28:14 +0100309 self.__class__.__name__ + '_test_project',
310 prefix=CONF.resource_name_prefix)
Felipe Monteirod4415072018-07-03 14:09:02 -0400311 if 'description' not in kwargs:
312 kwargs['description'] = data_utils.rand_name(
Martin Kopec213d0a42023-11-30 10:28:14 +0100313 self.__class__.__name__ + '_test_description',
314 prefix=CONF.resource_name_prefix)
Felipe Monteirod4415072018-07-03 14:09:02 -0400315 group = self.groups_client.create_group(**kwargs)['group']
316 self.addCleanup(
317 test_utils.call_and_ignore_notfound_exc,
318 self.groups_client.delete_group, group['id'])
319 return group
320
Colleen Murphy0e52d4e2018-02-17 21:29:40 +0100321
322class BaseApplicationCredentialsV3Test(BaseIdentityV3Test):
323
324 @classmethod
Colleen Murphy0e52d4e2018-02-17 21:29:40 +0100325 def resource_setup(cls):
326 super(BaseApplicationCredentialsV3Test, cls).resource_setup()
327 cls.user_id = cls.os_primary.credentials.user_id
328 cls.project_id = cls.os_primary.credentials.project_id
329
330 def create_application_credential(self, name=None, **kwargs):
Martin Kopec213d0a42023-11-30 10:28:14 +0100331 name = name or data_utils.rand_name(
332 name='application_credential', prefix=CONF.resource_name_prefix)
Colleen Murphy0e52d4e2018-02-17 21:29:40 +0100333 application_credential = (
334 self.non_admin_app_creds_client.create_application_credential(
335 self.user_id, name=name, **kwargs))['application_credential']
336 self.addCleanup(
337 self.non_admin_app_creds_client.delete_application_credential,
338 self.user_id,
339 application_credential['id'])
340 return application_credential