Skip to content

Commit 7fdbc6b

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add support for 'keypairs list --user' parameter"
2 parents 987af4e + 98a0016 commit 7fdbc6b

3 files changed

Lines changed: 104 additions & 3 deletions

File tree

openstackclient/compute/v2/keypair.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from osc_lib import utils
2727

2828
from openstackclient.i18n import _
29+
from openstackclient.identity import common as identity_common
2930

3031

3132
LOG = logging.getLogger(__name__)
@@ -163,13 +164,45 @@ def take_action(self, parsed_args):
163164
class ListKeypair(command.Lister):
164165
_description = _("List key fingerprints")
165166

167+
def get_parser(self, prog_name):
168+
parser = super().get_parser(prog_name)
169+
parser.add_argument(
170+
'--user',
171+
metavar='<user>',
172+
help=_(
173+
'Show keypairs for another user (admin only) (name or ID). '
174+
'Requires ``--os-compute-api-version`` 2.10 or greater.'
175+
),
176+
)
177+
identity_common.add_user_domain_option_to_parser(parser)
178+
return parser
179+
166180
def take_action(self, parsed_args):
167181
compute_client = self.app.client_manager.compute
182+
identity_client = self.app.client_manager.identity
183+
184+
kwargs = {}
185+
186+
if parsed_args.user:
187+
if compute_client.api_version < api_versions.APIVersion('2.10'):
188+
msg = _(
189+
'--os-compute-api-version 2.10 or greater is required to '
190+
'support the --user option'
191+
)
192+
raise exceptions.CommandError(msg)
193+
194+
kwargs['user_id'] = identity_common.find_user(
195+
identity_client,
196+
parsed_args.user,
197+
parsed_args.user_domain,
198+
).id
199+
200+
data = compute_client.keypairs.list(**kwargs)
201+
168202
columns = (
169203
"Name",
170204
"Fingerprint"
171205
)
172-
data = compute_client.keypairs.list()
173206

174207
if compute_client.api_version >= api_versions.APIVersion('2.2'):
175208
columns += ("Type", )

openstackclient/tests/unit/compute/v2/test_keypair.py

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# under the License.
1414
#
1515

16+
import copy
1617
from unittest import mock
1718
from unittest.mock import call
1819
import uuid
@@ -23,6 +24,8 @@
2324

2425
from openstackclient.compute.v2 import keypair
2526
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
27+
from openstackclient.tests.unit import fakes
28+
from openstackclient.tests.unit.identity.v2_0 import fakes as identity_fakes
2629
from openstackclient.tests.unit import utils as tests_utils
2730

2831

@@ -307,6 +310,14 @@ class TestKeypairList(TestKeypair):
307310
def setUp(self):
308311
super(TestKeypairList, self).setUp()
309312

313+
self.users_mock = self.app.client_manager.identity.users
314+
self.users_mock.reset_mock()
315+
self.users_mock.get.return_value = fakes.FakeResource(
316+
None,
317+
copy.deepcopy(identity_fakes.USER),
318+
loaded=True,
319+
)
320+
310321
self.keypairs_mock.list.return_value = self.keypairs
311322

312323
# Get the command object to test
@@ -334,8 +345,8 @@ def test_keypair_list_no_options(self):
334345
)
335346

336347
def test_keypair_list_v22(self):
337-
self.app.client_manager.compute.api_version = api_versions.APIVersion(
338-
'2.2')
348+
self.app.client_manager.compute.api_version = \
349+
api_versions.APIVersion('2.2')
339350

340351
arglist = []
341352
verifylist = []
@@ -361,6 +372,57 @@ def test_keypair_list_v22(self):
361372
tuple(data)
362373
)
363374

375+
def test_keypair_list_with_user(self):
376+
377+
# Filtering by user is support for nova api 2.10 or above
378+
self.app.client_manager.compute.api_version = \
379+
api_versions.APIVersion('2.10')
380+
381+
arglist = [
382+
'--user', identity_fakes.user_name,
383+
]
384+
verifylist = [
385+
('user', identity_fakes.user_name),
386+
]
387+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
388+
389+
columns, data = self.cmd.take_action(parsed_args)
390+
391+
self.users_mock.get.assert_called_with(identity_fakes.user_name)
392+
self.keypairs_mock.list.assert_called_with(
393+
user_id=identity_fakes.user_id,
394+
)
395+
396+
self.assertEqual(('Name', 'Fingerprint', 'Type'), columns)
397+
self.assertEqual(
398+
((
399+
self.keypairs[0].name,
400+
self.keypairs[0].fingerprint,
401+
self.keypairs[0].type,
402+
), ),
403+
tuple(data)
404+
)
405+
406+
def test_keypair_list_with_user_pre_v210(self):
407+
408+
self.app.client_manager.compute.api_version = \
409+
api_versions.APIVersion('2.9')
410+
411+
arglist = [
412+
'--user', identity_fakes.user_name,
413+
]
414+
verifylist = [
415+
('user', identity_fakes.user_name),
416+
]
417+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
418+
419+
ex = self.assertRaises(
420+
exceptions.CommandError,
421+
self.cmd.take_action,
422+
parsed_args)
423+
self.assertIn(
424+
'--os-compute-api-version 2.10 or greater is required', str(ex))
425+
364426

365427
class TestKeypairShow(TestKeypair):
366428

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
It is now possible to list the keypairs for a specific user using the
5+
``--user`` parameter. This is an admin-only action by default and requires
6+
Compute API microversion 2.10 or later.

0 commit comments

Comments
 (0)