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