From b6dd40f59821b4e3e686f3c30f35be4e41a1a84d Mon Sep 17 00:00:00 2001 From: Apollon Oikonomopoulos <apollon@noc.grnet.gr> Date: Thu, 8 Jul 2010 15:03:58 +0300 Subject: [PATCH] Add _CheckIAllocatorOrNode for common iallocator/node checks _CheckIAllocatorOrNode will be called by LUs wishing to use an instance allocator or a target node. It performs sanity checks and will modify the LU's opcode's iallocator slot to use the cluster-wide allocator if appropriate. Signed-off-by: Apollon Oikonomopoulos <apollon@noc.grnet.gr> Signed-off-by: Iustin Pop <iustin@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/cmdlib.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 550d5b941..d29c2b52f 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -1143,6 +1143,38 @@ def _FindFaultyInstanceDisks(cfg, rpc, instance, node_name, prereq): return faulty +def _CheckIAllocatorOrNode(lu, iallocator_slot, node_slot): + """Check the sanity of iallocator and node arguments and use the + cluster-wide iallocator if appropriate. + + Check that at most one of (iallocator, node) is specified. If none is + specified, then the LU's opcode's iallocator slot is filled with the + cluster-wide default iallocator. + + @type iallocator_slot: string + @param iallocator_slot: the name of the opcode iallocator slot + @type node_slot: string + @param node_slot: the name of the opcode target node slot + + """ + node = getattr(lu.op, node_slot, None) + iallocator = getattr(lu.op, iallocator_slot, None) + + if node is not None and iallocator is not None: + raise errors.OpPrereqError("Do not specify both, iallocator and node.", + errors.ECODE_INVAL) + elif node is None and iallocator is None: + default_iallocator = lu.cfg.GetDefaultIAllocator() + if default_iallocator: + setattr(lu.op, iallocator_slot, default_iallocator) + else: + raise errors.OpPrereqError("No iallocator or node given and no" + " cluster-wide default iallocator found." + " Please specify either an iallocator or a" + " node, or set a cluster-wide default" + " iallocator.") + + class LUPostInitCluster(LogicalUnit): """Logical unit for running hooks after cluster initialization. -- GitLab