Allow --domain to be used for identity commands without lookup

Performing create, list, or set operations for users, groups, and projects
with the --domain option attempts to look up the domain for name to ID
conversion.  In the case of an environment using Keystone domains, it is
desired to allow a domain admin to perform these operations for objects in
their domain without allowing them to list or show domains. The current
behavior prevents the domain admin from performing these operations since
they will be forbidden to perform the underlying list_domains operation.

This patch makes the domain lookup error a soft failure, and falls back
to using the passed in domain argument directly as a domain ID in the
request that it sends to Keystone.

Change-Id: I5139097f8cedc53693f6f71297518917ac72e50a
Closes-Bug: #1378565
This commit is contained in:
Nathan Kinder
2014-10-07 16:30:56 -07:00
parent 364071a90b
commit f0c57e17c9
3 changed files with 21 additions and 27 deletions

View File

@@ -129,8 +129,8 @@ class CreateGroup(show.ShowOne):
self.log.debug('take_action(%s)', parsed_args) self.log.debug('take_action(%s)', parsed_args)
identity_client = self.app.client_manager.identity identity_client = self.app.client_manager.identity
if parsed_args.domain: if parsed_args.domain:
domain = utils.find_resource(identity_client.domains, domain = common.find_domain(identity_client,
parsed_args.domain).id parsed_args.domain).id
else: else:
domain = None domain = None
group = identity_client.groups.create( group = identity_client.groups.create(
@@ -174,7 +174,7 @@ class ListGroup(lister.Lister):
parser.add_argument( parser.add_argument(
'--domain', '--domain',
metavar='<domain>', metavar='<domain>',
help='Filter group list by <domain>', help='Filter group list by <domain> (name or ID)',
) )
parser.add_argument( parser.add_argument(
'--user', '--user',
@@ -194,10 +194,8 @@ class ListGroup(lister.Lister):
identity_client = self.app.client_manager.identity identity_client = self.app.client_manager.identity
if parsed_args.domain: if parsed_args.domain:
domain = utils.find_resource( domain = common.find_domain(identity_client,
identity_client.domains, parsed_args.domain).id
parsed_args.domain,
).id
else: else:
domain = None domain = None
@@ -301,10 +299,8 @@ class SetGroup(command.Command):
if parsed_args.description: if parsed_args.description:
kwargs['description'] = parsed_args.description kwargs['description'] = parsed_args.description
if parsed_args.domain: if parsed_args.domain:
domain = utils.find_resource( kwargs['domain'] = common.find_domain(identity_client,
identity_client.domains, parsed_args.domain).id parsed_args.domain).id
kwargs['domain'] = domain
if not len(kwargs): if not len(kwargs):
sys.stderr.write("Group not updated, no arguments present") sys.stderr.write("Group not updated, no arguments present")
return return

View File

@@ -74,7 +74,8 @@ class CreateProject(show.ShowOne):
identity_client = self.app.client_manager.identity identity_client = self.app.client_manager.identity
if parsed_args.domain: if parsed_args.domain:
domain = common.find_domain(identity_client, parsed_args.domain).id domain = common.find_domain(identity_client,
parsed_args.domain).id
else: else:
domain = None domain = None
@@ -141,7 +142,7 @@ class ListProject(lister.Lister):
parser.add_argument( parser.add_argument(
'--domain', '--domain',
metavar='<project-domain>', metavar='<project-domain>',
help='Filter by a specific domain', help='Filter by a specific domain (name or ID)',
) )
return parser return parser
@@ -154,8 +155,8 @@ class ListProject(lister.Lister):
columns = ('ID', 'Name') columns = ('ID', 'Name')
kwargs = {} kwargs = {}
if parsed_args.domain: if parsed_args.domain:
domain = common.find_domain(identity_client, parsed_args.domain) kwargs['domain'] = common.find_domain(identity_client,
kwargs['domain'] = domain.id parsed_args.domain).id
data = identity_client.projects.list(**kwargs) data = identity_client.projects.list(**kwargs)
return (columns, return (columns,
(utils.get_item_properties( (utils.get_item_properties(
@@ -232,8 +233,8 @@ class SetProject(command.Command):
if parsed_args.name: if parsed_args.name:
kwargs['name'] = parsed_args.name kwargs['name'] = parsed_args.name
if parsed_args.domain: if parsed_args.domain:
domain = common.find_domain(identity_client, parsed_args.domain) kwargs['domain'] = common.find_domain(identity_client,
kwargs['domain'] = domain.id parsed_args.domain).id
if parsed_args.description: if parsed_args.description:
kwargs['description'] = parsed_args.description kwargs['description'] = parsed_args.description
if parsed_args.enable: if parsed_args.enable:

View File

@@ -95,8 +95,8 @@ class CreateUser(show.ShowOne):
project_id = None project_id = None
if parsed_args.domain: if parsed_args.domain:
domain_id = utils.find_resource( domain_id = common.find_domain(identity_client,
identity_client.domains, parsed_args.domain).id parsed_args.domain).id
else: else:
domain_id = None domain_id = None
@@ -158,7 +158,7 @@ class ListUser(lister.Lister):
parser.add_argument( parser.add_argument(
'--domain', '--domain',
metavar='<domain>', metavar='<domain>',
help='Filter group list by <domain>', help='Filter user list by <domain> (name or ID)',
) )
parser.add_argument( parser.add_argument(
'--group', '--group',
@@ -178,10 +178,8 @@ class ListUser(lister.Lister):
identity_client = self.app.client_manager.identity identity_client = self.app.client_manager.identity
if parsed_args.domain: if parsed_args.domain:
domain = utils.find_resource( domain = common.find_domain(identity_client,
identity_client.domains, parsed_args.domain).id
parsed_args.domain,
).id
else: else:
domain = None domain = None
@@ -311,9 +309,8 @@ class SetUser(command.Command):
identity_client.projects, parsed_args.project).id identity_client.projects, parsed_args.project).id
kwargs['project'] = project_id kwargs['project'] = project_id
if parsed_args.domain: if parsed_args.domain:
domain_id = utils.find_resource( kwargs['domain'] = common.find_domain(identity_client,
identity_client.domains, parsed_args.domain).id parsed_args.domain).id
kwargs['domain'] = domain_id
kwargs['enabled'] = user.enabled kwargs['enabled'] = user.enabled
if parsed_args.enable: if parsed_args.enable:
kwargs['enabled'] = True kwargs['enabled'] = True