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>
This commit is contained in:
parent
8a0f3fc6a8
commit
fc24142ed4
@ -249,12 +249,43 @@ class ListKeypair(command.Lister):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
identity_common.add_project_domain_option_to_parser(parser)
|
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
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
compute_client = self.app.client_manager.sdk_connection.compute
|
compute_client = self.app.client_manager.sdk_connection.compute
|
||||||
identity_client = self.app.client_manager.identity
|
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 parsed_args.project:
|
||||||
if not sdk_utils.supports_microversion(compute_client, '2.10'):
|
if not sdk_utils.supports_microversion(compute_client, '2.10'):
|
||||||
msg = _(
|
msg = _(
|
||||||
@ -263,6 +294,14 @@ class ListKeypair(command.Lister):
|
|||||||
)
|
)
|
||||||
raise exceptions.CommandError(msg)
|
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
|
# NOTE(stephenfin): This is done client side because nova doesn't
|
||||||
# currently support doing so server-side. If this is slow, we can
|
# currently support doing so server-side. If this is slow, we can
|
||||||
# think about spinning up a threadpool or similar.
|
# think about spinning up a threadpool or similar.
|
||||||
@ -275,7 +314,8 @@ class ListKeypair(command.Lister):
|
|||||||
|
|
||||||
data = []
|
data = []
|
||||||
for user in users:
|
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:
|
elif parsed_args.user:
|
||||||
if not sdk_utils.supports_microversion(compute_client, '2.10'):
|
if not sdk_utils.supports_microversion(compute_client, '2.10'):
|
||||||
msg = _(
|
msg = _(
|
||||||
@ -289,10 +329,11 @@ class ListKeypair(command.Lister):
|
|||||||
parsed_args.user,
|
parsed_args.user,
|
||||||
parsed_args.user_domain,
|
parsed_args.user_domain,
|
||||||
)
|
)
|
||||||
|
kwargs['user_id'] = user.id
|
||||||
|
|
||||||
data = compute_client.keypairs(user_id=user.id)
|
data = compute_client.keypairs(**kwargs)
|
||||||
else:
|
else:
|
||||||
data = compute_client.keypairs()
|
data = compute_client.keypairs(**kwargs)
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
"Name",
|
"Name",
|
||||||
|
@ -569,6 +569,74 @@ class TestKeypairList(TestKeypair):
|
|||||||
tests_utils.ParserException,
|
tests_utils.ParserException,
|
||||||
self.check_parser, self.cmd, arglist, None)
|
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):
|
class TestKeypairShow(TestKeypair):
|
||||||
|
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Add ``--limit`` and ``--marker`` options to ``keypair list`` command, to
|
||||||
|
configure pagination of results.
|
Loading…
Reference in New Issue
Block a user