blob: 48bde2b4f40450dd90f7b9bc2f56744323c5cf9a [file] [log] [blame]
Maho Koshiya962e7d72015-11-27 20:31:17 +09001# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
Trevor McCaslandc3f07b42019-01-17 08:53:24 -060012import testtools
Maho Koshiya962e7d72015-11-27 20:31:17 +090013
14from tempest.api.identity import base
Andrea Frittolicd368412017-08-14 21:37:56 +010015from tempest.common import utils
Trevor McCaslandc3f07b42019-01-17 08:53:24 -060016from tempest import config
Ken'ichi Ohmichi7bd25752017-03-10 10:45:39 -080017from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080018from tempest.lib import decorators
Maho Koshiya962e7d72015-11-27 20:31:17 +090019
Trevor McCaslandc3f07b42019-01-17 08:53:24 -060020CONF = config.CONF
21
Maho Koshiya962e7d72015-11-27 20:31:17 +090022
zhuflf6bae312017-08-14 13:37:53 +080023class InheritsV3TestJSON(base.BaseIdentityV3AdminTest):
zhufl23925882020-04-29 08:42:40 +080024 """Test keystone inherits"""
25
Trevor McCaslandbd898412019-01-17 10:04:40 -060026 # NOTE: force_tenant_isolation is true in the base class by default but
27 # overridden to false here to allow test execution for clouds using the
28 # pre-provisioned credentials provider.
29 force_tenant_isolation = False
Maho Koshiya962e7d72015-11-27 20:31:17 +090030
31 @classmethod
32 def skip_checks(cls):
zhuflf6bae312017-08-14 13:37:53 +080033 super(InheritsV3TestJSON, cls).skip_checks()
Andrea Frittolicd368412017-08-14 21:37:56 +010034 if not utils.is_extension_enabled('OS-INHERIT', 'identity'):
Maho Koshiya962e7d72015-11-27 20:31:17 +090035 raise cls.skipException("Inherits aren't enabled")
36
37 @classmethod
38 def resource_setup(cls):
zhuflf6bae312017-08-14 13:37:53 +080039 super(InheritsV3TestJSON, cls).resource_setup()
Martin Kopec213d0a42023-11-30 10:28:14 +010040 prefix = CONF.resource_name_prefix
41 u_name = data_utils.rand_name(name='user-', prefix=prefix)
Maho Koshiya962e7d72015-11-27 20:31:17 +090042 u_desc = '%s description' % u_name
43 u_email = '%s@testmail.tm' % u_name
zhufl00e47772019-02-22 11:18:46 +080044 u_password = data_utils.rand_password()
zhufl2b33c1a2017-04-24 17:33:48 +080045 cls.domain = cls.create_domain()
Maho Koshiya962e7d72015-11-27 20:31:17 +090046 cls.project = cls.projects_client.create_project(
Martin Kopec213d0a42023-11-30 10:28:14 +010047 data_utils.rand_name(name='project-', prefix=prefix),
48 description=data_utils.rand_name('project-desc-', prefix=prefix),
Maho Koshiya962e7d72015-11-27 20:31:17 +090049 domain_id=cls.domain['id'])['project']
zhufl0ba73df2017-12-12 16:37:01 +080050 cls.addClassResourceCleanup(cls.projects_client.delete_project,
51 cls.project['id'])
Maho Koshiya962e7d72015-11-27 20:31:17 +090052 cls.group = cls.groups_client.create_group(
Martin Kopec213d0a42023-11-30 10:28:14 +010053 name=data_utils.rand_name(name='group-', prefix=prefix),
54 project_id=cls.project['id'], domain_id=cls.domain['id'])['group']
zhufl0ba73df2017-12-12 16:37:01 +080055 cls.addClassResourceCleanup(cls.groups_client.delete_group,
56 cls.group['id'])
Trevor McCaslandc3f07b42019-01-17 08:53:24 -060057 if not CONF.identity_feature_enabled.immutable_user_source:
58 cls.user = cls.users_client.create_user(
59 name=u_name,
60 description=u_desc,
61 password=u_password,
62 email=u_email,
63 project_id=cls.project['id'],
64 domain_id=cls.domain['id']
65 )['user']
66 cls.addClassResourceCleanup(cls.users_client.delete_user,
67 cls.user['id'])
Maho Koshiya962e7d72015-11-27 20:31:17 +090068
69 def _list_assertions(self, body, fetched_role_ids, role_id):
70 self.assertEqual(len(body), 1)
71 self.assertIn(role_id, fetched_role_ids)
72
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080073 @decorators.idempotent_id('4e6f0366-97c8-423c-b2be-41eae6ac91c8')
Trevor McCaslandc3f07b42019-01-17 08:53:24 -060074 @testtools.skipIf(CONF.identity_feature_enabled.immutable_user_source,
75 'Skipped because environment has an immutable user '
76 'source and solely provides read-only access to users.')
Maho Koshiya962e7d72015-11-27 20:31:17 +090077 def test_inherit_assign_list_check_revoke_roles_on_domains_user(self):
zhufl23925882020-04-29 08:42:40 +080078 """Test assign/list/check/revoke inherited role on domain user"""
Maho Koshiya962e7d72015-11-27 20:31:17 +090079 # Create role
zhufl66b616a2017-04-11 15:00:32 +080080 src_role = self.setup_test_role()
Maho Koshiya962e7d72015-11-27 20:31:17 +090081 # Assign role on domains user
ghanshyamad55eb82016-09-06 13:58:29 +090082 self.inherited_roles_client.create_inherited_role_on_domains_user(
Maho Koshiya962e7d72015-11-27 20:31:17 +090083 self.domain['id'], self.user['id'], src_role['id'])
84 # list role on domains user
ghanshyamad55eb82016-09-06 13:58:29 +090085 roles = self.inherited_roles_client.\
Maho Koshiya962e7d72015-11-27 20:31:17 +090086 list_inherited_project_role_for_user_on_domain(
87 self.domain['id'], self.user['id'])['roles']
88
89 fetched_role_ids = [i['id'] for i in roles]
90 self._list_assertions(roles, fetched_role_ids,
91 src_role['id'])
92
93 # Check role on domains user
ghanshyamad55eb82016-09-06 13:58:29 +090094 (self.inherited_roles_client.
95 check_user_inherited_project_role_on_domain(
96 self.domain['id'], self.user['id'], src_role['id']))
Maho Koshiya962e7d72015-11-27 20:31:17 +090097 # Revoke role from domains user.
ghanshyamad55eb82016-09-06 13:58:29 +090098 self.inherited_roles_client.delete_inherited_role_from_user_on_domain(
Maho Koshiya962e7d72015-11-27 20:31:17 +090099 self.domain['id'], self.user['id'], src_role['id'])
100
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800101 @decorators.idempotent_id('c7a8dda2-be50-4fb4-9a9c-e830771078b1')
Maho Koshiya962e7d72015-11-27 20:31:17 +0900102 def test_inherit_assign_list_check_revoke_roles_on_domains_group(self):
zhufl23925882020-04-29 08:42:40 +0800103 """Test assign/list/check/revoke inherited role on domain group"""
Maho Koshiya962e7d72015-11-27 20:31:17 +0900104 # Create role
zhufl66b616a2017-04-11 15:00:32 +0800105 src_role = self.setup_test_role()
Maho Koshiya962e7d72015-11-27 20:31:17 +0900106 # Assign role on domains group
ghanshyamad55eb82016-09-06 13:58:29 +0900107 self.inherited_roles_client.create_inherited_role_on_domains_group(
Maho Koshiya962e7d72015-11-27 20:31:17 +0900108 self.domain['id'], self.group['id'], src_role['id'])
109 # List role on domains group
ghanshyamad55eb82016-09-06 13:58:29 +0900110 roles = self.inherited_roles_client.\
Maho Koshiya962e7d72015-11-27 20:31:17 +0900111 list_inherited_project_role_for_group_on_domain(
112 self.domain['id'], self.group['id'])['roles']
113
114 fetched_role_ids = [i['id'] for i in roles]
115 self._list_assertions(roles, fetched_role_ids,
116 src_role['id'])
117
118 # Check role on domains group
ghanshyamad55eb82016-09-06 13:58:29 +0900119 (self.inherited_roles_client.
120 check_group_inherited_project_role_on_domain(
121 self.domain['id'], self.group['id'], src_role['id']))
Maho Koshiya962e7d72015-11-27 20:31:17 +0900122 # Revoke role from domains group
ghanshyamad55eb82016-09-06 13:58:29 +0900123 self.inherited_roles_client.delete_inherited_role_from_group_on_domain(
Maho Koshiya962e7d72015-11-27 20:31:17 +0900124 self.domain['id'], self.group['id'], src_role['id'])
125
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800126 @decorators.idempotent_id('18b70e45-7687-4b72-8277-b8f1a47d7591')
Trevor McCaslandc3f07b42019-01-17 08:53:24 -0600127 @testtools.skipIf(CONF.identity_feature_enabled.immutable_user_source,
128 'Skipped because environment has an immutable user '
129 'source and solely provides read-only access to users.')
Maho Koshiya962e7d72015-11-27 20:31:17 +0900130 def test_inherit_assign_check_revoke_roles_on_projects_user(self):
zhufl23925882020-04-29 08:42:40 +0800131 """Test assign/list/check/revoke inherited role on project user"""
Maho Koshiya962e7d72015-11-27 20:31:17 +0900132 # Create role
zhufl66b616a2017-04-11 15:00:32 +0800133 src_role = self.setup_test_role()
Maho Koshiya962e7d72015-11-27 20:31:17 +0900134 # Assign role on projects user
ghanshyamad55eb82016-09-06 13:58:29 +0900135 self.inherited_roles_client.create_inherited_role_on_projects_user(
Maho Koshiya962e7d72015-11-27 20:31:17 +0900136 self.project['id'], self.user['id'], src_role['id'])
137 # Check role on projects user
ghanshyamad55eb82016-09-06 13:58:29 +0900138 (self.inherited_roles_client.
139 check_user_has_flag_on_inherited_to_project(
140 self.project['id'], self.user['id'], src_role['id']))
Maho Koshiya962e7d72015-11-27 20:31:17 +0900141 # Revoke role from projects user
ghanshyamad55eb82016-09-06 13:58:29 +0900142 self.inherited_roles_client.delete_inherited_role_from_user_on_project(
Maho Koshiya962e7d72015-11-27 20:31:17 +0900143 self.project['id'], self.user['id'], src_role['id'])
144
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800145 @decorators.idempotent_id('26021436-d5a4-4256-943c-ded01e0d4b45')
Maho Koshiya962e7d72015-11-27 20:31:17 +0900146 def test_inherit_assign_check_revoke_roles_on_projects_group(self):
zhufl23925882020-04-29 08:42:40 +0800147 """Test assign/list/check/revoke inherited role on project group"""
Maho Koshiya962e7d72015-11-27 20:31:17 +0900148 # Create role
zhufl66b616a2017-04-11 15:00:32 +0800149 src_role = self.setup_test_role()
Maho Koshiya962e7d72015-11-27 20:31:17 +0900150 # Assign role on projects group
ghanshyamad55eb82016-09-06 13:58:29 +0900151 self.inherited_roles_client.create_inherited_role_on_projects_group(
Maho Koshiya962e7d72015-11-27 20:31:17 +0900152 self.project['id'], self.group['id'], src_role['id'])
153 # Check role on projects group
ghanshyamad55eb82016-09-06 13:58:29 +0900154 (self.inherited_roles_client.
155 check_group_has_flag_on_inherited_to_project(
156 self.project['id'], self.group['id'], src_role['id']))
Maho Koshiya962e7d72015-11-27 20:31:17 +0900157 # Revoke role from projects group
ghanshyamad55eb82016-09-06 13:58:29 +0900158 (self.inherited_roles_client.
159 delete_inherited_role_from_group_on_project(
160 self.project['id'], self.group['id'], src_role['id']))
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300161
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800162 @decorators.idempotent_id('3acf666e-5354-42ac-8e17-8b68893bcd36')
Trevor McCaslandc3f07b42019-01-17 08:53:24 -0600163 @testtools.skipIf(CONF.identity_feature_enabled.immutable_user_source,
164 'Skipped because environment has an immutable user '
165 'source and solely provides read-only access to users.')
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300166 def test_inherit_assign_list_revoke_user_roles_on_domain(self):
zhufl23925882020-04-29 08:42:40 +0800167 """Test assign/list/check/revoke inherited role on domain"""
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300168 # Create role
zhufl66b616a2017-04-11 15:00:32 +0800169 src_role = self.setup_test_role()
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300170
171 # Create a project hierarchy
zhuflf2f47052017-04-20 15:08:02 +0800172 leaf_project = self.setup_test_project(domain_id=self.domain['id'],
173 parent_id=self.project['id'])
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300174
175 # Assign role on domain
176 self.inherited_roles_client.create_inherited_role_on_domains_user(
177 self.domain['id'], self.user['id'], src_role['id'])
178
179 # List "effective" role assignments from user on the parent project
Rodrigo Duarte Sousabd128d12016-10-04 10:07:34 -0300180 params = {'scope.project.id': self.project['id'],
181 'user.id': self.user['id']}
182 assignments = self.role_assignments.list_role_assignments(
183 effective=True, **params)['role_assignments']
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300184 self.assertNotEmpty(assignments)
185
186 # List "effective" role assignments from user on the leaf project
Rodrigo Duarte Sousabd128d12016-10-04 10:07:34 -0300187 params['scope.project.id'] = leaf_project['id']
188 assignments = self.role_assignments.list_role_assignments(
189 effective=True, **params)['role_assignments']
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300190 self.assertNotEmpty(assignments)
191
192 # Revoke role from domain
193 self.inherited_roles_client.delete_inherited_role_from_user_on_domain(
194 self.domain['id'], self.user['id'], src_role['id'])
195
196 # List "effective" role assignments from user on the parent project
197 # should return an empty list
Rodrigo Duarte Sousabd128d12016-10-04 10:07:34 -0300198 params['scope.project.id'] = self.project['id']
199 assignments = self.role_assignments.list_role_assignments(
200 effective=True, **params)['role_assignments']
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300201 self.assertEmpty(assignments)
202
203 # List "effective" role assignments from user on the leaf project
204 # should return an empty list
Rodrigo Duarte Sousabd128d12016-10-04 10:07:34 -0300205 params['scope.project.id'] = leaf_project['id']
206 assignments = self.role_assignments.list_role_assignments(
207 effective=True, **params)['role_assignments']
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300208 self.assertEmpty(assignments)
209
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800210 @decorators.idempotent_id('9f02ccd9-9b57-46b4-8f77-dd5a736f3a06')
Trevor McCaslandc3f07b42019-01-17 08:53:24 -0600211 @testtools.skipIf(CONF.identity_feature_enabled.immutable_user_source,
212 'Skipped because environment has an immutable user '
213 'source and solely provides read-only access to users.')
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300214 def test_inherit_assign_list_revoke_user_roles_on_project_tree(self):
zhufl23925882020-04-29 08:42:40 +0800215 """Test assign/list/check/revoke inherited role on project tree"""
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300216 # Create role
zhufl66b616a2017-04-11 15:00:32 +0800217 src_role = self.setup_test_role()
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300218
219 # Create a project hierarchy
zhuflf2f47052017-04-20 15:08:02 +0800220 leaf_project = self.setup_test_project(domain_id=self.domain['id'],
221 parent_id=self.project['id'])
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300222
223 # Assign role on parent project
224 self.inherited_roles_client.create_inherited_role_on_projects_user(
225 self.project['id'], self.user['id'], src_role['id'])
226
227 # List "effective" role assignments from user on the leaf project
Rodrigo Duarte Sousabd128d12016-10-04 10:07:34 -0300228 params = {'scope.project.id': leaf_project['id'],
229 'user.id': self.user['id']}
230 assignments = self.role_assignments.list_role_assignments(
231 effective=True, **params)['role_assignments']
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300232 self.assertNotEmpty(assignments)
233
234 # Revoke role from parent project
235 self.inherited_roles_client.delete_inherited_role_from_user_on_project(
236 self.project['id'], self.user['id'], src_role['id'])
237
238 # List "effective" role assignments from user on the leaf project
239 # should return an empty list
Rodrigo Duarte Sousabd128d12016-10-04 10:07:34 -0300240 assignments = self.role_assignments.list_role_assignments(
241 effective=True, **params)['role_assignments']
Rodrigo Duarte12f8d4a2016-07-08 11:53:53 -0300242 self.assertEmpty(assignments)