blob: e07d525525771e50a3ba0f52f0a7302ac740a7dc [file] [log] [blame]
nayna-patel755d8142013-07-16 06:45:34 +00001# 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
16from tempest.api.identity import base
Rodrigo Duarte Sousa592148c2017-01-31 15:26:16 -030017from tempest import config
Ken'ichi Ohmichi7bd25752017-03-10 10:45:39 -080018from tempest.lib.common.utils import data_utils
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -030019from tempest.lib.common.utils import test_utils
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080020from tempest.lib import decorators
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -030021from tempest.lib import exceptions as lib_exc
Masayuki Igawadf154682014-03-19 18:32:00 +090022from tempest import test
nayna-patel755d8142013-07-16 06:45:34 +000023
Rodrigo Duarte Sousa592148c2017-01-31 15:26:16 -030024CONF = config.CONF
25
nayna-patel755d8142013-07-16 06:45:34 +000026
Matthew Treinishdb2c5972014-01-31 22:18:59 +000027class RolesV3TestJSON(base.BaseIdentityV3AdminTest):
nayna-patel755d8142013-07-16 06:45:34 +000028
29 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +010030 def resource_setup(cls):
31 super(RolesV3TestJSON, cls).resource_setup()
Castulo J. Martinez19b81b22016-07-15 08:58:25 -070032 cls.roles = list()
nayna-patelc905c182014-04-21 14:00:32 +000033 for _ in range(3):
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000034 role_name = data_utils.rand_name(name='role')
Arx Cruz24bcb882016-02-10 15:20:16 +010035 role = cls.roles_client.create_role(name=role_name)['role']
Castulo J. Martinez19b81b22016-07-15 08:58:25 -070036 cls.roles.append(role)
nayna-patel755d8142013-07-16 06:45:34 +000037 cls.fetched_role_ids = list()
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000038 u_name = data_utils.rand_name('user')
nayna-patel755d8142013-07-16 06:45:34 +000039 u_desc = '%s description' % u_name
40 u_email = '%s@testmail.tm' % u_name
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060041 cls.u_password = data_utils.rand_password()
Daniel Mellado91a26b62016-02-11 11:13:04 +000042 cls.domain = cls.domains_client.create_domain(
ghanshyam8af17d62016-08-01 16:19:42 +090043 name=data_utils.rand_name('domain'),
John Warren56317e02015-08-12 20:48:32 +000044 description=data_utils.rand_name('domain-desc'))['domain']
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060045 cls.project = cls.projects_client.create_project(
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000046 data_utils.rand_name('project'),
47 description=data_utils.rand_name('project-desc'),
John Warren56317e02015-08-12 20:48:32 +000048 domain_id=cls.domain['id'])['project']
Yaroslav Lobankov997a1452015-11-19 17:11:37 +030049 cls.group_body = cls.groups_client.create_group(
Yaroslav Lobankov45025c02015-11-19 17:55:15 +030050 name=data_utils.rand_name('Group'), project_id=cls.project['id'],
John Warren56317e02015-08-12 20:48:32 +000051 domain_id=cls.domain['id'])['group']
Daniel Mellado7aea5342016-02-09 09:10:12 +000052 cls.user_body = cls.users_client.create_user(
ghanshyam7f817db2016-08-01 18:37:13 +090053 name=u_name, description=u_desc, password=cls.u_password,
nayna-patel755d8142013-07-16 06:45:34 +000054 email=u_email, project_id=cls.project['id'],
John Warren56317e02015-08-12 20:48:32 +000055 domain_id=cls.domain['id'])['user']
Arx Cruz24bcb882016-02-10 15:20:16 +010056 cls.role = cls.roles_client.create_role(
piyush110786afaaf262015-12-11 18:54:05 +053057 name=data_utils.rand_name('Role'))['role']
nayna-patel755d8142013-07-16 06:45:34 +000058
59 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +010060 def resource_cleanup(cls):
Arx Cruz24bcb882016-02-10 15:20:16 +010061 cls.roles_client.delete_role(cls.role['id'])
Yaroslav Lobankov997a1452015-11-19 17:11:37 +030062 cls.groups_client.delete_group(cls.group_body['id'])
Daniel Mellado7aea5342016-02-09 09:10:12 +000063 cls.users_client.delete_user(cls.user_body['id'])
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060064 cls.projects_client.delete_project(cls.project['id'])
Chang Bo Guof099f802013-09-13 19:01:46 -070065 # NOTE(harika-vakadi): It is necessary to disable the domain
nayna-patel755d8142013-07-16 06:45:34 +000066 # before deleting,or else it would result in unauthorized error
Daniel Mellado91a26b62016-02-11 11:13:04 +000067 cls.domains_client.update_domain(cls.domain['id'], enabled=False)
68 cls.domains_client.delete_domain(cls.domain['id'])
Castulo J. Martinez19b81b22016-07-15 08:58:25 -070069 for role in cls.roles:
70 cls.roles_client.delete_role(role['id'])
Andrea Frittoli7688e742014-09-15 12:38:22 +010071 super(RolesV3TestJSON, cls).resource_cleanup()
nayna-patel755d8142013-07-16 06:45:34 +000072
David Kranze9d2f422014-07-02 13:57:41 -040073 def _list_assertions(self, body, fetched_role_ids, role_id):
nayna-patel755d8142013-07-16 06:45:34 +000074 self.assertEqual(len(body), 1)
75 self.assertIn(role_id, fetched_role_ids)
76
Masayuki Igawadf154682014-03-19 18:32:00 +090077 @test.attr(type='smoke')
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080078 @decorators.idempotent_id('18afc6c0-46cf-4911-824e-9989cc056c3a')
Arx Cruz24bcb882016-02-10 15:20:16 +010079 def test_role_create_update_show_list(self):
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000080 r_name = data_utils.rand_name('Role')
Arx Cruz24bcb882016-02-10 15:20:16 +010081 role = self.roles_client.create_role(name=r_name)['role']
82 self.addCleanup(self.roles_client.delete_role, role['id'])
nayna-patel755d8142013-07-16 06:45:34 +000083 self.assertIn('name', role)
84 self.assertEqual(role['name'], r_name)
85
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000086 new_name = data_utils.rand_name('NewRole')
Arx Cruz24bcb882016-02-10 15:20:16 +010087 updated_role = self.roles_client.update_role(role['id'],
88 name=new_name)['role']
nayna-patel755d8142013-07-16 06:45:34 +000089 self.assertIn('name', updated_role)
90 self.assertIn('id', updated_role)
91 self.assertIn('links', updated_role)
92 self.assertNotEqual(r_name, updated_role['name'])
93
Arx Cruz24bcb882016-02-10 15:20:16 +010094 new_role = self.roles_client.show_role(role['id'])['role']
nayna-patel755d8142013-07-16 06:45:34 +000095 self.assertEqual(new_name, new_role['name'])
96 self.assertEqual(updated_role['id'], new_role['id'])
97
Arx Cruz24bcb882016-02-10 15:20:16 +010098 roles = self.roles_client.list_roles()['roles']
wanglianmina3e84ea2014-03-26 17:30:33 +080099 self.assertIn(role['id'], [r['id'] for r in roles])
100
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800101 @decorators.idempotent_id('c6b80012-fe4a-498b-9ce8-eb391c05169f')
nayna-patel755d8142013-07-16 06:45:34 +0000102 def test_grant_list_revoke_role_to_user_on_project(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900103 self.roles_client.create_user_role_on_project(self.project['id'],
Arx Cruz24bcb882016-02-10 15:20:16 +0100104 self.user_body['id'],
105 self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000106
Arx Cruz24bcb882016-02-10 15:20:16 +0100107 roles = self.roles_client.list_user_roles_on_project(
John Warren56317e02015-08-12 20:48:32 +0000108 self.project['id'], self.user_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000109
110 for i in roles:
111 self.fetched_role_ids.append(i['id'])
112
David Kranze9d2f422014-07-02 13:57:41 -0400113 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000114 self.role['id'])
115
Arx Cruz24bcb882016-02-10 15:20:16 +0100116 self.roles_client.check_user_role_existence_on_project(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900117 self.project['id'], self.user_body['id'], self.role['id'])
118
Arx Cruz24bcb882016-02-10 15:20:16 +0100119 self.roles_client.delete_role_from_user_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000120 self.project['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000121
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800122 @decorators.idempotent_id('6c9a2940-3625-43a3-ac02-5dcec62ef3bd')
nayna-patel755d8142013-07-16 06:45:34 +0000123 def test_grant_list_revoke_role_to_user_on_domain(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900124 self.roles_client.create_user_role_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000125 self.domain['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000126
Arx Cruz24bcb882016-02-10 15:20:16 +0100127 roles = self.roles_client.list_user_roles_on_domain(
John Warren56317e02015-08-12 20:48:32 +0000128 self.domain['id'], self.user_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000129
130 for i in roles:
131 self.fetched_role_ids.append(i['id'])
132
David Kranze9d2f422014-07-02 13:57:41 -0400133 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000134 self.role['id'])
135
Arx Cruz24bcb882016-02-10 15:20:16 +0100136 self.roles_client.check_user_role_existence_on_domain(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900137 self.domain['id'], self.user_body['id'], self.role['id'])
138
Arx Cruz24bcb882016-02-10 15:20:16 +0100139 self.roles_client.delete_role_from_user_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000140 self.domain['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000141
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800142 @decorators.idempotent_id('cbf11737-1904-4690-9613-97bcbb3df1c4')
nayna-patel755d8142013-07-16 06:45:34 +0000143 def test_grant_list_revoke_role_to_group_on_project(self):
wanglianmind599cc52014-03-17 17:03:56 +0800144 # Grant role to group on project
ghanshyam2e6fb562016-09-06 11:14:31 +0900145 self.roles_client.create_group_role_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000146 self.project['id'], self.group_body['id'], self.role['id'])
wanglianmind599cc52014-03-17 17:03:56 +0800147 # List group roles on project
Arx Cruz24bcb882016-02-10 15:20:16 +0100148 roles = self.roles_client.list_group_roles_on_project(
John Warren56317e02015-08-12 20:48:32 +0000149 self.project['id'], self.group_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000150
151 for i in roles:
152 self.fetched_role_ids.append(i['id'])
153
David Kranze9d2f422014-07-02 13:57:41 -0400154 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000155 self.role['id'])
wanglianmind599cc52014-03-17 17:03:56 +0800156 # Add user to group, and insure user has role on project
Yaroslav Lobankov997a1452015-11-19 17:11:37 +0300157 self.groups_client.add_group_user(self.group_body['id'],
158 self.user_body['id'])
159 self.addCleanup(self.groups_client.delete_group_user,
wanglianmind599cc52014-03-17 17:03:56 +0800160 self.group_body['id'], self.user_body['id'])
Jamie Lennox97504612015-02-26 16:47:06 +1100161 body = self.token.auth(user_id=self.user_body['id'],
Jamie Lennoxe5a95d42015-02-11 07:19:57 +0000162 password=self.u_password,
Jamie Lennox97504612015-02-26 16:47:06 +1100163 user_domain_name=self.domain['name'],
164 project_name=self.project['name'],
165 project_domain_name=self.domain['name'])
wanglianmind599cc52014-03-17 17:03:56 +0800166 roles = body['token']['roles']
wanglianmind599cc52014-03-17 17:03:56 +0800167 self.assertEqual(len(roles), 1)
168 self.assertEqual(roles[0]['id'], self.role['id'])
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900169
Arx Cruz24bcb882016-02-10 15:20:16 +0100170 self.roles_client.check_role_from_group_on_project_existence(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900171 self.project['id'], self.group_body['id'], self.role['id'])
172
wanglianmind599cc52014-03-17 17:03:56 +0800173 # Revoke role to group on project
Arx Cruz24bcb882016-02-10 15:20:16 +0100174 self.roles_client.delete_role_from_group_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000175 self.project['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000176
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800177 @decorators.idempotent_id('4bf8a70b-e785-413a-ad53-9f91ce02faa7')
nayna-patel755d8142013-07-16 06:45:34 +0000178 def test_grant_list_revoke_role_to_group_on_domain(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900179 self.roles_client.create_group_role_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000180 self.domain['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000181
Arx Cruz24bcb882016-02-10 15:20:16 +0100182 roles = self.roles_client.list_group_roles_on_domain(
John Warren56317e02015-08-12 20:48:32 +0000183 self.domain['id'], self.group_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000184
185 for i in roles:
186 self.fetched_role_ids.append(i['id'])
187
David Kranze9d2f422014-07-02 13:57:41 -0400188 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000189 self.role['id'])
190
Arx Cruz24bcb882016-02-10 15:20:16 +0100191 self.roles_client.check_role_from_group_on_domain_existence(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900192 self.domain['id'], self.group_body['id'], self.role['id'])
193
Arx Cruz24bcb882016-02-10 15:20:16 +0100194 self.roles_client.delete_role_from_group_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000195 self.domain['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000196
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800197 @decorators.idempotent_id('f5654bcc-08c4-4f71-88fe-05d64e06de94')
nayna-patelc905c182014-04-21 14:00:32 +0000198 def test_list_roles(self):
199 # Return a list of all roles
Arx Cruz24bcb882016-02-10 15:20:16 +0100200 body = self.roles_client.list_roles()['roles']
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700201 found = [role for role in body if role in self.roles]
202 self.assertEqual(len(found), len(self.roles))
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300203
204 def _create_implied_role(self, prior_role_id, implies_role_id,
205 ignore_not_found=False):
206 self.roles_client.create_role_inference_rule(
207 prior_role_id, implies_role_id)
208 if ignore_not_found:
209 self.addCleanup(
210 test_utils.call_and_ignore_notfound_exc,
211 self.roles_client.delete_role_inference_rule,
212 prior_role_id,
213 implies_role_id)
214 else:
215 self.addCleanup(
216 self.roles_client.delete_role_inference_rule,
217 prior_role_id,
218 implies_role_id)
219
220 @decorators.idempotent_id('c90c316c-d706-4728-bcba-eb1912081b69')
221 def test_implied_roles_create_delete(self):
222 prior_role_id = self.roles[0]['id']
223 implies_role_id = self.roles[1]['id']
224
225 # Create an inference rule from prior_role to implies_role
226 self._create_implied_role(prior_role_id, implies_role_id,
227 ignore_not_found=True)
228
229 # Check if the inference rule exists
230 self.roles_client.show_role_inference_rule(
231 prior_role_id, implies_role_id)
232
233 # Delete the inference rule
234 self.roles_client.delete_role_inference_rule(
235 prior_role_id, implies_role_id)
236 # Check if the inference rule no longer exists
237 self.assertRaises(
238 lib_exc.NotFound,
239 self.roles_client.show_role_inference_rule,
240 prior_role_id,
241 implies_role_id)
242
243 @decorators.idempotent_id('dc6f5959-b74d-4e30-a9e5-a8255494ff00')
244 def test_roles_hierarchy(self):
245 # Create inference rule from "roles[0]" to "role[1]"
246 self._create_implied_role(
247 self.roles[0]['id'], self.roles[1]['id'])
248
249 # Create inference rule from "roles[0]" to "role[2]"
250 self._create_implied_role(
251 self.roles[0]['id'], self.roles[2]['id'])
252
253 # Create inference rule from "roles[2]" to "role"
254 self._create_implied_role(
255 self.roles[2]['id'], self.role['id'])
256
257 # Listing inferences rules from "roles[2]" should only return "role"
258 rules = self.roles_client.list_role_inferences_rules(
259 self.roles[2]['id'])['role_inference']
260 self.assertEqual(1, len(rules['implies']))
261 self.assertEqual(self.role['id'], rules['implies'][0]['id'])
262
263 # Listing inferences rules from "roles[0]" should return "roles[1]" and
264 # "roles[2]" (only direct rules are listed)
265 rules = self.roles_client.list_role_inferences_rules(
266 self.roles[0]['id'])['role_inference']
267 implies_ids = [role['id'] for role in rules['implies']]
268 self.assertEqual(2, len(implies_ids))
269 self.assertIn(self.roles[1]['id'], implies_ids)
270 self.assertIn(self.roles[2]['id'], implies_ids)
271
272 @decorators.idempotent_id('c8828027-df48-4021-95df-b65b92c7429e')
273 def test_assignments_for_implied_roles_create_delete(self):
274 # Create a grant using "roles[0]"
275 self.roles_client.create_user_role_on_project(
276 self.project['id'], self.user_body['id'], self.roles[0]['id'])
277 self.addCleanup(
278 self.roles_client.delete_role_from_user_on_project,
279 self.project['id'], self.user_body['id'], self.roles[0]['id'])
280
281 # Create an inference rule from "roles[0]" to "roles[1]"
282 self._create_implied_role(self.roles[0]['id'], self.roles[1]['id'],
283 ignore_not_found=True)
284
285 # In the effective list of role assignments, both prior role and
286 # implied role should be present. This means that a user can
287 # authenticate using both roles (both roles will be present
288 # in the token).
289 params = {'scope.project.id': self.project['id'],
290 'user.id': self.user_body['id']}
291 role_assignments = self.role_assignments.list_role_assignments(
292 effective=True, **params)['role_assignments']
293 self.assertEqual(2, len(role_assignments))
294
295 roles_ids = [assignment['role']['id']
296 for assignment in role_assignments]
297 self.assertIn(self.roles[0]['id'], roles_ids)
298 self.assertIn(self.roles[1]['id'], roles_ids)
299
300 # After deleting the implied role, only the assignment with "roles[0]"
301 # should be present.
302 self.roles_client.delete_role_inference_rule(
303 self.roles[0]['id'], self.roles[1]['id'])
304
305 role_assignments = self.role_assignments.list_role_assignments(
306 effective=True, **params)['role_assignments']
307 self.assertEqual(1, len(role_assignments))
308
309 roles_ids = [assignment['role']['id']
310 for assignment in role_assignments]
311 self.assertIn(self.roles[0]['id'], roles_ids)
Rodrigo Duarte34a65122017-01-27 11:28:26 -0300312
313 @decorators.idempotent_id('d92a41d2-5501-497a-84bb-6e294330e8f8')
314 def test_domain_roles_create_delete(self):
315 domain_role = self.roles_client.create_role(
316 name=data_utils.rand_name('domain_role'),
317 domain_id=self.domain['id'])['role']
318 self.addCleanup(
319 test_utils.call_and_ignore_notfound_exc,
320 self.roles_client.delete_role,
321 domain_role['id'])
322
323 domain_roles = self.roles_client.list_roles(
324 domain_id=self.domain['id'])['roles']
325 self.assertEqual(1, len(domain_roles))
326 self.assertIn(domain_role, domain_roles)
327
328 self.roles_client.delete_role(domain_role['id'])
329 domain_roles = self.roles_client.list_roles(
330 domain_id=self.domain['id'])['roles']
331 self.assertEmpty(domain_roles)
332
333 @decorators.idempotent_id('eb1e1c24-1bc4-4d47-9748-e127a1852c82')
334 def test_implied_domain_roles(self):
335 # Create two roles in the same domain
336 domain_role1 = self.setup_test_role(domain_id=self.domain['id'])
337 domain_role2 = self.setup_test_role(domain_id=self.domain['id'])
338
339 # Check if we can create an inference rule from roles in the same
340 # domain
341 self._create_implied_role(domain_role1['id'], domain_role2['id'])
342
343 # Create another role in a different domain
344 domain2 = self.setup_test_domain()
345 domain_role3 = self.setup_test_role(domain_id=domain2['id'])
346
347 # Check if we can create cross domain implied roles
348 self._create_implied_role(domain_role1['id'], domain_role3['id'])
349
350 # Finally, we also should be able to create an implied from a
351 # domain role to a global one
352 self._create_implied_role(domain_role1['id'], self.role['id'])
353
Rodrigo Duarte Sousa592148c2017-01-31 15:26:16 -0300354 if CONF.identity_feature_enabled.forbid_global_implied_dsr:
355 # The contrary is not true: we can't create an inference rule
356 # from a global role to a domain role
357 self.assertRaises(
358 lib_exc.Forbidden,
359 self.roles_client.create_role_inference_rule,
360 self.role['id'],
361 domain_role1['id'])
362
Rodrigo Duarte34a65122017-01-27 11:28:26 -0300363 @decorators.idempotent_id('3859df7e-5b78-4e4d-b10e-214c8953842a')
364 def test_assignments_for_domain_roles(self):
365 domain_role = self.setup_test_role(domain_id=self.domain['id'])
366
367 # Create a grant using "domain_role"
368 self.roles_client.create_user_role_on_project(
369 self.project['id'], self.user_body['id'], domain_role['id'])
370 self.addCleanup(
371 self.roles_client.delete_role_from_user_on_project,
372 self.project['id'], self.user_body['id'], domain_role['id'])
373
374 # NOTE(rodrigods): Regular roles would appear in the effective
375 # list of role assignments (meaning the role would be returned in
376 # a token) as a result from the grant above. This is not the case
377 # for domain roles, they should not appear in the effective role
378 # assignments list.
379 params = {'scope.project.id': self.project['id'],
380 'user.id': self.user_body['id']}
381 role_assignments = self.role_assignments.list_role_assignments(
382 effective=True, **params)['role_assignments']
383 self.assertEmpty(role_assignments)