diff --git a/openstack_dashboard/api/nova.py b/openstack_dashboard/api/nova.py index e8f32f5adb..f5f344eb38 100644 --- a/openstack_dashboard/api/nova.py +++ b/openstack_dashboard/api/nova.py @@ -22,6 +22,7 @@ from __future__ import absolute_import import collections import logging +from operator import attrgetter from django.conf import settings from django.utils.translation import ugettext_lazy as _ @@ -920,7 +921,9 @@ def tenant_absolute_limits(request, reserved=False, tenant_id=None): @profiler.trace def availability_zone_list(request, detailed=False): - return novaclient(request).availability_zones.list(detailed=detailed) + zones = novaclient(request).availability_zones.list(detailed=detailed) + zones.sort(key=attrgetter('zoneName')) + return zones @profiler.trace diff --git a/openstack_dashboard/test/unit/api/test_nova.py b/openstack_dashboard/test/unit/api/test_nova.py index e6dcbc9fa1..cd0064083a 100644 --- a/openstack_dashboard/test/unit/api/test_nova.py +++ b/openstack_dashboard/test/unit/api/test_nova.py @@ -751,3 +751,17 @@ class ComputeApiTests(test.APIMockTestCase): for key in expected_keys: self.assertEqual(quota_data[key], ret_val.get(key).limit) novaclient.quotas.get.assert_called_once_with(tenant_id) + + @mock.patch.object(api.nova, 'novaclient') + def test_availability_zone_list(self, mock_novaclient): + novaclient = mock_novaclient.return_value + detailed = False + zones = [mock.Mock(zoneName='john'), mock.Mock(zoneName='sam'), + mock.Mock(zoneName='bob')] + novaclient.availability_zones.list.return_value = zones + + ret_val = api.nova.availability_zone_list(self.request, detailed) + self.assertEqual([zone.zoneName for zone in ret_val], + ['bob', 'john', 'sam']) + novaclient.availability_zones.list.assert_called_once_with( + detailed=detailed)