first stab at a design where each incoming API call has its own dbsession
[sfa.git] / sfa / server / sfaapi.py
index 9fe7656..5639b4b 100644 (file)
@@ -10,11 +10,11 @@ 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): 
@@ -70,6 +70,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 +91,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 +139,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
@@ -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)