@@ -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 ,
0 commit comments