def bgpmon_setup_info(duthost): """ Get initial setup info for BGPMONITOR """ peer_addr = generate_ip_through_default_route(duthost) pytest_assert(peer_addr, "Failed to generate ip address for test") peer_addr = str(IPNetwork(peer_addr).ip) mg_facts = duthost.minigraph_facts(host=duthost.hostname)['ansible_facts'] local_addr = mg_facts['minigraph_lo_interfaces'][0]['addr'] return peer_addr, local_addr, str(mg_facts['minigraph_bgp_asn'])
def common_setup_teardown(duthost, ptfhost): peer_addr = generate_ip_through_default_route(duthost) pytest_assert(peer_addr, "Failed to generate ip address for test") peer_addr = str(IPNetwork(peer_addr).ip) peer_ports = get_default_route_ports(duthost) mg_facts = duthost.minigraph_facts(host=duthost.hostname)['ansible_facts'] local_addr = mg_facts['minigraph_lo_interfaces'][0]['addr'] # Assign peer addr to an interface on ptf logger.info("Generated peer address {}".format(peer_addr)) bgpmon_args = { 'db_table_name': 'BGP_MONITORS', 'peer_addr': peer_addr, 'asn': mg_facts['minigraph_bgp_asn'], 'local_addr': local_addr, 'peer_name': BGP_MONITOR_NAME } bgpmon_template = Template(open(BGPMON_TEMPLATE_FILE).read()) duthost.copy(content=bgpmon_template.render(**bgpmon_args), dest=BGPMON_CONFIG_FILE) yield local_addr, peer_addr, peer_ports, mg_facts['minigraph_bgp_asn'] # Cleanup bgp monitor duthost.shell("redis-cli -n 4 -c DEL 'BGP_MONITORS|{}'".format(peer_addr)) duthost.file(path=BGPMON_CONFIG_FILE, state='absent')
def bgpmon_tc1_ip_change(duthost, bgpmon_setup_info): """ Test to replace bgpmon ip address """ peer_addr, local_addr, bgp_asn = bgpmon_setup_info peer_addr_replaced = generate_ip_through_default_route(duthost, [IPNetwork(peer_addr).ip]) peer_addr_replaced = str(IPNetwork(peer_addr_replaced).ip) json_patch = [ { "op": "remove", "path": "/BGP_MONITORS/{}".format(peer_addr) }, { "op": "add", "path": "/BGP_MONITORS/{}".format(peer_addr_replaced), "value": { "admin_status": "up", "asn": bgp_asn, "holdtime": "180", "keepalive": "60", "local_addr": local_addr, "name": "BGPMonitor", "nhopself": "0", "rrclient": "0" } } ] tmpfile = generate_tmpfile(duthost) logger.info("tmpfile {}".format(tmpfile)) try: output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile) expect_op_success(duthost, output) check_bgpmon_with_addr(duthost, peer_addr_replaced) finally: delete_tmpfile(duthost, tmpfile)
def verify_upstream_traffic(host, ptfadapter, tbinfo, itfs, server_ip, pkt_num=100, drop=False): """ @summary: Helper function for verifying upstream packets @param host: The dut host @param ptfadapter: The ptfadapter fixture @param tbinfo: The tbinfo fixture @param ifts: The interface name on DUT @param server_ip: The IP address of server @param pkt_num: The number of packets to generete and tx @param drop: Packets are expected to be dropped if drop is True, and vice versa @return: No return value. An exception will be raised if verify fails. """ random_ip = generate_ip_through_default_route(host).split('/')[0] vlan_table = host.get_running_config_facts()['VLAN'] vlan_name = list(vlan_table.keys())[0] vlan_mac = host.get_dut_iface_mac(vlan_name) router_mac = host.facts['router_mac'] # Generate packets from server to a random IP address, which goes default routes pkt = testutils.simple_ip_packet(eth_dst=vlan_mac, ip_src=server_ip, ip_dst=random_ip) # Generate packet forwarded to portchannels pkt_copy = pkt.copy() pkt_copy[Ether].src = router_mac exp_pkt = mask.Mask(pkt_copy) exp_pkt.set_do_not_care_scapy(Ether, "dst") exp_pkt.set_do_not_care_scapy(IP, "dst") exp_pkt.set_do_not_care_scapy(IP, "ihl") exp_pkt.set_do_not_care_scapy(IP, "tos") exp_pkt.set_do_not_care_scapy(IP, "len") exp_pkt.set_do_not_care_scapy(IP, "id") exp_pkt.set_do_not_care_scapy(IP, "flags") exp_pkt.set_do_not_care_scapy(IP, "frag") exp_pkt.set_do_not_care_scapy(IP, "ttl") exp_pkt.set_do_not_care_scapy(IP, "proto") exp_pkt.set_do_not_care_scapy(IP, "chksum") exp_pkt.set_ignore_extra_bytes() port_channels = get_t1_ptf_pc_ports(host, tbinfo) rx_ports = [] for v in port_channels.values(): rx_ports += v rx_ports = [int(x.strip('eth')) for x in rx_ports] mg_facts = host.get_extended_minigraph_facts(tbinfo) tx_port = mg_facts['minigraph_ptf_indices'][itfs] logger.info( "Verifying upstream traffic. packet number = {} interface = {} server_ip = {} expect_drop = {}" .format(pkt_num, itfs, server_ip, drop)) for i in range(0, pkt_num): ptfadapter.dataplane.flush() testutils.send(ptfadapter, tx_port, pkt, count=1) if drop: testutils.verify_no_packet_any(ptfadapter, exp_pkt, rx_ports) else: testutils.verify_packet_any_port(ptfadapter, exp_pkt, rx_ports)