deeper pass on xmlrpclib vs xmlrpc.client as well as configparser
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Thu, 31 Mar 2016 17:31:37 +0000 (19:31 +0200)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Thu, 31 Mar 2016 17:31:37 +0000 (19:31 +0200)
19 files changed:
sfa/client/manifolduploader.py
sfa/client/sfaserverproxy.py
sfa/dummy/dummy_testbed_api_client.py
sfa/dummy/dummyshell.py
sfa/federica/fdshell.py
sfa/managers/component_manager_pl.py
sfa/nitos/nitosshell.py
sfa/openstack/shell.py
sfa/planetlab/nodemanager.py
sfa/server/sfaapi.py
sfa/server/threadedserver.py
sfa/server/xmlrpcapi.py
sfa/trust/gid.py
sfa/trust/sfaticket.py
sfa/util/config.py
sfa/util/faults.py
sfa/util/py23.py
tests/testCert.py
tools/py2depgraph.py

index 66874ba..a9dd29d 100755 (executable)
@@ -30,9 +30,10 @@ import ssl
 try:    turn_off_server_verify = { 'context' : ssl._create_unverified_context() } 
 except: turn_off_server_verify = {}
 
 try:    turn_off_server_verify = { 'context' : ssl._create_unverified_context() } 
 except: turn_off_server_verify = {}
 
-import xmlrpclib
 import getpass
 
 import getpass
 
+from sfa.util.py23 import xmlrpc_client
+
 class ManifoldUploader:
     """A utility class for uploading delegated credentials to a manifold/MySlice infrastructure"""
 
 class ManifoldUploader:
     """A utility class for uploading delegated credentials to a manifold/MySlice infrastructure"""
 
@@ -79,12 +80,12 @@ class ManifoldUploader:
 #        if not self._proxy:
 #            url=self.url()
 #            self.logger.info("Connecting manifold url %s"%url)
 #        if not self._proxy:
 #            url=self.url()
 #            self.logger.info("Connecting manifold url %s"%url)
-#            self._proxy = xmlrpclib.ServerProxy(url, allow_none = True)
+#            self._proxy = xmlrpc_client.ServerProxy(url, allow_none = True)
 #        return self._proxy
         url=self.url()
         self.logger.debug("Connecting manifold url %s"%url)
 #        return self._proxy
         url=self.url()
         self.logger.debug("Connecting manifold url %s"%url)
-        proxy = xmlrpclib.ServerProxy(url, allow_none = True,
-                                      **turn_off_server_verify)
+        proxy = xmlrpc_client.ServerProxy(url, allow_none = True,
+                                          **turn_off_server_verify)
 
         return proxy
 
 
         return proxy
 
index ca62ddf..333984c 100644 (file)
@@ -5,9 +5,10 @@ import ssl
 try:    turn_off_server_verify = { 'context' : ssl._create_unverified_context() } 
 except: turn_off_server_verify = {}
 
 try:    turn_off_server_verify = { 'context' : ssl._create_unverified_context() } 
 except: turn_off_server_verify = {}
 
-import xmlrpclib
 from httplib import HTTPS, HTTPSConnection
 
 from httplib import HTTPS, HTTPSConnection
 
+from sfa.util.py23 import xmlrpc_client
+
 try:
     from sfa.util.sfalogging import logger
 except:
 try:
     from sfa.util.sfalogging import logger
 except:
@@ -23,11 +24,11 @@ except:
 class ServerException(Exception):
     pass
 
 class ServerException(Exception):
     pass
 
-class ExceptionUnmarshaller(xmlrpclib.Unmarshaller):
+class ExceptionUnmarshaller(xmlrpc_client.Unmarshaller):
     def close(self):
         try:
     def close(self):
         try:
-            return xmlrpclib.Unmarshaller.close(self)
-        except xmlrpclib.Fault as e:
+            return xmlrpc_client.Unmarshaller.close(self)
+        except xmlrpc_client.Fault as e:
             raise ServerException(e.faultString)
 
 ##
             raise ServerException(e.faultString)
 
 ##
@@ -37,10 +38,10 @@ class ExceptionUnmarshaller(xmlrpclib.Unmarshaller):
 
 # targetting only python-2.7 we can get rid of some older code
 
 
 # targetting only python-2.7 we can get rid of some older code
 
-class XMLRPCTransport(xmlrpclib.Transport):
+class XMLRPCTransport(xmlrpc_client.Transport):
     
     def __init__(self, key_file = None, cert_file = None, timeout = None):
     
     def __init__(self, key_file = None, cert_file = None, timeout = None):
-        xmlrpclib.Transport.__init__(self)
+        xmlrpc_client.Transport.__init__(self)
         self.timeout=timeout
         self.key_file = key_file
         self.cert_file = cert_file
         self.timeout=timeout
         self.key_file = key_file
         self.cert_file = cert_file
@@ -74,21 +75,21 @@ class XMLRPCTransport(xmlrpclib.Transport):
 
     def getparser(self):
         unmarshaller = ExceptionUnmarshaller()
 
     def getparser(self):
         unmarshaller = ExceptionUnmarshaller()
-        parser = xmlrpclib.ExpatParser(unmarshaller)
+        parser = xmlrpc_client.ExpatParser(unmarshaller)
         return parser, unmarshaller
 
         return parser, unmarshaller
 
-class XMLRPCServerProxy(xmlrpclib.ServerProxy):
+class XMLRPCServerProxy(xmlrpc_client.ServerProxy):
     def __init__(self, url, transport, allow_none=True, verbose=False):
         # remember url for GetVersion
         # xxx not sure this is still needed as SfaServerProxy has this too
     def __init__(self, url, transport, allow_none=True, verbose=False):
         # remember url for GetVersion
         # xxx not sure this is still needed as SfaServerProxy has this too
-        self.url=url
-        xmlrpclib.ServerProxy.__init__(self, url, transport, allow_none=allow_none,
-                                       verbose=verbose,
+        self.url = url
+        xmlrpc_client.ServerProxy.__init__(self, url, transport, allow_none=allow_none,
+                                           verbose=verbose,
                                        **turn_off_server_verify)
 
     def __getattr__(self, attr):
         logger.debug ("xml-rpc %s method:%s" % (self.url, attr))
                                        **turn_off_server_verify)
 
     def __getattr__(self, attr):
         logger.debug ("xml-rpc %s method:%s" % (self.url, attr))
-        return xmlrpclib.ServerProxy.__getattr__(self, attr)
+        return xmlrpc_client.ServerProxy.__getattr__(self, attr)
 
 ########## the object on which we can send methods that get sent over xmlrpc
 class SfaServerProxy:
 
 ########## the object on which we can send methods that get sent over xmlrpc
 class SfaServerProxy:
@@ -99,7 +100,7 @@ class SfaServerProxy:
         self.certfile = certfile
         self.verbose = verbose
         self.timeout = timeout
         self.certfile = certfile
         self.verbose = verbose
         self.timeout = timeout
-        # an instance of xmlrpclib.ServerProxy
+        # an instance of xmlrpc_client.ServerProxy
         transport = XMLRPCTransport(keyfile, certfile, timeout)
         self.serverproxy = XMLRPCServerProxy(url, transport, allow_none=True, verbose=verbose)
 
         transport = XMLRPCTransport(keyfile, certfile, timeout)
         self.serverproxy = XMLRPCServerProxy(url, transport, allow_none=True, verbose=verbose)
 
index 4b3989e..57a0482 100644 (file)
@@ -1,11 +1,11 @@
 from __future__ import print_function
 
 from __future__ import print_function
 
-import xmlrpclib
 from datetime import datetime
 import time
 from datetime import datetime
 import time
+from sfa.util.py23 import xmlrpc_client
 
 dummy_url = "http://localhost:8080"
 
 dummy_url = "http://localhost:8080"
-dummy_api = xmlrpclib.ServerProxy(dummy_url)
+dummy_api = xmlrpc_client.ServerProxy(dummy_url)
 
 # Add a user:
 my_user_id = dummy_api.AddUser({'email': 'john.doe@test.net', 'user_name': 'john.doe', 'keys': ['copy here your ssh-rsa public key']})
 
 # Add a user:
 my_user_id = dummy_api.AddUser({'email': 'john.doe@test.net', 'user_name': 'john.doe', 'keys': ['copy here your ssh-rsa public key']})
index 50e78ac..67007d7 100644 (file)
@@ -1,9 +1,9 @@
 import sys
 import sys
-import xmlrpclib
 import socket
 from urlparse import urlparse
 
 from sfa.util.sfalogging import logger
 import socket
 from urlparse import urlparse
 
 from sfa.util.sfalogging import logger
+from sfa.util.py23 import xmlrpc_client
 
 class DummyShell:
     """
 
 class DummyShell:
     """
@@ -21,7 +21,7 @@ class DummyShell:
 
     def __init__ ( self, config ) :
         url = config.SFA_DUMMY_URL
 
     def __init__ ( self, config ) :
         url = config.SFA_DUMMY_URL
-        self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True)
+        self.proxy = xmlrpc_client.ServerProxy(url, verbose = False, allow_none = True)
 
     def __getattr__(self, name):
         def func(*args, **kwds):
 
     def __getattr__(self, name):
         def func(*args, **kwds):
index aefbdd1..1e7349c 100644 (file)
@@ -1,6 +1,5 @@
-import xmlrpclib
-
 from sfa.util.sfalogging import logger
 from sfa.util.sfalogging import logger
+from sfa.util.py23 import xmlrpc_client
 
 class FdShell:
     """
 
 class FdShell:
     """
@@ -20,9 +19,9 @@ class FdShell:
     def __init__ ( self, config ) :
         url=config.SFA_FEDERICA_URL
         # xxx not sure if java xmlrpc has support for None
     def __init__ ( self, config ) :
         url=config.SFA_FEDERICA_URL
         # xxx not sure if java xmlrpc has support for None
-        # self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True)
+        # self.proxy = xmlrpc_client.ServerProxy(url, verbose = False, allow_none = True)
         # xxx turn on verbosity
         # xxx turn on verbosity
-        self.proxy = xmlrpclib.Server(url, verbose = True)
+        self.proxy = xmlrpc_client.ServerProxy(url, verbose = True)
 
     # xxx get credentials from the config ?
     # right now basic auth data goes into the URL
 
     # xxx get credentials from the config ?
     # right now basic auth data goes into the URL
index 8518839..ba9b7eb 100644 (file)
@@ -1,7 +1,6 @@
-import xmlrpclib
-
 from sfa.util.faults import SliverDoesNotExist
 from sfa.util.version import version_core
 from sfa.util.faults import SliverDoesNotExist
 from sfa.util.version import version_core
+from sfa.util.py23 import xmlrpc_client
 
 from sfa.trust.sfaticket import SfaTicket
 
 
 from sfa.trust.sfaticket import SfaTicket
 
@@ -66,7 +65,7 @@ def redeem_ticket(api, ticket_string):
         raise SliverDoesNotExist(slicename)
 
     # convert ticket to format nm is used to
         raise SliverDoesNotExist(slicename)
 
     # convert ticket to format nm is used to
-    nm_ticket = xmlrpclib.dumps((ticket.attributes,), methodresponse=True)
+    nm_ticket = xmlrpc_client.dumps((ticket.attributes,), methodresponse=True)
     api.driver.nodemanager.AdminTicket(nm_ticket)
     
 
     api.driver.nodemanager.AdminTicket(nm_ticket)
     
 
index 2636e6d..cf543f2 100644 (file)
@@ -1,9 +1,9 @@
 import sys
 import sys
-import xmlrpclib
 import socket
 from urlparse import urlparse
 
 from sfa.util.sfalogging import logger
 import socket
 from urlparse import urlparse
 
 from sfa.util.sfalogging import logger
+from sfa.util.py23 import xmlrpc_client
 
 class NitosShell:
     """
 
 class NitosShell:
     """
@@ -26,7 +26,7 @@ class NitosShell:
     # use the 'capability' auth mechanism for higher performance when the PLC db is local    
     def __init__ ( self, config ) :
         url = config.SFA_NITOS_URL
     # use the 'capability' auth mechanism for higher performance when the PLC db is local    
     def __init__ ( self, config ) :
         url = config.SFA_NITOS_URL
-        self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True)
+        self.proxy = xmlrpc_client.ServerProxy(url, verbose = False, allow_none = True)
 
     def __getattr__(self, name):
         def func(*args, **kwds):
 
     def __getattr__(self, name):
         def func(*args, **kwds):
index acb9cff..e31be9d 100644 (file)
@@ -1,5 +1,4 @@
 import sys
 import sys
-import xmlrpclib
 import socket
 import gettext
 from urlparse import urlparse
 import socket
 import gettext
 from urlparse import urlparse
index 1671b9d..12e7f22 100644 (file)
@@ -24,6 +24,8 @@ class NodeManager:
         (fd, filename) = tempfile.mkstemp(dir=path)        
         scriptname = script_path + os.sep + filename.split(os.sep)[-1:][0]
         # define the script to execute
         (fd, filename) = tempfile.mkstemp(dir=path)        
         scriptname = script_path + os.sep + filename.split(os.sep)[-1:][0]
         # define the script to execute
+        # when providing support for python3 wrt xmlrpclib
+        # looks safer to keep things as-is
         script = """
 #!%(python)s
 import xmlrpclib
         script = """
 #!%(python)s
 import xmlrpclib
index 9911e46..499e3bd 100644 (file)
@@ -19,7 +19,7 @@ from sfa.storage.alchemy import alchemy
 ####################
 class SfaApi (XmlrpcApi): 
     """
 ####################
 class SfaApi (XmlrpcApi): 
     """
-    An SfaApi instance is a basic xmlrcp service
+    An SfaApi instance is a basic xmlrpc service
     augmented with the local cryptographic material and hrn
 
     It also has the notion of its own interface (a string describing
     augmented with the local cryptographic material and hrn
 
     It also has the notion of its own interface (a string describing
index daf40e4..7a26ad2 100644 (file)
@@ -11,7 +11,6 @@ import socket
 import traceback
 import threading
 from Queue import Queue
 import traceback
 import threading
 from Queue import Queue
-import xmlrpclib
 import SocketServer
 import BaseHTTPServer
 import SimpleXMLRPCServer
 import SocketServer
 import BaseHTTPServer
 import SimpleXMLRPCServer
@@ -22,6 +21,7 @@ from sfa.util.config import Config
 from sfa.util.cache import Cache 
 from sfa.trust.certificate import Certificate
 from sfa.trust.trustedroots import TrustedRoots
 from sfa.util.cache import Cache 
 from sfa.trust.certificate import Certificate
 from sfa.trust.trustedroots import TrustedRoots
+from sfa.util.py23 import xmlrpc_client
 
 # don't hard code an api class anymore here
 from sfa.generic import Generic
 
 # don't hard code an api class anymore here
 from sfa.generic import Generic
@@ -195,7 +195,7 @@ class SecureXMLRPCServer(BaseHTTPServer.HTTPServer,SimpleXMLRPCServer.SimpleXMLR
             # can't use format_exc() as it is not available in jython yet
             # (even in trunk).
             type, value, tb = sys.exc_info()
             # can't use format_exc() as it is not available in jython yet
             # (even in trunk).
             type, value, tb = sys.exc_info()
-            raise xmlrpclib.Fault(1,''.join(traceback.format_exception(type, value, tb)))
+            raise xmlrpc_client.Fault(1,''.join(traceback.format_exception(type, value, tb)))
 
     # override this one from the python 2.7 code
     # originally defined in class TCPServer
 
     # override this one from the python 2.7 code
     # originally defined in class TCPServer
index 167ac88..1711f88 100644 (file)
@@ -3,7 +3,6 @@
 #
 
 import string
 #
 
 import string
-import xmlrpclib
 
 # SOAP support is optional
 try:
 
 # SOAP support is optional
 try:
@@ -19,6 +18,7 @@ except ImportError:
 #from sfa.util.faults import SfaNotImplemented, SfaAPIError, SfaInvalidAPIMethod, SfaFault
 from sfa.util.faults import SfaInvalidAPIMethod, SfaAPIError, SfaFault
 from sfa.util.sfalogging import logger
 #from sfa.util.faults import SfaNotImplemented, SfaAPIError, SfaInvalidAPIMethod, SfaFault
 from sfa.util.faults import SfaInvalidAPIMethod, SfaAPIError, SfaFault
 from sfa.util.sfalogging import logger
+from sfa.util.py23 import xmlrpc_client
 
 ####################
 # See "2.2 Characters" in the XML specification:
 
 ####################
 # See "2.2 Characters" in the XML specification:
@@ -76,7 +76,9 @@ def xmlrpclib_dump(self, value, write):
         f(*args)
 
 # You can't hide from me!
         f(*args)
 
 # You can't hide from me!
-xmlrpclib.Marshaller._Marshaller__dump = xmlrpclib_dump
+# Note: not quite  sure if this will still cause
+# the expected behaviour under python3
+xmlrpc_client.Marshaller._Marshaller__dump = xmlrpclib_dump
 
 class XmlrpcApi:
     """
 
 class XmlrpcApi:
     """
@@ -131,9 +133,9 @@ class XmlrpcApi:
         """
         # Parse request into method name and arguments
         try:
         """
         # Parse request into method name and arguments
         try:
-            interface = xmlrpclib
-            self.protocol = 'xmlrpclib'
-            (args, method) = xmlrpclib.loads(data)
+            interface = xmlrpc_client
+            self.protocol = 'xmlrpc'
+            (args, method) = xmlrpc_client.loads(data)
             if method_map.has_key(method):
                 method = method_map[method]
             methodresponse = True
             if method_map.has_key(method):
                 method = method_map[method]
             methodresponse = True
@@ -168,10 +170,10 @@ class XmlrpcApi:
         convert result to a valid xmlrpc or soap response
         """   
  
         convert result to a valid xmlrpc or soap response
         """   
  
-        if self.protocol == 'xmlrpclib':
+        if self.protocol == 'xmlrpc':
             if not isinstance(result, SfaFault):
                 result = (result,)
             if not isinstance(result, SfaFault):
                 result = (result,)
-            response = xmlrpclib.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1)
+            response = xmlrpc_client.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1)
         elif self.protocol == 'soap':
             if isinstance(result, Exception):
                 result = faultParameter(NS.ENV_T + ":Server", "Method Failed", method)
         elif self.protocol == 'soap':
             if isinstance(result, Exception):
                 result = faultParameter(NS.ENV_T + ":Server", "Method Failed", method)
index b7fad17..3f903d9 100644 (file)
 
 from __future__ import print_function
 
 
 from __future__ import print_function
 
-import xmlrpclib
 import uuid
 
 from sfa.trust.certificate import Certificate
 
 from sfa.util.faults import GidInvalidParentHrn, GidParentHrn
 import uuid
 
 from sfa.trust.certificate import Certificate
 
 from sfa.util.faults import GidInvalidParentHrn, GidParentHrn
-from sfa.util.sfalogging import logger
 from sfa.util.xrn import hrn_to_urn, urn_to_hrn, hrn_authfor_hrn
 from sfa.util.xrn import hrn_to_urn, urn_to_hrn, hrn_authfor_hrn
+from sfa.util.sfalogging import logger
+from sfa.util.py23 import xmlrpc_client
 
 ##
 # Create a new uuid. Returns the UUID as a string.
 
 ##
 # Create a new uuid. Returns the UUID as a string.
@@ -176,7 +176,7 @@ class GID(Certificate):
         dict = {}
         if data:
             if data.lower().startswith('uri:http://<params>'):
         dict = {}
         if data:
             if data.lower().startswith('uri:http://<params>'):
-                dict = xmlrpclib.loads(data[11:])[0][0]
+                dict = xmlrpc_client.loads(data[11:])[0][0]
             else:
                 spl = data.split(', ')
                 for val in spl:
             else:
                 spl = data.split(', ')
                 for val in spl:
index 78e6d87..6d4a009 100644 (file)
 
 from __future__ import print_function
 
 
 from __future__ import print_function
 
-import xmlrpclib
-
 from sfa.trust.certificate import Certificate
 from sfa.trust.gid import GID
 
 from sfa.trust.certificate import Certificate
 from sfa.trust.gid import GID
 
+from sfa.util.py23 import xmlrpc_client
+
 # Ticket is tuple:
 #   (gidCaller, gidObject, attributes, rspec, delegate)
 #
 # Ticket is tuple:
 #   (gidCaller, gidObject, attributes, rspec, delegate)
 #
@@ -99,13 +99,13 @@ class SfaTicket(Certificate):
             dict["gidCaller"] = self.gidCaller.save_to_string(save_parents=True)
         if self.gidObject:
             dict["gidObject"] = self.gidObject.save_to_string(save_parents=True)
             dict["gidCaller"] = self.gidCaller.save_to_string(save_parents=True)
         if self.gidObject:
             dict["gidObject"] = self.gidObject.save_to_string(save_parents=True)
-        str = "URI:" + xmlrpclib.dumps((dict,), allow_none=True)
+        str = "URI:" + xmlrpc_client.dumps((dict,), allow_none=True)
         self.set_data(str)
 
     def decode(self):
         data = self.get_data()
         if data:
         self.set_data(str)
 
     def decode(self):
         data = self.get_data()
         if data:
-            dict = xmlrpclib.loads(self.get_data()[4:])[0][0]
+            dict = xmlrpc_client.loads(self.get_data()[4:])[0][0]
         else:
             dict = {}
 
         else:
             dict = {}
 
index 48ccd2b..e5435a7 100644 (file)
@@ -2,11 +2,11 @@
 import sys
 import os
 import time
 import sys
 import os
 import time
-import ConfigParser
 import tempfile
 import codecs
 from sfa.util.xml import XML
 from sfa.util.py23 import StringIO
 import tempfile
 import codecs
 from sfa.util.xml import XML
 from sfa.util.py23 import StringIO
+from sfa.util.py23 import ConfigParser
 
 default_config = \
 """
 
 default_config = \
 """
index 7299f27..702b685 100644 (file)
 # SFA API faults
 #
 
 # SFA API faults
 #
 
-try:
-    from xmlrpc.client import Fault as xmlrpcFault
-except:
-    from xmlrpclib import Fault as xmlrpcFault
-    
 from sfa.util.genicode import GENICODE
 from sfa.util.genicode import GENICODE
+from sfa.util.py23 import xmlrpc_client
 
 
-class SfaFault(xmlrpcFault):
+class SfaFault(xmlrpc_client.Fault):
     def __init__(self, faultCode, faultString, extra = None):
         if extra:
             faultString += ": " + str(extra)
     def __init__(self, faultCode, faultString, extra = None):
         if extra:
             faultString += ": " + str(extra)
-        xmlrpcFault.__init__(self, faultCode, faultString)
+        xmlrpc_client.Fault.__init__(self, faultCode, faultString)
 
 class Forbidden(SfaFault):
     def __init__(self,  extra = None):
 
 class Forbidden(SfaFault):
     def __init__(self,  extra = None):
@@ -276,10 +272,10 @@ class SliverDoesNotExist(SfaFault):
     def __str__(self):
         return repr(self.value)
 
     def __str__(self):
         return repr(self.value)
 
-class BadRequestHash(xmlrpcFault):
+class BadRequestHash(xmlrpc_client.Fault):
     def __init__(self, hash = None, extra = None):
         faultString = "bad request hash: " + str(hash)
     def __init__(self, hash = None, extra = None):
         faultString = "bad request hash: " + str(hash)
-        xmlrpcFault.__init__(self, GENICODE.ERROR, faultString)
+        xmlrpc_client.Fault.__init__(self, GENICODE.ERROR, faultString)
 
 class MissingTrustedRoots(SfaFault):
     def __init__(self, value, extra = None):
 
 class MissingTrustedRoots(SfaFault):
     def __init__(self, value, extra = None):
index 723a8e1..e581e7f 100644 (file)
@@ -1,3 +1,4 @@
+# our own simplistic replacement for six
 try:
     StringType = basestring
 except:
 try:
     StringType = basestring
 except:
@@ -7,3 +8,13 @@ try:
     from StringIO import StringIO
 except:
     from io import StringIO
     from StringIO import StringIO
 except:
     from io import StringIO
+
+try:
+    import xmlrpclib as xmlrpc_client
+except:
+    from xmlrpc import client as xmlrpc_client
+
+try:
+    import ConfigParser
+except:
+    import configparser as ConfigParser
index 0a6a90c..b2e8133 100755 (executable)
@@ -1,6 +1,6 @@
 import unittest
 import unittest
-import xmlrpclib
 from sfa.trust.certificate import Certificate, Keypair
 from sfa.trust.certificate import Certificate, Keypair
+from sfa.util.py23 import xmlrpc_client
 
 class TestCert(unittest.TestCase):
    def setUp(self):
 
 class TestCert(unittest.TestCase):
    def setUp(self):
@@ -42,7 +42,7 @@ class TestCert(unittest.TestCase):
       # try something a bit more complicated, like an xmlrpc encoding of
       # some parameters
       cert = Certificate(subject="test")
       # try something a bit more complicated, like an xmlrpc encoding of
       # some parameters
       cert = Certificate(subject="test")
-      data = xmlrpclib.dumps((1, "foo", ["a", "b"], {"c": "d", "e": "f"}, True))
+      data = xmlrpc_client.dumps((1, "foo", ["a", "b"], {"c": "d", "e": "f"}, True))
       cert.set_data(data)
       self.assertEqual(cert.get_data(), data)
 
       cert.set_data(data)
       self.assertEqual(cert.get_data(), data)
 
index 022add3..ef3b6f8 100755 (executable)
@@ -23,7 +23,7 @@
 import sys, pprint
 import modulefinder
 
 import sys, pprint
 import modulefinder
 
-focus=[ 'sfa' , 'OpenSSL', 'M2Crypto', 'xmlrpclib', 'threading' ]
+focus = [ 'sfa' , 'OpenSSL', 'M2Crypto', 'xmlrpclib', 'threading' ]
 
 class mymf(modulefinder.ModuleFinder):
     def __init__(self,*args,**kwargs):
 
 class mymf(modulefinder.ModuleFinder):
     def __init__(self,*args,**kwargs):