2213 |
2213 |
@ivar oslist: list of OSes as diagnosed by DiagnoseOS
|
2214 |
2214 |
@type vm_capable: boolean
|
2215 |
2215 |
@ivar vm_capable: whether the node can host instances
|
|
2216 |
@type pv_min: float
|
|
2217 |
@ivar pv_min: size in MiB of the smallest PVs
|
|
2218 |
@type pv_max: float
|
|
2219 |
@ivar pv_max: size in MiB of the biggest PVs
|
2216 |
2220 |
|
2217 |
2221 |
"""
|
2218 |
2222 |
def __init__(self, offline=False, name=None, vm_capable=True):
|
... | ... | |
2232 |
2236 |
self.ghost = False
|
2233 |
2237 |
self.os_fail = False
|
2234 |
2238 |
self.oslist = {}
|
|
2239 |
self.pv_min = None
|
|
2240 |
self.pv_max = None
|
2235 |
2241 |
|
2236 |
2242 |
def ExpandNames(self):
|
2237 |
2243 |
# This raises errors.OpPrereqError on its own:
|
... | ... | |
2433 |
2439 |
"Node time diverges by at least %s from master node time",
|
2434 |
2440 |
ntime_diff)
|
2435 |
2441 |
|
2436 |
|
def _VerifyNodeLVM(self, ninfo, nresult, vg_name):
|
2437 |
|
"""Check the node LVM results.
|
|
2442 |
def _UpdateVerifyNodeLVM(self, ninfo, nresult, vg_name, nimg):
|
|
2443 |
"""Check the node LVM results and update info for cross-node checks.
|
2438 |
2444 |
|
2439 |
2445 |
@type ninfo: L{objects.Node}
|
2440 |
2446 |
@param ninfo: the node to check
|
2441 |
2447 |
@param nresult: the remote results for the node
|
2442 |
2448 |
@param vg_name: the configured VG name
|
|
2449 |
@type nimg: L{NodeImage}
|
|
2450 |
@param nimg: node image
|
2443 |
2451 |
|
2444 |
2452 |
"""
|
2445 |
2453 |
if vg_name is None:
|
... | ... | |
2471 |
2479 |
_ErrorIf(test, constants.CV_ENODELVM, node,
|
2472 |
2480 |
"Invalid character ':' in PV '%s' of VG '%s'",
|
2473 |
2481 |
pv.name, pv.vg_name)
|
|
2482 |
if self._exclusive_storage:
|
|
2483 |
(errmsgs, (pvmin, pvmax)) = utils.LvmExclusiveCheckNodePvs(pvlist)
|
|
2484 |
for msg in errmsgs:
|
|
2485 |
self._Error(constants.CV_ENODELVM, node, msg)
|
|
2486 |
nimg.pv_min = pvmin
|
|
2487 |
nimg.pv_max = pvmax
|
|
2488 |
|
|
2489 |
def _VerifyGroupLVM(self, node_image, vg_name):
|
|
2490 |
"""Check cross-node consistency in LVM.
|
|
2491 |
|
|
2492 |
@type node_image: dict
|
|
2493 |
@param node_image: info about nodes, mapping from node to names to
|
|
2494 |
L{NodeImage} objects
|
|
2495 |
@param vg_name: the configured VG name
|
|
2496 |
|
|
2497 |
"""
|
|
2498 |
if vg_name is None:
|
|
2499 |
return
|
|
2500 |
|
|
2501 |
# Only exlcusive storage needs this kind of checks
|
|
2502 |
if not self._exclusive_storage:
|
|
2503 |
return
|
|
2504 |
|
|
2505 |
# exclusive_storage wants all PVs to have the same size (approximately),
|
|
2506 |
# if the smallest and the biggest ones are okay, everything is fine.
|
|
2507 |
# pv_min is None iff pv_max is None
|
|
2508 |
vals = filter((lambda ni: ni.pv_min is not None), node_image.values())
|
|
2509 |
if not vals:
|
|
2510 |
return
|
|
2511 |
(pvmin, minnode) = min((ni.pv_min, ni.name) for ni in vals)
|
|
2512 |
(pvmax, maxnode) = max((ni.pv_max, ni.name) for ni in vals)
|
|
2513 |
bad = utils.LvmExclusiveTestBadPvSizes(pvmin, pvmax)
|
|
2514 |
self._ErrorIf(bad, constants.CV_EGROUPDIFFERENTPVSIZE, self.group_info.name,
|
|
2515 |
"PV sizes differ too much in the group; smallest (%s MB) is"
|
|
2516 |
" on %s, biggest (%s MB) is on %s",
|
|
2517 |
pvmin, minnode, pvmax, maxnode)
|
2474 |
2518 |
|
2475 |
2519 |
def _VerifyNodeBridges(self, ninfo, nresult, bridges):
|
2476 |
2520 |
"""Check the node bridges.
|
... | ... | |
3373 |
3417 |
|
3374 |
3418 |
es_flags = rpc.GetExclusiveStorageForNodeNames(self.cfg, self.my_node_names)
|
3375 |
3419 |
es_unset_nodes = []
|
3376 |
|
# The value of exclusive_storage should be the same across the group
|
3377 |
|
if compat.any(es_flags.values()):
|
|
3420 |
# The value of exclusive_storage should be the same across the group, so if
|
|
3421 |
# it's True for at least a node, we act as if it were set for all the nodes
|
|
3422 |
self._exclusive_storage = compat.any(es_flags.values())
|
|
3423 |
if self._exclusive_storage:
|
3378 |
3424 |
es_unset_nodes = [n for (n, es) in es_flags.items()
|
3379 |
3425 |
if not es]
|
3380 |
3426 |
|
... | ... | |
3489 |
3535 |
node == master_node)
|
3490 |
3536 |
|
3491 |
3537 |
if nimg.vm_capable:
|
3492 |
|
self._VerifyNodeLVM(node_i, nresult, vg_name)
|
|
3538 |
self._UpdateVerifyNodeLVM(node_i, nresult, vg_name, nimg)
|
3493 |
3539 |
self._VerifyNodeDrbd(node_i, nresult, self.all_inst_info, drbd_helper,
|
3494 |
3540 |
all_drbd_map)
|
3495 |
3541 |
|
... | ... | |
3516 |
3562 |
_ErrorIf(not test, constants.CV_ENODEORPHANINSTANCE, node_i.name,
|
3517 |
3563 |
"node is running unknown instance %s", inst)
|
3518 |
3564 |
|
|
3565 |
self._VerifyGroupLVM(node_image, vg_name)
|
|
3566 |
|
3519 |
3567 |
for node, result in extra_lv_nvinfo.items():
|
3520 |
3568 |
self._UpdateNodeVolumes(self.all_node_info[node], result.payload,
|
3521 |
3569 |
node_image[node], vg_name)
|