From fdd92c4ad987407dae96ab46a36e0db407ded718 Mon Sep 17 00:00:00 2001 From: Brian Lamar Date: Wed, 8 Feb 2012 15:29:02 -0500 Subject: Added ability to load specific extensions. For example, the following nova.conf configuration file: --osapi_compute_extension=nova.api.openstack.compute.contrib.select_extensions --osapi_compute_ext_list=Createserverext,Extended_status Would load only the Createserverext and Extended_status extensions. Change-Id: I8c2a444683c6e4114875827b44ef01e457eb94ac --- nova/api/openstack/compute/contrib/__init__.py | 7 +++++++ nova/api/openstack/extensions.py | 17 +++++++++++------ nova/api/openstack/volume/contrib/__init__.py | 7 +++++++ nova/flags.py | 10 ++++++++++ 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/nova/api/openstack/compute/contrib/__init__.py b/nova/api/openstack/compute/contrib/__init__.py index 2713a82f4..eaa9557af 100644 --- a/nova/api/openstack/compute/contrib/__init__.py +++ b/nova/api/openstack/compute/contrib/__init__.py @@ -21,12 +21,19 @@ It can't be called 'extensions' because that causes namespacing problems. """ +from nova import flags from nova import log as logging from nova.api.openstack import extensions +FLAGS = flags.FLAGS LOG = logging.getLogger('nova.api.openstack.compute.contrib') def standard_extensions(ext_mgr): extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__) + + +def select_extensions(ext_mgr): + extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__, + FLAGS.osapi_compute_ext_list) diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py index b55c05d7c..33cd0bf57 100644 --- a/nova/api/openstack/extensions.py +++ b/nova/api/openstack/extensions.py @@ -309,7 +309,7 @@ def wrap_errors(fn): return wrapped -def load_standard_extensions(ext_mgr, logger, path, package): +def load_standard_extensions(ext_mgr, logger, path, package, ext_list=None): """Registers all standard API extensions.""" # Walk through all the modules in our directory... @@ -331,13 +331,18 @@ def load_standard_extensions(ext_mgr, logger, path, package): continue # Try loading it - classname = ("%s%s.%s.%s%s" % - (package, relpkg, root, - root[0].upper(), root[1:])) + classname = "%s%s" % (root[0].upper(), root[1:]) + classpath = ("%s%s.%s.%s" % + (package, relpkg, root, classname)) + + if ext_list is not None and classname not in ext_list: + logger.debug("Skipping extension: %s" % classpath) + continue + try: - ext_mgr.load_extension(classname) + ext_mgr.load_extension(classpath) except Exception as exc: - logger.warn(_('Failed to load extension %(classname)s: ' + logger.warn(_('Failed to load extension %(classpath)s: ' '%(exc)s') % locals()) # Now, let's consider any subdirectories we may have... diff --git a/nova/api/openstack/volume/contrib/__init__.py b/nova/api/openstack/volume/contrib/__init__.py index 58c0413ab..01b585c69 100644 --- a/nova/api/openstack/volume/contrib/__init__.py +++ b/nova/api/openstack/volume/contrib/__init__.py @@ -21,12 +21,19 @@ It can't be called 'extensions' because that causes namespacing problems. """ +from nova import flags from nova import log as logging from nova.api.openstack import extensions +FLAGS = flags.FLAGS LOG = logging.getLogger('nova.api.openstack.volume.contrib') def standard_extensions(ext_mgr): extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__) + + +def select_extensions(ext_mgr): + extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__, + FLAGS.osapi_volume_ext_list) diff --git a/nova/flags.py b/nova/flags.py index de352c2d6..85e031d45 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -313,11 +313,21 @@ global_opts = [ cfg.StrOpt('ec2_path', default='/services/Cloud', help='suffix for ec2'), + cfg.ListOpt('osapi_compute_ext_list', + default=[], + help='Specify list of extensions to load when using osapi_' + 'compute_extension option with nova.api.openstack.' + 'compute.contrib.select_extensions'), cfg.MultiStrOpt('osapi_compute_extension', default=[ 'nova.api.openstack.compute.contrib.standard_extensions' ], help='osapi compute extension to load'), + cfg.ListOpt('osapi_volume_ext_list', + default=[], + help='Specify list of extensions to load when using osapi_' + 'volume_extension option with nova.api.openstack.' + 'volume.contrib.select_extensions'), cfg.MultiStrOpt('osapi_volume_extension', default=[ 'nova.api.openstack.volume.contrib.standard_extensions' -- cgit