summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatiana Ovchinnikova <t.v.ovtchinnikova@gmail.com>2022-06-27 09:52:48 -0500
committerTatiana Ovchinnikova <t.v.ovtchinnikova@gmail.com>2022-10-06 16:23:10 +0000
commit09dfd37ab5df683d91f642c86374d40a879fe6d2 (patch)
treed0423b5878b1fd83d4d4efcb25badcd7c2eac1ba
parenta9ae00b16453b4d0ff1803651fe726da55a3f08d (diff)
downloadhorizon-09dfd37ab5df683d91f642c86374d40a879fe6d2.tar.gz
Fix flavor specification at instance overview page
The details page uses flavor id to resolve instance flavor, relying on legacy Nova API v2.46. This patch adds the current Nova API option, resolving instance flavor by flavor name, so flavor specification at instance overview page is displayed properly. Change-Id: I1fe45063c9d1cdd8682998329d81f843d30f80b3 (cherry picked from commit d0e9e976f2769b289196d481b0928893b702b011)
-rw-r--r--openstack_dashboard/dashboards/project/instances/tests.py24
-rw-r--r--openstack_dashboard/dashboards/project/instances/views.py11
2 files changed, 30 insertions, 5 deletions
diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py
index 12ac3fcf9..93151a410 100644
--- a/openstack_dashboard/dashboards/project/instances/tests.py
+++ b/openstack_dashboard/dashboards/project/instances/tests.py
@@ -1325,6 +1325,7 @@ class InstanceDetailTests(InstanceTestBase):
"server_get",
"instance_volumes_list",
"flavor_get",
+ "flavor_list",
'is_feature_available',
),
api.neutron: (
@@ -1337,7 +1338,7 @@ class InstanceDetailTests(InstanceTestBase):
def _get_instance_details(self, server, qs=None,
flavor_return=None, volumes_return=None,
security_groups_return=None,
- flavor_exception=False):
+ flavor_exception=False, nova_api_ge_2_47=False):
url = reverse('horizon:project:instances:detail', args=[server.id])
if qs:
@@ -1372,8 +1373,12 @@ class InstanceDetailTests(InstanceTestBase):
helpers.IsHttpRequest(), mock.ANY)
self.mock_instance_volumes_list.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
- self.mock_flavor_get.assert_called_once_with(
- helpers.IsHttpRequest(), server.flavor['id'])
+ if nova_api_ge_2_47:
+ self.mock_flavor_list.assert_called_once_with(
+ helpers.IsHttpRequest())
+ else:
+ self.mock_flavor_get.assert_called_once_with(
+ helpers.IsHttpRequest(), server.flavor['id'])
self.mock_server_security_groups.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
self.mock_floating_ip_simple_associate_supported \
@@ -1557,6 +1562,19 @@ class InstanceDetailTests(InstanceTestBase):
self.mock_is_extension_supported.assert_called_once_with(
helpers.IsHttpRequest(), 'mac-learning')
+ @helpers.create_mocks({api.neutron: ['is_extension_supported']})
+ def test_instance_details_nova_api_ge_2_47(self):
+ server = self.servers.first()
+ server.flavor = {
+ 'original_name': 'm1.tiny',
+ }
+ self.mock_is_extension_supported.return_value = False
+ res = self._get_instance_details(server, nova_api_ge_2_47=True)
+ self.assertTemplateUsed(res,
+ 'project/instances/_detail_overview.html')
+ self.mock_is_extension_supported.assert_called_once_with(
+ helpers.IsHttpRequest(), 'mac-learning')
+
@helpers.create_mocks({api.nova: ['server_console_output'],
api.neutron: ['is_extension_supported']})
def test_instance_log(self):
diff --git a/openstack_dashboard/dashboards/project/instances/views.py b/openstack_dashboard/dashboards/project/instances/views.py
index bbd8e2828..c1c3ae432 100644
--- a/openstack_dashboard/dashboards/project/instances/views.py
+++ b/openstack_dashboard/dashboards/project/instances/views.py
@@ -506,9 +506,16 @@ class DetailView(tabs.TabView):
def _get_flavor(self, instance):
instance_id = instance.id
+ flavor_id = instance.flavor.get('id')
try:
- instance.full_flavor = api.nova.flavor_get(
- self.request, instance.flavor["id"])
+ if flavor_id: # Nova API <= 2.46
+ instance.full_flavor = api.nova.flavor_get(
+ self.request, flavor_id)
+ else:
+ flavors = api.nova.flavor_list(self.request)
+ flavor_name_dict = dict((str(f.name), f) for f in flavors)
+ instance.full_flavor = \
+ flavor_name_dict[instance.flavor['original_name']]
except Exception:
msg = _('Unable to retrieve flavor information for instance '
'"%(name)s" (%(id)s).') % {'name': instance.name,