#
#
-# Copyright (C) 2006, 2007 Google Inc.
+# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# environment error (e.g. node disk error)
ECODE_ENVIRON = "environment_error"
+#: List of all failure types
+ECODE_ALL = frozenset([
+ ECODE_RESOLVER,
+ ECODE_NORES,
+ ECODE_INVAL,
+ ECODE_STATE,
+ ECODE_NOENT,
+ ECODE_EXISTS,
+ ECODE_NOTUNIQUE,
+ ECODE_FAULT,
+ ECODE_ENVIRON,
+ ])
+
class GenericError(Exception):
"""Base exception for Ganeti.
"""
- pass
class LVMError(GenericError):
This exception codifies problems with LVM setup.
"""
- pass
class LockError(GenericError):
This signifies problems in the locking subsystem.
"""
- pass
+
+
+class PidFileLockError(LockError):
+ """PID file is already locked by another process.
+
+ """
class HypervisorError(GenericError):
properly.
"""
- pass
class ProgrammerError(GenericError):
parts of our code. It signifies a real programming bug.
"""
- pass
class BlockDeviceError(GenericError):
properly.
"""
- pass
class ConfigurationError(GenericError):
exist in the config or such raise this exception.
"""
- pass
+
+
+class ConfigVersionMismatch(ConfigurationError):
+ """Version mismatch in the configuration file.
+
+ The error has two arguments: the expected and the actual found
+ version.
+
+ """
class ReservationError(GenericError):
remote node. It usually signifies a real programming bug.
"""
- pass
class SignatureError(GenericError):
because of spurious traffic.
"""
- pass
class ParameterError(GenericError):
The argument to this exception should be the parameter name.
"""
- pass
class OpPrereqError(GenericError):
"""
+class OpResultError(GenericError):
+ """Issue with OpCode result.
+
+ """
+
+
class OpCodeUnknown(GenericError):
"""Unknown opcode submitted.
"""
+class JobFileCorrupted(GenericError):
+ """Job file could not be properly decoded/restored.
+
+ """
+
+
class ResolverError(GenericError):
"""Host name cannot be resolved.
"""
+class ParseError(GenericError):
+ """Generic parse error.
+
+ Raised when unable to parse user input.
+
+ """
+
+
class TypeEnforcementError(GenericError):
"""Unable to enforce data type.
"""
+class X509CertError(GenericError):
+ """Invalid X509 certificate.
+
+ This error has two arguments: the certificate filename and the error cause.
+
+ """
+
+
class TagError(GenericError):
"""Generic tag error.
class QuitGanetiException(Exception):
- """Signal that Ganeti that it must quit.
+ """Signal Ganeti that it must quit.
This is not necessarily an error (and thus not a subclass of
GenericError), but it's an exceptional circumstance and it is thus
"""
-class ConfdFatalError(GenericError):
- """A fatal failure in Ganeti confd.
-
- Events that compromise the ability of confd to proceed further.
- (for example: inability to load the config file)
-
- """
-
-
class ConfdRequestError(GenericError):
"""A request error in Ganeti confd.
"""
+class NoCtypesError(GenericError):
+ """python ctypes module is not found in the system.
+
+ """
+
+
+class IPAddressError(GenericError):
+ """Generic IP address error.
+
+ """
+
+
+class LuxiError(GenericError):
+ """LUXI error.
+
+ """
+
+
+class QueryFilterParseError(ParseError):
+ """Error while parsing query filter.
+
+ """
+ def GetDetails(self):
+ """Returns a list of strings with details about the error.
+
+ """
+ try:
+ (_, inner) = self.args
+ except IndexError:
+ return None
+
+ return [str(inner.line),
+ (" " * (inner.column - 1)) + "^",
+ str(inner)]
+
+
+class RapiTestResult(GenericError):
+ """Exception containing results from RAPI test utilities.
+
+ """
+
+
# errors should be added above
return (err.__class__.__name__, err.args)
-def MaybeRaise(result):
- """If this looks like an encoded Ganeti exception, raise it.
+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 re-raise it.
+ 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
- err_class = GetErrorClass(result[0])
- if err_class is not None:
- raise err_class, tuple(result[1])
+ 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
+ # pylint: disable=W0142
+ raise errcls(*args)