From e3a1947435c0a630e476f00de6e22575a8e9d8a4 Mon Sep 17 00:00:00 2001 From: Iustin Pop Date: Mon, 8 Aug 2011 11:34:41 +0200 Subject: [PATCH] Allow fixing of split instances via relocate Currently, the IAllocator code requests strictly that the (set of) groups of the nodes we're relocating from is equal to the set of groups we're relocating to. This, however, makes is impossible to fix split instances, since (by definition) the secondary of a split instance is not in the same group as the primary node, and after the fixing is it the same. The patch changes the test from group equality to check that the final group set (across both primary and secondary nodes) is a subset of the initial group set (again across both nodes). This means we can't "extend" the group of nodes but keeping the same or decreasing it is allowed. After this patch, one can finally fix (automatically) split instances via a gnt-instance replace-disks. Signed-off-by: Iustin Pop Reviewed-by: Michael Hanselmann --- lib/cmdlib.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 277a2aa..d02021d 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -13188,10 +13188,11 @@ class IAllocator(object): fn = compat.partial(self._NodesToGroups, node2group, self.in_data["nodegroups"]) - request_groups = fn(self.relocate_from) - result_groups = fn(rdict["result"]) + instance = self.cfg.GetInstanceInfo(self.name) + request_groups = fn(self.relocate_from + [instance.primary_node]) + result_groups = fn(rdict["result"] + [instance.primary_node]) - if self.success and result_groups != request_groups: + if self.success and not set(result_groups).issubset(request_groups): raise errors.OpExecError("Groups of nodes returned by iallocator (%s)" " differ from original groups (%s)" % (utils.CommaJoin(result_groups), -- 1.7.10.4