From 60a99fb039f605a27edbe9a4ee44ce31db5c4951 Mon Sep 17 00:00:00 2001 From: Lin Hua Cheng Date: Wed, 16 Oct 2013 13:08:01 -0700 Subject: [PATCH] Improve display of instance image information When instance is booted from volume image it returns a string, while for instance from image returns a dict. Fix is made to handle both cases. Change-Id: I23aeccd21f88a353222d3fc7dc4b5c337c2bfecb Closes-Bug: #1239896 --- .../dashboards/project/instances/tests.py | 39 +++++++++++++++++++ .../dashboards/project/instances/views.py | 12 ++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py index f982e40249b..9804787d86f 100644 --- a/openstack_dashboard/dashboards/project/instances/tests.py +++ b/openstack_dashboard/dashboards/project/instances/tests.py @@ -182,6 +182,45 @@ def test_index_flavor_get_exception(self): self.assertMessageCount(res, error=len(servers)) self.assertItemsEqual(instances, self.servers.list()) + @test.create_stubs({api.nova: ('flavor_list', + 'server_list', + 'tenant_absolute_limits', + 'extension_supported',), + api.glance: ('image_list_detailed',), + api.network: + ('floating_ip_simple_associate_supported',), + }) + def test_index_with_instance_booted_from_volume(self): + volume_server = self.servers.first() + volume_server.image = "" + volume_server.image_name = "(not found)" + servers = self.servers.list() + servers[0] = volume_server + + api.nova.extension_supported('AdminActions', + IsA(http.HttpRequest)) \ + .MultipleTimes().AndReturn(True) + api.nova.flavor_list(IsA(http.HttpRequest)) \ + .AndReturn(self.flavors.list()) + api.glance.image_list_detailed(IgnoreArg()) \ + .AndReturn((self.images.list(), False)) + search_opts = {'marker': None, 'paginate': True} + api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ + .AndReturn([servers, False]) + api.nova.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True) \ + .MultipleTimes().AndReturn(self.limits['absolute']) + api.network.floating_ip_simple_associate_supported( + IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) + + self.mox.ReplayAll() + + res = self.client.get(INDEX_URL) + + self.assertTemplateUsed(res, 'project/instances/index.html') + instances = res.context['instances_table'].data + self.assertEqual(len(instances), len(servers)) + self.assertContains(res, "(not found)") + @test.create_stubs({api.nova: ('server_list', 'flavor_list', 'server_delete',), diff --git a/openstack_dashboard/dashboards/project/instances/views.py b/openstack_dashboard/dashboards/project/instances/views.py index 368882c3a3e..4826d8a698c 100644 --- a/openstack_dashboard/dashboards/project/instances/views.py +++ b/openstack_dashboard/dashboards/project/instances/views.py @@ -88,9 +88,15 @@ def get_data(self): # Loop through instances to get flavor info. for instance in instances: - if (hasattr(instance, 'image') - and instance.image['id'] in image_map): - instance.image = image_map[instance.image['id']] + if hasattr(instance, 'image'): + # Instance from image returns dict + if isinstance(instance.image, dict): + if instance.image.get('id') in image_map: + instance.image = image_map[instance.image['id']] + else: + # Instance from volume returns a string + instance.image = {'name': + instance.image if instance.image else _("-")} try: flavor_id = instance.flavor["id"]