diff options
| author | initramfs <initramfs@initramfs.io> | 2022-09-01 20:51:21 +0800 | 
|---|---|---|
| committer | initramfs <initramfs@initramfs.io> | 2022-09-02 19:36:01 +0800 | 
| commit | 95e7676aa8ae5b3476b14a334b3815c2ae59f8d6 (patch) | |
| tree | 941712a056349f620004eb8609fe7fd4a646937d /src | |
| parent | 6287cc214be8f506f0656b7ad75143265213d140 (diff) | |
| download | vyos-1x-95e7676aa8ae5b3476b14a334b3815c2ae59f8d6.tar.gz vyos-1x-95e7676aa8ae5b3476b14a334b3815c2ae59f8d6.zip | |
bonding: T4668: fix live bonding member add or remove
Fixes several bugs around bonding member interface states not matching
the committed configuration, including:
  - Disabled removed interfaces coming back up
  - Newly added disabled interfaces not staying down
  - Newly added interfaces not showing up in the bond
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/interfaces-bonding.py | 23 | 
1 files changed, 22 insertions, 1 deletions
| diff --git a/src/conf_mode/interfaces-bonding.py b/src/conf_mode/interfaces-bonding.py index 8ef3d9990..21cf204fc 100755 --- a/src/conf_mode/interfaces-bonding.py +++ b/src/conf_mode/interfaces-bonding.py @@ -89,6 +89,11 @@ def get_config(config=None):      # determine which members have been removed      interfaces_removed = leaf_node_changed(conf, base + [ifname, 'member', 'interface']) + +    # Reset config level to interfaces +    old_level = conf.get_level() +    conf.set_level(['interfaces']) +      if interfaces_removed:          bond['shutdown_required'] = {}          if 'member' not in bond: @@ -97,7 +102,7 @@ def get_config(config=None):          tmp = {}          for interface in interfaces_removed:              section = Section.section(interface) # this will be 'ethernet' for 'eth0' -            if conf.exists(['insterfaces', section, interface, 'disable']): +            if conf.exists([section, interface, 'disable']):                  tmp[interface] = {'disable': ''}              else:                  tmp[interface] = {} @@ -105,8 +110,24 @@ def get_config(config=None):          # also present the interfaces to be removed from the bond as dictionary          bond['member']['interface_remove'] = tmp +    # Restore existing config level +    conf.set_level(old_level) +      if dict_search('member.interface', bond):          for interface, interface_config in bond['member']['interface'].items(): +            # Check if member interface is a new member +            if not conf.exists_effective(['member', 'interface', interface]): +                bond['shutdown_required'] = {} + +            # Check if member interface is disabled +            conf.set_level(['interfaces']) + +            section = Section.section(interface) # this will be 'ethernet' for 'eth0' +            if conf.exists([section, interface, 'disable']): +                interface_config['disable'] = '' + +            conf.set_level(old_level) +              # Check if member interface is already member of another bridge              tmp = is_member(conf, interface, 'bridge')              if tmp: interface_config['is_bridge_member'] = tmp | 
