def get_routing_table(self, neighbor_address, target_prefix, retry=3, interval=-1): if interval < 0: interval = self.wait_per_retry print "check route %s on quagga : %s" % (target_prefix, neighbor_address) retry_count = 0 # quagga cli doesn't show prefix's netmask quagga_prefix = target_prefix.split('/')[0] while True: tn = qaccess.login(neighbor_address) q_rib = qaccess.show_rib(tn) qaccess.logout(tn) for q_path in q_rib: if quagga_prefix == q_path['Network']: return q_path retry_count += 1 if retry_count > retry: break else: print "target_prefix %s is none" % target_prefix print "wait (" + str(interval) + " seconds)" time.sleep(interval) print "route : %s is none" % target_prefix return None
def check_community(self, neighbor_address, target_addr, community, retry=3, interval=-1, af=IPv4): if interval < 0: interval = self.wait_per_retry print "check route %s on quagga : %s" % (target_addr, neighbor_address) retry_count = 0 while True: tn = qaccess.login(neighbor_address) result = qaccess.check_community(tn, target_addr, community, af) qaccess.logout(tn) if result: return True else: print "target path %s with community %s is none" % ( target_addr, community) retry_count += 1 if retry_count > retry: break else: print "wait (" + str(interval) + " seconds)" time.sleep(interval) return False
def get_route(self, neighbor_address, target_prefix, retry=3, interval=-1, af=IPv4): if interval < 0: interval = self.wait_per_retry print "check route %s on quagga : %s" % (target_prefix, neighbor_address) retry_count = 0 while True: tn = qaccess.login(neighbor_address) q_rib = qaccess.lookup_prefix(tn, target_prefix, af) qaccess.logout(tn) for q_path in q_rib: if target_prefix == q_path['Network']: return q_path retry_count += 1 if retry_count > retry: break else: print "target_prefix %s is none" % target_prefix print "wait (" + str(interval) + " seconds)" time.sleep(interval) print "route : %s is none" % target_prefix return None
def check_med(self, neighbor_address, target_addr, med, retry=3, interval=-1, af=IPv4): if interval < 0: interval = self.wait_per_retry print "check route %s on quagga : %s" % (target_addr, neighbor_address) retry_count = 0 while True: tn = qaccess.login(neighbor_address) result = qaccess.check_med(tn, target_addr, med, af) qaccess.logout(tn) if result: return True else: print "target path %s with med %s is none" % (target_addr, med) retry_count += 1 if retry_count > retry: break else: print "wait (" + str(interval) + " seconds)" time.sleep(interval) return False
def test_04_export_policy_update(self): # initialize test environment # policy_pattern:p4 attaches a policy to reject route # 192.168.2.0/24, 192.168.20.0/24, 192.168.200.0/24 # coming from peer2(10.0.0.2) to peer3(10.0.0.3)'s export-policy. self.initialize(policy_pattern="p4") # add other network tn = qaccess.login(peer2) print "add network 192.168.20.0/24" qaccess.add_network(tn, 65002, prefix2) print "add network 192.168.200.0/24" qaccess.add_network(tn, 65002, prefix3) qaccess.logout(tn) addresses = self.get_neighbor_address(self.gobgp_config) self.retry_routine_for_state(addresses, "BGP_FSM_ESTABLISHED") time.sleep(self.initial_wait_time) def path_exists_in_localrib(peer, prefix,r=10): paths = self.get_paths_in_localrib(peer, prefix, retry=r) return paths is not None def path_exists_in_routing_table(peer, prefix,r=10): qpath = self.get_routing_table(peer, prefix, retry=r) return qpath is not None def path_exists_in_adj_rib_in(peer, prefix,r=10): path = self.get_adj_rib_in(peer, prefix, retry=r) return path is not None def path_exists_in_adj_rib_out(peer, prefix,r=10): path = self.get_adj_rib_out(peer, prefix, retry=r) return path is not None self.assertTrue(path_exists_in_localrib(peer1,prefix1)) self.assertTrue(path_exists_in_localrib(peer1,prefix2)) self.assertTrue(path_exists_in_localrib(peer1,prefix3)) # check peer3 local-rib self.assertTrue(path_exists_in_localrib(peer3,prefix1)) self.assertTrue(path_exists_in_localrib(peer3,prefix2)) self.assertTrue(path_exists_in_localrib(peer3,prefix3)) # check peer3 rib-out self.assertTrue(path_exists_in_adj_rib_out(peer3,prefix1)) self.assertFalse(path_exists_in_adj_rib_out(peer3,prefix2,r=3)) self.assertFalse(path_exists_in_adj_rib_out(peer3,prefix3,r=3)) # check show ip bgp on peer1(quagga1) self.assertTrue(path_exists_in_routing_table(peer1, prefix1)) self.assertTrue(path_exists_in_routing_table(peer1, prefix2)) self.assertTrue(path_exists_in_routing_table(peer1, prefix3)) # check show ip bgp on peer3(quagga3) self.assertTrue(path_exists_in_routing_table(peer3, prefix1)) self.assertFalse(path_exists_in_routing_table(peer3, prefix2,r=3)) self.assertFalse(path_exists_in_routing_table(peer3, prefix3,r=0)) # check adj-rib-out in peer2 peer2 = "10.0.0.2" self.assertTrue(path_exists_in_adj_rib_in(peer2, prefix1)) self.assertTrue(path_exists_in_adj_rib_in(peer2, prefix2)) self.assertTrue(path_exists_in_adj_rib_in(peer2, prefix3)) # update policy print "update_policy_config" fab.update_policy_config(parser_option.go_path, policy_pattern="p4") time.sleep(self.initial_wait_time) # soft reset print "soft_reset" self.soft_reset(peer2, IPv4) # check local-rib self.assertTrue(path_exists_in_localrib(peer3,prefix1)) self.assertTrue(path_exists_in_localrib(peer3,prefix2)) self.assertTrue(path_exists_in_localrib(peer3,prefix3)) # check local-adj-out-rib self.assertTrue(path_exists_in_adj_rib_out(peer3, prefix1)) self.assertFalse(path_exists_in_adj_rib_out(peer3, prefix2,r=3)) self.assertTrue(path_exists_in_adj_rib_out(peer3, prefix3)) # check show ip bgp on peer3(quagga3) self.assertTrue(path_exists_in_routing_table(peer3, prefix1)) self.assertFalse(path_exists_in_routing_table(peer3, prefix2,r=3)) self.assertTrue(path_exists_in_routing_table(peer3, prefix3))
def test_04_export_policy_update(self): # initialize test environment # policy_pattern:p4 attaches a policy to reject route # 192.168.2.0/24, 192.168.20.0/24, 192.168.200.0/24 # coming from peer2(10.0.0.2) to peer3(10.0.0.3)'s export-policy. self.initialize(policy_pattern="p4") # add other network tn = qaccess.login(peer2) print "add network 192.168.20.0/24" qaccess.add_network(tn, 65002, prefix2) print "add network 192.168.200.0/24" qaccess.add_network(tn, 65002, prefix3) qaccess.logout(tn) addresses = self.get_neighbor_address(self.gobgp_config) self.retry_routine_for_state(addresses, "BGP_FSM_ESTABLISHED") time.sleep(self.initial_wait_time) def path_exists_in_localrib(peer, prefix, r=10): paths = self.get_paths_in_localrib(peer, prefix, retry=r) return paths is not None def path_exists_in_routing_table(peer, prefix, r=10): qpath = self.get_routing_table(peer, prefix, retry=r) return qpath is not None def path_exists_in_adj_rib_in(peer, prefix, r=10): path = self.get_adj_rib_in(peer, prefix, retry=r) return path is not None def path_exists_in_adj_rib_out(peer, prefix, r=10): path = self.get_adj_rib_out(peer, prefix, retry=r) return path is not None self.assertTrue(path_exists_in_localrib(peer1, prefix1)) self.assertTrue(path_exists_in_localrib(peer1, prefix2)) self.assertTrue(path_exists_in_localrib(peer1, prefix3)) # check peer3 local-rib self.assertTrue(path_exists_in_localrib(peer3, prefix1)) self.assertTrue(path_exists_in_localrib(peer3, prefix2)) self.assertTrue(path_exists_in_localrib(peer3, prefix3)) # check peer3 rib-out self.assertTrue(path_exists_in_adj_rib_out(peer3, prefix1)) self.assertFalse(path_exists_in_adj_rib_out(peer3, prefix2, r=3)) self.assertFalse(path_exists_in_adj_rib_out(peer3, prefix3, r=3)) # check show ip bgp on peer1(quagga1) self.assertTrue(path_exists_in_routing_table(peer1, prefix1)) self.assertTrue(path_exists_in_routing_table(peer1, prefix2)) self.assertTrue(path_exists_in_routing_table(peer1, prefix3)) # check show ip bgp on peer3(quagga3) self.assertTrue(path_exists_in_routing_table(peer3, prefix1)) self.assertFalse(path_exists_in_routing_table(peer3, prefix2, r=3)) self.assertFalse(path_exists_in_routing_table(peer3, prefix3, r=0)) # check adj-rib-out in peer2 peer2 = "10.0.0.2" self.assertTrue(path_exists_in_adj_rib_in(peer2, prefix1)) self.assertTrue(path_exists_in_adj_rib_in(peer2, prefix2)) self.assertTrue(path_exists_in_adj_rib_in(peer2, prefix3)) # update policy print "update_policy_config" fab.update_policy_config(parser_option.go_path, policy_pattern="p4") time.sleep(self.initial_wait_time) # soft reset print "soft_reset" self.soft_reset(peer2, IPv4) # check local-rib self.assertTrue(path_exists_in_localrib(peer3, prefix1)) self.assertTrue(path_exists_in_localrib(peer3, prefix2)) self.assertTrue(path_exists_in_localrib(peer3, prefix3)) # check local-adj-out-rib self.assertTrue(path_exists_in_adj_rib_out(peer3, prefix1)) self.assertFalse(path_exists_in_adj_rib_out(peer3, prefix2, r=3)) self.assertTrue(path_exists_in_adj_rib_out(peer3, prefix3)) # check show ip bgp on peer3(quagga3) self.assertTrue(path_exists_in_routing_table(peer3, prefix1)) self.assertFalse(path_exists_in_routing_table(peer3, prefix2, r=3)) self.assertTrue(path_exists_in_routing_table(peer3, prefix3))