diff options
| author | Christian Breunig <christian@breunig.cc> | 2025-12-26 12:06:29 +0100 |
|---|---|---|
| committer | Christian Breunig <christian@breunig.cc> | 2025-12-26 12:07:52 +0100 |
| commit | 81d536db0630358d65fde81d43e44d12d7fdb2dc (patch) | |
| tree | 28427ad42f650d95124c60c73ffb1b243f1444f0 /smoketest/scripts/cli | |
| parent | 8c0f42e1986af19bef2793fd49c63b6b57799fc9 (diff) | |
| download | vyos-1x-81d536db0630358d65fde81d43e44d12d7fdb2dc.tar.gz vyos-1x-81d536db0630358d65fde81d43e44d12d7fdb2dc.zip | |
bond: T2416: support hot-add/remove of bond member interfaces
Previously, adding or removing a bond member interface would force the entire
bond into an admin-down state, removing and re-adding all member interfaces.
This caused unnecessary link up/down events and excessive log noise on partner
devices.
This change refactors the code to allow hot-adding and removal of bond member
interfaces without disrupting existing members, minimizing link state changes
and log entries.
Diffstat (limited to 'smoketest/scripts/cli')
| -rwxr-xr-x | smoketest/scripts/cli/test_interfaces_bonding.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/smoketest/scripts/cli/test_interfaces_bonding.py b/smoketest/scripts/cli/test_interfaces_bonding.py index b6eb5328d..a565168cf 100755 --- a/smoketest/scripts/cli/test_interfaces_bonding.py +++ b/smoketest/scripts/cli/test_interfaces_bonding.py @@ -80,6 +80,36 @@ class BondingInterfaceTest(BasicInterfaceTest.TestCase): mac = Interface(interface).get_mac() self.assertEqual(mac, base_mac) + def test_bonding_physical_macs(self): + macs = {} + # configure member interfaces + for interface in self._interfaces: + for member in self._members: + macs[member] = get_interface_config(member)['address'] + + for option in self._options.get(interface, []): + self.cli_set(self._base_path + [interface] + option.split()) + + self.cli_commit() + + # mac must match the MAC of the first interface + for interface in self._interfaces: + bond_mac = get_interface_config(interface)['address'] + self.assertEqual(bond_mac, macs[self._members[0]]) + + # remove all member interfaces from the bond + for interface in self._interfaces: + self.cli_delete(self._base_path + [interface, 'member']) + + self.cli_commit() + + # members must re-gain their old MAC address + for interface in self._interfaces: + for member in self._members: + tmp = Interface(member) + self.assertEqual(tmp.get_mac(), macs[member]) + self.assertEqual(tmp.get_admin_state(), 'up') + def test_bonding_remove_member(self): # T2515: when removing a bond member the previously enslaved/member # interface must be in its former admin-up/down state. Here we ensure |
