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()
|
mapper = ProjectMapper()
|
||||||
self.resources = {}
|
self.resources = {}
|
||||||
self._setup_routes(mapper)
|
self._setup_routes(mapper, ext_mgr)
|
||||||
self._setup_ext_routes(mapper, ext_mgr)
|
self._setup_ext_routes(mapper, ext_mgr)
|
||||||
self._setup_extensions(ext_mgr)
|
self._setup_extensions(ext_mgr)
|
||||||
super(APIRouter, self).__init__(mapper)
|
super(APIRouter, self).__init__(mapper)
|
||||||
@@ -166,5 +166,5 @@ class APIRouter(base_wsgi.Router):
|
|||||||
resource.register_actions(controller)
|
resource.register_actions(controller)
|
||||||
resource.register_extensions(controller)
|
resource.register_extensions(controller)
|
||||||
|
|
||||||
def _setup_routes(self, mapper):
|
def _setup_routes(self, mapper, ext_mgr):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class APIRouter(nova.api.openstack.APIRouter):
|
|||||||
"""
|
"""
|
||||||
ExtensionManager = extensions.ExtensionManager
|
ExtensionManager = extensions.ExtensionManager
|
||||||
|
|
||||||
def _setup_routes(self, mapper):
|
def _setup_routes(self, mapper, ext_mgr):
|
||||||
self.resources['versions'] = versions.create_resource()
|
self.resources['versions'] = versions.create_resource()
|
||||||
mapper.connect("versions", "/",
|
mapper.connect("versions", "/",
|
||||||
controller=self.resources['versions'],
|
controller=self.resources['versions'],
|
||||||
@@ -67,7 +67,7 @@ class APIRouter(nova.api.openstack.APIRouter):
|
|||||||
parent_resource=dict(member_name='server',
|
parent_resource=dict(member_name='server',
|
||||||
collection_name='servers'))
|
collection_name='servers'))
|
||||||
|
|
||||||
self.resources['servers'] = servers.create_resource()
|
self.resources['servers'] = servers.create_resource(ext_mgr)
|
||||||
mapper.resource("server", "servers",
|
mapper.resource("server", "servers",
|
||||||
controller=self.resources['servers'],
|
controller=self.resources['servers'],
|
||||||
collection={'detail': 'GET'},
|
collection={'detail': 'GET'},
|
||||||
|
|||||||
@@ -82,6 +82,6 @@ class Config_drive(extensions.ExtensionDescriptor):
|
|||||||
updated = "2012-07-16T00:00:00+00:00"
|
updated = "2012-07-16T00:00:00+00:00"
|
||||||
|
|
||||||
def get_controller_extensions(self):
|
def get_controller_extensions(self):
|
||||||
controller = Controller()
|
controller = Controller(self.ext_mgr)
|
||||||
extension = extensions.ControllerExtension(self, 'servers', controller)
|
extension = extensions.ControllerExtension(self, 'servers', controller)
|
||||||
return [extension]
|
return [extension]
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class Createserverext(extensions.ExtensionDescriptor):
|
|||||||
|
|
||||||
def get_resources(self):
|
def get_resources(self):
|
||||||
resources = []
|
resources = []
|
||||||
controller = Controller()
|
controller = Controller(self.ext_mgr)
|
||||||
|
|
||||||
res = extensions.ResourceExtension('os-create-server-ext',
|
res = extensions.ResourceExtension('os-create-server-ext',
|
||||||
controller=controller)
|
controller=controller)
|
||||||
|
|||||||
@@ -190,6 +190,6 @@ class Keypairs(extensions.ExtensionDescriptor):
|
|||||||
return resources
|
return resources
|
||||||
|
|
||||||
def get_controller_extensions(self):
|
def get_controller_extensions(self):
|
||||||
controller = Controller()
|
controller = Controller(self.ext_mgr)
|
||||||
extension = extensions.ControllerExtension(self, 'servers', controller)
|
extension = extensions.ControllerExtension(self, 'servers', controller)
|
||||||
return [extension]
|
return [extension]
|
||||||
|
|||||||
@@ -597,8 +597,8 @@ class Volumes(extensions.ExtensionDescriptor):
|
|||||||
collection_name='servers'))
|
collection_name='servers'))
|
||||||
resources.append(res)
|
resources.append(res)
|
||||||
|
|
||||||
res = extensions.ResourceExtension('os-volumes_boot',
|
controller = BootFromVolumeController(self.ext_mgr)
|
||||||
BootFromVolumeController())
|
res = extensions.ResourceExtension('os-volumes_boot', controller)
|
||||||
resources.append(res)
|
resources.append(res)
|
||||||
|
|
||||||
res = extensions.ResourceExtension('os-snapshots',
|
res = extensions.ResourceExtension('os-snapshots',
|
||||||
|
|||||||
@@ -360,9 +360,10 @@ class Controller(wsgi.Controller):
|
|||||||
# Convenience return
|
# Convenience return
|
||||||
return robj
|
return robj
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, ext_mgr=None, **kwargs):
|
||||||
super(Controller, self).__init__(**kwargs)
|
super(Controller, self).__init__(**kwargs)
|
||||||
self.compute_api = compute.API()
|
self.compute_api = compute.API()
|
||||||
|
self.ext_mgr = ext_mgr
|
||||||
|
|
||||||
@wsgi.serializers(xml=MinimalServersTemplate)
|
@wsgi.serializers(xml=MinimalServersTemplate)
|
||||||
def index(self, req):
|
def index(self, req):
|
||||||
@@ -1160,8 +1161,8 @@ class Controller(wsgi.Controller):
|
|||||||
'changes-since')
|
'changes-since')
|
||||||
|
|
||||||
|
|
||||||
def create_resource():
|
def create_resource(ext_mgr):
|
||||||
return wsgi.Resource(Controller())
|
return wsgi.Resource(Controller(ext_mgr))
|
||||||
|
|
||||||
|
|
||||||
def remove_invalid_options(context, search_options, allowed_search_options):
|
def remove_invalid_options(context, search_options, allowed_search_options):
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ class ExtensionDescriptor(object):
|
|||||||
"""Register extension with the extension manager."""
|
"""Register extension with the extension manager."""
|
||||||
|
|
||||||
ext_mgr.register(self)
|
ext_mgr.register(self)
|
||||||
|
self.ext_mgr = ext_mgr
|
||||||
|
|
||||||
def get_resources(self):
|
def get_resources(self):
|
||||||
"""List of extensions.ResourceExtension extension objects.
|
"""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):
|
def register(self, ext):
|
||||||
# Do nothing if the extension doesn't check out
|
# Do nothing if the extension doesn't check out
|
||||||
if not self._check_extension(ext):
|
if not self._check_extension(ext):
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class APIRouter(nova.api.openstack.APIRouter):
|
|||||||
"""
|
"""
|
||||||
ExtensionManager = extensions.ExtensionManager
|
ExtensionManager = extensions.ExtensionManager
|
||||||
|
|
||||||
def _setup_routes(self, mapper):
|
def _setup_routes(self, mapper, ext_mgr):
|
||||||
self.resources['versions'] = versions.create_resource()
|
self.resources['versions'] = versions.create_resource()
|
||||||
mapper.connect("versions", "/",
|
mapper.connect("versions", "/",
|
||||||
controller=self.resources['versions'],
|
controller=self.resources['versions'],
|
||||||
|
|||||||
@@ -380,8 +380,8 @@ class ExtensionManagerTest(ExtensionTestCase):
|
|||||||
app = compute.APIRouter()
|
app = compute.APIRouter()
|
||||||
ext_mgr = compute_extensions.ExtensionManager()
|
ext_mgr = compute_extensions.ExtensionManager()
|
||||||
ext_mgr.register(InvalidExtension())
|
ext_mgr.register(InvalidExtension())
|
||||||
self.assertTrue('FOXNSOX' in ext_mgr.extensions)
|
self.assertTrue(ext_mgr.is_loaded('FOXNSOX'))
|
||||||
self.assertTrue('THIRD' not in ext_mgr.extensions)
|
self.assertFalse(ext_mgr.is_loaded('THIRD'))
|
||||||
|
|
||||||
|
|
||||||
class ActionExtensionTest(ExtensionTestCase):
|
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 ips
|
||||||
from nova.api.openstack.compute import servers
|
from nova.api.openstack.compute import servers
|
||||||
from nova.api.openstack.compute import views
|
from nova.api.openstack.compute import views
|
||||||
|
from nova.api.openstack import extensions
|
||||||
from nova.api.openstack import xmlutil
|
from nova.api.openstack import xmlutil
|
||||||
import nova.compute.api
|
import nova.compute.api
|
||||||
from nova.compute import instance_types
|
from nova.compute import instance_types
|
||||||
@@ -94,6 +95,7 @@ class MockSetAdminPassword(object):
|
|||||||
|
|
||||||
|
|
||||||
class ServersControllerTest(test.TestCase):
|
class ServersControllerTest(test.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(ServersControllerTest, self).setUp()
|
super(ServersControllerTest, self).setUp()
|
||||||
self.flags(verbose=True, use_ipv6=False)
|
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',
|
self.stubs.Set(nova.db, 'instance_update_and_get_original',
|
||||||
instance_update)
|
instance_update)
|
||||||
|
|
||||||
self.controller = servers.Controller()
|
self.ext_mgr = extensions.ExtensionManager()
|
||||||
|
self.controller = servers.Controller(self.ext_mgr)
|
||||||
self.ips_controller = ips.Controller()
|
self.ips_controller = ips.Controller()
|
||||||
|
|
||||||
fake_network.stub_out_nw_api_get_instance_nw_info(self.stubs,
|
fake_network.stub_out_nw_api_get_instance_nw_info(self.stubs,
|
||||||
spectacular=True)
|
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):
|
def test_requested_networks_prefix(self):
|
||||||
uuid = 'br-00000000-0000-0000-0000-000000000000'
|
uuid = 'br-00000000-0000-0000-0000-000000000000'
|
||||||
requested_networks = [{'uuid': uuid}]
|
requested_networks = [{'uuid': uuid}]
|
||||||
|
|||||||
Reference in New Issue
Block a user