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:
parent
c54decff62
commit
c309d3ab17
@ -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,
|
||||||
|
@ -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()]
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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."""
|
||||||
|
@ -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})
|
||||||
|
@ -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):
|
||||||
|
@ -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):
|
||||||
|
@ -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])
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user