diff options
Diffstat (limited to 'test/scenario_test/addpath_test.py')
-rw-r--r-- | test/scenario_test/addpath_test.py | 201 |
1 files changed, 116 insertions, 85 deletions
diff --git a/test/scenario_test/addpath_test.py b/test/scenario_test/addpath_test.py index de0f337b..2d71554b 100644 --- a/test/scenario_test/addpath_test.py +++ b/test/scenario_test/addpath_test.py @@ -21,7 +21,10 @@ import nose from fabric.api import local from lib import base -from lib.base import BGP_FSM_ESTABLISHED +from lib.base import ( + BGP_FSM_ESTABLISHED, + assert_several_times, +) from lib.gobgp import GoBGPContainer from lib.exabgp import ExaBGPContainer from lib.noseplugin import OptionParser, parser_option @@ -74,148 +77,176 @@ class GoBGPTestBase(unittest.TestCase): self.e1.add_route(route='192.168.100.0/24', identifier=10, aspath=[100, 200, 300]) self.e1.add_route(route='192.168.100.0/24', identifier=20, aspath=[100, 200]) self.e1.add_route(route='192.168.100.0/24', identifier=30, aspath=[100]) - # Because ExaBGPContainer will be restarted internally for adding or - # deleting routes, here waits for re-establishment. - self.g1.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=self.e1) - time.sleep(1) # test three routes are installed to the rib due to add-path feature def test_02_check_g1_global_rib(self): - rib = self.g1.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 3) + def f(): + rib = self.g1.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 3) + + assert_several_times(f) # test only the best path is advertised to g2 def test_03_check_g2_global_rib(self): - rib = self.g2.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 1) - self.assertEqual(rib[0]['paths'][0]['aspath'], [100]) + def f(): + rib = self.g2.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 1) + self.assertEqual(rib[0]['paths'][0]['aspath'], [100]) + + assert_several_times(f) # test three routes are advertised to g3 def test_04_check_g3_global_rib(self): - rib = self.g3.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 3) + def f(): + rib = self.g3.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 3) + + assert_several_times(f) # withdraw a route with path_id (no error check) def test_05_withdraw_route_with_path_id(self): self.e1.del_route(route='192.168.100.0/24', identifier=30) - # Because ExaBGPContainer will be restarted internally for adding or - # deleting routes, here waits for re-establishment. - self.g1.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=self.e1) - time.sleep(1) # test the withdrawn route is removed from the rib def test_06_check_g1_global_rib(self): - rib = self.g1.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 2) - for path in rib[0]['paths']: - self.assertTrue(path['aspath'] == [100, 200, 300] or - path['aspath'] == [100, 200]) + def f(): + rib = self.g1.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 2) + for path in rib[0]['paths']: + self.assertIn(path['aspath'], ([100, 200, 300], + [100, 200])) + + assert_several_times(f) # test the best path is replaced due to the removal from g1 rib def test_07_check_g2_global_rib(self): - rib = self.g2.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 1) - self.assertEqual(rib[0]['paths'][0]['aspath'], [100, 200]) + def f(): + rib = self.g2.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 1) + self.assertEqual(rib[0]['paths'][0]['aspath'], [100, 200]) + + assert_several_times(f) # test the withdrawn route is removed from the rib of g3 def test_08_check_g3_global_rib(self): - rib = self.g3.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 2) - for path in rib[0]['paths']: - self.assertTrue(path['aspath'] == [100, 200, 300] or - path['aspath'] == [100, 200]) + def f(): + rib = self.g3.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 2) + for path in rib[0]['paths']: + self.assertIn(path['aspath'], ([100, 200, 300], + [100, 200])) + + assert_several_times(f) # install a route with path_id via GoBGP CLI (no error check) def test_09_install_add_paths_route_via_cli(self): # identifier is duplicated with the identifier of the route from e1 self.g1.add_route(route='192.168.100.0/24', identifier=10, local_pref=500) - time.sleep(1) # XXX: wait for routes re-calculated and advertised # test the route from CLI is installed to the rib def test_10_check_g1_global_rib(self): - rib = self.g1.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 3) - for path in rib[0]['paths']: - self.assertTrue(path['aspath'] == [100, 200, 300] or - path['aspath'] == [100, 200] or - path['aspath'] == []) - if len(path['aspath']) == 0: - self.assertEqual(path['local-pref'], 500) + def f(): + rib = self.g1.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 3) + for path in rib[0]['paths']: + self.assertIn(path['aspath'], ([100, 200, 300], + [100, 200], + [])) + if not path['aspath']: # path['aspath'] == [] + self.assertEqual(path['local-pref'], 500) + + assert_several_times(f) # test the best path is replaced due to the CLI route from g1 rib def test_11_check_g2_global_rib(self): - rib = self.g2.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 1) - self.assertEqual(rib[0]['paths'][0]['aspath'], []) + def f(): + rib = self.g2.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 1) + self.assertEqual(rib[0]['paths'][0]['aspath'], []) + + assert_several_times(f) # test the route from CLI is advertised from g1 def test_12_check_g3_global_rib(self): - rib = self.g3.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 3) - for path in rib[0]['paths']: - self.assertTrue(path['aspath'] == [100, 200, 300] or - path['aspath'] == [100, 200] or - path['aspath'] == []) - if len(path['aspath']) == 0: - self.assertEqual(path['local-pref'], 500) + def f(): + rib = self.g3.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 3) + for path in rib[0]['paths']: + self.assertIn(path['aspath'], ([100, 200, 300], + [100, 200], + [])) + if not path['aspath']: # path['aspath'] == [] + self.assertEqual(path['local-pref'], 500) + + assert_several_times(f) # remove non-existing route with path_id via GoBGP CLI (no error check) def test_13_remove_non_existing_add_paths_route_via_cli(self): # specify locally non-existing identifier which has the same value # with the identifier of the route from e1 self.g1.del_route(route='192.168.100.0/24', identifier=20) - time.sleep(1) # XXX: wait for routes re-calculated and advertised # test none of route is removed by non-existing path_id via CLI def test_14_check_g1_global_rib(self): - rib = self.g1.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 3) - for path in rib[0]['paths']: - self.assertTrue(path['aspath'] == [100, 200, 300] or - path['aspath'] == [100, 200] or - path['aspath'] == []) - if len(path['aspath']) == 0: - self.assertEqual(path['local-pref'], 500) + def f(): + rib = self.g1.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 3) + for path in rib[0]['paths']: + self.assertIn(path['aspath'], ([100, 200, 300], + [100, 200], + [])) + if not path['aspath']: # path['aspath'] == [] + self.assertEqual(path['local-pref'], 500) + + assert_several_times(f) # remove route with path_id via GoBGP CLI (no error check) def test_15_remove_add_paths_route_via_cli(self): self.g1.del_route(route='192.168.100.0/24', identifier=10) - time.sleep(1) # XXX: wait for routes re-calculated and advertised # test the route is removed from the rib via CLI def test_16_check_g1_global_rib(self): - rib = self.g1.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 2) - for path in rib[0]['paths']: - self.assertTrue(path['aspath'] == [100, 200, 300] or - path['aspath'] == [100, 200]) + def f(): + rib = self.g1.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 2) + for path in rib[0]['paths']: + self.assertIn(path['aspath'], ([100, 200, 300], + [100, 200])) + + assert_several_times(f) # test the best path is replaced the removal from g1 rib def test_17_check_g2_global_rib(self): - rib = self.g2.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 1) - self.assertEqual(rib[0]['paths'][0]['aspath'], [100, 200]) + def f(): + rib = self.g2.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 1) + self.assertEqual(rib[0]['paths'][0]['aspath'], [100, 200]) + + assert_several_times(f) # test the removed route from CLI is withdrawn by g1 def test_18_check_g3_global_rib(self): - rib = self.g3.get_global_rib() - self.assertEqual(len(rib), 1) - self.assertEqual(len(rib[0]['paths']), 2) - for path in rib[0]['paths']: - self.assertTrue(path['aspath'] == [100, 200, 300] or - path['aspath'] == [100, 200]) + def f(): + rib = self.g3.get_global_rib() + self.assertEqual(len(rib), 1) + self.assertEqual(len(rib[0]['paths']), 2) + for path in rib[0]['paths']: + self.assertIn(path['aspath'], ([100, 200, 300], + [100, 200])) + + assert_several_times(f) if __name__ == '__main__': |