X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Futil%2Fapi.py;h=39d6538254d2fa04ba85a52d29d6fcf38ec61351;hb=8d1e057a4da2ae30f93b3fd4e5ac7b05d0c42bdf;hp=67d155e78fab8b18f7df2c2c68c3ad2ddec0057c;hpb=db091e73c33c373b7f6c2c96bd2caf6a2acf0178;p=sfa.git diff --git a/sfa/util/api.py b/sfa/util/api.py index 67d155e7..39d65382 100644 --- a/sfa/util/api.py +++ b/sfa/util/api.py @@ -8,13 +8,18 @@ import traceback import string import xmlrpclib +from sfa.util.faults import * +from sfa.util.config import * +import sfa.util.xmlrpcprotocol as xmlrpcprotocol from sfa.util.sfalogging import logger from sfa.trust.auth import Auth -from sfa.util.config import * -from sfa.util.faults import * +from sfa.util.cache import Cache from sfa.trust.credential import * from sfa.trust.certificate import * +# this is wrong all right, but temporary +from sfa.managers.import_manager import import_manager + # See "2.2 Characters" in the XML specification: # # #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] @@ -94,7 +99,7 @@ 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 + 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 @@ -106,19 +111,17 @@ class ManagerWrapper: 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 protocol = 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): + key_file = None, cert_file = None, cache = None): self.encoding = encoding @@ -129,7 +132,6 @@ class BaseAPI: # Better just be documenting the API if config is None: return - # Load configuration self.config = Config(config) self.auth = Auth(peer_cert) @@ -140,6 +142,8 @@ class BaseAPI: self.cert_file = cert_file self.cert = Certificate(filename=self.cert_file) self.cache = cache + if self.cache is None: + self.cache = Cache() self.credential = None self.source = None self.time_format = "%Y-%m-%d %H:%M:%S" @@ -147,11 +151,11 @@ class BaseAPI: # load registries from sfa.server.registry import Registries - self.registries = Registries(self) + self.registries = Registries() # load aggregates from sfa.server.aggregate import Aggregates - self.aggregates = Aggregates(self) + self.aggregates = Aggregates() def get_interface_manager(self, manager_base = 'sfa.managers'): @@ -159,23 +163,19 @@ class BaseAPI: Returns the appropriate manager module for this interface. Modules are usually found in sfa/managers/ """ - + manager=None if self.interface in ['registry']: - mgr_type = self.config.SFA_REGISTRY_TYPE - manager_module = manager_base + ".registry_manager_%s" % mgr_type + manager=import_manager ("registry", self.config.SFA_REGISTRY_TYPE) elif self.interface in ['aggregate']: - mgr_type = self.config.SFA_AGGREGATE_TYPE - manager_module = manager_base + ".aggregate_manager_%s" % mgr_type + manager=import_manager ("aggregate", self.config.SFA_AGGREGATE_TYPE) elif self.interface in ['slicemgr', 'sm']: - mgr_type = self.config.SFA_SM_TYPE - manager_module = manager_base + ".slice_manager_%s" % mgr_type + manager=import_manager ("slice", self.config.SFA_SM_TYPE) elif self.interface in ['component', 'cm']: - mgr_type = self.config.SFA_CM_TYPE - manager_module = manager_base + ".component_manager_%s" % mgr_type - else: + manager=import_manager ("component", self.config.SFA_CM_TYPE) + if not manager: 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 + + # this isnt necessary but will help to produce better error messages # if someone tries to access an operation this manager doesn't implement manager = ManagerWrapper(manager, self.interface) @@ -266,3 +266,14 @@ class BaseAPI: raise result return response + + def get_cached_server_version(self, server): + cache_key = server.url + "-version" + server_version = None + if self.cache: + server_version = self.cache.get(cache_key) + if not server_version: + server_version = server.GetVersion() + # cache version for 24 hours + self.cache.add(cache_key, server_version, ttl= 60*60*24) + return server_version