This was reported by @kroy on slack
vyos@vyos# commit [ interfaces tunnel tun0 ] Traceback (most recent call last): File "/usr/libexec/vyos/conf_mode/interfaces-tunnel.py", line 489, in <module> apply(c) File "/usr/libexec/vyos/conf_mode/interfaces-tunnel.py", line 478, in apply tunnel.add_addr(addr) File "/usr/lib/python3/dist-packages/vyos/ifconfig/interface.py", line 657, in add_addr return self._cmd(cmd) File "/usr/lib/python3/dist-packages/vyos/ifconfig/control.py", line 44, in _cmd raise OSError(code, f'{command}\nreturned: {decoded}') FileNotFoundError: [Errno 2] ip addr add "2a01:04f9:002b:f800::2/64" dev "tun0" returned: RTNETLINK answers: File exists
VyOS attempted to add an IP address to an interface which already had it set up. This problem was previously harmless as the return code of the ip addr add command was not checked for success. This changed during the 1.3 dev cycle, and errors to run ip commands are now systematically reported to the user.
The code is already checking the IP address, and will only add IPs if not already present.
Unfortunately, IPv6 addresses are not sufficiently normalised when compared, which can lead to issues if users have added the IP themselves using ip addr add and not used the same IPv6 format.
In
def is_intf_addr_assigned(intf, addr)
Here we can see that trailing zero present the IP differently, but expending :: would lead to the same issue.
-> if addr == tmp: (Pdb) addr '2a01:04f9:002b:f800::2/64' (Pdb) tmp '2a01:4f9:2b:f800::2/64'