summaryrefslogtreecommitdiff
path: root/smoketest/scripts/cli
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2025-12-26 12:06:29 +0100
committerChristian Breunig <christian@breunig.cc>2025-12-26 12:07:52 +0100
commit81d536db0630358d65fde81d43e44d12d7fdb2dc (patch)
tree28427ad42f650d95124c60c73ffb1b243f1444f0 /smoketest/scripts/cli
parent8c0f42e1986af19bef2793fd49c63b6b57799fc9 (diff)
downloadvyos-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-xsmoketest/scripts/cli/test_interfaces_bonding.py30
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