success = True
except errors.GenericError, err:
success = False
- result = (err.__class__.__name__, err.args)
+ result = errors.EncodeException(err)
except:
logging.error("Unexpected exception", exc_info=True)
err = sys.exc_info()
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])
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])
-
+ errors.MaybeRaise(result)
raise RequestError(result)
return result