summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Cholasta <jcholast@redhat.com>2016-03-16 11:22:00 +0100
committerJan Cholasta <jcholast@redhat.com>2016-05-25 16:06:26 +0200
commit0d62968b6f853246d38b06e8378cb9cae7f9bbb4 (patch)
treec453875c1200991eac44825e4d3237ed55419715
parent3f5091b55abed3a2d3f4b6b940fdb6bacabbf4fe (diff)
downloadfreeipa-0d62968b6f853246d38b06e8378cb9cae7f9bbb4.tar.gz
freeipa-0d62968b6f853246d38b06e8378cb9cae7f9bbb4.tar.xz
freeipa-0d62968b6f853246d38b06e8378cb9cae7f9bbb4.zip
plugable: replace API.import_plugins with new API.add_package
Replace API.import_plugins with a new method API.add_package which allows loading plugin packages into an API object from a package object. This makes loading of plugin packages loading consistent with loading of plugin modules and classes. Rename API.modules to API.packages and use package objects where implemented to reflect the change. https://fedorahosted.org/freeipa/ticket/4739 Reviewed-By: David Kupka <dkupka@redhat.com>
-rw-r--r--ipalib/__init__.py14
-rw-r--r--ipalib/plugable.py49
-rw-r--r--ipaserver/advise/base.py6
3 files changed, 34 insertions, 35 deletions
diff --git a/ipalib/__init__.py b/ipalib/__init__.py
index e163b292c..788fc8ead 100644
--- a/ipalib/__init__.py
+++ b/ipalib/__init__.py
@@ -902,12 +902,18 @@ class API(plugable.API):
bases = (Command, Object, Method, Backend, Updater)
@property
- def modules(self):
- result = ('ipalib.plugins.*',)
+ def packages(self):
+ import ipalib.plugins
+ result = (ipalib.plugins,)
+
if self.env.in_server:
- result += ('ipaserver.plugins.*',)
+ import ipaserver.plugins
+ result += (ipaserver.plugins,)
+
if self.env.context in ('installer', 'updates'):
- result += ('ipaserver.install.plugins.*',)
+ import ipaserver.install.plugins
+ result += (ipaserver.install.plugins,)
+
return result
diff --git a/ipalib/plugable.py b/ipalib/plugable.py
index 76b933c30..260eb443b 100644
--- a/ipalib/plugable.py
+++ b/ipalib/plugable.py
@@ -306,7 +306,7 @@ class API(ReadOnly):
raise NotImplementedError
@property
- def modules(self):
+ def packages(self):
raise NotImplementedError
def __len__(self):
@@ -532,41 +532,30 @@ class API(ReadOnly):
self.__do_if_not_done('bootstrap')
if self.env.mode in ('dummy', 'unit_test'):
return
- for module in self.modules:
- self.import_plugins(module)
+ for package in self.packages:
+ self.add_package(package)
# FIXME: This method has no unit test
- def import_plugins(self, module):
+ def add_package(self, package):
"""
- Import plugins from ``module``.
+ Add plugin modules from the ``package``.
- :param module: Name of the module to import. This might be a wildcard
- in the form ```package.*``` in which case all modules
- from the given package are loaded.
+ :param package: A package from which to add modules.
"""
- if module.endswith('.*'):
- subpackage = module[:-2]
- try:
- plugins = importlib.import_module(subpackage)
- except ImportError as e:
- self.log.error("cannot import plugins sub-package %s: %s",
- subpackage, e)
- raise
- package, dot, part = subpackage.rpartition('.')
- parent = sys.modules[package]
-
- parent_dir = path.dirname(path.abspath(parent.__file__))
- plugins_dir = path.dirname(path.abspath(plugins.__file__))
- if parent_dir == plugins_dir:
- raise errors.PluginsPackageError(
- name=subpackage, file=plugins.__file__
- )
+ package_name = package.__name__
+ package_file = package.__file__
+ package_dir = path.dirname(path.abspath(package_file))
- self.log.debug("importing all plugin modules in %s...", subpackage)
- modules = find_modules_in_dir(plugins_dir)
- modules = ['.'.join((subpackage, name)) for name in modules]
- else:
- modules = [module]
+ parent = sys.modules[package_name.rpartition('.')[0]]
+ parent_dir = path.dirname(path.abspath(parent.__file__))
+ if parent_dir == package_dir:
+ raise errors.PluginsPackageError(
+ name=package_name, file=package_file
+ )
+
+ self.log.debug("importing all plugin modules in %s...", package_name)
+ modules = find_modules_in_dir(package_dir)
+ modules = ['.'.join((package_name, name)) for name in modules]
for name in modules:
self.log.debug("importing plugin module %s", name)
diff --git a/ipaserver/advise/base.py b/ipaserver/advise/base.py
index f7f2ad821..c80a13b6c 100644
--- a/ipaserver/advise/base.py
+++ b/ipaserver/advise/base.py
@@ -127,7 +127,11 @@ class Advice(Plugin):
class AdviseAPI(API):
bases = (Advice,)
- modules = ('ipaserver.advise.plugins.*',)
+
+ @property
+ def packages(self):
+ import ipaserver.advise.plugins
+ return (ipaserver.advise.plugins,)
advise_api = AdviseAPI()