Add min-disk and min-ram filters to list flavors

The Nova API allows user filter flavors by minDisk and minRam,
but that is not implemented in the current novaclient yet.
This patch introduce '--min-disk' and '--min-ram' options to support
it. In addition, We also append '--sort-key' and '--sort-dir' to
the flavor-list subcommand to support sort the result list.

Change-Id: I3849cc2d73057170dc224fa86b724f5141ca9a23
Closes-Bug: #1647867
This commit is contained in:
int32bit 2016-12-07 13:37:50 +08:00
parent 57c397d822
commit b7edc92d81
4 changed files with 60 additions and 4 deletions

View File

@ -51,6 +51,16 @@ class FlavorsTest(utils.TestCase):
self.assert_request_id(fl, fakes.FAKE_REQUEST_ID_LIST)
self.cs.assert_called('GET', '/flavors/detail?limit=4&marker=1234')
def test_list_flavors_with_min_disk(self):
fl = self.cs.flavors.list(min_disk=20)
self.assert_request_id(fl, fakes.FAKE_REQUEST_ID_LIST)
self.cs.assert_called('GET', '/flavors/detail?minDisk=20')
def test_list_flavors_with_min_ram(self):
fl = self.cs.flavors.list(min_ram=512)
self.assert_request_id(fl, fakes.FAKE_REQUEST_ID_LIST)
self.cs.assert_called('GET', '/flavors/detail?minRam=512')
def test_list_flavors_with_sort_key_dir(self):
fl = self.cs.flavors.list(sort_key='id', sort_dir='asc')
self.assert_request_id(fl, fakes.FAKE_REQUEST_ID_LIST)

View File

@ -1033,6 +1033,18 @@ class ShellTest(utils.TestCase):
self.run_command('flavor-list --marker 1 --limit 2')
self.assert_called('GET', '/flavors/detail?limit=2&marker=1')
def test_flavor_list_with_min_disk(self):
self.run_command('flavor-list --min-disk 20')
self.assert_called('GET', '/flavors/detail?minDisk=20')
def test_flavor_list_with_min_ram(self):
self.run_command('flavor-list --min-ram 512')
self.assert_called('GET', '/flavors/detail?minRam=512')
def test_flavor_list_with_sort_key_dir(self):
self.run_command('flavor-list --sort-key id --sort-dir asc')
self.assert_called('GET', '/flavors/detail?sort_dir=asc&sort_key=id')
def test_flavor_show(self):
self.run_command('flavor-show 1')
self.assert_called_anytime('GET', '/flavors/1')

View File

@ -92,8 +92,8 @@ class FlavorManager(base.ManagerWithFind):
resource_class = Flavor
is_alphanum_id_allowed = True
def list(self, detailed=True, is_public=True, marker=None, limit=None,
sort_key=None, sort_dir=None):
def list(self, detailed=True, is_public=True, marker=None, min_disk=None,
min_ram=None, limit=None, sort_key=None, sort_dir=None):
"""Get a list of all flavors.
:param detailed: Whether flavor needs to be return with details
@ -103,6 +103,8 @@ class FlavorManager(base.ManagerWithFind):
access to all flavor types.
:param marker: Begin returning flavors that appear later in the flavor
list than that represented by this flavor id (optional).
:param min_disk: Filters the flavors by a minimum disk space, in GiB.
:param min_ram: Filters the flavors by a minimum RAM, in MB.
:param limit: maximum number of flavors to return (optional).
:param sort_key: Flavors list sort key (optional).
:param sort_dir: Flavors list sort direction (optional).
@ -114,6 +116,10 @@ class FlavorManager(base.ManagerWithFind):
# and flavors from their own projects only.
if marker:
qparams['marker'] = str(marker)
if min_disk:
qparams['minDisk'] = int(min_disk)
if min_ram:
qparams['minRam'] = int(min_ram)
if limit:
qparams['limit'] = int(limit)
if sort_key:

View File

@ -864,6 +864,18 @@ def _print_flavor_list(flavors, show_extra_specs=False):
default=None,
help=_('The last flavor ID of the previous page; displays list of flavors'
' after "marker".'))
@utils.arg(
'--min-disk',
dest='min_disk',
metavar='<min-disk>',
default=None,
help=_('Filters the flavors by a minimum disk space, in GiB.'))
@utils.arg(
'--min-ram',
dest='min_ram',
metavar='<min-ram>',
default=None,
help=_('Filters the flavors by a minimum RAM, in MB.'))
@utils.arg(
'--limit',
dest='limit',
@ -873,12 +885,28 @@ def _print_flavor_list(flavors, show_extra_specs=False):
help=_("Maximum number of flavors to display. If limit is bigger than "
"'osapi_max_limit' option of Nova API, limit 'osapi_max_limit' "
"will be used instead."))
@utils.arg(
'--sort-key',
dest='sort_key',
metavar='<sort-key>',
default=None,
help=_('Flavors list sort key.'))
@utils.arg(
'--sort-dir',
dest='sort_dir',
metavar='<sort-dir>',
default=None,
help=_('Flavors list sort direction.'))
def do_flavor_list(cs, args):
"""Print a list of available 'flavors' (sizes of servers)."""
if args.all:
flavors = cs.flavors.list(is_public=None)
flavors = cs.flavors.list(is_public=None, min_disk=args.min_disk,
min_ram=args.min_ram, sort_key=args.sort_key,
sort_dir=args.sort_dir)
else:
flavors = cs.flavors.list(marker=args.marker, limit=args.limit)
flavors = cs.flavors.list(marker=args.marker, min_disk=args.min_disk,
min_ram=args.min_ram, sort_key=args.sort_key,
sort_dir=args.sort_dir, limit=args.limit)
_print_flavor_list(flavors, args.extra_specs)