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