From 58f8f93b52e7de2d3751dd3291427a65a3c1079b Mon Sep 17 00:00:00 2001 From: Mark Washenberger Date: Fri, 10 Feb 2012 13:46:24 -0500 Subject: Handle network api failures more gracefully addresses bug 930329 Change-Id: Idb0934b9dd6ebc0e5e81495fb4454e4e50bc1f57 --- nova/api/openstack/common.py | 11 +++++++++-- nova/tests/api/openstack/test_common.py | 11 +++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index c19b8f103..a7ec48f70 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -27,6 +27,7 @@ from nova.api.openstack import wsgi from nova.api.openstack import xmlutil from nova.compute import vm_states from nova.compute import task_states +from nova import exception from nova import flags from nova import log as logging from nova import network @@ -333,10 +334,16 @@ def get_networks_for_instance(context, instance): # sqlalchemy FK (KeyError, AttributeError) # fail fall back to calling out the the # network api - network_api = network.API() + pass + network_api = network.API() + + try: nw_info = network_api.get_instance_nw_info(context, instance) - return get_networks_for_instance_from_nw_info(nw_info) + except exception.InstanceNotFound: + nw_info = [] + + return get_networks_for_instance_from_nw_info(nw_info) def raise_http_conflict_for_instance_invalid_state(exc, action): diff --git a/nova/tests/api/openstack/test_common.py b/nova/tests/api/openstack/test_common.py index e8f967976..6103b6d13 100644 --- a/nova/tests/api/openstack/test_common.py +++ b/nova/tests/api/openstack/test_common.py @@ -26,6 +26,7 @@ from webob import Request import xml.dom.minidom as minidom from nova import exception +from nova import network from nova import test from nova.api.openstack import common from nova.api.openstack import xmlutil @@ -328,6 +329,16 @@ class MiscFunctionsTest(test.TestCase): else: self.fail("webob.exc.HTTPConflict was not raised") + def test_get_networks_for_instance_handles_instance_not_found(self): + + def raise_not_found(*args, **kwargs): + raise exception.InstanceNotFound(instance_id='abcd') + + self.stubs.Set(network.API, 'get_instance_nw_info', raise_not_found) + + networks = common.get_networks_for_instance(context={}, instance={}) + self.assertEqual(networks, {}) + class MetadataXMLDeserializationTest(test.TestCase): -- cgit