Revision 99ccf8b9 lib/cmdlib.py
b/lib/cmdlib.py | ||
---|---|---|
8645 | 8645 |
|
8646 | 8646 |
|
8647 | 8647 |
def _GenerateDRBD8Branch(lu, primary, secondary, size, vgnames, names, |
8648 |
iv_name, p_minor, s_minor, drbd_params, data_params, |
|
8649 |
meta_params): |
|
8648 |
iv_name, p_minor, s_minor): |
|
8650 | 8649 |
"""Generate a drbd8 device complete with its children. |
8651 | 8650 |
|
8652 | 8651 |
""" |
... | ... | |
8656 | 8655 |
|
8657 | 8656 |
dev_data = objects.Disk(dev_type=constants.LD_LV, size=size, |
8658 | 8657 |
logical_id=(vgnames[0], names[0]), |
8659 |
params=data_params)
|
|
8658 |
params={})
|
|
8660 | 8659 |
dev_meta = objects.Disk(dev_type=constants.LD_LV, size=DRBD_META_SIZE, |
8661 | 8660 |
logical_id=(vgnames[1], names[1]), |
8662 |
params=meta_params)
|
|
8661 |
params={})
|
|
8663 | 8662 |
drbd_dev = objects.Disk(dev_type=constants.LD_DRBD8, size=size, |
8664 | 8663 |
logical_id=(primary, secondary, port, |
8665 | 8664 |
p_minor, s_minor, |
8666 | 8665 |
shared_secret), |
8667 | 8666 |
children=[dev_data, dev_meta], |
8668 |
iv_name=iv_name, params=drbd_params)
|
|
8667 |
iv_name=iv_name, params={})
|
|
8669 | 8668 |
return drbd_dev |
8670 | 8669 |
|
8671 | 8670 |
|
... | ... | |
8686 | 8685 |
|
8687 | 8686 |
def _GenerateDiskTemplate(lu, template_name, instance_name, primary_node, |
8688 | 8687 |
secondary_nodes, disk_info, file_storage_dir, file_driver, base_index, |
8689 |
feedback_fn, disk_params, |
|
8690 |
_req_file_storage=opcodes.RequireFileStorage, |
|
8688 |
feedback_fn, full_disk_params, _req_file_storage=opcodes.RequireFileStorage, |
|
8691 | 8689 |
_req_shr_file_storage=opcodes.RequireSharedFileStorage): |
8692 | 8690 |
"""Generate the entire disk layout for a given template type. |
8693 | 8691 |
|
... | ... | |
8697 | 8695 |
vgname = lu.cfg.GetVGName() |
8698 | 8696 |
disk_count = len(disk_info) |
8699 | 8697 |
disks = [] |
8700 |
ld_params = _ComputeLDParams(template_name, disk_params) |
|
8701 | 8698 |
|
8702 | 8699 |
if template_name == constants.DT_DISKLESS: |
8703 | 8700 |
pass |
8704 | 8701 |
elif template_name == constants.DT_DRBD8: |
8705 |
drbd_params, data_params, meta_params = ld_params |
|
8706 | 8702 |
if len(secondary_nodes) != 1: |
8707 | 8703 |
raise errors.ProgrammerError("Wrong template configuration") |
8708 | 8704 |
remote_node = secondary_nodes[0] |
8709 | 8705 |
minors = lu.cfg.AllocateDRBDMinor( |
8710 | 8706 |
[primary_node, remote_node] * len(disk_info), instance_name) |
8711 | 8707 |
|
8708 |
(drbd_params, _, _) = objects.Disk.ComputeLDParams(template_name, |
|
8709 |
full_disk_params) |
|
8710 |
drbd_default_metavg = drbd_params[constants.LDP_DEFAULT_METAVG] |
|
8711 |
|
|
8712 | 8712 |
names = [] |
8713 | 8713 |
for lv_prefix in _GenerateUniqueNames(lu, [".disk%d" % (base_index + i) |
8714 | 8714 |
for i in range(disk_count)]): |
... | ... | |
8716 | 8716 |
names.append(lv_prefix + "_meta") |
8717 | 8717 |
for idx, disk in enumerate(disk_info): |
8718 | 8718 |
disk_index = idx + base_index |
8719 |
drbd_default_metavg = drbd_params[constants.LDP_DEFAULT_METAVG] |
|
8720 | 8719 |
data_vg = disk.get(constants.IDISK_VG, vgname) |
8721 | 8720 |
meta_vg = disk.get(constants.IDISK_METAVG, drbd_default_metavg) |
8722 | 8721 |
disk_dev = _GenerateDRBD8Branch(lu, primary_node, remote_node, |
... | ... | |
8724 | 8723 |
[data_vg, meta_vg], |
8725 | 8724 |
names[idx * 2:idx * 2 + 2], |
8726 | 8725 |
"disk/%d" % disk_index, |
8727 |
minors[idx * 2], minors[idx * 2 + 1], |
|
8728 |
drbd_params, data_params, meta_params) |
|
8726 |
minors[idx * 2], minors[idx * 2 + 1]) |
|
8729 | 8727 |
disk_dev.mode = disk[constants.IDISK_MODE] |
8730 | 8728 |
disks.append(disk_dev) |
8731 | 8729 |
else: |
... | ... | |
8745 | 8743 |
(name_prefix, base_index + i) |
8746 | 8744 |
for i in range(disk_count)]) |
8747 | 8745 |
|
8748 |
dev_type = _DISK_TEMPLATE_DEVICE_TYPE[template_name] |
|
8749 |
|
|
8750 | 8746 |
if template_name == constants.DT_PLAIN: |
8751 | 8747 |
def logical_id_fn(idx, _, disk): |
8752 | 8748 |
vg = disk.get(constants.IDISK_VG, vgname) |
... | ... | |
8765 | 8761 |
else: |
8766 | 8762 |
raise errors.ProgrammerError("Unknown disk template '%s'" % template_name) |
8767 | 8763 |
|
8764 |
dev_type = _DISK_TEMPLATE_DEVICE_TYPE[template_name] |
|
8765 |
|
|
8768 | 8766 |
for idx, disk in enumerate(disk_info): |
8769 | 8767 |
disk_index = idx + base_index |
8770 | 8768 |
size = disk[constants.IDISK_SIZE] |
... | ... | |
8774 | 8772 |
logical_id=logical_id_fn(idx, disk_index, disk), |
8775 | 8773 |
iv_name="disk/%d" % disk_index, |
8776 | 8774 |
mode=disk[constants.IDISK_MODE], |
8777 |
params=ld_params[0]))
|
|
8775 |
params={}))
|
|
8778 | 8776 |
|
8779 | 8777 |
return disks |
8780 | 8778 |
|
... | ... | |
9854 | 9852 |
utils.CommaJoin(res)), |
9855 | 9853 |
errors.ECODE_INVAL) |
9856 | 9854 |
|
9857 |
# disk parameters (not customizable at instance or node level) |
|
9858 |
# just use the primary node parameters, ignoring the secondary. |
|
9859 |
self.diskparams = group_info.diskparams |
|
9860 |
|
|
9861 | 9855 |
if not self.adopt_disks: |
9862 | 9856 |
if self.op.disk_template == constants.DT_RBD: |
9863 | 9857 |
# _CheckRADOSFreeSpace() is just a placeholder. |
... | ... | |
9974 | 9968 |
else: |
9975 | 9969 |
network_port = None |
9976 | 9970 |
|
9971 |
# This is ugly but we got a chicken-egg problem here |
|
9972 |
# We can only take the group disk parameters, as the instance |
|
9973 |
# has no disks yet (we are generating them right here). |
|
9974 |
node = self.cfg.GetNodeInfo(pnode_name) |
|
9975 |
nodegroup = self.cfg.GetNodeGroup(node.group) |
|
9977 | 9976 |
disks = _GenerateDiskTemplate(self, |
9978 | 9977 |
self.op.disk_template, |
9979 | 9978 |
instance, pnode_name, |
... | ... | |
9983 | 9982 |
self.op.file_driver, |
9984 | 9983 |
0, |
9985 | 9984 |
feedback_fn, |
9986 |
self.diskparams)
|
|
9985 |
self.cfg.GetGroupDiskParams(nodegroup))
|
|
9987 | 9986 |
|
9988 | 9987 |
iobj = objects.Instance(name=instance, os=self.op.os_type, |
9989 | 9988 |
primary_node=pnode_name, |
... | ... | |
10635 | 10634 |
_CheckTargetNodeIPolicy(self, ipolicy, instance, self.remote_node_info, |
10636 | 10635 |
ignore=self.ignore_ipolicy) |
10637 | 10636 |
|
10638 |
# TODO: compute disk parameters |
|
10639 |
primary_node_info = self.cfg.GetNodeInfo(instance.primary_node) |
|
10640 |
secondary_node_info = self.cfg.GetNodeInfo(secondary_node) |
|
10641 |
if primary_node_info.group != secondary_node_info.group: |
|
10642 |
self.lu.LogInfo("The instance primary and secondary nodes are in two" |
|
10643 |
" different node groups; the disk parameters of the" |
|
10644 |
" primary node's group will be applied.") |
|
10645 |
|
|
10646 |
self.diskparams = self.cfg.GetNodeGroup(primary_node_info.group).diskparams |
|
10647 |
|
|
10648 | 10637 |
for node in check_nodes: |
10649 | 10638 |
_CheckNodeOnline(self.lu, node) |
10650 | 10639 |
|
... | ... | |
10804 | 10793 |
lv_names = [".disk%d_%s" % (idx, suffix) for suffix in ["data", "meta"]] |
10805 | 10794 |
names = _GenerateUniqueNames(self.lu, lv_names) |
10806 | 10795 |
|
10807 |
_, data_p, meta_p = _ComputeLDParams(constants.DT_DRBD8, self.diskparams) |
|
10808 |
|
|
10809 | 10796 |
vg_data = dev.children[0].logical_id[0] |
10810 | 10797 |
lv_data = objects.Disk(dev_type=constants.LD_LV, size=dev.size, |
10811 |
logical_id=(vg_data, names[0]), params=data_p)
|
|
10798 |
logical_id=(vg_data, names[0]), params={})
|
|
10812 | 10799 |
vg_meta = dev.children[1].logical_id[0] |
10813 | 10800 |
lv_meta = objects.Disk(dev_type=constants.LD_LV, size=DRBD_META_SIZE, |
10814 |
logical_id=(vg_meta, names[1]), params=meta_p)
|
|
10801 |
logical_id=(vg_meta, names[1]), params={})
|
|
10815 | 10802 |
|
10816 | 10803 |
new_lvs = [lv_data, lv_meta] |
10817 | 10804 |
old_lvs = [child.Copy() for child in dev.children] |
... | ... | |
11069 | 11056 |
iv_names[idx] = (dev, dev.children, new_net_id) |
11070 | 11057 |
logging.debug("Allocated new_minor: %s, new_logical_id: %s", new_minor, |
11071 | 11058 |
new_net_id) |
11072 |
drbd_params, _, _ = _ComputeLDParams(constants.DT_DRBD8, self.diskparams) |
|
11073 | 11059 |
new_drbd = objects.Disk(dev_type=constants.LD_DRBD8, |
11074 | 11060 |
logical_id=new_alone_id, |
11075 | 11061 |
children=dev.children, |
11076 | 11062 |
size=dev.size, |
11077 |
params=drbd_params)
|
|
11063 |
params={})
|
|
11078 | 11064 |
try: |
11079 | 11065 |
_CreateSingleBlockDev(self.lu, self.new_node, self.instance, new_drbd, |
11080 | 11066 |
_GetInstanceInfoText(self.instance), False) |
... | ... | |
12272 | 12258 |
pnode = instance.primary_node |
12273 | 12259 |
nodelist = list(instance.all_nodes) |
12274 | 12260 |
pnode_info = self.cfg.GetNodeInfo(pnode) |
12275 |
self.diskparams = self.cfg.GetNodeGroup(pnode_info.group).diskparams
|
|
12261 |
self.diskparams = self.cfg.GetInstanceDiskParams(instance)
|
|
12276 | 12262 |
|
12277 | 12263 |
# Prepare disk/NIC modifications |
12278 | 12264 |
self.diskmod = PrepareContainerMods(self.op.disks, None) |
Also available in: Unified diff