X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/301312946db72b34eed29611026e22605bcbe6b2..5f3b040af2cfa210787776049737229a74059c1f:/qa/qa_group.py diff --git a/qa/qa_group.py b/qa/qa_group.py index 9671b02..e09c2f8 100644 --- a/qa/qa_group.py +++ b/qa/qa_group.py @@ -1,7 +1,7 @@ # # -# Copyright (C) 2010 Google Inc. +# Copyright (C) 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 @@ -19,15 +19,131 @@ # 02110-1301, USA. -from qa_utils import AssertCommand +"""QA tests for node groups. +""" -def TestGroupListDefaultFields(): +from ganeti import constants +from ganeti import query +from ganeti import utils + +import qa_config +import qa_utils + +from qa_utils import AssertCommand, AssertEqual, GetCommandOutput + + +def GetDefaultGroup(): + """Returns the default node group. + + """ + groups = qa_config.get("groups", {}) + return groups.get("group-with-nodes", constants.INITIAL_NODE_GROUP_NAME) + + +def TestGroupAddRemoveRename(): + """gnt-group add/remove/rename""" + groups = qa_config.get("groups", {}) + + existing_group_with_nodes = GetDefaultGroup() + + group1, group2, group3 = groups.get("inexistent-groups", + ["group1", "group2", "group3"])[:3] + + AssertCommand(["gnt-group", "add", group1]) + AssertCommand(["gnt-group", "add", group2]) + AssertCommand(["gnt-group", "add", group2], fail=True) + AssertCommand(["gnt-group", "add", existing_group_with_nodes], fail=True) + + AssertCommand(["gnt-group", "rename", group1, group2], fail=True) + AssertCommand(["gnt-group", "rename", group1, group3]) + + try: + AssertCommand(["gnt-group", "rename", existing_group_with_nodes, group1]) + + AssertCommand(["gnt-group", "remove", group2]) + AssertCommand(["gnt-group", "remove", group3]) + AssertCommand(["gnt-group", "remove", group1], fail=True) + finally: + # Try to ensure idempotency re groups that already existed. + AssertCommand(["gnt-group", "rename", group1, existing_group_with_nodes]) + + +def TestGroupAddWithOptions(): + """gnt-group add with options""" + groups = qa_config.get("groups", {}) + group1 = groups.get("inexistent-groups", ["group1"])[0] + + AssertCommand(["gnt-group", "add", "--alloc-policy", "notvalid", group1], + fail=True) + + AssertCommand(["gnt-group", "add", "--alloc-policy", "last_resort", + "--node-parameters", "oob_program=/bin/true", group1]) + + AssertCommand(["gnt-group", "remove", group1]) + + +def TestGroupModify(): + """gnt-group modify""" + groups = qa_config.get("groups", {}) + group1 = groups.get("inexistent-groups", ["group1"])[0] + + AssertCommand(["gnt-group", "add", group1]) + + try: + AssertCommand(["gnt-group", "modify", "--alloc-policy", "unallocable", + "--node-parameters", "oob_program=/bin/false", group1]) + AssertCommand(["gnt-group", "modify", + "--alloc-policy", "notvalid", group1], fail=True) + finally: + AssertCommand(["gnt-group", "remove", group1]) + + +def TestGroupList(): """gnt-group list""" - AssertCommand(["gnt-group", "list"]) + qa_utils.GenericQueryTest("gnt-group", query.GROUP_FIELDS.keys()) + + +def TestGroupListFields(): + """gnt-group list-fields""" + qa_utils.GenericQueryFieldsTest("gnt-group", query.GROUP_FIELDS.keys()) + + +def TestAssignNodesIncludingSplit(orig_group, node1, node2): + """gnt-group assign-nodes --force + + Expects node1 and node2 to be primary and secondary for a common instance. + + """ + assert node1 != node2 + groups = qa_config.get("groups", {}) + other_group = groups.get("inexistent-groups", ["group1"])[0] + + master_node = qa_config.GetMasterNode()["primary"] + + def AssertInGroup(group, nodes): + real_output = GetCommandOutput(master_node, + "gnt-node list --no-headers -o group " + + utils.ShellQuoteArgs(nodes)) + AssertEqual(real_output.splitlines(), [group] * len(nodes)) + + AssertInGroup(orig_group, [node1, node2]) + AssertCommand(["gnt-group", "add", other_group]) + + try: + AssertCommand(["gnt-group", "assign-nodes", other_group, node1, node2]) + AssertInGroup(other_group, [node1, node2]) + + # This should fail because moving node1 to orig_group would leave their + # common instance split between orig_group and other_group. + AssertCommand(["gnt-group", "assign-nodes", orig_group, node1], fail=True) + AssertInGroup(other_group, [node1, node2]) + AssertCommand(["gnt-group", "assign-nodes", "--force", orig_group, node1]) + AssertInGroup(orig_group, [node1]) + AssertInGroup(other_group, [node2]) -def TestGroupListAllFields(): - """gnt-group list -o FIELDS""" - AssertCommand(["gnt-group", "list", "-o", - "name,uuid,node_cnt,node_list,pinst_cnt,pinst_list"]) + AssertCommand(["gnt-group", "assign-nodes", orig_group, node2]) + AssertInGroup(orig_group, [node1, node2]) + finally: + AssertCommand(["gnt-group", "remove", other_group])