From 31e3ab754232bbf48a68e68173a2aedfcdd99262 Mon Sep 17 00:00:00 2001 From: Josh Karlin Date: Wed, 21 Apr 2010 16:57:35 +0000 Subject: [PATCH] Introduced method mapping so that XMLRPC calls can be forwarded to alternate methods. 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 | 2 +- sfa/server/geni_aggregate.py | 2 +- sfa/util/api.py | 7 ++++++- sfa/util/server.py | 8 +++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 550edcfb..8f9a3ca8 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -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 diff --git a/sfa/server/geni_aggregate.py b/sfa/server/geni_aggregate.py index 8b51eab2..c4c3a027 100644 --- a/sfa/server/geni_aggregate.py +++ b/sfa/server/geni_aggregate.py @@ -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'} diff --git a/sfa/util/api.py b/sfa/util/api.py index 635cc43b..41b4b3e5 100644 --- a/sfa/util/api.py +++ b/sfa/util/api.py @@ -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 diff --git a/sfa/util/server.py b/sfa/util/server.py index 38bbfca9..3dedcf56 100644 --- a/sfa/util/server.py +++ b/sfa/util/server.py @@ -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) -- 2.47.0