From fada5d801c699da16e8e600d474a1da94fb7f4d2 Mon Sep 17 00:00:00 2001 From: Chris Behrens Date: Wed, 27 Jun 2012 17:20:49 +0000 Subject: Make nova list/show behave nicely on instance_type deletion One shouldn't remove an instance_type from the DB outright... but we should make the code behave nicely in the rare case. Fixes bug 1018500 Change-Id: If742070d7982889a56709ae058cd106e3a63114b --- nova/api/openstack/compute/views/servers.py | 7 ++++++- nova/tests/api/openstack/compute/test_servers.py | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/nova/api/openstack/compute/views/servers.py b/nova/api/openstack/compute/views/servers.py index f14773e98..b0c2fb2b2 100644 --- a/nova/api/openstack/compute/views/servers.py +++ b/nova/api/openstack/compute/views/servers.py @@ -179,7 +179,12 @@ class ViewBuilder(common.ViewBuilder): } def _get_flavor(self, request, instance): - flavor_id = instance["instance_type"]["flavorid"] + instance_type = instance["instance_type"] + if not instance_type: + LOG.warn(_("Instance has had its instance_type removed " + "from the DB"), instance=instance) + return {} + flavor_id = instance_type["flavorid"] flavor_bookmark = self._flavor_builder._get_bookmark_link(request, flavor_id, "flavors") diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py index 613747ce5..e1d898aeb 100644 --- a/nova/tests/api/openstack/compute/test_servers.py +++ b/nova/tests/api/openstack/compute/test_servers.py @@ -2849,6 +2849,19 @@ class ServersViewBuilderTest(test.TestCase): self.view_builder = views.servers.ViewBuilder() self.request = fakes.HTTPRequest.blank("/v2") + def test_get_flavor_valid_instance_type(self): + flavor_bookmark = "http://localhost/fake/flavors/1" + expected = {"id": "1", + "links": [{"rel": "bookmark", + "href": flavor_bookmark}]} + result = self.view_builder._get_flavor(self.request, self.instance) + self.assertEqual(result, expected) + + def test_get_flavor_deleted_instance_type(self): + self.instance['instance_type'] = {} + result = self.view_builder._get_flavor(self.request, self.instance) + self.assertEqual(result, {}) + def test_build_server(self): self_link = "http://localhost/v2/fake/servers/%s" % self.uuid bookmark_link = "http://localhost/fake/servers/%s" % self.uuid -- cgit