blob: e7b005c707028886d506c0a923dc0155144a0118 [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
nayna-patel755d8142013-07-16 06:45:34 +000022
Rodrigo Duarte Sousa592148c2017-01-31 15:26:16 -030023CONF = config.CONF
24
nayna-patel755d8142013-07-16 06:45:34 +000025
Matthew Treinishdb2c5972014-01-31 22:18:59 +000026class RolesV3TestJSON(base.BaseIdentityV3AdminTest):
nayna-patel755d8142013-07-16 06:45:34 +000027
28 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +010029 def resource_setup(cls):
30 super(RolesV3TestJSON, cls).resource_setup()
Castulo J. Martinez19b81b22016-07-15 08:58:25 -070031 cls.roles = list()
nayna-patelc905c182014-04-21 14:00:32 +000032 for _ in range(3):
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000033 role_name = data_utils.rand_name(name='role')
Arx Cruz24bcb882016-02-10 15:20:16 +010034 role = cls.roles_client.create_role(name=role_name)['role']
Castulo J. Martinez19b81b22016-07-15 08:58:25 -070035 cls.roles.append(role)
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000036 u_name = data_utils.rand_name('user')
nayna-patel755d8142013-07-16 06:45:34 +000037 u_desc = '%s description' % u_name
38 u_email = '%s@testmail.tm' % u_name
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060039 cls.u_password = data_utils.rand_password()
zhufl2b33c1a2017-04-24 17:33:48 +080040 cls.domain = cls.create_domain()
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060041 cls.project = cls.projects_client.create_project(
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000042 data_utils.rand_name('project'),
43 description=data_utils.rand_name('project-desc'),
John Warren56317e02015-08-12 20:48:32 +000044 domain_id=cls.domain['id'])['project']
Yaroslav Lobankov997a1452015-11-19 17:11:37 +030045 cls.group_body = cls.groups_client.create_group(
Yaroslav Lobankov45025c02015-11-19 17:55:15 +030046 name=data_utils.rand_name('Group'), project_id=cls.project['id'],
John Warren56317e02015-08-12 20:48:32 +000047 domain_id=cls.domain['id'])['group']
Daniel Mellado7aea5342016-02-09 09:10:12 +000048 cls.user_body = cls.users_client.create_user(
ghanshyam7f817db2016-08-01 18:37:13 +090049 name=u_name, description=u_desc, password=cls.u_password,
nayna-patel755d8142013-07-16 06:45:34 +000050 email=u_email, project_id=cls.project['id'],
John Warren56317e02015-08-12 20:48:32 +000051 domain_id=cls.domain['id'])['user']
Arx Cruz24bcb882016-02-10 15:20:16 +010052 cls.role = cls.roles_client.create_role(
piyush110786afaaf262015-12-11 18:54:05 +053053 name=data_utils.rand_name('Role'))['role']
nayna-patel755d8142013-07-16 06:45:34 +000054
55 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +010056 def resource_cleanup(cls):
Arx Cruz24bcb882016-02-10 15:20:16 +010057 cls.roles_client.delete_role(cls.role['id'])
Yaroslav Lobankov997a1452015-11-19 17:11:37 +030058 cls.groups_client.delete_group(cls.group_body['id'])
Daniel Mellado7aea5342016-02-09 09:10:12 +000059 cls.users_client.delete_user(cls.user_body['id'])
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060060 cls.projects_client.delete_project(cls.project['id'])
Castulo J. Martinez19b81b22016-07-15 08:58:25 -070061 for role in cls.roles:
62 cls.roles_client.delete_role(role['id'])
Andrea Frittoli7688e742014-09-15 12:38:22 +010063 super(RolesV3TestJSON, cls).resource_cleanup()
nayna-patel755d8142013-07-16 06:45:34 +000064
Jordan Pittier3b46d272017-04-12 16:17:28 +020065 @decorators.attr(type='smoke')
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080066 @decorators.idempotent_id('18afc6c0-46cf-4911-824e-9989cc056c3a')
Arx Cruz24bcb882016-02-10 15:20:16 +010067 def test_role_create_update_show_list(self):
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000068 r_name = data_utils.rand_name('Role')
Arx Cruz24bcb882016-02-10 15:20:16 +010069 role = self.roles_client.create_role(name=r_name)['role']
70 self.addCleanup(self.roles_client.delete_role, role['id'])
nayna-patel755d8142013-07-16 06:45:34 +000071 self.assertIn('name', role)
72 self.assertEqual(role['name'], r_name)
73
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000074 new_name = data_utils.rand_name('NewRole')
Arx Cruz24bcb882016-02-10 15:20:16 +010075 updated_role = self.roles_client.update_role(role['id'],
76 name=new_name)['role']
nayna-patel755d8142013-07-16 06:45:34 +000077 self.assertIn('name', updated_role)
78 self.assertIn('id', updated_role)
79 self.assertIn('links', updated_role)
80 self.assertNotEqual(r_name, updated_role['name'])
81
Arx Cruz24bcb882016-02-10 15:20:16 +010082 new_role = self.roles_client.show_role(role['id'])['role']
nayna-patel755d8142013-07-16 06:45:34 +000083 self.assertEqual(new_name, new_role['name'])
84 self.assertEqual(updated_role['id'], new_role['id'])
85
Arx Cruz24bcb882016-02-10 15:20:16 +010086 roles = self.roles_client.list_roles()['roles']
wanglianmina3e84ea2014-03-26 17:30:33 +080087 self.assertIn(role['id'], [r['id'] for r in roles])
88
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080089 @decorators.idempotent_id('c6b80012-fe4a-498b-9ce8-eb391c05169f')
nayna-patel755d8142013-07-16 06:45:34 +000090 def test_grant_list_revoke_role_to_user_on_project(self):
ghanshyam2e6fb562016-09-06 11:14:31 +090091 self.roles_client.create_user_role_on_project(self.project['id'],
Arx Cruz24bcb882016-02-10 15:20:16 +010092 self.user_body['id'],
93 self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +000094
Arx Cruz24bcb882016-02-10 15:20:16 +010095 roles = self.roles_client.list_user_roles_on_project(
John Warren56317e02015-08-12 20:48:32 +000096 self.project['id'], self.user_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +000097
zhufl628642b2017-08-01 14:39:34 +080098 self.assertEqual(1, len(roles))
99 self.assertEqual(self.role['id'], roles[0]['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000100
Arx Cruz24bcb882016-02-10 15:20:16 +0100101 self.roles_client.check_user_role_existence_on_project(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900102 self.project['id'], self.user_body['id'], self.role['id'])
103
Arx Cruz24bcb882016-02-10 15:20:16 +0100104 self.roles_client.delete_role_from_user_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000105 self.project['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000106
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800107 @decorators.idempotent_id('6c9a2940-3625-43a3-ac02-5dcec62ef3bd')
nayna-patel755d8142013-07-16 06:45:34 +0000108 def test_grant_list_revoke_role_to_user_on_domain(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900109 self.roles_client.create_user_role_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000110 self.domain['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000111
Arx Cruz24bcb882016-02-10 15:20:16 +0100112 roles = self.roles_client.list_user_roles_on_domain(
John Warren56317e02015-08-12 20:48:32 +0000113 self.domain['id'], self.user_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000114
zhufl628642b2017-08-01 14:39:34 +0800115 self.assertEqual(1, len(roles))
116 self.assertEqual(self.role['id'], roles[0]['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000117
Arx Cruz24bcb882016-02-10 15:20:16 +0100118 self.roles_client.check_user_role_existence_on_domain(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900119 self.domain['id'], self.user_body['id'], self.role['id'])
120
Arx Cruz24bcb882016-02-10 15:20:16 +0100121 self.roles_client.delete_role_from_user_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000122 self.domain['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000123
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800124 @decorators.idempotent_id('cbf11737-1904-4690-9613-97bcbb3df1c4')
nayna-patel755d8142013-07-16 06:45:34 +0000125 def test_grant_list_revoke_role_to_group_on_project(self):
wanglianmind599cc52014-03-17 17:03:56 +0800126 # Grant role to group on project
ghanshyam2e6fb562016-09-06 11:14:31 +0900127 self.roles_client.create_group_role_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000128 self.project['id'], self.group_body['id'], self.role['id'])
wanglianmind599cc52014-03-17 17:03:56 +0800129 # List group roles on project
Arx Cruz24bcb882016-02-10 15:20:16 +0100130 roles = self.roles_client.list_group_roles_on_project(
John Warren56317e02015-08-12 20:48:32 +0000131 self.project['id'], self.group_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000132
zhufl628642b2017-08-01 14:39:34 +0800133 self.assertEqual(1, len(roles))
134 self.assertEqual(self.role['id'], roles[0]['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000135
wanglianmind599cc52014-03-17 17:03:56 +0800136 # Add user to group, and insure user has role on project
Yaroslav Lobankov997a1452015-11-19 17:11:37 +0300137 self.groups_client.add_group_user(self.group_body['id'],
138 self.user_body['id'])
139 self.addCleanup(self.groups_client.delete_group_user,
wanglianmind599cc52014-03-17 17:03:56 +0800140 self.group_body['id'], self.user_body['id'])
Jamie Lennox97504612015-02-26 16:47:06 +1100141 body = self.token.auth(user_id=self.user_body['id'],
Jamie Lennoxe5a95d42015-02-11 07:19:57 +0000142 password=self.u_password,
Jamie Lennox97504612015-02-26 16:47:06 +1100143 user_domain_name=self.domain['name'],
144 project_name=self.project['name'],
145 project_domain_name=self.domain['name'])
wanglianmind599cc52014-03-17 17:03:56 +0800146 roles = body['token']['roles']
wanglianmind599cc52014-03-17 17:03:56 +0800147 self.assertEqual(len(roles), 1)
148 self.assertEqual(roles[0]['id'], self.role['id'])
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900149
Arx Cruz24bcb882016-02-10 15:20:16 +0100150 self.roles_client.check_role_from_group_on_project_existence(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900151 self.project['id'], self.group_body['id'], self.role['id'])
152
wanglianmind599cc52014-03-17 17:03:56 +0800153 # Revoke role to group on project
Arx Cruz24bcb882016-02-10 15:20:16 +0100154 self.roles_client.delete_role_from_group_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000155 self.project['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000156
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800157 @decorators.idempotent_id('4bf8a70b-e785-413a-ad53-9f91ce02faa7')
nayna-patel755d8142013-07-16 06:45:34 +0000158 def test_grant_list_revoke_role_to_group_on_domain(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900159 self.roles_client.create_group_role_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000160 self.domain['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000161
Arx Cruz24bcb882016-02-10 15:20:16 +0100162 roles = self.roles_client.list_group_roles_on_domain(
John Warren56317e02015-08-12 20:48:32 +0000163 self.domain['id'], self.group_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000164
zhufl628642b2017-08-01 14:39:34 +0800165 self.assertEqual(1, len(roles))
166 self.assertEqual(self.role['id'], roles[0]['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000167
Arx Cruz24bcb882016-02-10 15:20:16 +0100168 self.roles_client.check_role_from_group_on_domain_existence(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900169 self.domain['id'], self.group_body['id'], self.role['id'])
170
Arx Cruz24bcb882016-02-10 15:20:16 +0100171 self.roles_client.delete_role_from_group_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000172 self.domain['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000173
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800174 @decorators.idempotent_id('f5654bcc-08c4-4f71-88fe-05d64e06de94')
nayna-patelc905c182014-04-21 14:00:32 +0000175 def test_list_roles(self):
176 # Return a list of all roles
Arx Cruz24bcb882016-02-10 15:20:16 +0100177 body = self.roles_client.list_roles()['roles']
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700178 found = [role for role in body if role in self.roles]
179 self.assertEqual(len(found), len(self.roles))
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300180
181 def _create_implied_role(self, prior_role_id, implies_role_id,
182 ignore_not_found=False):
183 self.roles_client.create_role_inference_rule(
184 prior_role_id, implies_role_id)
185 if ignore_not_found:
186 self.addCleanup(
187 test_utils.call_and_ignore_notfound_exc,
188 self.roles_client.delete_role_inference_rule,
189 prior_role_id,
190 implies_role_id)
191 else:
192 self.addCleanup(
193 self.roles_client.delete_role_inference_rule,
194 prior_role_id,
195 implies_role_id)
196
197 @decorators.idempotent_id('c90c316c-d706-4728-bcba-eb1912081b69')
jeremy.zhangef5d4e92017-05-04 19:19:27 +0800198 def test_implied_roles_create_check_show_delete(self):
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300199 prior_role_id = self.roles[0]['id']
200 implies_role_id = self.roles[1]['id']
201
202 # Create an inference rule from prior_role to implies_role
203 self._create_implied_role(prior_role_id, implies_role_id,
204 ignore_not_found=True)
205
206 # Check if the inference rule exists
jeremy.zhangef5d4e92017-05-04 19:19:27 +0800207 self.roles_client.check_role_inference_rule(
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300208 prior_role_id, implies_role_id)
209
jeremy.zhangef5d4e92017-05-04 19:19:27 +0800210 # Show the inference rule and check its elements
211 resp_body = self.roles_client.show_role_inference_rule(
212 prior_role_id, implies_role_id)
213 self.assertIn('role_inference', resp_body)
214 role_inference = resp_body['role_inference']
215 for key1 in ['prior_role', 'implies']:
216 self.assertIn(key1, role_inference)
217 for key2 in ['id', 'links', 'name']:
218 self.assertIn(key2, role_inference[key1])
219
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300220 # Delete the inference rule
221 self.roles_client.delete_role_inference_rule(
222 prior_role_id, implies_role_id)
223 # Check if the inference rule no longer exists
224 self.assertRaises(
225 lib_exc.NotFound,
226 self.roles_client.show_role_inference_rule,
227 prior_role_id,
228 implies_role_id)
229
230 @decorators.idempotent_id('dc6f5959-b74d-4e30-a9e5-a8255494ff00')
231 def test_roles_hierarchy(self):
232 # Create inference rule from "roles[0]" to "role[1]"
233 self._create_implied_role(
234 self.roles[0]['id'], self.roles[1]['id'])
235
236 # Create inference rule from "roles[0]" to "role[2]"
237 self._create_implied_role(
238 self.roles[0]['id'], self.roles[2]['id'])
239
240 # Create inference rule from "roles[2]" to "role"
241 self._create_implied_role(
242 self.roles[2]['id'], self.role['id'])
243
244 # Listing inferences rules from "roles[2]" should only return "role"
245 rules = self.roles_client.list_role_inferences_rules(
246 self.roles[2]['id'])['role_inference']
247 self.assertEqual(1, len(rules['implies']))
248 self.assertEqual(self.role['id'], rules['implies'][0]['id'])
249
250 # Listing inferences rules from "roles[0]" should return "roles[1]" and
251 # "roles[2]" (only direct rules are listed)
252 rules = self.roles_client.list_role_inferences_rules(
253 self.roles[0]['id'])['role_inference']
254 implies_ids = [role['id'] for role in rules['implies']]
255 self.assertEqual(2, len(implies_ids))
256 self.assertIn(self.roles[1]['id'], implies_ids)
257 self.assertIn(self.roles[2]['id'], implies_ids)
258
259 @decorators.idempotent_id('c8828027-df48-4021-95df-b65b92c7429e')
260 def test_assignments_for_implied_roles_create_delete(self):
261 # Create a grant using "roles[0]"
262 self.roles_client.create_user_role_on_project(
263 self.project['id'], self.user_body['id'], self.roles[0]['id'])
264 self.addCleanup(
265 self.roles_client.delete_role_from_user_on_project,
266 self.project['id'], self.user_body['id'], self.roles[0]['id'])
267
268 # Create an inference rule from "roles[0]" to "roles[1]"
269 self._create_implied_role(self.roles[0]['id'], self.roles[1]['id'],
270 ignore_not_found=True)
271
272 # In the effective list of role assignments, both prior role and
273 # implied role should be present. This means that a user can
274 # authenticate using both roles (both roles will be present
275 # in the token).
276 params = {'scope.project.id': self.project['id'],
277 'user.id': self.user_body['id']}
278 role_assignments = self.role_assignments.list_role_assignments(
279 effective=True, **params)['role_assignments']
280 self.assertEqual(2, len(role_assignments))
281
282 roles_ids = [assignment['role']['id']
283 for assignment in role_assignments]
284 self.assertIn(self.roles[0]['id'], roles_ids)
285 self.assertIn(self.roles[1]['id'], roles_ids)
286
287 # After deleting the implied role, only the assignment with "roles[0]"
288 # should be present.
289 self.roles_client.delete_role_inference_rule(
290 self.roles[0]['id'], self.roles[1]['id'])
291
292 role_assignments = self.role_assignments.list_role_assignments(
293 effective=True, **params)['role_assignments']
294 self.assertEqual(1, len(role_assignments))
295
296 roles_ids = [assignment['role']['id']
297 for assignment in role_assignments]
298 self.assertIn(self.roles[0]['id'], roles_ids)
Rodrigo Duarte34a65122017-01-27 11:28:26 -0300299
300 @decorators.idempotent_id('d92a41d2-5501-497a-84bb-6e294330e8f8')
301 def test_domain_roles_create_delete(self):
302 domain_role = self.roles_client.create_role(
303 name=data_utils.rand_name('domain_role'),
304 domain_id=self.domain['id'])['role']
305 self.addCleanup(
306 test_utils.call_and_ignore_notfound_exc,
307 self.roles_client.delete_role,
308 domain_role['id'])
309
310 domain_roles = self.roles_client.list_roles(
311 domain_id=self.domain['id'])['roles']
312 self.assertEqual(1, len(domain_roles))
313 self.assertIn(domain_role, domain_roles)
314
315 self.roles_client.delete_role(domain_role['id'])
316 domain_roles = self.roles_client.list_roles(
317 domain_id=self.domain['id'])['roles']
318 self.assertEmpty(domain_roles)
319
320 @decorators.idempotent_id('eb1e1c24-1bc4-4d47-9748-e127a1852c82')
321 def test_implied_domain_roles(self):
322 # Create two roles in the same domain
323 domain_role1 = self.setup_test_role(domain_id=self.domain['id'])
324 domain_role2 = self.setup_test_role(domain_id=self.domain['id'])
325
326 # Check if we can create an inference rule from roles in the same
327 # domain
328 self._create_implied_role(domain_role1['id'], domain_role2['id'])
329
330 # Create another role in a different domain
331 domain2 = self.setup_test_domain()
332 domain_role3 = self.setup_test_role(domain_id=domain2['id'])
333
334 # Check if we can create cross domain implied roles
335 self._create_implied_role(domain_role1['id'], domain_role3['id'])
336
337 # Finally, we also should be able to create an implied from a
338 # domain role to a global one
339 self._create_implied_role(domain_role1['id'], self.role['id'])
340
Rodrigo Duarte Sousa592148c2017-01-31 15:26:16 -0300341 if CONF.identity_feature_enabled.forbid_global_implied_dsr:
342 # The contrary is not true: we can't create an inference rule
343 # from a global role to a domain role
344 self.assertRaises(
345 lib_exc.Forbidden,
346 self.roles_client.create_role_inference_rule,
347 self.role['id'],
348 domain_role1['id'])
349
Rodrigo Duarte34a65122017-01-27 11:28:26 -0300350 @decorators.idempotent_id('3859df7e-5b78-4e4d-b10e-214c8953842a')
351 def test_assignments_for_domain_roles(self):
352 domain_role = self.setup_test_role(domain_id=self.domain['id'])
353
354 # Create a grant using "domain_role"
355 self.roles_client.create_user_role_on_project(
356 self.project['id'], self.user_body['id'], domain_role['id'])
357 self.addCleanup(
358 self.roles_client.delete_role_from_user_on_project,
359 self.project['id'], self.user_body['id'], domain_role['id'])
360
361 # NOTE(rodrigods): Regular roles would appear in the effective
362 # list of role assignments (meaning the role would be returned in
363 # a token) as a result from the grant above. This is not the case
364 # for domain roles, they should not appear in the effective role
365 # assignments list.
366 params = {'scope.project.id': self.project['id'],
367 'user.id': self.user_body['id']}
368 role_assignments = self.role_assignments.list_role_assignments(
369 effective=True, **params)['role_assignments']
370 self.assertEmpty(role_assignments)
Felipe Monteirofe96c262017-03-31 05:25:26 +0100371
372 @decorators.idempotent_id('3748c316-c18f-4b08-997b-c60567bc6235')
373 def test_list_all_implied_roles(self):
374 # Create inference rule from "roles[0]" to "roles[1]"
375 self._create_implied_role(
376 self.roles[0]['id'], self.roles[1]['id'])
377
378 # Create inference rule from "roles[0]" to "roles[2]"
379 self._create_implied_role(
380 self.roles[0]['id'], self.roles[2]['id'])
381
382 # Create inference rule from "roles[2]" to "role"
383 self._create_implied_role(
384 self.roles[2]['id'], self.role['id'])
385
386 rules = self.roles_client.list_all_role_inference_rules()[
387 'role_inferences']
388 # Sort the rules by the number of inferences, since there should be 1
389 # inference between "roles[2]" and "role" and 2 inferences for
390 # "roles[0]": between "roles[1]" and "roles[2]".
391 sorted_rules = sorted(rules, key=lambda r: len(r['implies']))
392
393 # Check that 2 sets of rules are returned.
394 self.assertEqual(2, len(sorted_rules))
395 # Check that only 1 inference rule exists between "roles[2]" and "role"
396 self.assertEqual(1, len(sorted_rules[0]['implies']))
397 # Check that 2 inference rules exist for "roles[0]": one between
398 # "roles[1]" and one between "roles[2]".
399 self.assertEqual(2, len(sorted_rules[1]['implies']))
400
401 # Check that "roles[2]" is the "prior_role" and that "role" is the
402 # "implies" role.
403 self.assertEqual(self.roles[2]['id'],
404 sorted_rules[0]['prior_role']['id'])
405 self.assertEqual(self.role['id'],
406 sorted_rules[0]['implies'][0]['id'])
407
408 # Check that "roles[0]" is the "prior_role" and that "roles[1]" and
409 # "roles[2]" are the "implies" roles.
410 self.assertEqual(self.roles[0]['id'],
411 sorted_rules[1]['prior_role']['id'])
412
413 implies_ids = [r['id'] for r in sorted_rules[1]['implies']]
414 self.assertIn(self.roles[1]['id'], implies_ids)
415 self.assertIn(self.roles[2]['id'], implies_ids)