diff options
author | Rob Crittenden <rcritten@redhat.com> | 2008-02-22 14:47:15 -0500 |
---|---|---|
committer | Rob Crittenden <rcritten@redhat.com> | 2008-02-22 14:47:15 -0500 |
commit | 8f0d4a8ed3cd80ee1c68d3f17e777fa89bcc105a (patch) | |
tree | 2ebef2f9a4b1d684f70e5f6192cb4b2c5ab96fb4 /ipa-python/rpcclient.py | |
parent | c367b917d78f3de357d01fdc409ee7824e24a8d1 (diff) | |
download | freeipa-8f0d4a8ed3cd80ee1c68d3f17e777fa89bcc105a.tar.gz freeipa-8f0d4a8ed3cd80ee1c68d3f17e777fa89bcc105a.tar.xz freeipa-8f0d4a8ed3cd80ee1c68d3f17e777fa89bcc105a.zip |
Add failover to the XML-RPC client
433506
Diffstat (limited to 'ipa-python/rpcclient.py')
-rw-r--r-- | ipa-python/rpcclient.py | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/ipa-python/rpcclient.py b/ipa-python/rpcclient.py index e95b21f8d..2359c5d65 100644 --- a/ipa-python/rpcclient.py +++ b/ipa-python/rpcclient.py @@ -20,6 +20,7 @@ import xmlrpclib import socket import config +import errno from krbtransport import KerbTransport from kerberos import GSSError from ipa import ipaerror, ipautil @@ -31,16 +32,34 @@ from ipa import config class RPCClient: def __init__(self): + self.server = None config.init_config() - def server_url(self): + def server_url(self, server): """Build the XML-RPC server URL from our configuration""" - return "https://" + config.config.get_server() + "/ipa" + return "https://" + server + "/ipa" def setup_server(self): """Create our XML-RPC server connection using kerberos authentication""" - return xmlrpclib.ServerProxy(self.server_url(), KerbTransport()) + if not self.server: + serverlist = config.config.get_server() + + # Try each server until we succeed or run out of servers to try + # Guaranteed by ipa.config to have at least 1 in the list + for s in serverlist: + try: + self.server = s + remote = xmlrpclib.ServerProxy(self.server_url(s), KerbTransport()) + result = remote.ping() + break + except socket.error, e: + if (e[0] == errno.ECONNREFUSED) or (e[0] == errno.ECONNREFUSED) or (e[0] == errno.EHOSTDOWN) or (e[0] == errno.EHOSTUNREACH): + continue + else: + raise e + + return xmlrpclib.ServerProxy(self.server_url(self.server), KerbTransport()) # Higher-level API |