diff options
author | Christian Poessinger <christian@poessinger.com> | 2022-02-22 10:31:32 +0100 |
---|---|---|
committer | Christian Poessinger <christian@poessinger.com> | 2022-02-22 10:36:19 +0100 |
commit | 983ff704b4e357dd552a0b268d9054bc649688b9 (patch) | |
tree | 9a0923292b7222ffe6f071aaf65136f367504ad5 /src | |
parent | ddda1163e4a9ee5c91d678b196ebd37863f1520e (diff) | |
download | vyos-1x-983ff704b4e357dd552a0b268d9054bc649688b9.tar.gz vyos-1x-983ff704b4e357dd552a0b268d9054bc649688b9.zip |
vxlan: T4264: interface is destroyed and rebuild on description change
When changing "general" parameters like:
- interface IP address
- MTU
- description
the interface is destroyed and recreated ... this should not happen!
(cherry picked from commit 2373b232849c847717cbdcfac7390d8376e227ca)
Diffstat (limited to 'src')
-rwxr-xr-x | src/conf_mode/interfaces-vxlan.py | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/conf_mode/interfaces-vxlan.py b/src/conf_mode/interfaces-vxlan.py index 6785169e6..5ee4603af 100755 --- a/src/conf_mode/interfaces-vxlan.py +++ b/src/conf_mode/interfaces-vxlan.py @@ -21,6 +21,7 @@ from netifaces import interfaces from vyos.config import Config from vyos.configdict import get_interface_dict +from vyos.configdict import leaf_node_changed from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete from vyos.configverify import verify_mtu_ipv6 @@ -44,6 +45,16 @@ def get_config(config=None): base = ['interfaces', 'vxlan'] vxlan = get_interface_dict(conf, base) + # VXLAN interfaces are picky and require recreation if certain parameters + # change. But a VXLAN interface should - of course - not be re-created if + # it's description or IP address is adjusted. Feels somehow logic doesn't it? + for cli_option in ['external', 'gpe', 'group', 'port', 'remote', + 'source-address', 'source-interface', 'vni', + 'parameters ip dont-fragment', 'parameters ip tos', + 'parameters ip ttl']: + if leaf_node_changed(conf, cli_option.split()): + vxlan.update({'rebuild_required': {}}) + return vxlan def verify(vxlan): @@ -109,11 +120,12 @@ def generate(vxlan): def apply(vxlan): # Check if the VXLAN interface already exists - if vxlan['ifname'] in interfaces(): - v = VXLANIf(vxlan['ifname']) - # VXLAN is super picky and the tunnel always needs to be recreated, - # thus we can simply always delete it first. - v.remove() + if 'rebuild_required' in vxlan or 'delete' in vxlan: + if vxlan['ifname'] in interfaces(): + v = VXLANIf(vxlan['ifname']) + # VXLAN is super picky and the tunnel always needs to be recreated, + # thus we can simply always delete it first. + v.remove() if 'deleted' not in vxlan: # This is a special type of interface which needs additional parameters |