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