X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Futil%2Fapi.py;h=a7a07b618329a4e73551276e952e1557ac4c90f0;hb=952322d76247f8991f3c2688ed7e1f5a22ca4572;hp=f082654ff836ac2e810bba22e6b162bee14dae40;hpb=31973eb030b168859a1e106008df9c9cf3466cc8;p=sfa.git diff --git a/sfa/util/api.py b/sfa/util/api.py index f082654f..a7a07b61 100644 --- a/sfa/util/api.py +++ b/sfa/util/api.py @@ -1,8 +1,8 @@ # -# Geniwrapper XML-RPC and SOAP interfaces +# SFA XML-RPC and SOAP interfaces # -### $Id: api.py 15596 2009-10-31 21:42:05Z anil $ -### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/api.py $ +### $Id$ +### $URL$ # import sys @@ -17,7 +17,7 @@ from sfa.util.faults import * from sfa.util.debug import * from sfa.trust.credential import * from sfa.trust.certificate import * -from sfa.util.misc import * +from sfa.util.namespace import * from sfa.util.sfalogging import * # See "2.2 Characters" in the XML specification: @@ -97,15 +97,17 @@ def import_deep(name): class BaseAPI: - def __init__(self, config = "/etc/sfa/sfa_config", encoding = "utf-8", methods='sfa.methods', - peer_cert = None, interface = None, key_file = None, cert_file = None): + cache = None + + def __init__(self, config = "/etc/sfa/sfa_config.py", encoding = "utf-8", + methods='sfa.methods', peer_cert = None, interface = None, + key_file = None, cert_file = None, cache = cache): self.encoding = encoding # flat list of method names - methods_module = __import__(methods) - self.methods_module = methods_module - self.methods = methods_module.methods.all + self.methods_module = methods_module = __import__(methods, fromlist=[methods]) + self.methods = methods_module.all # Better just be documenting the API if config is None: @@ -114,15 +116,25 @@ class BaseAPI: # Load configuration self.config = Config(config) self.auth = Auth(peer_cert) + self.hrn = self.config.SFA_INTERFACE_HRN self.interface = interface self.key_file = key_file self.key = Keypair(filename=self.key_file) self.cert_file = cert_file self.cert = Certificate(filename=self.cert_file) + self.cache = cache self.credential = None - + self.source = None self.time_format = "%Y-%m-%d %H:%M:%S" self.logger=get_sfa_logger() + + # load registries + from sfa.server.registry import Registries + self.registries = Registries(self) + + # load aggregates + from sfa.server.aggregate import Aggregates + self.aggregates = Aggregates(self) def callable(self, method): @@ -130,17 +142,18 @@ class BaseAPI: Return a new instance of the specified method. """ # Look up method + print self.methods if method not in self.methods: - raise GeniInvalidAPIMethod, method + raise SfaInvalidAPIMethod, method # Get new instance of method try: classname = method.split(".")[-1] - module = __import__(self.methods_module + "." + method, globals(), locals(), [classname]) + module = __import__(self.methods_module.__name__ + "." + method, globals(), locals(), [classname]) callablemethod = getattr(module, classname)(self) return getattr(module, classname)(self) except ImportError, AttributeError: - raise GeniInvalidAPIMethod, method + raise SfaInvalidAPIMethod, method def call(self, source, method, *args): """ @@ -149,9 +162,11 @@ class BaseAPI: """ function = self.callable(method) function.source = source + self.source = source return function(*args) - def handle(self, source, data): + + def handle(self, source, data, method_map): """ Handle an XML-RPC or SOAP request from the specified source. """ @@ -159,7 +174,10 @@ class BaseAPI: try: interface = xmlrpclib (args, method) = xmlrpclib.loads(data) + if method_map.has_key(method): + method = method_map[method] methodresponse = True + except Exception, e: if SOAPpy is not None: interface = SOAPpy @@ -186,7 +204,7 @@ class BaseAPI: # Return result if interface == xmlrpclib: - if not isinstance(result, GeniFault): + if not isinstance(result, SfaFault): result = (result,) data = xmlrpclib.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1)