From a01bf55d2065ec1a98f486109cc8d315def501cd Mon Sep 17 00:00:00 2001 From: jiangpch Date: Thu, 13 Jul 2017 04:58:00 -0400 Subject: Fix 'domain' filter not work well in some commands The 'domain' filter not work well in commands 'project show', 'user show' and 'user set'. Depends-On: I490900d6249f01654d4cba43bddd3e7af7928a84 Closes-Bug: #1704097 Change-Id: Ib4f47cbaba27eb56c4a41d187fee74a995e62dc7 --- openstackclient/identity/common.py | 8 +++++++- openstackclient/identity/v3/project.py | 3 ++- openstackclient/identity/v3/user.py | 6 ++++-- 3 files changed, 13 insertions(+), 4 deletions(-) (limited to 'openstackclient/identity') diff --git a/openstackclient/identity/common.py b/openstackclient/identity/common.py index 1f645b7d..3dc5adbb 100644 --- a/openstackclient/identity/common.py +++ b/openstackclient/identity/common.py @@ -58,7 +58,7 @@ def find_service(identity_client, name_type_or_id): raise exceptions.CommandError(msg % name_type_or_id) -def _get_token_resource(client, resource, parsed_name): +def _get_token_resource(client, resource, parsed_name, parsed_domain=None): """Peek into the user's auth token to get resource IDs Look into a user's token to try and find the ID of a domain, project or @@ -71,6 +71,8 @@ def _get_token_resource(client, resource, parsed_name): `project_domain`, `user_domain`, `project`, or `user`. :param parsed_name: This is input from parsed_args that the user is hoping to find in the token. + :param parsed_domain: This is domain filter from parsed_args that used to + filter the results. :returns: The ID of the resource from the token, or the original value from parsed_args if it does not match. @@ -85,6 +87,10 @@ def _get_token_resource(client, resource, parsed_name): if resource == 'domain': token_dict = token_dict['project'] obj = token_dict[resource] + + # user/project under different domain may has a same name + if parsed_domain and parsed_domain not in obj['domain'].values(): + return parsed_name return obj['id'] if obj['name'] == parsed_name else parsed_name # diaper defense in case parsing the token fails except Exception: # noqa diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py index 873ee9c7..c7806ee1 100644 --- a/openstackclient/identity/v3/project.py +++ b/openstackclient/identity/v3/project.py @@ -360,7 +360,8 @@ class ShowProject(command.ShowOne): identity_client = self.app.client_manager.identity project_str = common._get_token_resource(identity_client, 'project', - parsed_args.project) + parsed_args.project, + parsed_args.domain) if parsed_args.domain: domain = common.find_domain(identity_client, parsed_args.domain) diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py index 9c289a6d..5f4fb544 100644 --- a/openstackclient/identity/v3/user.py +++ b/openstackclient/identity/v3/user.py @@ -358,7 +358,8 @@ class SetUser(command.Command): "when a user does not have a password.")) user_str = common._get_token_resource(identity_client, 'user', - parsed_args.user) + parsed_args.user, + parsed_args.domain) if parsed_args.domain: domain = common.find_domain(identity_client, parsed_args.domain) user = utils.find_resource(identity_client.users, @@ -473,7 +474,8 @@ class ShowUser(command.ShowOne): identity_client = self.app.client_manager.identity user_str = common._get_token_resource(identity_client, 'user', - parsed_args.user) + parsed_args.user, + parsed_args.domain) if parsed_args.domain: domain = common.find_domain(identity_client, parsed_args.domain) user = utils.find_resource(identity_client.users, -- cgit v1.2.1