@@ -188,11 +188,17 @@ def get_parser(self, prog_name):
188188 metavar = '<domain>' ,
189189 help = 'Filter users by <domain> (name or ID)' ,
190190 )
191- parser .add_argument (
191+ project_or_group = parser .add_mutually_exclusive_group ()
192+ project_or_group .add_argument (
192193 '--group' ,
193194 metavar = '<group>' ,
194195 help = 'Filter users by <group> membership (name or ID)' ,
195196 )
197+ project_or_group .add_argument (
198+ '--project' ,
199+ metavar = '<project>' ,
200+ help = 'Filter users by <project> (name or ID)' ,
201+ )
196202 parser .add_argument (
197203 '--long' ,
198204 action = 'store_true' ,
@@ -219,7 +225,44 @@ def take_action(self, parsed_args):
219225 else :
220226 group = None
221227
222- # List users
228+ if parsed_args .project :
229+ if domain is not None :
230+ project = utils .find_resource (
231+ identity_client .projects ,
232+ parsed_args .project ,
233+ domain_id = domain
234+ ).id
235+ else :
236+ project = utils .find_resource (
237+ identity_client .projects ,
238+ parsed_args .project ,
239+ ).id
240+
241+ assignments = identity_client .role_assignments .list (
242+ project = project )
243+
244+ # NOTE(stevemar): If a user has more than one role on a project
245+ # then they will have two entries in the returned data. Since we
246+ # are looking for any role, let's just track unique user IDs.
247+ user_ids = set ()
248+ for assignment in assignments :
249+ if hasattr (assignment , 'user' ):
250+ user_ids .add (assignment .user ['id' ])
251+
252+ # NOTE(stevemar): Call find_resource once we have unique IDs, so
253+ # it's fewer trips to the Identity API, then collect the data.
254+ data = []
255+ for user_id in user_ids :
256+ user = utils .find_resource (identity_client .users , user_id )
257+ data .append (user )
258+
259+ else :
260+ data = identity_client .users .list (
261+ domain = domain ,
262+ group = group ,
263+ )
264+
265+ # Column handling
223266 if parsed_args .long :
224267 columns = ['ID' , 'Name' , 'Default Project Id' , 'Domain Id' ,
225268 'Description' , 'Email' , 'Enabled' ]
@@ -228,11 +271,7 @@ def take_action(self, parsed_args):
228271 column_headers [3 ] = 'Domain'
229272 else :
230273 columns = ['ID' , 'Name' ]
231- column_headers = copy .deepcopy (columns )
232- data = identity_client .users .list (
233- domain = domain ,
234- group = group ,
235- )
274+ column_headers = columns
236275
237276 return (
238277 column_headers ,
0 commit comments