github.com/osrg/gobgp@v2.0.0+incompatible/test/scenario_test/route_server_ipv4_v6_test.py (about) 1 # Copyright (C) 2015 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 BGP_FSM_ESTABLISHED 29 from lib.gobgp import GoBGPContainer 30 from lib.quagga import QuaggaBGPContainer 31 32 33 class GoBGPIPv6Test(unittest.TestCase): 34 35 wait_per_retry = 5 36 retry_limit = 15 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=65002, router_id='192.168.0.2', 44 ctn_image_name=gobgp_ctn_image_name, 45 log_level=parser_option.gobgp_log_level) 46 q1 = QuaggaBGPContainer(name='q1', asn=65003, router_id='192.168.0.3') 47 q2 = QuaggaBGPContainer(name='q2', asn=65004, router_id='192.168.0.4') 48 q3 = QuaggaBGPContainer(name='q3', asn=65005, router_id='192.168.0.5') 49 q4 = QuaggaBGPContainer(name='q4', asn=65006, router_id='192.168.0.6') 50 51 ctns = [g1, q1, q2, q3, q4] 52 v4 = [q1, q2] 53 v6 = [q3, q4] 54 55 initial_wait_time = max(ctn.run() for ctn in ctns) 56 time.sleep(initial_wait_time) 57 58 for ctn in v4: 59 g1.add_peer(ctn, is_rs_client=True) 60 ctn.add_peer(g1) 61 62 for ctn in v6: 63 g1.add_peer(ctn, is_rs_client=True, v6=True) 64 ctn.add_peer(g1, v6=True) 65 66 for idx, q in enumerate(v4): 67 route = '10.0.{0}.0/24'.format(idx + 1) 68 q.add_route(route) 69 70 for idx, q in enumerate(v6): 71 route = '2001:{0}::/96'.format(idx + 1) 72 q.add_route(route, rf='ipv6') 73 74 cls.gobgp = g1 75 cls.quaggas = {'q1': q1, 'q2': q2, 'q3': q3, 'q4': q4} 76 cls.ipv4s = {'q1': q1, 'q2': q2} 77 cls.ipv6s = {'q3': q3, 'q4': q4} 78 79 def check_gobgp_local_rib(self, ctns, rf): 80 for rs_client in ctns.itervalues(): 81 done = False 82 for _ in range(self.retry_limit): 83 if done: 84 break 85 86 state = self.gobgp.get_neighbor_state(rs_client) 87 self.assertEqual(state, BGP_FSM_ESTABLISHED) 88 local_rib = self.gobgp.get_local_rib(rs_client, rf=rf) 89 local_rib = [p['prefix'] for p in local_rib] 90 if len(local_rib) < (len(ctns) - 1): 91 time.sleep(self.wait_per_retry) 92 continue 93 94 self.assertEqual(len(local_rib), (len(ctns) - 1)) 95 96 for c in ctns.itervalues(): 97 if rs_client != c: 98 for r in c.routes: 99 self.assertTrue(r in local_rib) 100 101 done = True 102 if done: 103 continue 104 # should not reach here 105 raise AssertionError 106 107 def check_rs_client_rib(self, ctns, rf): 108 for rs_client in ctns.itervalues(): 109 done = False 110 for _ in range(self.retry_limit): 111 if done: 112 break 113 global_rib = rs_client.get_global_rib(rf=rf) 114 global_rib = [p['prefix'] for p in global_rib] 115 if len(global_rib) < len(ctns): 116 time.sleep(self.wait_per_retry) 117 continue 118 119 self.assertEqual(len(global_rib), len(ctns)) 120 121 for c in ctns.itervalues(): 122 for r in c.routes: 123 self.assertTrue(r in global_rib) 124 125 done = True 126 if done: 127 continue 128 # should not reach here 129 raise AssertionError 130 131 # test each neighbor state is turned establish 132 def test_01_neighbor_established(self): 133 for q in self.quaggas.itervalues(): 134 self.gobgp.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=q) 135 136 def test_02_check_ipv4_peer_rib(self): 137 self.check_gobgp_local_rib(self.ipv4s, 'ipv4') 138 self.check_rs_client_rib(self.ipv4s, 'ipv4') 139 140 def test_03_check_ipv6_peer_rib(self): 141 self.check_gobgp_local_rib(self.ipv6s, 'ipv6') 142 self.check_rs_client_rib(self.ipv6s, 'ipv6') 143 144 def test_04_add_in_policy_to_reject_all(self): 145 for q in self.gobgp.peers.itervalues(): 146 self.gobgp.local('gobgp neighbor {0} policy import set default reject'.format(q['neigh_addr'].split('/')[0])) 147 148 def test_05_check_ipv4_peer_rib(self): 149 self.check_gobgp_local_rib(self.ipv4s, 'ipv4') 150 self.check_rs_client_rib(self.ipv4s, 'ipv4') 151 152 def test_06_check_ipv6_peer_rib(self): 153 self.check_gobgp_local_rib(self.ipv6s, 'ipv6') 154 self.check_rs_client_rib(self.ipv6s, 'ipv6') 155 156 def test_07_add_in_policy_to_reject_all(self): 157 self.gobgp.local('gobgp neighbor all softresetin') 158 time.sleep(1) 159 160 def test_08_check_rib(self): 161 for q in self.ipv4s.itervalues(): 162 self.assertEqual(len(self.gobgp.get_adj_rib_out(q)), 0) 163 self.assertEqual(len(q.get_global_rib()), len(q.routes)) 164 165 for q in self.ipv6s.itervalues(): 166 self.assertEqual(len(self.gobgp.get_adj_rib_out(q, rf='ipv6')), 0) 167 self.assertEqual(len(q.get_global_rib(rf='ipv6')), len(q.routes)) 168 169 170 if __name__ == '__main__': 171 output = local("which docker 2>&1 > /dev/null ; echo $?", capture=True) 172 if int(output) is not 0: 173 print "docker not found" 174 sys.exit(1) 175 176 nose.main(argv=sys.argv, addplugins=[OptionParser()], 177 defaultTest=sys.argv[0])