summaryrefslogtreecommitdiffstats
path: root/ipa-python/rpcclient.py
diff options
context:
space:
mode:
authorRob Crittenden <rcritten@redhat.com>2008-02-22 14:47:15 -0500
committerRob Crittenden <rcritten@redhat.com>2008-02-22 14:47:15 -0500
commit8f0d4a8ed3cd80ee1c68d3f17e777fa89bcc105a (patch)
tree2ebef2f9a4b1d684f70e5f6192cb4b2c5ab96fb4 /ipa-python/rpcclient.py
parentc367b917d78f3de357d01fdc409ee7824e24a8d1 (diff)
downloadfreeipa-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.py25
1 files changed, 22 insertions, 3 deletions
diff --git a/ipa-python/rpcclient.py b/ipa-python/rpcclient.py
index e95b21f8..2359c5d6 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