github.com/osrg/gobgp@v2.0.0+incompatible/test/scenario_test/aspath_test.py (about) 1 # Copyright (C) 2017 Nippon Telegraph and Telephone Corporation. 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http://www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 # implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 16 from __future__ import absolute_import 17 18 import sys 19 import time 20 import unittest 21 22 from fabric.api import local 23 import nose 24 25 from lib.noseplugin import OptionParser, parser_option 26 27 from lib import base 28 from lib.base import ( 29 BGP_FSM_ESTABLISHED, 30 assert_several_times, 31 ) 32 from lib.gobgp import GoBGPContainer 33 from lib.quagga import QuaggaBGPContainer 34 35 36 class GoBGPTestBase(unittest.TestCase): 37 38 @classmethod 39 def setUpClass(cls): 40 gobgp_ctn_image_name = parser_option.gobgp_image 41 base.TEST_PREFIX = parser_option.test_prefix 42 43 g1 = GoBGPContainer(name='g1', asn=65001, router_id='192.168.0.1', 44 ctn_image_name=gobgp_ctn_image_name, 45 log_level=parser_option.gobgp_log_level) 46 q1 = QuaggaBGPContainer(name='q1', asn=65002, router_id='192.168.0.2') 47 g2 = GoBGPContainer(name='g2', asn=65001, router_id='192.168.0.3', 48 ctn_image_name=gobgp_ctn_image_name, 49 log_level=parser_option.gobgp_log_level) 50 ctns = [g1, g2, q1] 51 52 initial_wait_time = max(ctn.run() for ctn in ctns) 53 54 time.sleep(initial_wait_time) 55 56 g1.add_peer(q1) 57 q1.add_peer(g1) 58 59 q1.add_peer(g2) 60 g2.add_peer(q1) 61 62 g1.add_route('10.0.0.0/24') 63 64 cls.g1 = g1 65 cls.g2 = g2 66 cls.q1 = q1 67 cls.ctns = {n.name: n for n in ctns} 68 69 # test each neighbor state is turned establish 70 def test_01_neighbor_established(self): 71 self.g1.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=self.q1) 72 self.q1.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=self.g2) 73 74 def test_02_check_reject_as_loop(self): 75 def f(): 76 r = self.g2.get_neighbor(self.q1) 77 self.assertTrue('afi_safis' in r) 78 received = 0 79 for afisafi in r['afi_safis']: 80 self.assertTrue('state' in afisafi) 81 s = afisafi.get('state') 82 self.assertTrue('received' in s) 83 received += s.get('received') 84 # hacky. 'accepted' is zero so the key was deleted due to 85 # omitempty tag in bgp_configs.go. 86 self.assertFalse(s.get('accepted'), None) 87 self.assertEqual(received, 1) 88 89 assert_several_times(f) 90 91 def test_03_update_peer(self): 92 self.g2.update_peer(self.q1, allow_as_in=10) 93 94 self.q1.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=self.g2) 95 96 def test_04_check_accept_as_loop(self): 97 def f(): 98 r = self.g2.get_neighbor(self.q1) 99 self.assertTrue('afi_safis' in r) 100 received = 0 101 accepted = 0 102 for afisafi in r['afi_safis']: 103 self.assertTrue('state' in afisafi) 104 s = afisafi.get('state') 105 received += s.get('received') 106 accepted += s.get('accepted') 107 self.assertEqual(received, 1) 108 self.assertEqual(accepted, 1) 109 110 assert_several_times(f) 111 112 def test_05_check_remove_private_as_peer_all(self): 113 g3 = GoBGPContainer(name='g3', asn=100, router_id='192.168.0.4', 114 ctn_image_name=parser_option.gobgp_image, 115 log_level=parser_option.gobgp_log_level) 116 g4 = GoBGPContainer(name='g4', asn=200, router_id='192.168.0.5', 117 ctn_image_name=parser_option.gobgp_image, 118 log_level=parser_option.gobgp_log_level) 119 time.sleep(max(ctn.run() for ctn in [g3, g4])) 120 121 self.ctns['g3'] = g3 122 self.ctns['g4'] = g4 123 124 self.g2.add_peer(g3) 125 g3.add_peer(self.g2) 126 127 g3.add_peer(g4, remove_private_as='all') 128 g4.add_peer(g3) 129 130 self.g2.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=g3) 131 g3.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=g4) 132 133 def f(): 134 rib = g4.get_global_rib() 135 self.assertEqual(len(rib), 1) 136 self.assertEqual(len(rib[0]['paths']), 1) 137 self.assertEqual(rib[0]['paths'][0]['aspath'], [100]) 138 139 assert_several_times(f) 140 141 def test_06_check_remove_private_as_peer_replace(self): 142 g3 = self.ctns['g3'] 143 g4 = self.ctns['g4'] 144 g3.update_peer(g4, remove_private_as='replace') 145 146 g3.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=g4) 147 148 def f(): 149 rib = g4.get_global_rib() 150 self.assertEqual(rib[0]['paths'][0]['aspath'], [100, 100, 100, 100]) 151 152 assert_several_times(f) 153 154 def test_07_check_replace_peer_as(self): 155 g5 = GoBGPContainer(name='g5', asn=100, router_id='192.168.0.6', 156 ctn_image_name=parser_option.gobgp_image, 157 log_level=parser_option.gobgp_log_level) 158 time.sleep(g5.run()) 159 160 g4 = self.ctns['g4'] 161 g4.add_peer(g5, replace_peer_as=True) 162 g5.add_peer(g4) 163 164 g4.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=g5) 165 166 def f(): 167 rib = g5.get_global_rib() 168 self.assertEqual(rib[0]['paths'][0]['aspath'], [200, 200, 200, 200, 200]) 169 170 assert_several_times(f) 171 172 173 if __name__ == '__main__': 174 output = local("which docker 2>&1 > /dev/null ; echo $?", capture=True) 175 if int(output) is not 0: 176 print "docker not found" 177 sys.exit(1) 178 179 nose.main(argv=sys.argv, addplugins=[OptionParser()], 180 defaultTest=sys.argv[0])