From 342f9172c8bafe791c651978cdd4bdad2e2df21c Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Wed, 27 Apr 2011 16:42:56 +0200 Subject: [PATCH] iallocator: Relocation nodes must be in same group MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quoting from iallocator.rst: β[β¦] ``relocate`` request is used when an existing instance needs to be moved within its node group [β¦]β. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/cmdlib.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 57586f79a..f355a390d 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -11891,8 +11891,61 @@ class IAllocator(object): if not isinstance(rdict["result"], list): raise errors.OpExecError("Can't parse iallocator results: 'result' key" " is not a list") + + if self.mode == constants.IALLOCATOR_MODE_RELOC: + assert self.relocate_from is not None + assert self.required_nodes == 1 + + node2group = dict((name, ndata["group"]) + for (name, ndata) in self.in_data["nodes"].items()) + + fn = compat.partial(self._NodesToGroups, node2group, + self.in_data["nodegroups"]) + + request_groups = fn(self.relocate_from) + result_groups = fn(rdict["result"]) + + if result_groups != request_groups: + raise errors.OpExecError("Groups of nodes returned by iallocator (%s)" + " differ from original groups (%s)" % + (utils.CommaJoin(result_groups), + utils.CommaJoin(request_groups))) + self.out_data = rdict + @staticmethod + def _NodesToGroups(node2group, groups, nodes): + """Returns a list of unique group names for a list of nodes. + + @type node2group: dict + @param node2group: Map from node name to group UUID + @type groups: dict + @param groups: Group information + @type nodes: list + @param nodes: Node names + + """ + result = set() + + for node in nodes: + try: + group_uuid = node2group[node] + except KeyError: + # Ignore unknown node + pass + else: + try: + group = groups[group_uuid] + except KeyError: + # Can't find group, let's use UUID + group_name = group_uuid + else: + group_name = group["name"] + + result.add(group_name) + + return sorted(result) + class LUTestAllocator(NoHooksLU): """Run allocator tests. -- GitLab