X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Futil%2Fapi.py;h=f9aed1cf44e69b86a3fe5c8293b27c815b03a16f;hb=dbce495b6f2e7d8dccbfb18c5507907d784c143b;hp=9424b49db458da20aaabb8074a65fed8fa3e6127;hpb=97c9b61db6ade0bfa931161d6776b7868184ad65;p=sfa.git diff --git a/sfa/util/api.py b/sfa/util/api.py index 9424b49d..f9aed1cf 100644 --- a/sfa/util/api.py +++ b/sfa/util/api.py @@ -1,9 +1,6 @@ # # SFA XML-RPC and SOAP interfaces # -### $Id$ -### $URL$ -# import sys import os @@ -11,14 +8,12 @@ import traceback import string import xmlrpclib +from sfa.util.sfalogging import sfa_logger from sfa.trust.auth import Auth from sfa.util.config import * from sfa.util.faults import * -from sfa.util.debug import * from sfa.trust.credential import * from sfa.trust.certificate import * -from sfa.util.namespace import * -from sfa.util.sfalogging import * # See "2.2 Characters" in the XML specification: # @@ -95,6 +90,27 @@ def import_deep(name): mod = getattr(mod, comp) return mod +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 the a someone attepmts 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 + is not implemented by a libarary and will generally be more helpful than + the standard AttributeError + """ + def __init__(self, manager, interface): + self.manager = manager + self.interface = interface + + def __getattr__(self, method): + + if not hasattr(self.manager, method): + raise SfaNotImplemented(method, self.interface) + return getattr(self.manager, method) + class BaseAPI: cache = None @@ -127,7 +143,7 @@ class BaseAPI: self.credential = None self.source = None self.time_format = "%Y-%m-%d %H:%M:%S" - self.logger=get_sfa_logger() + self.logger=sfa_logger # load registries from sfa.server.registry import Registries @@ -138,6 +154,33 @@ class BaseAPI: self.aggregates = Aggregates(self) + def get_interface_manager(self, manager_base = 'sfa.managers'): + """ + Returns the appropriate manager module for this interface. + Modules are usually found in sfa/managers/ + """ + + if self.interface in ['registry']: + mgr_type = self.config.SFA_REGISTRY_TYPE + manager_module = manager_base + ".registry_manager_%s" % mgr_type + elif self.interface in ['aggregate']: + mgr_type = self.config.SFA_AGGREGATE_TYPE + manager_module = manager_base + ".aggregate_manager_%s" % mgr_type + elif self.interface in ['slicemgr', 'sm']: + mgr_type = self.config.SFA_SM_TYPE + manager_module = manager_base + ".slice_manager_%s" % mgr_type + elif self.interface in ['component', 'cm']: + mgr_type = self.config.SFA_CM_TYPE + manager_module = manager_base + ".component_manager_%s" % mgr_type + else: + raise SfaAPIError("No manager for interface: %s" % self.interface) + manager = __import__(manager_module, fromlist=[manager_base]) + # this isnt necessary but will hlep to produce better error messages + # if someone tries to access an operation this manager doesn't implement + manager = ManagerWrapper(manager, self.interface) + + return manager + def callable(self, method): """ Return a new instance of the specified method. @@ -195,7 +238,7 @@ class BaseAPI: except SfaFault, fault: result = fault except Exception, fault: - #traceback.print_exc(file = log) + sfa_logger().log_exc("BaseAPI.handle has caught Exception") result = SfaAPIError(fault)