X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fserver%2Fsfaapi.py;h=9911e4666616690aef820bb03cfc8eb95de5bedb;hb=fad16c7d54b658b37a9b42fbee47b0d4f51cb8ec;hp=48bd21c4d170e535e9ac8f5239c5e15d8bafbaed;hpb=ec3b659f8709a1538a093a48823895f48a6d2cdb;p=sfa.git diff --git a/sfa/server/sfaapi.py b/sfa/server/sfaapi.py index 48bd21c4..9911e466 100644 --- a/sfa/server/sfaapi.py +++ b/sfa/server/sfaapi.py @@ -10,15 +10,14 @@ from sfa.trust.auth import Auth from sfa.trust.certificate import Keypair, Certificate from sfa.trust.credential import Credential from sfa.trust.rights import determine_rights - +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 augmented with the local cryptographic material and hrn @@ -32,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', @@ -70,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): """ @@ -90,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. @@ -129,7 +138,7 @@ class SfaApi (XmlrpcApi): delegated_cred = None for cred in creds: - if hierarchy.auth_exists(Credential(string=cred).get_gid_caller().get_hrn()): + if hierarchy.auth_exists(Credential(cred=cred).get_gid_caller().get_hrn()): delegated_cred = cred break return delegated_cred @@ -160,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: @@ -212,6 +222,7 @@ class SfaApi (XmlrpcApi): code = { 'geni_code': GENICODE.SUCCESS, 'am_type': 'sfa', + 'am_code': None, } if isinstance(result, SfaFault): code['geni_code'] = result.faultCode @@ -231,9 +242,10 @@ class SfaApi (XmlrpcApi): output = result.faultString return output - def prepare_response_v2_am(self, result): + def prepare_response_am(self, result): + version = version_core() response = { - 'geni_api': 2, + 'geni_api': 3, 'code': self.get_geni_code(result), 'value': self.get_geni_value(result), 'output': self.get_geni_output(result), @@ -247,6 +259,6 @@ class SfaApi (XmlrpcApi): """ # as of dec 13 2011 we only support API v2 if self.interface.lower() in ['aggregate', 'slicemgr']: - result = self.prepare_response_v2_am(result) + result = self.prepare_response_am(result) return XmlrpcApi.prepare_response(self, result, method)