mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
normalizing ip address(s) to IPNetwork format for string comparaison
Ticket: CM-12798 Reviewed By: Roopa, Nikhil G Testing Done: We are seeing some issue when using IP addresses with inner values padded with zeros. Such as: 2a01:75e0:0000:09b0::1/64 The kernel will process the ip properly but when we query the kernel again (with iproute2 or netlink) it returns 2a01:75e0:0:09b0::1/64 Since we are doing string comparaison we are seeing failures. We are now converting all ip address to a standard format using IPNetwork or IPAddress obj Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
This commit is contained in:
@@ -10,6 +10,7 @@ try:
|
|||||||
from ipaddr import IPNetwork, IPv4Network, IPv6Network, IPv4Address, IPv6Address
|
from ipaddr import IPNetwork, IPv4Network, IPv6Network, IPv4Address, IPv6Address
|
||||||
from sets import Set
|
from sets import Set
|
||||||
from ifupdown.iface import *
|
from ifupdown.iface import *
|
||||||
|
from ifupdown.utils import utils
|
||||||
from ifupdownaddons.modulebase import moduleBase
|
from ifupdownaddons.modulebase import moduleBase
|
||||||
from ifupdownaddons.iproute2 import iproute2
|
from ifupdownaddons.iproute2 import iproute2
|
||||||
from ifupdownaddons.dhclient import dhclient
|
from ifupdownaddons.dhclient import dhclient
|
||||||
@@ -221,6 +222,7 @@ class address(moduleBase):
|
|||||||
ifaceobjlist = [ifaceobj]
|
ifaceobjlist = [ifaceobj]
|
||||||
|
|
||||||
(addr_supported, newaddrs, newaddr_attrs) = self._inet_address_convert_to_cidr(ifaceobjlist)
|
(addr_supported, newaddrs, newaddr_attrs) = self._inet_address_convert_to_cidr(ifaceobjlist)
|
||||||
|
newaddrs = utils.get_normalized_ip_addr(ifaceobj.name, newaddrs)
|
||||||
if not addr_supported:
|
if not addr_supported:
|
||||||
return
|
return
|
||||||
if (not squash_addr_config and (ifaceobj.flags & iface.HAS_SIBLINGS)):
|
if (not squash_addr_config and (ifaceobj.flags & iface.HAS_SIBLINGS)):
|
||||||
@@ -234,11 +236,11 @@ class address(moduleBase):
|
|||||||
if not ifupdownflags.flags.PERFMODE and purge_addresses == 'yes':
|
if not ifupdownflags.flags.PERFMODE and purge_addresses == 'yes':
|
||||||
# if perfmode is not set and purge addresses is not set to 'no'
|
# if perfmode is not set and purge addresses is not set to 'no'
|
||||||
# lets purge addresses not in the config
|
# lets purge addresses not in the config
|
||||||
runningaddrs = self.ipcmd.addr_get(ifaceobj.name, details=False)
|
runningaddrs = utils.get_normalized_ip_addr(ifaceobj.name, self.ipcmd.addr_get(ifaceobj.name, details=False))
|
||||||
|
|
||||||
# if anycast address is configured on 'lo' and is in running config
|
# if anycast address is configured on 'lo' and is in running config
|
||||||
# add it to newaddrs so that ifreload doesn't wipe it out
|
# add it to newaddrs so that ifreload doesn't wipe it out
|
||||||
anycast_addr = self._get_anycast_addr(ifaceobjlist)
|
anycast_addr = utils.get_normalized_ip_addr(ifaceobj.name, self._get_anycast_addr(ifaceobjlist))
|
||||||
|
|
||||||
if runningaddrs and anycast_addr and anycast_addr in runningaddrs:
|
if runningaddrs and anycast_addr and anycast_addr in runningaddrs:
|
||||||
newaddrs.append(anycast_addr)
|
newaddrs.append(anycast_addr)
|
||||||
@@ -466,11 +468,12 @@ class address(moduleBase):
|
|||||||
# compare addresses
|
# compare addresses
|
||||||
if addr_method == 'dhcp':
|
if addr_method == 'dhcp':
|
||||||
return
|
return
|
||||||
addrs = self._get_iface_addresses(ifaceobj)
|
addrs = utils.get_normalized_ip_addr(ifaceobj.name,
|
||||||
|
self._get_iface_addresses(ifaceobj))
|
||||||
runningaddrsdict = self.ipcmd.addr_get(ifaceobj.name)
|
runningaddrsdict = self.ipcmd.addr_get(ifaceobj.name)
|
||||||
# if anycast address is configured on 'lo' and is in running config
|
# if anycast address is configured on 'lo' and is in running config
|
||||||
# add it to addrs so that query_check doesn't fail
|
# add it to addrs so that query_check doesn't fail
|
||||||
anycast_addr = ifaceobj.get_attr_value_first('clagd-vxlan-anycast-ip')
|
anycast_addr = utils.get_normalized_ip_addr(ifaceobj.name, ifaceobj.get_attr_value_first('clagd-vxlan-anycast-ip'))
|
||||||
if anycast_addr:
|
if anycast_addr:
|
||||||
anycast_addr = anycast_addr+'/32'
|
anycast_addr = anycast_addr+'/32'
|
||||||
if runningaddrsdict and anycast_addr and runningaddrsdict.get(anycast_addr):
|
if runningaddrsdict and anycast_addr and runningaddrsdict.get(anycast_addr):
|
||||||
|
@@ -17,6 +17,7 @@ import subprocess
|
|||||||
import ifupdownflags
|
import ifupdownflags
|
||||||
|
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
from ipaddr import IPNetwork, IPAddress
|
||||||
|
|
||||||
def signal_handler_f(ps, sig, frame):
|
def signal_handler_f(ps, sig, frame):
|
||||||
if ps:
|
if ps:
|
||||||
@@ -164,6 +165,26 @@ class utils():
|
|||||||
else:
|
else:
|
||||||
return 'cmd \'%s\' failed: returned %d' % (cmd, cmd_returncode)
|
return 'cmd \'%s\' failed: returned %d' % (cmd, cmd_returncode)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_normalized_ip_addr(cls, ifacename, ipaddrs):
|
||||||
|
if not ipaddrs: return None
|
||||||
|
if isinstance(ipaddrs, list):
|
||||||
|
addrs = []
|
||||||
|
for ip in ipaddrs:
|
||||||
|
if not ip:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
addrs.append(str(IPNetwork(ip)) if '/' in ip else str(IPAddress(ip)))
|
||||||
|
except Exception as e:
|
||||||
|
cls.logger.warning('%s: %s' % (ifacename, e))
|
||||||
|
return addrs
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
return str(IPNetwork(ipaddrs)) if '/' in ipaddrs else str(IPAddress(ipaddrs))
|
||||||
|
except Exception as e:
|
||||||
|
cls.logger.warning('%s: %s' % (ifacename, e))
|
||||||
|
return ipaddrs
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _execute_subprocess(cls, cmd,
|
def _execute_subprocess(cls, cmd,
|
||||||
env=None,
|
env=None,
|
||||||
|
Reference in New Issue
Block a user