Commit a6607331 authored by Iustin Pop's avatar Iustin Pop
Browse files

Move the luxi error handling into

Currently the luxi error handling is hardcoded as special encoding on
the masterd-side and special decoding on the client side. This patch
moves it to such that other parts of the code can reuse the
same encoding.
Signed-off-by: default avatarIustin Pop <>
Reviewed-by: default avatarMichael Hanselmann <>
(cherry picked from commit 6956e9cd)
parent 31821208
......@@ -167,7 +167,7 @@ class ClientRqHandler(SocketServer.BaseRequestHandler):
success = True
except errors.GenericError, err:
success = False
result = (err.__class__.__name__, err.args)
result = errors.EncodeException(err)
logging.error("Unexpected exception", exc_info=True)
err = sys.exc_info()
......@@ -285,3 +285,35 @@ def GetErrorClass(name):
issubclass(item, GenericError)):
item = None
return item
def EncodeException(err):
"""Encodes an exception into a format that L{MaybeRaise} will recognise.
The passed L{err} argument will be formatted as a tuple (exception
name, arguments) that the MaybeRaise function will recognise.
@type err: GenericError child
@param err: usually a child of GenericError (but any exception
will be accepted)
@rtype: tuple
@return: tuple of (exception name, exception arguments)
return (err.__class__.__name__, err.args)
def MaybeRaise(result):
"""Is this looks like an encoded Ganeti exception, raise it.
This function tries to parse the passed argument and if it looks
like an encoding done by EncodeException, it will re-raise it.
tlt = (tuple, list)
if (isinstance(result, tlt) and len(result) == 2 and
isinstance(result[1], tlt)):
# custom ganeti errors
err_class = GetErrorClass(result[0])
if err_class is not None:
raise err_class, tuple(result[1])
......@@ -324,14 +324,7 @@ class Client(object):
result = data[KEY_RESULT]
if not data[KEY_SUCCESS]:
# TODO: decide on a standard exception
if (isinstance(result, (tuple, list)) and len(result) == 2 and
isinstance(result[1], (tuple, list))):
# custom ganeti errors
err_class = errors.GetErrorClass(result[0])
if err_class is not None:
raise err_class, tuple(result[1])
raise RequestError(result)
return result
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment