summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Prince <dan.prince@rackspace.com>2011-05-12 12:52:32 -0400
committerDan Prince <dan.prince@rackspace.com>2011-05-12 12:52:32 -0400
commitce2b13d9fb30c0afbcff97f434d7423cad39b8b9 (patch)
treeae457d0b14a84aff78616adeabe92ee7767fc881
parent22c33d80ce040f09c9bcd7584cf1165cf769e192 (diff)
downloadnova-ce2b13d9fb30c0afbcff97f434d7423cad39b8b9.tar.gz
nova-ce2b13d9fb30c0afbcff97f434d7423cad39b8b9.tar.xz
nova-ce2b13d9fb30c0afbcff97f434d7423cad39b8b9.zip
Remove ResponseExtensions. The new RequestExtension covers both use cases.
-rw-r--r--nova/api/openstack/extensions.py88
-rw-r--r--nova/tests/api/openstack/extensions/foxinsocks.py15
-rw-r--r--nova/tests/api/openstack/test_extensions.py75
3 files changed, 24 insertions, 154 deletions
diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py
index e6dd228ec..3a7763463 100644
--- a/nova/api/openstack/extensions.py
+++ b/nova/api/openstack/extensions.py
@@ -105,15 +105,14 @@ class ExtensionDescriptor(object):
actions = []
return actions
- def get_response_extensions(self):
- """List of extensions.ResponseExtension extension objects.
+ def get_request_extensions(self):
+ """List of extensions.RequestException extension objects.
- Response extensions are used to insert information into existing
- response data.
+ Request extensions are used to handle custom request data.
"""
- response_exts = []
- return response_exts
+ request_exts = []
+ return request_exts
class ActionExtensionController(common.OpenstackController):
@@ -137,34 +136,6 @@ class ActionExtensionController(common.OpenstackController):
return res
-class ResponseExtensionController(common.OpenstackController):
-
- def __init__(self, application):
- self.application = application
- self.handlers = []
-
- def add_handler(self, handler):
- self.handlers.append(handler)
-
- def process(self, req, *args, **kwargs):
- res = req.get_response(self.application)
- content_type = req.best_match_content_type()
- # currently response handlers are un-ordered
- for handler in self.handlers:
- res = handler(res)
- try:
- body = res.body
- headers = res.headers
- except AttributeError:
- default_xmlns = None
- body = self._serialize(res, content_type, default_xmlns)
- headers = {"Content-Type": content_type}
- res = webob.Response()
- res.body = body
- res.headers = headers
- return res
-
-
class RequestExtensionController(common.OpenstackController):
def __init__(self, application):
@@ -254,25 +225,6 @@ class ExtensionMiddleware(wsgi.Middleware):
return action_controllers
- def _response_ext_controllers(self, application, ext_mgr, mapper):
- """Returns a dict of ResponseExtensionController-s by collection."""
- response_ext_controllers = {}
- for resp_ext in ext_mgr.get_response_extensions():
- if not resp_ext.key in response_ext_controllers.keys():
- controller = ResponseExtensionController(application)
- mapper.connect(resp_ext.url_route + '.:(format)',
- action='process',
- controller=controller,
- conditions=resp_ext.conditions)
-
- mapper.connect(resp_ext.url_route,
- action='process',
- controller=controller,
- conditions=resp_ext.conditions)
- response_ext_controllers[resp_ext.key] = controller
-
- return response_ext_controllers
-
def _request_ext_controllers(self, application, ext_mgr, mapper):
"""Returns a dict of RequestExtensionController-s by collection."""
request_ext_controllers = {}
@@ -318,14 +270,6 @@ class ExtensionMiddleware(wsgi.Middleware):
controller = action_controllers[action.collection]
controller.add_action(action.action_name, action.handler)
- # extended responses
- resp_controllers = self._response_ext_controllers(application, ext_mgr,
- mapper)
- for response_ext in ext_mgr.get_response_extensions():
- LOG.debug(_('Extended response: %s'), response_ext.key)
- controller = resp_controllers[response_ext.key]
- controller.add_handler(response_ext.handler)
-
# extended requests
req_controllers = self._request_ext_controllers(application, ext_mgr,
mapper)
@@ -402,18 +346,6 @@ class ExtensionManager(object):
pass
return actions
- def get_response_extensions(self):
- """Returns a list of ResponseExtension objects."""
- response_exts = []
- for alias, ext in self.extensions.iteritems():
- try:
- response_exts.extend(ext.get_response_extensions())
- except AttributeError:
- # NOTE(dprince): Extension aren't required to have response
- # extensions
- pass
- return response_exts
-
def get_request_extensions(self):
"""Returns a list of RequestExtension objects."""
request_exts = []
@@ -488,16 +420,6 @@ class ExtensionManager(object):
self.extensions[alias] = ext
-class ResponseExtension(object):
- """Add data to responses from core nova OpenStack API controllers."""
-
- def __init__(self, method, url_route, handler):
- self.url_route = url_route
- self.handler = handler
- self.conditions = dict(method=[method])
- self.key = "%s-%s" % (method, url_route)
-
-
class RequestExtension(object):
"""Provide a way to handle custom request data that is sent to core
nova OpenStack API controllers.
diff --git a/nova/tests/api/openstack/extensions/foxinsocks.py b/nova/tests/api/openstack/extensions/foxinsocks.py
index 7699ffb56..b3f30c4e5 100644
--- a/nova/tests/api/openstack/extensions/foxinsocks.py
+++ b/nova/tests/api/openstack/extensions/foxinsocks.py
@@ -63,35 +63,32 @@ class Foxinsocks(object):
self._delete_tweedle))
return actions
- def get_response_extensions(self):
+ def get_request_extensions(self):
response_exts = []
- def _goose_handler(res):
+ def _goose_handler(req, res):
#NOTE: This only handles JSON responses.
# You can use content type header to test for XML.
data = json.loads(res.body)
- data['flavor']['googoose'] = "Gooey goo for chewy chewing!"
+ data['flavor']['googoose'] = req.GET.get('chewing')
return data
- resp_ext = extensions.ResponseExtension('GET', '/v1.1/flavors/:(id)',
+ resp_ext = extensions.RequestExtension('GET', '/v1.1/flavors/:(id)',
_goose_handler)
response_exts.append(resp_ext)
- def _bands_handler(res):
+ def _bands_handler(req, res):
#NOTE: This only handles JSON responses.
# You can use content type header to test for XML.
data = json.loads(res.body)
data['big_bands'] = 'Pig Bands!'
return data
- resp_ext2 = extensions.ResponseExtension('GET', '/v1.1/flavors/:(id)',
+ resp_ext2 = extensions.RequestExtension('GET', '/v1.1/flavors/:(id)',
_bands_handler)
response_exts.append(resp_ext2)
return response_exts
- def get_request_extensions(self):
- return []
-
def _add_tweedle(self, input_dict, req, id):
return "Tweedle Beetle Added."
diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py
index 7fadb5b69..c63474dea 100644
--- a/nova/tests/api/openstack/test_extensions.py
+++ b/nova/tests/api/openstack/test_extensions.py
@@ -45,11 +45,9 @@ class StubController(nova.wsgi.Controller):
class StubExtensionManager(object):
- def __init__(self, resource_ext=None, action_ext=None, response_ext=None,
- request_ext=None):
+ def __init__(self, resource_ext=None, action_ext=None, request_ext=None):
self.resource_ext = resource_ext
self.action_ext = action_ext
- self.response_ext = response_ext
self.request_ext = request_ext
def get_name(self):
@@ -73,12 +71,6 @@ class StubExtensionManager(object):
action_exts.append(self.action_ext)
return action_exts
- def get_response_extensions(self):
- response_exts = []
- if self.response_ext:
- response_exts.append(self.response_ext)
- return response_exts
-
def get_request_extensions(self):
request_extensions = []
if self.request_ext:
@@ -191,10 +183,10 @@ class ActionExtensionTest(unittest.TestCase):
self.assertEqual(404, response.status_int)
-class ResponseExtensionTest(unittest.TestCase):
+class RequestExtensionTest(unittest.TestCase):
def setUp(self):
- super(ResponseExtensionTest, self).setUp()
+ super(RequestExtensionTest, self).setUp()
self.stubs = stubout.StubOutForTesting()
fakes.FakeAuthManager.reset_fake_data()
fakes.FakeAuthDatabase.data = {}
@@ -203,79 +195,38 @@ class ResponseExtensionTest(unittest.TestCase):
def tearDown(self):
self.stubs.UnsetAll()
- super(ResponseExtensionTest, self).tearDown()
+ super(RequestExtensionTest, self).tearDown()
def test_get_resources_with_stub_mgr(self):
- test_resp = "Gooey goo for chewy chewing!"
-
- def _resp_handler(res):
+ def _req_handler(req, res):
# only handle JSON responses
data = json.loads(res.body)
- data['flavor']['googoose'] = test_resp
+ data['flavor']['googoose'] = req.GET.get('chewing')
return data
- resp_ext = extensions.ResponseExtension('GET',
+ req_ext = extensions.RequestExtension('GET',
'/v1.1/flavors/:(id)',
- _resp_handler)
+ _req_handler)
- manager = StubExtensionManager(None, None, resp_ext)
+ manager = StubExtensionManager(None, None, req_ext)
app = fakes.wsgi_app()
ext_midware = extensions.ExtensionMiddleware(app, manager)
- request = webob.Request.blank("/v1.1/flavors/1")
+ request = webob.Request.blank("/v1.1/flavors/1?chewing=bluegoo")
request.environ['api.version'] = '1.1'
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
response_data = json.loads(response.body)
- self.assertEqual(test_resp, response_data['flavor']['googoose'])
+ self.assertEqual('bluegoo', response_data['flavor']['googoose'])
def test_get_resources_with_mgr(self):
- test_resp = "Gooey goo for chewy chewing!"
-
app = fakes.wsgi_app()
ext_midware = extensions.ExtensionMiddleware(app)
- request = webob.Request.blank("/v1.1/flavors/1")
+ request = webob.Request.blank("/v1.1/flavors/1?chewing=newblue")
request.environ['api.version'] = '1.1'
response = request.get_response(ext_midware)
self.assertEqual(200, response.status_int)
response_data = json.loads(response.body)
- self.assertEqual(test_resp, response_data['flavor']['googoose'])
+ self.assertEqual('newblue', response_data['flavor']['googoose'])
self.assertEqual("Pig Bands!", response_data['big_bands'])
-
-
-class RequestExtensionTest(unittest.TestCase):
-
- def setUp(self):
- super(RequestExtensionTest, self).setUp()
- self.stubs = stubout.StubOutForTesting()
- fakes.FakeAuthManager.reset_fake_data()
- fakes.FakeAuthDatabase.data = {}
- fakes.stub_out_auth(self.stubs)
- self.context = context.get_admin_context()
-
- def tearDown(self):
- self.stubs.UnsetAll()
- super(RequestExtensionTest, self).tearDown()
-
- def test_post_request_extension_with_stub_mgr(self):
-
- def _req_handler(req, res):
- # only handle JSON responses
- data = json.loads(res.body)
- data['flavor']['googoose'] = req.GET.get('test_param')
- return data
-
- resp_ext = extensions.RequestExtension('GET',
- '/v1.1/flavors/:(id)',
- _req_handler)
-
- manager = StubExtensionManager(None, None, None, resp_ext)
- app = fakes.wsgi_app()
- ext_midware = extensions.ExtensionMiddleware(app, manager)
- request = webob.Request.blank("/v1.1/flavors/1?test_param=foo")
- request.environ['api.version'] = '1.1'
- response = request.get_response(ext_midware)
- self.assertEqual(200, response.status_int)
- response_data = json.loads(response.body)
- self.assertEqual('foo', response_data['flavor']['googoose'])