Revision 153d9724 lib/bdev.py

b/lib/bdev.py
701 701
    return self.Shutdown()
702 702

  
703 703

  
704
  def AddChild(self, device):
705
    """Add a new member to the md raid1.
704
  def AddChildren(self, devices):
705
    """Add new member(s) to the md raid1.
706 706

  
707 707
    """
708 708
    if self.minor is None and not self.Attach():
709 709
      raise errors.BlockDeviceError("Can't attach to device")
710
    if device.dev_path is None:
711
      raise errors.BlockDeviceError("New child is not initialised")
712
    result = utils.RunCmd(["mdadm", "-a", self.dev_path, device.dev_path])
710

  
711
    args = ["mdadm", "-a", self.dev_path]
712
    for dev in devices:
713
      if dev.dev_path is None:
714
        raise errors.BlockDeviceError("Child '%s' is not initialised" % dev)
715
      dev.Open()
716
      args.append(dev.dev_path)
717
    result = utils.RunCmd(args)
713 718
    if result.failed:
714 719
      raise errors.BlockDeviceError("Failed to add new device to array: %s" %
715 720
                                    result.output)
716
    new_len = len(self._children) + 1
721
    new_len = len(self._children) + len(devices)
717 722
    result = utils.RunCmd(["mdadm", "--grow", self.dev_path, "-n", new_len])
718 723
    if result.failed:
719 724
      raise errors.BlockDeviceError("Can't grow md array: %s" %
720 725
                                    result.output)
721
    self._children.append(device)
726
    self._children.extend(devices)
722 727

  
723 728

  
724
  def RemoveChild(self, dev_path):
725
    """Remove member from the md raid1.
729
  def RemoveChildren(self, devices):
730
    """Remove member(s) from the md raid1.
726 731

  
727 732
    """
728 733
    if self.minor is None and not self.Attach():
729 734
      raise errors.BlockDeviceError("Can't attach to device")
730
    if len(self._children) == 1:
731
      raise errors.BlockDeviceError("Can't reduce member when only one"
732
                                    " child left")
733
    for device in self._children:
734
      if device.dev_path == dev_path:
735
        break
736
    else:
737
      raise errors.BlockDeviceError("Can't find child with this path")
738
    new_len = len(self._children) - 1
739
    result = utils.RunCmd(["mdadm", "-f", self.dev_path, dev_path])
735
    new_len = len(self._children) - len(devices)
736
    if new_len < 1:
737
      raise errors.BlockDeviceError("Can't reduce to less than one child")
738
    args = ["mdadm", "-f", self.dev_path]
739
    orig_devs = []
740
    for dev in devices:
741
      args.append(dev.dev_path)
742
      for c in self._children:
743
        if c.dev_path == dev.dev_path:
744
          orig_devs.append(c)
745
          break
746
      else:
747
        raise errors.BlockDeviceError("Can't find device '%s' for removal" %
748
                                      dev)
749
    result = utils.RunCmd(args)
740 750
    if result.failed:
741
      raise errors.BlockDeviceError("Failed to mark device as failed: %s" %
751
      raise errors.BlockDeviceError("Failed to mark device(s) as failed: %s" %
742 752
                                    result.output)
743 753

  
744 754
    # it seems here we need a short delay for MD to update its
745 755
    # superblocks
746 756
    time.sleep(0.5)
747
    result = utils.RunCmd(["mdadm", "-r", self.dev_path, dev_path])
757
    args[1] = "-r"
758
    result = utils.RunCmd(args)
748 759
    if result.failed:
749
      raise errors.BlockDeviceError("Failed to remove device from array:"
750
                                        " %s" % result.output)
760
      raise errors.BlockDeviceError("Failed to remove device(s) from array:"
761
                                    " %s" % result.output)
751 762
    result = utils.RunCmd(["mdadm", "--grow", "--force", self.dev_path,
752 763
                           "-n", new_len])
753 764
    if result.failed:
754 765
      raise errors.BlockDeviceError("Can't shrink md array: %s" %
755 766
                                    result.output)
756
    self._children.remove(device)
767
    for dev in orig_devs:
768
      self._children.remove(dev)
757 769

  
758 770

  
759 771
  def GetStatus(self):

Also available in: Unified diff