summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Harris <rconradharris@gmail.com>2012-02-01 21:20:45 +0000
committerRick Harris <rconradharris@gmail.com>2012-02-02 12:33:35 -0600
commitdab791f973dbf2f86ccc3fe323d2934eb56b6d8c (patch)
treef2b0c69c317ba78d8097cb4df7d70996d5c739f4
parentaf1a92f973ad3ddd6f7adafd325e6c80d5fd4dbf (diff)
downloadnova-dab791f973dbf2f86ccc3fe323d2934eb56b6d8c.tar.gz
nova-dab791f973dbf2f86ccc3fe323d2934eb56b6d8c.tar.xz
nova-dab791f973dbf2f86ccc3fe323d2934eb56b6d8c.zip
DRYing up Volume/Compute APIRouters
Fixes bug 925102 Change-Id: I4ad3f95bec606ef1767d120b94e5fd03f16a7d3e
-rw-r--r--nova/api/openstack/__init__.py69
-rw-r--r--nova/api/openstack/compute/__init__.py65
-rw-r--r--nova/api/openstack/volume/__init__.py65
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_cloudpipe.py2
-rw-r--r--nova/tests/api/openstack/compute/test_api.py2
5 files changed, 76 insertions, 127 deletions
diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py
index e48f5c686..135a8c75b 100644
--- a/nova/api/openstack/__init__.py
+++ b/nova/api/openstack/__init__.py
@@ -70,3 +70,72 @@ class ProjectMapper(APIMapper):
routes.Mapper.resource(self, member_name,
collection_name,
**kwargs)
+
+
+class APIRouter(base_wsgi.Router):
+ """
+ Routes requests on the OpenStack API to the appropriate controller
+ and method.
+ """
+ ExtensionManager = None # override in subclasses
+
+ @classmethod
+ def factory(cls, global_config, **local_config):
+ """Simple paste factory, :class:`nova.wsgi.Router` doesn't have one"""
+ return cls()
+
+ def __init__(self, ext_mgr=None):
+ if ext_mgr is None:
+ if self.ExtensionManager:
+ ext_mgr = self.ExtensionManager()
+ else:
+ raise Exception(_("Must specify an ExtensionManager class"))
+
+ mapper = ProjectMapper()
+ self.resources = {}
+ self._setup_routes(mapper)
+ self._setup_ext_routes(mapper, ext_mgr)
+ self._setup_extensions(ext_mgr)
+ super(APIRouter, self).__init__(mapper)
+
+ def _setup_ext_routes(self, mapper, ext_mgr):
+ for resource in ext_mgr.get_resources():
+ LOG.debug(_('Extended resource: %s'),
+ resource.collection)
+
+ wsgi_resource = wsgi.Resource(resource.controller)
+ self.resources[resource.collection] = wsgi_resource
+ kargs = dict(
+ controller=wsgi_resource,
+ collection=resource.collection_actions,
+ member=resource.member_actions)
+
+ if resource.parent:
+ kargs['parent_resource'] = resource.parent
+
+ mapper.resource(resource.collection, resource.collection, **kargs)
+
+ if resource.custom_routes_fn:
+ resource.custom_routes_fn(mapper, wsgi_resource)
+
+ def _setup_extensions(self, ext_mgr):
+ for extension in ext_mgr.get_controller_extensions():
+ ext_name = extension.extension.name
+ collection = extension.collection
+ controller = extension.controller
+
+ if collection not in self.resources:
+ LOG.warning(_('Extension %(ext_name)s: Cannot extend '
+ 'resource %(collection)s: No such resource') %
+ locals())
+ continue
+
+ LOG.debug(_('Extension %(ext_name)s extending resource: '
+ '%(collection)s') % locals())
+
+ resource = self.resources[collection]
+ resource.register_actions(controller)
+ resource.register_extensions(controller)
+
+ def _setup_routes(self, mapper):
+ raise NotImplementedError
diff --git a/nova/api/openstack/compute/__init__.py b/nova/api/openstack/compute/__init__.py
index 0dd3484c2..d035173ed 100644
--- a/nova/api/openstack/compute/__init__.py
+++ b/nova/api/openstack/compute/__init__.py
@@ -17,12 +17,9 @@
# under the License.
"""
-WSGI middleware for OpenStack API controllers.
+WSGI middleware for OpenStack Compute API.
"""
-import webob.dec
-import webob.exc
-
import nova.api.openstack
from nova.api.openstack.compute import consoles
from nova.api.openstack.compute import extensions
@@ -34,11 +31,9 @@ from nova.api.openstack.compute import limits
from nova.api.openstack.compute import servers
from nova.api.openstack.compute import server_metadata
from nova.api.openstack.compute import versions
-from nova.api.openstack import wsgi
from nova.common import cfg
from nova import flags
from nova import log as logging
-from nova import wsgi as base_wsgi
LOG = logging.getLogger('nova.api.openstack.compute')
@@ -52,66 +47,12 @@ FLAGS = flags.FLAGS
FLAGS.add_option(allow_instance_snapshots_opt)
-class APIRouter(base_wsgi.Router):
+class APIRouter(nova.api.openstack.APIRouter):
"""
Routes requests on the OpenStack API to the appropriate controller
and method.
"""
-
- @classmethod
- def factory(cls, global_config, **local_config):
- """Simple paste factory, :class:`nova.wsgi.Router` doesn't have one"""
- return cls()
-
- def __init__(self, ext_mgr=None):
- if ext_mgr is None:
- ext_mgr = extensions.ExtensionManager()
-
- mapper = nova.api.openstack.ProjectMapper()
- self.resources = {}
- self._setup_routes(mapper)
- self._setup_ext_routes(mapper, ext_mgr)
- self._setup_extensions(ext_mgr)
- super(APIRouter, self).__init__(mapper)
-
- def _setup_ext_routes(self, mapper, ext_mgr):
- for resource in ext_mgr.get_resources():
- LOG.debug(_('Extended resource: %s'),
- resource.collection)
-
- wsgi_resource = wsgi.Resource(resource.controller)
- self.resources[resource.collection] = wsgi_resource
- kargs = dict(
- controller=wsgi_resource,
- collection=resource.collection_actions,
- member=resource.member_actions)
-
- if resource.parent:
- kargs['parent_resource'] = resource.parent
-
- mapper.resource(resource.collection, resource.collection, **kargs)
-
- if resource.custom_routes_fn:
- resource.custom_routes_fn(mapper, wsgi_resource)
-
- def _setup_extensions(self, ext_mgr):
- for extension in ext_mgr.get_controller_extensions():
- ext_name = extension.extension.name
- collection = extension.collection
- controller = extension.controller
-
- if collection not in self.resources:
- LOG.warning(_('Extension %(ext_name)s: Cannot extend '
- 'resource %(collection)s: No such resource') %
- locals())
- continue
-
- LOG.debug(_('Extension %(ext_name)s extending resource: '
- '%(collection)s') % locals())
-
- resource = self.resources[collection]
- resource.register_actions(controller)
- resource.register_extensions(controller)
+ ExtensionManager = extensions.ExtensionManager
def _setup_routes(self, mapper):
self.resources['versions'] = versions.create_resource()
diff --git a/nova/api/openstack/volume/__init__.py b/nova/api/openstack/volume/__init__.py
index fb1a97f73..8dbae267b 100644
--- a/nova/api/openstack/volume/__init__.py
+++ b/nova/api/openstack/volume/__init__.py
@@ -20,85 +20,24 @@
WSGI middleware for OpenStack Volume API.
"""
-import webob.dec
-import webob.exc
-
import nova.api.openstack
from nova.api.openstack.volume import extensions
from nova.api.openstack.volume import snapshots
from nova.api.openstack.volume import types
from nova.api.openstack.volume import volumes
from nova.api.openstack.volume import versions
-from nova.api.openstack import wsgi
-from nova import flags
from nova import log as logging
-from nova import wsgi as base_wsgi
LOG = logging.getLogger('nova.api.openstack.volume')
-FLAGS = flags.FLAGS
-class APIRouter(base_wsgi.Router):
+class APIRouter(nova.api.openstack.APIRouter):
"""
Routes requests on the OpenStack API to the appropriate controller
and method.
"""
-
- @classmethod
- def factory(cls, global_config, **local_config):
- """Simple paste factory, :class:`nova.wsgi.Router` doesn't have one"""
- return cls()
-
- def __init__(self, ext_mgr=None):
- if ext_mgr is None:
- ext_mgr = extensions.ExtensionManager()
-
- mapper = nova.api.openstack.ProjectMapper()
- self.resources = {}
- self._setup_routes(mapper)
- self._setup_ext_routes(mapper, ext_mgr)
- self._setup_extensions(ext_mgr)
- super(APIRouter, self).__init__(mapper)
-
- def _setup_ext_routes(self, mapper, ext_mgr):
- for resource in ext_mgr.get_resources():
- LOG.debug(_('Extended resource: %s'),
- resource.collection)
-
- wsgi_resource = wsgi.Resource(resource.controller)
- self.resources[resource.collection] = wsgi_resource
- kargs = dict(
- controller=wsgi_resource,
- collection=resource.collection_actions,
- member=resource.member_actions)
-
- if resource.parent:
- kargs['parent_resource'] = resource.parent
-
- mapper.resource(resource.collection, resource.collection, **kargs)
-
- if resource.custom_routes_fn:
- resource.custom_routes_fn(mapper, wsgi_resource)
-
- def _setup_extensions(self, ext_mgr):
- for extension in ext_mgr.get_controller_extensions():
- ext_name = extension.extension.name
- collection = extension.collection
- controller = extension.controller
-
- if collection not in self.resources:
- LOG.warning(_('Extension %(ext_name)s: Cannot extend '
- 'resource %(collection)s: No such resource') %
- locals())
- continue
-
- LOG.debug(_('Extension %(ext_name)s extending resource: '
- '%(collection)s') % locals())
-
- resource = self.resources[collection]
- resource.register_actions(controller)
- resource.register_extensions(controller)
+ ExtensionManager = extensions.ExtensionManager
def _setup_routes(self, mapper):
self.resources['versions'] = versions.create_resource()
diff --git a/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py b/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py
index 27341f199..939957471 100644
--- a/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py
+++ b/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py
@@ -21,7 +21,7 @@ from lxml import etree
from nova.api import auth
from nova.api.openstack import compute
-from nova.api.openstack.compute import wsgi
+from nova.api.openstack import wsgi
from nova.api.openstack.compute.contrib import cloudpipe
from nova import context
from nova import db
diff --git a/nova/tests/api/openstack/compute/test_api.py b/nova/tests/api/openstack/compute/test_api.py
index da23ee711..dbb187c40 100644
--- a/nova/tests/api/openstack/compute/test_api.py
+++ b/nova/tests/api/openstack/compute/test_api.py
@@ -24,7 +24,7 @@ from webob import Request
from nova import test
from nova.api import openstack as openstack_api
-from nova.api.openstack.compute import wsgi
+from nova.api.openstack import wsgi
from nova.tests.api.openstack import fakes