From 7aefc22f1e5ec6b272d89e6ed8343604ee96472a Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 3 Aug 2012 13:11:52 -0700 Subject: [PATCH] Allow loaded extensions to be checked from servers related to blueprint disable-server-extensions Adds an is_loaded method to the extension manager and passes the extension manager to the servers controller so that it can be used to enable optional post parameters. The extension manager is also saved in ExtensionDescriptors because they may need access to it if they are subclassing the servers Controller. Tests are included to verify that extension loading can be properly determined. Change-Id: Ie4effbb885370dc80d86ee13d27c9263f7f63cad --- nova/api/openstack/__init__.py | 4 ++-- nova/api/openstack/compute/__init__.py | 4 ++-- nova/api/openstack/compute/contrib/config_drive.py | 2 +- nova/api/openstack/compute/contrib/createserverext.py | 2 +- nova/api/openstack/compute/contrib/keypairs.py | 2 +- nova/api/openstack/compute/contrib/volumes.py | 4 ++-- nova/api/openstack/compute/servers.py | 7 ++++--- nova/api/openstack/extensions.py | 4 ++++ nova/api/openstack/volume/__init__.py | 2 +- nova/tests/api/openstack/compute/test_extensions.py | 4 ++-- nova/tests/api/openstack/compute/test_servers.py | 10 +++++++++- 11 files changed, 29 insertions(+), 16 deletions(-) diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index a5274e03b2f8..e84353df9965 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -122,7 +122,7 @@ class APIRouter(base_wsgi.Router): mapper = ProjectMapper() self.resources = {} - self._setup_routes(mapper) + self._setup_routes(mapper, ext_mgr) self._setup_ext_routes(mapper, ext_mgr) self._setup_extensions(ext_mgr) super(APIRouter, self).__init__(mapper) @@ -166,5 +166,5 @@ class APIRouter(base_wsgi.Router): resource.register_actions(controller) resource.register_extensions(controller) - def _setup_routes(self, mapper): + def _setup_routes(self, mapper, ext_mgr): raise NotImplementedError diff --git a/nova/api/openstack/compute/__init__.py b/nova/api/openstack/compute/__init__.py index 081290b10bd4..70ec80dc2ca8 100644 --- a/nova/api/openstack/compute/__init__.py +++ b/nova/api/openstack/compute/__init__.py @@ -53,7 +53,7 @@ class APIRouter(nova.api.openstack.APIRouter): """ ExtensionManager = extensions.ExtensionManager - def _setup_routes(self, mapper): + def _setup_routes(self, mapper, ext_mgr): self.resources['versions'] = versions.create_resource() mapper.connect("versions", "/", controller=self.resources['versions'], @@ -67,7 +67,7 @@ class APIRouter(nova.api.openstack.APIRouter): parent_resource=dict(member_name='server', collection_name='servers')) - self.resources['servers'] = servers.create_resource() + self.resources['servers'] = servers.create_resource(ext_mgr) mapper.resource("server", "servers", controller=self.resources['servers'], collection={'detail': 'GET'}, diff --git a/nova/api/openstack/compute/contrib/config_drive.py b/nova/api/openstack/compute/contrib/config_drive.py index 3ec2c3db4fa1..779aad539f8d 100644 --- a/nova/api/openstack/compute/contrib/config_drive.py +++ b/nova/api/openstack/compute/contrib/config_drive.py @@ -82,6 +82,6 @@ class Config_drive(extensions.ExtensionDescriptor): updated = "2012-07-16T00:00:00+00:00" def get_controller_extensions(self): - controller = Controller() + controller = Controller(self.ext_mgr) extension = extensions.ControllerExtension(self, 'servers', controller) return [extension] diff --git a/nova/api/openstack/compute/contrib/createserverext.py b/nova/api/openstack/compute/contrib/createserverext.py index 08407aacad2a..ebb24e5598ca 100644 --- a/nova/api/openstack/compute/contrib/createserverext.py +++ b/nova/api/openstack/compute/contrib/createserverext.py @@ -55,7 +55,7 @@ class Createserverext(extensions.ExtensionDescriptor): def get_resources(self): resources = [] - controller = Controller() + controller = Controller(self.ext_mgr) res = extensions.ResourceExtension('os-create-server-ext', controller=controller) diff --git a/nova/api/openstack/compute/contrib/keypairs.py b/nova/api/openstack/compute/contrib/keypairs.py index c3f9c69ef68a..db503ffddc1a 100644 --- a/nova/api/openstack/compute/contrib/keypairs.py +++ b/nova/api/openstack/compute/contrib/keypairs.py @@ -190,6 +190,6 @@ class Keypairs(extensions.ExtensionDescriptor): return resources def get_controller_extensions(self): - controller = Controller() + controller = Controller(self.ext_mgr) extension = extensions.ControllerExtension(self, 'servers', controller) return [extension] diff --git a/nova/api/openstack/compute/contrib/volumes.py b/nova/api/openstack/compute/contrib/volumes.py index 085f8d7c5d5a..1f231d600e2d 100644 --- a/nova/api/openstack/compute/contrib/volumes.py +++ b/nova/api/openstack/compute/contrib/volumes.py @@ -597,8 +597,8 @@ class Volumes(extensions.ExtensionDescriptor): collection_name='servers')) resources.append(res) - res = extensions.ResourceExtension('os-volumes_boot', - BootFromVolumeController()) + controller = BootFromVolumeController(self.ext_mgr) + res = extensions.ResourceExtension('os-volumes_boot', controller) resources.append(res) res = extensions.ResourceExtension('os-snapshots', diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index 0b37b5c57eb8..e71f2bcea928 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -360,9 +360,10 @@ class Controller(wsgi.Controller): # Convenience return return robj - def __init__(self, **kwargs): + def __init__(self, ext_mgr=None, **kwargs): super(Controller, self).__init__(**kwargs) self.compute_api = compute.API() + self.ext_mgr = ext_mgr @wsgi.serializers(xml=MinimalServersTemplate) def index(self, req): @@ -1160,8 +1161,8 @@ class Controller(wsgi.Controller): 'changes-since') -def create_resource(): - return wsgi.Resource(Controller()) +def create_resource(ext_mgr): + return wsgi.Resource(Controller(ext_mgr)) def remove_invalid_options(context, search_options, allowed_search_options): diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py index 5d5c750a2b3c..da2157ad8cd7 100644 --- a/nova/api/openstack/extensions.py +++ b/nova/api/openstack/extensions.py @@ -63,6 +63,7 @@ class ExtensionDescriptor(object): """Register extension with the extension manager.""" ext_mgr.register(self) + self.ext_mgr = ext_mgr def get_resources(self): """List of extensions.ResourceExtension extension objects. @@ -179,6 +180,9 @@ class ExtensionManager(object): """ + def is_loaded(self, alias): + return alias in self.extensions + def register(self, ext): # Do nothing if the extension doesn't check out if not self._check_extension(ext): diff --git a/nova/api/openstack/volume/__init__.py b/nova/api/openstack/volume/__init__.py index 3e6f731e1b49..092ce6c5d39b 100644 --- a/nova/api/openstack/volume/__init__.py +++ b/nova/api/openstack/volume/__init__.py @@ -39,7 +39,7 @@ class APIRouter(nova.api.openstack.APIRouter): """ ExtensionManager = extensions.ExtensionManager - def _setup_routes(self, mapper): + def _setup_routes(self, mapper, ext_mgr): self.resources['versions'] = versions.create_resource() mapper.connect("versions", "/", controller=self.resources['versions'], diff --git a/nova/tests/api/openstack/compute/test_extensions.py b/nova/tests/api/openstack/compute/test_extensions.py index c426a57274ba..32533936bad4 100644 --- a/nova/tests/api/openstack/compute/test_extensions.py +++ b/nova/tests/api/openstack/compute/test_extensions.py @@ -380,8 +380,8 @@ class ExtensionManagerTest(ExtensionTestCase): app = compute.APIRouter() ext_mgr = compute_extensions.ExtensionManager() ext_mgr.register(InvalidExtension()) - self.assertTrue('FOXNSOX' in ext_mgr.extensions) - self.assertTrue('THIRD' not in ext_mgr.extensions) + self.assertTrue(ext_mgr.is_loaded('FOXNSOX')) + self.assertFalse(ext_mgr.is_loaded('THIRD')) class ActionExtensionTest(ExtensionTestCase): diff --git a/nova/tests/api/openstack/compute/test_servers.py b/nova/tests/api/openstack/compute/test_servers.py index 49af5bdfa33c..2cb146358a22 100644 --- a/nova/tests/api/openstack/compute/test_servers.py +++ b/nova/tests/api/openstack/compute/test_servers.py @@ -27,6 +27,7 @@ import nova.api.openstack.compute from nova.api.openstack.compute import ips from nova.api.openstack.compute import servers from nova.api.openstack.compute import views +from nova.api.openstack import extensions from nova.api.openstack import xmlutil import nova.compute.api from nova.compute import instance_types @@ -94,6 +95,7 @@ class MockSetAdminPassword(object): class ServersControllerTest(test.TestCase): + def setUp(self): super(ServersControllerTest, self).setUp() self.flags(verbose=True, use_ipv6=False) @@ -113,12 +115,18 @@ class ServersControllerTest(test.TestCase): self.stubs.Set(nova.db, 'instance_update_and_get_original', instance_update) - self.controller = servers.Controller() + self.ext_mgr = extensions.ExtensionManager() + self.controller = servers.Controller(self.ext_mgr) self.ips_controller = ips.Controller() fake_network.stub_out_nw_api_get_instance_nw_info(self.stubs, spectacular=True) + def test_can_check_loaded_extensions(self): + self.ext_mgr.extensions = {'os-fake': None} + self.assertTrue(self.controller.ext_mgr.is_loaded('os-fake')) + self.assertFalse(self.controller.ext_mgr.is_loaded('os-not-loaded')) + def test_requested_networks_prefix(self): uuid = 'br-00000000-0000-0000-0000-000000000000' requested_networks = [{'uuid': uuid}]