From ba147ff8fe1a6603263022e032511005e58a32ab Mon Sep 17 00:00:00 2001 From: Iustin Pop <iustin@google.com> Date: Fri, 19 Oct 2012 15:19:48 +0200 Subject: [PATCH] Fix disk adoption interaction with ipolicy checks In Ganeti 2.6, disk adoption is broken due to the ipolicy checks being done before we read volume size from remote nodes. We fix this by simply moving these checks to after the disk adoption code which updates the disk size; it's not that nice that we fail a (almost) config-level check after we've reserved the LVs, etc., but we need to do so in order to validate the ipolicy correctly. Tested: - normal instance creation - creation via adoption with good size (pass) - creation via adoption with wrong LV size (fail as expected) - QA in progress Signed-off-by: Iustin Pop <iustin@google.com> Reviewed-by: Michael Hanselmann <hansmi@google.com> --- lib/cmdlib.py | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 725c8ff94..fb7af1929 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -9917,26 +9917,6 @@ class LUInstanceCreate(LogicalUnit): nodenames = [pnode.name] + self.secondaries - # Verify instance specs - spindle_use = self.be_full.get(constants.BE_SPINDLE_USE, None) - ispec = { - constants.ISPEC_MEM_SIZE: self.be_full.get(constants.BE_MAXMEM, None), - constants.ISPEC_CPU_COUNT: self.be_full.get(constants.BE_VCPUS, None), - constants.ISPEC_DISK_COUNT: len(self.disks), - constants.ISPEC_DISK_SIZE: [disk["size"] for disk in self.disks], - constants.ISPEC_NIC_COUNT: len(self.nics), - constants.ISPEC_SPINDLE_USE: spindle_use, - } - - group_info = self.cfg.GetNodeGroup(pnode.group) - ipolicy = _CalculateGroupIPolicy(cluster, group_info) - res = _ComputeIPolicyInstanceSpecViolation(ipolicy, ispec) - if not self.op.ignore_ipolicy and res: - raise errors.OpPrereqError(("Instance allocation to group %s violates" - " policy: %s") % (pnode.group, - utils.CommaJoin(res)), - errors.ECODE_INVAL) - if not self.adopt_disks: if self.op.disk_template == constants.DT_RBD: # _CheckRADOSFreeSpace() is just a placeholder. @@ -10018,6 +9998,27 @@ class LUInstanceCreate(LogicalUnit): dsk[constants.IDISK_SIZE] = \ int(float(node_disks[dsk[constants.IDISK_ADOPT]])) + # Verify instance specs + spindle_use = self.be_full.get(constants.BE_SPINDLE_USE, None) + ispec = { + constants.ISPEC_MEM_SIZE: self.be_full.get(constants.BE_MAXMEM, None), + constants.ISPEC_CPU_COUNT: self.be_full.get(constants.BE_VCPUS, None), + constants.ISPEC_DISK_COUNT: len(self.disks), + constants.ISPEC_DISK_SIZE: [disk[constants.IDISK_SIZE] + for disk in self.disks], + constants.ISPEC_NIC_COUNT: len(self.nics), + constants.ISPEC_SPINDLE_USE: spindle_use, + } + + group_info = self.cfg.GetNodeGroup(pnode.group) + ipolicy = _CalculateGroupIPolicy(cluster, group_info) + res = _ComputeIPolicyInstanceSpecViolation(ipolicy, ispec) + if not self.op.ignore_ipolicy and res: + raise errors.OpPrereqError(("Instance allocation to group %s violates" + " policy: %s") % (pnode.group, + utils.CommaJoin(res)), + errors.ECODE_INVAL) + _CheckHVParams(self, nodenames, self.op.hypervisor, self.op.hvparams) _CheckNodeHasOS(self, pnode.name, self.op.os_type, self.op.force_variant) -- GitLab