Use netaddr when comparing local_ip for changes

In undercloud preflight validations the IP address in
config is compared to the IP address on the deployed
undercloud. For IPv6 the string discovered on the
system may be in a different format, representing the
same actual IP address and netmask but written using a
different valid syntax.

Load the existing IP and config IP as a netaddr.IPNetwork,
and compare both the networks and IPs to ensure we compare
the actuall address and network, not the strings.

Closes-Bug: #1953552
Change-Id: I42531b4e6f7b3b18ae085cc2eb36234cb306b375
This commit is contained in:
Harald Jensås 2021-12-07 23:37:30 +01:00
parent e2ed23516c
commit 02b67f8e63
1 changed files with 4 additions and 1 deletions

View File

@ -312,7 +312,10 @@ def _validate_no_ip_change():
# Nothing to check if br-ctlplane wasn't configured
return
existing_ip = ctlplane['addresses'][0]['ip_netmask']
if existing_ip != CONF.local_ip:
conf_netaddr = netaddr.IPNetwork(CONF.local_ip)
existing_netaddr = netaddr.IPNetwork(existing_ip)
if (conf_netaddr != existing_netaddr
or conf_netaddr.ip != existing_netaddr.ip):
message = _('Changing the local_ip is not allowed. Existing IP: '
'{0}, Configured IP: {1}').format(
existing_ip, CONF.local_ip)