Skip to content

Commit 497a389

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add role assignments list support to identity v3"
2 parents 7f6a901 + 58f80e4 commit 497a389

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)