430 |
430 |
" %s and %s" % (minor, node, instance_a, instance_b))
|
431 |
431 |
|
432 |
432 |
# IP checks
|
433 |
|
ips = { data.cluster.master_ip: ["cluster_ip"] }
|
434 |
|
def _helper(ip, name):
|
435 |
|
if ip in ips:
|
436 |
|
ips[ip].append(name)
|
437 |
|
else:
|
438 |
|
ips[ip] = [name]
|
|
433 |
default_nicparams = data.cluster.nicparams[constants.PP_DEFAULT]
|
|
434 |
ips = {}
|
|
435 |
|
|
436 |
def _AddIpAddress(ip, name):
|
|
437 |
ips.setdefault(ip, []).append(name)
|
|
438 |
|
|
439 |
_AddIpAddress(data.cluster.master_ip, "cluster_ip")
|
439 |
440 |
|
440 |
441 |
for node in data.nodes.values():
|
441 |
|
_helper(node.primary_ip, "node:%s/primary" % node.name)
|
|
442 |
_AddIpAddress(node.primary_ip, "node:%s/primary" % node.name)
|
442 |
443 |
if node.secondary_ip != node.primary_ip:
|
443 |
|
_helper(node.secondary_ip, "node:%s/secondary" % node.name)
|
|
444 |
_AddIpAddress(node.secondary_ip, "node:%s/secondary" % node.name)
|
|
445 |
|
|
446 |
for instance in data.instances.values():
|
|
447 |
for idx, nic in enumerate(instance.nics):
|
|
448 |
if nic.ip is None:
|
|
449 |
continue
|
|
450 |
|
|
451 |
nicparams = objects.FillDict(default_nicparams, nic.nicparams)
|
|
452 |
nic_mode = nicparams[constants.NIC_MODE]
|
|
453 |
nic_link = nicparams[constants.NIC_LINK]
|
|
454 |
|
|
455 |
if nic_mode == constants.NIC_MODE_BRIDGED:
|
|
456 |
link = "bridge:%s" % nic_link
|
|
457 |
elif nic_mode == constants.NIC_MODE_ROUTED:
|
|
458 |
link = "route:%s" % nic_link
|
|
459 |
else:
|
|
460 |
raise errors.ProgrammerError("NIC mode '%s' not handled" % nic_mode)
|
|
461 |
|
|
462 |
_AddIpAddress("%s/%s" % (link, nic.ip),
|
|
463 |
"instance:%s/nic:%d" % (instance.name, idx))
|
444 |
464 |
|
445 |
465 |
for ip, owners in ips.items():
|
446 |
466 |
if len(owners) > 1:
|
447 |
467 |
result.append("IP address %s is used by multiple owners: %s" %
|
448 |
468 |
(ip, ", ".join(owners)))
|
|
469 |
|
449 |
470 |
return result
|
450 |
471 |
|
451 |
472 |
@locking.ssynchronized(_config_lock, shared=1)
|