blob: f5b20d52667509fd1fe6c941dc4471226079d4cd [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
Masayuki Igawabfa07602015-01-20 18:47:17 +090016from tempest_lib import exceptions as lib_exc
17
nayna-patelb35f7232013-06-28 07:08:44 +000018from tempest.api.identity import base
Fei Long Wangd39431f2015-05-14 11:30:48 +120019from tempest.common.utils import data_utils
Matthew Treinish5c660ab2014-05-18 21:14:36 -040020from tempest import test
nayna-patelb35f7232013-06-28 07:08:44 +000021
22
Masayuki Igawabe64ed32014-02-19 14:32:03 +090023class TokensV3TestJSON(base.BaseIdentityV3AdminTest):
nayna-patelb35f7232013-06-28 07:08:44 +000024
Chris Hoge7579c1a2015-02-26 14:12:15 -080025 @test.idempotent_id('0f9f5a5f-d5cd-4a86-8a5b-c5ded151f212')
nayna-patelb35f7232013-06-28 07:08:44 +000026 def test_tokens(self):
27 # Valid user's token is authenticated
28 # Create a User
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000029 u_name = data_utils.rand_name('user')
nayna-patelb35f7232013-06-28 07:08:44 +000030 u_desc = '%s-description' % u_name
31 u_email = '%s@testmail.tm' % u_name
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060032 u_password = data_utils.rand_password()
David Kranzd8ccb792014-12-29 11:32:05 -050033 user = self.client.create_user(
nayna-patelb35f7232013-06-28 07:08:44 +000034 u_name, description=u_desc, password=u_password,
John Warren56317e02015-08-12 20:48:32 +000035 email=u_email)['user']
Matthew Treinishdb2c5972014-01-31 22:18:59 +000036 self.addCleanup(self.client.delete_user, user['id'])
nayna-patelb35f7232013-06-28 07:08:44 +000037 # Perform Authentication
Jamie Lennox97504612015-02-26 16:47:06 +110038 resp = self.token.auth(user_id=user['id'],
39 password=u_password).response
nayna-patelb35f7232013-06-28 07:08:44 +000040 subject_token = resp['x-subject-token']
41 # Perform GET Token
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +000042 token_details = self.client.show_token(subject_token)['token']
nayna-patelb35f7232013-06-28 07:08:44 +000043 self.assertEqual(resp['x-subject-token'], subject_token)
44 self.assertEqual(token_details['user']['id'], user['id'])
45 self.assertEqual(token_details['user']['name'], u_name)
46 # Perform Delete Token
David Kranze9d2f422014-07-02 13:57:41 -040047 self.client.delete_token(subject_token)
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +000048 self.assertRaises(lib_exc.NotFound, self.client.show_token,
nayna-patelb35f7232013-06-28 07:08:44 +000049 subject_token)
50
Chris Hoge7579c1a2015-02-26 14:12:15 -080051 @test.idempotent_id('565fa210-1da1-4563-999b-f7b5b67cf112')
Brant Knudsonc5553292014-03-15 11:06:05 -050052 def test_rescope_token(self):
Brant Knudson5ee44a42014-03-16 10:55:21 -050053 """Rescope a token.
54
55 An unscoped token can be requested, that token can be used to request a
56 scoped token. The scoped token can be revoked, and the original token
57 used to get a token in a different project.
58
Brant Knudsonc5553292014-03-15 11:06:05 -050059 """
60
61 # Create a user.
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000062 user_name = data_utils.rand_name(name='user')
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060063 user_password = data_utils.rand_password()
John Warren56317e02015-08-12 20:48:32 +000064 user = self.client.create_user(user_name,
65 password=user_password)['user']
Brant Knudsonc5553292014-03-15 11:06:05 -050066 self.addCleanup(self.client.delete_user, user['id'])
67
Brant Knudson5ee44a42014-03-16 10:55:21 -050068 # Create a couple projects
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000069 project1_name = data_utils.rand_name(name='project')
John Warren56317e02015-08-12 20:48:32 +000070 project1 = self.client.create_project(project1_name)['project']
Brant Knudson5ee44a42014-03-16 10:55:21 -050071 self.addCleanup(self.client.delete_project, project1['id'])
72
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000073 project2_name = data_utils.rand_name(name='project')
John Warren56317e02015-08-12 20:48:32 +000074 project2 = self.client.create_project(project2_name)['project']
Brant Knudson5ee44a42014-03-16 10:55:21 -050075 self.addCleanup(self.client.delete_project, project2['id'])
Brant Knudsonc5553292014-03-15 11:06:05 -050076
77 # Create a role
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000078 role_name = data_utils.rand_name(name='role')
John Warren56317e02015-08-12 20:48:32 +000079 role = self.client.create_role(role_name)['role']
Brant Knudsonc5553292014-03-15 11:06:05 -050080 self.addCleanup(self.client.delete_role, role['id'])
81
Brant Knudson5ee44a42014-03-16 10:55:21 -050082 # Grant the user the role on both projects.
David Kranze9d2f422014-07-02 13:57:41 -040083 self.client.assign_user_role(project1['id'], user['id'],
84 role['id'])
Brant Knudson5ee44a42014-03-16 10:55:21 -050085
David Kranze9d2f422014-07-02 13:57:41 -040086 self.client.assign_user_role(project2['id'], user['id'],
87 role['id'])
Brant Knudsonc5553292014-03-15 11:06:05 -050088
89 # Get an unscoped token.
Jamie Lennox97504612015-02-26 16:47:06 +110090 token_auth = self.token.auth(user_id=user['id'],
David Kranzd8ccb792014-12-29 11:32:05 -050091 password=user_password)
Brant Knudsonc5553292014-03-15 11:06:05 -050092
David Kranzd8ccb792014-12-29 11:32:05 -050093 token_id = token_auth.response['x-subject-token']
Brant Knudsonc5553292014-03-15 11:06:05 -050094 orig_expires_at = token_auth['token']['expires_at']
Brant Knudsonc5553292014-03-15 11:06:05 -050095 orig_user = token_auth['token']['user']
96
97 self.assertIsInstance(token_auth['token']['expires_at'], unicode)
98 self.assertIsInstance(token_auth['token']['issued_at'], unicode)
99 self.assertEqual(['password'], token_auth['token']['methods'])
100 self.assertEqual(user['id'], token_auth['token']['user']['id'])
101 self.assertEqual(user['name'], token_auth['token']['user']['name'])
102 self.assertEqual('default',
103 token_auth['token']['user']['domain']['id'])
104 self.assertEqual('Default',
105 token_auth['token']['user']['domain']['name'])
106 self.assertNotIn('catalog', token_auth['token'])
107 self.assertNotIn('project', token_auth['token'])
108 self.assertNotIn('roles', token_auth['token'])
109
110 # Use the unscoped token to get a scoped token.
David Kranzd8ccb792014-12-29 11:32:05 -0500111 token_auth = self.token.auth(token=token_id,
Jamie Lennox97504612015-02-26 16:47:06 +1100112 project_name=project1_name,
113 project_domain_name='Default')
David Kranzd8ccb792014-12-29 11:32:05 -0500114 token1_id = token_auth.response['x-subject-token']
Brant Knudsonc5553292014-03-15 11:06:05 -0500115
116 self.assertEqual(orig_expires_at, token_auth['token']['expires_at'],
117 'Expiration time should match original token')
118 self.assertIsInstance(token_auth['token']['issued_at'], unicode)
Brant Knudsonc5553292014-03-15 11:06:05 -0500119 self.assertEqual(set(['password', 'token']),
120 set(token_auth['token']['methods']))
121 self.assertEqual(orig_user, token_auth['token']['user'],
122 'User should match original token')
123 self.assertIsInstance(token_auth['token']['catalog'], list)
Brant Knudson5ee44a42014-03-16 10:55:21 -0500124 self.assertEqual(project1['id'],
Brant Knudsonc5553292014-03-15 11:06:05 -0500125 token_auth['token']['project']['id'])
Brant Knudson5ee44a42014-03-16 10:55:21 -0500126 self.assertEqual(project1['name'],
Brant Knudsonc5553292014-03-15 11:06:05 -0500127 token_auth['token']['project']['name'])
128 self.assertEqual('default',
129 token_auth['token']['project']['domain']['id'])
130 self.assertEqual('Default',
131 token_auth['token']['project']['domain']['name'])
132 self.assertEqual(1, len(token_auth['token']['roles']))
133 self.assertEqual(role['id'], token_auth['token']['roles'][0]['id'])
134 self.assertEqual(role['name'], token_auth['token']['roles'][0]['name'])
135
Brant Knudson5ee44a42014-03-16 10:55:21 -0500136 # Revoke the unscoped token.
David Kranze9d2f422014-07-02 13:57:41 -0400137 self.client.delete_token(token1_id)
Brant Knudson5ee44a42014-03-16 10:55:21 -0500138
139 # Now get another scoped token using the unscoped token.
David Kranzd8ccb792014-12-29 11:32:05 -0500140 token_auth = self.token.auth(token=token_id,
Jamie Lennox97504612015-02-26 16:47:06 +1100141 project_name=project2_name,
142 project_domain_name='Default')
Brant Knudson5ee44a42014-03-16 10:55:21 -0500143
144 self.assertEqual(project2['id'],
145 token_auth['token']['project']['id'])
146 self.assertEqual(project2['name'],
147 token_auth['token']['project']['name'])