... which test changes to the cluster parameter user shutdown and vm
capable attributes.

Signed-off-by: Jose A. Lopes <[email protected]>
---
 qa/ganeti-qa.py   |   1 +
 qa/qa_cluster.py  | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 qa/qa_instance.py |   2 ++
 3 files changed, 103 insertions(+)

diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py
index 9238ee0..22b7980 100755
--- a/qa/ganeti-qa.py
+++ b/qa/ganeti-qa.py
@@ -244,6 +244,7 @@ def RunClusterTests():
     ("cluster-modify", qa_cluster.TestClusterModifyDiskTemplates),
     ("cluster-modify", qa_cluster.TestClusterModifyFileStorageDir),
     ("cluster-modify", qa_cluster.TestClusterModifySharedFileStorageDir),
+    ("cluster-modify", qa_cluster.TestClusterModifyUserShutdown),
     ("cluster-rename", qa_cluster.TestClusterRename),
     ("cluster-info", qa_cluster.TestClusterVersion),
     ("cluster-info", qa_cluster.TestClusterInfo),
diff --git a/qa/qa_cluster.py b/qa/qa_cluster.py
index 7afde6c..e319155 100644
--- a/qa/qa_cluster.py
+++ b/qa/qa_cluster.py
@@ -25,6 +25,7 @@
 
 import re
 import tempfile
+import time
 import os.path
 
 from ganeti import _constants
@@ -1005,6 +1006,105 @@ def TestClusterModifyISpecs():
     AssertEqual(initcmd, new_initcmd)
 
 
+def _TestClusterModifyUserShutdownXen(nodes):
+  """Tests user shutdown cluster wide for the KVM hypervisor.
+
+  Note that for the Xen hypervisor, the KVM daemon should never run.
+
+  """
+  AssertCommand(["gnt-cluster", "modify", "--user-shutdown=true"])
+
+  # Give time for kvmd to start and stop on all nodes
+  time.sleep(5)
+
+  for node in nodes:
+    AssertCommand("pgrep ganeti-kvmd", node=node, fail=True)
+
+  AssertCommand(["gnt-cluster", "modify", "--user-shutdown=false"])
+
+  for node in nodes:
+    AssertCommand("pgrep ganeti-kvmd", node=node, fail=True)
+
+
+def _TestClusterModifyUserShutdownKvm(nodes):
+  """Tests user shutdown cluster wide for the KVM hypervisor.
+
+  Note that for the KVM hypervisor, the KVM daemon should run
+  according to '--user-shutdown' and whether the node is VM capable.
+
+  """
+  # How much time to wait for kvmd to start/stop
+  kvmd_cycle_time = 4
+
+  # Start kvmd on all nodes
+  AssertCommand(["gnt-cluster", "modify", "--user-shutdown=true"])
+  time.sleep(kvmd_cycle_time)
+  for node in nodes:
+    AssertCommand("pgrep ganeti-kvmd", node=node)
+
+  # Test VM capable node attribute
+  test_node = None
+
+  for node in nodes:
+    node_info = qa_utils.GetObjectInfo(["gnt-node", "info", node.primary])[0]
+    if "vm_capable" in node_info and node_info["vm_capable"]:
+      test_node = node
+      break
+
+  if test_node is None:
+    raise qa_error.Error("Failed to find viable node for this test")
+
+  # Stop kvmd by disabling vm capable
+  AssertCommand(["gnt-node", "modify", "--vm-capable=no", test_node.primary])
+  time.sleep(kvmd_cycle_time)
+  AssertCommand("pgrep ganeti-kvmd", node=test_node, fail=True)
+
+  # Start kvmd by enabling vm capable
+  AssertCommand(["gnt-node", "modify", "--vm-capable=yes", test_node.primary])
+  time.sleep(kvmd_cycle_time)
+  AssertCommand("pgrep ganeti-kvmd", node=test_node)
+
+  # Stop kvmd on all nodes by removing KVM from the enabled hypervisors
+  enabled_hypervisors = qa_config.GetEnabledHypervisors()
+
+  AssertCommand(["gnt-cluster", "modify", "--enabled-hypervisors=xen-pvm"])
+  time.sleep(kvmd_cycle_time)
+  for node in nodes:
+    AssertCommand("pgrep ganeti-kvmd", node=node, fail=True)
+
+  # Start kvmd on all nodes by restoring KVM to the enabled hypervisors
+  AssertCommand(["gnt-cluster", "modify",
+                 "--enabled-hypervisors=%s" % ",".join(enabled_hypervisors)])
+  time.sleep(kvmd_cycle_time)
+  for node in nodes:
+    AssertCommand("pgrep ganeti-kvmd", node=node)
+
+  # Stop kvmd on all nodes
+  AssertCommand(["gnt-cluster", "modify", "--user-shutdown=false"])
+  time.sleep(kvmd_cycle_time)
+  for node in nodes:
+    AssertCommand("pgrep ganeti-kvmd", node=node, fail=True)
+
+
+def TestClusterModifyUserShutdown():
+  """Tests user shutdown cluster wide.
+
+  """
+  enabled_hypervisors = qa_config.GetEnabledHypervisors()
+  nodes = qa_config.get("nodes")
+
+  for (hv, fn) in [(constants.HT_XEN_PVM, _TestClusterModifyUserShutdownXen),
+                   (constants.HT_XEN_HVM, _TestClusterModifyUserShutdownXen),
+                   (constants.HT_KVM, _TestClusterModifyUserShutdownKvm)]:
+    if hv in enabled_hypervisors:
+      qa_daemon.TestPauseWatcher()
+      fn(nodes)
+      qa_daemon.TestResumeWatcher()
+    else:
+      print "%s hypervisor is not enabled, skipping test for this hypervisor" \
+          % hv
+
+
 def TestClusterInfo():
   """gnt-cluster info"""
   AssertCommand(["gnt-cluster", "info"])
diff --git a/qa/qa_instance.py b/qa/qa_instance.py
index e2456db..7859825 100644
--- a/qa/qa_instance.py
+++ b/qa/qa_instance.py
@@ -1241,6 +1241,7 @@ def _TestInstanceUserDownKvm(instance):
     AssertCommand("pkill -f \"\\-name %s\"" % instance.name, node=primary)
     time.sleep(5)
 
+  AssertCommand(["gnt-cluster", "modify", "--user-shutdown=true"])
   AssertCommand(["gnt-instance", "modify", "-H", "user_shutdown=true",
                  instance.name])
 
@@ -1252,6 +1253,7 @@ def _TestInstanceUserDownKvm(instance):
 
   primary = _GetInstanceField(instance.name, "pnode")
   _TestInstanceUserDown(instance, _StopKVMInstance)
+  AssertCommand(["gnt-cluster", "modify", "--user-shutdown=false"])
 
 
 def TestInstanceUserDown(instance):
-- 
2.0.0.526.g5318336

Reply via email to