Revision e7f99087 lib/cmdlib.py
b/lib/cmdlib.py | ||
---|---|---|
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 |
Also available in: Unified diff