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:
Vishvananda Ishaya
2012-08-03 13:11:52 -07:00
parent 80aa9f54d7
commit 7aefc22f1e
11 changed files with 29 additions and 16 deletions

View File

@@ -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

View File

@@ -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'},

View File

@@ -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]

View File

@@ -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)

View File

@@ -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]

View File

@@ -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',

View File

@@ -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):

View File

@@ -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):

View File

@@ -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'],

View File

@@ -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):

View File

@@ -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}]