diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 096c7b8db96cd79f20e1a9cede8a9e520ee5dd3e..7cb329766bddcb6d76f6f304401c893a5a2329aa 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -3801,6 +3801,42 @@ def _CheckNodeFreeMemory(lu, node, reason, requested, hypervisor_name): errors.ECODE_NORES) +def _CheckNodesFreeDisk(lu, nodenames, requested): + """Checks if nodes have enough free disk space in the default VG. + + This function check if all given nodes have the needed amount of + free disk. In case any node has less disk or we cannot get the + information from the node, this function raise an OpPrereqError + exception. + + @type lu: C{LogicalUnit} + @param lu: a logical unit from which we get configuration data + @type nodenames: C{list} + @param node: the list of node names to check + @type requested: C{int} + @param requested: the amount of disk in MiB to check for + @raise errors.OpPrereqError: if the node doesn't have enough disk, or + we cannot check the node + + """ + nodeinfo = lu.rpc.call_node_info(nodenames, lu.cfg.GetVGName(), + lu.cfg.GetHypervisorType()) + for node in nodenames: + info = nodeinfo[node] + info.Raise("Cannot get current information from node %s" % node, + prereq=True, ecode=errors.ECODE_ENVIRON) + vg_free = info.payload.get("vg_free", None) + if not isinstance(vg_free, int): + raise errors.OpPrereqError("Can't compute free disk space on node %s," + " result was '%s'" % (node, vg_free), + errors.ECODE_ENVIRON) + if requested > vg_free: + raise errors.OpPrereqError("Not enough disk space on target node %s:" + " required %d MiB, available %d MiB" % + (node, requested, vg_free), + errors.ECODE_NORES) + + class LUStartupInstance(LogicalUnit): """Starts an instance. @@ -6263,21 +6299,7 @@ class LUCreateInstance(LogicalUnit): # Check lv size requirements, if not adopting if req_size is not None and not self.adopt_disks: - nodeinfo = self.rpc.call_node_info(nodenames, self.cfg.GetVGName(), - self.op.hypervisor) - for node in nodenames: - info = nodeinfo[node] - info.Raise("Cannot get current information from node %s" % node) - info = info.payload - vg_free = info.get('vg_free', None) - if not isinstance(vg_free, int): - raise errors.OpPrereqError("Can't compute free disk space on" - " node %s" % node, errors.ECODE_ENVIRON) - if req_size > vg_free: - raise errors.OpPrereqError("Not enough disk space on target node %s." - " %d MB available, %d MB required" % - (node, vg_free, req_size), - errors.ECODE_NORES) + _CheckNodesFreeDisk(self, nodenames, req_size) if self.adopt_disks: # instead, we must check the adoption data all_lvs = set([i["adopt"] for i in self.disks]) @@ -7534,20 +7556,7 @@ class LUGrowDisk(LogicalUnit): self.disk = instance.FindDisk(self.op.disk) - nodeinfo = self.rpc.call_node_info(nodenames, self.cfg.GetVGName(), - instance.hypervisor) - for node in nodenames: - info = nodeinfo[node] - info.Raise("Cannot get current information from node %s" % node) - vg_free = info.payload.get('vg_free', None) - if not isinstance(vg_free, int): - raise errors.OpPrereqError("Can't compute free disk space on" - " node %s" % node, errors.ECODE_ENVIRON) - if self.op.amount > vg_free: - raise errors.OpPrereqError("Not enough disk space on target node %s:" - " %d MiB available, %d MiB required" % - (node, vg_free, self.op.amount), - errors.ECODE_NORES) + _CheckNodesFreeDisk(self, nodenames, self.op.amount) def Exec(self, feedback_fn): """Execute disk grow.