from neutron.common import utils as common_utils
from neutron import context
from neutron import manager
+from neutron.openstack.common import excutils
from neutron.openstack.common import importutils
from neutron.openstack.common import lockutils
from neutron.openstack.common import log as logging
try:
return self.plugin_rpc.get_external_network_id(self.context)
except rpc_common.RemoteError as e:
- if e.exc_type == 'TooManyExternalNetworks':
- msg = _(
- "The 'gateway_external_network_id' option must be "
- "configured for this agent as Neutron has more than "
- "one external network.")
- raise Exception(msg)
- else:
- raise
+ with excutils.save_and_reraise_exception():
+ if e.exc_type == 'TooManyExternalNetworks':
+ msg = _(
+ "The 'gateway_external_network_id' option must be "
+ "configured for this agent as Neutron has more than "
+ "one external network.")
+ raise Exception(msg)
def _router_added(self, router_id, router):
ri = RouterInfo(router_id, self.root_helper,
from eventlet import greenthread
from neutron.common import utils
+from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging
try:
raw_pids = execute(['ps', '--ppid', pid, '-o', 'pid='])
except RuntimeError as e:
- # Exception has already been logged by execute
- no_children_found = 'Exit code: 1' in str(e)
- if no_children_found:
- return []
# Unexpected errors are the responsibility of the caller
- raise
+ with excutils.save_and_reraise_exception() as ctxt:
+ # Exception has already been logged by execute
+ no_children_found = 'Exit code: 1' in str(e)
+ if no_children_found:
+ ctxt.reraise = False
+ return []
return [x.strip() for x in raw_pids.split('\n') if x.strip()]
from neutron.common import topics
from neutron.common import utils
from neutron import context
+from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
from neutron.openstack.common import service
try:
os.unlink(cfg.CONF.metadata_proxy_socket)
except OSError:
- if os.path.exists(cfg.CONF.metadata_proxy_socket):
- raise
+ with excutils.save_and_reraise_exception() as ctxt:
+ if not os.path.exists(cfg.CONF.metadata_proxy_socket):
+ ctxt.reraise = False
else:
os.makedirs(dirname, 0o755)
Neutron base exception handling.
"""
+from neutron.openstack.common import excutils
+
class NeutronException(Exception):
"""Base Neutron Exception.
super(NeutronException, self).__init__(self.message % kwargs)
self.msg = self.message % kwargs
except Exception:
- if self.use_fatal_exceptions():
- raise
- else:
- # at least get the core message out if something happened
- super(NeutronException, self).__init__(self.message)
+ with excutils.save_and_reraise_exception() as ctxt:
+ if not self.use_fatal_exceptions():
+ ctxt.reraise = False
+ # at least get the core message out if something happened
+ super(NeutronException, self).__init__(self.message)
def __unicode__(self):
return unicode(self.msg)
from neutron.extensions import agent as ext_agent
from neutron import manager
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 log as logging
from neutron.openstack.common import timeutils
try:
return self._create_or_update_agent(context, agent)
except db_exc.DBDuplicateEntry as e:
- if e.columns == ['agent_type', 'host']:
- # It might happen that two or more concurrent transactions are
- # trying to insert new rows having the same value of
- # (agent_type, host) pair at the same time (if there has been
- # no such entry in the table and multiple agent status updates
- # are being processed at the moment). In this case having a
- # unique constraint on (agent_type, host) columns guarantees
- # that only one transaction will succeed and insert a new agent
- # entry, others will fail and be rolled back. That means we
- # must retry them one more time: no INSERTs will be issued,
- # because _get_agent_by_type_and_host() will return the
- # existing agent entry, which will be updated multiple times
- return self._create_or_update_agent(context, agent)
-
- raise
+ with excutils.save_and_reraise_exception() as ctxt:
+ if e.columns == ['agent_type', 'host']:
+ # It might happen that two or more concurrent transactions
+ # are trying to insert new rows having the same value of
+ # (agent_type, host) pair at the same time (if there has
+ # been no such entry in the table and multiple agent status
+ # updates are being processed at the moment). In this case
+ # having a unique constraint on (agent_type, host) columns
+ # guarantees that only one transaction will succeed and
+ # insert a new agent entry, others will fail and be rolled
+ # back. That means we must retry them one more time: no
+ # INSERTs will be issued, because
+ # _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)
class AgentExtRpcCallback(object):
from neutron.extensions import portbindings
from neutron import manager
from neutron.openstack.common.db import exception as db_exc
+from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging
raise n_exc.Invalid(message=msg)
except (db_exc.DBError, n_exc.NetworkNotFound,
n_exc.SubnetNotFound, n_exc.IpAddressGenerationFailure) as e:
- if isinstance(e, n_exc.IpAddressGenerationFailure):
- # Check if the subnet still exists and if it does not, this is
- # the reason why the ip address generation failed. In any other
- # unlikely event re-raise
- try:
- subnet_id = port['port']['fixed_ips'][0]['subnet_id']
- plugin.get_subnet(context, subnet_id)
- except n_exc.SubnetNotFound:
- pass
- else:
- raise
- network_id = port['port']['network_id']
- LOG.warn(_("Port for network %(net_id)s could not be created: "
- "%(reason)s") % {"net_id": network_id, 'reason': e})
+ with excutils.save_and_reraise_exception() as ctxt:
+ ctxt.reraise = False
+ if isinstance(e, n_exc.IpAddressGenerationFailure):
+ # Check if the subnet still exists and if it does not,
+ # this is the reason why the ip address generation failed.
+ # In any other unlikely event re-raise
+ try:
+ subnet_id = port['port']['fixed_ips'][0]['subnet_id']
+ plugin.get_subnet(context, subnet_id)
+ except n_exc.SubnetNotFound:
+ pass
+ else:
+ ctxt.reraise = True
+ network_id = port['port']['network_id']
+ LOG.warn(_("Port for network %(net_id)s could not be created: "
+ "%(reason)s") % {"net_id": network_id, 'reason': e})
def get_active_networks(self, context, **kwargs):
"""Retrieve and return a list of the active network ids."""
from neutron.extensions.loadbalancer import LoadBalancerPluginBase
from neutron import manager
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 uuidutils
from neutron.plugins.common import constants
try:
r = self._get_by_id(context, model, id)
except exc.NoResultFound:
- if issubclass(model, Vip):
- raise loadbalancer.VipNotFound(vip_id=id)
- elif issubclass(model, Pool):
- raise loadbalancer.PoolNotFound(pool_id=id)
- elif issubclass(model, Member):
- raise loadbalancer.MemberNotFound(member_id=id)
- elif issubclass(model, HealthMonitor):
- raise loadbalancer.HealthMonitorNotFound(monitor_id=id)
- else:
- raise
+ with excutils.save_and_reraise_exception():
+ if issubclass(model, Vip):
+ raise loadbalancer.VipNotFound(vip_id=id)
+ elif issubclass(model, Pool):
+ raise loadbalancer.PoolNotFound(pool_id=id)
+ elif issubclass(model, Member):
+ raise loadbalancer.MemberNotFound(member_id=id)
+ elif issubclass(model, HealthMonitor):
+ raise loadbalancer.HealthMonitorNotFound(monitor_id=id)
return r
def assert_modification_allowed(self, obj):
from neutron.extensions import vpnaas
from neutron.extensions.vpnaas import VPNPluginBase
from neutron import manager
+from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import uuidutils
from neutron.plugins.common import constants
try:
r = self._get_by_id(context, model, v_id)
except exc.NoResultFound:
- if issubclass(model, IPsecSiteConnection):
- raise vpnaas.IPsecSiteConnectionNotFound(
- ipsec_site_conn_id=v_id
- )
- elif issubclass(model, IKEPolicy):
- raise vpnaas.IKEPolicyNotFound(ikepolicy_id=v_id)
- elif issubclass(model, IPsecPolicy):
- raise vpnaas.IPsecPolicyNotFound(ipsecpolicy_id=v_id)
- elif issubclass(model, VPNService):
- raise vpnaas.VPNServiceNotFound(vpnservice_id=v_id)
- else:
- raise
+ with excutils.save_and_reraise_exception():
+ if issubclass(model, IPsecSiteConnection):
+ raise vpnaas.IPsecSiteConnectionNotFound(
+ ipsec_site_conn_id=v_id
+ )
+ elif issubclass(model, IKEPolicy):
+ raise vpnaas.IKEPolicyNotFound(ikepolicy_id=v_id)
+ elif issubclass(model, IPsecPolicy):
+ raise vpnaas.IPsecPolicyNotFound(ipsecpolicy_id=v_id)
+ elif issubclass(model, VPNService):
+ raise vpnaas.VPNServiceNotFound(vpnservice_id=v_id)
return r
def assert_update_allowed(self, obj):
from neutron.common import exceptions
import neutron.common.utils as utils
from neutron import manager
+from neutron.openstack.common import excutils
from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import policy
fields=[parent_field])
target[self.target_field] = data[parent_field]
except Exception:
- LOG.exception(_('Policy check error while calling %s!'), f)
- raise
+ with excutils.save_and_reraise_exception():
+ LOG.exception(_('Policy check error while calling %s!'), f)
match = self.match % target
if self.kind in creds:
return match == unicode(creds[self.kind])
from neutron.common import config
from neutron.common import legacy
from neutron import context
+from neutron.openstack.common import excutils
from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
service = cls.create('quantum')
service.start()
except Exception:
- LOG.exception(_('Unrecoverable error: please check log for details.'))
- raise
+ with excutils.save_and_reraise_exception():
+ LOG.exception(_('Unrecoverable error: please check log '
+ 'for details.'))
return service
from neutron.agent.linux import utils
from neutron.common import exceptions
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 log as logging
from neutron.plugins.common import constants
try:
vif_driver = importutils.import_object(conf.interface_driver, conf)
except ImportError:
- msg = (_('Error importing interface driver: %s')
- % conf.haproxy.interface_driver)
- LOG.error(msg)
- raise
+ with excutils.save_and_reraise_exception():
+ msg = (_('Error importing interface driver: %s')
+ % conf.haproxy.interface_driver)
+ LOG.error(msg)
self.vif_driver = vif_driver
self.plugin_rpc = plugin_rpc
from neutron.api import extensions
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 log as logging
from neutron.services import provider_configuration as pconf
{'provider': provider['driver'],
'service_type': service_type})
except ImportError:
- LOG.exception(_("Error loading provider '%(provider)s' for "
- "service %(service_type)s"),
- {'provider': provider['driver'],
- 'service_type': service_type})
- raise
+ with excutils.save_and_reraise_exception():
+ LOG.exception(_("Error loading provider '%(provider)s' for "
+ "service %(service_type)s"),
+ {'provider': provider['driver'],
+ 'service_type': service_type})
default_provider = None
try:
from neutron.common import exceptions as exception
from neutron import context
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 jsonutils
from neutron.openstack.common import log as logging
sock = wrap_ssl(sock)
except socket.error as err:
- if err.errno != errno.EADDRINUSE:
- raise
- eventlet.sleep(0.1)
+ with excutils.save_and_reraise_exception() as ctxt:
+ if err.errno == errno.EADDRINUSE:
+ ctxt.reraise = False
+ eventlet.sleep(0.1)
if not sock:
raise RuntimeError(_("Could not bind to %(host)s:%(port)s "
"after trying for %(time)d seconds") %
return result
return dict({root_tag: result}, **links)
except Exception as e:
- parseError = False
- # Python2.7
- if (hasattr(etree, 'ParseError') and
- isinstance(e, getattr(etree, 'ParseError'))):
- parseError = True
- # Python2.6
- elif isinstance(e, expat.ExpatError):
- parseError = True
- if parseError:
- msg = _("Cannot understand XML")
- raise exception.MalformedRequestBody(reason=msg)
- else:
- raise
+ with excutils.save_and_reraise_exception():
+ parseError = False
+ # Python2.7
+ if (hasattr(etree, 'ParseError') and
+ isinstance(e, getattr(etree, 'ParseError'))):
+ parseError = True
+ # Python2.6
+ elif isinstance(e, expat.ExpatError):
+ parseError = True
+ if parseError:
+ msg = _("Cannot understand XML")
+ raise exception.MalformedRequestBody(reason=msg)
def _from_xml_node(self, node, listnames):
"""Convert a minidom node to a simple Python type.
try:
deserializer = self.get_body_deserializer(content_type)
except exception.InvalidContentType:
- LOG.debug(_("Unable to deserialize body as provided Content-Type"))
- raise
+ with excutils.save_and_reraise_exception():
+ LOG.debug(_("Unable to deserialize body as provided "
+ "Content-Type"))
return deserializer.deserialize(request.body, action)