From 1de51ef1a3b423967d6e2de8b71fd2a811e644a5 Mon Sep 17 00:00:00 2001 From: Stanislaw Pitucha Date: Fri, 12 Oct 2012 04:27:52 +0100 Subject: 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 --- nova/api/openstack/__init__.py | 11 ++- nova/api/openstack/compute/__init__.py | 132 ++++++++++++++++++--------------- nova/api/openstack/volume/__init__.py | 40 +++++----- nova/tests/api/openstack/fakes.py | 4 +- 4 files changed, 103 insertions(+), 84 deletions(-) diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index ada6024cf..d27b018c2 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -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) diff --git a/nova/api/openstack/compute/__init__.py b/nova/api/openstack/compute/__init__.py index 9bf36bf25..4af679ffb 100644 --- a/nova/api/openstack/compute/__init__.py +++ b/nova/api/openstack/compute/__init__.py @@ -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']}) diff --git a/nova/api/openstack/volume/__init__.py b/nova/api/openstack/volume/__init__.py index cc161416c..3aca5bebf 100644 --- a/nova/api/openstack/volume/__init__.py +++ b/nova/api/openstack/volume/__init__.py @@ -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'}) diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py index dc83447e4..58dc2df45 100644 --- a/nova/tests/api/openstack/fakes.py +++ b/nova/tests/api/openstack/fakes.py @@ -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( -- cgit