@@ -146,10 +146,75 @@ class ListRole(lister.Lister):
146146
147147 log = logging .getLogger (__name__ + '.ListRole' )
148148
149+ def get_parser (self , prog_name ):
150+ parser = super (ListRole , self ).get_parser (prog_name )
151+ parser .add_argument (
152+ '--project' ,
153+ metavar = '<project>' ,
154+ help = 'Filter roles by <project> (name or ID)' ,
155+ )
156+ parser .add_argument (
157+ '--user' ,
158+ metavar = '<user>' ,
159+ help = 'Filter roles by <user> (name or ID)' ,
160+ )
161+ return parser
162+
149163 def take_action (self , parsed_args ):
150164 self .log .debug ('take_action(%s)' , parsed_args )
151- columns = ('ID' , 'Name' )
152- data = self .app .client_manager .identity .roles .list ()
165+ identity_client = self .app .client_manager .identity
166+ auth_ref = self .app .client_manager .auth_ref
167+
168+ # No user or project specified, list all roles in the system
169+ if not parsed_args .user and not parsed_args .project :
170+ columns = ('ID' , 'Name' )
171+ data = identity_client .roles .list ()
172+ elif parsed_args .user and parsed_args .project :
173+ user = utils .find_resource (
174+ identity_client .users ,
175+ parsed_args .user ,
176+ )
177+ project = utils .find_resource (
178+ identity_client .projects ,
179+ parsed_args .project ,
180+ )
181+ data = identity_client .roles .roles_for_user (user .id , project .id )
182+
183+ elif parsed_args .user :
184+ user = utils .find_resource (
185+ identity_client .users ,
186+ parsed_args .user ,
187+ )
188+ if self .app .client_manager .auth_ref :
189+ project = utils .find_resource (
190+ identity_client .projects ,
191+ auth_ref .project_id
192+ )
193+ else :
194+ msg = _ ("Project must be specified" )
195+ raise exceptions .CommandError (msg )
196+ data = identity_client .roles .roles_for_user (user .id , project .id )
197+ elif parsed_args .project :
198+ project = utils .find_resource (
199+ identity_client .projects ,
200+ parsed_args .project ,
201+ )
202+ if self .app .client_manager .auth_ref :
203+ user = utils .find_resource (
204+ identity_client .users ,
205+ auth_ref .user_id
206+ )
207+ else :
208+ msg = _ ("User must be specified" )
209+ raise exceptions .CommandError (msg )
210+ data = identity_client .roles .roles_for_user (user .id , project .id )
211+
212+ if parsed_args .user or parsed_args .project :
213+ columns = ('ID' , 'Name' , 'Project' , 'User' )
214+ for user_role in data :
215+ user_role .user = user .name
216+ user_role .project = project .name
217+
153218 return (columns ,
154219 (utils .get_item_properties (
155220 s , columns ,
0 commit comments