Get flavor list sorted when launching instance

Currently, the flavor list is random on the panel of booting
instance, which is not a good experience for end user. This
patch fixes it and adds test accordingly.

Closes-Bug: #1715042

Change-Id: Id5369ab75487d214a3395ba507b4394d4497903e
This commit is contained in:
Feilong Wang 2017-08-29 15:57:27 +12:00
parent a3cc0625a6
commit cf06d278af
3 changed files with 27 additions and 7 deletions

View File

@ -25,6 +25,8 @@ from openstack_dashboard import api
from openstack_dashboard.api.rest import json_encoder
from openstack_dashboard.api.rest import urls
from openstack_dashboard.api.rest import utils as rest_utils
from openstack_dashboard.dashboards.project.instances \
import utils as instances_utils
from openstack_dashboard.usage import quotas
@ -543,6 +545,8 @@ class Flavors(generic.View):
get_extras = bool(get_extras and get_extras.lower() == 'true')
flavors = api.nova.flavor_list(request, is_public=is_public,
get_extras=get_extras)
flavors = instances_utils.sort_flavor_list(request, flavors,
with_menu_label=False)
result = {'items': []}
for flavor in flavors:
d = flavor.to_dict()

View File

@ -34,7 +34,7 @@ def flavor_list(request):
return []
def sort_flavor_list(request, flavors):
def sort_flavor_list(request, flavors, with_menu_label=True):
"""Utility method to sort a list of flavors.
By default, returns the available flavors, sorted by RAM usage (ascending).
@ -57,8 +57,12 @@ def sort_flavor_list(request, flavors):
return get_key(flavor, sort_key)
else:
key = sort_key
flavor_list = [(flavor.id, '%s' % flavor.name)
for flavor in sorted(flavors, key=key, reverse=rev)]
if with_menu_label:
flavor_list = [(flavor.id, '%s' % flavor.name)
for flavor in sorted(flavors, key=key, reverse=rev)]
else:
flavor_list = sorted(flavors, key=key, reverse=rev)
return flavor_list
except Exception:
exceptions.handle(request,

View File

@ -26,6 +26,19 @@ from openstack_dashboard.test import helpers as test
from openstack_dashboard.usage import quotas
# NOTE(flwang): mock.Mock and mock.MagicMock do not support sort, so the test
# case involved sorted will fail. This fake class is for the flavor test cases
# related to sort.
class FakeFlavor(object):
def __init__(self, id, ram=1):
self.id = id
self.ram = ram
self.extras = {}
def to_dict(self):
return {"id": self.id}
class NovaRestTestCase(test.TestCase):
#
@ -761,8 +774,7 @@ class NovaRestTestCase(test.TestCase):
else:
request = self.mock_rest_request(GET={'is_public': 'fAlsE'})
self.mock_flavor_list.return_value = [
mock.Mock(**{'to_dict.return_value': {'id': '1'}}),
mock.Mock(**{'to_dict.return_value': {'id': '2'}}),
FakeFlavor("1"), FakeFlavor("2")
]
response = nova.Flavors().get(request)
self.assertStatusCode(response, 200)
@ -790,9 +802,9 @@ class NovaRestTestCase(test.TestCase):
get_extras = False
else:
request = self.mock_rest_request(GET={'get_extras': 'fAlsE'})
self.mock_flavor_list.return_value = [
mock.Mock(**{'extras': {}, 'to_dict.return_value': {'id': '1'}}),
mock.Mock(**{'extras': {}, 'to_dict.return_value': {'id': '2'}}),
FakeFlavor("1"), FakeFlavor("2")
]
response = nova.Flavors().get(request)
self.assertStatusCode(response, 200)