def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g2 = GoBGPContainer(name='g2', asn=65000, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) ctns = [g1, g2] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g1.local("gobgp vrf add vrf1 rd 10:10 rt both 10:10") g2.local("gobgp vrf add vrf1 rd 10:10 rt both 10:10") for a, b in combinations(ctns, 2): a.add_peer(b, vpn=True, passwd='evpn') b.add_peer(a, vpn=True, passwd='evpn') cls.g1 = g1 cls.g2 = g2
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format=parser_option.config_format) q1 = ExaBGPContainer(name='q1', asn=65001, router_id='192.168.0.2') q2 = ExaBGPContainer(name='q2', asn=65002, router_id='192.168.0.3') q3 = ExaBGPContainer(name='q3', asn=65003, router_id='192.168.0.4') qs = [q1, q2, q3] ctns = [g1, q1, q2, q3] # advertise a route from q1, q2, q3 for idx, q in enumerate(qs): route = '10.0.{0}.0/24'.format(idx + 1) q.add_route(route) initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g1.local('gobgp global policy export add default reject') for q in qs: g1.add_peer(q) q.add_peer(g1) cls.gobgp = g1 cls.quaggas = {'q1': q1, 'q2': q2, 'q3': q3}
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format=parser_option.config_format) q1 = ExaBGPContainer(name='q1', asn=65001, router_id='192.168.0.2') q2 = ExaBGPContainer(name='q2', asn=65002, router_id='192.168.0.3') q3 = ExaBGPContainer(name='q3', asn=65003, router_id='192.168.0.4') qs = [q1, q2, q3] ctns = [g1, q1, q2, q3] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g1.local('gobgp global policy export add default reject') for q in qs: g1.add_peer(q) q.add_peer(g1) # advertise a route from q1, q2, q3 for idx, q in enumerate(qs): route = '10.0.{0}.0/24'.format(idx + 1) q.add_route(route) cls.gobgp = g1 cls.quaggas = {'q1': q1, 'q2': q2, 'q3': q3}
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65001, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g2 = GoBGPContainer(name='g2', asn=65001, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g3 = GoBGPContainer(name='g3', asn=65001, router_id='192.168.0.3', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g4 = GoBGPContainer(name='g4', asn=65001, router_id='192.168.0.4', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g5 = GoBGPContainer(name='g5', asn=65001, router_id='192.168.0.5', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') ctns = [g1, g2, g3, g4, g5] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g3.local("gobgp vrf add red rd 10:10 rt both 10:10") g3.local("gobgp vrf add blue rd 20:20 rt both 20:20") g1.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g1, vrf='red', is_rr_client=True, graceful_restart=True, llgr=True) g2.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g2, vrf='red', is_rr_client=True, graceful_restart=True, llgr=True) g4.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g4, vrf='blue', is_rr_client=True, graceful_restart=True, llgr=True) g5.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g5, vrf='blue', is_rr_client=True, graceful_restart=True, llgr=True) cls.g1 = g1 cls.g2 = g2 cls.g3 = g3 cls.g4 = g4 cls.g5 = g5
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65001, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g2 = GoBGPContainer(name='g2', asn=65001, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g3 = GoBGPContainer(name='g3', asn=65001, router_id='192.168.0.3', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g4 = GoBGPContainer(name='g4', asn=65001, router_id='192.168.0.4', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g5 = GoBGPContainer(name='g5', asn=65001, router_id='192.168.0.5', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') ctns = [g1, g2, g3, g4, g5] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g3.local("gobgp vrf add red rd 10:10 rt both 10:10") g3.local("gobgp vrf add blue rd 20:20 rt both 20:20") g1.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g1, vrf='red', is_rr_client=True, graceful_restart=True, llgr=True) g2.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g2, vrf='red', is_rr_client=True, graceful_restart=True, llgr=True) g4.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g4, vrf='blue', is_rr_client=True, graceful_restart=True, llgr=True) g5.add_peer(g3, graceful_restart=True, llgr=True) g3.add_peer(g5, vrf='blue', is_rr_client=True, graceful_restart=True, llgr=True) cls.g1 = g1 cls.g2 = g2 cls.g3 = g3 cls.g4 = g4 cls.g5 = g5
def setUpClass(cls): # +----+ +----+ # | g1 |----(iBGP)----| g2 | # +----+ +----+ gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g2 = GoBGPContainer(name='g2', asn=65000, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) time.sleep(max(ctn.run() for ctn in [g1, g2])) g1.local("gobgp vrf add vrf1 rd 100:100 rt both 100:100") g1.local("gobgp vrf add vrf2 rd 200:200 rt both 200:200") g2.local("gobgp vrf add vrf1 rd 100:100 rt both 100:100") g2.local("gobgp vrf add vrf3 rd 300:300 rt both 300:300") g1.local("gobgp vrf vrf1 rib add 10.0.0.0/24") g1.local("gobgp vrf vrf2 rib add 10.0.0.0/24") g2.local("gobgp vrf vrf1 rib add 20.0.0.0/24") g2.local("gobgp vrf vrf3 rib add 20.0.0.0/24") cls.g1 = g1 cls.g2 = g2
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g2 = GoBGPContainer(name='g2', asn=65000, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) ctns = {ctn.name: ctn for ctn in [g1, g2]} initial_wait_time = max(ctn.run() for ctn in ctns.values()) time.sleep(initial_wait_time) g1.local("gobgp vrf add vrf1 rd 100:100 rt both 100:100") g1.local("gobgp vrf add vrf2 rd 200:200 rt both 200:200") g2.local("gobgp vrf add vrf1 rd 100:100 rt both 100:100") g2.local("gobgp vrf add vrf3 rd 300:300 rt both 300:300") g1.local("gobgp vrf vrf1 rib add 10.0.0.0/24") g1.local("gobgp vrf vrf2 rib add 10.0.0.0/24") g2.local("gobgp vrf vrf1 rib add 20.0.0.0/24") g2.local("gobgp vrf vrf3 rib add 20.0.0.0/24") for a, b in combinations(ctns.values(), 2): a.add_peer(b, vpn=True, passwd='rtc', graceful_restart=True) b.add_peer(a, vpn=True, passwd='rtc', graceful_restart=True) cls.g1 = g1 cls.g2 = g2 cls.ctns = ctns
def test_30_ebgp_setup(self): # +----+ +----+ # | g6 |----(eBGP)----| g7 | # +----+ +----+ gobgp_ctn_image_name = parser_option.gobgp_image g6 = GoBGPContainer(name='g6', asn=65001, router_id='192.168.0.6', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g7 = GoBGPContainer(name='g7', asn=65002, router_id='192.168.0.7', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) time.sleep(max(ctn.run() for ctn in [g6, g7])) g6.local("gobgp vrf add vrf1 rd 100:100 rt both 100:100") g6.local("gobgp vrf add vrf2 rd 200:200 rt both 200:200") g7.local("gobgp vrf add vrf1 rd 100:100 rt both 100:100") g7.local("gobgp vrf add vrf3 rd 300:300 rt both 300:300") g6.local("gobgp vrf vrf1 rib add 60.0.0.0/24") g6.local("gobgp vrf vrf2 rib add 60.0.0.0/24") g7.local("gobgp vrf vrf1 rib add 70.0.0.0/24") g7.local("gobgp vrf vrf3 rib add 70.0.0.0/24") for a, b in combinations([g6, g7], 2): a.add_peer(b, vpn=True, passwd='rtc', graceful_restart=True) b.add_peer(a, vpn=True, passwd='rtc', graceful_restart=True) g6.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=g7) self.__class__.g6 = g6 self.__class__.g7 = g7
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g2 = GoBGPContainer(name='g2', asn=65001, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) ctns = [g1, g2] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time + 2) done = False def f(ifname, ctn): out = ctn.local('ip -6 n', capture=True) l = [line for line in out.split('\n') if ifname in line] if len(l) == 0: return False elif len(l) > 1: raise Exception('not p2p link') return 'REACHABLE' in l[0] for i in range(20): g1.local('ping6 -c 1 ff02::1%eth0') g2.local('ping6 -c 1 ff02::1%eth0') if f('eth0', g1) and f('eth0', g2): done = True break time.sleep(1) if not done: raise Exception('timeout') for a, b in combinations(ctns, 2): a.add_peer(b, interface='eth0') b.add_peer(a, interface='eth0') cls.g1 = g1 cls.g2 = g2
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g2 = GoBGPContainer(name='g2', asn=65001, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) ctns = [g1, g2] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time + 2) done = False def f(ifname, ctn): out = ctn.local('ip -6 n', capture=True) l = [line for line in out.split('\n') if ifname in line] if len(l) == 0: return False elif len(l) > 1: raise Exception('not p2p link') return 'REACHABLE' in l[0] for i in range(20): g1.local('ping6 -c 1 ff02::1%eth0') g2.local('ping6 -c 1 ff02::1%eth0') if f('eth0', g1) and f('eth0', g2): done = True break time.sleep(1) if not done: raise Exception('timeout') for a, b in combinations(ctns, 2): a.add_peer(b, interface='eth0') b.add_peer(a, interface='eth0') cls.g1 = g1 cls.g2 = g2
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65000, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g2 = GoBGPContainer(name='g2', asn=65000, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) ctns = [g1, g2] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g1.local("gobgp vrf add vrf1 rd 10:10 rt both 10:10") g2.local("gobgp vrf add vrf1 rd 10:10 rt both 10:10") for a, b in combinations(ctns, 2): a.add_peer(b, vpn=True, passwd='evpn') b.add_peer(a, vpn=True, passwd='evpn') cls.g1 = g1 cls.g2 = g2
def test_23_check_withdrawal3(self): gobgp_ctn_image_name = parser_option.gobgp_image g1 = self.gobgp g3 = GoBGPContainer(name='g3', asn=65006, router_id='192.168.0.8', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g4 = GoBGPContainer(name='g4', asn=65007, router_id='192.168.0.9', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) initial_wait_time = max(ctn.run() for ctn in [g3, g4]) time.sleep(initial_wait_time) self.quaggas = {'g3': g3, 'g4': g4} g3.local('gobgp global rib add 50.0.0.0/24') g1.add_peer(g3, passive=True) g3.add_peer(g1) g1.add_peer(g4, passive=True) g4.add_peer(g1) self.test_01_neighbor_established() self.test_02_check_gobgp_global_rib() g4.local('gobgp global rib add 50.0.0.0/24 med 10') paths = g1.get_adj_rib_out(g3, '50.0.0.0/24') self.assertEqual(len(paths), 0) paths = g1.get_adj_rib_out(g4, '50.0.0.0/24') self.assertEqual(len(paths), 1) self.assertEqual(paths[0]['source-id'], '192.168.0.8') g3.local('gobgp global rib del 50.0.0.0/24') paths = g1.get_adj_rib_out(g3, '50.0.0.0/24') self.assertEqual(len(paths), 1) self.assertEqual(paths[0]['source-id'], '192.168.0.9') paths = g1.get_adj_rib_out(g4, '50.0.0.0/24') self.assertEqual(len(paths), 0)
def test_23_check_withdrawal3(self): gobgp_ctn_image_name = parser_option.gobgp_image g1 = self.gobgp g3 = GoBGPContainer(name='g3', asn=65006, router_id='192.168.0.8', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) g4 = GoBGPContainer(name='g4', asn=65007, router_id='192.168.0.9', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) initial_wait_time = max(ctn.run() for ctn in [g3, g4]) time.sleep(initial_wait_time) self.quaggas = {'g3': g3, 'g4': g4} g3.local('gobgp global rib add 50.0.0.0/24') g1.add_peer(g3, passive=True) g3.add_peer(g1) g1.add_peer(g4, passive=True) g4.add_peer(g1) self.test_01_neighbor_established() self.test_02_check_gobgp_global_rib() g4.local('gobgp global rib add 50.0.0.0/24 med 10') paths = g1.get_adj_rib_out(g3, '50.0.0.0/24') self.assertTrue(len(paths) == 0) paths = g1.get_adj_rib_out(g4, '50.0.0.0/24') self.assertTrue(len(paths) == 1) self.assertTrue(paths[0]['source-id'] == '192.168.0.8') g3.local('gobgp global rib del 50.0.0.0/24') paths = g1.get_adj_rib_out(g3, '50.0.0.0/24') self.assertTrue(len(paths) == 1) self.assertTrue(paths[0]['source-id'] == '192.168.0.9') paths = g1.get_adj_rib_out(g4, '50.0.0.0/24') self.assertTrue(len(paths) == 0)
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65001, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g2 = GoBGPContainer(name='g2', asn=65002, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g3 = GoBGPContainer(name='g3', asn=65003, router_id='192.168.0.3', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g4 = GoBGPContainer(name='g4', asn=65004, router_id='192.168.0.4', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g5 = GoBGPContainer(name='g5', asn=65005, router_id='192.168.0.5', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g6 = GoBGPContainer(name='g6', asn=65006, router_id='192.168.0.6', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g7 = GoBGPContainer(name='g7', asn=65007, router_id='192.168.0.7', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') ctns = [g1, g2, g3, g4, g5, g6, g7] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g4.local("gobgp vrf add red rd 10:10 rt both 10:10") g4.local("gobgp vrf add blue rd 20:20 rt both 20:20") g5.local("gobgp vrf add red rd 10:10 rt both 10:10") g5.local("gobgp vrf add blue rd 20:20 rt both 20:20") g1.add_peer(g4) g4.add_peer(g1, vrf='red') g2.add_peer(g4) g4.add_peer(g2, vrf='red') g3.add_peer(g4) g4.add_peer(g3, vrf='blue') g4.add_peer(g5, vpn=True) g5.add_peer(g4, vpn=True) g5.add_peer(g6, vrf='red') g6.add_peer(g5) g5.add_peer(g7, vrf='blue') g7.add_peer(g5) cls.g1 = g1 cls.g2 = g2 cls.g3 = g3 cls.g4 = g4 cls.g5 = g5 cls.g6 = g6 cls.g7 = g7
def test_10_setup_rr_rtc_isolation_policy(self): # +-------+ # | rr | # +----------------+----| (RR) |---+----------------+ # | | +-------+ | | # | | | | # (iBGP) (iBGP) (iBGP) (iBGP) # | | | | # +-------------+ +-------------+ +-------------+ +-------------+ # | acme1 | | acme2 | | tyrell1 | | tyrell2 | # | (RR Client) | | (RR Client) | | (RR Client) | | (RR Client) | # +-------------+ +-------------+ +-------------+ +-------------+ gobgp_ctn_image_name = parser_option.gobgp_image rr = GoBGPContainer(name='rr', asn=65000, router_id='192.168.1.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) acme1 = GoBGPContainer(name='acme1', asn=65000, router_id='192.168.1.101', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) acme2 = GoBGPContainer(name='acme2', asn=65000, router_id='192.168.1.102', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) tyrell1 = GoBGPContainer(name='tyrell1', asn=65000, router_id='192.168.1.201', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) tyrell2 = GoBGPContainer(name='tyrell2', asn=65000, router_id='192.168.1.202', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level) time.sleep( max(ctn.run() for ctn in [rr, acme1, acme2, tyrell1, tyrell2])) rr.add_peer(acme1, vpn=True, addpath=True, graceful_restart=True, llgr=True, is_rr_client=True) acme1.add_peer(rr, vpn=True, addpath=True, graceful_restart=True, llgr=True) rr.add_peer(acme2, vpn=True, addpath=True, graceful_restart=True, llgr=True, is_rr_client=True) acme2.add_peer(rr, vpn=True, addpath=True, graceful_restart=True, llgr=True) rr.add_peer(tyrell1, vpn=True, addpath=True, graceful_restart=True, llgr=True, is_rr_client=True) tyrell1.add_peer(rr, vpn=True, addpath=True, graceful_restart=True, llgr=True) rr.add_peer(tyrell2, vpn=True, addpath=True, graceful_restart=True, llgr=True, is_rr_client=True) tyrell2.add_peer(rr, vpn=True, addpath=True, graceful_restart=True, llgr=True) self.__class__.rr = rr self.__class__.acme1 = acme1 self.__class__.acme2 = acme2 self.__class__.tyrell1 = tyrell1 self.__class__.tyrell2 = tyrell2 # add import/export policy to allow peers exchange routes within specific RTs # later tests should not break due to RTC Updates being filtered-out rr.local("gobgp policy neighbor add clients-acme {} {}".format( rr.peer_name(acme1), rr.peer_name(acme2))) rr.local("gobgp policy neighbor add clients-tyrell {} {}".format( rr.peer_name(tyrell1), rr.peer_name(tyrell2))) rr.local("gobgp policy ext-community add rts-acme rt:^100:.*$") rr.local("gobgp policy ext-community add rts-tyrell rt:^200:.*$") rr.local('gobgp policy statement add allow-rtc') rr.local( 'gobgp policy statement allow-rtc add condition afi-safi-in rtc') rr.local('gobgp policy statement allow-rtc add action accept') rr.local('gobgp policy statement add allow-acme') rr.local( 'gobgp policy statement allow-acme add condition neighbor clients-acme' ) rr.local( 'gobgp policy statement allow-acme add condition ext-community rts-acme' ) rr.local('gobgp policy statement allow-acme add action accept') rr.local('gobgp policy statement add allow-tyrell') rr.local( 'gobgp policy statement allow-tyrell add condition neighbor clients-tyrell' ) rr.local( 'gobgp policy statement allow-tyrell add condition ext-community rts-tyrell' ) rr.local('gobgp policy statement allow-tyrell add action accept') rr.local('gobgp policy add tenancy allow-rtc allow-acme allow-tyrell') rr.local('gobgp global policy import add tenancy default reject') rr.local('gobgp global policy export add tenancy default reject') acme1.local("gobgp vrf add a1 rd 100:100 rt both 100:100") acme2.local("gobgp vrf add a1 rd 100:100 rt both 100:100") tyrell1.local("gobgp vrf add t1 rd 200:100 rt both 200:100") tyrell2.local("gobgp vrf add t1 rd 200:100 rt both 200:100") rr.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=acme1) rr.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=acme2) rr.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=tyrell1) rr.wait_for(expected_state=BGP_FSM_ESTABLISHED, peer=tyrell2)
def setUpClass(cls): gobgp_ctn_image_name = parser_option.gobgp_image base.TEST_PREFIX = parser_option.test_prefix g1 = GoBGPContainer(name='g1', asn=65001, router_id='192.168.0.1', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g2 = GoBGPContainer(name='g2', asn=65002, router_id='192.168.0.2', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g3 = GoBGPContainer(name='g3', asn=65003, router_id='192.168.0.3', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g4 = GoBGPContainer(name='g4', asn=65004, router_id='192.168.0.4', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g5 = GoBGPContainer(name='g5', asn=65005, router_id='192.168.0.5', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g6 = GoBGPContainer(name='g6', asn=65006, router_id='192.168.0.6', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') g7 = GoBGPContainer(name='g7', asn=65007, router_id='192.168.0.7', ctn_image_name=gobgp_ctn_image_name, log_level=parser_option.gobgp_log_level, config_format='yaml') ctns = [g1, g2, g3, g4, g5, g6, g7] initial_wait_time = max(ctn.run() for ctn in ctns) time.sleep(initial_wait_time) g4.local("gobgp vrf add red rd 10:10 rt both 10:10") g4.local("gobgp vrf add blue rd 20:20 rt both 20:20") g5.local("gobgp vrf add red rd 10:10 rt both 10:10") g5.local("gobgp vrf add blue rd 20:20 rt both 20:20") g1.add_peer(g4) g4.add_peer(g1, vrf='red') g2.add_peer(g4) g4.add_peer(g2, vrf='red') g3.add_peer(g4) g4.add_peer(g3, vrf='blue') g4.add_peer(g5, vpn=True) g5.add_peer(g4, vpn=True) g5.add_peer(g6, vrf='red') g6.add_peer(g5) g5.add_peer(g7, vrf='blue') g7.add_peer(g5) cls.g1 = g1 cls.g2 = g2 cls.g3 = g3 cls.g4 = g4 cls.g5 = g5 cls.g6 = g6 cls.g7 = g7