Improve cli.SubmitOpCode
[ganeti-local] / tools / burnin
index 23a82e6..cfa848a 100755 (executable)
@@ -26,6 +26,7 @@
 import os
 import sys
 import optparse
+import time
 from itertools import izip, islice, cycle
 from cStringIO import StringIO
 
@@ -62,9 +63,8 @@ class Burner(object):
 
   def __init__(self):
     """Constructor."""
-    logger.SetupLogging(debug=False, program="ganeti/burnin")
+    logger.SetupLogging(program="ganeti/burnin", debug=False)
     self._feed_buf = StringIO()
-    self.proc = mcpu.Processor(feedback=self.Feedback)
     self.nodes = []
     self.instances = []
     self.to_rem = []
@@ -82,15 +82,14 @@ class Burner(object):
 
   def Feedback(self, msg):
     """Acumulate feedback in our buffer."""
-    self._feed_buf.write(msg)
-    self._feed_buf.write("\n")
+    self._feed_buf.write("%s %s\n" % (time.ctime(msg[0]), msg[2]))
     if self.opts.verbose:
       Log(msg)
 
   def ExecOp(self, op):
     """Execute an opcode and manage the exec buffer."""
     self.ClearFeedbackBuf()
-    return self.proc.ExecOpCode(op)
+    return cli.SubmitOpCode(op, feedback_fn=self.Feedback)
 
   def ParseOptions(self):
     """Parses the command line options.
@@ -257,9 +256,12 @@ class Burner(object):
     mytor = izip(islice(cycle(self.nodes), 2, None),
                  self.instances)
     for tnode, instance in mytor:
+      if self.opts.iallocator:
+        tnode = None
       op = opcodes.OpReplaceDisks(instance_name=instance,
                                   mode=mode,
                                   remote_node=tnode,
+                                  iallocator=self.opts.iallocator,
                                   disks=["sda", "sdb"])
       Log("- Replace secondary (%s) for instance %s" % (mode, instance))
       self.ExecOp(op)
@@ -285,10 +287,24 @@ class Burner(object):
                  self.instances)
 
     for pnode, snode, enode, instance in mytor:
+
+      if self.opts.iallocator:
+        pnode = snode = None
+        import_log_msg = ("- Import instance %s from node %s (iallocator: %s)" %
+                          (instance, enode, self.opts.iallocator))
+      elif self.opts.disk_template not in constants.DTS_NET_MIRROR:
+        snode = None
+        import_log_msg = ("- Import instance %s from node %s to node %s" %
+                          (instance, enode, pnode))
+      else:
+        import_log_msg = ("- Import instance %s from node %s to nodes %s/%s" %
+                          (instance, enode, pnode, snode))
+
       exp_op = opcodes.OpExportInstance(instance_name=instance,
                                            target_node=enode,
                                            shutdown=True)
-      rem_op = opcodes.OpRemoveInstance(instance_name=instance)
+      rem_op = opcodes.OpRemoveInstance(instance_name=instance,
+                                        ignore_failures=True)
       nam_op = opcodes.OpQueryInstances(output_fields=["name"],
                                            names=[instance])
       full_name = self.ExecOp(nam_op)[0][0]
@@ -309,7 +325,8 @@ class Burner(object):
                                         wait_for_sync=True,
                                         mac="auto",
                                         file_storage_dir=None,
-                                        file_driver=None)
+                                        file_driver=None,
+                                        iallocator=self.opts.iallocator)
       erem_op = opcodes.OpRemoveExport(instance_name=instance)
 
       Log("- Export instance %s to node %s" % (instance, enode))
@@ -317,8 +334,7 @@ class Burner(object):
       Log("- Remove instance %s" % (instance))
       self.ExecOp(rem_op)
       self.to_rem.remove(instance)
-      Log("- Import instance %s from node %s to node %s" %
-          (instance, enode, pnode))
+      Log(import_log_msg)
       self.ExecOp(imp_op)
       Log("- Remove export of instance %s" % (instance))
       self.ExecOp(erem_op)
@@ -353,7 +369,8 @@ class Burner(object):
   def Remove(self):
     """Remove the instances."""
     for instance in self.to_rem:
-      op = opcodes.OpRemoveInstance(instance_name=instance)
+      op = opcodes.OpRemoveInstance(instance_name=instance,
+                                    ignore_failures=True)
       Log("- Remove instance %s" % instance)
       self.ExecOp(op)
 
@@ -424,17 +441,7 @@ def main():
   """Main function"""
 
   burner = Burner()
-  try:
-    utils.Lock('cmd', max_retries=15, debug=True)
-  except errors.LockError, err:
-    logger.ToStderr(str(err))
-    return 1
-  try:
-    retval = burner.BurninCluster()
-  finally:
-    utils.Unlock('cmd')
-    utils.LockCleanup()
-  return retval
+  return burner.BurninCluster()
 
 
 if __name__ == "__main__":