Add Pecan support for wrap_controller_exception decorator

wrap_controller_exception decorator only works for WSME controllers
It is now also avaiable for Pecan controllers.

Change-Id: I307a4feb613ab27bc40ae63b3a11b62838a42cd0
This commit is contained in:
Pierre Padrixe
2014-05-30 17:22:21 +02:00
parent 3a26db0e22
commit 05a8919194
12 changed files with 79 additions and 52 deletions

View File

@@ -31,7 +31,7 @@ class AssemblyController(rest.RestController):
super(AssemblyController, self).__init__()
self._id = assembly_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(assembly.Assembly)
def get(self):
"""Return this assembly."""
@@ -40,7 +40,7 @@ class AssemblyController(rest.RestController):
return assembly.Assembly.from_db_model(handler.get(self._id),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(assembly.Assembly, body=assembly.Assembly)
def put(self, data):
"""Modify this assembly."""
@@ -50,7 +50,7 @@ class AssemblyController(rest.RestController):
data.as_dict(objects.registry.Assembly))
return assembly.Assembly.from_db_model(res, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(status_code=204)
def delete(self):
"""Delete this assembly."""
@@ -68,7 +68,7 @@ class AssembliesController(rest.RestController):
remainder = remainder[:-1]
return AssemblyController(assembly_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(assembly.Assembly, body=assembly.Assembly,
status_code=201)
def post(self, data):
@@ -96,7 +96,7 @@ class AssembliesController(rest.RestController):
return assembly.Assembly.from_db_model(
handler.create(js_data), pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([assembly.Assembly])
def get_all(self):
"""Return all assemblies, based on the query provided."""

View File

@@ -27,7 +27,7 @@ class ComponentController(rest.RestController):
super(ComponentController, self).__init__()
self._id = component_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(component.Component)
def get(self):
"""Return this component."""
@@ -36,7 +36,7 @@ class ComponentController(rest.RestController):
return component.Component.from_db_model(handler.get(self._id),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(component.Component, body=component.Component)
def put(self, data):
"""Modify this component."""
@@ -46,7 +46,7 @@ class ComponentController(rest.RestController):
data.as_dict(objects.registry.Component))
return component.Component.from_db_model(res, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(None, status_code=204)
def delete(self):
"""Delete this component."""
@@ -64,7 +64,7 @@ class ComponentsController(rest.RestController):
remainder = remainder[:-1]
return ComponentController(component_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(component.Component, body=component.Component,
status_code=201)
def post(self, data):
@@ -75,7 +75,7 @@ class ComponentsController(rest.RestController):
handler.create(data.as_dict(objects.registry.Component)),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([component.Component])
def get_all(self):
"""Return all components, based on the query provided."""

View File

@@ -27,7 +27,7 @@ class ExtensionController(rest.RestController):
def __init__(self, extension_id):
self._id = extension_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(extension.Extension, wtypes.text)
def get(self):
"""Return this extension."""
@@ -36,7 +36,7 @@ class ExtensionController(rest.RestController):
return extension.Extension.from_db_model(handler.get(self._id),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(extension.Extension, wtypes.text,
body=extension.Extension)
def put(self, data):
@@ -47,7 +47,7 @@ class ExtensionController(rest.RestController):
data.as_dict(objects.registry.Extension))
return extension.Extension.from_db_model(obj, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(None, wtypes.text, status_code=204)
def delete(self):
"""Delete this extension."""
@@ -65,7 +65,7 @@ class ExtensionsController(rest.RestController):
remainder = remainder[:-1]
return ExtensionController(extension_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(extension.Extension, wtypes.text,
body=extension.Extension,
status_code=201)
@@ -76,7 +76,7 @@ class ExtensionsController(rest.RestController):
obj = handler.create(data.as_dict(objects.registry.Extension))
return extension.Extension.from_db_model(obj, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([extension.Extension])
def get_all(self):
"""Return all extensions, based on the query provided."""

View File

@@ -28,7 +28,7 @@ class LanguagePackController(rest.RestController):
super(LanguagePackController, self).__init__()
self._id = language_pack_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(lp.LanguagePack)
def get(self):
"""Return a language_pack."""
@@ -37,7 +37,7 @@ class LanguagePackController(rest.RestController):
return lp.LanguagePack.from_image(
handler.get(self._id), pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(lp.LanguagePack, body=lp.LanguagePack)
def put(self, data):
"""Modify this language_pack."""
@@ -46,7 +46,7 @@ class LanguagePackController(rest.RestController):
res = handler.update(self._id, data.as_image_dict())
return lp.LanguagePack.from_image(res, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(status_code=204)
def delete(self):
"""Delete this language_pack."""
@@ -64,7 +64,7 @@ class LanguagePacksController(rest.RestController):
remainder = remainder[:-1]
return LanguagePackController(language_pack_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(lp.LanguagePack, body=lp.LanguagePack,
status_code=201)
def post(self, data):
@@ -74,7 +74,7 @@ class LanguagePacksController(rest.RestController):
return lp.LanguagePack.from_image(handler.create(data.as_image_dict()),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([lp.LanguagePack])
def get_all(self):
"""Return all language_packs, based on the query provided."""

View File

@@ -28,7 +28,7 @@ class OperationController(rest.RestController):
super(OperationController, self).__init__()
self._id = operation_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(operation.Operation, wtypes.text)
def get(self):
"""Return this operation."""
@@ -37,7 +37,7 @@ class OperationController(rest.RestController):
return operation.Operation.from_db_model(handler.get(self._id),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(operation.Operation, wtypes.text,
body=operation.Operation)
def put(self, data):
@@ -48,7 +48,7 @@ class OperationController(rest.RestController):
data.as_dict(objects.registry.Operation))
return operation.Operation.from_db_model(res, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(status_code=204)
def delete(self):
"""Delete this operation."""
@@ -66,7 +66,7 @@ class OperationsController(rest.RestController):
remainder = remainder[:-1]
return OperationController(operation_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(operation.Operation, body=operation.Operation,
status_code=201)
def post(self, data):
@@ -76,7 +76,7 @@ class OperationsController(rest.RestController):
return operation.Operation.from_db_model(handler.create(
data.as_dict(objects.registry.Operation)), pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([operation.Operation])
def get_all(self):
"""Return all operations, based on the query provided."""

View File

@@ -29,7 +29,7 @@ class PlanController(rest.RestController):
super(PlanController, self).__init__()
self._id = plan_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(plan.Plan)
def get(self):
"""Return this plan."""
@@ -37,7 +37,7 @@ class PlanController(rest.RestController):
return plan.Plan.from_db_model(handler.get(self._id),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(plan.Plan, body=plan.Plan)
def put(self, data):
"""Modify this plan."""
@@ -46,7 +46,7 @@ class PlanController(rest.RestController):
data.as_dict(objects.registry.Plan))
return plan.Plan.from_db_model(res, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(status_code=204)
def delete(self):
"""Delete this plan."""
@@ -63,7 +63,7 @@ class PlansController(rest.RestController):
remainder = remainder[:-1]
return PlanController(plan_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(plan.Plan, body=plan.Plan, status_code=201)
def post(self, data):
"""Create a new plan."""
@@ -72,7 +72,7 @@ class PlansController(rest.RestController):
handler.create(data.as_dict(objects.registry.Plan)),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([plan.Plan])
def get_all(self):
"""Return all plans, based on the query provided."""

View File

@@ -91,7 +91,7 @@ class Controller(object):
language_packs = language_pack.LanguagePacksController()
public = public.PublicController()
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(Platform)
def index(self):
host_url = '%s/%s' % (pecan.request.host_url, 'v1')

View File

@@ -28,7 +28,7 @@ class SensorController(rest.RestController):
super(SensorController, self).__init__()
self._id = sensor_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(sensor.Sensor, wtypes.text)
def get(self):
"""Return this sensor."""
@@ -36,7 +36,7 @@ class SensorController(rest.RestController):
return sensor.Sensor.from_db_model(handler.get(self._id),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(sensor.Sensor, wtypes.text, body=sensor.Sensor)
def put(self, data):
"""Modify this sensor."""
@@ -45,7 +45,7 @@ class SensorController(rest.RestController):
data.as_dict(objects.registry.Sensor))
return sensor.Sensor.from_db_model(obj, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(None, wtypes.text, status_code=204)
def delete(self):
"""Delete this sensor."""
@@ -62,7 +62,7 @@ class SensorsController(rest.RestController):
remainder = remainder[:-1]
return SensorController(sensor_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(sensor.Sensor, wtypes.text,
body=sensor.Sensor, status_code=201)
def post(self, data):
@@ -71,7 +71,7 @@ class SensorsController(rest.RestController):
obj = handler.create(data.as_dict(objects.registry.Sensor))
return sensor.Sensor.from_db_model(obj, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([sensor.Sensor])
def get_all(self):
"""Return all sensors, based on the query provided."""

View File

@@ -27,7 +27,7 @@ class ServiceController(rest.RestController):
super(ServiceController, self).__init__()
self._id = service_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(service.Service)
def get(self):
"""Return this service."""
@@ -36,7 +36,7 @@ class ServiceController(rest.RestController):
return service.Service.from_db_model(handler.get(self._id),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(service.Service, body=service.Service)
def put(self, data):
"""Modify this service."""
@@ -46,7 +46,7 @@ class ServiceController(rest.RestController):
data.as_dict(objects.registry.Service))
return service.Service.from_db_model(res, pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(status_code=204)
def delete(self):
"""Delete this service."""
@@ -64,7 +64,7 @@ class ServicesController(rest.RestController):
remainder = remainder[:-1]
return ServiceController(service_id), remainder
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(service.Service, body=service.Service,
status_code=201)
def post(self, data):
@@ -75,7 +75,7 @@ class ServicesController(rest.RestController):
handler.create(data.as_dict(objects.registry.Service)),
pecan.request.host_url)
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose([service.Service])
def get_all(self):
"""Return all services, based on the query provided."""

View File

@@ -71,7 +71,7 @@ class ImageController(rest.RestController):
super(ImageController, self).__init__()
self._id = image_id
@exception.wrap_controller_exception
@exception.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(Image)
def get(self):
"""Return this image."""

View File

@@ -19,6 +19,7 @@ Includes decorator for re-raising Solum-type exceptions.
"""
import functools
import pecan
import sys
import uuid
@@ -90,7 +91,7 @@ OBFUSCATED_MSG = _('Your request could not be handled '
'Error Correlation id is: %s')
def wrap_controller_exception(func):
def wrap_controller_exception(func, func_server_error, func_client_error):
"""This decorator wraps controllers methods to handle exceptions:
- if an unhandled Exception or a SolumException with an error code >=500
@@ -117,18 +118,44 @@ def wrap_controller_exception(func):
log_correlation_id = str(uuid.uuid4())
LOG.error("%s:%s", log_correlation_id, str(excp))
# raise a client error with an obfuscated message
raise wsme.exc.ClientSideError(
six.text_type(OBFUSCATED_MSG % log_correlation_id),
http_error_code)
func_server_error(log_correlation_id, http_error_code)
else:
# raise a client error the original message
LOG.debug(excp)
raise wsme.exc.ClientSideError(
six.text_type(excp), http_error_code)
func_client_error(excp, http_error_code)
return wrapped
def wrap_wsme_controller_exception(func):
"""This decorator wraps wsme controllers to handle exceptions."""
def _func_server_error(log_correlation_id, status_code):
raise wsme.exc.ClientSideError(
six.text_type(OBFUSCATED_MSG % log_correlation_id), status_code)
def _func_client_error(excp, status_code):
raise wsme.exc.ClientSideError(six.text_type(excp), status_code)
return wrap_controller_exception(func,
_func_server_error,
_func_client_error)
def wrap_pecan_controller_exception(func):
"""This decorator wraps pecan controllers to handle exceptions."""
def _func_server_error(log_correlation_id, status_code):
pecan.response.status = status_code
pecan.response.body = six.text_type(OBFUSCATED_MSG %
log_correlation_id)
def _func_client_error(excp, status_code):
pecan.response.status = status_code
pecan.response.body = six.text_type(excp)
return wrap_controller_exception(func,
_func_server_error,
_func_client_error)
def wrap_keystone_exception(func):
"""This decorator wraps keystone exception by throwing Solum specific
exceptions.

View File

@@ -78,7 +78,7 @@ class ExceptionTestCase(base.BaseTestCase):
correlation_id = None
try:
exception.wrap_controller_exception(error_func)()
exception.wrap_wsme_controller_exception(error_func)()
except wsme.exc.ClientSideError as e:
correlation_id = e.message.split(":")[1].strip()
@@ -100,7 +100,7 @@ class ExceptionTestCase(base.BaseTestCase):
raise exception.BadRequest(**error_args)
try:
exception.wrap_controller_exception(error_func)()
exception.wrap_wsme_controller_exception(error_func)()
self.assertTrue(False)
except wsme.exc.ClientSideError as e:
self.assertEqual(e.msg, expected_error_msg)
@@ -113,7 +113,7 @@ class ExceptionTestCase(base.BaseTestCase):
correlation_id = None
try:
exception.wrap_controller_exception(error_func)()
exception.wrap_wsme_controller_exception(error_func)()
except wsme.exc.ClientSideError as e:
correlation_id = e.message.split(":")[1].strip()