Revision 99ccf8b9
b/lib/bootstrap.py | ||
---|---|---|
584 | 584 |
uuid=uuid_generator.Generate([], utils.NewUUID, _INITCONF_ECID), |
585 | 585 |
name=constants.INITIAL_NODE_GROUP_NAME, |
586 | 586 |
members=[master_node_config.name], |
587 |
diskparams=cluster_config.diskparams,
|
|
587 |
diskparams={},
|
|
588 | 588 |
) |
589 | 589 |
nodegroups = { |
590 | 590 |
default_nodegroup.uuid: default_nodegroup, |
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) |
b/lib/config.py | ||
---|---|---|
242 | 242 |
""" |
243 | 243 |
node = self._UnlockedGetNodeInfo(instance.primary_node) |
244 | 244 |
nodegroup = self._UnlockedGetNodeGroup(node.group) |
245 |
return self._config_data.cluster.SimpleFillDP(nodegroup.diskparams) |
|
245 |
return self._UnlockedGetGroupDiskParams(nodegroup) |
|
246 |
|
|
247 |
@locking.ssynchronized(_config_lock, shared=1) |
|
248 |
def GetGroupDiskParams(self, group): |
|
249 |
"""Get the disk params populated with inherit chain. |
|
250 |
|
|
251 |
@type group: L{objects.Group} |
|
252 |
@param group: The group we want to know the params for |
|
253 |
@return: A dict with the filled in disk params |
|
254 |
|
|
255 |
""" |
|
256 |
return self._UnlockedGetGroupDiskParams(group) |
|
257 |
|
|
258 |
def _UnlockedGetGroupDiskParams(self, group): |
|
259 |
"""Get the disk params populated with inherit chain down to node-group. |
|
260 |
|
|
261 |
@type group: L{objects.Group} |
|
262 |
@param group: The group we want to know the params for |
|
263 |
@return: A dict with the filled in disk params |
|
264 |
|
|
265 |
""" |
|
266 |
return self._config_data.cluster.SimpleFillDP(group.diskparams) |
|
246 | 267 |
|
247 | 268 |
@locking.ssynchronized(_config_lock, shared=1) |
248 | 269 |
def GenerateMAC(self, ec_id): |
b/lib/objects.py | ||
---|---|---|
165 | 165 |
@return: the upgraded disk parameters dict |
166 | 166 |
|
167 | 167 |
""" |
168 |
if diskparams is None:
|
|
169 |
result = constants.DISK_DT_DEFAULTS.copy()
|
|
168 |
if not diskparams:
|
|
169 |
result = {}
|
|
170 | 170 |
else: |
171 | 171 |
result = FillDiskParams(constants.DISK_DT_DEFAULTS, diskparams) |
172 | 172 |
|
... | ... | |
1660 | 1660 |
if self.use_external_mip_script is None: |
1661 | 1661 |
self.use_external_mip_script = False |
1662 | 1662 |
|
1663 |
self.diskparams = UpgradeDiskParams(self.diskparams) |
|
1663 |
if self.diskparams: |
|
1664 |
self.diskparams = UpgradeDiskParams(self.diskparams) |
|
1665 |
else: |
|
1666 |
self.diskparams = constants.DISK_DT_DEFAULTS.copy() |
|
1664 | 1667 |
|
1665 | 1668 |
# instance policy added before 2.6 |
1666 | 1669 |
if self.ipolicy is None: |
b/test/ganeti.cmdlib_unittest.py | ||
---|---|---|
29 | 29 |
import shutil |
30 | 30 |
import operator |
31 | 31 |
import itertools |
32 |
import copy |
|
32 | 33 |
|
33 | 34 |
from ganeti import constants |
34 | 35 |
from ganeti import mcpu |
... | ... | |
974 | 975 |
def GenerateDRBDSecret(self, ec_id): |
975 | 976 |
return "ec%s-secret%s" % (ec_id, self._secret.next()) |
976 | 977 |
|
978 |
def GetInstanceInfo(self, _): |
|
979 |
return "foobar" |
|
980 |
|
|
977 | 981 |
|
978 | 982 |
class _FakeProcForGenDiskTemplate: |
979 | 983 |
def GetECId(self): |
... | ... | |
991 | 995 |
self.lu = _FakeLU(cfg=cfg, proc=proc) |
992 | 996 |
self.nodegroup = nodegroup |
993 | 997 |
|
998 |
@staticmethod |
|
999 |
def GetDiskParams(): |
|
1000 |
return copy.deepcopy(constants.DISK_DT_DEFAULTS) |
|
1001 |
|
|
994 | 1002 |
def testWrongDiskTemplate(self): |
995 | 1003 |
gdt = cmdlib._GenerateDiskTemplate |
996 | 1004 |
disk_template = "##unknown##" |
... | ... | |
1000 | 1008 |
self.assertRaises(errors.ProgrammerError, gdt, self.lu, disk_template, |
1001 | 1009 |
"inst26831.example.com", "node30113.example.com", [], [], |
1002 | 1010 |
NotImplemented, NotImplemented, 0, self.lu.LogInfo, |
1003 |
self.nodegroup.diskparams)
|
|
1011 |
self.GetDiskParams())
|
|
1004 | 1012 |
|
1005 | 1013 |
def testDiskless(self): |
1006 | 1014 |
gdt = cmdlib._GenerateDiskTemplate |
... | ... | |
1008 | 1016 |
result = gdt(self.lu, constants.DT_DISKLESS, "inst27734.example.com", |
1009 | 1017 |
"node30113.example.com", [], [], |
1010 | 1018 |
NotImplemented, NotImplemented, 0, self.lu.LogInfo, |
1011 |
self.nodegroup.diskparams)
|
|
1019 |
self.GetDiskParams())
|
|
1012 | 1020 |
self.assertEqual(result, []) |
1013 | 1021 |
|
1014 | 1022 |
def _TestTrivialDisk(self, template, disk_info, base_index, exp_dev_type, |
... | ... | |
1027 | 1035 |
template, "inst25088.example.com", |
1028 | 1036 |
"node185.example.com", ["node323.example.com"], [], |
1029 | 1037 |
NotImplemented, NotImplemented, base_index, |
1030 |
self.lu.LogInfo, self.nodegroup.diskparams,
|
|
1038 |
self.lu.LogInfo, self.GetDiskParams(),
|
|
1031 | 1039 |
_req_file_storage=req_file_storage, |
1032 | 1040 |
_req_shr_file_storage=req_shr_file_storage) |
1033 | 1041 |
|
1034 | 1042 |
result = gdt(self.lu, template, "inst21662.example.com", |
1035 | 1043 |
"node21741.example.com", [], |
1036 | 1044 |
disk_info, file_storage_dir, file_driver, base_index, |
1037 |
self.lu.LogInfo, self.nodegroup.diskparams,
|
|
1045 |
self.lu.LogInfo, self.GetDiskParams(),
|
|
1038 | 1046 |
_req_file_storage=req_file_storage, |
1039 | 1047 |
_req_shr_file_storage=req_shr_file_storage) |
1040 | 1048 |
|
... | ... | |
1184 | 1192 |
self.assertRaises(errors.ProgrammerError, gdt, self.lu, constants.DT_DRBD8, |
1185 | 1193 |
"inst827.example.com", "node1334.example.com", [], |
1186 | 1194 |
disk_info, NotImplemented, NotImplemented, 0, |
1187 |
self.lu.LogInfo, self.nodegroup.diskparams)
|
|
1195 |
self.lu.LogInfo, self.GetDiskParams())
|
|
1188 | 1196 |
|
1189 | 1197 |
result = gdt(self.lu, constants.DT_DRBD8, "inst827.example.com", |
1190 | 1198 |
"node1334.example.com", ["node12272.example.com"], |
1191 | 1199 |
disk_info, NotImplemented, NotImplemented, 0, self.lu.LogInfo, |
1192 |
self.nodegroup.diskparams)
|
|
1200 |
self.GetDiskParams())
|
|
1193 | 1201 |
|
1194 | 1202 |
for (idx, disk) in enumerate(result): |
1195 | 1203 |
self.assertTrue(isinstance(disk, objects.Disk)) |
Also available in: Unified diff