| # Copyright 2012 OpenStack Foundation |
| # All Rights Reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| # not use this file except in compliance with the License. You may obtain |
| # a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| |
| import time |
| |
| from testtools import matchers |
| |
| from tempest.api.identity import base |
| from tempest.lib.common.utils import data_utils |
| from tempest.lib import decorators |
| |
| |
| class UsersTestJSON(base.BaseIdentityV2AdminTest): |
| """Test keystone users via v2 API""" |
| |
| @classmethod |
| def resource_setup(cls): |
| super(UsersTestJSON, cls).resource_setup() |
| cls.alt_user = data_utils.rand_name('test_user') |
| cls.alt_email = cls.alt_user + '@testmail.tm' |
| |
| @decorators.attr(type='smoke') |
| @decorators.idempotent_id('2d55a71e-da1d-4b43-9c03-d269fd93d905') |
| def test_create_user(self): |
| """Test creating a user via v2 API""" |
| tenant = self.setup_test_tenant() |
| user = self.create_test_user(name=self.alt_user, tenantId=tenant['id']) |
| self.assertEqual(self.alt_user, user['name']) |
| |
| @decorators.idempotent_id('89d9fdb8-15c2-4304-a429-48715d0af33d') |
| def test_create_user_with_enabled(self): |
| """Test creating a user with enabled : False via v2 API""" |
| tenant = self.setup_test_tenant() |
| name = data_utils.rand_name('test_user') |
| user = self.create_test_user(name=name, |
| tenantId=tenant['id'], |
| email=self.alt_email, |
| enabled=False) |
| self.assertEqual(name, user['name']) |
| self.assertEqual(False, user['enabled']) |
| self.assertEqual(self.alt_email, user['email']) |
| |
| @decorators.idempotent_id('39d05857-e8a5-4ed4-ba83-0b52d3ab97ee') |
| def test_update_user(self): |
| """Test updating user attributes via v2 API""" |
| tenant = self.setup_test_tenant() |
| user = self.create_test_user(tenantId=tenant['id']) |
| |
| # Updating user details with new values |
| u_name2 = data_utils.rand_name('user2') |
| u_email2 = u_name2 + '@testmail.tm' |
| update_user = self.users_client.update_user(user['id'], name=u_name2, |
| email=u_email2, |
| enabled=False)['user'] |
| self.assertEqual(u_name2, update_user['name']) |
| self.assertEqual(u_email2, update_user['email']) |
| self.assertEqual(False, update_user['enabled']) |
| # GET by id after updating |
| updated_user = self.users_client.show_user(user['id'])['user'] |
| # Assert response body of GET after updating |
| self.assertEqual(u_name2, updated_user['name']) |
| self.assertEqual(u_email2, updated_user['email']) |
| self.assertEqual(False, update_user['enabled']) |
| |
| @decorators.idempotent_id('29ed26f4-a74e-4425-9a85-fdb49fa269d2') |
| def test_delete_user(self): |
| """Test deleting a user via v2 API""" |
| tenant = self.setup_test_tenant() |
| user = self.create_test_user(tenantId=tenant['id']) |
| self.users_client.delete_user(user['id']) |
| |
| @decorators.idempotent_id('aca696c3-d645-4f45-b728-63646045beb1') |
| def test_user_authentication(self): |
| """Test that valid user's token is authenticated via v2 API""" |
| password = data_utils.rand_password() |
| user = self.setup_test_user(password) |
| tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] |
| # Get a token |
| self.token_client.auth(user['name'], |
| password, |
| tenant['name']) |
| # Re-auth |
| self.token_client.auth(user['name'], |
| password, |
| tenant['name']) |
| |
| @decorators.idempotent_id('5d1fa498-4c2d-4732-a8fe-2b054598cfdd') |
| def test_authentication_request_without_token(self): |
| """Test authentication request without token via v2 API""" |
| # Request for token authentication with a valid token in header |
| password = data_utils.rand_password() |
| user = self.setup_test_user(password) |
| tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] |
| self.token_client.auth(user['name'], |
| password, |
| tenant['name']) |
| # Get the token of the current client |
| token = self.client.auth_provider.get_token() |
| # Delete the token from database |
| self.client.delete_token(token) |
| # Re-auth |
| self.token_client.auth(user['name'], |
| password, |
| tenant['name']) |
| self.client.auth_provider.clear_auth() |
| |
| @decorators.idempotent_id('a149c02e-e5e0-4b89-809e-7e8faf33ccda') |
| def test_get_users(self): |
| """Test getting users via v2 API |
| |
| Get a list of users and find the test user |
| """ |
| user = self.setup_test_user() |
| users = self.users_client.list_users()['users'] |
| self.assertThat([u['name'] for u in users], |
| matchers.Contains(user['name']), |
| "Could not find %s" % user['name']) |
| |
| @decorators.idempotent_id('6e317209-383a-4bed-9f10-075b7c82c79a') |
| def test_list_users_for_tenant(self): |
| """Test returning a list of all users for a tenant via v2 API""" |
| tenant = self.setup_test_tenant() |
| user_ids = list() |
| fetched_user_ids = list() |
| user1 = self.create_test_user(tenantId=tenant['id']) |
| user_ids.append(user1['id']) |
| user2 = self.create_test_user(tenantId=tenant['id']) |
| user_ids.append(user2['id']) |
| # List of users for the respective tenant ID |
| body = (self.tenants_client.list_tenant_users(tenant['id']) |
| ['users']) |
| for i in body: |
| fetched_user_ids.append(i['id']) |
| # verifying the user Id in the list |
| missing_users =\ |
| [user for user in user_ids if user not in fetched_user_ids] |
| self.assertEmpty(missing_users, |
| "Failed to find user %s in fetched list" % |
| ', '.join(m_user for m_user in missing_users)) |
| |
| @decorators.idempotent_id('a8b54974-40e1-41c0-b812-50fc90827971') |
| def test_list_users_with_roles_for_tenant(self): |
| """Test listing users on tenant with roles assigned via v2 API""" |
| user = self.setup_test_user() |
| tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] |
| role = self.setup_test_role() |
| # Assigning roles to two users |
| user_ids = list() |
| fetched_user_ids = list() |
| user_ids.append(user['id']) |
| role = self.roles_client.create_user_role_on_project( |
| tenant['id'], user['id'], role['id'])['role'] |
| |
| second_user = self.create_test_user(tenantId=tenant['id']) |
| user_ids.append(second_user['id']) |
| role = self.roles_client.create_user_role_on_project( |
| tenant['id'], second_user['id'], role['id'])['role'] |
| # List of users with roles for the respective tenant ID |
| body = (self.tenants_client.list_tenant_users(tenant['id'])['users']) |
| for i in body: |
| fetched_user_ids.append(i['id']) |
| # verifying the user Id in the list |
| missing_users = [missing_user for missing_user in user_ids |
| if missing_user not in fetched_user_ids] |
| self.assertEmpty(missing_users, |
| "Failed to find user %s in fetched list" % |
| ', '.join(m_user for m_user in missing_users)) |
| |
| @decorators.idempotent_id('1aeb25ac-6ec5-4d8b-97cb-7ac3567a989f') |
| def test_update_user_password(self): |
| """Test updating of user password via v2 API""" |
| user = self.setup_test_user() |
| tenant = self.tenants_client.show_tenant(user['tenantId'])['tenant'] |
| # Updating the user with new password |
| new_pass = data_utils.rand_password() |
| update_user = self.users_client.update_user_password( |
| user['id'], password=new_pass)['user'] |
| self.assertEqual(update_user['id'], user['id']) |
| # NOTE(morganfainberg): Fernet tokens are not subsecond aware and |
| # Keystone should only be precise to the second. Sleep to ensure |
| # we are passing the second boundary. |
| time.sleep(1) |
| # Validate the updated password through getting a token. |
| body = self.token_client.auth(user['name'], new_pass, |
| tenant['name']) |
| self.assertIn('id', body['token']) |