blob: 57a321a737496e3a6ecf1f0bcd1220f232e6c783 [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
Yaroslav Lobankovcbcb6112016-03-08 12:30:01 -060016import time
17
Masayuki Igawaba7bcf62014-02-17 14:56:41 +090018from testtools import matchers
Sean Dague1937d092013-05-17 16:36:38 -040019
20from tempest.api.identity import base
Ken'ichi Ohmichi7bd25752017-03-10 10:45:39 -080021from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080022from tempest.lib import decorators
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070023
24
Matthew Treinishdb2c5972014-01-31 22:18:59 +000025class UsersTestJSON(base.BaseIdentityV2AdminTest):
zhufla7635d72020-04-29 14:36:41 +080026 """Test keystone users via v2 API"""
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070027
Adalberto Medeiros081464b2013-08-16 09:41:29 -040028 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +010029 def resource_setup(cls):
30 super(UsersTestJSON, cls).resource_setup()
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000031 cls.alt_user = data_utils.rand_name('test_user')
Adalberto Medeiros081464b2013-08-16 09:41:29 -040032 cls.alt_email = cls.alt_user + '@testmail.tm'
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070033
Jordan Pittier3b46d272017-04-12 16:17:28 +020034 @decorators.attr(type='smoke')
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080035 @decorators.idempotent_id('2d55a71e-da1d-4b43-9c03-d269fd93d905')
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070036 def test_create_user(self):
zhufla7635d72020-04-29 14:36:41 +080037 """Test creating a user via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -070038 tenant = self.setup_test_tenant()
zhufl75d51a92017-04-11 16:02:39 +080039 user = self.create_test_user(name=self.alt_user, tenantId=tenant['id'])
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070040 self.assertEqual(self.alt_user, user['name'])
41
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080042 @decorators.idempotent_id('89d9fdb8-15c2-4304-a429-48715d0af33d')
huangtianhuafc8db4f2013-10-08 12:05:58 +080043 def test_create_user_with_enabled(self):
zhufla7635d72020-04-29 14:36:41 +080044 """Test creating a user with enabled : False via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -070045 tenant = self.setup_test_tenant()
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000046 name = data_utils.rand_name('test_user')
zhufl75d51a92017-04-11 16:02:39 +080047 user = self.create_test_user(name=name,
48 tenantId=tenant['id'],
49 email=self.alt_email,
50 enabled=False)
huangtianhuafc8db4f2013-10-08 12:05:58 +080051 self.assertEqual(name, user['name'])
Ken'ichi Ohmichi73cb70b2015-04-17 02:31:12 +000052 self.assertEqual(False, user['enabled'])
huangtianhuafc8db4f2013-10-08 12:05:58 +080053 self.assertEqual(self.alt_email, user['email'])
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070054
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080055 @decorators.idempotent_id('39d05857-e8a5-4ed4-ba83-0b52d3ab97ee')
Chang Bo Guob36b2f12013-09-13 04:52:00 -070056 def test_update_user(self):
zhufla7635d72020-04-29 14:36:41 +080057 """Test updating user attributes via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -070058 tenant = self.setup_test_tenant()
zhufl75d51a92017-04-11 16:02:39 +080059 user = self.create_test_user(tenantId=tenant['id'])
60
Chang Bo Guob36b2f12013-09-13 04:52:00 -070061 # Updating user details with new values
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000062 u_name2 = data_utils.rand_name('user2')
Chang Bo Guob36b2f12013-09-13 04:52:00 -070063 u_email2 = u_name2 + '@testmail.tm'
Daniel Mellado82c83a52015-12-09 15:16:49 +000064 update_user = self.users_client.update_user(user['id'], name=u_name2,
65 email=u_email2,
66 enabled=False)['user']
Chang Bo Guob36b2f12013-09-13 04:52:00 -070067 self.assertEqual(u_name2, update_user['name'])
68 self.assertEqual(u_email2, update_user['email'])
Ken'ichi Ohmichi73cb70b2015-04-17 02:31:12 +000069 self.assertEqual(False, update_user['enabled'])
Chang Bo Guob36b2f12013-09-13 04:52:00 -070070 # GET by id after updating
Daniel Mellado82c83a52015-12-09 15:16:49 +000071 updated_user = self.users_client.show_user(user['id'])['user']
Chang Bo Guob36b2f12013-09-13 04:52:00 -070072 # Assert response body of GET after updating
73 self.assertEqual(u_name2, updated_user['name'])
74 self.assertEqual(u_email2, updated_user['email'])
Ken'ichi Ohmichi73cb70b2015-04-17 02:31:12 +000075 self.assertEqual(False, update_user['enabled'])
Chang Bo Guob36b2f12013-09-13 04:52:00 -070076
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080077 @decorators.idempotent_id('29ed26f4-a74e-4425-9a85-fdb49fa269d2')
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070078 def test_delete_user(self):
zhufla7635d72020-04-29 14:36:41 +080079 """Test deleting a user via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -070080 tenant = self.setup_test_tenant()
zhufl75d51a92017-04-11 16:02:39 +080081 user = self.create_test_user(tenantId=tenant['id'])
Daniel Mellado82c83a52015-12-09 15:16:49 +000082 self.users_client.delete_user(user['id'])
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070083
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080084 @decorators.idempotent_id('aca696c3-d645-4f45-b728-63646045beb1')
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070085 def test_user_authentication(self):
zhufla7635d72020-04-29 14:36:41 +080086 """Test that valid user's token is authenticated via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -070087 password = data_utils.rand_password()
88 user = self.setup_test_user(password)
89 tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant']
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070090 # Get a token
Castulo J. Martineze3adee42016-07-14 10:40:08 -070091 self.token_client.auth(user['name'],
92 password,
93 tenant['name'])
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070094 # Re-auth
Castulo J. Martineze3adee42016-07-14 10:40:08 -070095 self.token_client.auth(user['name'],
96 password,
97 tenant['name'])
Rohit Karajgi6b1e1542012-05-14 05:55:54 -070098
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080099 @decorators.idempotent_id('5d1fa498-4c2d-4732-a8fe-2b054598cfdd')
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700100 def test_authentication_request_without_token(self):
zhufla7635d72020-04-29 14:36:41 +0800101 """Test authentication request without token via v2 API"""
Sean Dague46c4a2b2013-01-03 17:54:17 -0500102 # Request for token authentication with a valid token in header
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700103 password = data_utils.rand_password()
104 user = self.setup_test_user(password)
105 tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant']
106 self.token_client.auth(user['name'],
107 password,
108 tenant['name'])
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700109 # Get the token of the current client
Andrea Frittoli8bbdb162014-01-06 11:06:13 +0000110 token = self.client.auth_provider.get_token()
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700111 # Delete the token from database
112 self.client.delete_token(token)
113 # Re-auth
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700114 self.token_client.auth(user['name'],
115 password,
116 tenant['name'])
Andrea Frittoli8bbdb162014-01-06 11:06:13 +0000117 self.client.auth_provider.clear_auth()
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700118
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800119 @decorators.idempotent_id('a149c02e-e5e0-4b89-809e-7e8faf33ccda')
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700120 def test_get_users(self):
zhufla7635d72020-04-29 14:36:41 +0800121 """Test getting users via v2 API
122
123 Get a list of users and find the test user
124 """
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700125 user = self.setup_test_user()
Daniel Mellado82c83a52015-12-09 15:16:49 +0000126 users = self.users_client.list_users()['users']
ivan-zhu1feeb382013-01-24 10:14:39 +0800127 self.assertThat([u['name'] for u in users],
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700128 matchers.Contains(user['name']),
129 "Could not find %s" % user['name'])
Rohit Karajgi6b1e1542012-05-14 05:55:54 -0700130
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800131 @decorators.idempotent_id('6e317209-383a-4bed-9f10-075b7c82c79a')
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530132 def test_list_users_for_tenant(self):
zhufla7635d72020-04-29 14:36:41 +0800133 """Test returning a list of all users for a tenant via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700134 tenant = self.setup_test_tenant()
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530135 user_ids = list()
136 fetched_user_ids = list()
zhufl75d51a92017-04-11 16:02:39 +0800137 user1 = self.create_test_user(tenantId=tenant['id'])
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530138 user_ids.append(user1['id'])
zhufl75d51a92017-04-11 16:02:39 +0800139 user2 = self.create_test_user(tenantId=tenant['id'])
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530140 user_ids.append(user2['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200141 # List of users for the respective tenant ID
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700142 body = (self.tenants_client.list_tenant_users(tenant['id'])
Anusha Ramineni0cfb4612015-08-24 08:49:10 +0530143 ['users'])
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530144 for i in body:
145 fetched_user_ids.append(i['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200146 # verifying the user Id in the list
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530147 missing_users =\
148 [user for user in user_ids if user not in fetched_user_ids]
Masayuki Igawaf9009b42017-04-10 14:49:29 +0900149 self.assertEmpty(missing_users,
Zhongyue Luoe0884a32012-09-25 17:24:17 +0800150 "Failed to find user %s in fetched list" %
151 ', '.join(m_user for m_user in missing_users))
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530152
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800153 @decorators.idempotent_id('a8b54974-40e1-41c0-b812-50fc90827971')
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530154 def test_list_users_with_roles_for_tenant(self):
zhufla7635d72020-04-29 14:36:41 +0800155 """Test listing users on tenant with roles assigned via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700156 user = self.setup_test_user()
157 tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant']
158 role = self.setup_test_role()
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200159 # Assigning roles to two users
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530160 user_ids = list()
161 fetched_user_ids = list()
162 user_ids.append(user['id'])
ghanshyam50894fc2016-06-17 13:20:25 +0900163 role = self.roles_client.create_user_role_on_project(
164 tenant['id'], user['id'], role['id'])['role']
Adalberto Medeiros081464b2013-08-16 09:41:29 -0400165
zhufl75d51a92017-04-11 16:02:39 +0800166 second_user = self.create_test_user(tenantId=tenant['id'])
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530167 user_ids.append(second_user['id'])
ghanshyam50894fc2016-06-17 13:20:25 +0900168 role = self.roles_client.create_user_role_on_project(
169 tenant['id'], second_user['id'], role['id'])['role']
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200170 # List of users with roles for the respective tenant ID
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700171 body = (self.tenants_client.list_tenant_users(tenant['id'])['users'])
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530172 for i in body:
173 fetched_user_ids.append(i['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200174 # verifying the user Id in the list
Monty Taylorb2ca5ca2013-04-28 18:00:21 -0700175 missing_users = [missing_user for missing_user in user_ids
176 if missing_user not in fetched_user_ids]
Masayuki Igawaf9009b42017-04-10 14:49:29 +0900177 self.assertEmpty(missing_users,
Zhongyue Luoe0884a32012-09-25 17:24:17 +0800178 "Failed to find user %s in fetched list" %
179 ', '.join(m_user for m_user in missing_users))
rajalakshmi-ganesanefc8bd72012-05-30 17:52:11 +0530180
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800181 @decorators.idempotent_id('1aeb25ac-6ec5-4d8b-97cb-7ac3567a989f')
Abhijeet.Jainff5c3542014-05-06 16:07:30 +0530182 def test_update_user_password(self):
zhufla7635d72020-04-29 14:36:41 +0800183 """Test updating of user password via v2 API"""
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700184 user = self.setup_test_user()
185 tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant']
Abhijeet.Jainff5c3542014-05-06 16:07:30 +0530186 # Updating the user with new password
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -0600187 new_pass = data_utils.rand_password()
Daniel Mellado82c83a52015-12-09 15:16:49 +0000188 update_user = self.users_client.update_user_password(
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700189 user['id'], password=new_pass)['user']
190 self.assertEqual(update_user['id'], user['id'])
Yaroslav Lobankovcbcb6112016-03-08 12:30:01 -0600191 # NOTE(morganfainberg): Fernet tokens are not subsecond aware and
192 # Keystone should only be precise to the second. Sleep to ensure
193 # we are passing the second boundary.
194 time.sleep(1)
195 # Validate the updated password through getting a token.
Castulo J. Martineze3adee42016-07-14 10:40:08 -0700196 body = self.token_client.auth(user['name'], new_pass,
197 tenant['name'])
melissaml37503dd2016-09-14 13:10:49 +0800198 self.assertIn('id', body['token'])