Allow loading only selected extensions
To help with speeding up API tests, allow loading only a selected list of extensions or resources. This is done using init_only=... parameter for the fakes.wsgi_app() factory. The change is backwards compatible, so existing tests do not require modification. Implements bp:api-tests-speed Change-Id: Ibdcedd522728cb10294fa69e45732b7f125b3cbb
This commit is contained in:
@@ -118,7 +118,7 @@ class APIRouter(base_wsgi.Router):
|
||||
"""Simple paste factory, :class:`nova.wsgi.Router` doesn't have one"""
|
||||
return cls()
|
||||
|
||||
def __init__(self, ext_mgr=None):
|
||||
def __init__(self, ext_mgr=None, init_only=None):
|
||||
if ext_mgr is None:
|
||||
if self.ExtensionManager:
|
||||
ext_mgr = self.ExtensionManager()
|
||||
@@ -127,16 +127,19 @@ class APIRouter(base_wsgi.Router):
|
||||
|
||||
mapper = ProjectMapper()
|
||||
self.resources = {}
|
||||
self._setup_routes(mapper, ext_mgr)
|
||||
self._setup_ext_routes(mapper, ext_mgr)
|
||||
self._setup_routes(mapper, ext_mgr, init_only)
|
||||
self._setup_ext_routes(mapper, ext_mgr, init_only)
|
||||
self._setup_extensions(ext_mgr)
|
||||
super(APIRouter, self).__init__(mapper)
|
||||
|
||||
def _setup_ext_routes(self, mapper, ext_mgr):
|
||||
def _setup_ext_routes(self, mapper, ext_mgr, init_only):
|
||||
for resource in ext_mgr.get_resources():
|
||||
LOG.debug(_('Extended resource: %s'),
|
||||
resource.collection)
|
||||
|
||||
if init_only is not None and resource.collection not in init_only:
|
||||
continue
|
||||
|
||||
inherits = None
|
||||
if resource.inherits:
|
||||
inherits = self.resources.get(resource.inherits)
|
||||
|
||||
@@ -53,69 +53,81 @@ class APIRouter(nova.api.openstack.APIRouter):
|
||||
"""
|
||||
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')
|
||||
def _setup_routes(self, mapper, ext_mgr, init_only):
|
||||
if init_only is None or 'versions' in init_only:
|
||||
self.resources['versions'] = versions.create_resource()
|
||||
mapper.connect("versions", "/",
|
||||
controller=self.resources['versions'],
|
||||
action='show')
|
||||
|
||||
mapper.redirect("", "/")
|
||||
|
||||
self.resources['consoles'] = consoles.create_resource()
|
||||
mapper.resource("console", "consoles",
|
||||
controller=self.resources['consoles'],
|
||||
parent_resource=dict(member_name='server',
|
||||
collection_name='servers'))
|
||||
|
||||
self.resources['servers'] = servers.create_resource(ext_mgr)
|
||||
mapper.resource("server", "servers",
|
||||
controller=self.resources['servers'],
|
||||
collection={'detail': 'GET'},
|
||||
member={'action': 'POST'})
|
||||
|
||||
self.resources['ips'] = ips.create_resource()
|
||||
mapper.resource("ip", "ips", controller=self.resources['ips'],
|
||||
parent_resource=dict(member_name='server',
|
||||
collection_name='servers'))
|
||||
|
||||
self.resources['images'] = images.create_resource()
|
||||
mapper.resource("image", "images",
|
||||
controller=self.resources['images'],
|
||||
collection={'detail': 'GET'})
|
||||
|
||||
self.resources['limits'] = limits.create_resource()
|
||||
mapper.resource("limit", "limits",
|
||||
controller=self.resources['limits'])
|
||||
|
||||
self.resources['flavors'] = flavors.create_resource()
|
||||
mapper.resource("flavor", "flavors",
|
||||
controller=self.resources['flavors'],
|
||||
collection={'detail': 'GET'},
|
||||
member={'action': 'POST'})
|
||||
|
||||
self.resources['image_metadata'] = image_metadata.create_resource()
|
||||
image_metadata_controller = self.resources['image_metadata']
|
||||
|
||||
mapper.resource("image_meta", "metadata",
|
||||
controller=image_metadata_controller,
|
||||
parent_resource=dict(member_name='image',
|
||||
collection_name='images'))
|
||||
|
||||
mapper.connect("metadata", "/{project_id}/images/{image_id}/metadata",
|
||||
controller=image_metadata_controller,
|
||||
action='update_all',
|
||||
conditions={"method": ['PUT']})
|
||||
|
||||
self.resources['server_metadata'] = server_metadata.create_resource()
|
||||
server_metadata_controller = self.resources['server_metadata']
|
||||
|
||||
mapper.resource("server_meta", "metadata",
|
||||
controller=server_metadata_controller,
|
||||
if init_only is None or 'consoles' in init_only:
|
||||
self.resources['consoles'] = consoles.create_resource()
|
||||
mapper.resource("console", "consoles",
|
||||
controller=self.resources['consoles'],
|
||||
parent_resource=dict(member_name='server',
|
||||
collection_name='servers'))
|
||||
|
||||
mapper.connect("metadata",
|
||||
"/{project_id}/servers/{server_id}/metadata",
|
||||
controller=server_metadata_controller,
|
||||
action='update_all',
|
||||
conditions={"method": ['PUT']})
|
||||
if init_only is None or 'consoles' in init_only or \
|
||||
'servers' in init_only or ips in init_only:
|
||||
self.resources['servers'] = servers.create_resource(ext_mgr)
|
||||
mapper.resource("server", "servers",
|
||||
controller=self.resources['servers'],
|
||||
collection={'detail': 'GET'},
|
||||
member={'action': 'POST'})
|
||||
|
||||
if init_only is None or 'ips' in init_only:
|
||||
self.resources['ips'] = ips.create_resource()
|
||||
mapper.resource("ip", "ips", controller=self.resources['ips'],
|
||||
parent_resource=dict(member_name='server',
|
||||
collection_name='servers'))
|
||||
|
||||
if init_only is None or 'images' in init_only:
|
||||
self.resources['images'] = images.create_resource()
|
||||
mapper.resource("image", "images",
|
||||
controller=self.resources['images'],
|
||||
collection={'detail': 'GET'})
|
||||
|
||||
if init_only is None or 'limits' in init_only:
|
||||
self.resources['limits'] = limits.create_resource()
|
||||
mapper.resource("limit", "limits",
|
||||
controller=self.resources['limits'])
|
||||
|
||||
if init_only is None or 'flavors' in init_only:
|
||||
self.resources['flavors'] = flavors.create_resource()
|
||||
mapper.resource("flavor", "flavors",
|
||||
controller=self.resources['flavors'],
|
||||
collection={'detail': 'GET'},
|
||||
member={'action': 'POST'})
|
||||
|
||||
if init_only is None or 'image_metadata' in init_only:
|
||||
self.resources['image_metadata'] = image_metadata.create_resource()
|
||||
image_metadata_controller = self.resources['image_metadata']
|
||||
|
||||
mapper.resource("image_meta", "metadata",
|
||||
controller=image_metadata_controller,
|
||||
parent_resource=dict(member_name='image',
|
||||
collection_name='images'))
|
||||
|
||||
mapper.connect("metadata",
|
||||
"/{project_id}/images/{image_id}/metadata",
|
||||
controller=image_metadata_controller,
|
||||
action='update_all',
|
||||
conditions={"method": ['PUT']})
|
||||
|
||||
if init_only is None or 'server_metadata' in init_only:
|
||||
self.resources['server_metadata'] = \
|
||||
server_metadata.create_resource()
|
||||
server_metadata_controller = self.resources['server_metadata']
|
||||
|
||||
mapper.resource("server_meta", "metadata",
|
||||
controller=server_metadata_controller,
|
||||
parent_resource=dict(member_name='server',
|
||||
collection_name='servers'))
|
||||
|
||||
mapper.connect("metadata",
|
||||
"/{project_id}/servers/{server_id}/metadata",
|
||||
controller=server_metadata_controller,
|
||||
action='update_all',
|
||||
conditions={"method": ['PUT']})
|
||||
|
||||
@@ -39,26 +39,30 @@ class APIRouter(nova.api.openstack.APIRouter):
|
||||
"""
|
||||
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')
|
||||
def _setup_routes(self, mapper, ext_mgr, init_only):
|
||||
if init_only is None or 'versions' in init_only:
|
||||
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'})
|
||||
if init_only is None or 'volumes' in init_only:
|
||||
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'])
|
||||
if init_only is None or 'types' in init_only:
|
||||
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'})
|
||||
if init_only is None or 'snapshots' in init_only:
|
||||
self.resources['snapshots'] = snapshots.create_resource(ext_mgr)
|
||||
mapper.resource("snapshot", "snapshots",
|
||||
controller=self.resources['snapshots'],
|
||||
collection={'detail': 'GET'},
|
||||
member={'action': 'POST'})
|
||||
|
||||
@@ -78,9 +78,9 @@ def fake_wsgi(self, req):
|
||||
|
||||
|
||||
def wsgi_app(inner_app_v2=None, fake_auth_context=None,
|
||||
use_no_auth=False, ext_mgr=None):
|
||||
use_no_auth=False, ext_mgr=None, init_only=None):
|
||||
if not inner_app_v2:
|
||||
inner_app_v2 = compute.APIRouter(ext_mgr)
|
||||
inner_app_v2 = compute.APIRouter(ext_mgr, init_only)
|
||||
|
||||
if use_no_auth:
|
||||
api_v2 = openstack_api.FaultWrapper(auth.NoAuthMiddleware(
|
||||
|
||||
Reference in New Issue
Block a user