Skip to content

Commit f78a3f1

Browse files
Qiu YuDean Troyer
authored andcommitted
Refactor role list subcommand for identity v3 api
Currently parts of user list and group list command are actually functioning as role listing, which is quite counter intuitive and misleading. This refactor change move role related logic to a single place of role list command. It now allows role grants listing for user/group + domain/project combinations. If no user or group specified, it will list all roles in the system, which is the default behaviour. Change-Id: I4ced6df4b76f018d01000d28b4281ad9f252ffcc
1 parent 7f6a901 commit f78a3f1

5 files changed

Lines changed: 302 additions & 333 deletions

File tree

‎openstackclient/identity/v3/group.py‎

Lines changed: 5 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -176,23 +176,6 @@ def get_parser(self, prog_name):
176176
nargs='?',
177177
help='Name or ID of group to list [required with --role]',
178178
)
179-
parser.add_argument(
180-
'--role',
181-
action='store_true',
182-
default=False,
183-
help='List the roles assigned to <group>',
184-
)
185-
domain_or_project = parser.add_mutually_exclusive_group()
186-
domain_or_project.add_argument(
187-
'--domain',
188-
metavar='<domain>',
189-
help='Filter list by <domain> [Only valid with --role]',
190-
)
191-
domain_or_project.add_argument(
192-
'--project',
193-
metavar='<project>',
194-
help='Filter list by <project> [Only valid with --role]',
195-
)
196179
parser.add_argument(
197180
'--long',
198181
action='store_true',
@@ -205,65 +188,12 @@ def take_action(self, parsed_args):
205188
self.log.debug('take_action(%s)', parsed_args)
206189
identity_client = self.app.client_manager.identity
207190

208-
if parsed_args.role:
209-
# List roles belonging to group
210-
211-
# Group is required here, bail if it is not supplied
212-
if not parsed_args.group:
213-
sys.stderr.write('Error: Group must be specified')
214-
# TODO(dtroyer): This lists the commands...I want it to
215-
# show the help for _this_ command.
216-
self.app.DeferredHelpAction(
217-
self.app.parser,
218-
self.app.parser,
219-
None,
220-
None,
221-
)
222-
return ([], [])
223-
224-
group = utils.find_resource(
225-
identity_client.groups,
226-
parsed_args.group,
227-
)
228-
229-
if parsed_args.domain:
230-
columns = ('ID', 'Name', 'Domain', 'Group')
231-
domain = utils.find_resource(
232-
identity_client.domains,
233-
parsed_args.domain,
234-
)
235-
data = identity_client.roles.list(
236-
group=group,
237-
domain=domain,
238-
)
239-
for group_role in data:
240-
group_role.group = group.name
241-
group_role.domain = domain.name
242-
elif parsed_args.project:
243-
columns = ('ID', 'Name', 'Project', 'Group')
244-
project = utils.find_resource(
245-
identity_client.projects,
246-
parsed_args.project,
247-
)
248-
data = identity_client.roles.list(
249-
group=group,
250-
project=project,
251-
)
252-
for group_role in data:
253-
group_role.group = group.name
254-
group_role.project = project.name
255-
else:
256-
# TODO(dtroyer): raise exception here, this really is an error
257-
sys.stderr.write("Error: Must specify --domain or --project "
258-
"with --role\n")
259-
return ([], [])
191+
# List groups
192+
if parsed_args.long:
193+
columns = ('ID', 'Name', 'Domain ID', 'Description')
260194
else:
261-
# List groups
262-
if parsed_args.long:
263-
columns = ('ID', 'Name', 'Domain ID', 'Description')
264-
else:
265-
columns = ('ID', 'Name')
266-
data = identity_client.groups.list()
195+
columns = ('ID', 'Name')
196+
data = identity_client.groups.list()
267197

268198
return (columns,
269199
(utils.get_item_properties(

‎openstackclient/identity/v3/role.py‎

Lines changed: 103 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,110 @@ class ListRole(lister.Lister):
192192

193193
log = logging.getLogger(__name__ + '.ListRole')
194194

195+
def get_parser(self, prog_name):
196+
parser = super(ListRole, self).get_parser(prog_name)
197+
domain_or_project = parser.add_mutually_exclusive_group()
198+
domain_or_project.add_argument(
199+
'--domain',
200+
metavar='<domain>',
201+
help='Filter role list by <domain>',
202+
)
203+
domain_or_project.add_argument(
204+
'--project',
205+
metavar='<project>',
206+
help='Filter role list by <project>',
207+
)
208+
user_or_group = parser.add_mutually_exclusive_group()
209+
user_or_group.add_argument(
210+
'--user',
211+
metavar='<user>',
212+
help='Name or ID of user to list roles asssigned to',
213+
)
214+
user_or_group.add_argument(
215+
'--group',
216+
metavar='<group>',
217+
help='Name or ID of group to list roles asssigned to',
218+
)
219+
return parser
220+
195221
def take_action(self, parsed_args):
196-
self.log.debug('take_action(%s)', parsed_args)
197-
columns = ('ID', 'Name')
198-
data = self.app.client_manager.identity.roles.list()
222+
self.log.debug('take_action(%s)' % parsed_args)
223+
identity_client = self.app.client_manager.identity
224+
225+
if parsed_args.user:
226+
user = utils.find_resource(
227+
identity_client.users,
228+
parsed_args.user,
229+
)
230+
elif parsed_args.group:
231+
group = utils.find_resource(
232+
identity_client.groups,
233+
parsed_args.group,
234+
)
235+
236+
if parsed_args.domain:
237+
domain = utils.find_resource(
238+
identity_client.domains,
239+
parsed_args.domain,
240+
)
241+
elif parsed_args.project:
242+
project = utils.find_resource(
243+
identity_client.projects,
244+
parsed_args.project,
245+
)
246+
247+
# no user or group specified, list all roles in the system
248+
if not parsed_args.user and not parsed_args.group:
249+
columns = ('ID', 'Name')
250+
data = identity_client.roles.list()
251+
elif parsed_args.user and parsed_args.domain:
252+
columns = ('ID', 'Name', 'Domain', 'User')
253+
data = identity_client.roles.list(
254+
user=user,
255+
domain=domain,
256+
)
257+
for user_role in data:
258+
user_role.user = user.name
259+
user_role.domain = domain.name
260+
elif parsed_args.user and parsed_args.project:
261+
columns = ('ID', 'Name', 'Project', 'User')
262+
data = identity_client.roles.list(
263+
user=user,
264+
project=project,
265+
)
266+
for user_role in data:
267+
user_role.user = user.name
268+
user_role.project = project.name
269+
elif parsed_args.user:
270+
columns = ('ID', 'Name')
271+
data = identity_client.roles.list(
272+
user=user,
273+
domain='default',
274+
)
275+
elif parsed_args.group and parsed_args.domain:
276+
columns = ('ID', 'Name', 'Domain', 'Group')
277+
data = identity_client.roles.list(
278+
group=group,
279+
domain=domain,
280+
)
281+
for group_role in data:
282+
group_role.group = group.name
283+
group_role.domain = domain.name
284+
elif parsed_args.group and parsed_args.project:
285+
columns = ('ID', 'Name', 'Project', 'Group')
286+
data = identity_client.roles.list(
287+
group=group,
288+
project=project,
289+
)
290+
for group_role in data:
291+
group_role.group = group.name
292+
group_role.project = project.name
293+
else:
294+
sys.stderr.write("Error: If a user or group is specified, either "
295+
"--domain or --project must also be specified to "
296+
"list role grants.\n")
297+
return ([], [])
298+
199299
return (columns,
200300
(utils.get_item_properties(
201301
s, columns,

‎openstackclient/identity/v3/user.py‎

Lines changed: 7 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import logging
1919
import six
20-
import sys
2120

2221
from cliff import command
2322
from cliff import lister
@@ -161,23 +160,6 @@ def get_parser(self, prog_name):
161160
nargs='?',
162161
help='Name or ID of user to list [required with --role]',
163162
)
164-
parser.add_argument(
165-
'--role',
166-
action='store_true',
167-
default=False,
168-
help='List the roles assigned to <user>',
169-
)
170-
domain_or_project = parser.add_mutually_exclusive_group()
171-
domain_or_project.add_argument(
172-
'--domain',
173-
metavar='<domain>',
174-
help='Filter list by <domain> [Only valid with --role]',
175-
)
176-
domain_or_project.add_argument(
177-
'--project',
178-
metavar='<project>',
179-
help='Filter list by <project> [Only valid with --role]',
180-
)
181163
parser.add_argument(
182164
'--long',
183165
action='store_true',
@@ -187,70 +169,15 @@ def get_parser(self, prog_name):
187169
return parser
188170

189171
def take_action(self, parsed_args):
190-
self.log.debug('take_action(%s)', parsed_args)
191-
identity_client = self.app.client_manager.identity
172+
self.log.debug('take_action(%s)' % parsed_args)
192173

193-
if parsed_args.role:
194-
# List roles belonging to user
195-
196-
# User is required here, bail if it is not supplied
197-
if not parsed_args.user:
198-
sys.stderr.write('Error: User must be specified')
199-
return ([], [])
200-
201-
user = utils.find_resource(
202-
identity_client.users,
203-
parsed_args.user,
204-
)
205-
206-
# List a user's roles
207-
if not parsed_args.domain and not parsed_args.project:
208-
columns = ('ID', 'Name')
209-
data = identity_client.roles.list(
210-
user=user,
211-
domain='default',
212-
)
213-
# List a user's roles on a domain
214-
elif parsed_args.user and parsed_args.domain:
215-
columns = ('ID', 'Name', 'Domain', 'User')
216-
domain = utils.find_resource(
217-
identity_client.domains,
218-
parsed_args.domain,
219-
)
220-
data = identity_client.roles.list(
221-
user=user,
222-
domain=domain,
223-
)
224-
for user_role in data:
225-
user_role.user = user.name
226-
user_role.domain = domain.name
227-
# List a user's roles on a project
228-
elif parsed_args.user and parsed_args.project:
229-
columns = ('ID', 'Name', 'Project', 'User')
230-
project = utils.find_resource(
231-
identity_client.projects,
232-
parsed_args.project,
233-
)
234-
data = identity_client.roles.list(
235-
user=user,
236-
project=project,
237-
)
238-
for user_role in data:
239-
user_role.user = user.name
240-
user_role.project = project.name
241-
else:
242-
# TODO(dtroyer): raise exception here, this really is an error
243-
sys.stderr.write("Error: Must specify --domain or --project "
244-
"with --role\n")
245-
return ([], [])
174+
# List users
175+
if parsed_args.long:
176+
columns = ('ID', 'Name', 'Project Id', 'Domain Id',
177+
'Description', 'Email', 'Enabled')
246178
else:
247-
# List users
248-
if parsed_args.long:
249-
columns = ('ID', 'Name', 'Project Id', 'Domain Id',
250-
'Description', 'Email', 'Enabled')
251-
else:
252-
columns = ('ID', 'Name')
253-
data = self.app.client_manager.identity.users.list()
179+
columns = ('ID', 'Name')
180+
data = self.app.client_manager.identity.users.list()
254181

255182
return (columns,
256183
(utils.get_item_properties(

0 commit comments

Comments
 (0)