Merge branch 'devel-2.4'
[ganeti-local] / lib / errors.py
index 8618be2..9de3b6d 100644 (file)
@@ -1,7 +1,7 @@
 #
 #
 
 #
 #
 
-# Copyright (C) 2006, 2007 Google Inc.
+# Copyright (C) 2006, 2007, 2008, 2009, 2010 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
 #
 # 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
@@ -43,6 +43,19 @@ ECODE_FAULT = "internal_error"
 # environment error (e.g. node disk error)
 ECODE_ENVIRON = "environment_error"
 
 # 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.
 
 class GenericError(Exception):
   """Base exception for Ganeti.
@@ -110,6 +123,16 @@ class ConfigurationError(GenericError):
   pass
 
 
   pass
 
 
+class ConfigVersionMismatch(ConfigurationError):
+  """Version mismatch in the configuration file.
+
+  The error has two arguments: the expected and the actual found
+  version.
+
+  """
+  pass
+
+
 class ReservationError(GenericError):
   """Errors reserving a resource.
 
 class ReservationError(GenericError):
   """Errors reserving a resource.
 
@@ -228,6 +251,14 @@ class UnitParseError(GenericError):
   """
 
 
   """
 
 
+class ParseError(GenericError):
+  """Generic parse error.
+
+  Raised when unable to parse user input.
+
+  """
+
+
 class TypeEnforcementError(GenericError):
   """Unable to enforce data type.
 
 class TypeEnforcementError(GenericError):
   """Unable to enforce data type.
 
@@ -267,7 +298,7 @@ class InotifyError(GenericError):
 
 
 class QuitGanetiException(Exception):
 
 
 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
 
   This is not necessarily an error (and thus not a subclass of
   GenericError), but it's an exceptional circumstance and it is thus
@@ -348,6 +379,36 @@ class NoCtypesError(GenericError):
   """
 
 
   """
 
 
+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)]
+
+
 # errors should be added above
 
 
 # errors should be added above
 
 
@@ -386,17 +447,33 @@ def EncodeException(err):
   return (err.__class__.__name__, err.args)
 
 
   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
 
   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
 
   """
   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
+    raise errcls, args