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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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'},
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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}]
|
||||
|
||||
Reference in New Issue
Block a user