Revision 912737ba lib/cmdlib.py

b/lib/cmdlib.py
4212 4212
    mn = self.cfg.GetMasterNode()
4213 4213
    return ([mn], [mn])
4214 4214

  
4215
  def CheckPrereq(self):
4216
    """Check prerequisites.
4217

  
4218
    This checks whether the given params don't conflict and
4219
    if the given volume group is valid.
4215
  def _CheckVgName(self, node_list, enabled_disk_templates,
4216
                   new_enabled_disk_templates):
4217
    """Check the consistency of the vg name on all nodes and in case it gets
4218
       unset whether there are instances still using it.
4220 4219

  
4221 4220
    """
4222 4221
    if self.op.vg_name is not None and not self.op.vg_name:
......
4224 4223
        raise errors.OpPrereqError("Cannot disable lvm storage while lvm-based"
4225 4224
                                   " instances exist", errors.ECODE_INVAL)
4226 4225

  
4226
    if (self.op.vg_name is not None and
4227
        utils.IsLvmEnabled(enabled_disk_templates)) or \
4228
           (self.cfg.GetVGName() is not None and
4229
            utils.LvmGetsEnabled(enabled_disk_templates,
4230
                                 new_enabled_disk_templates)):
4231
      self._CheckVgNameOnNodes(node_list)
4232

  
4233
  def _CheckVgNameOnNodes(self, node_list):
4234
    """Check the status of the volume group on each node.
4235

  
4236
    """
4237
    vglist = self.rpc.call_vg_list(node_list)
4238
    for node in node_list:
4239
      msg = vglist[node].fail_msg
4240
      if msg:
4241
        # ignoring down node
4242
        self.LogWarning("Error while gathering data on node %s"
4243
                        " (ignoring node): %s", node, msg)
4244
        continue
4245
      vgstatus = utils.CheckVolumeGroupSize(vglist[node].payload,
4246
                                            self.op.vg_name,
4247
                                            constants.MIN_VG_SIZE)
4248
      if vgstatus:
4249
        raise errors.OpPrereqError("Error on node '%s': %s" %
4250
                                   (node, vgstatus), errors.ECODE_ENVIRON)
4251

  
4252
  def _GetEnabledDiskTemplates(self, cluster):
4253
    """Determines the enabled disk templates and the subset of disk templates
4254
       that are newly enabled by this operation.
4255

  
4256
    """
4257
    enabled_disk_templates = None
4258
    new_enabled_disk_templates = []
4259
    if self.op.enabled_disk_templates:
4260
      enabled_disk_templates = self.op.enabled_disk_templates
4261
      new_enabled_disk_templates = \
4262
        list(set(enabled_disk_templates)
4263
             - set(cluster.enabled_disk_templates))
4264
    else:
4265
      enabled_disk_templates = cluster.enabled_disk_templates
4266
    return (enabled_disk_templates, new_enabled_disk_templates)
4267

  
4268
  def CheckPrereq(self):
4269
    """Check prerequisites.
4270

  
4271
    This checks whether the given params don't conflict and
4272
    if the given volume group is valid.
4273

  
4274
    """
4227 4275
    if self.op.drbd_helper is not None and not self.op.drbd_helper:
4228 4276
      if self.cfg.HasAnyDiskOfType(constants.LD_DRBD8):
4229 4277
        raise errors.OpPrereqError("Cannot disable drbd helper while"
......
4231 4279
                                   errors.ECODE_INVAL)
4232 4280

  
4233 4281
    node_list = self.owned_locks(locking.LEVEL_NODE)
4282
    self.cluster = cluster = self.cfg.GetClusterInfo()
4234 4283

  
4235
    # if vg_name not None, checks given volume group on all nodes
4236
    if self.op.vg_name:
4237
      vglist = self.rpc.call_vg_list(node_list)
4238
      for node in node_list:
4239
        msg = vglist[node].fail_msg
4240
        if msg:
4241
          # ignoring down node
4242
          self.LogWarning("Error while gathering data on node %s"
4243
                          " (ignoring node): %s", node, msg)
4244
          continue
4245
        vgstatus = utils.CheckVolumeGroupSize(vglist[node].payload,
4246
                                              self.op.vg_name,
4247
                                              constants.MIN_VG_SIZE)
4248
        if vgstatus:
4249
          raise errors.OpPrereqError("Error on node '%s': %s" %
4250
                                     (node, vgstatus), errors.ECODE_ENVIRON)
4284
    (enabled_disk_templates, new_enabled_disk_templates) = \
4285
      self._GetEnabledDiskTemplates(cluster)
4286

  
4287
    self._CheckVgName(node_list, enabled_disk_templates,
4288
                      new_enabled_disk_templates)
4251 4289

  
4252 4290
    if self.op.drbd_helper:
4253 4291
      # checks given drbd helper on all nodes
......
4266 4304
          raise errors.OpPrereqError("Error on node '%s': drbd helper is %s" %
4267 4305
                                     (node, node_helper), errors.ECODE_ENVIRON)
4268 4306

  
4269
    self.cluster = cluster = self.cfg.GetClusterInfo()
4270 4307
    # validate params changes
4271 4308
    if self.op.beparams:
4272 4309
      objects.UpgradeBeParams(self.op.beparams)
......
4468 4505
                                     " because instance '%s' is using it." %
4469 4506
                                     (instance.disk_template, instance.name))
4470 4507

  
4471
  def Exec(self, feedback_fn):
4472
    """Change the parameters of the cluster.
4508

  
4509
  def _SetVgName(self, feedback_fn):
4510
    """Determines and sets the new volume group name.
4473 4511

  
4474 4512
    """
4475 4513
    if self.op.vg_name is not None:
4514
      if self.op.vg_name and not \
4515
           utils.IsLvmEnabled(self.cluster.enabled_disk_templates):
4516
        feedback_fn("Note that you specified a volume group, but did not"
4517
                    " enable any lvm disk template.")
4476 4518
      new_volume = self.op.vg_name
4477 4519
      if not new_volume:
4520
        if utils.IsLvmEnabled(self.cluster.enabled_disk_templates):
4521
          raise errors.OpPrereqError("Cannot unset volume group if lvm-based"
4522
                                     " disk templates are enabled.")
4478 4523
        new_volume = None
4479 4524
      if new_volume != self.cfg.GetVGName():
4480 4525
        self.cfg.SetVGName(new_volume)
4481 4526
      else:
4482 4527
        feedback_fn("Cluster LVM configuration already in desired"
4483 4528
                    " state, not changing")
4529
    else:
4530
      if utils.IsLvmEnabled(self.cluster.enabled_disk_templates) and \
4531
          not self.cfg.GetVGName():
4532
        raise errors.OpPrereqError("Please specify a volume group when"
4533
                                   " enabling lvm-based disk-templates.")
4534

  
4535
  def Exec(self, feedback_fn):
4536
    """Change the parameters of the cluster.
4537

  
4538
    """
4539
    if self.op.enabled_disk_templates:
4540
      self.cluster.enabled_disk_templates = \
4541
        list(set(self.op.enabled_disk_templates))
4542

  
4543
    self._SetVgName(feedback_fn)
4544

  
4484 4545
    if self.op.drbd_helper is not None:
4546
      if not constants.DT_DRBD8 in self.cluster.enabled_disk_templates:
4547
        feedback_fn("Note that you specified a drbd user helper, but did"
4548
                    " enabled the drbd disk template.")
4485 4549
      new_helper = self.op.drbd_helper
4486 4550
      if not new_helper:
4487 4551
        new_helper = None
......
4497 4561
    if self.op.enabled_hypervisors is not None:
4498 4562
      self.cluster.hvparams = self.new_hvparams
4499 4563
      self.cluster.enabled_hypervisors = self.op.enabled_hypervisors
4500
    if self.op.enabled_disk_templates:
4501
      self.cluster.enabled_disk_templates = \
4502
        list(set(self.op.enabled_disk_templates))
4503 4564
    if self.op.beparams:
4504 4565
      self.cluster.beparams[constants.PP_DEFAULT] = self.new_beparams
4505 4566
    if self.op.nicparams:

Also available in: Unified diff