X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fserver%2Fsfaapi.py;h=499e3bdb6790a5e9ea404db6bf940826d8baf9f8;hb=06768bd605e5d47fadfc90a35c74e30f267226a5;hp=2510ec4e866016152bf751dda5201931ae563cfa;hpb=78467ecd9b02ec60d9572178995ed347fc917f59;p=sfa.git diff --git a/sfa/server/sfaapi.py b/sfa/server/sfaapi.py index 2510ec4e..499e3bdb 100644 --- a/sfa/server/sfaapi.py +++ b/sfa/server/sfaapi.py @@ -10,17 +10,16 @@ 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 + 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 @@ -32,12 +31,12 @@ 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', - config = "/etc/sfa/sfa_config.py", + config = "/etc/sfa/sfa_config", peer_cert = None, interface = None, key_file = None, cert_file = None, cache = None): @@ -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: @@ -232,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), @@ -248,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)