74 lines
2.1 KiB
Python
74 lines
2.1 KiB
Python
"""
|
|
.. module: lemur.common.managers
|
|
:platform: Unix
|
|
:copyright: (c) 2018 by Netflix Inc., see AUTHORS for more
|
|
:license: Apache, see LICENSE for more details.
|
|
|
|
.. moduleauthor:: Kevin Glisson <kglisson@netflix.com>
|
|
"""
|
|
from flask import current_app
|
|
|
|
from lemur.exceptions import InvalidConfiguration
|
|
|
|
|
|
# inspired by https://github.com/getsentry/sentry
|
|
class InstanceManager(object):
|
|
def __init__(self, class_list=None, instances=True):
|
|
if class_list is None:
|
|
class_list = []
|
|
self.instances = instances
|
|
self.update(class_list)
|
|
|
|
def get_class_list(self):
|
|
return self.class_list
|
|
|
|
def add(self, class_path):
|
|
self.cache = None
|
|
if class_path not in self.class_list:
|
|
self.class_list.append(class_path)
|
|
|
|
def remove(self, class_path):
|
|
self.cache = None
|
|
self.class_list.remove(class_path)
|
|
|
|
def update(self, class_list):
|
|
"""
|
|
Updates the class list and wipes the cache.
|
|
"""
|
|
self.cache = None
|
|
self.class_list = class_list
|
|
|
|
def all(self):
|
|
"""
|
|
Returns a list of cached instances.
|
|
"""
|
|
class_list = list(self.get_class_list())
|
|
if not class_list:
|
|
self.cache = []
|
|
return []
|
|
|
|
if self.cache is not None:
|
|
return self.cache
|
|
|
|
results = []
|
|
for cls_path in class_list:
|
|
module_name, class_name = cls_path.rsplit('.', 1)
|
|
try:
|
|
module = __import__(module_name, {}, {}, class_name)
|
|
cls = getattr(module, class_name)
|
|
if self.instances:
|
|
results.append(cls())
|
|
else:
|
|
results.append(cls)
|
|
|
|
except InvalidConfiguration as e:
|
|
current_app.logger.warning("Plugin '{0}' may not work correctly. {1}".format(class_name, e))
|
|
|
|
except Exception as e:
|
|
current_app.logger.exception("Unable to import {0}. Reason: {1}".format(cls_path, e))
|
|
continue
|
|
|
|
self.cache = results
|
|
|
|
return results
|