Revision b6135bbc lib/cmdlib.py

b/lib/cmdlib.py
6661 6661
                                                         disk_index)),
6662 6662
                              mode=disk["mode"])
6663 6663
      disks.append(disk_dev)
6664
  elif template_name == constants.DT_BLOCK:
6665
    if len(secondary_nodes) != 0:
6666
      raise errors.ProgrammerError("Wrong template configuration")
6667

  
6668
    for idx, disk in enumerate(disk_info):
6669
      disk_index = idx + base_index
6670
      disk_dev = objects.Disk(dev_type=constants.LD_BLOCKDEV, size=disk["size"],
6671
                              logical_id=(constants.BLOCKDEV_DRIVER_MANUAL,
6672
                                          disk["adopt"]),
6673
                              iv_name="disk/%d" % disk_index,
6674
                              mode=disk["mode"])
6675
      disks.append(disk_dev)
6676

  
6664 6677
  else:
6665 6678
    raise errors.ProgrammerError("Invalid disk template '%s'" % template_name)
6666 6679
  return disks
......
6887 6900
    constants.DT_DRBD8: sum(d["size"] + 128 for d in disks),
6888 6901
    constants.DT_FILE: None,
6889 6902
    constants.DT_SHARED_FILE: 0,
6903
    constants.DT_BLOCK: 0,
6890 6904
  }
6891 6905

  
6892 6906
  if disk_template not in req_size_dict:
......
7022 7036
      if self.op.mode == constants.INSTANCE_IMPORT:
7023 7037
        raise errors.OpPrereqError("Disk adoption not allowed for"
7024 7038
                                   " instance import", errors.ECODE_INVAL)
7039
    else:
7040
      if self.op.disk_template in constants.DTS_MUST_ADOPT:
7041
        raise errors.OpPrereqError("Disk template %s requires disk adoption,"
7042
                                   " but no 'adopt' parameter given" %
7043
                                   self.op.disk_template,
7044
                                   errors.ECODE_INVAL)
7025 7045

  
7026 7046
    self.adopt_disks = has_adopt
7027 7047

  
......
7614 7634
      req_sizes = _ComputeDiskSizePerVG(self.op.disk_template, self.disks)
7615 7635
      _CheckNodesFreeDiskPerVG(self, nodenames, req_sizes)
7616 7636

  
7617
    else: # instead, we must check the adoption data
7637
    elif self.op.disk_template == constants.DT_PLAIN: # Check the adoption data
7618 7638
      all_lvs = set([i["vg"] + "/" + i["adopt"] for i in self.disks])
7619 7639
      if len(all_lvs) != len(self.disks):
7620 7640
        raise errors.OpPrereqError("Duplicate volume names given for adoption",
......
7650 7670
      for dsk in self.disks:
7651 7671
        dsk["size"] = int(float(node_lvs[dsk["vg"] + "/" + dsk["adopt"]][0]))
7652 7672

  
7673
    elif self.op.disk_template == constants.DT_BLOCK:
7674
      # Normalize and de-duplicate device paths
7675
      all_disks = set([os.path.abspath(i["adopt"]) for i in self.disks])
7676
      if len(all_disks) != len(self.disks):
7677
        raise errors.OpPrereqError("Duplicate disk names given for adoption",
7678
                                   errors.ECODE_INVAL)
7679
      baddisks = [d for d in all_disks
7680
                  if not d.startswith(constants.ADOPTABLE_BLOCKDEV_ROOT)]
7681
      if baddisks:
7682
        raise errors.OpPrereqError("Device node(s) %s lie outside %s and"
7683
                                   " cannot be adopted" %
7684
                                   (", ".join(baddisks),
7685
                                    constants.ADOPTABLE_BLOCKDEV_ROOT),
7686
                                   errors.ECODE_INVAL)
7687

  
7688
      node_disks = self.rpc.call_bdev_sizes([pnode.name],
7689
                                            list(all_disks))[pnode.name]
7690
      node_disks.Raise("Cannot get block device information from node %s" %
7691
                       pnode.name)
7692
      node_disks = node_disks.payload
7693
      delta = all_disks.difference(node_disks.keys())
7694
      if delta:
7695
        raise errors.OpPrereqError("Missing block device(s): %s" %
7696
                                   utils.CommaJoin(delta),
7697
                                   errors.ECODE_INVAL)
7698
      for dsk in self.disks:
7699
        dsk["size"] = int(float(node_disks[dsk["adopt"]]))
7700

  
7653 7701
    _CheckHVParams(self, nodenames, self.op.hypervisor, self.op.hvparams)
7654 7702

  
7655 7703
    _CheckNodeHasOS(self, pnode.name, self.op.os_type, self.op.force_variant)
......
7721 7769
                            )
7722 7770

  
7723 7771
    if self.adopt_disks:
7724
      # rename LVs to the newly-generated names; we need to construct
7725
      # 'fake' LV disks with the old data, plus the new unique_id
7726
      tmp_disks = [objects.Disk.FromDict(v.ToDict()) for v in disks]
7727
      rename_to = []
7728
      for t_dsk, a_dsk in zip (tmp_disks, self.disks):
7729
        rename_to.append(t_dsk.logical_id)
7730
        t_dsk.logical_id = (t_dsk.logical_id[0], a_dsk["adopt"])
7731
        self.cfg.SetDiskID(t_dsk, pnode_name)
7732
      result = self.rpc.call_blockdev_rename(pnode_name,
7733
                                             zip(tmp_disks, rename_to))
7734
      result.Raise("Failed to rename adoped LVs")
7772
      if self.op.disk_template == constants.DT_PLAIN:
7773
        # rename LVs to the newly-generated names; we need to construct
7774
        # 'fake' LV disks with the old data, plus the new unique_id
7775
        tmp_disks = [objects.Disk.FromDict(v.ToDict()) for v in disks]
7776
        rename_to = []
7777
        for t_dsk, a_dsk in zip (tmp_disks, self.disks):
7778
          rename_to.append(t_dsk.logical_id)
7779
          t_dsk.logical_id = (t_dsk.logical_id[0], a_dsk["adopt"])
7780
          self.cfg.SetDiskID(t_dsk, pnode_name)
7781
        result = self.rpc.call_blockdev_rename(pnode_name,
7782
                                               zip(tmp_disks, rename_to))
7783
        result.Raise("Failed to rename adoped LVs")
7735 7784
    else:
7736 7785
      feedback_fn("* creating instance disks...")
7737 7786
      try:

Also available in: Unified diff