Skip to content

Commit 94a8805

Browse files
Samuel de Medeiros QueirozSteve Martinelli
authored andcommitted
Inherited info/option when listing role assignment
Adds inherited information when listing role assignments. In addition, it makes possible to list only inherited ones by adding --inherited option. Change-Id: Idf889603d584716da95e2c7b4880142fbd8291c4 Closes-Bug: 1370546
1 parent 35833c9 commit 94a8805

3 files changed

Lines changed: 137 additions & 33 deletions

File tree

openstackclient/identity/v3/role_assignment.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ def get_parser(self, prog_name):
6464
help='Project to filter (name or ID)',
6565
)
6666
common.add_project_domain_option_to_parser(parser)
67-
67+
common.add_inherited_option_to_parser(parser)
6868
return parser
6969

7070
def _as_tuple(self, assignment):
7171
return (assignment.role, assignment.user, assignment.group,
72-
assignment.project, assignment.domain)
72+
assignment.project, assignment.domain, assignment.inherited)
7373

7474
def take_action(self, parsed_args):
7575
self.log.debug('take_action(%s)' % parsed_args)
@@ -115,14 +115,17 @@ def take_action(self, parsed_args):
115115

116116
effective = True if parsed_args.effective else False
117117
self.log.debug('take_action(%s)' % parsed_args)
118-
columns = ('Role', 'User', 'Group', 'Project', 'Domain')
118+
columns = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
119+
120+
inherited_to = 'projects' if parsed_args.inherited else None
119121
data = identity_client.role_assignments.list(
120122
domain=domain,
121123
user=user,
122124
group=group,
123125
project=project,
124126
role=role,
125-
effective=effective)
127+
effective=effective,
128+
os_inherit_extension_inherited_to=inherited_to)
126129

127130
data_parsed = []
128131
for assignment in data:
@@ -139,6 +142,9 @@ def take_action(self, parsed_args):
139142
assignment.domain = ''
140143
assignment.project = ''
141144

145+
inherited = scope.get('OS-INHERIT:inherited_to') == 'projects'
146+
assignment.inherited = inherited
147+
142148
del assignment.scope
143149

144150
if hasattr(assignment, 'user'):

openstackclient/tests/identity/v3/fakes.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,13 @@
313313
'role': {'id': role_id},
314314
}
315315

316+
ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INHERITED = {
317+
'scope': {'project': {'id': project_id},
318+
'OS-INHERIT:inherited_to': 'projects'},
319+
'user': {'id': user_id},
320+
'role': {'id': role_id},
321+
}
322+
316323
ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID = {
317324
'scope': {'project': {'id': project_id}},
318325
'group': {'id': group_id},
@@ -325,6 +332,13 @@
325332
'role': {'id': role_id},
326333
}
327334

335+
ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INHERITED = {
336+
'scope': {'domain': {'id': domain_id},
337+
'OS-INHERIT:inherited_to': 'projects'},
338+
'user': {'id': user_id},
339+
'role': {'id': role_id},
340+
}
341+
328342
ASSIGNMENT_WITH_DOMAIN_ID_AND_GROUP_ID = {
329343
'scope': {'domain': {'id': domain_id}},
330344
'group': {'id': group_id},

openstackclient/tests/identity/v3/test_role_assignment.py

Lines changed: 113 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,24 @@ def test_role_assignment_list_no_filters(self):
8686
effective=False,
8787
role=None,
8888
user=None,
89-
project=None)
89+
project=None,
90+
os_inherit_extension_inherited_to=None)
9091

91-
collist = ('Role', 'User', 'Group', 'Project', 'Domain')
92-
self.assertEqual(collist, columns)
92+
collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
93+
self.assertEqual(columns, collist)
9394
datalist = ((
9495
identity_fakes.role_id,
9596
identity_fakes.user_id,
9697
'',
9798
identity_fakes.project_id,
98-
''
99+
'',
100+
False
99101
), (identity_fakes.role_id,
100102
'',
101103
identity_fakes.group_id,
102104
identity_fakes.project_id,
103-
''
105+
'',
106+
False
104107
),)
105108
self.assertEqual(datalist, tuple(data))
106109

@@ -131,6 +134,7 @@ def test_role_assignment_list_user(self):
131134
('project', None),
132135
('role', None),
133136
('effective', False),
137+
('inherited', False),
134138
]
135139
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
136140

@@ -143,21 +147,24 @@ def test_role_assignment_list_user(self):
143147
group=None,
144148
project=None,
145149
role=None,
146-
effective=False)
150+
effective=False,
151+
os_inherit_extension_inherited_to=None)
147152

148-
collist = ('Role', 'User', 'Group', 'Project', 'Domain')
149-
self.assertEqual(collist, columns)
153+
collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
154+
self.assertEqual(columns, collist)
150155
datalist = ((
151156
identity_fakes.role_id,
152157
identity_fakes.user_id,
153158
'',
154159
'',
155-
identity_fakes.domain_id
160+
identity_fakes.domain_id,
161+
False
156162
), (identity_fakes.role_id,
157163
identity_fakes.user_id,
158164
'',
159165
identity_fakes.project_id,
160-
''
166+
'',
167+
False
161168
),)
162169
self.assertEqual(datalist, tuple(data))
163170

@@ -188,6 +195,7 @@ def test_role_assignment_list_group(self):
188195
('project', None),
189196
('role', None),
190197
('effective', False),
198+
('inherited', False),
191199
]
192200
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
193201

@@ -200,21 +208,24 @@ def test_role_assignment_list_group(self):
200208
effective=False,
201209
project=None,
202210
role=None,
203-
user=None)
211+
user=None,
212+
os_inherit_extension_inherited_to=None)
204213

205-
collist = ('Role', 'User', 'Group', 'Project', 'Domain')
206-
self.assertEqual(collist, columns)
214+
collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
215+
self.assertEqual(columns, collist)
207216
datalist = ((
208217
identity_fakes.role_id,
209218
'',
210219
identity_fakes.group_id,
211220
'',
212-
identity_fakes.domain_id
221+
identity_fakes.domain_id,
222+
False
213223
), (identity_fakes.role_id,
214224
'',
215225
identity_fakes.group_id,
216226
identity_fakes.project_id,
217-
''
227+
'',
228+
False
218229
),)
219230
self.assertEqual(datalist, tuple(data))
220231

@@ -245,6 +256,7 @@ def test_role_assignment_list_domain(self):
245256
('project', None),
246257
('role', None),
247258
('effective', False),
259+
('inherited', False),
248260
]
249261
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
250262

@@ -257,21 +269,24 @@ def test_role_assignment_list_domain(self):
257269
effective=False,
258270
project=None,
259271
role=None,
260-
user=None)
272+
user=None,
273+
os_inherit_extension_inherited_to=None)
261274

262-
collist = ('Role', 'User', 'Group', 'Project', 'Domain')
263-
self.assertEqual(collist, columns)
275+
collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
276+
self.assertEqual(columns, collist)
264277
datalist = ((
265278
identity_fakes.role_id,
266279
identity_fakes.user_id,
267280
'',
268281
'',
269-
identity_fakes.domain_id
282+
identity_fakes.domain_id,
283+
False
270284
), (identity_fakes.role_id,
271285
'',
272286
identity_fakes.group_id,
273287
'',
274-
identity_fakes.domain_id
288+
identity_fakes.domain_id,
289+
False
275290
),)
276291
self.assertEqual(datalist, tuple(data))
277292

@@ -302,6 +317,7 @@ def test_role_assignment_list_project(self):
302317
('project', identity_fakes.project_name),
303318
('role', None),
304319
('effective', False),
320+
('inherited', False),
305321
]
306322
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
307323

@@ -314,21 +330,24 @@ def test_role_assignment_list_project(self):
314330
effective=False,
315331
project=self.projects_mock.get(),
316332
role=None,
317-
user=None)
333+
user=None,
334+
os_inherit_extension_inherited_to=None)
318335

319-
collist = ('Role', 'User', 'Group', 'Project', 'Domain')
320-
self.assertEqual(collist, columns)
336+
collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
337+
self.assertEqual(columns, collist)
321338
datalist = ((
322339
identity_fakes.role_id,
323340
identity_fakes.user_id,
324341
'',
325342
identity_fakes.project_id,
326-
''
343+
'',
344+
False
327345
), (identity_fakes.role_id,
328346
'',
329347
identity_fakes.group_id,
330348
identity_fakes.project_id,
331-
''
349+
'',
350+
False
332351
),)
333352
self.assertEqual(datalist, tuple(data))
334353

@@ -357,6 +376,7 @@ def test_role_assignment_list_effective(self):
357376
('project', None),
358377
('role', None),
359378
('effective', True),
379+
('inherited', False),
360380
]
361381
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
362382

@@ -369,20 +389,84 @@ def test_role_assignment_list_effective(self):
369389
effective=True,
370390
project=None,
371391
role=None,
372-
user=None)
392+
user=None,
393+
os_inherit_extension_inherited_to=None)
373394

374-
collist = ('Role', 'User', 'Group', 'Project', 'Domain')
375-
self.assertEqual(collist, columns)
395+
collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
396+
self.assertEqual(columns, collist)
376397
datalist = ((
377398
identity_fakes.role_id,
378399
identity_fakes.user_id,
379400
'',
380401
identity_fakes.project_id,
381-
''
402+
'',
403+
False
404+
), (identity_fakes.role_id,
405+
identity_fakes.user_id,
406+
'',
407+
'',
408+
identity_fakes.domain_id,
409+
False
410+
),)
411+
self.assertEqual(tuple(data), datalist)
412+
413+
def test_role_assignment_list_inherited(self):
414+
415+
self.role_assignments_mock.list.return_value = [
416+
fakes.FakeResource(
417+
None,
418+
copy.deepcopy(
419+
(identity_fakes.
420+
ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INHERITED)),
421+
loaded=True,
422+
),
423+
fakes.FakeResource(
424+
None,
425+
copy.deepcopy(
426+
(identity_fakes.
427+
ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INHERITED)),
428+
loaded=True,
429+
),
430+
]
431+
432+
arglist = ['--inherited']
433+
verifylist = [
434+
('user', None),
435+
('group', None),
436+
('domain', None),
437+
('project', None),
438+
('role', None),
439+
('effective', False),
440+
('inherited', True),
441+
]
442+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
443+
444+
# DisplayCommandBase.take_action() returns two tuples
445+
columns, data = self.cmd.take_action(parsed_args)
446+
447+
self.role_assignments_mock.list.assert_called_with(
448+
domain=None,
449+
group=None,
450+
effective=False,
451+
project=None,
452+
role=None,
453+
user=None,
454+
os_inherit_extension_inherited_to='projects')
455+
456+
collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited')
457+
self.assertEqual(columns, collist)
458+
datalist = ((
459+
identity_fakes.role_id,
460+
identity_fakes.user_id,
461+
'',
462+
identity_fakes.project_id,
463+
'',
464+
True
382465
), (identity_fakes.role_id,
383466
identity_fakes.user_id,
384467
'',
385468
'',
386469
identity_fakes.domain_id,
470+
True
387471
),)
388472
self.assertEqual(datalist, tuple(data))

0 commit comments

Comments
 (0)