Remove print statement from cmdlib
[ganeti-local] / qa / qa_node.py
index 44f89b1..7fc90f7 100644 (file)
@@ -20,19 +20,25 @@ from ganeti import utils
 
 import qa_config
 import qa_error
+import qa_utils
 
 from qa_utils import AssertEqual, StartSSH
 
 
-def _NodeAdd(node):
+@qa_utils.DefineHook('node-add')
+def _NodeAdd(node, readd=False):
   master = qa_config.GetMasterNode()
 
-  if node.get('_added', False):
+  if not readd and node.get('_added', False):
     raise qa_error.Error("Node %s already in cluster" % node['primary'])
+  elif readd and not node.get('_added', False):
+    raise qa_error.Error("Node %s not yet in cluster" % node['primary'])
 
   cmd = ['gnt-node', 'add']
   if node.get('secondary', None):
     cmd.append('--secondary-ip=%s' % node['secondary'])
+  if readd:
+    cmd.append('--readd')
   cmd.append(node['primary'])
   AssertEqual(StartSSH(master['primary'],
                        utils.ShellQuoteArgs(cmd)).wait(), 0)
@@ -40,6 +46,7 @@ def _NodeAdd(node):
   node['_added'] = True
 
 
+@qa_utils.DefineHook('node-remove')
 def _NodeRemove(node):
   master = qa_config.GetMasterNode()
 
@@ -54,7 +61,7 @@ def TestNodeAddAll():
   master = qa_config.GetMasterNode()
   for node in qa_config.get('nodes'):
     if node != master:
-      _NodeAdd(node)
+      _NodeAdd(node, readd=False)
 
 
 def TestNodeRemoveAll():
@@ -65,6 +72,13 @@ def TestNodeRemoveAll():
       _NodeRemove(node)
 
 
+@qa_utils.DefineHook('node-readd')
+def TestNodeReadd(node):
+  """gnt-node add --readd"""
+  _NodeAdd(node, readd=True)
+
+
+@qa_utils.DefineHook('node-info')
 def TestNodeInfo():
   """gnt-node info"""
   master = qa_config.GetMasterNode()
@@ -74,6 +88,7 @@ def TestNodeInfo():
                        utils.ShellQuoteArgs(cmd)).wait(), 0)
 
 
+@qa_utils.DefineHook('node-volumes')
 def TestNodeVolumes():
   """gnt-node volumes"""
   master = qa_config.GetMasterNode()
@@ -81,3 +96,49 @@ def TestNodeVolumes():
   cmd = ['gnt-node', 'volumes']
   AssertEqual(StartSSH(master['primary'],
                        utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+
+@qa_utils.DefineHook('node-failover')
+def TestNodeFailover(node, node2):
+  """gnt-node failover"""
+  master = qa_config.GetMasterNode()
+
+  if qa_utils.GetNodeInstances(node2, secondaries=False):
+    raise qa_error.UnusableNodeError("Secondary node has at least one"
+                                     " primary instance. This test requires"
+                                     " it to have no primary instances.")
+
+  # Fail over to secondary node
+  cmd = ['gnt-node', 'failover', '-f', node['primary']]
+  AssertEqual(StartSSH(master['primary'],
+                       utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+  # ... and back again.
+  cmd = ['gnt-node', 'failover', '-f', node2['primary']]
+  AssertEqual(StartSSH(master['primary'],
+                       utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+
+@qa_utils.DefineHook('node-evacuate')
+def TestNodeEvacuate(node, node2):
+  """gnt-node evacuate"""
+  master = qa_config.GetMasterNode()
+
+  node3 = qa_config.AcquireNode(exclude=[node, node2])
+  try:
+    if qa_utils.GetNodeInstances(node3, secondaries=True):
+      raise qa_error.UnusableNodeError("Evacuation node has at least one"
+                                       " secondary instance. This test requires"
+                                       " it to have no secondary instances.")
+
+    # Evacuate all secondary instances
+    cmd = ['gnt-node', 'evacuate', '-f', node2['primary'], node3['primary']]
+    AssertEqual(StartSSH(master['primary'],
+                         utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+    # ... and back again.
+    cmd = ['gnt-node', 'evacuate', '-f', node3['primary'], node2['primary']]
+    AssertEqual(StartSSH(master['primary'],
+                         utils.ShellQuoteArgs(cmd)).wait(), 0)
+  finally:
+    qa_config.ReleaseNode(node3)