Moving api v1 implementation into v1 directory

Adjusts paste to use composite factory for routing properly to v1 and
future api versions. Tests have been adjusted to match directory
structure.

progress on blueprint apiv2

Change-Id: I2cd3908705d224872b2d615cabe210fb1c453232
This commit is contained in:
Mike Perez 2012-11-09 01:57:44 -08:00
parent 6a2573a153
commit 9009948b43
22 changed files with 120 additions and 83 deletions

View File

@ -15,3 +15,18 @@
# 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 paste.urlmap
from cinder import flags
FLAGS = flags.FLAGS
def root_app_factory(loader, global_conf, **local_conf):
if not FLAGS.enable_v1_api:
del local_conf['/v1']
if not FLAGS.enable_v2_api:
del local_conf['/v2']
return paste.urlmap.urlmap_factory(loader, global_conf, **local_conf)

View File

@ -15,55 +15,3 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
WSGI middleware for OpenStack Volume API.
"""
from cinder.api import extensions
import cinder.api.openstack
from cinder.api.openstack.volume import limits
from cinder.api.openstack.volume import snapshots
from cinder.api.openstack.volume import types
from cinder.api.openstack.volume import volumes
from cinder.api import versions
from cinder.openstack.common import log as logging
LOG = logging.getLogger(__name__)
class APIRouter(cinder.api.openstack.APIRouter):
"""
Routes requests on the OpenStack API to the appropriate controller
and method.
"""
ExtensionManager = extensions.ExtensionManager
def _setup_routes(self, mapper, ext_mgr):
self.resources['versions'] = versions.create_resource()
mapper.connect("versions", "/",
controller=self.resources['versions'],
action='show')
mapper.redirect("", "/")
self.resources['volumes'] = volumes.create_resource(ext_mgr)
mapper.resource("volume", "volumes",
controller=self.resources['volumes'],
collection={'detail': 'GET'},
member={'action': 'POST'})
self.resources['types'] = types.create_resource()
mapper.resource("type", "types",
controller=self.resources['types'])
self.resources['snapshots'] = snapshots.create_resource(ext_mgr)
mapper.resource("snapshot", "snapshots",
controller=self.resources['snapshots'],
collection={'detail': 'GET'},
member={'action': 'POST'})
self.resources['limits'] = limits.create_resource()
mapper.resource("limit", "limits",
controller=self.resources['limits'])

View File

@ -20,8 +20,8 @@
import webob
from cinder.api import extensions
from cinder.api.openstack.volume import types
from cinder.api.openstack import wsgi
from cinder.api.v1 import types
from cinder.api.views import types as views_types
from cinder import exception
from cinder.volume import volume_types

View File

70
cinder/api/v1/router.py Normal file
View File

@ -0,0 +1,70 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2011 OpenStack LLC.
# Copyright 2011 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# 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.
"""
WSGI middleware for OpenStack Volume API.
"""
from cinder.api import extensions
import cinder.api.openstack
from cinder.api.v1 import limits
from cinder.api.v1 import snapshots
from cinder.api.v1 import types
from cinder.api.v1 import volumes
from cinder.api import versions
from cinder.openstack.common import log as logging
LOG = logging.getLogger(__name__)
class APIRouter(cinder.api.openstack.APIRouter):
"""
Routes requests on the OpenStack API to the appropriate controller
and method.
"""
ExtensionManager = extensions.ExtensionManager
def _setup_routes(self, mapper, ext_mgr):
self.resources['versions'] = versions.create_resource()
mapper.connect("versions", "/",
controller=self.resources['versions'],
action='show')
mapper.redirect("", "/")
self.resources['volumes'] = volumes.create_resource(ext_mgr)
mapper.resource("volume", "volumes",
controller=self.resources['volumes'],
collection={'detail': 'GET'},
member={'action': 'POST'})
self.resources['types'] = types.create_resource()
mapper.resource("type", "types",
controller=self.resources['types'])
self.resources['snapshots'] = snapshots.create_resource(ext_mgr)
mapper.resource("snapshot", "snapshots",
controller=self.resources['snapshots'],
collection={'detail': 'GET'},
member={'action': 'POST'})
self.resources['limits'] = limits.create_resource()
mapper.resource("limit", "limits",
controller=self.resources['limits'])

View File

@ -19,8 +19,8 @@ import webob
from webob import exc
from cinder.api import common
from cinder.api.openstack.volume import volumes
from cinder.api.openstack import wsgi
from cinder.api.v1 import volumes
from cinder.api import xmlutil
from cinder import exception
from cinder import flags

View File

@ -130,6 +130,10 @@ global_opts = [
cfg.StrOpt('volume_topic',
default='cinder-volume',
help='the topic volume nodes listen on'),
cfg.BoolOpt('enable_v1_api', default=True,
help=_("Deploy v1 of the Cinder API")),
cfg.BoolOpt('enable_v2_api', default=True,
help=_("Deploy v2 of the Cinder API")),
cfg.BoolOpt('api_rate_limit',
default=True,
help='whether to rate limit the api'),

View File

@ -25,10 +25,10 @@ import webob.request
from cinder.api.middleware import auth
from cinder.api.middleware import fault
from cinder.api.openstack import volume
from cinder.api.openstack.volume import limits
from cinder.api.openstack import wsgi as os_wsgi
from cinder.api import urlmap
from cinder.api.v1 import limits
from cinder.api.v1 import router
from cinder.api import versions
from cinder import context
from cinder import exception as exc
@ -64,7 +64,7 @@ def fake_wsgi(self, req):
def wsgi_app(inner_app_v1=None, fake_auth=True, fake_auth_context=None,
use_no_auth=False, ext_mgr=None):
if not inner_app_v1:
inner_app_v1 = volume.APIRouter(ext_mgr)
inner_app_v1 = router.APIRouter(ext_mgr)
if fake_auth:
if fake_auth_context is not None:

View File

@ -11,7 +11,7 @@ from cinder.volume import api as volume_api
def app():
# no auth, just let environ['cinder.context'] pass through
api = fakes.volume.APIRouter()
api = fakes.router.APIRouter()
mapper = fakes.urlmap.URLMap()
mapper['/v1'] = api
return mapper

View File

@ -50,7 +50,7 @@ def fake_volume_get_all(*args, **kwargs):
def app():
# no auth, just let environ['cinder.context'] pass through
api = fakes.volume.APIRouter()
api = fakes.router.APIRouter()
mapper = fakes.urlmap.URLMap()
mapper['/v1'] = api
return mapper

View File

@ -53,7 +53,7 @@ def fake_volume_get_all(*args, **kwargs):
def app():
# no auth, just let environ['cinder.context'] pass through
api = fakes.volume.APIRouter()
api = fakes.router.APIRouter()
mapper = fakes.urlmap.URLMap()
mapper['/v1'] = api
return mapper

View File

@ -20,7 +20,7 @@ import iso8601
from lxml import etree
import webob
from cinder.api.openstack import volume
from cinder.api.v1 import router
from cinder.api import xmlutil
from cinder import flags
from cinder.openstack.common import jsonutils
@ -51,7 +51,7 @@ class ExtensionControllerTest(ExtensionTestCase):
self.ext_list.sort()
def test_list_extensions_json(self):
app = volume.APIRouter()
app = router.APIRouter()
request = webob.Request.blank("/fake/extensions")
response = request.get_response(app)
self.assertEqual(200, response.status_int)
@ -88,7 +88,7 @@ class ExtensionControllerTest(ExtensionTestCase):
self.assertEqual(output['extension']['alias'], ext['alias'])
def test_get_extension_json(self):
app = volume.APIRouter()
app = router.APIRouter()
request = webob.Request.blank("/fake/extensions/FOXNSOX")
response = request.get_response(app)
self.assertEqual(200, response.status_int)
@ -103,13 +103,13 @@ class ExtensionControllerTest(ExtensionTestCase):
"links": []})
def test_get_non_existing_extension_json(self):
app = volume.APIRouter()
app = router.APIRouter()
request = webob.Request.blank("/fake/extensions/4")
response = request.get_response(app)
self.assertEqual(404, response.status_int)
def test_list_extensions_xml(self):
app = volume.APIRouter()
app = router.APIRouter()
request = webob.Request.blank("/fake/extensions")
request.accept = "application/xml"
response = request.get_response(app)
@ -134,7 +134,7 @@ class ExtensionControllerTest(ExtensionTestCase):
xmlutil.validate_schema(root, 'extensions')
def test_get_extension_xml(self):
app = volume.APIRouter()
app = router.APIRouter()
request = webob.Request.blank("/fake/extensions/FOXNSOX")
request.accept = "application/xml"
response = request.get_response(app)

View File

@ -14,10 +14,10 @@
# under the License.
from cinder.api.openstack import volume
from cinder.api.openstack.volume import snapshots
from cinder.api.openstack.volume import volumes
from cinder.api.openstack import wsgi
from cinder.api.v1 import router
from cinder.api.v1 import snapshots
from cinder.api.v1 import volumes
from cinder.api import versions
from cinder import flags
from cinder.openstack.common import log as logging
@ -50,7 +50,7 @@ class VolumeRouterTestCase(test.TestCase):
# NOTE(vish): versions is just returning text so, no need to stub.
self.stubs.Set(snapshots, 'create_resource', create_resource)
self.stubs.Set(volumes, 'create_resource', create_resource)
self.app = volume.APIRouter()
self.app = router.APIRouter()
def test_versions(self):
req = fakes.HTTPRequest.blank('')

View File

View File

@ -24,7 +24,7 @@ from xml.dom import minidom
from lxml import etree
import webob
from cinder.api.openstack.volume import limits
from cinder.api.v1 import limits
from cinder.api import views
from cinder.api import xmlutil
import cinder.context

View File

@ -18,7 +18,7 @@ import datetime
from lxml import etree
import webob
from cinder.api.openstack.volume import snapshots
from cinder.api.v1 import snapshots
from cinder import db
from cinder import exception
from cinder import flags

View File

@ -16,7 +16,7 @@
from lxml import etree
import webob
from cinder.api.openstack.volume import types
from cinder.api.v1 import types
from cinder.api.views import types as views_types
from cinder import exception
from cinder.openstack.common import timeutils

View File

@ -18,8 +18,8 @@ import datetime
from lxml import etree
import webob
from cinder.api.openstack.volume import extensions
from cinder.api.openstack.volume import volumes
from cinder.api import extensions
from cinder.api.v1 import volumes
from cinder import context
from cinder import db
from cinder import exception

View File

@ -3,15 +3,15 @@
#############
[composite:osapi_volume]
use = call:cinder.api.urlmap:urlmap_factory
/: osvolumeversions
use = call:cinder.api:root_app_factory
/: apiversions
/v1: openstack_volume_api_v1
[composite:openstack_volume_api_v1]
use = call:cinder.api.middleware.auth:pipeline_factory
noauth = faultwrap sizelimit noauth osapi_volume_app_v1
keystone = faultwrap sizelimit authtoken keystonecontext osapi_volume_app_v1
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_volume_app_v1
noauth = faultwrap sizelimit noauth apiv1
keystone = faultwrap sizelimit authtoken keystonecontext apiv1
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext apiv1
[filter:faultwrap]
paste.filter_factory = cinder.api.middleware.fault:FaultWrapper.factory
@ -22,10 +22,10 @@ paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory
[filter:sizelimit]
paste.filter_factory = cinder.api.middleware.sizelimit:RequestBodySizeLimiter.factory
[app:osapi_volume_app_v1]
paste.app_factory = cinder.api.openstack.volume:APIRouter.factory
[app:apiv1]
paste.app_factory = cinder.api.v1.router:APIRouter.factory
[pipeline:osvolumeversions]
[pipeline:apiversions]
pipeline = faultwrap osvolumeversionapp
[app:osvolumeversionapp]