+
+
+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 GetEncodedError(result):
+ """If this looks like an encoded Ganeti exception, return it.
+
+ This function tries to parse the passed argument and if it looks
+ like an encoding done by EncodeException, it will return the class
+ object and arguments.
+
+ """
+ tlt = (tuple, list)
+ if (isinstance(result, tlt) and len(result) == 2 and
+ isinstance(result[1], tlt)):
+ # custom ganeti errors
+ errcls = GetErrorClass(result[0])
+ if errcls:
+ return (errcls, tuple(result[1]))
+
+ return None
+
+
+def MaybeRaise(result):
+ """If 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.
+
+ """
+ error = GetEncodedError(result)
+ if error:
+ (errcls, args) = error
+ raise errcls, args