blob: ada292fd71255e032f5d343fad8454e3a030e55e [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
Masayuki Igawabfa07602015-01-20 18:47:17 +090017from tempest_lib import exceptions as lib_exc
Jay Pipesf38eaac2012-06-21 13:37:35 -040018
Andrea Frittoli878d5ab2015-01-30 13:22:50 +000019from tempest.common import cred_provider
Fei Long Wangd39431f2015-05-14 11:30:48 +120020from tempest.common.utils import data_utils
Matthew Treinishdb2c5972014-01-31 22:18:59 +000021from tempest import config
Attila Fazekasdc216422013-01-29 15:12:14 +010022import tempest.test
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070023
Matthew Treinishdb2c5972014-01-31 22:18:59 +000024CONF = config.CONF
Masayuki Igawa630a3fa2014-03-12 19:51:45 +090025LOG = logging.getLogger(__name__)
Matthew Treinishdb2c5972014-01-31 22:18:59 +000026
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070027
Chris Hoge4f6117a2015-03-20 12:39:33 -050028class BaseIdentityTest(tempest.test.BaseTestCase):
Jay Pipesf38eaac2012-06-21 13:37:35 -040029
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070030 @classmethod
Matthew Treinishdb2c5972014-01-31 22:18:59 +000031 def disable_user(cls, user_name):
32 user = cls.get_user_by_name(user_name)
33 cls.client.enable_disable_user(user['id'], False)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070034
Matthew Treinishdb2c5972014-01-31 22:18:59 +000035 @classmethod
36 def disable_tenant(cls, tenant_name):
37 tenant = cls.get_tenant_by_name(tenant_name)
38 cls.client.update_tenant(tenant['id'], enabled=False)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070039
Matthew Treinishdb2c5972014-01-31 22:18:59 +000040 @classmethod
41 def get_user_by_name(cls, name):
David Kranzb7afa922014-12-30 10:56:26 -050042 users = cls.client.get_users()
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070043 user = [u for u in users if u['name'] == name]
44 if len(user) > 0:
45 return user[0]
46
Matthew Treinishdb2c5972014-01-31 22:18:59 +000047 @classmethod
48 def get_tenant_by_name(cls, name):
49 try:
David Kranzb7afa922014-12-30 10:56:26 -050050 tenants = cls.client.list_tenants()
John Warrenacf00512015-08-06 16:13:58 -040051 # TODO(jswarren): always retrieve 'tenants' value
52 # once both clients return full response objects
53 if 'tenants' in tenants:
54 tenants = tenants['tenants']
Matthew Treinishdb2c5972014-01-31 22:18:59 +000055 except AttributeError:
John Warren56317e02015-08-12 20:48:32 +000056 tenants = cls.client.list_projects()['projects']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070057 tenant = [t for t in tenants if t['name'] == name]
58 if len(tenant) > 0:
59 return tenant[0]
60
Matthew Treinishdb2c5972014-01-31 22:18:59 +000061 @classmethod
62 def get_role_by_name(cls, name):
David Kranzb7afa922014-12-30 10:56:26 -050063 roles = cls.client.list_roles()
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070064 role = [r for r in roles if r['name'] == name]
65 if len(role) > 0:
66 return role[0]
67
68
Chris Hoge4f6117a2015-03-20 12:39:33 -050069class BaseIdentityV2Test(BaseIdentityTest):
70
Andrea Frittolib21de6c2015-02-06 20:12:38 +000071 credentials = ['primary']
72
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +010073 # identity v2 tests should obtain tokens and create accounts via v2
74 # regardless of the configured CONF.identity.auth_version
75 identity_version = 'v2'
Rohan Kanadeb645e172015-02-05 17:38:59 +053076
77 @classmethod
78 def setup_clients(cls):
Chris Hoge4f6117a2015-03-20 12:39:33 -050079 super(BaseIdentityV2Test, cls).setup_clients()
Jane Zadorozhnabfc72372015-06-16 17:32:59 +030080 cls.non_admin_client = cls.os.identity_public_client
Chris Hoge4f6117a2015-03-20 12:39:33 -050081 cls.non_admin_token_client = cls.os.token_client
82
83 @classmethod
84 def resource_setup(cls):
85 super(BaseIdentityV2Test, cls).resource_setup()
86
87 @classmethod
88 def resource_cleanup(cls):
89 super(BaseIdentityV2Test, cls).resource_cleanup()
90
91
92class BaseIdentityV2AdminTest(BaseIdentityV2Test):
93
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +010094 credentials = ['primary', 'admin']
Chris Hoge4f6117a2015-03-20 12:39:33 -050095
96 @classmethod
97 def setup_clients(cls):
Rohan Kanadeb645e172015-02-05 17:38:59 +053098 super(BaseIdentityV2AdminTest, cls).setup_clients()
Matthew Treinishdb2c5972014-01-31 22:18:59 +000099 cls.client = cls.os_adm.identity_client
Jane Zadorozhnabfc72372015-06-16 17:32:59 +0300100 cls.non_admin_client = cls.os.identity_client
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000101 cls.token_client = cls.os_adm.token_client
Rohan Kanadeb645e172015-02-05 17:38:59 +0530102
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000103 @classmethod
Rohan Kanadeb645e172015-02-05 17:38:59 +0530104 def resource_setup(cls):
105 super(BaseIdentityV2AdminTest, cls).resource_setup()
106 cls.data = DataGenerator(cls.client)
107
108 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +0100109 def resource_cleanup(cls):
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000110 cls.data.teardown_all()
Andrea Frittoli7688e742014-09-15 12:38:22 +0100111 super(BaseIdentityV2AdminTest, cls).resource_cleanup()
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000112
113
Chris Hoge4f6117a2015-03-20 12:39:33 -0500114class BaseIdentityV3Test(BaseIdentityTest):
115
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000116 credentials = ['primary']
117
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100118 # identity v3 tests should obtain tokens and create accounts via v3
119 # regardless of the configured CONF.identity.auth_version
120 identity_version = 'v3'
Rohan Kanadeb645e172015-02-05 17:38:59 +0530121
122 @classmethod
123 def setup_clients(cls):
Chris Hoge4f6117a2015-03-20 12:39:33 -0500124 super(BaseIdentityV3Test, cls).setup_clients()
125 cls.non_admin_client = cls.os.identity_v3_client
126 cls.non_admin_token = cls.os.token_v3_client
127 cls.non_admin_endpoints_client = cls.os.endpoints_client
128 cls.non_admin_region_client = cls.os.region_client
129 cls.non_admin_service_client = cls.os.service_client
130 cls.non_admin_policy_client = cls.os.policy_client
131 cls.non_admin_creds_client = cls.os.credentials_client
132
133 @classmethod
134 def resource_cleanup(cls):
135 super(BaseIdentityV3Test, cls).resource_cleanup()
136
137
138class BaseIdentityV3AdminTest(BaseIdentityV3Test):
139
Andrea Frittoli (andreaf)41601412015-05-12 16:39:03 +0100140 credentials = ['primary', 'admin']
Chris Hoge4f6117a2015-03-20 12:39:33 -0500141
142 @classmethod
143 def setup_clients(cls):
Rohan Kanadeb645e172015-02-05 17:38:59 +0530144 super(BaseIdentityV3AdminTest, cls).setup_clients()
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000145 cls.client = cls.os_adm.identity_v3_client
146 cls.token = cls.os_adm.token_v3_client
147 cls.endpoints_client = cls.os_adm.endpoints_client
ravikumar-venkatesan3052e942014-05-12 18:25:17 +0000148 cls.region_client = cls.os_adm.region_client
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000149 cls.data = DataGenerator(cls.client)
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000150 cls.service_client = cls.os_adm.service_client
151 cls.policy_client = cls.os_adm.policy_client
152 cls.creds_client = cls.os_adm.credentials_client
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000153
154 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +0100155 def resource_cleanup(cls):
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000156 cls.data.teardown_all()
Andrea Frittoli7688e742014-09-15 12:38:22 +0100157 super(BaseIdentityV3AdminTest, cls).resource_cleanup()
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000158
David Kranzd8ccb792014-12-29 11:32:05 -0500159 @classmethod
160 def get_user_by_name(cls, name):
John Warren56317e02015-08-12 20:48:32 +0000161 users = cls.client.get_users()['users']
David Kranzd8ccb792014-12-29 11:32:05 -0500162 user = [u for u in users if u['name'] == name]
163 if len(user) > 0:
164 return user[0]
165
166 @classmethod
167 def get_tenant_by_name(cls, name):
John Warren56317e02015-08-12 20:48:32 +0000168 tenants = cls.client.list_projects()['projects']
David Kranzd8ccb792014-12-29 11:32:05 -0500169 tenant = [t for t in tenants if t['name'] == name]
170 if len(tenant) > 0:
171 return tenant[0]
172
173 @classmethod
174 def get_role_by_name(cls, name):
John Warren56317e02015-08-12 20:48:32 +0000175 roles = cls.client.list_roles()['roles']
David Kranzd8ccb792014-12-29 11:32:05 -0500176 role = [r for r in roles if r['name'] == name]
177 if len(role) > 0:
178 return role[0]
179
Martin Pavlasek4c3f2ab2014-04-15 17:15:15 +0200180 def delete_domain(self, domain_id):
181 # NOTE(mpavlase) It is necessary to disable the domain before deleting
182 # otherwise it raises Forbidden exception
183 self.client.update_domain(domain_id, enabled=False)
184 self.client.delete_domain(domain_id)
185
Matthew Treinishdb2c5972014-01-31 22:18:59 +0000186
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700187class DataGenerator(object):
188
189 def __init__(self, client):
190 self.client = client
191 self.users = []
192 self.tenants = []
193 self.roles = []
194 self.role_name = None
Nayna Patele6331362013-08-12 06:59:48 +0000195 self.v3_users = []
196 self.projects = []
197 self.v3_roles = []
nayna-patel2db83b32014-05-15 11:41:03 +0000198 self.domains = []
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700199
Andrea Frittoli422fbdf2014-03-20 10:05:18 +0000200 @property
201 def test_credentials(self):
Andrea Frittoli878d5ab2015-01-30 13:22:50 +0000202 return cred_provider.get_credentials(username=self.test_user,
203 user_id=self.user['id'],
204 password=self.test_password,
205 tenant_name=self.test_tenant,
206 tenant_id=self.tenant['id'])
Andrea Frittoli422fbdf2014-03-20 10:05:18 +0000207
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700208 def setup_test_user(self):
Sean Daguef237ccb2013-01-04 15:19:14 -0500209 """Set up a test user."""
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700210 self.setup_test_tenant()
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +0000211 self.test_user = data_utils.rand_name('test_user')
212 self.test_password = data_utils.rand_name('pass')
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700213 self.test_email = self.test_user + '@testmail.tm'
David Kranzb7afa922014-12-30 10:56:26 -0500214 self.user = self.client.create_user(self.test_user,
215 self.test_password,
216 self.tenant['id'],
217 self.test_email)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700218 self.users.append(self.user)
219
220 def setup_test_tenant(self):
Sean Daguef237ccb2013-01-04 15:19:14 -0500221 """Set up a test tenant."""
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +0000222 self.test_tenant = data_utils.rand_name('test_tenant')
223 self.test_description = data_utils.rand_name('desc')
David Kranzb7afa922014-12-30 10:56:26 -0500224 self.tenant = self.client.create_tenant(
Zhongyue Luoa1343de2013-01-04 16:21:35 +0800225 name=self.test_tenant,
226 description=self.test_description)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700227 self.tenants.append(self.tenant)
228
229 def setup_test_role(self):
Sean Daguef237ccb2013-01-04 15:19:14 -0500230 """Set up a test role."""
Masayuki Igawa259c1132013-10-31 17:48:44 +0900231 self.test_role = data_utils.rand_name('role')
David Kranzb7afa922014-12-30 10:56:26 -0500232 self.role = self.client.create_role(self.test_role)
Rohit Karajgi69e80a02012-05-15 03:54:04 -0700233 self.roles.append(self.role)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700234
Nayna Patele6331362013-08-12 06:59:48 +0000235 def setup_test_v3_user(self):
236 """Set up a test v3 user."""
237 self.setup_test_project()
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +0000238 self.test_user = data_utils.rand_name('test_user')
239 self.test_password = data_utils.rand_name('pass')
Nayna Patele6331362013-08-12 06:59:48 +0000240 self.test_email = self.test_user + '@testmail.tm'
David Kranzd8ccb792014-12-29 11:32:05 -0500241 self.v3_user = self.client.create_user(
wanglianminb1ddea72014-02-25 17:17:30 +0800242 self.test_user,
243 password=self.test_password,
244 project_id=self.project['id'],
John Warren56317e02015-08-12 20:48:32 +0000245 email=self.test_email)['user']
Nayna Patele6331362013-08-12 06:59:48 +0000246 self.v3_users.append(self.v3_user)
247
248 def setup_test_project(self):
249 """Set up a test project."""
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +0000250 self.test_project = data_utils.rand_name('test_project')
251 self.test_description = data_utils.rand_name('desc')
David Kranzd8ccb792014-12-29 11:32:05 -0500252 self.project = self.client.create_project(
Nayna Patele6331362013-08-12 06:59:48 +0000253 name=self.test_project,
John Warren56317e02015-08-12 20:48:32 +0000254 description=self.test_description)['project']
Nayna Patele6331362013-08-12 06:59:48 +0000255 self.projects.append(self.project)
256
257 def setup_test_v3_role(self):
258 """Set up a test v3 role."""
Masayuki Igawa259c1132013-10-31 17:48:44 +0900259 self.test_role = data_utils.rand_name('role')
John Warren56317e02015-08-12 20:48:32 +0000260 self.v3_role = self.client.create_role(self.test_role)['role']
Nayna Patele6331362013-08-12 06:59:48 +0000261 self.v3_roles.append(self.v3_role)
262
nayna-patel2db83b32014-05-15 11:41:03 +0000263 def setup_test_domain(self):
264 """Set up a test domain."""
265 self.test_domain = data_utils.rand_name('test_domain')
266 self.test_description = data_utils.rand_name('desc')
David Kranzd8ccb792014-12-29 11:32:05 -0500267 self.domain = self.client.create_domain(
nayna-patel2db83b32014-05-15 11:41:03 +0000268 name=self.test_domain,
John Warren56317e02015-08-12 20:48:32 +0000269 description=self.test_description)['domain']
nayna-patel2db83b32014-05-15 11:41:03 +0000270 self.domains.append(self.domain)
271
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900272 @staticmethod
273 def _try_wrapper(func, item, **kwargs):
274 try:
275 if kwargs:
David Kranz9e2ad372014-10-06 17:06:20 -0400276 func(item['id'], **kwargs)
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900277 else:
278 func(item['id'])
Masayuki Igawabfa07602015-01-20 18:47:17 +0900279 except lib_exc.NotFound:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900280 pass
281 except Exception:
282 LOG.exception("Unexpected exception occurred in %s deletion."
283 " But ignored here." % item['id'])
284
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700285 def teardown_all(self):
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900286 # NOTE(masayukig): v3 client doesn't have v2 method.
287 # (e.g. delete_tenant) So we need to check resources existence
288 # before using client methods.
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700289 for user in self.users:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900290 self._try_wrapper(self.client.delete_user, user)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700291 for tenant in self.tenants:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900292 self._try_wrapper(self.client.delete_tenant, tenant)
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700293 for role in self.roles:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900294 self._try_wrapper(self.client.delete_role, role)
Nayna Patele6331362013-08-12 06:59:48 +0000295 for v3_user in self.v3_users:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900296 self._try_wrapper(self.client.delete_user, v3_user)
Nayna Patele6331362013-08-12 06:59:48 +0000297 for v3_project in self.projects:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900298 self._try_wrapper(self.client.delete_project, v3_project)
Nayna Patele6331362013-08-12 06:59:48 +0000299 for v3_role in self.v3_roles:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900300 self._try_wrapper(self.client.delete_role, v3_role)
nayna-patel2db83b32014-05-15 11:41:03 +0000301 for domain in self.domains:
Masayuki Igawa630a3fa2014-03-12 19:51:45 +0900302 self._try_wrapper(self.client.update_domain, domain,
303 enabled=False)
304 self._try_wrapper(self.client.delete_domain, domain)