From 5645fad7622a18e4f3c550ee7d409bf1b685a1a5 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Tue, 29 Sep 2020 16:51:12 +0100 Subject: Add support for 'keypairs list --project' parameter It would be lovely to do this server side but doing so requires a new microversion, a blueprint and a spec. This is less performant but should do the trick for the odd time users want to do this. Change-Id: I26e7d38966304dd67be5da8ed0bb24f87191b82f Signed-off-by: Stephen Finucane --- openstackclient/compute/v2/keypair.py | 44 ++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) (limited to 'openstackclient/compute/v2') diff --git a/openstackclient/compute/v2/keypair.py b/openstackclient/compute/v2/keypair.py index ae653e76..8c365cf0 100644 --- a/openstackclient/compute/v2/keypair.py +++ b/openstackclient/compute/v2/keypair.py @@ -166,7 +166,8 @@ class ListKeypair(command.Lister): def get_parser(self, prog_name): parser = super().get_parser(prog_name) - parser.add_argument( + user_group = parser.add_mutually_exclusive_group() + user_group.add_argument( '--user', metavar='', help=_( @@ -175,15 +176,44 @@ class ListKeypair(command.Lister): ), ) identity_common.add_user_domain_option_to_parser(parser) + user_group.add_argument( + '--project', + metavar='', + help=_( + 'Show keypairs for all users associated with project ' + '(admin only) (name or ID). ' + 'Requires ``--os-compute-api-version`` 2.10 or greater.' + ), + ) + identity_common.add_project_domain_option_to_parser(parser) return parser def take_action(self, parsed_args): compute_client = self.app.client_manager.compute identity_client = self.app.client_manager.identity - kwargs = {} + if parsed_args.project: + if compute_client.api_version < api_versions.APIVersion('2.10'): + msg = _( + '--os-compute-api-version 2.10 or greater is required to ' + 'support the --project option' + ) + raise exceptions.CommandError(msg) - if parsed_args.user: + # NOTE(stephenfin): This is done client side because nova doesn't + # currently support doing so server-side. If this is slow, we can + # think about spinning up a threadpool or similar. + project = identity_common.find_project( + identity_client, + parsed_args.project, + parsed_args.project_domain, + ).id + users = identity_client.users.list(tenant_id=project) + + data = [] + for user in users: + data.extend(compute_client.keypairs.list(user_id=user.id)) + elif parsed_args.user: if compute_client.api_version < api_versions.APIVersion('2.10'): msg = _( '--os-compute-api-version 2.10 or greater is required to ' @@ -191,13 +221,15 @@ class ListKeypair(command.Lister): ) raise exceptions.CommandError(msg) - kwargs['user_id'] = identity_common.find_user( + user = identity_common.find_user( identity_client, parsed_args.user, parsed_args.user_domain, - ).id + ) - data = compute_client.keypairs.list(**kwargs) + data = compute_client.keypairs.list(user_id=user.id) + else: + data = compute_client.keypairs.list() columns = ( "Name", -- cgit v1.2.1