blob: 6d42b2afa87fcbf40624988a0eadbacd972a30ad [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)
nayna-patel755d8142013-07-16 06:45:34 +000036 cls.fetched_role_ids = list()
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000037 u_name = data_utils.rand_name('user')
nayna-patel755d8142013-07-16 06:45:34 +000038 u_desc = '%s description' % u_name
39 u_email = '%s@testmail.tm' % u_name
Zack Feldsteind8c5f7a2015-12-14 10:44:07 -060040 cls.u_password = data_utils.rand_password()
zhufl2b33c1a2017-04-24 17:33:48 +080041 cls.domain = cls.create_domain()
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060042 cls.project = cls.projects_client.create_project(
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000043 data_utils.rand_name('project'),
44 description=data_utils.rand_name('project-desc'),
John Warren56317e02015-08-12 20:48:32 +000045 domain_id=cls.domain['id'])['project']
Yaroslav Lobankov997a1452015-11-19 17:11:37 +030046 cls.group_body = cls.groups_client.create_group(
Yaroslav Lobankov45025c02015-11-19 17:55:15 +030047 name=data_utils.rand_name('Group'), project_id=cls.project['id'],
John Warren56317e02015-08-12 20:48:32 +000048 domain_id=cls.domain['id'])['group']
Daniel Mellado7aea5342016-02-09 09:10:12 +000049 cls.user_body = cls.users_client.create_user(
ghanshyam7f817db2016-08-01 18:37:13 +090050 name=u_name, description=u_desc, password=cls.u_password,
nayna-patel755d8142013-07-16 06:45:34 +000051 email=u_email, project_id=cls.project['id'],
John Warren56317e02015-08-12 20:48:32 +000052 domain_id=cls.domain['id'])['user']
Arx Cruz24bcb882016-02-10 15:20:16 +010053 cls.role = cls.roles_client.create_role(
piyush110786afaaf262015-12-11 18:54:05 +053054 name=data_utils.rand_name('Role'))['role']
nayna-patel755d8142013-07-16 06:45:34 +000055
56 @classmethod
Andrea Frittoli7688e742014-09-15 12:38:22 +010057 def resource_cleanup(cls):
Arx Cruz24bcb882016-02-10 15:20:16 +010058 cls.roles_client.delete_role(cls.role['id'])
Yaroslav Lobankov997a1452015-11-19 17:11:37 +030059 cls.groups_client.delete_group(cls.group_body['id'])
Daniel Mellado7aea5342016-02-09 09:10:12 +000060 cls.users_client.delete_user(cls.user_body['id'])
Yaroslav Lobankov47a93ab2016-02-07 16:32:49 -060061 cls.projects_client.delete_project(cls.project['id'])
Chang Bo Guof099f802013-09-13 19:01:46 -070062 # NOTE(harika-vakadi): It is necessary to disable the domain
nayna-patel755d8142013-07-16 06:45:34 +000063 # before deleting,or else it would result in unauthorized error
Daniel Mellado91a26b62016-02-11 11:13:04 +000064 cls.domains_client.update_domain(cls.domain['id'], enabled=False)
65 cls.domains_client.delete_domain(cls.domain['id'])
Castulo J. Martinez19b81b22016-07-15 08:58:25 -070066 for role in cls.roles:
67 cls.roles_client.delete_role(role['id'])
Andrea Frittoli7688e742014-09-15 12:38:22 +010068 super(RolesV3TestJSON, cls).resource_cleanup()
nayna-patel755d8142013-07-16 06:45:34 +000069
David Kranze9d2f422014-07-02 13:57:41 -040070 def _list_assertions(self, body, fetched_role_ids, role_id):
nayna-patel755d8142013-07-16 06:45:34 +000071 self.assertEqual(len(body), 1)
72 self.assertIn(role_id, fetched_role_ids)
73
Jordan Pittier3b46d272017-04-12 16:17:28 +020074 @decorators.attr(type='smoke')
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080075 @decorators.idempotent_id('18afc6c0-46cf-4911-824e-9989cc056c3a')
Arx Cruz24bcb882016-02-10 15:20:16 +010076 def test_role_create_update_show_list(self):
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000077 r_name = data_utils.rand_name('Role')
Arx Cruz24bcb882016-02-10 15:20:16 +010078 role = self.roles_client.create_role(name=r_name)['role']
79 self.addCleanup(self.roles_client.delete_role, role['id'])
nayna-patel755d8142013-07-16 06:45:34 +000080 self.assertIn('name', role)
81 self.assertEqual(role['name'], r_name)
82
Ken'ichi Ohmichi96508472015-03-23 01:43:42 +000083 new_name = data_utils.rand_name('NewRole')
Arx Cruz24bcb882016-02-10 15:20:16 +010084 updated_role = self.roles_client.update_role(role['id'],
85 name=new_name)['role']
nayna-patel755d8142013-07-16 06:45:34 +000086 self.assertIn('name', updated_role)
87 self.assertIn('id', updated_role)
88 self.assertIn('links', updated_role)
89 self.assertNotEqual(r_name, updated_role['name'])
90
Arx Cruz24bcb882016-02-10 15:20:16 +010091 new_role = self.roles_client.show_role(role['id'])['role']
nayna-patel755d8142013-07-16 06:45:34 +000092 self.assertEqual(new_name, new_role['name'])
93 self.assertEqual(updated_role['id'], new_role['id'])
94
Arx Cruz24bcb882016-02-10 15:20:16 +010095 roles = self.roles_client.list_roles()['roles']
wanglianmina3e84ea2014-03-26 17:30:33 +080096 self.assertIn(role['id'], [r['id'] for r in roles])
97
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -080098 @decorators.idempotent_id('c6b80012-fe4a-498b-9ce8-eb391c05169f')
nayna-patel755d8142013-07-16 06:45:34 +000099 def test_grant_list_revoke_role_to_user_on_project(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900100 self.roles_client.create_user_role_on_project(self.project['id'],
Arx Cruz24bcb882016-02-10 15:20:16 +0100101 self.user_body['id'],
102 self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000103
Arx Cruz24bcb882016-02-10 15:20:16 +0100104 roles = self.roles_client.list_user_roles_on_project(
John Warren56317e02015-08-12 20:48:32 +0000105 self.project['id'], self.user_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000106
107 for i in roles:
108 self.fetched_role_ids.append(i['id'])
109
David Kranze9d2f422014-07-02 13:57:41 -0400110 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000111 self.role['id'])
112
Arx Cruz24bcb882016-02-10 15:20:16 +0100113 self.roles_client.check_user_role_existence_on_project(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900114 self.project['id'], self.user_body['id'], self.role['id'])
115
Arx Cruz24bcb882016-02-10 15:20:16 +0100116 self.roles_client.delete_role_from_user_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000117 self.project['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000118
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800119 @decorators.idempotent_id('6c9a2940-3625-43a3-ac02-5dcec62ef3bd')
nayna-patel755d8142013-07-16 06:45:34 +0000120 def test_grant_list_revoke_role_to_user_on_domain(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900121 self.roles_client.create_user_role_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
Arx Cruz24bcb882016-02-10 15:20:16 +0100124 roles = self.roles_client.list_user_roles_on_domain(
John Warren56317e02015-08-12 20:48:32 +0000125 self.domain['id'], self.user_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000126
127 for i in roles:
128 self.fetched_role_ids.append(i['id'])
129
David Kranze9d2f422014-07-02 13:57:41 -0400130 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000131 self.role['id'])
132
Arx Cruz24bcb882016-02-10 15:20:16 +0100133 self.roles_client.check_user_role_existence_on_domain(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900134 self.domain['id'], self.user_body['id'], self.role['id'])
135
Arx Cruz24bcb882016-02-10 15:20:16 +0100136 self.roles_client.delete_role_from_user_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000137 self.domain['id'], self.user_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000138
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800139 @decorators.idempotent_id('cbf11737-1904-4690-9613-97bcbb3df1c4')
nayna-patel755d8142013-07-16 06:45:34 +0000140 def test_grant_list_revoke_role_to_group_on_project(self):
wanglianmind599cc52014-03-17 17:03:56 +0800141 # Grant role to group on project
ghanshyam2e6fb562016-09-06 11:14:31 +0900142 self.roles_client.create_group_role_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000143 self.project['id'], self.group_body['id'], self.role['id'])
wanglianmind599cc52014-03-17 17:03:56 +0800144 # List group roles on project
Arx Cruz24bcb882016-02-10 15:20:16 +0100145 roles = self.roles_client.list_group_roles_on_project(
John Warren56317e02015-08-12 20:48:32 +0000146 self.project['id'], self.group_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000147
148 for i in roles:
149 self.fetched_role_ids.append(i['id'])
150
David Kranze9d2f422014-07-02 13:57:41 -0400151 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000152 self.role['id'])
wanglianmind599cc52014-03-17 17:03:56 +0800153 # Add user to group, and insure user has role on project
Yaroslav Lobankov997a1452015-11-19 17:11:37 +0300154 self.groups_client.add_group_user(self.group_body['id'],
155 self.user_body['id'])
156 self.addCleanup(self.groups_client.delete_group_user,
wanglianmind599cc52014-03-17 17:03:56 +0800157 self.group_body['id'], self.user_body['id'])
Jamie Lennox97504612015-02-26 16:47:06 +1100158 body = self.token.auth(user_id=self.user_body['id'],
Jamie Lennoxe5a95d42015-02-11 07:19:57 +0000159 password=self.u_password,
Jamie Lennox97504612015-02-26 16:47:06 +1100160 user_domain_name=self.domain['name'],
161 project_name=self.project['name'],
162 project_domain_name=self.domain['name'])
wanglianmind599cc52014-03-17 17:03:56 +0800163 roles = body['token']['roles']
wanglianmind599cc52014-03-17 17:03:56 +0800164 self.assertEqual(len(roles), 1)
165 self.assertEqual(roles[0]['id'], self.role['id'])
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900166
Arx Cruz24bcb882016-02-10 15:20:16 +0100167 self.roles_client.check_role_from_group_on_project_existence(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900168 self.project['id'], self.group_body['id'], self.role['id'])
169
wanglianmind599cc52014-03-17 17:03:56 +0800170 # Revoke role to group on project
Arx Cruz24bcb882016-02-10 15:20:16 +0100171 self.roles_client.delete_role_from_group_on_project(
nayna-patel755d8142013-07-16 06:45:34 +0000172 self.project['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('4bf8a70b-e785-413a-ad53-9f91ce02faa7')
nayna-patel755d8142013-07-16 06:45:34 +0000175 def test_grant_list_revoke_role_to_group_on_domain(self):
ghanshyam2e6fb562016-09-06 11:14:31 +0900176 self.roles_client.create_group_role_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000177 self.domain['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000178
Arx Cruz24bcb882016-02-10 15:20:16 +0100179 roles = self.roles_client.list_group_roles_on_domain(
John Warren56317e02015-08-12 20:48:32 +0000180 self.domain['id'], self.group_body['id'])['roles']
nayna-patel755d8142013-07-16 06:45:34 +0000181
182 for i in roles:
183 self.fetched_role_ids.append(i['id'])
184
David Kranze9d2f422014-07-02 13:57:41 -0400185 self._list_assertions(roles, self.fetched_role_ids,
nayna-patel755d8142013-07-16 06:45:34 +0000186 self.role['id'])
187
Arx Cruz24bcb882016-02-10 15:20:16 +0100188 self.roles_client.check_role_from_group_on_domain_existence(
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900189 self.domain['id'], self.group_body['id'], self.role['id'])
190
Arx Cruz24bcb882016-02-10 15:20:16 +0100191 self.roles_client.delete_role_from_group_on_domain(
nayna-patel755d8142013-07-16 06:45:34 +0000192 self.domain['id'], self.group_body['id'], self.role['id'])
nayna-patel755d8142013-07-16 06:45:34 +0000193
Ken'ichi Ohmichieeabdd22017-01-27 17:46:00 -0800194 @decorators.idempotent_id('f5654bcc-08c4-4f71-88fe-05d64e06de94')
nayna-patelc905c182014-04-21 14:00:32 +0000195 def test_list_roles(self):
196 # Return a list of all roles
Arx Cruz24bcb882016-02-10 15:20:16 +0100197 body = self.roles_client.list_roles()['roles']
Castulo J. Martinez19b81b22016-07-15 08:58:25 -0700198 found = [role for role in body if role in self.roles]
199 self.assertEqual(len(found), len(self.roles))
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300200
201 def _create_implied_role(self, prior_role_id, implies_role_id,
202 ignore_not_found=False):
203 self.roles_client.create_role_inference_rule(
204 prior_role_id, implies_role_id)
205 if ignore_not_found:
206 self.addCleanup(
207 test_utils.call_and_ignore_notfound_exc,
208 self.roles_client.delete_role_inference_rule,
209 prior_role_id,
210 implies_role_id)
211 else:
212 self.addCleanup(
213 self.roles_client.delete_role_inference_rule,
214 prior_role_id,
215 implies_role_id)
216
217 @decorators.idempotent_id('c90c316c-d706-4728-bcba-eb1912081b69')
jeremy.zhangef5d4e92017-05-04 19:19:27 +0800218 def test_implied_roles_create_check_show_delete(self):
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300219 prior_role_id = self.roles[0]['id']
220 implies_role_id = self.roles[1]['id']
221
222 # Create an inference rule from prior_role to implies_role
223 self._create_implied_role(prior_role_id, implies_role_id,
224 ignore_not_found=True)
225
226 # Check if the inference rule exists
jeremy.zhangef5d4e92017-05-04 19:19:27 +0800227 self.roles_client.check_role_inference_rule(
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300228 prior_role_id, implies_role_id)
229
jeremy.zhangef5d4e92017-05-04 19:19:27 +0800230 # Show the inference rule and check its elements
231 resp_body = self.roles_client.show_role_inference_rule(
232 prior_role_id, implies_role_id)
233 self.assertIn('role_inference', resp_body)
234 role_inference = resp_body['role_inference']
235 for key1 in ['prior_role', 'implies']:
236 self.assertIn(key1, role_inference)
237 for key2 in ['id', 'links', 'name']:
238 self.assertIn(key2, role_inference[key1])
239
Rodrigo Duarteca3b39d2017-01-26 18:10:31 -0300240 # Delete the inference rule
241 self.roles_client.delete_role_inference_rule(
242 prior_role_id, implies_role_id)
243 # Check if the inference rule no longer exists
244 self.assertRaises(
245 lib_exc.NotFound,
246 self.roles_client.show_role_inference_rule,
247 prior_role_id,
248 implies_role_id)
249
250 @decorators.idempotent_id('dc6f5959-b74d-4e30-a9e5-a8255494ff00')
251 def test_roles_hierarchy(self):
252 # Create inference rule from "roles[0]" to "role[1]"
253 self._create_implied_role(
254 self.roles[0]['id'], self.roles[1]['id'])
255
256 # Create inference rule from "roles[0]" to "role[2]"
257 self._create_implied_role(
258 self.roles[0]['id'], self.roles[2]['id'])
259
260 # Create inference rule from "roles[2]" to "role"
261 self._create_implied_role(
262 self.roles[2]['id'], self.role['id'])
263
264 # Listing inferences rules from "roles[2]" should only return "role"
265 rules = self.roles_client.list_role_inferences_rules(
266 self.roles[2]['id'])['role_inference']
267 self.assertEqual(1, len(rules['implies']))
268 self.assertEqual(self.role['id'], rules['implies'][0]['id'])
269
270 # Listing inferences rules from "roles[0]" should return "roles[1]" and
271 # "roles[2]" (only direct rules are listed)
272 rules = self.roles_client.list_role_inferences_rules(
273 self.roles[0]['id'])['role_inference']
274 implies_ids = [role['id'] for role in rules['implies']]
275 self.assertEqual(2, len(implies_ids))
276 self.assertIn(self.roles[1]['id'], implies_ids)
277 self.assertIn(self.roles[2]['id'], implies_ids)
278
279 @decorators.idempotent_id('c8828027-df48-4021-95df-b65b92c7429e')
280 def test_assignments_for_implied_roles_create_delete(self):
281 # Create a grant using "roles[0]"
282 self.roles_client.create_user_role_on_project(
283 self.project['id'], self.user_body['id'], self.roles[0]['id'])
284 self.addCleanup(
285 self.roles_client.delete_role_from_user_on_project,
286 self.project['id'], self.user_body['id'], self.roles[0]['id'])
287
288 # Create an inference rule from "roles[0]" to "roles[1]"
289 self._create_implied_role(self.roles[0]['id'], self.roles[1]['id'],
290 ignore_not_found=True)
291
292 # In the effective list of role assignments, both prior role and
293 # implied role should be present. This means that a user can
294 # authenticate using both roles (both roles will be present
295 # in the token).
296 params = {'scope.project.id': self.project['id'],
297 'user.id': self.user_body['id']}
298 role_assignments = self.role_assignments.list_role_assignments(
299 effective=True, **params)['role_assignments']
300 self.assertEqual(2, len(role_assignments))
301
302 roles_ids = [assignment['role']['id']
303 for assignment in role_assignments]
304 self.assertIn(self.roles[0]['id'], roles_ids)
305 self.assertIn(self.roles[1]['id'], roles_ids)
306
307 # After deleting the implied role, only the assignment with "roles[0]"
308 # should be present.
309 self.roles_client.delete_role_inference_rule(
310 self.roles[0]['id'], self.roles[1]['id'])
311
312 role_assignments = self.role_assignments.list_role_assignments(
313 effective=True, **params)['role_assignments']
314 self.assertEqual(1, len(role_assignments))
315
316 roles_ids = [assignment['role']['id']
317 for assignment in role_assignments]
318 self.assertIn(self.roles[0]['id'], roles_ids)
Rodrigo Duarte34a65122017-01-27 11:28:26 -0300319
320 @decorators.idempotent_id('d92a41d2-5501-497a-84bb-6e294330e8f8')
321 def test_domain_roles_create_delete(self):
322 domain_role = self.roles_client.create_role(
323 name=data_utils.rand_name('domain_role'),
324 domain_id=self.domain['id'])['role']
325 self.addCleanup(
326 test_utils.call_and_ignore_notfound_exc,
327 self.roles_client.delete_role,
328 domain_role['id'])
329
330 domain_roles = self.roles_client.list_roles(
331 domain_id=self.domain['id'])['roles']
332 self.assertEqual(1, len(domain_roles))
333 self.assertIn(domain_role, domain_roles)
334
335 self.roles_client.delete_role(domain_role['id'])
336 domain_roles = self.roles_client.list_roles(
337 domain_id=self.domain['id'])['roles']
338 self.assertEmpty(domain_roles)
339
340 @decorators.idempotent_id('eb1e1c24-1bc4-4d47-9748-e127a1852c82')
341 def test_implied_domain_roles(self):
342 # Create two roles in the same domain
343 domain_role1 = self.setup_test_role(domain_id=self.domain['id'])
344 domain_role2 = self.setup_test_role(domain_id=self.domain['id'])
345
346 # Check if we can create an inference rule from roles in the same
347 # domain
348 self._create_implied_role(domain_role1['id'], domain_role2['id'])
349
350 # Create another role in a different domain
351 domain2 = self.setup_test_domain()
352 domain_role3 = self.setup_test_role(domain_id=domain2['id'])
353
354 # Check if we can create cross domain implied roles
355 self._create_implied_role(domain_role1['id'], domain_role3['id'])
356
357 # Finally, we also should be able to create an implied from a
358 # domain role to a global one
359 self._create_implied_role(domain_role1['id'], self.role['id'])
360
Rodrigo Duarte Sousa592148c2017-01-31 15:26:16 -0300361 if CONF.identity_feature_enabled.forbid_global_implied_dsr:
362 # The contrary is not true: we can't create an inference rule
363 # from a global role to a domain role
364 self.assertRaises(
365 lib_exc.Forbidden,
366 self.roles_client.create_role_inference_rule,
367 self.role['id'],
368 domain_role1['id'])
369
Rodrigo Duarte34a65122017-01-27 11:28:26 -0300370 @decorators.idempotent_id('3859df7e-5b78-4e4d-b10e-214c8953842a')
371 def test_assignments_for_domain_roles(self):
372 domain_role = self.setup_test_role(domain_id=self.domain['id'])
373
374 # Create a grant using "domain_role"
375 self.roles_client.create_user_role_on_project(
376 self.project['id'], self.user_body['id'], domain_role['id'])
377 self.addCleanup(
378 self.roles_client.delete_role_from_user_on_project,
379 self.project['id'], self.user_body['id'], domain_role['id'])
380
381 # NOTE(rodrigods): Regular roles would appear in the effective
382 # list of role assignments (meaning the role would be returned in
383 # a token) as a result from the grant above. This is not the case
384 # for domain roles, they should not appear in the effective role
385 # assignments list.
386 params = {'scope.project.id': self.project['id'],
387 'user.id': self.user_body['id']}
388 role_assignments = self.role_assignments.list_role_assignments(
389 effective=True, **params)['role_assignments']
390 self.assertEmpty(role_assignments)
Felipe Monteirofe96c262017-03-31 05:25:26 +0100391
392 @decorators.idempotent_id('3748c316-c18f-4b08-997b-c60567bc6235')
393 def test_list_all_implied_roles(self):
394 # Create inference rule from "roles[0]" to "roles[1]"
395 self._create_implied_role(
396 self.roles[0]['id'], self.roles[1]['id'])
397
398 # Create inference rule from "roles[0]" to "roles[2]"
399 self._create_implied_role(
400 self.roles[0]['id'], self.roles[2]['id'])
401
402 # Create inference rule from "roles[2]" to "role"
403 self._create_implied_role(
404 self.roles[2]['id'], self.role['id'])
405
406 rules = self.roles_client.list_all_role_inference_rules()[
407 'role_inferences']
408 # Sort the rules by the number of inferences, since there should be 1
409 # inference between "roles[2]" and "role" and 2 inferences for
410 # "roles[0]": between "roles[1]" and "roles[2]".
411 sorted_rules = sorted(rules, key=lambda r: len(r['implies']))
412
413 # Check that 2 sets of rules are returned.
414 self.assertEqual(2, len(sorted_rules))
415 # Check that only 1 inference rule exists between "roles[2]" and "role"
416 self.assertEqual(1, len(sorted_rules[0]['implies']))
417 # Check that 2 inference rules exist for "roles[0]": one between
418 # "roles[1]" and one between "roles[2]".
419 self.assertEqual(2, len(sorted_rules[1]['implies']))
420
421 # Check that "roles[2]" is the "prior_role" and that "role" is the
422 # "implies" role.
423 self.assertEqual(self.roles[2]['id'],
424 sorted_rules[0]['prior_role']['id'])
425 self.assertEqual(self.role['id'],
426 sorted_rules[0]['implies'][0]['id'])
427
428 # Check that "roles[0]" is the "prior_role" and that "roles[1]" and
429 # "roles[2]" are the "implies" roles.
430 self.assertEqual(self.roles[0]['id'],
431 sorted_rules[1]['prior_role']['id'])
432
433 implies_ids = [r['id'] for r in sorted_rules[1]['implies']]
434 self.assertIn(self.roles[1]['id'], implies_ids)
435 self.assertIn(self.roles[2]['id'], implies_ids)