blob: 433109e768a241ab19291980af8e75bccda9b4bf [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
Doug Hellmann583ce2c2015-03-11 14:55:46 +000016from oslo_log import log as logging
Jay Pipesf38eaac2012-06-21 13:37:35 -040017
Fei Long Wangd39431f2015-05-14 11:30:48 +120018from tempest.common.utils import data_utils
Matthew Treinishdb2c5972014-01-31 22:18:59 +000019from tempest import config
Jordan Pittier9e227c52016-02-09 14:35:18 +010020from tempest.lib.common.utils import test_utils
Attila Fazekasdc216422013-01-29 15:12:14 +010021import tempest.test
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070022
Matthew Treinishdb2c5972014-01-31 22:18:59 +000023CONF = config.CONF
Masayuki Igawa630a3fa2014-03-12 19:51:45 +090024LOG = logging.getLogger(__name__)
Matthew Treinishdb2c5972014-01-31 22:18:59 +000025
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070026
Chris Hoge4f6117a2015-03-20 12:39:33 -050027class BaseIdentityTest(tempest.test.BaseTestCase):
Jay Pipesf38eaac2012-06-21 13:37:35 -040028
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070029 @classmethod
Matthew Treinishdb2c5972014-01-31 22:18:59 +000030 def disable_user(cls, user_name):
31 user = cls.get_user_by_name(user_name)
ghanshyam9c257a72016-06-21 10:15:10 +090032 cls.users_client.update_user_enabled(user['id'], enabled=False)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070033
Matthew Treinishdb2c5972014-01-31 22:18:59 +000034 @classmethod
35 def disable_tenant(cls, tenant_name):
36 tenant = cls.get_tenant_by_name(tenant_name)
Daniel Melladob04da902015-11-20 17:43:12 +010037 cls.tenants_client.update_tenant(tenant['id'], enabled=False)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070038
Matthew Treinishdb2c5972014-01-31 22:18:59 +000039 @classmethod
Tom Cocozzello5544c172016-02-23 17:50:28 -060040 def get_user_by_name(cls, name, domain_id=None):
41 if domain_id:
42 params = {'domain_id': domain_id}
43 users = cls.users_client.list_users(params)['users']
44 else:
45 users = cls.users_client.list_users()['users']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070046 user = [u for u in users if u['name'] == name]
47 if len(user) > 0:
48 return user[0]
49
Matthew Treinishdb2c5972014-01-31 22:18:59 +000050 @classmethod
51 def get_tenant_by_name(cls, name):
52 try:
Daniel Melladob04da902015-11-20 17:43:12 +010053 tenants = cls.tenants_client.list_tenants()['tenants']
Matthew Treinishdb2c5972014-01-31 22:18:59 +000054 except AttributeError:
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060055 tenants = cls.projects_client.list_projects()['projects']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070056 tenant = [t for t in tenants if t['name'] == name]
57 if len(tenant) > 0:
58 return tenant[0]
59
Matthew Treinishdb2c5972014-01-31 22:18:59 +000060 @classmethod
61 def get_role_by_name(cls, name):
Daniel Mellado6b16b922015-12-07 12:43:08 +000062 roles = cls.roles_client.list_roles()['roles']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070063 role = [r for r in roles if r['name'] == name]
64 if len(role) > 0:
65 return role[0]
66
Castulo J. Martineze3adee42016-07-14 10:40:08 -070067 def _create_test_user(self, **kwargs):
68 if kwargs['password'] is None:
69 user_password = data_utils.rand_password()
70 kwargs['password'] = user_password
71 user = self.users_client.create_user(**kwargs)['user']
72 # Delete the user at the end of the test
73 self.addCleanup(self.users_client.delete_user, user['id'])
74 return user
75
76 def setup_test_role(self):
77 """Set up a test role."""
78 role = self.roles_client.create_role(
79 name=data_utils.rand_name('test_role'))['role']
80 # Delete the role at the end of the test
81 self.addCleanup(self.roles_client.delete_role, role['id'])
82 return role
83
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070084
Chris Hoge4f6117a2015-03-20 12:39:33 -050085class BaseIdentityV2Test(BaseIdentityTest):
86
Andrea Frittolib21de6c2015-02-06 20:12:38 +000087 credentials = ['primary']
88
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +010089 # identity v2 tests should obtain tokens and create accounts via v2
90 # regardless of the configured CONF.identity.auth_version
91 identity_version = 'v2'
Rohan Kanadeb645e172015-02-05 17:38:59 +053092
93 @classmethod
94 def setup_clients(cls):
Chris Hoge4f6117a2015-03-20 12:39:33 -050095 super(BaseIdentityV2Test, cls).setup_clients()
Jane Zadorozhnabfc72372015-06-16 17:32:59 +030096 cls.non_admin_client = cls.os.identity_public_client
Chris Hoge4f6117a2015-03-20 12:39:33 -050097 cls.non_admin_token_client = cls.os.token_client
Daniel Melladob04da902015-11-20 17:43:12 +010098 cls.non_admin_tenants_client = cls.os.tenants_public_client
Daniel Mellado82c83a52015-12-09 15:16:49 +000099 cls.non_admin_users_client = cls.os.users_public_client
Chris Hoge4f6117a2015-03-20 12:39:33 -0500100
Chris Hoge4f6117a2015-03-20 12:39:33 -0500101
102class BaseIdentityV2AdminTest(BaseIdentityV2Test):
103
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100104 credentials = ['primary', 'admin']
Chris Hoge4f6117a2015-03-20 12:39:33 -0500105
106 @classmethod
107 def setup_clients(cls):
Rohan Kanadeb645e172015-02-05 17:38:59 +0530108 super(BaseIdentityV2AdminTest, cls).setup_clients()
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000109 cls.client = cls.os_adm.identity_client
Jane Zadorozhnabfc72372015-06-16 17:32:59 +0300110 cls.non_admin_client = cls.os.identity_client
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000111 cls.token_client = cls.os_adm.token_client
Daniel Melladob04da902015-11-20 17:43:12 +0100112 cls.tenants_client = cls.os_adm.tenants_client
113 cls.non_admin_tenants_client = cls.os.tenants_client
Daniel Mellado6b16b922015-12-07 12:43:08 +0000114 cls.roles_client = cls.os_adm.roles_client
115 cls.non_admin_roles_client = cls.os.roles_client
Daniel Mellado82c83a52015-12-09 15:16:49 +0000116 cls.users_client = cls.os_adm.users_client
117 cls.non_admin_users_client = cls.os.users_client
Yaroslav Lobankovf6906e12016-02-26 19:44:53 -0600118 cls.services_client = cls.os_adm.identity_services_client
119 cls.endpoints_client = cls.os_adm.endpoints_client
Rohan Kanadeb645e172015-02-05 17:38:59 +0530120
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000121 @classmethod
Rohan Kanadeb645e172015-02-05 17:38:59 +0530122 def resource_setup(cls):
123 super(BaseIdentityV2AdminTest, cls).resource_setup()
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700124 cls.projects_client = cls.tenants_client
Rohan Kanadeb645e172015-02-05 17:38:59 +0530125
126 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +0100127 def resource_cleanup(cls):
Andrea Frittoli7688e742014-09-15 12:38:22 +0100128 super(BaseIdentityV2AdminTest, cls).resource_cleanup()
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000129
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700130 def setup_test_user(self, password=None):
131 """Set up a test user."""
132 tenant = self.setup_test_tenant()
133 username = data_utils.rand_name('test_user')
134 email = username + '@testmail.tm'
135 user = self._create_test_user(name=username, email=email,
136 tenantId=tenant['id'], password=password)
137 return user
138
139 def setup_test_tenant(self):
140 """Set up a test tenant."""
141 tenant = self.projects_client.create_tenant(
142 name=data_utils.rand_name('test_tenant'),
143 description=data_utils.rand_name('desc'))['tenant']
144 # Delete the tenant at the end of the test
145 self.addCleanup(self.tenants_client.delete_tenant, tenant['id'])
146 return tenant
147
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000148
Chris Hoge4f6117a2015-03-20 12:39:33 -0500149class BaseIdentityV3Test(BaseIdentityTest):
150
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000151 credentials = ['primary']
152
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100153 # identity v3 tests should obtain tokens and create accounts via v3
154 # regardless of the configured CONF.identity.auth_version
155 identity_version = 'v3'
Rohan Kanadeb645e172015-02-05 17:38:59 +0530156
157 @classmethod
158 def setup_clients(cls):
Chris Hoge4f6117a2015-03-20 12:39:33 -0500159 super(BaseIdentityV3Test, cls).setup_clients()
160 cls.non_admin_client = cls.os.identity_v3_client
Daniel Mellado7aea5342016-02-09 09:10:12 +0000161 cls.non_admin_users_client = cls.os.users_v3_client
Chris Hoge4f6117a2015-03-20 12:39:33 -0500162 cls.non_admin_token = cls.os.token_v3_client
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -0600163 cls.non_admin_projects_client = cls.os.projects_client
Chris Hoge4f6117a2015-03-20 12:39:33 -0500164
Chris Hoge4f6117a2015-03-20 12:39:33 -0500165
166class BaseIdentityV3AdminTest(BaseIdentityV3Test):
167
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100168 credentials = ['primary', 'admin']
Chris Hoge4f6117a2015-03-20 12:39:33 -0500169
170 @classmethod
171 def setup_clients(cls):
Rohan Kanadeb645e172015-02-05 17:38:59 +0530172 super(BaseIdentityV3AdminTest, cls).setup_clients()
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000173 cls.client = cls.os_adm.identity_v3_client
Daniel Mellado91a26b62016-02-11 11:13:04 +0000174 cls.domains_client = cls.os_adm.domains_client
Daniel Mellado7aea5342016-02-09 09:10:12 +0000175 cls.users_client = cls.os_adm.users_v3_client
Daniel Mellado76405392016-02-11 12:47:12 +0000176 cls.trusts_client = cls.os_adm.trusts_client
Arx Cruz24bcb882016-02-10 15:20:16 +0100177 cls.roles_client = cls.os_adm.roles_v3_client
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000178 cls.token = cls.os_adm.token_v3_client
Yaroslav Lobankovf6906e12016-02-26 19:44:53 -0600179 cls.endpoints_client = cls.os_adm.endpoints_v3_client
Yaroslav Lobankov757d1a22015-12-18 11:43:02 +0300180 cls.regions_client = cls.os_adm.regions_client
Yaroslav Lobankovf6906e12016-02-26 19:44:53 -0600181 cls.services_client = cls.os_adm.identity_services_v3_client
Yaroslav Lobankoved4d15c2015-12-18 11:30:10 +0300182 cls.policies_client = cls.os_adm.policies_client
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000183 cls.creds_client = cls.os_adm.credentials_client
Yaroslav Lobankov997a1452015-11-19 17:11:37 +0300184 cls.groups_client = cls.os_adm.groups_client
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -0600185 cls.projects_client = cls.os_adm.projects_client
Andrea Frittoli (andreaf)100d18d2016-05-05 23:34:52 +0100186 if CONF.identity.admin_domain_scope:
187 # NOTE(andreaf) When keystone policy requires it, the identity
188 # admin clients for these tests shall use 'domain' scoped tokens.
189 # As the client manager is already created by the base class,
190 # we set the scope for the inner auth provider.
191 cls.os_adm.auth_provider.scope = 'domain'
Yaroslav Lobankov997a1452015-11-19 17:11:37 +0300192
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300193 @classmethod
194 def resource_setup(cls):
195 super(BaseIdentityV3AdminTest, cls).resource_setup()
Arx Cruz24bcb882016-02-10 15:20:16 +0100196 cls.data = DataGeneratorV3(cls.projects_client, cls.users_client,
197 cls.roles_client, cls.domains_client)
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000198
199 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +0100200 def resource_cleanup(cls):
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000201 cls.data.teardown_all()
Andrea Frittoli7688e742014-09-15 12:38:22 +0100202 super(BaseIdentityV3AdminTest, cls).resource_cleanup()
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000203
David Kranzd8ccb792014-12-29 11:32:05 -0500204 @classmethod
Tom Cocozzello5544c172016-02-23 17:50:28 -0600205 def disable_user(cls, user_name, domain_id=None):
206 user = cls.get_user_by_name(user_name, domain_id)
Daniel Mellado7aea5342016-02-09 09:10:12 +0000207 cls.users_client.update_user(user['id'], user_name, enabled=False)
BinBin Congc6e8ef52015-11-20 02:08:46 -0500208
Martin Pavlasek4c3f2ab2014-04-15 17:15:15 +0200209 def delete_domain(self, domain_id):
210 # NOTE(mpavlase) It is necessary to disable the domain before deleting
211 # otherwise it raises Forbidden exception
Daniel Mellado91a26b62016-02-11 11:13:04 +0000212 self.domains_client.update_domain(domain_id, enabled=False)
213 self.domains_client.delete_domain(domain_id)
Martin Pavlasek4c3f2ab2014-04-15 17:15:15 +0200214
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000215
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300216class BaseDataGenerator(object):
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700217
Arx Cruz24bcb882016-02-10 15:20:16 +0100218 def __init__(self, projects_client, users_client, roles_client,
219 domains_client=None):
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -0600220 self.projects_client = projects_client
Daniel Mellado7aea5342016-02-09 09:10:12 +0000221 self.users_client = users_client
Arx Cruz24bcb882016-02-10 15:20:16 +0100222 self.roles_client = roles_client
Daniel Mellado91a26b62016-02-11 11:13:04 +0000223 self.domains_client = domains_client
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700224
Yaroslav Lobankov95aa3f72016-01-28 15:39:49 -0600225 self.user_password = None
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300226 self.user = None
227 self.tenant = None
228 self.project = None
229 self.role = None
230 self.domain = None
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700231
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300232 self.users = []
233 self.tenants = []
234 self.projects = []
235 self.roles = []
236 self.domains = []
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700237
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300238 def _create_test_user(self, **kwargs):
Yaroslav Lobankov95aa3f72016-01-28 15:39:49 -0600239 self.user_password = data_utils.rand_password()
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300240 self.user = self.users_client.create_user(
ghanshyame1c6c1c2016-06-15 14:50:41 +0900241 password=self.user_password,
242 **kwargs)['user']
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300243 self.users.append(self.user)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700244
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300245 def setup_test_role(self):
246 """Set up a test role."""
Yaroslav Lobankov95aa3f72016-01-28 15:39:49 -0600247 self.role = self.roles_client.create_role(
248 name=data_utils.rand_name('test_role'))['role']
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300249 self.roles.append(self.role)
Nayna Patele6331362013-08-12 06:59:48 +0000250
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300251 def teardown_all(self):
252 for user in self.users:
Matthew Treinish03f09f92016-06-23 15:32:33 -0400253 test_utils.call_and_ignore_notfound_exc(
Gyorgy Szombathelyiedb0a3b2016-07-01 13:34:08 +0200254 self.users_client.delete_user, user['id'])
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300255 for tenant in self.tenants:
Matthew Treinish03f09f92016-06-23 15:32:33 -0400256 test_utils.call_and_ignore_notfound_exc(
Gyorgy Szombathelyiedb0a3b2016-07-01 13:34:08 +0200257 self.projects_client.delete_tenant, tenant['id'])
Brant Knudsone77b6892016-06-23 13:07:47 -0500258 for project in reversed(self.projects):
Matthew Treinish03f09f92016-06-23 15:32:33 -0400259 test_utils.call_and_ignore_notfound_exc(
Gyorgy Szombathelyiedb0a3b2016-07-01 13:34:08 +0200260 self.projects_client.delete_project, project['id'])
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300261 for role in self.roles:
Matthew Treinish03f09f92016-06-23 15:32:33 -0400262 test_utils.call_and_ignore_notfound_exc(
Gyorgy Szombathelyiedb0a3b2016-07-01 13:34:08 +0200263 self.roles_client.delete_role, role['id'])
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300264 for domain in self.domains:
Matthew Treinish03f09f92016-06-23 15:32:33 -0400265 test_utils.call_and_ignore_notfound_exc(
Gyorgy Szombathelyiedb0a3b2016-07-01 13:34:08 +0200266 self.domains_client.update_domain, domain['id'], enabled=False)
Matthew Treinish03f09f92016-06-23 15:32:33 -0400267 test_utils.call_and_ignore_notfound_exc(
Gyorgy Szombathelyiedb0a3b2016-07-01 13:34:08 +0200268 self.domains_client.delete_domain, domain['id'])
Nayna Patele6331362013-08-12 06:59:48 +0000269
nayna-patel2db83b32014-05-15 11:41:03 +0000270
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300271class DataGeneratorV2(BaseDataGenerator):
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900272
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300273 def setup_test_user(self):
274 """Set up a test user."""
275 self.setup_test_tenant()
ghanshyame1c6c1c2016-06-15 14:50:41 +0900276 username = data_utils.rand_name('test_user')
277 email = username + '@testmail.tm'
278 self._create_test_user(name=username, email=email,
279 tenantId=self.tenant['id'])
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300280
281 def setup_test_tenant(self):
282 """Set up a test tenant."""
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300283 self.tenant = self.projects_client.create_tenant(
Yaroslav Lobankov95aa3f72016-01-28 15:39:49 -0600284 name=data_utils.rand_name('test_tenant'),
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300285 description=data_utils.rand_name('desc'))['tenant']
286 self.tenants.append(self.tenant)
287
288
289class DataGeneratorV3(BaseDataGenerator):
290
291 def setup_test_user(self):
292 """Set up a test user."""
293 self.setup_test_project()
ghanshyame1c6c1c2016-06-15 14:50:41 +0900294 username = data_utils.rand_name('test_user')
295 email = username + '@testmail.tm'
296 self._create_test_user(user_name=username, email=email,
297 project_id=self.project['id'])
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300298
299 def setup_test_project(self):
300 """Set up a test project."""
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300301 self.project = self.projects_client.create_project(
Yaroslav Lobankov95aa3f72016-01-28 15:39:49 -0600302 name=data_utils.rand_name('test_project'),
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300303 description=data_utils.rand_name('desc'))['project']
304 self.projects.append(self.project)
305
306 def setup_test_domain(self):
307 """Set up a test domain."""
Daniel Mellado91a26b62016-02-11 11:13:04 +0000308 self.domain = self.domains_client.create_domain(
Yaroslav Lobankov2c2f0362016-01-13 18:07:22 +0300309 name=data_utils.rand_name('test_domain'),
310 description=data_utils.rand_name('desc'))['domain']
311 self.domains.append(self.domain)