X-Git-Url: https://gerrit.akraino.org/r/gitweb?a=blobdiff_plain;f=cmframework%2Fsrc%2Fcmframework%2Futils%2Fcmpluginloader.py;fp=cmframework%2Fsrc%2Fcmframework%2Futils%2Fcmpluginloader.py;h=486c6487384fbe9ea51cb59e16a03a36fa0e4317;hb=c389bdee7b3845b55f443dbf04c0ce4083a55886;hp=0000000000000000000000000000000000000000;hpb=5030f0c004701dd422c78c71c014ef60f48139fc;p=ta%2Fconfig-manager.git diff --git a/cmframework/src/cmframework/utils/cmpluginloader.py b/cmframework/src/cmframework/utils/cmpluginloader.py new file mode 100644 index 0000000..486c648 --- /dev/null +++ b/cmframework/src/cmframework/utils/cmpluginloader.py @@ -0,0 +1,110 @@ +# Copyright 2019 Nokia + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 +import os +import imp +import sys +import logging + +from cmframework.apis import cmerror + + +class CMPluginLoader(object): + class LoadingFilter(object): + # pylint: disable=no-self-use, unused-argument + def is_supported(self, plugin): + return True + + def __init__(self, plugin_location, plugin_filter=None): + self.location = plugin_location + sys.path.append(self.location) + self.pluginslist = [] + self.loaded_plugin = {} + self.filterlist = {} + self.plugin_filter = plugin_filter + + def find_plugin(self): + logging.debug('finding plugins in %s', self.location) + listofplugin = os.listdir(self.location) + for plugin in listofplugin: + if plugin.endswith('.py'): + logging.debug('Adding plugin %s', plugin) + self.pluginslist.append(plugin.replace(".py", "")) + + def sort_plugin(self): + logging.debug('Sorting plugins') + self.pluginslist.sort() + + def load_plugin(self): + for plugin in self.pluginslist: + logging.debug('Loading plugin %s', plugin) + fp, pathname, description = imp.find_module(plugin) + try: + pluginmodule = imp.load_module(plugin, fp, pathname, description) + add_plugin = True + if self.plugin_filter: + class_name = getattr(pluginmodule, plugin) + instance = class_name() + add_plugin = self.plugin_filter.is_supported(instance) + if add_plugin: + logging.info('Adding plugin %s to list', plugin) + self.loaded_plugin[plugin] = pluginmodule + else: + logging.info( + 'Skipping plugin %s as it does not match configured filter', plugin) + except Exception as exp: # pylint: disable=broad-except + logging.error('Failed to load plugin %s, got exp %s', plugin, str(exp)) + raise cmerror.CMError('Loading %s plugin failed' % plugin) + finally: + if fp: + fp.close() + + def build_filter_dict(self): + faulty_plugins = [] + for plugin, objectname in self.loaded_plugin.iteritems(): + logging.debug('Getting the subsription info from %s %s', plugin, objectname) + try: + class_name = getattr(objectname, plugin) + instance = class_name() + filtername = instance.get_subscription_info() + self.filterlist[plugin] = filtername + except Exception as exp: # pylint: disable=broad-except + logging.error('Getting subscription failed for %s %s, got exp %s', + plugin, objectname, str(exp)) + faulty_plugins.append(plugin) + + for plugin in faulty_plugins: + del self.loaded_plugin[plugin] + + # pylint: disable=no-self-use + def validate_plugin(self): + pass + + def load(self): + self.find_plugin() + self.sort_plugin() + self.load_plugin() + self.build_filter_dict() + return self.loaded_plugin, self.filterlist + + +def main(): + pl = CMPluginLoader("plug_in/tst") + a, b = pl.load() + print a + print b + + +if __name__ == '__main__': + main()