Introduced method mapping so that XMLRPC calls can be forwarded to alternate methods.
authorJosh Karlin <jkarlin@bbn.com>
Wed, 21 Apr 2010 16:57:35 +0000 (16:57 +0000)
committerJosh Karlin <jkarlin@bbn.com>
Wed, 21 Apr 2010 16:57:35 +0000 (16:57 +0000)
This was needed to support the GENI AM because one of the GENI calls is Resolve, which means that there would be a methods/Resolve.py and a methods/resolve.py, which causes problems on filesystems (like HFS+) that don't support caps.  So, now the GENI AM simply creates a mapping from Resolve to ResolveGENI.

This could also be useful if you wanted to host try new methods without replacing the old ones first.

sfa/client/sfi.py
sfa/server/geni_aggregate.py
sfa/util/api.py
sfa/util/server.py

index 550edcf..8f9a3ca 100755 (executable)
@@ -950,7 +950,7 @@ class Sfi:
         if xrn:
             call_options['geni_slice_urn'] = xrn
             
-        rspec = server.ListResources([cred], call_options)
+        rspec = server.Purple([cred], call_options)
         rspec = zlib.decompress(rspec.decode('base64'))
         print rspec
         
index 8b51eab..c4c3a02 100644 (file)
@@ -33,4 +33,4 @@ class GENIAggregate(SfaServer):
     def __init__(self, ip, port, key_file, cert_file):
         SfaServer.__init__(self, ip, port, key_file, cert_file)
         self.server.interface = 'geni_am'
-
+        self.server.method_map = {'Resolve': 'ResolveGENI'}
index 635cc43..41b4b3e 100644 (file)
@@ -125,6 +125,7 @@ class BaseAPI:
         self.source = None 
         self.time_format = "%Y-%m-%d %H:%M:%S"
         self.logger=get_sfa_logger()
+        self.method_map = {}
         
         # load registries
         from sfa.server.registry import Registries
@@ -163,7 +164,8 @@ class BaseAPI:
         self.source = source
         return function(*args)
 
-    def handle(self, source, data):
+    
+    def handle(self, source, data, method_map):
         """
         Handle an XML-RPC or SOAP request from the specified source.
         """
@@ -171,7 +173,10 @@ class BaseAPI:
         try:
             interface = xmlrpclib
             (args, method) = xmlrpclib.loads(data)
+            if method_map.has_key(method):
+                method = method_map[method]
             methodresponse = True
+            
         except Exception, e:
             if SOAPpy is not None:
                 interface = SOAPpy
index 38bbfca..3dedcf5 100644 (file)
@@ -102,8 +102,8 @@ class SecureXMLRpcRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
             # get arguments
             request = self.rfile.read(int(self.headers["content-length"]))
             remote_addr = (remote_ip, remote_port) = self.connection.getpeername()
-            self.api.remote_addr = remote_addr
-            response = self.api.handle(remote_addr, request)
+            self.api.remote_addr = remote_addr            
+            response = self.api.handle(remote_addr, request, self.server.method_map)
 
         
         except Exception, fault:
@@ -136,6 +136,8 @@ class SecureXMLRPCServer(BaseHTTPServer.HTTPServer,SimpleXMLRPCServer.SimpleXMLR
         self.interface = None
         self.key_file = key_file
         self.cert_file = cert_file
+        self.method_map = {}
+
         #for compatibility with python 2.4 (centos53)
         if sys.version_info < (2, 5):
             SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self)
@@ -250,7 +252,7 @@ class SfaServer(threading.Thread):
 
     ##
     # Register functions that will be served by the XMLRPC server. This
-    # function should be overrided by each descendant class.
+    # function should be overridden by each descendant class.
 
     def register_functions(self):
         self.server.register_function(self.noop)