summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorVladimir Isaev <visaev@netgate.com>2020-02-04 11:54:27 +0300
committerAndrew Yourtchenko <ayourtch@gmail.com>2020-08-12 15:59:46 +0000
commit779ca383b9538b00a3e88a399d436490b6b81efa (patch)
tree325ac3ae537a22febb7462ebd820cc21593cb9e0 /test
parentfd48e5542aa050192fcc00cbb836c5272ec45294 (diff)
stats: fix state counter removal
Avoid using vec_del1() for directory vector to keep indexes valid all the time. There are state counters for each slave in LACP bond mode which can be dynamically created and removed. Vector index is used to access these counters. But also vec_del1() is used to remove counter from vector. This function changes the index of the last element, so after this we are unable to access ex-last element using old index. As a result it is not possible to add-del-add two interfaces to the LACP bond: DBGvpp# create bond mode lacp BondEthernet0 DBGvpp# create packet-generator interface pg1 DBGvpp# create packet-generator interface pg2 DBGvpp# bond add BondEthernet0 pg1 DBGvpp# bond add BondEthernet0 pg2 DBGvpp# bond del pg1 DBGvpp# bond del pg2 DBGvpp# bond add BondEthernet0 pg1 DBGvpp# bond add BondEthernet0 pg2 bond add: /if/lacp/1/3/partner-state is already register Type: fix Signed-off-by: Vladimir Isaev <visaev@netgate.com> Change-Id: I2c86e13905eefdef6233369cd4ab5c1b53d123bd (cherry picked from commit 72e31bc2d9b910147c09e1c329713fccc873a018)
Diffstat (limited to 'test')
-rw-r--r--test/test_bond.py81
1 files changed, 41 insertions, 40 deletions
diff --git a/test/test_bond.py b/test/test_bond.py
index d1ae77ad3f5..7cdbc71c201 100644
--- a/test/test_bond.py
+++ b/test/test_bond.py
@@ -171,50 +171,51 @@ class TestBondInterface(VppTestCase):
def test_bond_enslave(self):
""" Bond enslave/detach slave test """
- # create interface (BondEthernet0)
+ # create interface (BondEthernet0) and set bond mode to LACP
self.logger.info("create bond")
- bond0 = VppBondInterface(self, mode=3)
+ bond0 = VppBondInterface(self, mode=5)
bond0.add_vpp_config()
bond0.admin_up()
- # verify pg0 and pg1 not in BondEthernet0
- if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
- self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
- self.assertFalse(self.pg1.is_interface_config_in_dump(if_dump))
-
- # enslave pg0 and pg1 to BondEthernet0
- self.logger.info("bond enslave interface pg0 to BondEthernet0")
- bond0.enslave_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index,
- is_passive=0,
- is_long_timeout=0)
-
- self.logger.info("bond enslave interface pg1 to BondEthernet0")
- bond0.enslave_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index,
- is_passive=0,
- is_long_timeout=0)
-
- # verify both slaves in BondEthernet0
- if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
- self.assertTrue(self.pg0.is_interface_config_in_dump(if_dump))
- self.assertTrue(self.pg1.is_interface_config_in_dump(if_dump))
-
- # detach interface pg0
- self.logger.info("detach interface pg0")
- bond0.detach_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index)
-
- # verify pg0 is not in BondEthernet0, but pg1 is
- if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
- self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
- self.assertTrue(self.pg1.is_interface_config_in_dump(if_dump))
-
- # detach interface pg1
- self.logger.info("detach interface pg1")
- bond0.detach_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index)
-
- # verify pg0 and pg1 not in BondEthernet0
- if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
- self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
- self.assertFalse(self.pg1.is_interface_config_in_dump(if_dump))
+ # verify that interfaces can be enslaved and detached two times
+ for i in range(2):
+ # verify pg0 and pg1 not in BondEthernet0
+ if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
+ self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
+ self.assertFalse(self.pg1.is_interface_config_in_dump(if_dump))
+
+ # enslave pg0 and pg1 to BondEthernet0
+ self.logger.info("bond enslave interface pg0 to BondEthernet0")
+ bond0.enslave_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index,
+ is_passive=0,
+ is_long_timeout=0)
+
+ self.logger.info("bond enslave interface pg1 to BondEthernet0")
+ bond0.enslave_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index,
+ is_passive=0,
+ is_long_timeout=0)
+ # verify both slaves in BondEthernet0
+ if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
+ self.assertTrue(self.pg0.is_interface_config_in_dump(if_dump))
+ self.assertTrue(self.pg1.is_interface_config_in_dump(if_dump))
+
+ # detach interface pg0
+ self.logger.info("detach interface pg0")
+ bond0.detach_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index)
+
+ # verify pg0 is not in BondEthernet0, but pg1 is
+ if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
+ self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
+ self.assertTrue(self.pg1.is_interface_config_in_dump(if_dump))
+
+ # detach interface pg1
+ self.logger.info("detach interface pg1")
+ bond0.detach_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index)
+
+ # verify pg0 and pg1 not in BondEthernet0
+ if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
+ self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
+ self.assertFalse(self.pg1.is_interface_config_in_dump(if_dump))
bond0.remove_vpp_config()