From 935de64c2ed3a68566da471c68447a1ac384455d Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 7 Dec 2011 11:12:47 +0100 Subject: [PATCH] sfaprotocol is renamed into sfaserverproxy, with class SfaServerProxy that behaves like an xmlrpclib.ServerProxy --- sfa/client/sfaclientlib.py | 31 ++----------------- sfa/client/sfascan.py | 6 ++-- .../{sfaprotocol.py => sfaserverproxy.py} | 26 +++++++++++++--- sfa/client/sfi.py | 12 +++---- sfa/plc/plcomponentdriver.py | 4 +-- sfa/server/interface.py | 5 ++- sfa/server/sfa-clean-peer-records.py | 4 +-- sfa/server/sfa_component_setup.py | 4 +-- tests/testInterfaces.py | 13 ++++---- 9 files changed, 49 insertions(+), 56 deletions(-) rename sfa/client/{sfaprotocol.py => sfaserverproxy.py} (79%) diff --git a/sfa/client/sfaclientlib.py b/sfa/client/sfaclientlib.py index ba8f502d..2b5cb199 100644 --- a/sfa/client/sfaclientlib.py +++ b/sfa/client/sfaclientlib.py @@ -7,35 +7,10 @@ import os,os.path import sfa.util.sfalogging -# what we use on GID actually is inherited from Certificate -#from sfa.trust.gid import GID +from sfa.client.sfaserverproxy import SfaServerProxy + +# see optimizing dependencies below from sfa.trust.certificate import Keypair, Certificate -# what we need in the Credential class essentially amounts to saving the incoming result -# in a file as the output from the registry already is under xml format -#from sfa.trust.credential import Credential - -import sfa.client.sfaprotocol as sfaprotocol - -class SfaServerProxy: - - def __init__ (self, url, keyfile, certfile, verbose=False, timeout=None): - self.url=url - self.keyfile=keyfile - self.certfile=certfile - self.verbose=verbose - self.timeout=timeout - # an instance of xmlrpclib.ServerProxy - self.serverproxy=sfaprotocol.server_proxy \ - (self.url, self.keyfile, self.certfile, self.timeout, self.verbose) - - # this is python magic to return the code to run when - # SfaServerProxy receives a method call - # so essentially we send the same method with identical arguments - # to the server_proxy object - def __getattr__(self, name): - def func(*args, **kwds): - return getattr(self.serverproxy, name)(*args, **kwds) - return func ########## # a helper class to implement the bootstrapping of crypto. material diff --git a/sfa/client/sfascan.py b/sfa/client/sfascan.py index 9e2b09dc..fdfa580d 100644 --- a/sfa/client/sfascan.py +++ b/sfa/client/sfascan.py @@ -14,7 +14,7 @@ from optparse import OptionParser from sfa.client.sfi import Sfi from sfa.util.sfalogging import logger, DEBUG -import sfa.client.sfaprotocol as sfaprotocol +from sfa.client.sfaserverproxy import SfaServerProxy def url_hostname_port (url): if url.find("://")<0: @@ -153,8 +153,8 @@ class Interface: url=self.url() logger.info('issuing GetVersion at %s'%url) # setting timeout here seems to get the call to fail - even though the response time is fast - #server=sfaprotocol.server_proxy(url, key_file, cert_file, verbose=self.verbose, timeout=options.timeout) - server=sfaprotocol.server_proxy(url, key_file, cert_file, verbose=self.verbose) + #server=SfaServerProxy(url, key_file, cert_file, verbose=self.verbose, timeout=options.timeout) + server=SfaServerProxy(url, key_file, cert_file, verbose=self.verbose) self._version=server.GetVersion() except: logger.log_exc("failed to get version") diff --git a/sfa/client/sfaprotocol.py b/sfa/client/sfaserverproxy.py similarity index 79% rename from sfa/client/sfaprotocol.py rename to sfa/client/sfaserverproxy.py index 3c8bb4f3..18b77131 100644 --- a/sfa/client/sfaprotocol.py +++ b/sfa/client/sfaserverproxy.py @@ -7,7 +7,7 @@ try: from sfa.util.sfalogging import logger except: import logging - logger=logging.getLogger('sfaprotocol') + logger=logging.getLogger('sfaserverproxy') ## # ServerException, ExceptionUnmarshaller @@ -91,7 +91,25 @@ class XMLRPCServerProxy(xmlrpclib.ServerProxy): logger.debug ("xml-rpc %s method:%s"%(self.url,attr)) return xmlrpclib.ServerProxy.__getattr__(self, attr) -def server_proxy(url, key_file, cert_file, timeout=None, verbose=False): - transport = XMLRPCTransport(key_file, cert_file, timeout) - return XMLRPCServerProxy(url, transport, allow_none=True, verbose=verbose) +########## the object on which we can send methods that get sent over xmlrpc +class SfaServerProxy: + + def __init__ (self, url, keyfile, certfile, verbose=False, timeout=None): + self.url=url + self.keyfile=keyfile + self.certfile=certfile + self.verbose=verbose + self.timeout=timeout + # an instance of xmlrpclib.ServerProxy + transport = XMLRPCTransport(keyfile, certfile, timeout) + self.serverproxy = XMLRPCServerProxy(url, transport, allow_none=True, verbose=verbose) + + # this is python magic to return the code to run when + # SfaServerProxy receives a method call + # so essentially we send the same method with identical arguments + # to the server_proxy object + def __getattr__(self, name): + def func(*args, **kwds): + return getattr(self.serverproxy, name)(*args, **kwds) + return func diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index ed45b07a..c9bde73a 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -31,7 +31,7 @@ from sfa.rspecs.rspec_converter import RSpecConverter from sfa.rspecs.version_manager import VersionManager from sfa.client.return_value import ReturnValue -import sfa.client.sfaprotocol as sfaprotocol +from sfa.client.sfaserverproxy import SfaServerProxy, ServerException from sfa.client.client_helper import pg_users_arg, sfa_users_arg AGGREGATE_PORT=12346 @@ -479,9 +479,9 @@ class Sfi: self.cert_file = cert_file self.cert = GID(filename=cert_file) self.logger.info("Contacting Registry at: %s"%self.reg_url) - self.registry = sfaprotocol.server_proxy(self.reg_url, key_file, cert_file, timeout=self.options.timeout, verbose=self.options.debug) + self.registry = SfaServerProxy(self.reg_url, key_file, cert_file, timeout=self.options.timeout, verbose=self.options.debug) self.logger.info("Contacting Slice Manager at: %s"%self.sm_url) - self.slicemgr = sfaprotocol.server_proxy(self.sm_url, key_file, cert_file, timeout=self.options.timeout, verbose=self.options.debug) + self.slicemgr = SfaServerProxy(self.sm_url, key_file, cert_file, timeout=self.options.timeout, verbose=self.options.debug) return def get_cached_server_version(self, server): @@ -574,7 +574,7 @@ class Sfi: self.logger.info("Getting Registry issued cert") self.read_config() # *hack. need to set registry before _get_gid() is called - self.registry = sfaprotocol.server_proxy(self.reg_url, key_file, cert_file, + self.registry = SfaServerProxy(self.reg_url, key_file, cert_file, timeout=self.options.timeout, verbose=self.options.debug) gid = self._get_gid(type='user') self.registry = None @@ -756,7 +756,7 @@ class Sfi: host_parts = host.split('/') host_parts[0] = host_parts[0] + ":" + str(port) url = "http://%s" % "/".join(host_parts) - return sfaprotocol.server_proxy(url, keyfile, certfile, timeout=self.options.timeout, + return SfaServerProxy(url, keyfile, certfile, timeout=self.options.timeout, verbose=self.options.debug) # xxx opts could be retrieved in self.options @@ -881,7 +881,7 @@ or version information about sfi itself elif record['type'] in ["slice"]: try: cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True) - except sfaprotocol.ServerException, e: + except ServerException, e: # XXX smbaker -- once we have better error return codes, update this # to do something better than a string compare if "Permission error" in e.args[0]: diff --git a/sfa/plc/plcomponentdriver.py b/sfa/plc/plcomponentdriver.py index 5e746127..991cdde2 100644 --- a/sfa/plc/plcomponentdriver.py +++ b/sfa/plc/plcomponentdriver.py @@ -1,7 +1,7 @@ import os import tempfile -import sfa.client.sfaprotocol as sfaprotocol +from sfa.client.sfaserverproxy import SfaServerProxy from sfa.plc.nodemanager import NodeManager from sfa.trust.credential import Credential @@ -33,7 +33,7 @@ class PlComponentDriver: addr, port = self.config.SFA_REGISTRY_HOST, self.config.SFA_REGISTRY_PORT url = "http://%(addr)s:%(port)s" % locals() ### xxx this would require access to the api... - server = sfaprotocol.server_proxy(url, self.key_file, self.cert_file) + server = SfaServerProxy(url, self.key_file, self.cert_file) return server def get_node_key(self): diff --git a/sfa/server/interface.py b/sfa/server/interface.py index 920857c7..2f461461 100644 --- a/sfa/server/interface.py +++ b/sfa/server/interface.py @@ -1,5 +1,4 @@ -#from sfa.util.faults import * -import sfa.client.sfaprotocol as sfaprotocol +from sfa.client.sfaserverproxy import SfaServerProxy from sfa.util.xml import XML # GeniLight client support is optional @@ -31,7 +30,7 @@ class Interface: # xxx url and self.api are undefined server = GeniClientLight(url, self.api.key_file, self.api.cert_file) else: - server = sfaprotocol.server_proxy(self.get_url(), key_file, cert_file, timeout) + server = SfaServerProxy(self.get_url(), key_file, cert_file, timeout) return server ## diff --git a/sfa/server/sfa-clean-peer-records.py b/sfa/server/sfa-clean-peer-records.py index 5024a10f..bcb917bc 100644 --- a/sfa/server/sfa-clean-peer-records.py +++ b/sfa/server/sfa-clean-peer-records.py @@ -14,7 +14,7 @@ from sfa.server.registry import Registries from sfa.storage.table import SfaTable -import sfa.client.sfaprotocol as sfaprotocol +from sfa.client.sfaserverproxy import SfaServerProxy from sfa.generic import Generic @@ -35,7 +35,7 @@ def main(): # and a valid credential authority = config.SFA_INTERFACE_HRN url = 'http://%s:%s/' %(config.SFA_REGISTRY_HOST, config.SFA_REGISTRY_PORT) - registry = sfaprotocol.server_proxy(url, key_file, cert_file) + registry = SfaServerProxy(url, key_file, cert_file) sfa_api = Generic.the_flavour() credential = sfa_api.getCredential() diff --git a/sfa/server/sfa_component_setup.py b/sfa/server/sfa_component_setup.py index 05a9525a..589a5720 100755 --- a/sfa/server/sfa_component_setup.py +++ b/sfa/server/sfa_component_setup.py @@ -6,7 +6,7 @@ from optparse import OptionParser from sfa.util.faults import ConnectionKeyGIDMismatch from sfa.util.config import Config -import sfa.client.sfaprotocol as sfaprotocol +from sfa.client.sfaserverproxy import SfaServerProxy from sfa.util.plxrn import hrn_to_pl_slicename, slicename_to_hrn from sfa.trust.certificate import Keypair, Certificate @@ -48,7 +48,7 @@ def server_proxy(url=None, port=None, keyfile=None, certfile=None,verbose=False) if verbose: print "Contacting registry at: %(url)s" % locals() - server = sfaprotocol.server_proxy(url, keyfile, certfile) + server = SfaServerProxy(url, keyfile, certfile) return server diff --git a/tests/testInterfaces.py b/tests/testInterfaces.py index f12cae10..a51799b8 100755 --- a/tests/testInterfaces.py +++ b/tests/testInterfaces.py @@ -4,7 +4,7 @@ import os import random import string import unittest -import sfa.util.sfaprotocol as sfaprotocol + from unittest import TestCase from optparse import OptionParser from sfa.util.xrn import get_authority @@ -13,6 +13,7 @@ from sfa.trust.certificate import * from sfa.trust.credential import * from sfa.trust.sfaticket import SfaTicket from sfa.client import sfi +from sfa.client.sfaserverproxy import SfaServerProxy, ServerException def random_string(size): return "".join(random.sample(string.letters, size)) @@ -43,10 +44,10 @@ class Client: self.cert.save_to_file(cert_file) SFI_AGGREGATE = config.SFI_SM.replace('12347', '12346') SFI_CM = 'http://' + options.cm_host + ':12346' - self.registry = sfaprotocol.server_proxy(config.SFI_REGISTRY, key_file, cert_file) - self.aggregate = sfaprotocol.server_proxy(SFI_AGGREGATE, key_file, cert_file) - self.sm = sfaprotocol.server_proxy(config.SFI_SM, key_file, cert_file) - self.cm = sfaprotocol.server_proxy(SFI_CM, key_file, cert_file) + self.registry = SfaServerProxy(config.SFI_REGISTRY, key_file, cert_file) + self.aggregate = SfaServerProxy(SFI_AGGREGATE, key_file, cert_file) + self.sm = SfaServerProxy(config.SFI_SM, key_file, cert_file) + self.cm = SfaServerProxy(SFI_CM, key_file, cert_file) self.hrn = config.SFI_USER # XX defaulting to user, but this should be configurable so we can # test from components persepctive @@ -170,7 +171,7 @@ class RegistryTest(BasicTestCase): server_exception = False try: callable(self.credential) - except sfaprotocol.ServerException: + except ServerException: server_exception = True finally: if self.type in ['user'] and not server_exception: -- 2.43.0