11585 |
11585 |
env = {
|
11586 |
11586 |
"DISK": self.op.disk,
|
11587 |
11587 |
"AMOUNT": self.op.amount,
|
|
11588 |
"ABSOLUTE": self.op.absolute,
|
11588 |
11589 |
}
|
11589 |
11590 |
env.update(_BuildInstanceHookEnvByObject(self, self.instance))
|
11590 |
11591 |
return env
|
... | ... | |
11617 |
11618 |
|
11618 |
11619 |
self.disk = instance.FindDisk(self.op.disk)
|
11619 |
11620 |
|
|
11621 |
if self.op.absolute:
|
|
11622 |
self.target = self.op.amount
|
|
11623 |
self.delta = self.target - self.disk.size
|
|
11624 |
if self.delta < 0:
|
|
11625 |
raise errors.OpPrereqError("Requested size (%s) is smaller than "
|
|
11626 |
"current disk size (%s)" %
|
|
11627 |
(utils.FormatUnit(self.target, "h"),
|
|
11628 |
utils.FormatUnit(self.disk.size, "h")),
|
|
11629 |
errors.ECODE_STATE)
|
|
11630 |
else:
|
|
11631 |
self.delta = self.op.amount
|
|
11632 |
self.target = self.disk.size + self.delta
|
|
11633 |
if self.delta < 0:
|
|
11634 |
raise errors.OpPrereqError("Requested increment (%s) is negative" %
|
|
11635 |
utils.FormatUnit(self.delta, "h"),
|
|
11636 |
errors.ECODE_INVAL)
|
|
11637 |
|
11620 |
11638 |
if instance.disk_template not in (constants.DT_FILE,
|
11621 |
11639 |
constants.DT_SHARED_FILE,
|
11622 |
11640 |
constants.DT_RBD):
|
11623 |
11641 |
# TODO: check the free disk space for file, when that feature will be
|
11624 |
11642 |
# supported
|
11625 |
11643 |
_CheckNodesFreeDiskPerVG(self, nodenames,
|
11626 |
|
self.disk.ComputeGrowth(self.op.amount))
|
|
11644 |
self.disk.ComputeGrowth(self.delta))
|
11627 |
11645 |
|
11628 |
11646 |
def Exec(self, feedback_fn):
|
11629 |
11647 |
"""Execute disk grow.
|
... | ... | |
11640 |
11658 |
if not disks_ok:
|
11641 |
11659 |
raise errors.OpExecError("Cannot activate block device to grow")
|
11642 |
11660 |
|
11643 |
|
feedback_fn("Growing disk %s of instance '%s' by %s" %
|
|
11661 |
feedback_fn("Growing disk %s of instance '%s' by %s to %s" %
|
11644 |
11662 |
(self.op.disk, instance.name,
|
11645 |
|
utils.FormatUnit(self.op.amount, "h")))
|
|
11663 |
utils.FormatUnit(self.delta, "h"),
|
|
11664 |
utils.FormatUnit(self.target, "h")))
|
11646 |
11665 |
|
11647 |
11666 |
# First run all grow ops in dry-run mode
|
11648 |
11667 |
for node in instance.all_nodes:
|
11649 |
11668 |
self.cfg.SetDiskID(disk, node)
|
11650 |
|
result = self.rpc.call_blockdev_grow(node, disk, self.op.amount, True)
|
|
11669 |
result = self.rpc.call_blockdev_grow(node, disk, self.delta, True)
|
11651 |
11670 |
result.Raise("Grow request failed to node %s" % node)
|
11652 |
11671 |
|
11653 |
11672 |
# We know that (as far as we can test) operations across different
|
11654 |
11673 |
# nodes will succeed, time to run it for real
|
11655 |
11674 |
for node in instance.all_nodes:
|
11656 |
11675 |
self.cfg.SetDiskID(disk, node)
|
11657 |
|
result = self.rpc.call_blockdev_grow(node, disk, self.op.amount, False)
|
|
11676 |
result = self.rpc.call_blockdev_grow(node, disk, self.delta, False)
|
11658 |
11677 |
result.Raise("Grow request failed to node %s" % node)
|
11659 |
11678 |
|
11660 |
11679 |
# TODO: Rewrite code to work properly
|
... | ... | |
11664 |
11683 |
# time is a work-around.
|
11665 |
11684 |
time.sleep(5)
|
11666 |
11685 |
|
11667 |
|
disk.RecordGrow(self.op.amount)
|
|
11686 |
disk.RecordGrow(self.delta)
|
11668 |
11687 |
self.cfg.Update(instance, feedback_fn)
|
11669 |
11688 |
|
11670 |
11689 |
# Changes have been recorded, release node lock
|