blob: ed4d31af766860e73692005f7784ce555f6d7ec2 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
nayna-patelb35f7232013-06-28 07:08:44 +00002# 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
Jordan Pittiere8791202016-04-25 18:12:16 +020016import six
17
nayna-patelb35f7232013-06-28 07:08:44 +000018from tempest.api.identity import base
Ken'ichi Ohmichi7bd25752017-03-10 10:45:39 -080019from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080020from tempest.lib import decorators
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050021from tempest.lib import exceptions as lib_exc
nayna-patelb35f7232013-06-28 07:08:44 +000022
23
Masayuki Igawabe64ed32014-02-19 14:32:03 +090024class TokensV3TestJSON(base.BaseIdentityV3AdminTest):
nayna-patelb35f7232013-06-28 07:08:44 +000025
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080026 @decorators.idempotent_id('0f9f5a5f-d5cd-4a86-8a5b-c5ded151f212')
nayna-patelb35f7232013-06-28 07:08:44 +000027 def test_tokens(self):
28 # Valid user's token is authenticated
29 # Create a User
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000030 u_name = data_utils.rand_name('user')
nayna-patelb35f7232013-06-28 07:08:44 +000031 u_desc = '%s-description' % u_name
32 u_email = '%s@testmail.tm' % u_name
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060033 u_password = data_utils.rand_password()
Daniel Mellado7aea5342016-02-09 09:10:12 +000034 user = self.users_client.create_user(
ghanshyam7f817db2016-08-01 18:37:13 +090035 name=u_name, description=u_desc, password=u_password,
John Warren56317e02015-08-12 20:48:32 +000036 email=u_email)['user']
Daniel Mellado7aea5342016-02-09 09:10:12 +000037 self.addCleanup(self.users_client.delete_user, user['id'])
nayna-patelb35f7232013-06-28 07:08:44 +000038 # Perform Authentication
Jamie Lennox97504612015-02-26 16:47:06 +110039 resp = self.token.auth(user_id=user['id'],
40 password=u_password).response
nayna-patelb35f7232013-06-28 07:08:44 +000041 subject_token = resp['x-subject-token']
42 # Perform GET Token
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +000043 token_details = self.client.show_token(subject_token)['token']
nayna-patelb35f7232013-06-28 07:08:44 +000044 self.assertEqual(resp['x-subject-token'], subject_token)
45 self.assertEqual(token_details['user']['id'], user['id'])
46 self.assertEqual(token_details['user']['name'], u_name)
47 # Perform Delete Token
David Kranze9d2f422014-07-02 13:57:41 -040048 self.client.delete_token(subject_token)
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +000049 self.assertRaises(lib_exc.NotFound, self.client.show_token,
nayna-patelb35f7232013-06-28 07:08:44 +000050 subject_token)
51
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080052 @decorators.idempotent_id('565fa210-1da1-4563-999b-f7b5b67cf112')
Brant Knudsonc5553292014-03-15 11:06:05 -050053 def test_rescope_token(self):
Brant Knudson5ee44a42014-03-16 10:55:21 -050054 """Rescope a token.
55
56 An unscoped token can be requested, that token can be used to request a
57 scoped token. The scoped token can be revoked, and the original token
58 used to get a token in a different project.
59
Brant Knudsonc5553292014-03-15 11:06:05 -050060 """
61
62 # Create a user.
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000063 user_name = data_utils.rand_name(name='user')
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060064 user_password = data_utils.rand_password()
ghanshyam7f817db2016-08-01 18:37:13 +090065 user = self.users_client.create_user(name=user_name,
Daniel Mellado7aea5342016-02-09 09:10:12 +000066 password=user_password)['user']
67 self.addCleanup(self.users_client.delete_user, user['id'])
Brant Knudsonc5553292014-03-15 11:06:05 -050068
Brant Knudson5ee44a42014-03-16 10:55:21 -050069 # Create a couple projects
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000070 project1_name = data_utils.rand_name(name='project')
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060071 project1 = self.projects_client.create_project(
72 project1_name)['project']
73 self.addCleanup(self.projects_client.delete_project, project1['id'])
Brant Knudson5ee44a42014-03-16 10:55:21 -050074
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000075 project2_name = data_utils.rand_name(name='project')
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060076 project2 = self.projects_client.create_project(
77 project2_name)['project']
78 self.addCleanup(self.projects_client.delete_project, project2['id'])
Brant Knudsonc5553292014-03-15 11:06:05 -050079
80 # Create a role
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000081 role_name = data_utils.rand_name(name='role')
Arx Cruz24bcb882016-02-10 15:20:16 +010082 role = self.roles_client.create_role(name=role_name)['role']
83 self.addCleanup(self.roles_client.delete_role, role['id'])
Brant Knudsonc5553292014-03-15 11:06:05 -050084
Brant Knudson5ee44a42014-03-16 10:55:21 -050085 # Grant the user the role on both projects.
ghanshyam2e6fb562016-09-06 11:14:31 +090086 self.roles_client.create_user_role_on_project(project1['id'],
Arx Cruz24bcb882016-02-10 15:20:16 +010087 user['id'],
88 role['id'])
Brant Knudson5ee44a42014-03-16 10:55:21 -050089
ghanshyam2e6fb562016-09-06 11:14:31 +090090 self.roles_client.create_user_role_on_project(project2['id'],
Arx Cruz24bcb882016-02-10 15:20:16 +010091 user['id'],
92 role['id'])
Brant Knudsonc5553292014-03-15 11:06:05 -050093
94 # Get an unscoped token.
Jamie Lennox97504612015-02-26 16:47:06 +110095 token_auth = self.token.auth(user_id=user['id'],
David Kranzd8ccb792014-12-29 11:32:05 -050096 password=user_password)
Brant Knudsonc5553292014-03-15 11:06:05 -050097
David Kranzd8ccb792014-12-29 11:32:05 -050098 token_id = token_auth.response['x-subject-token']
Brant Knudsonc5553292014-03-15 11:06:05 -050099 orig_expires_at = token_auth['token']['expires_at']
Brant Knudsonc5553292014-03-15 11:06:05 -0500100 orig_user = token_auth['token']['user']
101
Jordan Pittiere8791202016-04-25 18:12:16 +0200102 self.assertIsInstance(token_auth['token']['expires_at'], six.text_type)
103 self.assertIsInstance(token_auth['token']['issued_at'], six.text_type)
Brant Knudsonc5553292014-03-15 11:06:05 -0500104 self.assertEqual(['password'], token_auth['token']['methods'])
105 self.assertEqual(user['id'], token_auth['token']['user']['id'])
106 self.assertEqual(user['name'], token_auth['token']['user']['name'])
107 self.assertEqual('default',
108 token_auth['token']['user']['domain']['id'])
109 self.assertEqual('Default',
110 token_auth['token']['user']['domain']['name'])
111 self.assertNotIn('catalog', token_auth['token'])
112 self.assertNotIn('project', token_auth['token'])
113 self.assertNotIn('roles', token_auth['token'])
114
115 # Use the unscoped token to get a scoped token.
David Kranzd8ccb792014-12-29 11:32:05 -0500116 token_auth = self.token.auth(token=token_id,
Jamie Lennox97504612015-02-26 16:47:06 +1100117 project_name=project1_name,
118 project_domain_name='Default')
David Kranzd8ccb792014-12-29 11:32:05 -0500119 token1_id = token_auth.response['x-subject-token']
Brant Knudsonc5553292014-03-15 11:06:05 -0500120
121 self.assertEqual(orig_expires_at, token_auth['token']['expires_at'],
122 'Expiration time should match original token')
Jordan Pittiere8791202016-04-25 18:12:16 +0200123 self.assertIsInstance(token_auth['token']['issued_at'], six.text_type)
Brant Knudsonc5553292014-03-15 11:06:05 -0500124 self.assertEqual(set(['password', 'token']),
125 set(token_auth['token']['methods']))
126 self.assertEqual(orig_user, token_auth['token']['user'],
127 'User should match original token')
128 self.assertIsInstance(token_auth['token']['catalog'], list)
Brant Knudson5ee44a42014-03-16 10:55:21 -0500129 self.assertEqual(project1['id'],
Brant Knudsonc5553292014-03-15 11:06:05 -0500130 token_auth['token']['project']['id'])
Brant Knudson5ee44a42014-03-16 10:55:21 -0500131 self.assertEqual(project1['name'],
Brant Knudsonc5553292014-03-15 11:06:05 -0500132 token_auth['token']['project']['name'])
133 self.assertEqual('default',
134 token_auth['token']['project']['domain']['id'])
135 self.assertEqual('Default',
136 token_auth['token']['project']['domain']['name'])
137 self.assertEqual(1, len(token_auth['token']['roles']))
138 self.assertEqual(role['id'], token_auth['token']['roles'][0]['id'])
139 self.assertEqual(role['name'], token_auth['token']['roles'][0]['name'])
140
Brant Knudson5ee44a42014-03-16 10:55:21 -0500141 # Revoke the unscoped token.
David Kranze9d2f422014-07-02 13:57:41 -0400142 self.client.delete_token(token1_id)
Brant Knudson5ee44a42014-03-16 10:55:21 -0500143
144 # Now get another scoped token using the unscoped token.
David Kranzd8ccb792014-12-29 11:32:05 -0500145 token_auth = self.token.auth(token=token_id,
Jamie Lennox97504612015-02-26 16:47:06 +1100146 project_name=project2_name,
147 project_domain_name='Default')
Brant Knudson5ee44a42014-03-16 10:55:21 -0500148
149 self.assertEqual(project2['id'],
150 token_auth['token']['project']['id'])
151 self.assertEqual(project2['name'],
152 token_auth['token']['project']['name'])