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