X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/0fdf247d0395039ed064c724e8d7632296d92628..5cdbde9a01909768c1ef36393f6c3fc3fc1f16cf:/qa/qa_instance.py diff --git a/qa/qa_instance.py b/qa/qa_instance.py index 9834c75..0ea9f2b 100644 --- a/qa/qa_instance.py +++ b/qa/qa_instance.py @@ -35,13 +35,14 @@ 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): return "/sys/block/%s/device/state" % disk -def _GetGenericAddParameters(): +def _GetGenericAddParameters(inst, force_mac=None): params = ["-B"] params.append("%s=%s,%s=%s" % (constants.BE_MINMEM, qa_config.get(constants.BE_MINMEM), @@ -49,6 +50,15 @@ def _GetGenericAddParameters(): qa_config.get(constants.BE_MAXMEM))) for idx, size in enumerate(qa_config.get("disk")): params.extend(["--disk", "%s:size=%s" % (idx, size)]) + + # Set static MAC address if configured + if force_mac: + nic0_mac = force_mac + else: + nic0_mac = qa_config.GetInstanceNicMac(inst) + if nic0_mac: + params.extend(["--net", "0:mac=%s" % nic0_mac]) + return params @@ -59,7 +69,7 @@ def _DiskTest(node, disk_template): "--os-type=%s" % qa_config.get("os"), "--disk-template=%s" % disk_template, "--node=%s" % node] + - _GetGenericAddParameters()) + _GetGenericAddParameters(instance)) cmd.append(instance["name"]) AssertCommand(cmd) @@ -72,17 +82,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 +103,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 +125,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 +135,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 +165,7 @@ def _CheckSsconfInstanceList(instance): _ReadSsconfInstanceList()) +@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG) def TestInstanceRenameAndBack(rename_source, rename_target): """gnt-instance rename @@ -155,6 +174,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 +183,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, False) + # 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,8 +256,11 @@ def TestInstanceInfo(instance): AssertCommand(["gnt-instance", "info", instance["name"]]) +@InstanceCheck(INST_UP, INST_UP, FIRST_ARG) def TestInstanceModify(instance): """gnt-instance modify""" + default_hv = qa_config.GetDefaultHypervisor() + # Assume /sbin/init exists on all systems test_kernel = "/sbin/init" test_initrd = test_kernel @@ -221,6 +268,7 @@ def TestInstanceModify(instance): orig_maxmem = qa_config.get(constants.BE_MAXMEM) orig_minmem = qa_config.get(constants.BE_MINMEM) #orig_bridge = qa_config.get("bridge", "xen-br0") + args = [ ["-B", "%s=128" % constants.BE_MINMEM], ["-B", "%s=128" % constants.BE_MAXMEM], @@ -234,18 +282,24 @@ def TestInstanceModify(instance): ["-H", "%s=%s" % (constants.HV_KERNEL_PATH, test_kernel)], ["-H", "%s=%s" % (constants.HV_KERNEL_PATH, constants.VALUE_DEFAULT)], - ["-H", "%s=%s" % (constants.HV_INITRD_PATH, test_initrd)], - ["-H", "no_%s" % (constants.HV_INITRD_PATH, )], - ["-H", "%s=%s" % (constants.HV_INITRD_PATH, constants.VALUE_DEFAULT)], # TODO: bridge tests #["--bridge", "xen-br1"], #["--bridge", orig_bridge], - - # TODO: Do these tests only with xen-hvm - #["-H", "%s=acn" % constants.HV_BOOT_ORDER], - #["-H", "%s=%s" % (constants.HV_BOOT_ORDER, constants.VALUE_DEFAULT)], ] + + if default_hv == constants.HT_XEN_PVM: + args.extend([ + ["-H", "%s=%s" % (constants.HV_INITRD_PATH, test_initrd)], + ["-H", "no_%s" % (constants.HV_INITRD_PATH, )], + ["-H", "%s=%s" % (constants.HV_INITRD_PATH, constants.VALUE_DEFAULT)], + ]) + elif default_hv == constants.HT_XEN_HVM: + args.extend([ + ["-H", "%s=acn" % constants.HV_BOOT_ORDER], + ["-H", "%s=%s" % (constants.HV_BOOT_ORDER, constants.VALUE_DEFAULT)], + ]) + for alist in args: AssertCommand(["gnt-instance", "modify"] + alist + [instance["name"]]) @@ -257,6 +311,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 +326,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 +335,29 @@ 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"] + all_size = qa_config.get("disk") + all_grow = qa_config.get("disk-growth") + if not all_grow: + # missing disk sizes but instance grow disk has been enabled, + # let's set fixed/nomimal growth + all_grow = ["128M" for _ in all_size] + for idx, (size, grow) in enumerate(zip(all_size, all_grow)): + # succeed in grow by amount + AssertCommand(["gnt-instance", "grow-disk", name, str(idx), grow]) + # fail in grow to the old size + AssertCommand(["gnt-instance", "grow-disk", "--absolute", name, str(idx), + size], fail=True) + # succeed to grow to old size + 2 * growth + int_size = utils.ParseUnit(size) + int_grow = utils.ParseUnit(grow) + AssertCommand(["gnt-instance", "grow-disk", "--absolute", name, str(idx), + str(int_size + 2 * int_grow)]) + + def TestInstanceList(): """gnt-instance list""" qa_utils.GenericQueryTest("gnt-instance", query.INSTANCE_FIELDS.keys()) @@ -289,11 +368,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 @@ -322,6 +403,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"] @@ -329,27 +411,29 @@ def TestInstanceExport(instance, node): return qa_utils.ResolveInstanceName(name) +@InstanceCheck(None, INST_DOWN, 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_DOWN, FIRST_ARG) +def TestInstanceImport(newinst, node, expnode, name): """gnt-backup import""" cmd = (["gnt-backup", "import", "--disk-template=plain", "--no-ip-check", - "--net", "0:mac=generate", "--src-node=%s" % expnode["primary"], "--src-dir=%s/%s" % (constants.EXPORT_DIR, name), "--node=%s" % node["primary"]] + - _GetGenericAddParameters()) + _GetGenericAddParameters(newinst, force_mac=constants.VALUE_GENERATE)) cmd.append(newinst["name"]) AssertCommand(cmd) @@ -438,7 +522,7 @@ def _TestInstanceDiskFailure(instance, node, node2, onmaster): AssertCommand(" && ".join(cmds), node=[node2, node][int(onmaster)]) print qa_utils.FormatInfo("Write to disks and give some time to notice" - " to notice the problem") + " the problem") cmds = [] for disk in devpath: cmds.append(sq(["dd", "count=1", "bs=512", "conv=notrunc",