from ganeti import utils
from ganeti import constants
from ganeti import query
+from ganeti import pathutils
import qa_config
import qa_utils
AssertCommand(["lvremove", "-f"] + vols, node=node)
+def _GetBoolInstanceField(instance, field):
+ """Get the Boolean value of a field of an instance.
+
+ @type instance: string
+ @param instance: Instance name
+ @type field: string
+ @param field: Name of the field
+
+ """
+ master = qa_config.GetMasterNode()
+ infocmd = utils.ShellQuoteArgs(["gnt-instance", "list", "--no-headers",
+ "-o", field, instance])
+ info_out = qa_utils.GetCommandOutput(master["primary"], infocmd).strip()
+ if info_out == "Y":
+ return True
+ elif info_out == "N":
+ return False
+ else:
+ raise qa_error.Error("Field %s of instance %s has a non-Boolean value:"
+ " %s" % (field, instance, info_out))
+
+
@InstanceCheck(None, INST_UP, RETURN_VALUE)
def TestInstanceAddWithPlainDisk(node):
"""gnt-instance add -t plain"""
"""
master = qa_config.GetMasterNode()
- cmd = ["cat", utils.PathJoin(constants.DATA_DIR,
+ cmd = ["cat", utils.PathJoin(pathutils.DATA_DIR,
"ssconf_%s" % constants.SS_INSTANCE_LIST)]
return qa_utils.GetCommandOutput(master["primary"],
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
-def TestInstanceMigrate(instance):
+def TestInstanceMigrate(instance, toggle_always_failover=True):
"""gnt-instance migrate"""
cmd = ["gnt-instance", "migrate", "--force", instance["name"]]
+ af_par = constants.BE_ALWAYS_FAILOVER
+ af_field = "be/" + constants.BE_ALWAYS_FAILOVER
+ af_init_val = _GetBoolInstanceField(instance["name"], af_field)
# migrate ...
AssertCommand(cmd)
+ # TODO: Verify the choice between failover and migration
qa_utils.RunInstanceCheck(instance, True)
- # ... and back
+ # ... and back (possibly with always_failover toggled)
+ if toggle_always_failover:
+ AssertCommand(["gnt-instance", "modify", "-B",
+ ("%s=%s" % (af_par, not af_init_val)),
+ instance["name"]])
AssertCommand(cmd)
+ # TODO: Verify the choice between failover and migration
+ qa_utils.RunInstanceCheck(instance, True)
+ if toggle_always_failover:
+ AssertCommand(["gnt-instance", "modify", "-B",
+ ("%s=%s" % (af_par, af_init_val)), instance["name"]])
# TODO: Split into multiple tests
AssertCommand(["gnt-instance", "shutdown", instance["name"]])
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)
+ # @InstanceCheck enforces the check that the instance is running
def TestInstanceInfo(instance):
@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
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],
["-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"]])
AssertCommand(["gnt-instance", "stop", instance["name"]])
AssertCommand(buildcmd(["-a"]), fail=True)
AssertCommand(["gnt-instance", "activate-disks", instance["name"]])
+ AssertCommand(["gnt-instance", "activate-disks", "--wait-for-sync",
+ instance["name"]])
AssertCommand(buildcmd(["-a"]))
AssertCommand(["gnt-instance", "start", instance["name"]])
if not fail and check:
# Quick check that the disks are there
AssertCommand(["gnt-instance", "activate-disks", instance["name"]])
+ AssertCommand(["gnt-instance", "activate-disks", "--wait-for-sync",
+ instance["name"]])
AssertCommand(["gnt-instance", "deactivate-disks", instance["name"]])
+
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
def TestRecreateDisks(instance, pnode, snode, othernodes):
"""gnt-instance recreate-disks
orig_seq = pnode["primary"]
if snode:
orig_seq = orig_seq + ":" + snode["primary"]
- # This fails beacuse the instance is running
+ # These fail because the instance is running
_AssertRecreateDisks(["-n", other_seq], instance, fail=True, destroy=False)
+ _AssertRecreateDisks(["-I", "hail"], instance, fail=True, destroy=False)
AssertCommand(["gnt-instance", "stop", instance["name"]])
# Disks exist: this should fail
_AssertRecreateDisks([], instance, fail=True, destroy=False)
# Recreate disks in place
_AssertRecreateDisks([], instance)
# Move disks away
- _AssertRecreateDisks(["-n", other_seq], instance)
+ _AssertRecreateDisks(["-I", "hail"], instance)
# Move disks back
_AssertRecreateDisks(["-n", orig_seq], instance, check=False)
# This and InstanceCheck decoration check that the disks are working
"--disk-template=plain",
"--no-ip-check",
"--src-node=%s" % expnode["primary"],
- "--src-dir=%s/%s" % (constants.EXPORT_DIR, name),
+ "--src-dir=%s/%s" % (pathutils.EXPORT_DIR, name),
"--node=%s" % node["primary"]] +
_GetGenericAddParameters(newinst, force_mac=constants.VALUE_GENERATE))
cmd.append(newinst["name"])