summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortermie <github@anarkystic.com>2011-03-24 12:42:47 -0700
committertermie <github@anarkystic.com>2011-03-24 12:42:47 -0700
commit4a6db815b01c71076bae96c155396e5adbe8af90 (patch)
tree9e8c7690b71b55ca3983e3a48f19c8695f2daefb
parenta1bde64e91a8b76fd0e69c3bdfc51e4e85adf6f0 (diff)
better error handling and serialization
-rw-r--r--nova/api/direct.py9
-rw-r--r--nova/tests/test_direct.py12
2 files changed, 18 insertions, 3 deletions
diff --git a/nova/api/direct.py b/nova/api/direct.py
index 2e158e89e..bb2ace1c9 100644
--- a/nova/api/direct.py
+++ b/nova/api/direct.py
@@ -38,6 +38,7 @@ import routes
import webob
from nova import context
+from nova import exception
from nova import flags
from nova import utils
from nova import wsgi
@@ -205,10 +206,12 @@ class ServiceWrapper(wsgi.Controller):
# NOTE(vish): make sure we have no unicode keys for py2.6.
params = dict([(str(k), v) for (k, v) in params.iteritems()])
result = method(context, **params)
- if type(result) is dict or type(result) is list:
- return self._serialize(result, req.best_match_content_type())
- else:
+ if result is None or type(result) is str or type(result) is unicode:
return result
+ try:
+ return self._serialize(result, req.best_match_content_type())
+ except:
+ raise exception.Error("returned non-serializable type: %s" % result)
class Limited(object):
diff --git a/nova/tests/test_direct.py b/nova/tests/test_direct.py
index 001246fc4..383840234 100644
--- a/nova/tests/test_direct.py
+++ b/nova/tests/test_direct.py
@@ -33,6 +33,9 @@ from nova.api import direct
from nova.tests import test_cloud
+class ArbitraryObject(object):
+ pass
+
class FakeService(object):
def echo(self, context, data):
return {'data': data}
@@ -41,6 +44,9 @@ class FakeService(object):
return {'user': context.user_id,
'project': context.project_id}
+ def invalid_return(self, context):
+ return ArbitraryObject()
+
class DirectTestCase(test.TestCase):
def setUp(self):
@@ -86,6 +92,12 @@ class DirectTestCase(test.TestCase):
resp_parsed = json.loads(resp.body)
self.assertEqual(resp_parsed['data'], 'foo')
+ def test_invalid(self):
+ req = webob.Request.blank('/fake/invalid_return')
+ req.environ['openstack.context'] = self.context
+ req.method = 'POST'
+ self.assertRaises(exception.Error, req.get_response, self.router)
+
def test_proxy(self):
proxy = direct.Proxy(self.router)
rv = proxy.fake.echo(self.context, data='baz')