X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Fmanagerwrapper.py;h=326b6b63147b7a1409cf06dc6a7c45273ec133f9;hb=4a9e6751f9f396f463932133b9d62fc925a99ef6;hp=218cd4a49f00e805e077ddcb50622917dbf48906;hpb=ee8a376da1107884bee1ea29248a70e4da8410c9;p=sfa.git diff --git a/sfa/managers/managerwrapper.py b/sfa/managers/managerwrapper.py index 218cd4a4..326b6b63 100644 --- a/sfa/managers/managerwrapper.py +++ b/sfa/managers/managerwrapper.py @@ -1,49 +1,42 @@ -from sfa.util.faults import SfaNotImplemented -from sfa.util.sfalogging import logger +from types import ModuleType -## locate the right manager -def import_manager(kind, type): - """ - kind expected in ['registry', 'aggregate', 'slice', 'component'] - type is e.g. 'pl' or 'max' or whatever - """ - basepath = 'sfa.managers' - qualified = "%s.%s_manager_%s"%(basepath,kind,type) - generic = "%s.%s_manager"%(basepath,kind) +from sfa.util.faults import SfaNotImplemented, SfaAPIError +from sfa.util.sfalogging import logger - message="import_manager for kind=%s and type=%s"%(kind,type) - try: - manager = __import__(qualified, fromlist=[basepath]) - logger.info ("%s: loaded %s"%(message,qualified)) - except: - try: - manager = __import__ (generic, fromlist=[basepath]) - if type != 'pl' : - logger.warn ("%s: using generic with type!='pl'"%(message)) - logger.info("%s: loaded %s"%(message,generic)) - except: - manager=None - logger.log_exc("%s: unable to import either %s or %s"%(message,qualified,generic)) - return manager - #################### + + class ManagerWrapper: """ This class acts as a wrapper around an SFA interface manager module, but - can be used with any python module. The purpose of this class is raise a - SfaNotImplemented exception if someone attempts to use an attribute + can be used with any python module. The purpose of this class is raise a + SfaNotImplemented exception if someone attempts to use an attribute (could be a callable) thats not available in the library by checking the - library using hasattr. This helps to communicate better errors messages - to the users and developers in the event that a specifiec operation + library using hasattr. This helps to communicate better errors messages + to the users and developers in the event that a specifiec operation is not implemented by a libarary and will generally be more helpful than - the standard AttributeError + the standard AttributeError """ - def __init__(self, manager, interface): - self.manager = manager + + def __init__(self, manager, interface, config): + if isinstance(manager, ModuleType): + # old-fashioned module implementation + self.manager = manager + # if it's a class + elif isinstance(manager, type): + # create an instance; we don't pass the api in argument as it is passed + # to the actual method calls anyway + self.manager = manager(config) + else: + # that's what happens when there's something wrong with the db + # or any bad stuff of that kind at startup time + logger.log_exc( + "Failed to create a manager, startup sequence is broken") + raise SfaAPIError( + "Argument to ManagerWrapper must be a module or class") self.interface = interface - + def __getattr__(self, method): if not hasattr(self.manager, method): - raise SfaNotImplemented(method, self.interface) + raise SfaNotImplemented(self.interface, method) return getattr(self.manager, method) -