Commit 701384a9 authored by Iustin Pop's avatar Iustin Pop
Browse files

Abstract node free disk space check



Both create instance and grow disk check the free disk space on nodes
using the same, duplicate code. Since we'll need this in other places in
the future, we abstract the check into a new function.

The patch adjusts the error message to be more in-line with the one for
memory checking, and fixes the exception raised for RPC errors.
Signed-off-by: default avatarIustin Pop <iustin@google.com>
Reviewed-by: default avatarMichael Hanselmann <hansmi@google.com>
parent 5d55819e
......@@ -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.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment