summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorStephen Finucane <sfinucan@redhat.com>2020-09-29 16:30:34 +0100
committerStephen Finucane <sfinucan@redhat.com>2020-10-14 10:25:50 +0100
commit98a0016cfa1d39bcc37144f0c7700e9a9d6b2c0b (patch)
treed60f0f33f20fee8a931a570f4a1dd28835f4c4cf /openstackclient
parent6216025e9da0b1689ddc4a494eaf562f15b28b32 (diff)
downloadpython-openstackclient-98a0016cfa1d39bcc37144f0c7700e9a9d6b2c0b.tar.gz
Add support for 'keypairs list --user' parameter
This has been supported by nova and novaclient since the veritable dark ages. Add it to OSC. Change-Id: Ifc95e7dd6c00807c80e87e10046ab154d0989014 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/keypair.py35
-rw-r--r--openstackclient/tests/unit/compute/v2/test_keypair.py66
2 files changed, 98 insertions, 3 deletions
diff --git a/openstackclient/compute/v2/keypair.py b/openstackclient/compute/v2/keypair.py
index 6affaca3..ae653e76 100644
--- a/openstackclient/compute/v2/keypair.py
+++ b/openstackclient/compute/v2/keypair.py
@@ -26,6 +26,7 @@ from osc_lib import exceptions
from osc_lib import utils
from openstackclient.i18n import _
+from openstackclient.identity import common as identity_common
LOG = logging.getLogger(__name__)
@@ -163,13 +164,45 @@ class DeleteKeypair(command.Command):
class ListKeypair(command.Lister):
_description = _("List key fingerprints")
+ def get_parser(self, prog_name):
+ parser = super().get_parser(prog_name)
+ parser.add_argument(
+ '--user',
+ metavar='<user>',
+ help=_(
+ 'Show keypairs for another user (admin only) (name or ID). '
+ 'Requires ``--os-compute-api-version`` 2.10 or greater.'
+ ),
+ )
+ identity_common.add_user_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.user:
+ if compute_client.api_version < api_versions.APIVersion('2.10'):
+ msg = _(
+ '--os-compute-api-version 2.10 or greater is required to '
+ 'support the --user option'
+ )
+ raise exceptions.CommandError(msg)
+
+ kwargs['user_id'] = identity_common.find_user(
+ identity_client,
+ parsed_args.user,
+ parsed_args.user_domain,
+ ).id
+
+ data = compute_client.keypairs.list(**kwargs)
+
columns = (
"Name",
"Fingerprint"
)
- data = compute_client.keypairs.list()
if compute_client.api_version >= api_versions.APIVersion('2.2'):
columns += ("Type", )
diff --git a/openstackclient/tests/unit/compute/v2/test_keypair.py b/openstackclient/tests/unit/compute/v2/test_keypair.py
index ca3bfe7c..5e6a4741 100644
--- a/openstackclient/tests/unit/compute/v2/test_keypair.py
+++ b/openstackclient/tests/unit/compute/v2/test_keypair.py
@@ -13,6 +13,7 @@
# under the License.
#
+import copy
from unittest import mock
from unittest.mock import call
import uuid
@@ -23,6 +24,8 @@ from osc_lib import utils
from openstackclient.compute.v2 import keypair
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
+from openstackclient.tests.unit import fakes
+from openstackclient.tests.unit.identity.v2_0 import fakes as identity_fakes
from openstackclient.tests.unit import utils as tests_utils
@@ -307,6 +310,14 @@ class TestKeypairList(TestKeypair):
def setUp(self):
super(TestKeypairList, self).setUp()
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+ self.users_mock.get.return_value = fakes.FakeResource(
+ None,
+ copy.deepcopy(identity_fakes.USER),
+ loaded=True,
+ )
+
self.keypairs_mock.list.return_value = self.keypairs
# Get the command object to test
@@ -334,8 +345,8 @@ class TestKeypairList(TestKeypair):
)
def test_keypair_list_v22(self):
- self.app.client_manager.compute.api_version = api_versions.APIVersion(
- '2.2')
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.2')
arglist = []
verifylist = []
@@ -361,6 +372,57 @@ class TestKeypairList(TestKeypair):
tuple(data)
)
+ def test_keypair_list_with_user(self):
+
+ # Filtering by user is support for nova api 2.10 or above
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.10')
+
+ arglist = [
+ '--user', identity_fakes.user_name,
+ ]
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.users_mock.get.assert_called_with(identity_fakes.user_name)
+ self.keypairs_mock.list.assert_called_with(
+ user_id=identity_fakes.user_id,
+ )
+
+ self.assertEqual(('Name', 'Fingerprint', 'Type'), columns)
+ self.assertEqual(
+ ((
+ self.keypairs[0].name,
+ self.keypairs[0].fingerprint,
+ self.keypairs[0].type,
+ ), ),
+ tuple(data)
+ )
+
+ def test_keypair_list_with_user_pre_v210(self):
+
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.9')
+
+ arglist = [
+ '--user', identity_fakes.user_name,
+ ]
+ verifylist = [
+ ('user', identity_fakes.user_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+ self.assertIn(
+ '--os-compute-api-version 2.10 or greater is required', str(ex))
+
class TestKeypairShow(TestKeypair):