X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/cec9845cb50cd5a76b3f8421895ee52684ae4d5c..6757e7a74addc39c8071bf981a2f76e768541ed7:/qa/qa_node.py diff --git a/qa/qa_node.py b/qa/qa_node.py index 44f89b1..7fc90f7 100644 --- a/qa/qa_node.py +++ b/qa/qa_node.py @@ -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)