support geni am api v2 return values
[sfa.git] / sfa / server / sfaapi.py
index 87f7935..26957c0 100644 (file)
@@ -1,18 +1,18 @@
-import os.path
+import os, os.path
 import datetime
 
 from sfa.util.faults import SfaAPIError
 from sfa.util.config import Config
 from sfa.util.cache import Cache
 import datetime
 
 from sfa.util.faults import SfaAPIError
 from sfa.util.config import Config
 from sfa.util.cache import Cache
-
 from sfa.trust.auth import Auth
 from sfa.trust.certificate import Keypair, Certificate
 from sfa.trust.credential import Credential
 from sfa.trust.auth import Auth
 from sfa.trust.certificate import Keypair, Certificate
 from sfa.trust.credential import Credential
-
-# this is wrong all right, but temporary 
-from sfa.managers.managerwrapper import ManagerWrapper, import_manager
-
+from sfa.trust.rights import determine_rights
 from sfa.server.xmlrpcapi import XmlrpcApi
 from sfa.server.xmlrpcapi import XmlrpcApi
+from sfa.util.genicode import GENICODE
+
+# thgen xxx fixme this is wrong all right, but temporary, will use generic
+from sfa.util.table import SfaTable
 
 ####################
 class SfaApi (XmlrpcApi): 
 
 ####################
 class SfaApi (XmlrpcApi): 
@@ -20,10 +20,18 @@ class SfaApi (XmlrpcApi):
     """
     An SfaApi instance is a basic xmlrcp service
     augmented with the local cryptographic material and hrn
     """
     An SfaApi instance is a basic xmlrcp service
     augmented with the local cryptographic material and hrn
-    It also has the notion of neighbour sfa services 
-    as defined in /etc/sfa/{aggregates,registries}.xml
+
+    It also has the notion of its own interface (a string describing
+    whether we run a registry, aggregate or slicemgr) and has 
+    the notion of neighbour sfa services as defined 
+    in /etc/sfa/{aggregates,registries}.xml
+
     Finally it contains a cache instance
     Finally it contains a cache instance
-    It has no a priori knowledge of the underlying testbed
+
+    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
     """
 
     def __init__ (self, encoding="utf-8", methods='sfa.methods', 
     """
 
     def __init__ (self, encoding="utf-8", methods='sfa.methods', 
@@ -57,32 +65,11 @@ class SfaApi (XmlrpcApi):
         # load aggregates
         from sfa.server.aggregate import Aggregates
         self.aggregates = Aggregates()
         # load aggregates
         from sfa.server.aggregate import Aggregates
         self.aggregates = Aggregates()
+        
+        # filled later on by generic/Generic
+        self.manager=None
 
 
-
-    def get_interface_manager(self, manager_base = 'sfa.managers'):
-        """
-        Returns the appropriate manager module for this interface.
-        Modules are usually found in sfa/managers/
-        """
-        manager=None
-        if self.interface in ['registry']:
-            manager=import_manager ("registry",  self.config.SFA_REGISTRY_TYPE)
-        elif self.interface in ['aggregate']:
-            manager=import_manager ("aggregate", self.config.SFA_AGGREGATE_TYPE)
-        elif self.interface in ['slicemgr', 'sm']:
-            manager=import_manager ("slice",     self.config.SFA_SM_TYPE)
-        elif self.interface in ['component', 'cm']:
-            manager=import_manager ("component", self.config.SFA_CM_TYPE)
-        if not manager:
-            raise SfaAPIError("No manager for interface: %s" % self.interface)  
-            
-        # 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)
-
-        return manager
-
-    def get_server(self, interface, cred, timeout=30):
+    def server_proxy(self, interface, cred, timeout=30):
         """
         Returns a connection to the specified interface. Use the specified
         credential to determine the caller and look for the caller's key/cert 
         """
         Returns a connection to the specified interface. Use the specified
         credential to determine the caller and look for the caller's key/cert 
@@ -98,7 +85,7 @@ class SfaApi (XmlrpcApi):
         auth_info = hierarchy.get_auth_info(caller_gid.get_hrn())
         key_file = auth_info.get_privkey_filename()
         cert_file = auth_info.get_gid_filename()
         auth_info = hierarchy.get_auth_info(caller_gid.get_hrn())
         key_file = auth_info.get_privkey_filename()
         cert_file = auth_info.get_gid_filename()
-        server = interface.get_server(key_file, cert_file, timeout)
+        server = interface.server_proxy(key_file, cert_file, timeout)
         return server
                
         
         return server
                
         
@@ -151,7 +138,7 @@ class SfaApi (XmlrpcApi):
         """
         from sfa.server.registry import Registries
         registries = Registries()
         """
         from sfa.server.registry import Registries
         registries = Registries()
-        registry = registries.get_server(self.hrn, self.key_file, self.cert_file)
+        registry = registries.server_proxy(self.hrn, self.key_file, self.cert_file)
         cert_string=self.cert.save_to_string(save_parents=True)
         # get self credential
         self_cred = registry.GetSelfCredential(cert_string, self.hrn, 'authority')
         cert_string=self.cert.save_to_string(save_parents=True)
         # get self credential
         self_cred = registry.GetSelfCredential(cert_string, self.hrn, 'authority')
@@ -171,7 +158,9 @@ 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)
         if not auth_hrn or hrn == self.config.SFA_INTERFACE_HRN:
             auth_hrn = hrn
         auth_info = self.auth.get_auth_info(auth_hrn)
-        table = self.SfaTable()
+        # xxx thgen fixme - use SfaTable hardwired for now 
+        #table = self.SfaTable()
+        table = SfaTable()
         records = table.findObjects({'hrn': hrn, 'type': 'authority+sa'})
         if not records:
             raise RecordNotFound
         records = table.findObjects({'hrn': hrn, 'type': 'authority+sa'})
         if not records:
             raise RecordNotFound
@@ -216,3 +205,48 @@ class SfaApi (XmlrpcApi):
             # cache version for 24 hours
             self.cache.add(cache_key, server_version, ttl= 60*60*24)
         return server_version
             # cache version for 24 hours
             self.cache.add(cache_key, server_version, ttl= 60*60*24)
         return server_version
+
+
+    def get_geni_code(self, result):
+        code = {
+            'geni_code': GENICODE.SUCCESS, 
+            'am_type': 'sfa',
+            'am_code': None,
+        }
+        if isinstnace(result, SfaFault):
+            code['geni_code'] = result.faultCode
+            code['am_code'] = result.faultCode                        
+                
+        return code
+
+    def get_geni_value(self, result):
+        value = result
+        if isinstance(result, SfaFault):
+            value = ""
+        return value
+
+    def get_geni_output(self, result):
+        output = ""
+        if isinstance(result, SFaFault):
+            output = result.faultString 
+        return output
+
+    def prepare_response_v2_am(self, result):
+        response = {
+            'code': self.get_geni_code(result),
+            'value': self.get_geni_value(result),
+            'output': self.get_geni_output(result),
+        }
+        return response
+    
+    def prepare_response(self, result, method=""):
+        """
+        Converts the specified result into a standard GENI compliant 
+        response  
+        """
+        if self.interface.lower() == 'aggregate': 
+            if hasattr(self.config, 'SFA_AM_API_VERSION') and \
+              self.config.SFA_AM_API_VERSION == "2":
+                result = self.prepare_response_v2_am(result)
+        return XmlrpcApi.prepare_response(result, method)
+