From 03a8dbdc0c84f0914f11e80c3570d3a8b00c6a58 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Sat, 21 Jun 2008 18:49:14 +0000
Subject: [PATCH] Implement handling of luxi errors in cli.py
Currently the generic handling of ganeti errors in cli.py (GenericMain
and FormatError) only handles the core ganeti errors, and not the client
protocol errors (which live in a separate hierarchy).
This patch adds handling of luxi errors too, and also adds another luxi
error for the case when the master is not running. This gives us a nice:
gnta1:~# gnt-node list
Cannot communicate with the master daemon.
Is it running and listening on '/var/run/ganeti-master.sock'?
error message instead of a traceback.
Reviewed-by: amishchenko
---
lib/cli.py | 11 ++++++++++-
lib/luxi.py | 17 +++++++++++++++--
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/lib/cli.py b/lib/cli.py
index 917b3458c..167f28cb8 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -466,6 +466,15 @@ def FormatError(err):
obuf.write("Failure: invalid tag(s) given:\n%s" % msg)
elif isinstance(err, errors.GenericError):
obuf.write("Unhandled Ganeti error: %s" % msg)
+ elif isinstance(err, luxi.NoMasterError):
+ obuf.write("Cannot communicate with the master daemon.\nIs it running"
+ " and listening on '%s'?" % err.args[0])
+ elif isinstance(err, luxi.TimeoutError):
+ obuf.write("Timeout while talking to the master daemon. Error:\n"
+ "%s" % msg)
+ elif isinstance(err, luxi.ProtocolError):
+ obuf.write("Unhandled protocol error while talking to the master daemon:\n"
+ "%s" % msg)
else:
obuf.write("Unhandled exception: %s" % msg)
return retcode, obuf.getvalue().rstrip('\n')
@@ -517,7 +526,7 @@ def GenericMain(commands, override=None, aliases=None):
try:
result = func(options, args)
- except errors.GenericError, err:
+ except (errors.GenericError, luxi.ProtocolError), err:
result, err_msg = FormatError(err)
logger.ToStderr(err_msg)
diff --git a/lib/luxi.py b/lib/luxi.py
index df9ed89a3..993907d49 100644
--- a/lib/luxi.py
+++ b/lib/luxi.py
@@ -33,6 +33,7 @@ import socket
import collections
import simplejson
import time
+import errno
from ganeti import opcodes
from ganeti import constants
@@ -80,6 +81,14 @@ class RequestError(ProtocolError):
"""
+class NoMasterError(ProtocolError):
+ """The master cannot be reached
+
+ This means that the master daemon is not running or the socket has
+ been removed.
+
+ """
+
def SerializeJob(job):
"""Convert a job description to a string format.
@@ -153,9 +162,13 @@ class Transport:
try:
self.socket.connect(address)
except socket.timeout, err:
- raise TimeoutError("Connection timed out: %s" % str(err))
+ raise TimeoutError("Connect timed out: %s" % str(err))
+ except socket.error, err:
+ if err.args[0] == errno.ENOENT:
+ raise NoMasterError((address,))
+ raise
self.socket.settimeout(self._rwtimeout)
- except socket.error:
+ except (socket.error, NoMasterError):
if self.socket is not None:
self.socket.close()
self.socket = None
--
GitLab