Change OSFromDisk's docstring to epydoc
[ganeti-local] / lib / luxi.py
index 541e059..7ade2b5 100644 (file)
@@ -36,6 +36,7 @@ import errno
 
 from ganeti import serializer
 from ganeti import constants
+from ganeti import errors
 
 
 KEY_METHOD = 'method'
@@ -53,6 +54,7 @@ REQ_QUERY_INSTANCES = "QueryInstances"
 REQ_QUERY_NODES = "QueryNodes"
 REQ_QUERY_EXPORTS = "QueryExports"
 REQ_QUERY_CONFIG_VALUES = "QueryConfigValues"
+REQ_QUEUE_SET_DRAIN_FLAG = "SetDrainFlag"
 
 DEF_CTMO = 10
 DEF_RWTO = 60
@@ -275,11 +277,23 @@ class Client(object):
         KEY_RESULT not in data):
       raise DecodingError("Invalid response from server: %s" % str(data))
 
+    result = data[KEY_RESULT]
+
     if not data[KEY_SUCCESS]:
       # TODO: decide on a standard exception
-      raise RequestError(data[KEY_RESULT])
+      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 data[KEY_RESULT]
+    return result
+
+  def SetQueueDrainFlag(self, drain_flag):
+    return self.CallMethod(REQ_QUEUE_SET_DRAIN_FLAG, drain_flag)
 
   def SubmitJob(self, ops):
     ops_state = map(lambda op: op.__getstate__(), ops)
@@ -319,4 +333,5 @@ class Client(object):
   def QueryConfigValues(self, fields):
     return self.CallMethod(REQ_QUERY_CONFIG_VALUES, fields)
 
+
 # TODO: class Server(object)