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
(cherry picked from commit 02b67f8e63)
This commit is contained in:
Harald Jensås
2021-12-07 23:37:30 +01:00
parent 316b3b0fbe
commit ad0c724364

View File

@@ -314,7 +314,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)