diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2024-09-19 11:46:05 +0300 | 
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2024-09-20 11:55:53 +0300 | 
| commit | 7dbd07657c914d5a46eed101ae44d73ba3b4c6f0 (patch) | |
| tree | 069a00e499369adaf365b4327774024872ec3ffa /src | |
| parent | 53fa5c9e93a45e2f8c78adf69652bc2f875cef53 (diff) | |
| download | vyos-1x-7dbd07657c914d5a46eed101ae44d73ba3b4c6f0.tar.gz vyos-1x-7dbd07657c914d5a46eed101ae44d73ba3b4c6f0.zip | |
bridge: T6675: VXLAN Interface configuration lost due to improper bridge detachment
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/interfaces_bridge.py | 40 | 
1 files changed, 26 insertions, 14 deletions
| diff --git a/src/conf_mode/interfaces_bridge.py b/src/conf_mode/interfaces_bridge.py index 7b2c1ee0b..637db442a 100755 --- a/src/conf_mode/interfaces_bridge.py +++ b/src/conf_mode/interfaces_bridge.py @@ -53,20 +53,22 @@ def get_config(config=None):      tmp = node_changed(conf, base + [ifname, 'member', 'interface'])      if tmp:          if 'member' in bridge: -            bridge['member'].update({'interface_remove' : tmp }) +            bridge['member'].update({'interface_remove': {t: {} for t in tmp}})          else: -            bridge.update({'member' : {'interface_remove' : tmp }}) -            for interface in tmp: -                # When using VXLAN member interfaces that are configured for Single -                # VXLAN Device (SVD) we need to call the VXLAN conf-mode script to -                # re-create VLAN to VNI mappings if required, but only if the interface -                # is already live on the system - this must not be done on first commit -                if interface.startswith('vxlan') and interface_exists(interface): -                    set_dependents('vxlan', conf, interface) -                # When using Wireless member interfaces we need to inform hostapd -                # to properly set-up the bridge -                elif interface.startswith('wlan') and interface_exists(interface): -                    set_dependents('wlan', conf, interface) +            bridge.update({'member': {'interface_remove': {t: {} for t in tmp}}}) +        for interface in tmp: +            # When using VXLAN member interfaces that are configured for Single +            # VXLAN Device (SVD) we need to call the VXLAN conf-mode script to +            # re-create VLAN to VNI mappings if required, but only if the interface +            # is already live on the system - this must not be done on first commit +            if interface.startswith('vxlan') and interface_exists(interface): +                set_dependents('vxlan', conf, interface) +                _, vxlan = get_interface_dict(conf, ['interfaces', 'vxlan'], ifname=interface) +                bridge['member']['interface_remove'].update({interface: vxlan}) +            # When using Wireless member interfaces we need to inform hostapd +            # to properly set-up the bridge +            elif interface.startswith('wlan') and interface_exists(interface): +                set_dependents('wlan', conf, interface)      if dict_search('member.interface', bridge) is not None:          for interface in list(bridge['member']['interface']): @@ -118,6 +120,16 @@ def get_config(config=None):      return bridge  def verify(bridge): +    # to delete interface or remove a member interface VXLAN first need to check if +    # VXLAN does not require to be a member of a bridge interface +    if dict_search('member.interface_remove', bridge): +        for iface, iface_config in bridge['member']['interface_remove'].items(): +            if iface.startswith('vxlan') and dict_search('parameters.neighbor_suppress', iface_config) != None: +                raise ConfigError( +                    f'To detach interface {iface} from bridge you must first ' +                    f'disable "neighbor-suppress" parameter in the VXLAN interface {iface}' +                ) +      if 'deleted' in bridge:          return None @@ -192,7 +204,7 @@ def apply(bridge):              try:                  call_dependents()              except ConfigError: -                raise ConfigError('Error updating member interface configuration after changing bridge!') +                raise ConfigError(f'Error updating member interface {interface} configuration after changing bridge!')      return None | 
