compute: Add missing options for 'hypervisor list'

Yet more pagination parameters.

Change-Id: I9f0145c89ddc49c1d907e6e6e294319cf80fc6ff
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2020-12-03 13:07:03 +00:00
parent ca7f23d0d1
commit 262e525aad
3 changed files with 157 additions and 7 deletions

View File

@ -22,6 +22,7 @@ from novaclient import api_versions
from novaclient import exceptions as nova_exceptions from novaclient import exceptions as nova_exceptions
from osc_lib.cli import format_columns from osc_lib.cli import format_columns
from osc_lib.command import command from osc_lib.command import command
from osc_lib import exceptions
from osc_lib import utils from osc_lib import utils
from openstackclient.i18n import _ from openstackclient.i18n import _
@ -33,10 +34,31 @@ class ListHypervisor(command.Lister):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(ListHypervisor, self).get_parser(prog_name) parser = super(ListHypervisor, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"--matching", '--matching',
metavar="<hostname>", metavar='<hostname>',
help=_("Filter hypervisors using <hostname> substring") help=_("Filter hypervisors using <hostname> substring")
) )
parser.add_argument(
'--marker',
metavar='<marker>',
help=_(
"The UUID of the last hypervisor of the previous page; "
"displays list of hypervisors after 'marker'. "
"(supported with --os-compute-api-version 2.33 or above)"
),
)
parser.add_argument(
'--limit',
metavar='<limit>',
type=int,
help=_(
"Maximum number of hypervisors to display. Note that there "
"is a configurable max limit on the server, and the limit "
"that is used will be the minimum of what is requested "
"here and what is configured in the server. "
"(supported with --os-compute-api-version 2.33 or above)"
),
)
parser.add_argument( parser.add_argument(
'--long', '--long',
action='store_true', action='store_true',
@ -46,6 +68,33 @@ class ListHypervisor(command.Lister):
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute compute_client = self.app.client_manager.compute
list_opts = {}
if parsed_args.matching and (parsed_args.marker or parsed_args.limit):
msg = _(
'--matching is not compatible with --marker or --limit'
)
raise exceptions.CommandError(msg)
if parsed_args.marker:
if compute_client.api_version < api_versions.APIVersion('2.33'):
msg = _(
'--os-compute-api-version 2.33 or greater is required to '
'support the --marker option'
)
raise exceptions.CommandError(msg)
list_opts['marker'] = parsed_args.marker
if parsed_args.limit:
if compute_client.api_version < api_versions.APIVersion('2.33'):
msg = _(
'--os-compute-api-version 2.33 or greater is required to '
'support the --limit option'
)
raise exceptions.CommandError(msg)
list_opts['limit'] = parsed_args.limit
columns = ( columns = (
"ID", "ID",
"Hypervisor Hostname", "Hypervisor Hostname",
@ -59,12 +108,12 @@ class ListHypervisor(command.Lister):
if parsed_args.matching: if parsed_args.matching:
data = compute_client.hypervisors.search(parsed_args.matching) data = compute_client.hypervisors.search(parsed_args.matching)
else: else:
data = compute_client.hypervisors.list() data = compute_client.hypervisors.list(**list_opts)
return (columns, return (
(utils.get_item_properties( columns,
s, columns, (utils.get_item_properties(s, columns) for s in data),
) for s in data)) )
class ShowHypervisor(command.ShowOne): class ShowHypervisor(command.ShowOne):

View File

@ -173,6 +173,30 @@ class TestHypervisorList(TestHypervisor):
self.cmd.take_action, self.cmd.take_action,
parsed_args) parsed_args)
def test_hypervisor_list_with_matching_and_pagination_options(self):
self.app.client_manager.compute.api_version = \
api_versions.APIVersion('2.32')
arglist = [
'--matching', self.hypervisors[0].hypervisor_hostname,
'--limit', '1',
'--marker', self.hypervisors[0].hypervisor_hostname,
]
verifylist = [
('matching', self.hypervisors[0].hypervisor_hostname),
('limit', 1),
('marker', self.hypervisors[0].hypervisor_hostname),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises(
exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertIn(
'--matching is not compatible with --marker or --limit', str(ex))
def test_hypervisor_list_long_option(self): def test_hypervisor_list_long_option(self):
arglist = [ arglist = [
'--long', '--long',
@ -191,6 +215,78 @@ class TestHypervisorList(TestHypervisor):
self.assertEqual(self.columns_long, columns) self.assertEqual(self.columns_long, columns)
self.assertEqual(self.data_long, tuple(data)) self.assertEqual(self.data_long, tuple(data))
def test_hypervisor_list_with_limit(self):
self.app.client_manager.compute.api_version = \
api_versions.APIVersion('2.33')
arglist = [
'--limit', '1',
]
verifylist = [
('limit', 1),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.hypervisors_mock.list.assert_called_with(limit=1)
def test_hypervisor_list_with_limit_pre_v233(self):
self.app.client_manager.compute.api_version = \
api_versions.APIVersion('2.32')
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.33 or greater is required', str(ex))
def test_hypervisor_list_with_marker(self):
self.app.client_manager.compute.api_version = \
api_versions.APIVersion('2.33')
arglist = [
'--marker', 'test_hyp',
]
verifylist = [
('marker', 'test_hyp'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.hypervisors_mock.list.assert_called_with(marker='test_hyp')
def test_hypervisor_list_with_marker_pre_v233(self):
self.app.client_manager.compute.api_version = \
api_versions.APIVersion('2.32')
arglist = [
'--marker', 'test_hyp',
]
verifylist = [
('marker', 'test_hyp'),
]
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.33 or greater is required', str(ex))
class TestHypervisorShow(TestHypervisor): class TestHypervisorShow(TestHypervisor):

View File

@ -0,0 +1,5 @@
---
features:
- |
Add ``--limit`` and ``--marker`` options to ``hypervisor list`` command, to
configure pagination of results.