Revision 002f91c5 lib/cmdlib.py

b/lib/cmdlib.py
8678 8678
  return drbd_dev
8679 8679

  
8680 8680

  
8681
_DISK_TEMPLATE_NAME_PREFIX = {
8682
  constants.DT_PLAIN: "",
8683
  constants.DT_RBD: ".rbd",
8684
  }
8685

  
8686

  
8687
_DISK_TEMPLATE_DEVICE_TYPE = {
8688
  constants.DT_PLAIN: constants.LD_LV,
8689
  constants.DT_FILE: constants.LD_FILE,
8690
  constants.DT_SHARED_FILE: constants.LD_FILE,
8691
  constants.DT_BLOCK: constants.LD_BLOCKDEV,
8692
  constants.DT_RBD: constants.LD_RBD,
8693
  }
8694

  
8695

  
8681 8696
def _GenerateDiskTemplate(lu, template_name, instance_name, primary_node,
8682 8697
    secondary_nodes, disk_info, file_storage_dir, file_driver, base_index,
8683 8698
    feedback_fn, disk_params,
......
8692 8707
  disk_count = len(disk_info)
8693 8708
  disks = []
8694 8709
  ld_params = _ComputeLDParams(template_name, disk_params)
8710

  
8695 8711
  if template_name == constants.DT_DISKLESS:
8696 8712
    pass
8697
  elif template_name == constants.DT_PLAIN:
8698
    if secondary_nodes:
8699
      raise errors.ProgrammerError("Wrong template configuration")
8700

  
8701
    names = _GenerateUniqueNames(lu, [".disk%d" % (base_index + i)
8702
                                      for i in range(disk_count)])
8703
    for idx, disk in enumerate(disk_info):
8704
      disk_index = idx + base_index
8705
      vg = disk.get(constants.IDISK_VG, vgname)
8706
      feedback_fn("* disk %i, vg %s, name %s" % (idx, vg, names[idx]))
8707
      disk_dev = objects.Disk(dev_type=constants.LD_LV,
8708
                              size=disk[constants.IDISK_SIZE],
8709
                              logical_id=(vg, names[idx]),
8710
                              iv_name="disk/%d" % disk_index,
8711
                              mode=disk[constants.IDISK_MODE],
8712
                              params=ld_params[0])
8713
      disks.append(disk_dev)
8714 8713
  elif template_name == constants.DT_DRBD8:
8715 8714
    drbd_params, data_params, meta_params = ld_params
8716 8715
    if len(secondary_nodes) != 1:
......
8738 8737
                                      drbd_params, data_params, meta_params)
8739 8738
      disk_dev.mode = disk[constants.IDISK_MODE]
8740 8739
      disks.append(disk_dev)
8741
  elif template_name == constants.DT_FILE:
8742
    if secondary_nodes:
8743
      raise errors.ProgrammerError("Wrong template configuration")
8744

  
8745
    _req_file_storage()
8746

  
8747
    for idx, disk in enumerate(disk_info):
8748
      disk_index = idx + base_index
8749
      disk_dev = objects.Disk(dev_type=constants.LD_FILE,
8750
                              size=disk[constants.IDISK_SIZE],
8751
                              iv_name="disk/%d" % disk_index,
8752
                              logical_id=(file_driver,
8753
                                          "%s/disk%d" % (file_storage_dir,
8754
                                                         disk_index)),
8755
                              mode=disk[constants.IDISK_MODE],
8756
                              params=ld_params[0])
8757
      disks.append(disk_dev)
8758
  elif template_name == constants.DT_SHARED_FILE:
8759
    if secondary_nodes:
8760
      raise errors.ProgrammerError("Wrong template configuration")
8761

  
8762
    _req_shr_file_storage()
8763

  
8764
    for idx, disk in enumerate(disk_info):
8765
      disk_index = idx + base_index
8766
      disk_dev = objects.Disk(dev_type=constants.LD_FILE,
8767
                              size=disk[constants.IDISK_SIZE],
8768
                              iv_name="disk/%d" % disk_index,
8769
                              logical_id=(file_driver,
8770
                                          "%s/disk%d" % (file_storage_dir,
8771
                                                         disk_index)),
8772
                              mode=disk[constants.IDISK_MODE],
8773
                              params=ld_params[0])
8774
      disks.append(disk_dev)
8775
  elif template_name == constants.DT_BLOCK:
8740
  else:
8776 8741
    if secondary_nodes:
8777 8742
      raise errors.ProgrammerError("Wrong template configuration")
8778 8743

  
8779
    for idx, disk in enumerate(disk_info):
8780
      disk_index = idx + base_index
8781
      disk_dev = objects.Disk(dev_type=constants.LD_BLOCKDEV,
8782
                              size=disk[constants.IDISK_SIZE],
8783
                              logical_id=(constants.BLOCKDEV_DRIVER_MANUAL,
8784
                                          disk[constants.IDISK_ADOPT]),
8785
                              iv_name="disk/%d" % disk_index,
8786
                              mode=disk[constants.IDISK_MODE],
8787
                              params=ld_params[0])
8788
      disks.append(disk_dev)
8789
  elif template_name == constants.DT_RBD:
8790
    if secondary_nodes:
8791
      raise errors.ProgrammerError("Wrong template configuration")
8744
    if template_name == constants.DT_FILE:
8745
      _req_file_storage()
8746
    elif template_name == constants.DT_SHARED_FILE:
8747
      _req_shr_file_storage()
8792 8748

  
8793
    names = _GenerateUniqueNames(lu, [".rbd.disk%d" % (base_index + i)
8794
                                      for i in range(disk_count)])
8749
    name_prefix = _DISK_TEMPLATE_NAME_PREFIX.get(template_name, None)
8750
    if name_prefix is None:
8751
      names = None
8752
    else:
8753
      names = _GenerateUniqueNames(lu, ["%s.disk%s" %
8754
                                        (name_prefix, base_index + i)
8755
                                        for i in range(disk_count)])
8756

  
8757
    dev_type = _DISK_TEMPLATE_DEVICE_TYPE[template_name]
8758

  
8759
    if template_name == constants.DT_PLAIN:
8760
      def logical_id_fn(idx, _, disk):
8761
        vg = disk.get(constants.IDISK_VG, vgname)
8762
        return (vg, names[idx])
8763
    elif template_name in (constants.DT_FILE, constants.DT_SHARED_FILE):
8764
      logical_id_fn = \
8765
        lambda _, disk_index, disk: (file_driver,
8766
                                     "%s/disk%d" % (file_storage_dir,
8767
                                                    disk_index))
8768
    elif template_name == constants.DT_BLOCK:
8769
      logical_id_fn = \
8770
        lambda idx, disk_index, disk: (constants.BLOCKDEV_DRIVER_MANUAL,
8771
                                       disk[constants.IDISK_ADOPT])
8772
    elif template_name == constants.DT_RBD:
8773
      logical_id_fn = lambda idx, _, disk: ("rbd", names[idx])
8774
    else:
8775
      raise errors.ProgrammerError("Unknown disk template '%s'" % template_name)
8795 8776

  
8796 8777
    for idx, disk in enumerate(disk_info):
8797 8778
      disk_index = idx + base_index
8798
      disk_dev = objects.Disk(dev_type=constants.LD_RBD,
8799
                              size=disk[constants.IDISK_SIZE],
8800
                              logical_id=("rbd", names[idx]),
8801
                              iv_name="disk/%d" % disk_index,
8802
                              mode=disk[constants.IDISK_MODE],
8803
                              params=ld_params[0])
8804
      disks.append(disk_dev)
8779
      size = disk[constants.IDISK_SIZE]
8780
      feedback_fn("* disk %s, size %s" %
8781
                  (disk_index, utils.FormatUnit(size, "h")))
8782
      disks.append(objects.Disk(dev_type=dev_type, size=size,
8783
                                logical_id=logical_id_fn(idx, disk_index, disk),
8784
                                iv_name="disk/%d" % disk_index,
8785
                                mode=disk[constants.IDISK_MODE],
8786
                                params=ld_params[0]))
8805 8787

  
8806
  else:
8807
    raise errors.ProgrammerError("Invalid disk template '%s'" % template_name)
8808 8788
  return disks
8809 8789

  
8810 8790

  

Also available in: Unified diff