def snappi_testbed_config(conn_graph_facts, fanout_graph_facts, duthosts, rand_one_dut_hostname, snappi_api): """ Geenrate snappi API config and port config information for the testbed Args: conn_graph_facts (pytest fixture) fanout_graph_facts (pytest fixture) duthosts (pytest fixture): list of DUTs rand_one_dut_hostname (pytest fixture): DUT hostname snappi_api(pytest fixture): Snappi API fixture Returns: - config (obj): Snappi API config of the testbed - port_config_list (list): list of port configuration information """ duthost = duthosts[rand_one_dut_hostname] """ Generate L1 config """ snappi_fanout = get_peer_snappi_chassis(conn_data=conn_graph_facts, dut_hostname=duthost.hostname) pytest_assert(snappi_fanout is not None, 'Fail to get snappi_fanout') snappi_fanout_id = list(fanout_graph_facts.keys()).index(snappi_fanout) snappi_fanout_list = SnappiFanoutManager(fanout_graph_facts) snappi_fanout_list.get_fanout_device_details( device_number=snappi_fanout_id) snappi_ports = snappi_fanout_list.get_ports(peer_device=duthost.hostname) port_speed = None """ L1 config """ config = snappi_api.config() for i in range(len(snappi_ports)): config.ports.port(name='Port {}'.format(i), location=get_snappi_port_location(snappi_ports[i])) if port_speed is None: port_speed = int(snappi_ports[i]['speed']) pytest_assert(port_speed == int(snappi_ports[i]['speed']), 'Ports have different link speeds') speed_gbps = int(port_speed / 1000) config.options.port_options.location_preemption = True l1_config = config.layer1.layer1()[-1] l1_config.name = 'L1 config' l1_config.port_names = [port.name for port in config.ports] l1_config.speed = 'speed_{}_gbps'.format(speed_gbps) l1_config.ieee_media_defaults = False l1_config.auto_negotiate = False l1_config.auto_negotiation.link_training = True l1_config.auto_negotiation.rs_fec = True pfc = l1_config.flow_control.ieee_802_1qbb pfc.pfc_delay = 0 pfc.pfc_class_0 = 0 pfc.pfc_class_1 = 1 pfc.pfc_class_2 = 2 pfc.pfc_class_3 = 3 pfc.pfc_class_4 = 4 pfc.pfc_class_5 = 5 pfc.pfc_class_6 = 6 pfc.pfc_class_7 = 7 port_config_list = [] config_result = __vlan_intf_config(config=config, port_config_list=port_config_list, duthost=duthost, snappi_ports=snappi_ports) pytest_assert(config_result is True, 'Fail to configure Vlan interfaces') config_result = __portchannel_intf_config( config=config, port_config_list=port_config_list, duthost=duthost, snappi_ports=snappi_ports) pytest_assert(config_result is True, 'Fail to configure portchannel interfaces') config_result = __l3_intf_config(config=config, port_config_list=port_config_list, duthost=duthost, snappi_ports=snappi_ports) pytest_assert(config_result is True, 'Fail to configure L3 interfaces') return config, port_config_list
def testbed_config(conn_graph_facts, fanout_graph_facts, duthost): ixia_fanout = get_peer_ixia_chassis(conn_data=conn_graph_facts, dut_hostname=duthost.hostname) pytest_require(ixia_fanout is not None, skip_message="Cannot find the peer IXIA chassis") ixia_fanout_id = list(fanout_graph_facts.keys()).index(ixia_fanout) ixia_fanout_list = IxiaFanoutManager(fanout_graph_facts) ixia_fanout_list.get_fanout_device_details(device_number=ixia_fanout_id) ixia_ports = ixia_fanout_list.get_ports(peer_device=duthost.hostname) pytest_require(len(ixia_ports) >= 2, skip_message="The test requires at least two ports") rx_id = 0 tx_id = 1 rx_port_location = get_tgen_location(ixia_ports[rx_id]) tx_port_location = get_tgen_location(ixia_ports[tx_id]) rx_port_speed = int(ixia_ports[rx_id]['speed']) tx_port_speed = int(ixia_ports[tx_id]['speed']) pytest_require(rx_port_speed == tx_port_speed, skip_message="Two ports should have the same speed") """ L1 configuration """ rx_port = Port(name='Rx Port', location=rx_port_location) tx_port = Port(name='Tx Port', location=tx_port_location) pfc = Ieee8021qbb(pfc_delay=1, pfc_class_0=0, pfc_class_1=1, pfc_class_2=2, pfc_class_3=3, pfc_class_4=4, pfc_class_5=5, pfc_class_6=6, pfc_class_7=7) flow_ctl = FlowControl(choice=pfc) auto_negotiation = AutoNegotiation(link_training=True, rs_fec=True) l1_config = Layer1(name='L1 config', speed='speed_%d_gbps' % (rx_port_speed / 1000), auto_negotiate=False, auto_negotiation=auto_negotiation, flow_control=flow_ctl, port_names=[tx_port.name, rx_port.name]) config = Config(ports=[tx_port, rx_port], layer1=[l1_config], options=Options(PortOptions(location_preemption=True))) vlan_subnet = get_vlan_subnet(duthost) pytest_assert(vlan_subnet is not None, "Fail to get Vlan subnet information") vlan_ip_addrs = get_addrs_in_subnet(vlan_subnet, 2) gw_addr = vlan_subnet.split('/')[0] prefix = vlan_subnet.split('/')[1] tx_port_ip = vlan_ip_addrs[0] rx_port_ip = vlan_ip_addrs[1] tx_gateway_ip = gw_addr rx_gateway_ip = gw_addr """ L2/L3 configuration """ tx_ipv4 = Ipv4(name='Tx Ipv4', address=Pattern(tx_port_ip), prefix=Pattern(prefix), gateway=Pattern(tx_gateway_ip), ethernet=Ethernet(name='Tx Ethernet')) config.devices.append( Device(name='Tx Device', device_count=1, container_name=tx_port.name, choice=tx_ipv4)) rx_ipv4 = Ipv4(name='Rx Ipv4', address=Pattern(rx_port_ip), prefix=Pattern(prefix), gateway=Pattern(rx_gateway_ip), ethernet=Ethernet(name='Rx Ethernet')) config.devices.append( Device(name='Rx Device', device_count=1, container_name=rx_port.name, choice=rx_ipv4)) return config
def ixia_testbed_config(conn_graph_facts, fanout_graph_facts, duthosts, rand_one_dut_hostname): """ Geenrate Tgen API config and port config information for the testbed Args: conn_graph_facts (pytest fixture) fanout_graph_facts (pytest fixture) duthosts (pytest fixture): list of DUTs rand_one_dut_hostname (pytest fixture): DUT hostname Returns: - config (obj): Tgen API config of the testbed - port_config_list (list): list of port configuration information """ duthost = duthosts[rand_one_dut_hostname] """ Generate L1 config """ ixia_fanout = get_peer_ixia_chassis(conn_data=conn_graph_facts, dut_hostname=duthost.hostname) pytest_assert(ixia_fanout is not None, 'Fail to get ixia_fanout') ixia_fanout_id = list(fanout_graph_facts.keys()).index(ixia_fanout) ixia_fanout_list = IxiaFanoutManager(fanout_graph_facts) ixia_fanout_list.get_fanout_device_details(device_number=ixia_fanout_id) ixia_ports = ixia_fanout_list.get_ports(peer_device=duthost.hostname) ports = [] port_names = [] port_speed = None for i in range(len(ixia_ports)): port = Port(name='Port {}'.format(i), location=get_tgen_location(ixia_ports[i])) ports.append(port) port_names.append(port.name) if port_speed is None: port_speed = int(ixia_ports[i]['speed']) pytest_assert(port_speed == int(ixia_ports[i]['speed']), 'Ports have different link speeds') pfc = Ieee8021qbb(pfc_delay=0, pfc_class_0=0, pfc_class_1=1, pfc_class_2=2, pfc_class_3=3, pfc_class_4=4, pfc_class_5=5, pfc_class_6=6, pfc_class_7=7) flow_ctl = FlowControl(choice=pfc) auto_negotiation = AutoNegotiation(link_training=True, rs_fec=True) speed_gbps = int(port_speed / 1000) l1_config = Layer1(name='L1 config', speed='speed_{}_gbps'.format(speed_gbps), auto_negotiate=False, auto_negotiation=auto_negotiation, ieee_media_defaults=False, flow_control=flow_ctl, port_names=port_names) config = Config(ports=ports, layer1=[l1_config], options=Options(PortOptions(location_preemption=True))) port_config_list = [] config_result = __vlan_intf_config(config=config, port_config_list=port_config_list, duthost=duthost, ixia_ports=ixia_ports) pytest_assert(config_result is True, 'Fail to configure Vlan interfaces') config_result = __portchannel_intf_config( config=config, port_config_list=port_config_list, duthost=duthost, ixia_ports=ixia_ports) pytest_assert(config_result is True, 'Fail to configure portchannel interfaces') return config, port_config_list
def ixia_testbed(conn_graph_facts, fanout_graph_facts, duthosts, rand_one_dut_hostname): """ L2/L3 Tgen API config for the T0 testbed Args: conn_graph_facts (pytest fixture) fanout_graph_facts (pytest fixture) duthosts (pytest fixture): list of DUTs rand_one_dut_hostname (pytest fixture): DUT hostname Returns: L2/L3 config for the T0 testbed """ duthost = duthosts[rand_one_dut_hostname] ixia_fanout = get_peer_ixia_chassis(conn_data=conn_graph_facts, dut_hostname=duthost.hostname) if ixia_fanout is None: return None ixia_fanout_id = list(fanout_graph_facts.keys()).index(ixia_fanout) ixia_fanout_list = IxiaFanoutManager(fanout_graph_facts) ixia_fanout_list.get_fanout_device_details(device_number=ixia_fanout_id) ixia_ports = ixia_fanout_list.get_ports(peer_device=duthost.hostname) ports = list() port_names = list() port_speed = None """ L1 config """ for i in range(len(ixia_ports)): port = Port(name='Port {}'.format(i), location=get_tgen_location(ixia_ports[i])) ports.append(port) port_names.append(port.name) if port_speed is None: port_speed = int(ixia_ports[i]['speed']) elif port_speed != int(ixia_ports[i]['speed']): """ All the ports should have the same bandwidth """ return None pfc = Ieee8021qbb(pfc_delay=0, pfc_class_0=0, pfc_class_1=1, pfc_class_2=2, pfc_class_3=3, pfc_class_4=4, pfc_class_5=5, pfc_class_6=6, pfc_class_7=7) flow_ctl = FlowControl(choice=pfc) auto_negotiation = AutoNegotiation(link_training=True, rs_fec=True) l1_config = Layer1(name='L1 config', speed='speed_%d_gbps' % int(port_speed / 1000), auto_negotiate=False, auto_negotiation=auto_negotiation, ieee_media_defaults=False, flow_control=flow_ctl, port_names=port_names) config = Config(ports=ports, layer1=[l1_config], options=Options(PortOptions(location_preemption=True))) """ L2/L3 config """ vlan_subnet = get_vlan_subnet(duthost) if vlan_subnet is None: return None vlan_ip_addrs = get_addrs_in_subnet(vlan_subnet, len(ixia_ports)) gw_addr = vlan_subnet.split('/')[0] prefix = vlan_subnet.split('/')[1] for i in range(len(ixia_ports)): ip_stack = Ipv4(name='Ipv4 {}'.format(i), address=Pattern(vlan_ip_addrs[i]), prefix=Pattern(prefix), gateway=Pattern(gw_addr), ethernet=Ethernet(name='Ethernet {}'.format(i))) device = Device(name='Device {}'.format(i), device_count=1, container_name=port_names[i], choice=ip_stack) config.devices.append(device) return config
def test_testbed(conn_graph_facts, duthosts, rand_one_dut_hostname, fanout_graph_facts, ixia_api_server_session, fanouthosts): duthost = duthosts[rand_one_dut_hostname] logger.info("Connection Graph Facts = %s " % (conn_graph_facts)) logger.info("Fanout Graph facts = %s" % (fanout_graph_facts)) logger.info("DUT hostname = %s" % (duthost.hostname)) ixia_fanout = get_peer_ixia_chassis(conn_data=conn_graph_facts, dut_hostname=duthost.hostname) pytest_require(ixia_fanout is not None, skip_message="Cannot find the peer IXIA chassis") ixia_fanout_id = list(fanout_graph_facts.keys()).index(ixia_fanout) ixia_fanout_list = IxiaFanoutManager(fanout_graph_facts) ixia_fanout_list.get_fanout_device_details(device_number=ixia_fanout_id) logger.info("Configuring ports.") port_list = ixia_fanout_list.get_ports(peer_device=duthost.hostname) session = ixia_api_server_session vports = configure_ports(session=session, port_list=port_list) subnet = get_vlan_subnet(duthost) gw = subnet.split('/')[0] ip_list = get_addrs_in_subnet(subnet=subnet, number_of_ip=len(vports)) logger.info("Creating topology.") topo_receiver = create_topology(session=session, name="Receiver", port_list=[vports[0]], ip_list=[ip_list[0]], gw_list=[gw]) topo_sender = create_topology(session=session, name="Sender", port_list=vports[1:], ip_list=ip_list[1:], gw_list=[gw] * len(vports[1:])) logger.info("Starting all protocols") start_protocols(session) # Create a traffic item logger.info("Configuring traffic.") traffic_item = create_ipv4_traffic(session=session, name="Test Data Traffic", source=topo_sender, destination=topo_receiver) # Generate, apply and start traffic. start_traffic(session) logger.info("run traffic for 5 seconds") time.sleep(5) # Fetch per-flow statistics. stats = dump_flow_statistics(session=session) logger.info(stats) stop_traffic(session) stop_protocols(session)
def tgen_ports(duthost, conn_graph_facts, fanout_graph_facts): """ Populate tgen ports info of T0 testbed and returns as a list Args: duthost (pytest fixture): duthost fixture conn_graph_facts (pytest fixture): connection graph fanout_graph_facts (pytest fixture): fanout graph Return: [{'card_id': '1', 'ip': '22.1.1.2', 'ipv6': '3001::2', 'ipv6_prefix': u'64', 'location': '10.36.78.238;1;2', 'peer_device': 'sonic-s6100-dut', 'peer_ip': u'22.1.1.1', 'peer_ipv6': u'3001::1', 'peer_port': 'Ethernet8', 'port_id': '2', 'prefix': u'24', 'speed': 'speed_400_gbps'}, {'card_id': '1', 'ip': '21.1.1.2', 'ipv6': '2001::2', 'ipv6_prefix': u'64', 'location': '10.36.78.238;1;1', 'peer_device': 'sonic-s6100-dut', 'peer_ip': u'21.1.1.1', 'peer_ipv6': u'2001::1', 'peer_port': 'Ethernet0', 'port_id': '1', 'prefix': u'24', 'speed': 'speed_400_gbps'}] """ speed_type = { '50000': 'speed_50_gbps', '100000': 'speed_100_gbps', '200000': 'speed_200_gbps', '400000': 'speed_400_gbps' } snappi_fanout = get_peer_snappi_chassis(conn_data=conn_graph_facts, dut_hostname=duthost.hostname) snappi_fanout_id = list(fanout_graph_facts.keys()).index(snappi_fanout) snappi_fanout_list = SnappiFanoutManager(fanout_graph_facts) snappi_fanout_list.get_fanout_device_details( device_number=snappi_fanout_id) snappi_ports = snappi_fanout_list.get_ports(peer_device=duthost.hostname) port_speed = None for i in range(len(snappi_ports)): if port_speed is None: port_speed = int(snappi_ports[i]['speed']) elif port_speed != int(snappi_ports[i]['speed']): """ All the ports should have the same bandwidth """ return None config_facts = duthost.config_facts(host=duthost.hostname, source="running")['ansible_facts'] for port in snappi_ports: port['location'] = get_snappi_port_location(port) port['speed'] = speed_type[port['speed']] try: for port in snappi_ports: peer_port = port['peer_port'] int_addrs = config_facts['INTERFACE'][peer_port].keys() ipv4_subnet = [ele for ele in int_addrs if "." in ele][0] if not ipv4_subnet: raise Exception( "IPv4 is not configured on the interface {}".format( peer_port)) port['peer_ip'], port['prefix'] = ipv4_subnet.split("/") port['ip'] = get_addrs_in_subnet(ipv4_subnet, 1)[0] ipv6_subnet = [ele for ele in int_addrs if ":" in ele][0] if not ipv6_subnet: raise Exception( "IPv6 is not configured on the interface {}".format( peer_port)) port['peer_ipv6'], port['ipv6_prefix'] = ipv6_subnet.split("/") port['ipv6'] = get_ipv6_addrs_in_subnet(ipv6_subnet, 1)[0] except: raise Exception('Configure IPv4 and IPv6 on DUT interfaces') return snappi_ports