+ # Remove instances
+ qa_instance.TestInstanceRemove(instance2)
+ qa_instance.TestInstanceRemove(instance1)
+ finally:
+ instance2.Release()
+ finally:
+ instance1.Release()
+
+ if qa_config.TestEnabled("instance-add-drbd-disk"):
+ snode = qa_config.AcquireNode()
+ try:
+ qa_cluster.TestSetExclStorCluster(False)
+ instance = qa_instance.TestInstanceAddWithDrbdDisk([node, snode])
+ try:
+ qa_cluster.TestSetExclStorCluster(True)
+ exp_err = [constants.CV_EINSTANCEUNSUITABLENODE]
+ qa_cluster.AssertClusterVerify(fail=True, errors=exp_err)
+ qa_instance.TestInstanceRemove(instance)
+ finally:
+ instance.Release()
+ finally:
+ snode.Release()
+ qa_cluster.TestSetExclStorCluster(old_es)
+ finally:
+ node.Release()
+
+
+def _BuildSpecDict(par, mn, st, mx):
+ return {par: {"min": mn, "std": st, "max": mx}}
+
+
+def TestIPolicyPlainInstance():
+ """Test instance policy interaction with instances"""
+ params = ["mem-size", "cpu-count", "disk-count", "disk-size", "nic-count"]
+ if not qa_config.IsTemplateSupported(constants.DT_PLAIN):
+ print "Template %s not supported" % constants.DT_PLAIN
+ return
+
+ # This test assumes that the group policy is empty
+ (_, old_specs) = qa_cluster.TestClusterSetISpecs({})
+ node = qa_config.AcquireNode()
+ try:
+ # Log of policy changes, list of tuples: (change, policy_violated)
+ history = []
+ instance = qa_instance.TestInstanceAddWithPlainDisk([node])
+ try:
+ policyerror = [constants.CV_EINSTANCEPOLICY]
+ for par in params:
+ qa_cluster.AssertClusterVerify()
+ (iminval, imaxval) = qa_instance.GetInstanceSpec(instance.name, par)
+ # Some specs must be multiple of 4
+ new_spec = _BuildSpecDict(par, imaxval + 4, imaxval + 4, imaxval + 4)
+ history.append((new_spec, True))
+ qa_cluster.TestClusterSetISpecs(new_spec)
+ qa_cluster.AssertClusterVerify(warnings=policyerror)
+ if iminval > 0:
+ # Some specs must be multiple of 4
+ if iminval >= 4:
+ upper = iminval - 4
+ else:
+ upper = iminval - 1
+ new_spec = _BuildSpecDict(par, 0, upper, upper)
+ history.append((new_spec, True))
+ qa_cluster.TestClusterSetISpecs(new_spec)
+ qa_cluster.AssertClusterVerify(warnings=policyerror)
+ qa_cluster.TestClusterSetISpecs(old_specs)
+ history.append((old_specs, False))
+ qa_instance.TestInstanceRemove(instance)
+ finally:
+ instance.Release()
+
+ # Now we replay the same policy changes, and we expect that the instance
+ # cannot be created for the cases where we had a policy violation above
+ for (change, failed) in history:
+ qa_cluster.TestClusterSetISpecs(change)
+ if failed:
+ qa_instance.TestInstanceAddWithPlainDisk([node], fail=True)
+ # Instance creation with no policy violation has been tested already
+ finally:
+ node.Release()
+
+
+def RunInstanceTests():
+ """Create and exercise instances."""
+ instance_tests = [
+ ("instance-add-plain-disk", constants.DT_PLAIN,
+ qa_instance.TestInstanceAddWithPlainDisk, 1),
+ ("instance-add-drbd-disk", constants.DT_DRBD8,
+ qa_instance.TestInstanceAddWithDrbdDisk, 2),
+ ("instance-add-diskless", constants.DT_DISKLESS,
+ qa_instance.TestInstanceAddDiskless, 1),
+ ("instance-add-file", constants.DT_FILE,
+ qa_instance.TestInstanceAddFile, 1),
+ ]
+
+ for (test_name, templ, create_fun, num_nodes) in instance_tests:
+ if (qa_config.TestEnabled(test_name) and
+ qa_config.IsTemplateSupported(templ)):
+ inodes = qa_config.AcquireManyNodes(num_nodes)
+ try:
+ instance = RunTest(create_fun, inodes)
+ try:
+ RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
+ RunDaemonTests(instance)
+ for node in inodes:
+ RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, node)
+ if len(inodes) > 1:
+ RunTestIf("group-rwops", qa_group.TestAssignNodesIncludingSplit,
+ constants.INITIAL_NODE_GROUP_NAME,
+ inodes[0].primary, inodes[1].primary)
+ if qa_config.TestEnabled("instance-convert-disk"):
+ RunTest(qa_instance.TestInstanceShutdown, instance)
+ RunTest(qa_instance.TestInstanceConvertDiskToPlain,
+ instance, inodes)
+ RunTest(qa_instance.TestInstanceStartup, instance)
+ RunCommonInstanceTests(instance)
+ if qa_config.TestEnabled("instance-modify-primary"):
+ othernode = qa_config.AcquireNode()
+ RunTest(qa_instance.TestInstanceModifyPrimaryAndBack,
+ instance, inodes[0], othernode)
+ othernode.Release()
+ RunGroupListTests()
+ RunExportImportTests(instance, inodes)
+ RunHardwareFailureTests(instance, inodes)
+ RunRepairDiskSizes()
+ RunTest(qa_instance.TestInstanceRemove, instance)
+ finally:
+ instance.Release()
+ del instance
+ finally:
+ qa_config.ReleaseManyNodes(inodes)
+ qa_cluster.AssertClusterVerify()
+
+
+def RunQa():
+ """Main QA body.