From 5fa0375e4a0b0bcb2a264b40885578d85e194ed6 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Thu, 10 May 2012 11:54:47 +0200 Subject: [PATCH] QA: Decorate tests with instance checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Start using βInstanceCheckβ decorator where appropriate. Use direct call for check in places where the instance status changes during the test. The parameters of βTestInstanceImportβ had to be re-ordered to have the instance as the first argument. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- qa/ganeti-qa.py | 2 +- qa/qa_instance.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++- qa/qa_rapi.py | 21 +++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py index ddf11fc93..d10376be2 100755 --- a/qa/ganeti-qa.py +++ b/qa/ganeti-qa.py @@ -354,7 +354,7 @@ def RunExportImportTests(instance, pnode, snode): if qa_config.TestEnabled("instance-import"): newinst = qa_config.AcquireInstance() try: - RunTest(qa_instance.TestInstanceImport, pnode, newinst, + RunTest(qa_instance.TestInstanceImport, newinst, pnode, expnode, name) RunTest(qa_instance.TestInstanceRemove, newinst) finally: diff --git a/qa/qa_instance.py b/qa/qa_instance.py index 2d0843a25..6ad89c9af 100644 --- a/qa/qa_instance.py +++ b/qa/qa_instance.py @@ -35,6 +35,7 @@ import qa_utils import qa_error from qa_utils import AssertIn, AssertCommand, AssertEqual +from qa_utils import InstanceCheck, INST_DOWN, INST_UP, FIRST_ARG, RETURN_VALUE def _GetDiskStatePath(disk): @@ -72,17 +73,20 @@ def _DiskTest(node, disk_template): raise +@InstanceCheck(None, INST_UP, RETURN_VALUE) def TestInstanceAddWithPlainDisk(node): """gnt-instance add -t plain""" return _DiskTest(node["primary"], "plain") +@InstanceCheck(None, INST_UP, RETURN_VALUE) def TestInstanceAddWithDrbdDisk(node, node2): """gnt-instance add -t drbd""" return _DiskTest("%s:%s" % (node["primary"], node2["primary"]), "drbd") +@InstanceCheck(None, INST_DOWN, FIRST_ARG) def TestInstanceRemove(instance): """gnt-instance remove""" AssertCommand(["gnt-instance", "remove", "-f", instance["name"]]) @@ -90,16 +94,19 @@ def TestInstanceRemove(instance): qa_config.ReleaseInstance(instance) +@InstanceCheck(INST_DOWN, INST_UP, FIRST_ARG) def TestInstanceStartup(instance): """gnt-instance startup""" AssertCommand(["gnt-instance", "startup", instance["name"]]) +@InstanceCheck(INST_UP, INST_DOWN, FIRST_ARG) def TestInstanceShutdown(instance): """gnt-instance shutdown""" AssertCommand(["gnt-instance", "shutdown", instance["name"]]) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceReboot(instance): """gnt-instance reboot""" options = qa_config.get("options", {}) @@ -109,6 +116,7 @@ def TestInstanceReboot(instance): AssertCommand(["gnt-instance", "reboot", "--type=%s" % rtype, name]) AssertCommand(["gnt-instance", "shutdown", name]) + qa_utils.RunInstanceCheck(instance, False) AssertCommand(["gnt-instance", "reboot", name]) master = qa_config.GetMasterNode() @@ -118,6 +126,7 @@ def TestInstanceReboot(instance): AssertEqual(result_output.strip(), constants.INSTST_RUNNING) +@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG) def TestInstanceReinstall(instance): """gnt-instance reinstall""" AssertCommand(["gnt-instance", "reinstall", "-f", instance["name"]]) @@ -147,6 +156,7 @@ def _CheckSsconfInstanceList(instance): _ReadSsconfInstanceList()) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceRenameAndBack(rename_source, rename_target): """gnt-instance rename @@ -155,6 +165,7 @@ def TestInstanceRenameAndBack(rename_source, rename_target): """ _CheckSsconfInstanceList(rename_source) + # first do a rename to a different actual name, expecting it to fail qa_utils.AddToEtcHosts(["meeeeh-not-exists", rename_target]) try: @@ -163,48 +174,72 @@ def TestInstanceRenameAndBack(rename_source, rename_target): _CheckSsconfInstanceList(rename_source) finally: qa_utils.RemoveFromEtcHosts(["meeeeh-not-exists", rename_target]) + # and now rename instance to rename_target... AssertCommand(["gnt-instance", "rename", rename_source, rename_target]) _CheckSsconfInstanceList(rename_target) + qa_utils.RunInstanceCheck(rename_source, False) + qa_utils.RunInstanceCheck(rename_target, True) + # and back AssertCommand(["gnt-instance", "rename", rename_target, rename_source]) _CheckSsconfInstanceList(rename_source) + qa_utils.RunInstanceCheck(rename_target, False) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceFailover(instance): """gnt-instance failover""" cmd = ["gnt-instance", "failover", "--force", instance["name"]] + # failover ... AssertCommand(cmd) + qa_utils.RunInstanceCheck(instance, True) + # ... and back AssertCommand(cmd) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceMigrate(instance): """gnt-instance migrate""" cmd = ["gnt-instance", "migrate", "--force", instance["name"]] + # migrate ... AssertCommand(cmd) + qa_utils.RunInstanceCheck(instance, True) + # ... and back AssertCommand(cmd) + + # TODO: Split into multiple tests AssertCommand(["gnt-instance", "shutdown", instance["name"]]) + qa_utils.RunInstanceCheck(instance, False) AssertCommand(cmd, fail=True) AssertCommand(["gnt-instance", "migrate", "--force", "--allow-failover", instance["name"]]) AssertCommand(["gnt-instance", "start", instance["name"]]) AssertCommand(cmd) + qa_utils.RunInstanceCheck(instance, True) + AssertCommand(["gnt-instance", "modify", "-B", ("%s=%s" % (constants.BE_ALWAYS_FAILOVER, constants.VALUE_TRUE)), instance["name"]]) + AssertCommand(cmd, fail=True) + qa_utils.RunInstanceCheck(instance, True) AssertCommand(["gnt-instance", "migrate", "--force", "--allow-failover", instance["name"]]) + + # TODO: Verify whether the default value is restored here (not hardcoded) AssertCommand(["gnt-instance", "modify", "-B", ("%s=%s" % (constants.BE_ALWAYS_FAILOVER, constants.VALUE_FALSE)), instance["name"]]) + AssertCommand(cmd) + qa_utils.RunInstanceCheck(instance, True) def TestInstanceInfo(instance): @@ -212,6 +247,7 @@ def TestInstanceInfo(instance): AssertCommand(["gnt-instance", "info", instance["name"]]) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceModify(instance): """gnt-instance modify""" # Assume /sbin/init exists on all systems @@ -257,6 +293,7 @@ def TestInstanceModify(instance): AssertCommand(["gnt-instance", "modify", arg, instance["name"]], fail=True) +@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG) def TestInstanceStoppedModify(instance): """gnt-instance modify (stopped instance)""" name = instance["name"] @@ -271,6 +308,7 @@ def TestInstanceStoppedModify(instance): AssertCommand(["gnt-instance", "modify", "--online", name]) +@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG) def TestInstanceConvertDisk(instance, snode): """gnt-instance modify -t""" name = instance["name"] @@ -279,6 +317,7 @@ def TestInstanceConvertDisk(instance, snode): "-n", snode["primary"], name]) +@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG) def TestInstanceGrowDisk(instance): """gnt-instance grow-disk""" name = instance["name"] @@ -311,11 +350,13 @@ def TestInstanceListFields(): qa_utils.GenericQueryFieldsTest("gnt-instance", query.INSTANCE_FIELDS.keys()) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceConsole(instance): """gnt-instance console""" AssertCommand(["gnt-instance", "console", "--show-cmd", instance["name"]]) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestReplaceDisks(instance, pnode, snode, othernode): """gnt-instance replace-disks""" # pylint: disable=W0613 @@ -344,6 +385,7 @@ def TestReplaceDisks(instance, pnode, snode, othernode): AssertCommand(["gnt-instance", "start", instance["name"]]) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceExport(instance, node): """gnt-backup export -n ...""" name = instance["name"] @@ -351,18 +393,21 @@ def TestInstanceExport(instance, node): return qa_utils.ResolveInstanceName(name) +@InstanceCheck(INST_UP, None, FIRST_ARG) def TestInstanceExportWithRemove(instance, node): """gnt-backup export --remove-instance""" AssertCommand(["gnt-backup", "export", "-n", node["primary"], "--remove-instance", instance["name"]]) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceExportNoTarget(instance): """gnt-backup export (without target node, should fail)""" AssertCommand(["gnt-backup", "export", instance["name"]], fail=True) -def TestInstanceImport(node, newinst, expnode, name): +@InstanceCheck(None, INST_UP, FIRST_ARG) +def TestInstanceImport(newinst, node, expnode, name): """gnt-backup import""" cmd = (["gnt-backup", "import", "--disk-template=plain", diff --git a/qa/qa_rapi.py b/qa/qa_rapi.py index a1e46d69f..c316640f6 100644 --- a/qa/qa_rapi.py +++ b/qa/qa_rapi.py @@ -44,6 +44,7 @@ import qa_utils import qa_error from qa_utils import (AssertEqual, AssertIn, AssertMatch, StartLocalCommand) +from qa_utils import InstanceCheck, INST_DOWN, INST_UP, FIRST_ARG _rapi_ca = None @@ -349,6 +350,7 @@ def TestRapiQuery(): ]) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstance(instance): """Testing getting instance(s) info via remote API. @@ -577,6 +579,7 @@ def TestRapiInstanceAdd(node, use_client): raise +@InstanceCheck(None, INST_DOWN, FIRST_ARG) def TestRapiInstanceRemove(instance, use_client): """Test removing instance via RAPI""" if use_client: @@ -591,32 +594,39 @@ def TestRapiInstanceRemove(instance, use_client): qa_config.ReleaseInstance(instance) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestRapiInstanceMigrate(instance): """Test migrating instance via RAPI""" # Move to secondary node _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"])) + qa_utils.RunInstanceCheck(instance, True) # And back to previous primary _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"])) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestRapiInstanceFailover(instance): """Test failing over instance via RAPI""" # Move to secondary node _WaitForRapiJob(_rapi_client.FailoverInstance(instance["name"])) + qa_utils.RunInstanceCheck(instance, True) # And back to previous primary _WaitForRapiJob(_rapi_client.FailoverInstance(instance["name"])) +@InstanceCheck(INST_UP, INST_DOWN, FIRST_ARG) def TestRapiInstanceShutdown(instance): """Test stopping an instance via RAPI""" _WaitForRapiJob(_rapi_client.ShutdownInstance(instance["name"])) +@InstanceCheck(INST_DOWN, INST_UP, FIRST_ARG) def TestRapiInstanceStartup(instance): """Test starting an instance via RAPI""" _WaitForRapiJob(_rapi_client.StartupInstance(instance["name"])) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestRapiInstanceRenameAndBack(rename_source, rename_target): """Test renaming instance via RAPI @@ -625,14 +635,19 @@ def TestRapiInstanceRenameAndBack(rename_source, rename_target): """ _WaitForRapiJob(_rapi_client.RenameInstance(rename_source, rename_target)) + qa_utils.RunInstanceCheck(rename_source, False) + qa_utils.RunInstanceCheck(rename_target, True) _WaitForRapiJob(_rapi_client.RenameInstance(rename_target, rename_source)) + qa_utils.RunInstanceCheck(rename_target, False) +@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG) def TestRapiInstanceReinstall(instance): """Test reinstalling an instance via RAPI""" _WaitForRapiJob(_rapi_client.ReinstallInstance(instance["name"])) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestRapiInstanceReplaceDisks(instance): """Test replacing instance disks via RAPI""" _WaitForRapiJob(_rapi_client.ReplaceInstanceDisks(instance["name"], @@ -641,6 +656,7 @@ def TestRapiInstanceReplaceDisks(instance): mode=constants.REPLACE_DISK_SEC, disks="0")) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestRapiInstanceModify(instance): """Test modifying instance via RAPI""" def _ModifyInstance(**kwargs): @@ -663,6 +679,7 @@ def TestRapiInstanceModify(instance): }) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestRapiInstanceConsole(instance): """Test getting instance console information via RAPI""" result = _rapi_client.GetInstanceConsole(instance["name"]) @@ -671,6 +688,7 @@ def TestRapiInstanceConsole(instance): AssertEqual(console.instance, qa_utils.ResolveInstanceName(instance["name"])) +@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG) def TestRapiStoppedInstanceConsole(instance): """Test getting stopped instance's console information via RAPI""" try: @@ -727,4 +745,7 @@ def TestInterClusterInstanceMove(src_instance, dest_instance, si, ] + qa_utils.RunInstanceCheck(di, False) AssertEqual(StartLocalCommand(cmd).wait(), 0) + qa_utils.RunInstanceCheck(si, False) + qa_utils.RunInstanceCheck(di, True) -- GitLab