summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMelanie Witt <melwitt@yahoo-inc.com>2013-05-17 02:13:22 +0000
committerMelanie Witt <melwitt@yahoo-inc.com>2013-05-24 20:03:05 +0000
commitacaf9f83abe37a41a687936bb03f20cc183e5aaa (patch)
tree6d81dedf0c61aeaee836cfe747bbb0100ee0e313
parentf56d3e13eba566f6c262a96e1a967b596d54b0e4 (diff)
downloadnova-acaf9f83abe37a41a687936bb03f20cc183e5aaa.tar.gz
nova-acaf9f83abe37a41a687936bb03f20cc183e5aaa.tar.xz
nova-acaf9f83abe37a41a687936bb03f20cc183e5aaa.zip
removes project_id/tenant_id from v3 api urls
Adds a new APIMapper for V3 that doesn't prefix every url with the project_id/tenant_id. Partially implements blueprint v3-api-remove-project-id. Change-Id: I547a94e2db0dd967852b3cb8532dd0adb11e693b
-rw-r--r--nova/api/openstack/__init__.py14
-rw-r--r--nova/tests/api/openstack/fakes.py5
-rw-r--r--nova/tests/api/openstack/test_mapper.py48
3 files changed, 64 insertions, 3 deletions
diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py
index b2c189e79..18c38a2fd 100644
--- a/nova/api/openstack/__init__.py
+++ b/nova/api/openstack/__init__.py
@@ -117,6 +117,18 @@ class ProjectMapper(APIMapper):
**kwargs)
+class PlainMapper(APIMapper):
+ def resource(self, member_name, collection_name, **kwargs):
+ if 'parent_resource' in kwargs:
+ parent_resource = kwargs['parent_resource']
+ p_collection = parent_resource['collection_name']
+ p_member = parent_resource['member_name']
+ kwargs['path_prefix'] = '%s/:%s_id' % (p_collection, p_member)
+ routes.Mapper.resource(self, member_name,
+ collection_name,
+ **kwargs)
+
+
class APIRouter(base_wsgi.Router):
"""
Routes requests on the OpenStack API to the appropriate controller
@@ -222,7 +234,7 @@ class APIRouterV3(base_wsgi.Router):
check_func=_check_load_extension,
invoke_on_load=True)
- mapper = ProjectMapper()
+ mapper = PlainMapper()
self.resources = {}
# NOTE(cyeoh) Core API support is rewritten as extensions
diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py
index d05a35f71..2316093c2 100644
--- a/nova/tests/api/openstack/fakes.py
+++ b/nova/tests/api/openstack/fakes.py
@@ -311,8 +311,9 @@ class HTTPRequest(os_wsgi.Request):
class TestRouter(wsgi.Router):
- def __init__(self, controller):
- mapper = routes.Mapper()
+ def __init__(self, controller, mapper=None):
+ if not mapper:
+ mapper = routes.Mapper()
mapper.resource("test", "tests",
controller=os_wsgi.Resource(controller))
super(TestRouter, self).__init__(mapper)
diff --git a/nova/tests/api/openstack/test_mapper.py b/nova/tests/api/openstack/test_mapper.py
new file mode 100644
index 000000000..8b7e60d18
--- /dev/null
+++ b/nova/tests/api/openstack/test_mapper.py
@@ -0,0 +1,48 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 OpenStack Foundation
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import webob
+
+from nova.api import openstack as openstack_api
+from nova import test
+from nova.tests.api.openstack import fakes
+
+
+class MapperTest(test.TestCase):
+ def test_resource_project_prefix(self):
+ class Controller(object):
+ def index(self, req):
+ return 'foo'
+
+ app = fakes.TestRouter(Controller(),
+ openstack_api.ProjectMapper())
+ req = webob.Request.blank('/1234/tests')
+ resp = req.get_response(app)
+ self.assertEqual(resp.body, 'foo')
+ self.assertEqual(resp.status_int, 200)
+
+ def test_resource_no_project_prefix(self):
+ class Controller(object):
+ def index(self, req):
+ return 'foo'
+
+ app = fakes.TestRouter(Controller(),
+ openstack_api.PlainMapper())
+ req = webob.Request.blank('/tests')
+ resp = req.get_response(app)
+ self.assertEqual(resp.body, 'foo')
+ self.assertEqual(resp.status_int, 200)