Skip to content

Commit 58f80e4

Browse files
committed
Add role assignments list support to identity v3
The assignments manager and its test class were created. Some fake stubs were also added on the fakes.py module. The "openstack role assignment list" command was created. Change-Id: Iae94f4fee608ea3e09ff38961ad22edc38efb89c Implements: blueprint roles-assignment-list Closes-Bug: 1246310
1 parent fb65652 commit 58f80e4

4 files changed

Lines changed: 572 additions & 0 deletions

File tree

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# 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.
12+
#
13+
14+
"""Identity v3 Assignment action implementations """
15+
16+
import logging
17+
18+
from cliff import lister
19+
20+
from openstackclient.common import utils
21+
22+
23+
class ListRoleAssignment(lister.Lister):
24+
"""Lists role assignments according to the given filters"""
25+
26+
log = logging.getLogger(__name__ + '.ListRoleAssignment')
27+
28+
def get_parser(self, prog_name):
29+
parser = super(ListRoleAssignment, self).get_parser(prog_name)
30+
parser.add_argument(
31+
'--effective',
32+
action="store_true",
33+
default=False,
34+
help='Returns only effective role assignments',
35+
)
36+
parser.add_argument(
37+
'--role',
38+
metavar='<role>',
39+
help='Name or ID of role to filter',
40+
)
41+
user_or_group = parser.add_mutually_exclusive_group()
42+
user_or_group.add_argument(
43+
'--user',
44+
metavar='<user>',
45+
help='Name or ID of user to filter',
46+
)
47+
user_or_group.add_argument(
48+
'--group',
49+
metavar='<group>',
50+
help='Name or ID of group to filter',
51+
)
52+
domain_or_project = parser.add_mutually_exclusive_group()
53+
domain_or_project.add_argument(
54+
'--domain',
55+
metavar='<domain>',
56+
help='Name or ID of domain to filter',
57+
)
58+
domain_or_project.add_argument(
59+
'--project',
60+
metavar='<project>',
61+
help='Name or ID of project to filter',
62+
)
63+
64+
return parser
65+
66+
def _as_tuple(self, assignment):
67+
return (assignment.role, assignment.user, assignment.group,
68+
assignment.project, assignment.domain)
69+
70+
def take_action(self, parsed_args):
71+
self.log.debug('take_action(%s)' % parsed_args)
72+
identity_client = self.app.client_manager.identity
73+
74+
role = None
75+
if parsed_args.role:
76+
role = utils.find_resource(
77+
identity_client.roles,
78+
parsed_args.role,
79+
)
80+
81+
user = None
82+
if parsed_args.user:
83+
user = utils.find_resource(
84+
identity_client.users,
85+
parsed_args.user,
86+
)
87+
88+
domain = None
89+
if parsed_args.domain:
90+
domain = utils.find_resource(
91+
identity_client.domains,
92+
parsed_args.domain,
93+
)
94+
95+
project = None
96+
if parsed_args.project:
97+
project = utils.find_resource(
98+
identity_client.projects,
99+
parsed_args.project,
100+
)
101+
102+
group = None
103+
if parsed_args.group:
104+
group = utils.find_resource(
105+
identity_client.groups,
106+
parsed_args.group,
107+
)
108+
109+
effective = True if parsed_args.effective else False
110+
self.log.debug('take_action(%s)' % parsed_args)
111+
columns = ('Role', 'User', 'Group', 'Project', 'Domain')
112+
data = identity_client.role_assignments.list(
113+
domain=domain,
114+
user=user,
115+
group=group,
116+
project=project,
117+
role=role,
118+
effective=effective)
119+
120+
data_parsed = []
121+
for assignment in data:
122+
# Removing the extra "scope" layer in the assignment json
123+
scope = assignment.scope
124+
if 'project' in scope:
125+
setattr(assignment, 'project', scope['project']['id'])
126+
assignment.domain = ''
127+
elif 'domain' in scope:
128+
setattr(assignment, 'domain', scope['domain']['id'])
129+
assignment.project = ''
130+
131+
else:
132+
assignment.domain = ''
133+
assignment.project = ''
134+
135+
del assignment.scope
136+
137+
if hasattr(assignment, 'user'):
138+
setattr(assignment, 'user', assignment.user['id'])
139+
assignment.group = ''
140+
elif hasattr(assignment, 'group'):
141+
setattr(assignment, 'group', assignment.group['id'])
142+
assignment.user = ''
143+
else:
144+
assignment.user = ''
145+
assignment.group = ''
146+
147+
if hasattr(assignment, 'role'):
148+
setattr(assignment, 'role', assignment.role['id'])
149+
else:
150+
assignment.role = ''
151+
152+
# Creating a tuple from data object fields
153+
# (including the blank ones)
154+
data_parsed.append(self._as_tuple(assignment))
155+
156+
return columns, tuple(data_parsed)

‎openstackclient/tests/identity/v3/fakes.py‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,31 @@
114114
'description': idp_description
115115
}
116116

117+
#Assignments
118+
ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID = {
119+
'scope': {'project': {'id': project_id}},
120+
'user': {'id': user_id},
121+
'role': {'id': role_id},
122+
}
123+
124+
ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID = {
125+
'scope': {'project': {'id': project_id}},
126+
'group': {'id': group_id},
127+
'role': {'id': role_id},
128+
}
129+
130+
ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID = {
131+
'scope': {'domain': {'id': domain_id}},
132+
'user': {'id': user_id},
133+
'role': {'id': role_id},
134+
}
135+
136+
ASSIGNMENT_WITH_DOMAIN_ID_AND_GROUP_ID = {
137+
'scope': {'domain': {'id': domain_id}},
138+
'group': {'id': group_id},
139+
'role': {'id': role_id},
140+
}
141+
117142

118143
class FakeIdentityv3Client(object):
119144
def __init__(self, **kwargs):
@@ -130,6 +155,8 @@ def __init__(self, **kwargs):
130155
self.service_catalog = mock.Mock()
131156
self.users = mock.Mock()
132157
self.users.resource_class = fakes.FakeResource(None, {})
158+
self.role_assignments = mock.Mock()
159+
self.role_assignments.resource_class = fakes.FakeResource(None, {})
133160
self.auth_token = kwargs['token']
134161
self.management_url = kwargs['endpoint']
135162

0 commit comments

Comments
 (0)