Vinkesh/Deepak | Moved plugin related checks in ExtensionManager code to PluginAwareExtensionManager

This commit is contained in:
Deepak N 2011-07-19 11:53:57 +05:30
parent 2de192bb46
commit 4779f609f3
2 changed files with 42 additions and 31 deletions

View File

@ -261,9 +261,8 @@ class ExtensionMiddleware(wsgi.Middleware):
ext_mgr=None):
self.ext_mgr = (ext_mgr
or ExtensionManager(
config_params.get('api_extensions_path',
''), QuantumManager.get_plugin()))
or PluginAwareExtensionManager(
config_params.get('api_extensions_path', '')))
mapper = routes.Mapper()
@ -327,11 +326,9 @@ class ExtensionManager(object):
example extension implementation.
"""
def __init__(self, path, plugin):
def __init__(self, path):
LOG.info(_('Initializing extension manager.'))
self.path = path
self.plugin = plugin
self.extensions = {}
self._load_all_extensions()
@ -381,25 +378,10 @@ class ExtensionManager(object):
LOG.debug(_('Ext description: %s'), extension.get_description())
LOG.debug(_('Ext namespace: %s'), extension.get_namespace())
LOG.debug(_('Ext updated: %s'), extension.get_updated())
return (self._plugin_supports(extension) and
self._plugin_implements_interface(extension))
except AttributeError as ex:
LOG.exception(_("Exception loading extension: %s"), unicode(ex))
return False
def _plugin_supports(self, extension):
return (hasattr(self.plugin, "supports_extension") and
self.plugin.supports_extension(extension))
def _plugin_implements_interface(self, extension):
if(not hasattr(extension, "get_plugin_interface") or
extension.get_plugin_interface() is None):
return True
return isinstance(self.plugin, extension.get_plugin_interface())
def _get_public_methods(self, klass):
return filter(lambda name: not(name.startswith("_")),
klass.__dict__.keys())
return True
def _load_all_extensions(self):
"""Load extensions from the configured path.
@ -454,6 +436,31 @@ class ExtensionManager(object):
self.extensions[alias] = ext
class PluginAwareExtensionManager(ExtensionManager):
def __init__(self, path):
self.plugin = QuantumManager.get_plugin()
super(PluginAwareExtensionManager, self).__init__(path)
def _check_extension(self, extension):
"""Checks if plugin supports extension and implements the contract."""
extension_is_valid = super(PluginAwareExtensionManager,
self)._check_extension(extension)
return (extension_is_valid and
self._plugin_supports(extension) and
self._plugin_implements_interface(extension))
def _plugin_supports(self, extension):
return (hasattr(self.plugin, "supports_extension") and
self.plugin.supports_extension(extension))
def _plugin_implements_interface(self, extension):
if(not hasattr(extension, "get_plugin_interface") or
extension.get_plugin_interface() is None):
return True
return isinstance(self.plugin, extension.get_plugin_interface())
class RequestExtension(object):
"""Extend requests and responses of core Quantum OpenStack API controllers.

View File

@ -24,7 +24,8 @@ from webtest import TestApp
from quantum.common import extensions
from quantum.common import wsgi
from quantum.common import config
from quantum.common.extensions import ExtensionManager
from quantum.common.extensions import (ExtensionManager,
PluginAwareExtensionManager)
extension_index_response = "Try to say this Mr. Knox, sir..."
test_conf_file = os.path.join(os.path.dirname(__file__), os.pardir,
@ -121,10 +122,6 @@ class StubPluginInterface(extensions.PluginInterface):
class ExtensionManagerTest(unittest.TestCase):
def setUp(self):
self.ext_mgr = setup_extensions_middleware().ext_mgr
super(ExtensionManagerTest, self).setUp()
def test_invalid_extensions_are_not_registered(self):
class InvalidExtension(object):
@ -135,11 +132,18 @@ class ExtensionManagerTest(unittest.TestCase):
def get_alias(self):
return "invalid_extension"
self.ext_mgr.add_extension(InvalidExtension())
self.ext_mgr.add_extension(StubExtension("valid_extension"))
ext_mgr = ExtensionManager('')
ext_mgr.add_extension(InvalidExtension())
ext_mgr.add_extension(StubExtension("valid_extension"))
self.assertTrue('valid_extension' in self.ext_mgr.extensions)
self.assertFalse('invalid_extension' in self.ext_mgr.extensions)
self.assertTrue('valid_extension' in ext_mgr.extensions)
self.assertFalse('invalid_extension' in ext_mgr.extensions)
class PluginAwareExtensionManagerTest(unittest.TestCase):
def setUp(self):
self.ext_mgr = PluginAwareExtensionManager('')
def test_unsupported_extensions_are_not_loaded(self):
self.ext_mgr.plugin = StubPlugin(supported_extensions=["e1", "e3"])