summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/keypair.py47
-rw-r--r--openstackclient/tests/unit/compute/v2/test_keypair.py68
2 files changed, 112 insertions, 3 deletions
diff --git a/openstackclient/compute/v2/keypair.py b/openstackclient/compute/v2/keypair.py
index 19e30bff..7dabf78d 100644
--- a/openstackclient/compute/v2/keypair.py
+++ b/openstackclient/compute/v2/keypair.py
@@ -249,12 +249,43 @@ class ListKeypair(command.Lister):
),
)
identity_common.add_project_domain_option_to_parser(parser)
+ parser.add_argument(
+ '--marker',
+ help=_('The last keypair ID of the previous page'),
+ )
+ parser.add_argument(
+ '--limit',
+ type=int,
+ help=_('Maximum number of keypairs to display'),
+ )
return parser
def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute
identity_client = self.app.client_manager.identity
+ kwargs = {}
+
+ if parsed_args.marker:
+ if not sdk_utils.supports_microversion(compute_client, '2.35'):
+ msg = _(
+ '--os-compute-api-version 2.35 or greater is required '
+ 'to support the --marker option'
+ )
+ raise exceptions.CommandError(msg)
+
+ kwargs['marker'] = parsed_args.marker
+
+ if parsed_args.limit:
+ if not sdk_utils.supports_microversion(compute_client, '2.35'):
+ msg = _(
+ '--os-compute-api-version 2.35 or greater is required '
+ 'to support the --limit option'
+ )
+ raise exceptions.CommandError(msg)
+
+ kwargs['limit'] = parsed_args.limit
+
if parsed_args.project:
if not sdk_utils.supports_microversion(compute_client, '2.10'):
msg = _(
@@ -263,6 +294,14 @@ class ListKeypair(command.Lister):
)
raise exceptions.CommandError(msg)
+ if parsed_args.marker:
+ # NOTE(stephenfin): Because we're doing this client-side, we
+ # can't really rely on the marker, because we don't know what
+ # user the marker is associated with
+ msg = _(
+ '--project is not compatible with --marker'
+ )
+
# 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.
@@ -275,7 +314,8 @@ class ListKeypair(command.Lister):
data = []
for user in users:
- data.extend(compute_client.keypairs(user_id=user.id))
+ kwargs['user_id'] = user.id
+ data.extend(compute_client.keypairs(**kwargs))
elif parsed_args.user:
if not sdk_utils.supports_microversion(compute_client, '2.10'):
msg = _(
@@ -289,10 +329,11 @@ class ListKeypair(command.Lister):
parsed_args.user,
parsed_args.user_domain,
)
+ kwargs['user_id'] = user.id
- data = compute_client.keypairs(user_id=user.id)
+ data = compute_client.keypairs(**kwargs)
else:
- data = compute_client.keypairs()
+ data = compute_client.keypairs(**kwargs)
columns = (
"Name",
diff --git a/openstackclient/tests/unit/compute/v2/test_keypair.py b/openstackclient/tests/unit/compute/v2/test_keypair.py
index 5a17808f..65d9396a 100644
--- a/openstackclient/tests/unit/compute/v2/test_keypair.py
+++ b/openstackclient/tests/unit/compute/v2/test_keypair.py
@@ -569,6 +569,74 @@ class TestKeypairList(TestKeypair):
tests_utils.ParserException,
self.check_parser, self.cmd, arglist, None)
+ @mock.patch.object(
+ sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True))
+ def test_keypair_list_with_limit(self):
+ arglist = [
+ '--limit', '1',
+ ]
+ verifylist = [
+ ('limit', 1),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+
+ self.sdk_client.keypairs.assert_called_with(limit=1)
+
+ @mock.patch.object(
+ sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False))
+ def test_keypair_list_with_limit_pre_v235(self):
+ arglist = [
+ '--limit', '1',
+ ]
+ verifylist = [
+ ('limit', 1),
+ ]
+
+ 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.35 or greater is required', str(ex))
+
+ @mock.patch.object(
+ sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True))
+ def test_keypair_list_with_marker(self):
+ arglist = [
+ '--marker', 'test_kp',
+ ]
+ verifylist = [
+ ('marker', 'test_kp'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+
+ self.sdk_client.keypairs.assert_called_with(marker='test_kp')
+
+ @mock.patch.object(
+ sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False))
+ def test_keypair_list_with_marker_pre_v235(self):
+ arglist = [
+ '--marker', 'test_kp',
+ ]
+ verifylist = [
+ ('marker', 'test_kp'),
+ ]
+
+ 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.35 or greater is required', str(ex))
+
class TestKeypairShow(TestKeypair):