X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fserver%2Fsfaapi.py;h=499e3bdb6790a5e9ea404db6bf940826d8baf9f8;hb=06768bd605e5d47fadfc90a35c74e30f267226a5;hp=a0fc7f48779efaaaedb9682d8ad196287a82096d;hpb=102b85f6bc2162d8d37df9bc60ca1230be36cd63;p=sfa.git diff --git a/sfa/server/sfaapi.py b/sfa/server/sfaapi.py index a0fc7f48..499e3bdb 100644 --- a/sfa/server/sfaapi.py +++ b/sfa/server/sfaapi.py @@ -14,12 +14,12 @@ from sfa.util.version import version_core from sfa.server.xmlrpcapi import XmlrpcApi from sfa.client.return_value import ReturnValue +from sfa.storage.alchemy import alchemy #################### class SfaApi (XmlrpcApi): - """ - An SfaApi instance is a basic xmlrcp service + An SfaApi instance is a basic xmlrpc service augmented with the local cryptographic material and hrn It also has the notion of its own interface (a string describing @@ -31,8 +31,8 @@ class SfaApi (XmlrpcApi): It gets augmented by the generic layer with (*) an instance of manager (actually a manager module for now) - (*) which in turn holds an instance of a testbed driver - For convenience api.manager.driver == api.driver + beware that this is shared among all instances of api + (*) an instance of a testbed driver """ def __init__ (self, encoding="utf-8", methods='sfa.methods', @@ -69,6 +69,7 @@ class SfaApi (XmlrpcApi): # filled later on by generic/Generic self.manager=None + self._dbsession=None def server_proxy(self, interface, cred, timeout=30): """ @@ -89,7 +90,16 @@ class SfaApi (XmlrpcApi): server = interface.server_proxy(key_file, cert_file, timeout) return server - + def dbsession(self): + if self._dbsession is None: + self._dbsession=alchemy.session() + return self._dbsession + + def close_dbsession(self): + if self._dbsession is None: return + alchemy.close_session(self._dbsession) + self._dbsession=None + def getCredential(self, minimumExpiration=0): """ Return a valid credential for this interface. @@ -159,7 +169,8 @@ class SfaApi (XmlrpcApi): if not auth_hrn or hrn == self.config.SFA_INTERFACE_HRN: auth_hrn = hrn auth_info = self.auth.get_auth_info(auth_hrn) - from sfa.storage.alchemy import dbsession + # xxx although unlikely we might want to check for a potential leak + dbsession=self.dbsession() from sfa.storage.model import RegRecord record = dbsession.query(RegRecord).filter_by(type='authority+sa', hrn=hrn).first() if not record: