From 0ff28d5251f9e25eafdc628e29b093b7c694ea48 Mon Sep 17 00:00:00 2001 From: Steve Martinelli Date: Tue, 16 Dec 2014 15:16:41 -0500 Subject: Allow user list to filter by project Adds a --project filter to `os user list`, which really calls the role assignment manager behind the scenes. Change-Id: I57a75018f12ed3acdf8f6611b6b58bd974f91da2 Closes-Bug: #1397251 --- openstackclient/identity/v3/user.py | 53 ++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 7 deletions(-) (limited to 'openstackclient/identity') diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py index a60c8c83..4fb7b6d1 100644 --- a/openstackclient/identity/v3/user.py +++ b/openstackclient/identity/v3/user.py @@ -188,11 +188,17 @@ class ListUser(lister.Lister): metavar='', help='Filter users by (name or ID)', ) - parser.add_argument( + project_or_group = parser.add_mutually_exclusive_group() + project_or_group.add_argument( '--group', metavar='', help='Filter users by membership (name or ID)', ) + project_or_group.add_argument( + '--project', + metavar='', + help='Filter users by (name or ID)', + ) parser.add_argument( '--long', action='store_true', @@ -219,7 +225,44 @@ class ListUser(lister.Lister): else: group = None - # List users + if parsed_args.project: + if domain is not None: + project = utils.find_resource( + identity_client.projects, + parsed_args.project, + domain_id=domain + ).id + else: + project = utils.find_resource( + identity_client.projects, + parsed_args.project, + ).id + + assignments = identity_client.role_assignments.list( + project=project) + + # NOTE(stevemar): If a user has more than one role on a project + # then they will have two entries in the returned data. Since we + # are looking for any role, let's just track unique user IDs. + user_ids = set() + for assignment in assignments: + if hasattr(assignment, 'user'): + user_ids.add(assignment.user['id']) + + # NOTE(stevemar): Call find_resource once we have unique IDs, so + # it's fewer trips to the Identity API, then collect the data. + data = [] + for user_id in user_ids: + user = utils.find_resource(identity_client.users, user_id) + data.append(user) + + else: + data = identity_client.users.list( + domain=domain, + group=group, + ) + + # Column handling if parsed_args.long: columns = ['ID', 'Name', 'Default Project Id', 'Domain Id', 'Description', 'Email', 'Enabled'] @@ -228,11 +271,7 @@ class ListUser(lister.Lister): column_headers[3] = 'Domain' else: columns = ['ID', 'Name'] - column_headers = copy.deepcopy(columns) - data = identity_client.users.list( - domain=domain, - group=group, - ) + column_headers = columns return ( column_headers, -- cgit v1.2.1