blob: 409d4f83764839c71b72e65eb9fcbe911fd38cfb [file] [log] [blame]
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +05301# Copyright 2013 OpenStack Foundation
2# 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
Lance Bragstadf6026442015-11-25 15:29:50 +000016import time
17
Rodrigo Duarte Sousa2d78e8e2016-09-28 10:38:08 -030018import testtools
19
Sean Dague1937d092013-05-17 16:36:38 -040020from tempest.api.identity import base
Rodrigo Duarte Sousa2d78e8e2016-09-28 10:38:08 -030021from tempest import config
Ken'ichi Ohmichi7bd25752017-03-10 10:45:39 -080022from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080023from tempest.lib import decorators
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053024
25
Rodrigo Duarte Sousa2d78e8e2016-09-28 10:38:08 -030026CONF = config.CONF
27
28
Matthew Treinishdb2c5972014-01-31 22:18:59 +000029class UsersV3TestJSON(base.BaseIdentityV3AdminTest):
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053030
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080031 @decorators.idempotent_id('b537d090-afb9-4519-b95d-270b0708e87e')
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053032 def test_user_update(self):
33 # Test case to check if updating of user attributes is successful.
Attila Fazekasf7f34f92013-08-01 17:01:44 +020034 # Creating first user
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000035 u_name = data_utils.rand_name('user')
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053036 u_desc = u_name + 'description'
37 u_email = u_name + '@testmail.tm'
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060038 u_password = data_utils.rand_password()
Daniel Mellado7aea5342016-02-09 09:10:12 +000039 user = self.users_client.create_user(
ghanshyam7f817db2016-08-01 18:37:13 +090040 name=u_name, description=u_desc, password=u_password,
John Warren56317e02015-08-12 20:48:32 +000041 email=u_email, enabled=False)['user']
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053042 # Delete the User at the end of this method
Daniel Mellado7aea5342016-02-09 09:10:12 +000043 self.addCleanup(self.users_client.delete_user, user['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +020044 # Creating second project for updation
zhuflf2f47052017-04-20 15:08:02 +080045 project = self.setup_test_project()
Attila Fazekasf7f34f92013-08-01 17:01:44 +020046 # Updating user details with new values
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000047 u_name2 = data_utils.rand_name('user2')
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053048 u_email2 = u_name2 + '@testmail.tm'
49 u_description2 = u_name2 + ' description'
Daniel Mellado7aea5342016-02-09 09:10:12 +000050 update_user = self.users_client.update_user(
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053051 user['id'], name=u_name2, description=u_description2,
52 project_id=project['id'],
John Warren56317e02015-08-12 20:48:32 +000053 email=u_email2, enabled=False)['user']
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053054 self.assertEqual(u_name2, update_user['name'])
55 self.assertEqual(u_description2, update_user['description'])
56 self.assertEqual(project['id'],
57 update_user['project_id'])
58 self.assertEqual(u_email2, update_user['email'])
Ken'ichi Ohmichi73cb70b2015-04-17 02:31:12 +000059 self.assertEqual(False, update_user['enabled'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +020060 # GET by id after updation
Daniel Mellado7aea5342016-02-09 09:10:12 +000061 new_user_get = self.users_client.show_user(user['id'])['user']
Attila Fazekasf7f34f92013-08-01 17:01:44 +020062 # Assert response body of GET after updation
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053063 self.assertEqual(u_name2, new_user_get['name'])
64 self.assertEqual(u_description2, new_user_get['description'])
65 self.assertEqual(project['id'],
66 new_user_get['project_id'])
67 self.assertEqual(u_email2, new_user_get['email'])
Ken'ichi Ohmichi73cb70b2015-04-17 02:31:12 +000068 self.assertEqual(False, new_user_get['enabled'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053069
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080070 @decorators.idempotent_id('2d223a0e-e457-4a70-9fb1-febe027a0ff9')
ravikumar-venkatesand35d6442014-05-05 12:14:45 +000071 def test_update_user_password(self):
72 # Creating User to check password updation
73 u_name = data_utils.rand_name('user')
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060074 original_password = data_utils.rand_password()
Daniel Mellado7aea5342016-02-09 09:10:12 +000075 user = self.users_client.create_user(
ghanshyam7f817db2016-08-01 18:37:13 +090076 name=u_name, password=original_password)['user']
ravikumar-venkatesand35d6442014-05-05 12:14:45 +000077 # Delete the User at the end all test methods
Daniel Mellado7aea5342016-02-09 09:10:12 +000078 self.addCleanup(self.users_client.delete_user, user['id'])
ravikumar-venkatesand35d6442014-05-05 12:14:45 +000079 # Update user with new password
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060080 new_password = data_utils.rand_password()
Daniel Mellado7aea5342016-02-09 09:10:12 +000081 self.users_client.update_user_password(
82 user['id'], password=new_password,
83 original_password=original_password)
Morgan Fainberg5b2c7452016-02-02 20:15:47 -080084 # NOTE(morganfainberg): Fernet tokens are not subsecond aware and
85 # Keystone should only be precise to the second. Sleep to ensure
Yaroslav Lobankovcbcb6112016-03-08 12:30:01 -060086 # we are passing the second boundary.
Lance Bragstadf6026442015-11-25 15:29:50 +000087 time.sleep(1)
Jamie Lennox97504612015-02-26 16:47:06 +110088 resp = self.token.auth(user_id=user['id'],
89 password=new_password).response
ravikumar-venkatesand35d6442014-05-05 12:14:45 +000090 subject_token = resp['x-subject-token']
91 # Perform GET Token to verify and confirm password is updated
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +000092 token_details = self.client.show_token(subject_token)['token']
ravikumar-venkatesand35d6442014-05-05 12:14:45 +000093 self.assertEqual(token_details['user']['id'], user['id'])
94 self.assertEqual(token_details['user']['name'], u_name)
95
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080096 @decorators.idempotent_id('a831e70c-e35b-430b-92ed-81ebbc5437b8')
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053097 def test_list_user_projects(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +020098 # List the projects that a user has access upon
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053099 assigned_project_ids = list()
100 fetched_project_ids = list()
zhuflf2f47052017-04-20 15:08:02 +0800101 u_project = self.setup_test_project()
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200102 # Create a user.
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +0000103 u_name = data_utils.rand_name('user')
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530104 u_desc = u_name + 'description'
105 u_email = u_name + '@testmail.tm'
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -0600106 u_password = data_utils.rand_password()
Daniel Mellado7aea5342016-02-09 09:10:12 +0000107 user_body = self.users_client.create_user(
ghanshyam7f817db2016-08-01 18:37:13 +0900108 name=u_name, description=u_desc, password=u_password,
John Warren56317e02015-08-12 20:48:32 +0000109 email=u_email, enabled=False, project_id=u_project['id'])['user']
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530110 # Delete the User at the end of this method
Daniel Mellado7aea5342016-02-09 09:10:12 +0000111 self.addCleanup(self.users_client.delete_user, user_body['id'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530112 # Creating Role
zhufl66b616a2017-04-11 15:00:32 +0800113 role_body = self.setup_test_role()
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530114
Daniel Mellado7aea5342016-02-09 09:10:12 +0000115 user = self.users_client.show_user(user_body['id'])['user']
Arx Cruz24bcb882016-02-10 15:20:16 +0100116 role = self.roles_client.show_role(role_body['id'])['role']
zhufl8e9a0732017-01-26 16:15:21 +0800117 for _ in range(2):
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530118 # Creating project so as to assign role
zhuflf2f47052017-04-20 15:08:02 +0800119 project_body = self.setup_test_project()
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -0600120 project = self.projects_client.show_project(
121 project_body['id'])['project']
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200122 # Assigning roles to user on project
ghanshyam2e6fb562016-09-06 11:14:31 +0900123 self.roles_client.create_user_role_on_project(project['id'],
Arx Cruz24bcb882016-02-10 15:20:16 +0100124 user['id'],
125 role['id'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530126 assigned_project_ids.append(project['id'])
Daniel Mellado7aea5342016-02-09 09:10:12 +0000127 body = self.users_client.list_user_projects(user['id'])['projects']
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530128 for i in body:
129 fetched_project_ids.append(i['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200130 # verifying the project ids in list
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530131 missing_projects =\
132 [p for p in assigned_project_ids
133 if p not in fetched_project_ids]
Masayuki Igawaf9009b42017-04-10 14:49:29 +0900134 self.assertEmpty(missing_projects,
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530135 "Failed to find project %s in fetched list" %
136 ', '.join(m_project for m_project
DennyZhangb432bac2013-09-17 16:24:12 +0000137 in missing_projects))
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530138
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800139 @decorators.idempotent_id('c10dcd90-461d-4b16-8e23-4eb836c00644')
wanglianminb1ddea72014-02-25 17:17:30 +0800140 def test_get_user(self):
141 # Get a user detail
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700142 user = self.setup_test_user()
143 fetched_user = self.users_client.show_user(user['id'])['user']
144 self.assertEqual(user['id'], fetched_user['id'])
Rodrigo Duarte Sousa2d78e8e2016-09-28 10:38:08 -0300145
146 @testtools.skipUnless(CONF.identity_feature_enabled.security_compliance,
147 'Security compliance not available.')
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800148 @decorators.idempotent_id('568cd46c-ee6c-4ab4-a33a-d3791931979e')
Rodrigo Duarte Sousa2d78e8e2016-09-28 10:38:08 -0300149 def test_password_history_not_enforced_in_admin_reset(self):
Jordan Pittier8160d312017-04-18 11:52:23 +0200150 old_password = self.os_primary.credentials.password
151 user_id = self.os_primary.credentials.user_id
Rodrigo Duarte Sousa2d78e8e2016-09-28 10:38:08 -0300152
153 new_password = data_utils.rand_password()
154 self.users_client.update_user(user_id, password=new_password)
155 # To be safe, we add this cleanup to restore the original password in
156 # case something goes wrong before it is restored later.
157 self.addCleanup(
158 self.users_client.update_user, user_id, password=old_password)
159
160 # Check authorization with new password
161 self.token.auth(user_id=user_id, password=new_password)
162
163 if CONF.identity.user_unique_last_password_count > 1:
164 # The password history is not enforced via the admin reset route.
165 # We can set the same password.
166 self.users_client.update_user(user_id, password=new_password)
167
168 # Restore original password
169 self.users_client.update_user(user_id, password=old_password)
170 # Check authorization with old password
171 self.token.auth(user_id=user_id, password=old_password)