From bed395ed74f6a5ff1bc3b087207551f7ffd58f43 Mon Sep 17 00:00:00 2001 From: Tim Simpson Date: Tue, 26 Jun 2012 08:44:24 -0500 Subject: [PATCH] Moved functionality into wsgi.Controller. * Found that classes from multiple modules were inheriting from reddwarf.instances.service.BaseController or InstanceController directly (the later of which wass probably adding bugs) and so moved all the common functionality into wsgi controller. * Moved exceptions from other exception maps into wsgi.Controller's exception_map. --- reddwarf/common/wsgi.py | 50 ++++++++++++++++++++++++++- reddwarf/extensions/mysql/service.py | 42 ++--------------------- reddwarf/flavor/service.py | 29 +--------------- reddwarf/instance/models.py | 2 +- reddwarf/instance/service.py | 51 +--------------------------- 5 files changed, 55 insertions(+), 119 deletions(-) diff --git a/reddwarf/common/wsgi.py b/reddwarf/common/wsgi.py index 3f856a770f..8eb5ee1756 100644 --- a/reddwarf/common/wsgi.py +++ b/reddwarf/common/wsgi.py @@ -227,7 +227,45 @@ class Resource(openstack_wsgi.Resource): class Controller(object): """Base controller that creates a Resource with default serializers.""" - exception_map = {} + exclude_attr = [] + + exception_map = { + webob.exc.HTTPUnprocessableEntity: [ + exception.UnprocessableEntity, + ], + webob.exc.HTTPUnauthorized: [ + exception.Forbidden, + ], + webob.exc.HTTPBadRequest: [ + exception.InvalidModelError, + exception.BadRequest, + exception.CannotResizeToSameSize, + exception.BadValue, + exception.DatabaseAlreadyExists, + exception.UserAlreadyExists, + ], + webob.exc.HTTPNotFound: [ + exception.NotFound, + exception.ComputeInstanceNotFound, + exception.ModelNotFoundError, + ], + webob.exc.HTTPConflict: [ + ], + webob.exc.HTTPRequestEntityTooLarge: [ + exception.OverLimit, + exception.QuotaExceeded, + exception.VolumeQuotaExceeded, + ], + webob.exc.HTTPServerError: [ + exception.VolumeCreationFailure + ], + } + + def __init__(self): + self.add_addresses = utils.bool_from_string( + config.Config.get('add_addresses', 'False')) + self.add_volumes = utils.bool_from_string( + config.Config.get('reddwarf_volume_support', 'False')) def create_resource(self): serializer = ReddwarfResponseSerializer( @@ -237,6 +275,16 @@ class Controller(object): serializer, self.exception_map) + def _extract_limits(self, params): + return dict([(key, params[key]) for key in params.keys() + if key in ["limit", "marker"]]) + + def _extract_required_params(self, params, model_name): + params = params or {} + model_params = params.get(model_name, {}) + return utils.stringify_keys(utils.exclude(model_params, + *self.exclude_attr)) + class ReddwarfRequestDeserializer(RequestDeserializer): """Break up a Request object into more useful pieces.""" diff --git a/reddwarf/extensions/mysql/service.py b/reddwarf/extensions/mysql/service.py index 46fbee72e8..d65b6ba37f 100644 --- a/reddwarf/extensions/mysql/service.py +++ b/reddwarf/extensions/mysql/service.py @@ -30,42 +30,7 @@ from reddwarf.extensions.mysql import views LOG = logging.getLogger(__name__) -class BaseController(wsgi.Controller): - """Base controller class.""" - - exclude_attr = [] - exception_map = { - webob.exc.HTTPUnprocessableEntity: [ - exception.UnprocessableEntity, - ], - webob.exc.HTTPBadRequest: [ - exception.BadRequest, - exception.DatabaseAlreadyExists, - exception.UserAlreadyExists - ], - webob.exc.HTTPNotFound: [ - exception.NotFound, - exception.ModelNotFoundError, - ], - webob.exc.HTTPConflict: [ - ], - } - - def __init__(self): - pass - - def _extract_required_params(self, params, model_name): - params = params or {} - model_params = params.get(model_name, {}) - return utils.stringify_keys(utils.exclude(model_params, - *self.exclude_attr)) - - def _extract_limits(self, params): - return dict([(key, params[key]) for key in params.keys() - if key in ["limit", "marker"]]) - - -class RootController(BaseController): +class RootController(wsgi.Controller): """Controller for instance functionality""" def index(self, req, tenant_id, instance_id): @@ -87,7 +52,7 @@ class RootController(BaseController): return wsgi.Result(views.RootCreatedView(root).data(), 200) -class UserController(BaseController): +class UserController(wsgi.Controller): """Controller for instance functionality""" @classmethod @@ -142,8 +107,7 @@ class UserController(BaseController): def show(self, req, tenant_id, instance_id, id): raise webob.exc.HTTPNotImplemented() - -class SchemaController(BaseController): +class SchemaController(wsgi.Controller): """Controller for instance functionality""" @classmethod diff --git a/reddwarf/flavor/service.py b/reddwarf/flavor/service.py index 3f69ce4afe..bdc3bc25e3 100644 --- a/reddwarf/flavor/service.py +++ b/reddwarf/flavor/service.py @@ -25,34 +25,7 @@ from reddwarf.flavor import models from reddwarf.flavor import views -class BaseController(wsgi.Controller): - """Base controller class.""" - - exclude_attr = [] - exception_map = { - webob.exc.HTTPUnprocessableEntity: [ - ], - webob.exc.HTTPBadRequest: [ - exception.BadRequest, - ], - webob.exc.HTTPNotFound: [ - exception.NotFound, - ], - webob.exc.HTTPConflict: [ - ], - } - - def __init__(self): - pass - - def _extract_required_params(self, params, model_name): - params = params or {} - model_params = params.get(model_name, {}) - return utils.stringify_keys(utils.exclude(model_params, - *self.exclude_attr)) - - -class FlavorController(BaseController): +class FlavorController(wsgi.Controller): """Controller for flavor functionality""" def show(self, req, tenant_id, id): diff --git a/reddwarf/instance/models.py b/reddwarf/instance/models.py index 9189342bc4..2f90b6ca5b 100644 --- a/reddwarf/instance/models.py +++ b/reddwarf/instance/models.py @@ -557,7 +557,7 @@ class DBInstance(dbmodels.DatabaseModelBase): _data_fields = ['name', 'created', 'compute_instance_id', 'task_id', 'task_description', 'task_start_time', - 'volume_id', 'deleted'] + 'volume_id', 'deleted', 'tenant_id'] def __init__(self, task_status=None, **kwargs): kwargs["task_id"] = task_status.code diff --git a/reddwarf/instance/service.py b/reddwarf/instance/service.py index a58fb71fff..d7fee21bc3 100644 --- a/reddwarf/instance/service.py +++ b/reddwarf/instance/service.py @@ -33,55 +33,6 @@ CONFIG = config.Config LOG = logging.getLogger(__name__) -class BaseController(wsgi.Controller): - """Base controller class.""" - - exclude_attr = [] - exception_map = { - webob.exc.HTTPUnprocessableEntity: [ - exception.UnprocessableEntity, - ], - webob.exc.HTTPBadRequest: [ - exception.InvalidModelError, - exception.BadRequest, - exception.CannotResizeToSameSize, - exception.BadValue - ], - webob.exc.HTTPNotFound: [ - exception.NotFound, - exception.ComputeInstanceNotFound, - exception.ModelNotFoundError, - ], - webob.exc.HTTPConflict: [ - ], - webob.exc.HTTPRequestEntityTooLarge: [ - exception.OverLimit, - exception.QuotaExceeded, - exception.VolumeQuotaExceeded, - ], - webob.exc.HTTPServerError: [ - exception.VolumeCreationFailure - ] - } - - def __init__(self): - self.add_addresses = utils.bool_from_string( - config.Config.get('add_addresses', 'False')) - self.add_volumes = utils.bool_from_string( - config.Config.get('reddwarf_volume_support', 'False')) - pass - - def _extract_limits(self, params): - return dict([(key, params[key]) for key in params.keys() - if key in ["limit", "marker"]]) - - def _extract_required_params(self, params, model_name): - params = params or {} - model_params = params.get(model_name, {}) - return utils.stringify_keys(utils.exclude(model_params, - *self.exclude_attr)) - - class api_validation: """ api validation wrapper """ def __init__(self, action=None): @@ -99,7 +50,7 @@ class api_validation: return wrapper -class InstanceController(BaseController): +class InstanceController(wsgi.Controller): """Controller for instance functionality""" def action(self, req, body, tenant_id, id):