Skip to content

Commit fc24142

Browse files
committed
compute: Add missing options for 'keypair list'
Add pagination parameters, '--limit' and '--marker'. This isn't compatible with our client-side '--project' parameter so we error out for that. Change-Id: I403cf0fb7aabad4a3dfda5adae62d47ecf7faf5c Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
1 parent 8a0f3fc commit fc24142

3 files changed

Lines changed: 117 additions & 3 deletions

File tree

openstackclient/compute/v2/keypair.py

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,12 +249,43 @@ def get_parser(self, prog_name):
249249
),
250250
)
251251
identity_common.add_project_domain_option_to_parser(parser)
252+
parser.add_argument(
253+
'--marker',
254+
help=_('The last keypair ID of the previous page'),
255+
)
256+
parser.add_argument(
257+
'--limit',
258+
type=int,
259+
help=_('Maximum number of keypairs to display'),
260+
)
252261
return parser
253262

254263
def take_action(self, parsed_args):
255264
compute_client = self.app.client_manager.sdk_connection.compute
256265
identity_client = self.app.client_manager.identity
257266

267+
kwargs = {}
268+
269+
if parsed_args.marker:
270+
if not sdk_utils.supports_microversion(compute_client, '2.35'):
271+
msg = _(
272+
'--os-compute-api-version 2.35 or greater is required '
273+
'to support the --marker option'
274+
)
275+
raise exceptions.CommandError(msg)
276+
277+
kwargs['marker'] = parsed_args.marker
278+
279+
if parsed_args.limit:
280+
if not sdk_utils.supports_microversion(compute_client, '2.35'):
281+
msg = _(
282+
'--os-compute-api-version 2.35 or greater is required '
283+
'to support the --limit option'
284+
)
285+
raise exceptions.CommandError(msg)
286+
287+
kwargs['limit'] = parsed_args.limit
288+
258289
if parsed_args.project:
259290
if not sdk_utils.supports_microversion(compute_client, '2.10'):
260291
msg = _(
@@ -263,6 +294,14 @@ def take_action(self, parsed_args):
263294
)
264295
raise exceptions.CommandError(msg)
265296

297+
if parsed_args.marker:
298+
# NOTE(stephenfin): Because we're doing this client-side, we
299+
# can't really rely on the marker, because we don't know what
300+
# user the marker is associated with
301+
msg = _(
302+
'--project is not compatible with --marker'
303+
)
304+
266305
# NOTE(stephenfin): This is done client side because nova doesn't
267306
# currently support doing so server-side. If this is slow, we can
268307
# think about spinning up a threadpool or similar.
@@ -275,7 +314,8 @@ def take_action(self, parsed_args):
275314

276315
data = []
277316
for user in users:
278-
data.extend(compute_client.keypairs(user_id=user.id))
317+
kwargs['user_id'] = user.id
318+
data.extend(compute_client.keypairs(**kwargs))
279319
elif parsed_args.user:
280320
if not sdk_utils.supports_microversion(compute_client, '2.10'):
281321
msg = _(
@@ -289,10 +329,11 @@ def take_action(self, parsed_args):
289329
parsed_args.user,
290330
parsed_args.user_domain,
291331
)
332+
kwargs['user_id'] = user.id
292333

293-
data = compute_client.keypairs(user_id=user.id)
334+
data = compute_client.keypairs(**kwargs)
294335
else:
295-
data = compute_client.keypairs()
336+
data = compute_client.keypairs(**kwargs)
296337

297338
columns = (
298339
"Name",

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

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,74 @@ def test_keypair_list_conflicting_user_options(self):
569569
tests_utils.ParserException,
570570
self.check_parser, self.cmd, arglist, None)
571571

572+
@mock.patch.object(
573+
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True))
574+
def test_keypair_list_with_limit(self):
575+
arglist = [
576+
'--limit', '1',
577+
]
578+
verifylist = [
579+
('limit', 1),
580+
]
581+
582+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
583+
self.cmd.take_action(parsed_args)
584+
585+
self.sdk_client.keypairs.assert_called_with(limit=1)
586+
587+
@mock.patch.object(
588+
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False))
589+
def test_keypair_list_with_limit_pre_v235(self):
590+
arglist = [
591+
'--limit', '1',
592+
]
593+
verifylist = [
594+
('limit', 1),
595+
]
596+
597+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
598+
ex = self.assertRaises(
599+
exceptions.CommandError,
600+
self.cmd.take_action,
601+
parsed_args)
602+
603+
self.assertIn(
604+
'--os-compute-api-version 2.35 or greater is required', str(ex))
605+
606+
@mock.patch.object(
607+
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True))
608+
def test_keypair_list_with_marker(self):
609+
arglist = [
610+
'--marker', 'test_kp',
611+
]
612+
verifylist = [
613+
('marker', 'test_kp'),
614+
]
615+
616+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
617+
self.cmd.take_action(parsed_args)
618+
619+
self.sdk_client.keypairs.assert_called_with(marker='test_kp')
620+
621+
@mock.patch.object(
622+
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False))
623+
def test_keypair_list_with_marker_pre_v235(self):
624+
arglist = [
625+
'--marker', 'test_kp',
626+
]
627+
verifylist = [
628+
('marker', 'test_kp'),
629+
]
630+
631+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
632+
ex = self.assertRaises(
633+
exceptions.CommandError,
634+
self.cmd.take_action,
635+
parsed_args)
636+
637+
self.assertIn(
638+
'--os-compute-api-version 2.35 or greater is required', str(ex))
639+
572640

573641
class TestKeypairShow(TestKeypair):
574642

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add ``--limit`` and ``--marker`` options to ``keypair list`` command, to
5+
configure pagination of results.

0 commit comments

Comments
 (0)