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