@@ -109,7 +109,7 @@ def _process_identity_and_resource_options(parsed_args,
109109
110110
111111class AddRole (command .Command ):
112- """Adds a role to a user or group on a domain or project"""
112+ """Adds a role assignment to a user or group on a domain or project"""
113113
114114 def get_parser (self , prog_name ):
115115 parser = super (AddRole , self ).get_parser (prog_name )
@@ -119,6 +119,7 @@ def get_parser(self, prog_name):
119119 help = _ ('Role to add to <user> (name or ID)' ),
120120 )
121121 _add_identity_and_resource_options_to_parser (parser )
122+ common .add_role_domain_option_to_parser (parser )
122123 return parser
123124
124125 def take_action (self , parsed_args ):
@@ -127,9 +128,15 @@ def take_action(self, parsed_args):
127128 if (not parsed_args .user and not parsed_args .domain
128129 and not parsed_args .group and not parsed_args .project ):
129130 return
131+
132+ domain_id = None
133+ if parsed_args .role_domain :
134+ domain_id = common .find_domain (identity_client ,
135+ parsed_args .role_domain ).id
130136 role = utils .find_resource (
131137 identity_client .roles ,
132138 parsed_args .role ,
139+ domain_id = domain_id
133140 )
134141
135142 kwargs = _process_identity_and_resource_options (
@@ -153,6 +160,11 @@ def get_parser(self, prog_name):
153160 metavar = '<role-name>' ,
154161 help = _ ('New role name' ),
155162 )
163+ parser .add_argument (
164+ '--domain' ,
165+ metavar = '<domain>' ,
166+ help = _ ('Domain the role belongs to (name or ID)' ),
167+ )
156168 parser .add_argument (
157169 '--or-show' ,
158170 action = 'store_true' ,
@@ -163,12 +175,20 @@ def get_parser(self, prog_name):
163175 def take_action (self , parsed_args ):
164176 identity_client = self .app .client_manager .identity
165177
178+ domain_id = None
179+ if parsed_args .domain :
180+ domain_id = common .find_domain (identity_client ,
181+ parsed_args .domain ).id
182+
166183 try :
167- role = identity_client .roles .create (name = parsed_args .name )
184+ role = identity_client .roles .create (
185+ name = parsed_args .name , domain = domain_id )
186+
168187 except ks_exc .Conflict :
169188 if parsed_args .or_show :
170189 role = utils .find_resource (identity_client .roles ,
171- parsed_args .name )
190+ parsed_args .name ,
191+ domain_id = domain_id )
172192 LOG .info (_ ('Returning existing role %s' ), role .name )
173193 else :
174194 raise
@@ -188,15 +208,26 @@ def get_parser(self, prog_name):
188208 nargs = "+" ,
189209 help = _ ('Role(s) to delete (name or ID)' ),
190210 )
211+ parser .add_argument (
212+ '--domain' ,
213+ metavar = '<domain>' ,
214+ help = _ ('Domain the role belongs to (name or ID)' ),
215+ )
191216 return parser
192217
193218 def take_action (self , parsed_args ):
194219 identity_client = self .app .client_manager .identity
195220
221+ domain_id = None
222+ if parsed_args .domain :
223+ domain_id = common .find_domain (identity_client ,
224+ parsed_args .domain ).id
225+
196226 for role in parsed_args .roles :
197227 role_obj = utils .find_resource (
198228 identity_client .roles ,
199229 role ,
230+ domain_id = domain_id
200231 )
201232 identity_client .roles .delete (role_obj .id )
202233
@@ -206,6 +237,18 @@ class ListRole(command.Lister):
206237
207238 def get_parser (self , prog_name ):
208239 parser = super (ListRole , self ).get_parser (prog_name )
240+
241+ # TODO(henry-nash): The use of the List Role command to list
242+ # assignments (as well as roles) has been deprecated. In order
243+ # to support domain specific roles, we are overriding the domain
244+ # option to allow specification of the domain for the role. This does
245+ # not conflict with any existing commands, since for the deprecated
246+ # assignments listing you were never allowed to only specify a domain
247+ # (you also needed to specify a user).
248+ #
249+ # Once we have removed the deprecated options entirely, we must
250+ # replace the call to _add_identity_and_resource_options_to_parser()
251+ # below with just adding the domain option into the parser.
209252 _add_identity_and_resource_options_to_parser (parser )
210253 return parser
211254
@@ -239,8 +282,14 @@ def take_action(self, parsed_args):
239282
240283 # no user or group specified, list all roles in the system
241284 if not parsed_args .user and not parsed_args .group :
242- columns = ('ID' , 'Name' )
243- data = identity_client .roles .list ()
285+ if not parsed_args .domain :
286+ columns = ('ID' , 'Name' )
287+ data = identity_client .roles .list ()
288+ else :
289+ columns = ('ID' , 'Name' , 'Domain' )
290+ data = identity_client .roles .list (domain_id = domain .id )
291+ for role in data :
292+ role .domain = domain .name
244293 elif parsed_args .user and parsed_args .domain :
245294 columns = ('ID' , 'Name' , 'Domain' , 'User' )
246295 data = identity_client .roles .list (
@@ -322,7 +371,7 @@ def take_action(self, parsed_args):
322371
323372
324373class RemoveRole (command .Command ):
325- """Remove role from domain/project : user/group"""
374+ """Removes a role assignment from domain/project : user/group"""
326375
327376 def get_parser (self , prog_name ):
328377 parser = super (RemoveRole , self ).get_parser (prog_name )
@@ -332,6 +381,8 @@ def get_parser(self, prog_name):
332381 help = _ ('Role to remove (name or ID)' ),
333382 )
334383 _add_identity_and_resource_options_to_parser (parser )
384+ common .add_role_domain_option_to_parser (parser )
385+
335386 return parser
336387
337388 def take_action (self , parsed_args ):
@@ -342,9 +393,15 @@ def take_action(self, parsed_args):
342393 sys .stderr .write (_ ("Incorrect set of arguments provided. "
343394 "See openstack --help for more details\n " ))
344395 return
396+
397+ domain_id = None
398+ if parsed_args .role_domain :
399+ domain_id = common .find_domain (identity_client ,
400+ parsed_args .role_domain ).id
345401 role = utils .find_resource (
346402 identity_client .roles ,
347403 parsed_args .role ,
404+ domain_id = domain_id
348405 )
349406
350407 kwargs = _process_identity_and_resource_options (
@@ -367,6 +424,11 @@ def get_parser(self, prog_name):
367424 metavar = '<role>' ,
368425 help = _ ('Role to modify (name or ID)' ),
369426 )
427+ parser .add_argument (
428+ '--domain' ,
429+ metavar = '<domain>' ,
430+ help = _ ('Domain the role belongs to (name or ID)' ),
431+ )
370432 parser .add_argument (
371433 '--name' ,
372434 metavar = '<name>' ,
@@ -377,10 +439,14 @@ def get_parser(self, prog_name):
377439 def take_action (self , parsed_args ):
378440 identity_client = self .app .client_manager .identity
379441
380- role = utils .find_resource (
381- identity_client .roles ,
382- parsed_args .role ,
383- )
442+ domain_id = None
443+ if parsed_args .domain :
444+ domain_id = common .find_domain (identity_client ,
445+ parsed_args .domain ).id
446+
447+ role = utils .find_resource (identity_client .roles ,
448+ parsed_args .role ,
449+ domain_id = domain_id )
384450
385451 identity_client .roles .update (role .id , name = parsed_args .name )
386452
@@ -395,15 +461,24 @@ def get_parser(self, prog_name):
395461 metavar = '<role>' ,
396462 help = _ ('Role to display (name or ID)' ),
397463 )
464+ parser .add_argument (
465+ '--domain' ,
466+ metavar = '<domain>' ,
467+ help = _ ('Domain the role belongs to (name or ID)' ),
468+ )
398469 return parser
399470
400471 def take_action (self , parsed_args ):
401472 identity_client = self .app .client_manager .identity
402473
403- role = utils .find_resource (
404- identity_client .roles ,
405- parsed_args .role ,
406- )
474+ domain_id = None
475+ if parsed_args .domain :
476+ domain_id = common .find_domain (identity_client ,
477+ parsed_args .domain ).id
478+
479+ role = utils .find_resource (identity_client .roles ,
480+ parsed_args .role ,
481+ domain_id = domain_id )
407482
408483 role ._info .pop ('links' )
409484 return zip (* sorted (six .iteritems (role ._info )))
0 commit comments