X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/7d88f2550f325a60619b5b8f0c9dbfb55265a949..c668ead96f3cd8af73bee2a413839f3944eddcca:/qa/ganeti-qa.py?ds=sidebyside diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py index f99b58c..4d6c99e 100755 --- a/qa/ganeti-qa.py +++ b/qa/ganeti-qa.py @@ -1,7 +1,7 @@ #!/usr/bin/python -u # -# Copyright (C) 2007, 2008, 2009, 2010 Google Inc. +# Copyright (C) 2007, 2008, 2009, 2010, 2011 Google Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -23,6 +23,9 @@ """ +# pylint: disable=C0103 +# due to invalid name + import sys import datetime import optparse @@ -31,6 +34,7 @@ import qa_cluster import qa_config import qa_daemon import qa_env +import qa_group import qa_instance import qa_node import qa_os @@ -40,8 +44,9 @@ import qa_utils from ganeti import utils from ganeti import rapi +from ganeti import constants -import ganeti.rapi.client +import ganeti.rapi.client # pylint: disable=W0611 def _FormatHeader(line, end=72): @@ -49,7 +54,7 @@ def _FormatHeader(line, end=72): """ line = "---- " + line + " " - line += "-" * (end-len(line)) + line += "-" * (end - len(line)) line = line.rstrip() return line @@ -65,6 +70,7 @@ def _DescriptionOf(fn): return desc.rstrip(".") + def RunTest(fn, *args): """Runs a test after printing a header. @@ -120,6 +126,11 @@ def SetupCluster(rapi_user, rapi_secret): """ RunTestIf("create-cluster", qa_cluster.TestClusterInit, rapi_user, rapi_secret) + + # Test on empty cluster + RunTestIf("node-list", qa_node.TestNodeList) + RunTestIf("instance-list", qa_instance.TestInstanceList) + RunTestIf("create-cluster", qa_node.TestNodeAddAll) if not qa_config.TestEnabled("create-cluster"): # consider the nodes are already there @@ -130,6 +141,12 @@ def SetupCluster(rapi_user, rapi_secret): # enable the watcher (unconditionally) RunTest(qa_daemon.TestResumeWatcher) + RunTestIf("node-list", qa_node.TestNodeList) + + # Test listing fields + RunTestIf("node-list", qa_node.TestNodeListFields) + RunTestIf("instance-list", qa_instance.TestInstanceListFields) + RunTestIf("node-info", qa_node.TestNodeInfo) @@ -138,38 +155,65 @@ def RunClusterTests(): """ for test, fn in [ + ("create-cluster", qa_cluster.TestClusterInitDisk), ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto), ("cluster-verify", qa_cluster.TestClusterVerify), ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs), # TODO: add more cluster modify tests ("cluster-modify", qa_cluster.TestClusterModifyBe), + ("cluster-modify", qa_cluster.TestClusterModifyDisk), ("cluster-rename", qa_cluster.TestClusterRename), ("cluster-info", qa_cluster.TestClusterVersion), ("cluster-info", qa_cluster.TestClusterInfo), ("cluster-info", qa_cluster.TestClusterGetmaster), + ("cluster-redist-conf", qa_cluster.TestClusterRedistConf), ("cluster-copyfile", qa_cluster.TestClusterCopyfile), ("cluster-command", qa_cluster.TestClusterCommand), ("cluster-burnin", qa_cluster.TestClusterBurnin), ("cluster-master-failover", qa_cluster.TestClusterMasterFailover), + ("cluster-master-failover", + qa_cluster.TestClusterMasterFailoverWithDrainedQueue), + ("cluster-oob", qa_cluster.TestClusterOob), ("rapi", qa_rapi.TestVersion), ("rapi", qa_rapi.TestEmptyCluster), + ("rapi", qa_rapi.TestRapiQuery), ]: RunTestIf(test, fn) +def RunRepairDiskSizes(): + """Run the repair disk-sizes test. + + """ + RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes) + + def RunOsTests(): """Runs all tests related to gnt-os. """ + if qa_config.TestEnabled("rapi"): + rapi_getos = qa_rapi.GetOperatingSystems + else: + rapi_getos = None + for fn in [ qa_os.TestOsList, qa_os.TestOsDiagnose, + ]: + RunTestIf("os", fn) + + for fn in [ qa_os.TestOsValid, qa_os.TestOsInvalid, qa_os.TestOsPartiallyValid, + ]: + RunTestIf("os", fn, rapi_getos) + + for fn in [ qa_os.TestOsModifyValid, qa_os.TestOsModifyInvalid, - qa_os.TestOsStates, + qa_os.TestOsStatesNonExisting, ]: RunTestIf("os", fn) @@ -179,8 +223,16 @@ def RunCommonInstanceTests(instance): """ RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance) + RunTestIf(["instance-shutdown", "instance-console", "rapi"], + qa_rapi.TestRapiStoppedInstanceConsole, instance) RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance) + # Test shutdown/start via RAPI + RunTestIf(["instance-shutdown", "rapi"], + qa_rapi.TestRapiInstanceShutdown, instance) + RunTestIf(["instance-shutdown", "rapi"], + qa_rapi.TestRapiInstanceStartup, instance) + RunTestIf("instance-list", qa_instance.TestInstanceList) RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance) @@ -190,28 +242,44 @@ def RunCommonInstanceTests(instance): qa_rapi.TestRapiInstanceModify, instance) RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance) + RunTestIf(["instance-console", "rapi"], + qa_rapi.TestRapiInstanceConsole, instance) RunTestIf("instance-reinstall", qa_instance.TestInstanceShutdown, instance) RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance) + RunTestIf(["instance-reinstall", "rapi"], + qa_rapi.TestRapiInstanceReinstall, instance) RunTestIf("instance-reinstall", qa_instance.TestInstanceStartup, instance) RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance) - if qa_config.TestEnabled('instance-rename'): + if qa_config.TestEnabled("instance-rename"): + rename_source = instance["name"] rename_target = qa_config.get("rename", None) - if rename_target is None: - print qa_utils.FormatError("Can rename instance, 'rename' entry is" - " missing from configuration") - else: - RunTest(qa_instance.TestInstanceShutdown, instance) - RunTest(qa_instance.TestInstanceRename, instance, rename_target) - RunTestIf("rapi", qa_rapi.TestRapiInstanceRename, instance, rename_target) - RunTest(qa_instance.TestInstanceStartup, instance) + RunTest(qa_instance.TestInstanceShutdown, instance) + # perform instance rename to the same name + RunTest(qa_instance.TestInstanceRename, rename_source, rename_source) + RunTestIf("rapi", qa_rapi.TestRapiInstanceRename, + rename_source, rename_source) + if rename_target is not None: + # perform instance rename to a different name, if we have one configured + RunTest(qa_instance.TestInstanceRename, rename_source, rename_target) + RunTest(qa_instance.TestInstanceRename, rename_target, rename_source) + RunTestIf("rapi", qa_rapi.TestRapiInstanceRename, + rename_source, rename_target) + RunTestIf("rapi", qa_rapi.TestRapiInstanceRename, + rename_target, rename_source) + RunTest(qa_instance.TestInstanceStartup, instance) RunTestIf("tags", qa_tags.TestInstanceTags, instance) + RunTestIf("cluster-verify", qa_cluster.TestClusterVerify) + RunTestIf("rapi", qa_rapi.TestInstance, instance) + # Lists instances, too + RunTestIf("node-list", qa_node.TestNodeList) + def RunCommonNodeTests(): """Run a few common node tests. @@ -219,6 +287,27 @@ def RunCommonNodeTests(): """ RunTestIf("node-volumes", qa_node.TestNodeVolumes) RunTestIf("node-storage", qa_node.TestNodeStorage) + RunTestIf("node-oob", qa_node.TestOutOfBand) + + +def RunGroupListTests(): + """Run tests for listing node groups. + + """ + RunTestIf("group-list", qa_group.TestGroupList) + RunTestIf("group-list", qa_group.TestGroupListFields) + + +def RunGroupRwTests(): + """Run tests for adding/removing/renaming groups. + + """ + RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename) + RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions) + RunTestIf("group-rwops", qa_group.TestGroupModify) + RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups) + RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags, + qa_group.GetDefaultGroup()) def RunExportImportTests(instance, pnode, snode): @@ -229,7 +318,7 @@ def RunExportImportTests(instance, pnode, snode): otherwise None """ - if qa_config.TestEnabled('instance-export'): + if qa_config.TestEnabled("instance-export"): RunTest(qa_instance.TestInstanceExportNoTarget, instance) expnode = qa_config.AcquireNode(exclude=pnode) @@ -238,7 +327,7 @@ def RunExportImportTests(instance, pnode, snode): RunTest(qa_instance.TestBackupList, expnode) - if qa_config.TestEnabled('instance-import'): + if qa_config.TestEnabled("instance-import"): newinst = qa_config.AcquireInstance() try: RunTest(qa_instance.TestInstanceImport, pnode, newinst, @@ -266,16 +355,16 @@ def RunExportImportTests(instance, pnode, snode): qa_config.ReleaseInstance(newinst) -def RunDaemonTests(instance, pnode): +def RunDaemonTests(instance): """Test the ganeti-watcher script. """ RunTest(qa_daemon.TestPauseWatcher) RunTestIf("instance-automatic-restart", - qa_daemon.TestInstanceAutomaticRestart, pnode, instance) + qa_daemon.TestInstanceAutomaticRestart, instance) RunTestIf("instance-consecutive-failures", - qa_daemon.TestInstanceConsecutiveFailures, pnode, instance) + qa_daemon.TestInstanceConsecutiveFailures, instance) RunTest(qa_daemon.TestResumeWatcher) @@ -285,14 +374,17 @@ def RunHardwareFailureTests(instance, pnode, snode): """ RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance) + RunTestIf(["instance-failover", "rapi"], + qa_rapi.TestRapiInstanceFailover, instance) RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance) RunTestIf(["instance-migrate", "rapi"], qa_rapi.TestRapiInstanceMigrate, instance) - if qa_config.TestEnabled('instance-replace-disks'): + if qa_config.TestEnabled("instance-replace-disks"): othernode = qa_config.AcquireNode(exclude=[pnode, snode]) try: + RunTestIf("rapi", qa_rapi.TestRapiInstanceReplaceDisks, instance) RunTest(qa_instance.TestReplaceDisks, instance, pnode, snode, othernode) finally: @@ -309,30 +401,10 @@ def RunHardwareFailureTests(instance, pnode, snode): pnode, snode) -@rapi.client.UsesRapiClient -def main(): - """Main program. +def RunQa(): + """Main QA body. """ - parser = optparse.OptionParser(usage="%prog [options] ") - parser.add_option('--yes-do-it', dest='yes_do_it', - action="store_true", - help="Really execute the tests") - (qa_config.options, args) = parser.parse_args() - - if len(args) == 1: - (config_file, ) = args - else: - parser.error("Wrong number of arguments.") - - if not qa_config.options.yes_do_it: - print ("Executing this script irreversibly destroys any Ganeti\n" - "configuration on all nodes involved. If you really want\n" - "to start testing, supply the --yes-do-it option.") - sys.exit(1) - - qa_config.Load(config_file) - rapi_user = "ganeti-qa" rapi_secret = utils.GenerateSecret() @@ -348,11 +420,14 @@ def main(): RunTestIf("tags", qa_tags.TestClusterTags) RunCommonNodeTests() + RunGroupListTests() + RunGroupRwTests() pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode()) try: RunTestIf("node-readd", qa_node.TestNodeReadd, pnode) RunTestIf("node-modify", qa_node.TestNodeModify, pnode) + RunTestIf("delay", qa_cluster.TestDelay, pnode) finally: qa_config.ReleaseNode(pnode) @@ -371,16 +446,19 @@ def main(): RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client) del rapi_instance - if qa_config.TestEnabled('instance-add-plain-disk'): + if qa_config.TestEnabled("instance-add-plain-disk"): instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode) RunCommonInstanceTests(instance) + RunGroupListTests() + RunTestIf("cluster-epo", qa_cluster.TestClusterEpo) RunExportImportTests(instance, pnode, None) - RunDaemonTests(instance, pnode) + RunDaemonTests(instance) + RunRepairDiskSizes() RunTest(qa_instance.TestInstanceRemove, instance) del instance multinode_tests = [ - ('instance-add-drbd-disk', + ("instance-add-drbd-disk", qa_instance.TestInstanceAddWithDrbdDisk), ] @@ -389,14 +467,18 @@ def main(): snode = qa_config.AcquireNode(exclude=pnode) try: instance = RunTest(func, pnode, snode) - RunTestIf("cluster-verify", qa_cluster.TestClusterVerify) RunCommonInstanceTests(instance) - if qa_config.TestEnabled('instance-convert-disk'): + RunGroupListTests() + RunTest(qa_group.TestAssignNodesIncludingSplit, + constants.INITIAL_NODE_GROUP_NAME, + pnode["primary"], snode["primary"]) + if qa_config.TestEnabled("instance-convert-disk"): RunTest(qa_instance.TestInstanceShutdown, instance) RunTest(qa_instance.TestInstanceConvertDisk, instance, snode) RunTest(qa_instance.TestInstanceStartup, instance) RunExportImportTests(instance, pnode, snode) RunHardwareFailureTests(instance, pnode, snode) + RunRepairDiskSizes() RunTest(qa_instance.TestInstanceRemove, instance) del instance finally: @@ -425,5 +507,35 @@ def main(): RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy) -if __name__ == '__main__': +@rapi.client.UsesRapiClient +def main(): + """Main program. + + """ + parser = optparse.OptionParser(usage="%prog [options] ") + parser.add_option("--yes-do-it", dest="yes_do_it", + action="store_true", + help="Really execute the tests") + (qa_config.options, args) = parser.parse_args() + + if len(args) == 1: + (config_file, ) = args + else: + parser.error("Wrong number of arguments.") + + if not qa_config.options.yes_do_it: + print ("Executing this script irreversibly destroys any Ganeti\n" + "configuration on all nodes involved. If you really want\n" + "to start testing, supply the --yes-do-it option.") + sys.exit(1) + + qa_config.Load(config_file) + + qa_utils.StartMultiplexer(qa_config.GetMasterNode()["primary"]) + try: + RunQa() + finally: + qa_utils.CloseMultiplexers() + +if __name__ == "__main__": main()