From 2e2c710989dd88c022af7d96d06ad45e8a293813 Mon Sep 17 00:00:00 2001 From: He Jie Xu Date: Wed, 29 Jul 2015 16:28:59 +0800 Subject: [PATCH] Return v2 version info with v2 legacy compatible wrapper When v2 legacy compatible wrapper enabled, the version API should return v2 version info. Implements blueprint api-relax-validation Change-Id: I16dd6da4d41594e7b906ffe617d694740a33b3dd --- .../openstack/compute/plugins/v3/versions.py | 2 ++ .../api/openstack/compute/test_versions.py | 25 +++++++++++++------ nova/tests/unit/api/openstack/fakes.py | 6 ++++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/nova/api/openstack/compute/plugins/v3/versions.py b/nova/api/openstack/compute/plugins/v3/versions.py index 9d0eb6d470e2..dca5a9d931db 100644 --- a/nova/api/openstack/compute/plugins/v3/versions.py +++ b/nova/api/openstack/compute/plugins/v3/versions.py @@ -28,6 +28,8 @@ class VersionsController(wsgi.Controller): @extensions.expected_errors(404) def show(self, req, id='v2.1'): builder = views_versions.get_view_builder(req) + if req.is_legacy_v2(): + id = 'v2.0' if id not in versions.VERSIONS: raise webob.exc.HTTPNotFound() diff --git a/nova/tests/unit/api/openstack/compute/test_versions.py b/nova/tests/unit/api/openstack/compute/test_versions.py index c1999e2a578f..20f8a7dc839f 100644 --- a/nova/tests/unit/api/openstack/compute/test_versions.py +++ b/nova/tests/unit/api/openstack/compute/test_versions.py @@ -101,10 +101,14 @@ def _get_self_href(response): class VersionsTestV20(test.NoDBTestCase): + def setUp(self): + super(VersionsTestV20, self).setUp() + self.wsgi_app = fakes.wsgi_app() + def test_get_version_list(self): req = webob.Request.blank('/') req.accept = "application/json" - res = req.get_response(fakes.wsgi_app()) + res = req.get_response(self.wsgi_app) self.assertEqual(res.status_int, 200) self.assertEqual(res.content_type, "application/json") versions = jsonutils.loads(res.body)["versions"] @@ -139,7 +143,7 @@ class VersionsTestV20(test.NoDBTestCase): def test_get_version_list_302(self): req = webob.Request.blank('/v2') req.accept = "application/json" - res = req.get_response(fakes.wsgi_app()) + res = req.get_response(self.wsgi_app) self.assertEqual(res.status_int, 302) redirect_req = webob.Request.blank('/v2/') self.assertEqual(res.location, redirect_req.url) @@ -149,7 +153,7 @@ class VersionsTestV20(test.NoDBTestCase): accept = "application/json" req = webob.Request.blank(url) req.accept = accept - res = req.get_response(fakes.wsgi_app()) + res = req.get_response(self.wsgi_app) self.assertEqual(res.status_int, 200) self.assertEqual(res.content_type, "application/json") version = jsonutils.loads(res.body) @@ -192,13 +196,13 @@ class VersionsTestV20(test.NoDBTestCase): def test_get_version_2_versions_invalid(self): req = webob.Request.blank('/v2/versions/1234') req.accept = "application/json" - res = req.get_response(fakes.wsgi_app()) + res = req.get_response(self.wsgi_app) self.assertEqual(404, res.status_int) def test_multi_choice_image(self): req = webob.Request.blank('/images/1') req.accept = "application/json" - res = req.get_response(fakes.wsgi_app()) + res = req.get_response(self.wsgi_app) self.assertEqual(res.status_int, 300) self.assertEqual(res.content_type, "application/json") @@ -249,7 +253,7 @@ class VersionsTestV20(test.NoDBTestCase): """ req = webob.Request.blank('/servers') req.accept = "application/atom+xml" - res = req.get_response(fakes.wsgi_app()) + res = req.get_response(self.wsgi_app) self.assertEqual(res.status_int, 300) self.assertEqual(res.content_type, "application/json") @@ -257,7 +261,7 @@ class VersionsTestV20(test.NoDBTestCase): uuid = str(stdlib_uuid.uuid4()) req = webob.Request.blank('/servers/' + uuid) req.accept = "application/json" - res = req.get_response(fakes.wsgi_app()) + res = req.get_response(self.wsgi_app) self.assertEqual(res.status_int, 300) self.assertEqual(res.content_type, "application/json") @@ -455,3 +459,10 @@ class VersionBehindSslTestCase(test.NoDBTestCase): self.assertEqual(200, res.status_int) href = _get_self_href(res) self.assertTrue(href.startswith('https://')) + + +class VersionsTestV21WithV2CompatibleWrapper(VersionsTestV20): + + def setUp(self): + super(VersionsTestV21WithV2CompatibleWrapper, self).setUp() + self.wsgi_app = fakes.wsgi_app_v21(v2_compatible=True) diff --git a/nova/tests/unit/api/openstack/fakes.py b/nova/tests/unit/api/openstack/fakes.py index a56228cd8d9d..5728e1e34cc8 100644 --- a/nova/tests/unit/api/openstack/fakes.py +++ b/nova/tests/unit/api/openstack/fakes.py @@ -105,10 +105,13 @@ def wsgi_app(inner_app_v2=None, fake_auth_context=None, def wsgi_app_v21(inner_app_v21=None, fake_auth_context=None, - use_no_auth=False, ext_mgr=None, init_only=None): + use_no_auth=False, ext_mgr=None, init_only=None, v2_compatible=False): if not inner_app_v21: inner_app_v21 = compute.APIRouterV21(init_only) + if v2_compatible: + inner_app_v21 = openstack_api.LegacyV2CompatibleWrapper(inner_app_v21) + if use_no_auth: api_v21 = openstack_api.FaultWrapper(auth.NoAuthMiddlewareV3( limits.RateLimitingMiddleware(inner_app_v21))) @@ -123,6 +126,7 @@ def wsgi_app_v21(inner_app_v21=None, fake_auth_context=None, mapper = urlmap.URLMap() mapper['/v2'] = api_v21 mapper['/v2.1'] = api_v21 + mapper['/'] = openstack_api.FaultWrapper(versions.Versions()) return mapper