Use save_and_reraise_exception when reraise exception

This commit fixes neutron core and common codes.

Partial-Bug: #1279813
Change-Id: Id109924c7ff9b4f0d74c23665016a54bfd7dff77
This commit is contained in:
Akihiro Motoki 2014-02-12 23:18:36 +09:00
parent c54decff62
commit c309d3ab17
13 changed files with 120 additions and 102 deletions

View File

@ -35,6 +35,7 @@ from neutron.common import topics
from neutron.common import utils as common_utils from neutron.common import utils as common_utils
from neutron import context from neutron import context
from neutron import manager from neutron import manager
from neutron.openstack.common import excutils
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import lockutils from neutron.openstack.common import lockutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
@ -302,14 +303,13 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, manager.Manager):
try: try:
return self.plugin_rpc.get_external_network_id(self.context) return self.plugin_rpc.get_external_network_id(self.context)
except rpc_common.RemoteError as e: except rpc_common.RemoteError as e:
with excutils.save_and_reraise_exception():
if e.exc_type == 'TooManyExternalNetworks': if e.exc_type == 'TooManyExternalNetworks':
msg = _( msg = _(
"The 'gateway_external_network_id' option must be " "The 'gateway_external_network_id' option must be "
"configured for this agent as Neutron has more than " "configured for this agent as Neutron has more than "
"one external network.") "one external network.")
raise Exception(msg) raise Exception(msg)
else:
raise
def _router_added(self, router_id, router): def _router_added(self, router_id, router):
ri = RouterInfo(router_id, self.root_helper, ri = RouterInfo(router_id, self.root_helper,

View File

@ -28,6 +28,7 @@ from eventlet.green import subprocess
from eventlet import greenthread from eventlet import greenthread
from neutron.common import utils from neutron.common import utils
from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
@ -116,10 +117,11 @@ def find_child_pids(pid):
try: try:
raw_pids = execute(['ps', '--ppid', pid, '-o', 'pid=']) raw_pids = execute(['ps', '--ppid', pid, '-o', 'pid='])
except RuntimeError as e: except RuntimeError as e:
# Unexpected errors are the responsibility of the caller
with excutils.save_and_reraise_exception() as ctxt:
# Exception has already been logged by execute # Exception has already been logged by execute
no_children_found = 'Exit code: 1' in str(e) no_children_found = 'Exit code: 1' in str(e)
if no_children_found: if no_children_found:
ctxt.reraise = False
return [] return []
# Unexpected errors are the responsibility of the caller
raise
return [x.strip() for x in raw_pids.split('\n') if x.strip()] return [x.strip() for x in raw_pids.split('\n') if x.strip()]

View File

@ -35,6 +35,7 @@ from neutron.common import constants as n_const
from neutron.common import topics from neutron.common import topics
from neutron.common import utils from neutron.common import utils
from neutron import context from neutron import context
from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall from neutron.openstack.common import loopingcall
from neutron.openstack.common import service from neutron.openstack.common import service
@ -255,8 +256,9 @@ class UnixDomainMetadataProxy(object):
try: try:
os.unlink(cfg.CONF.metadata_proxy_socket) os.unlink(cfg.CONF.metadata_proxy_socket)
except OSError: except OSError:
if os.path.exists(cfg.CONF.metadata_proxy_socket): with excutils.save_and_reraise_exception() as ctxt:
raise if not os.path.exists(cfg.CONF.metadata_proxy_socket):
ctxt.reraise = False
else: else:
os.makedirs(dirname, 0o755) os.makedirs(dirname, 0o755)

View File

@ -19,6 +19,8 @@
Neutron base exception handling. Neutron base exception handling.
""" """
from neutron.openstack.common import excutils
class NeutronException(Exception): class NeutronException(Exception):
"""Base Neutron Exception. """Base Neutron Exception.
@ -34,9 +36,9 @@ class NeutronException(Exception):
super(NeutronException, self).__init__(self.message % kwargs) super(NeutronException, self).__init__(self.message % kwargs)
self.msg = self.message % kwargs self.msg = self.message % kwargs
except Exception: except Exception:
if self.use_fatal_exceptions(): with excutils.save_and_reraise_exception() as ctxt:
raise if not self.use_fatal_exceptions():
else: ctxt.reraise = False
# at least get the core message out if something happened # at least get the core message out if something happened
super(NeutronException, self).__init__(self.message) super(NeutronException, self).__init__(self.message)

View File

@ -26,6 +26,7 @@ from neutron.db import models_v2
from neutron.extensions import agent as ext_agent from neutron.extensions import agent as ext_agent
from neutron import manager from neutron import manager
from neutron.openstack.common.db import exception as db_exc from neutron.openstack.common.db import exception as db_exc
from neutron.openstack.common import excutils
from neutron.openstack.common import jsonutils from neutron.openstack.common import jsonutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import timeutils from neutron.openstack.common import timeutils
@ -178,22 +179,23 @@ class AgentDbMixin(ext_agent.AgentPluginBase):
try: try:
return self._create_or_update_agent(context, agent) return self._create_or_update_agent(context, agent)
except db_exc.DBDuplicateEntry as e: except db_exc.DBDuplicateEntry as e:
with excutils.save_and_reraise_exception() as ctxt:
if e.columns == ['agent_type', 'host']: if e.columns == ['agent_type', 'host']:
# It might happen that two or more concurrent transactions are # It might happen that two or more concurrent transactions
# trying to insert new rows having the same value of # are trying to insert new rows having the same value of
# (agent_type, host) pair at the same time (if there has been # (agent_type, host) pair at the same time (if there has
# no such entry in the table and multiple agent status updates # been no such entry in the table and multiple agent status
# are being processed at the moment). In this case having a # updates are being processed at the moment). In this case
# unique constraint on (agent_type, host) columns guarantees # having a unique constraint on (agent_type, host) columns
# that only one transaction will succeed and insert a new agent # guarantees that only one transaction will succeed and
# entry, others will fail and be rolled back. That means we # insert a new agent entry, others will fail and be rolled
# must retry them one more time: no INSERTs will be issued, # back. That means we must retry them one more time: no
# because _get_agent_by_type_and_host() will return the # INSERTs will be issued, because
# existing agent entry, which will be updated multiple times # _get_agent_by_type_and_host() will return the existing
# agent entry, which will be updated multiple times
ctxt.reraise = False
return self._create_or_update_agent(context, agent) return self._create_or_update_agent(context, agent)
raise
class AgentExtRpcCallback(object): class AgentExtRpcCallback(object):
"""Processes the rpc report in plugin implementations.""" """Processes the rpc report in plugin implementations."""

View File

@ -22,6 +22,7 @@ from neutron.common import utils
from neutron.extensions import portbindings from neutron.extensions import portbindings
from neutron import manager from neutron import manager
from neutron.openstack.common.db import exception as db_exc from neutron.openstack.common.db import exception as db_exc
from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
@ -58,17 +59,19 @@ class DhcpRpcCallbackMixin(object):
raise n_exc.Invalid(message=msg) raise n_exc.Invalid(message=msg)
except (db_exc.DBError, n_exc.NetworkNotFound, except (db_exc.DBError, n_exc.NetworkNotFound,
n_exc.SubnetNotFound, n_exc.IpAddressGenerationFailure) as e: n_exc.SubnetNotFound, n_exc.IpAddressGenerationFailure) as e:
with excutils.save_and_reraise_exception() as ctxt:
ctxt.reraise = False
if isinstance(e, n_exc.IpAddressGenerationFailure): if isinstance(e, n_exc.IpAddressGenerationFailure):
# Check if the subnet still exists and if it does not, this is # Check if the subnet still exists and if it does not,
# the reason why the ip address generation failed. In any other # this is the reason why the ip address generation failed.
# unlikely event re-raise # In any other unlikely event re-raise
try: try:
subnet_id = port['port']['fixed_ips'][0]['subnet_id'] subnet_id = port['port']['fixed_ips'][0]['subnet_id']
plugin.get_subnet(context, subnet_id) plugin.get_subnet(context, subnet_id)
except n_exc.SubnetNotFound: except n_exc.SubnetNotFound:
pass pass
else: else:
raise ctxt.reraise = True
network_id = port['port']['network_id'] network_id = port['port']['network_id']
LOG.warn(_("Port for network %(net_id)s could not be created: " LOG.warn(_("Port for network %(net_id)s could not be created: "
"%(reason)s") % {"net_id": network_id, 'reason': e}) "%(reason)s") % {"net_id": network_id, 'reason': e})

View File

@ -30,6 +30,7 @@ from neutron.extensions import loadbalancer
from neutron.extensions.loadbalancer import LoadBalancerPluginBase from neutron.extensions.loadbalancer import LoadBalancerPluginBase
from neutron import manager from neutron import manager
from neutron.openstack.common.db import exception from neutron.openstack.common.db import exception
from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import uuidutils from neutron.openstack.common import uuidutils
from neutron.plugins.common import constants from neutron.plugins.common import constants
@ -204,6 +205,7 @@ class LoadBalancerPluginDb(LoadBalancerPluginBase,
try: try:
r = self._get_by_id(context, model, id) r = self._get_by_id(context, model, id)
except exc.NoResultFound: except exc.NoResultFound:
with excutils.save_and_reraise_exception():
if issubclass(model, Vip): if issubclass(model, Vip):
raise loadbalancer.VipNotFound(vip_id=id) raise loadbalancer.VipNotFound(vip_id=id)
elif issubclass(model, Pool): elif issubclass(model, Pool):
@ -212,8 +214,6 @@ class LoadBalancerPluginDb(LoadBalancerPluginBase,
raise loadbalancer.MemberNotFound(member_id=id) raise loadbalancer.MemberNotFound(member_id=id)
elif issubclass(model, HealthMonitor): elif issubclass(model, HealthMonitor):
raise loadbalancer.HealthMonitorNotFound(monitor_id=id) raise loadbalancer.HealthMonitorNotFound(monitor_id=id)
else:
raise
return r return r
def assert_modification_allowed(self, obj): def assert_modification_allowed(self, obj):

View File

@ -32,6 +32,7 @@ from neutron.db import models_v2
from neutron.extensions import vpnaas from neutron.extensions import vpnaas
from neutron.extensions.vpnaas import VPNPluginBase from neutron.extensions.vpnaas import VPNPluginBase
from neutron import manager from neutron import manager
from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import uuidutils from neutron.openstack.common import uuidutils
from neutron.plugins.common import constants from neutron.plugins.common import constants
@ -178,6 +179,7 @@ class VPNPluginDb(VPNPluginBase, base_db.CommonDbMixin):
try: try:
r = self._get_by_id(context, model, v_id) r = self._get_by_id(context, model, v_id)
except exc.NoResultFound: except exc.NoResultFound:
with excutils.save_and_reraise_exception():
if issubclass(model, IPsecSiteConnection): if issubclass(model, IPsecSiteConnection):
raise vpnaas.IPsecSiteConnectionNotFound( raise vpnaas.IPsecSiteConnectionNotFound(
ipsec_site_conn_id=v_id ipsec_site_conn_id=v_id
@ -188,8 +190,6 @@ class VPNPluginDb(VPNPluginBase, base_db.CommonDbMixin):
raise vpnaas.IPsecPolicyNotFound(ipsecpolicy_id=v_id) raise vpnaas.IPsecPolicyNotFound(ipsecpolicy_id=v_id)
elif issubclass(model, VPNService): elif issubclass(model, VPNService):
raise vpnaas.VPNServiceNotFound(vpnservice_id=v_id) raise vpnaas.VPNServiceNotFound(vpnservice_id=v_id)
else:
raise
return r return r
def assert_update_allowed(self, obj): def assert_update_allowed(self, obj):

View File

@ -27,6 +27,7 @@ from neutron.api.v2 import attributes
from neutron.common import exceptions from neutron.common import exceptions
import neutron.common.utils as utils import neutron.common.utils as utils
from neutron import manager from neutron import manager
from neutron.openstack.common import excutils
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import policy from neutron.openstack.common import policy
@ -274,8 +275,8 @@ class OwnerCheck(policy.Check):
fields=[parent_field]) fields=[parent_field])
target[self.target_field] = data[parent_field] target[self.target_field] = data[parent_field]
except Exception: except Exception:
with excutils.save_and_reraise_exception():
LOG.exception(_('Policy check error while calling %s!'), f) LOG.exception(_('Policy check error while calling %s!'), f)
raise
match = self.match % target match = self.match % target
if self.kind in creds: if self.kind in creds:
return match == unicode(creds[self.kind]) return match == unicode(creds[self.kind])

View File

@ -25,6 +25,7 @@ from oslo.config import cfg
from neutron.common import config from neutron.common import config
from neutron.common import legacy from neutron.common import legacy
from neutron import context from neutron import context
from neutron.openstack.common import excutils
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall from neutron.openstack.common import loopingcall
@ -102,8 +103,9 @@ def serve_wsgi(cls):
service = cls.create('quantum') service = cls.create('quantum')
service.start() service.start()
except Exception: except Exception:
LOG.exception(_('Unrecoverable error: please check log for details.')) with excutils.save_and_reraise_exception():
raise LOG.exception(_('Unrecoverable error: please check log '
'for details.'))
return service return service

View File

@ -27,6 +27,7 @@ from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils from neutron.agent.linux import utils
from neutron.common import exceptions from neutron.common import exceptions
from neutron.common import utils as n_utils from neutron.common import utils as n_utils
from neutron.openstack.common import excutils
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.plugins.common import constants from neutron.plugins.common import constants
@ -65,10 +66,10 @@ class HaproxyNSDriver(agent_device_driver.AgentDeviceDriver):
try: try:
vif_driver = importutils.import_object(conf.interface_driver, conf) vif_driver = importutils.import_object(conf.interface_driver, conf)
except ImportError: except ImportError:
with excutils.save_and_reraise_exception():
msg = (_('Error importing interface driver: %s') msg = (_('Error importing interface driver: %s')
% conf.haproxy.interface_driver) % conf.haproxy.interface_driver)
LOG.error(msg) LOG.error(msg)
raise
self.vif_driver = vif_driver self.vif_driver = vif_driver
self.plugin_rpc = plugin_rpc self.plugin_rpc = plugin_rpc

View File

@ -21,6 +21,7 @@ import six
from neutron.api import extensions from neutron.api import extensions
from neutron.db import servicetype_db as sdb from neutron.db import servicetype_db as sdb
from neutron.openstack.common import excutils
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.services import provider_configuration as pconf from neutron.services import provider_configuration as pconf
@ -84,11 +85,11 @@ def load_drivers(service_type, plugin):
{'provider': provider['driver'], {'provider': provider['driver'],
'service_type': service_type}) 'service_type': service_type})
except ImportError: except ImportError:
with excutils.save_and_reraise_exception():
LOG.exception(_("Error loading provider '%(provider)s' for " LOG.exception(_("Error loading provider '%(provider)s' for "
"service %(service_type)s"), "service %(service_type)s"),
{'provider': provider['driver'], {'provider': provider['driver'],
'service_type': service_type}) 'service_type': service_type})
raise
default_provider = None default_provider = None
try: try:

View File

@ -40,6 +40,7 @@ from neutron.common import constants
from neutron.common import exceptions as exception from neutron.common import exceptions as exception
from neutron import context from neutron import context
from neutron.openstack.common.db.sqlalchemy import session from neutron.openstack.common.db.sqlalchemy import session
from neutron.openstack.common import excutils
from neutron.openstack.common import gettextutils from neutron.openstack.common import gettextutils
from neutron.openstack.common import jsonutils from neutron.openstack.common import jsonutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
@ -176,8 +177,9 @@ class Server(object):
sock = wrap_ssl(sock) sock = wrap_ssl(sock)
except socket.error as err: except socket.error as err:
if err.errno != errno.EADDRINUSE: with excutils.save_and_reraise_exception() as ctxt:
raise if err.errno == errno.EADDRINUSE:
ctxt.reraise = False
eventlet.sleep(0.1) eventlet.sleep(0.1)
if not sock: if not sock:
raise RuntimeError(_("Could not bind to %(host)s:%(port)s " raise RuntimeError(_("Could not bind to %(host)s:%(port)s "
@ -698,6 +700,7 @@ class XMLDeserializer(TextDeserializer):
return result return result
return dict({root_tag: result}, **links) return dict({root_tag: result}, **links)
except Exception as e: except Exception as e:
with excutils.save_and_reraise_exception():
parseError = False parseError = False
# Python2.7 # Python2.7
if (hasattr(etree, 'ParseError') and if (hasattr(etree, 'ParseError') and
@ -709,8 +712,6 @@ class XMLDeserializer(TextDeserializer):
if parseError: if parseError:
msg = _("Cannot understand XML") msg = _("Cannot understand XML")
raise exception.MalformedRequestBody(reason=msg) raise exception.MalformedRequestBody(reason=msg)
else:
raise
def _from_xml_node(self, node, listnames): def _from_xml_node(self, node, listnames):
"""Convert a minidom node to a simple Python type. """Convert a minidom node to a simple Python type.
@ -832,8 +833,9 @@ class RequestDeserializer(object):
try: try:
deserializer = self.get_body_deserializer(content_type) deserializer = self.get_body_deserializer(content_type)
except exception.InvalidContentType: except exception.InvalidContentType:
LOG.debug(_("Unable to deserialize body as provided Content-Type")) with excutils.save_and_reraise_exception():
raise LOG.debug(_("Unable to deserialize body as provided "
"Content-Type"))
return deserializer.deserialize(request.body, action) return deserializer.deserialize(request.body, action)