async def test_tgen_link_speed_change(testbed): """ # setup the traffic with link across the infra switches # bring down all the links between the infra that are 10G links # set the speec on the inter infra links to reduced speed # send traffic at line rate and check the rate at recieving end. """ tgen_dev, infra_devices = await tgen_utils_get_dent_devices_with_tgen( testbed, [DeviceType.INFRA_SWITCH], 1) if not tgen_dev or not infra_devices or len(infra_devices) < 2: testbed.applog.info( "The testbed does not have enough dent with tgen connections or infra devices with tgen connections" ) return # pick two devices infra_devices = infra_devices[:2] # get the links between the two infra devices infra1 = infra_devices[0] infra2 = infra_devices[1] # there has to be intra infra links if infra2.host_name not in infra1.links_dict: tgen_dev.applog.info( f"The two infras {infra1.host_name} and {infra2.host_name} are not connected to each other." ) return await tb_reload_nw_and_flush_firewall(infra_devices) for dd in infra_devices: # bring down the links that are 10g links for swp in range(49, 53): link = f"swp{swp}" out = await IpLink.set(input_data=[{ dd.host_name: [{ "device": link, "operstate": "down" }] }], ) assert out[0][dd.host_name][ "rc"] == 0, f"Failed to down the link {link} {out}" devices_info = {} for dd in infra_devices: devices_info[dd.host_name] = [ # 'count' is the number of endpoints { "vlan": 100, "name": "Mgmt", "count": 1, }, ] await tgen_utils_create_devices_and_connect(tgen_dev, infra_devices, devices_info, need_vlan=False) src = [] dst = [] for dd in infra_devices: swp = tgen_dev.links_dict[dd.host_name][1][0] # just need one link on each infra src.append(f"{dd.host_name}_Mgmt_{swp}") dst.append(f"{dd.host_name}_Mgmt_{swp}") # infra to infra traffic streams streams = { "tcp_ssh_mgmt_flow": { "ip_source": src, "ip_destination": dst, "protocol": "ip", "ipproto": "tcp", "dstPort": "22", "rate": 40000, "frameSize": 512, }, } await tgen_utils_setup_streams( tgen_dev, pytest._args.config_dir + f"/{tgen_dev.host_name}/tgen_vlan_streams", streams, force_update=True, ) speeds = [1000, 100, 10] rx_rates = [3, 1, 0] # in kpps duration = 30 for speed, rate in zip(speeds, rx_rates): # set the speed on the inter infra link for swp in infra1.links_dict[infra2.host_name][0]: out = Ethtool.set(input_data=[{ infra1.host_name: [{ "devname": swp, "speed": speed, "autoneg": "on" }] }], ) infra1.applog.info(out) await tgen_utils_start_traffic(tgen_dev) time.sleep(duration) await tgen_utils_stop_traffic(tgen_dev) stats = await tgen_utils_get_traffic_stats(tgen_dev, "Flow Statistics") # add verification logic here. for crow in stats.Rows: cti = crow["Traffic Item"] pair = crow["Source/Dest Value Pair"] rx_rate = float(crow["Rx Frames"]) / duration tx_rate = float(crow["Tx Frames"]) / duration tgen_dev.applog.info( f"CTI {cti} pair {pair} Rx Rate {rx_rate} pps Tx Rate {tx_rate} pps" ) if int(rx_rate / 10000) != rate: assert 0, f"Rate does not match {rx_rate} {rate}" await tgen_utils_stop_protocols(tgen_dev) # bring back up the links for dd in infra_devices: # bring down the links that are 10g links for swp in range(49, 53): link = f"swp{swp}" out = await IpLink.set(input_data=[{ dd.host_name: [{ "device": link, "operstate": "up" }] }], ) assert out[0][ dd.host_name]["rc"] == 0, f"Failed to up the link {link} {out}"
def test_that_ethtool_set(capfd): dv1 = TestDevice(platform="dentos") dv2 = TestDevice(platform="dentos") loop = asyncio.get_event_loop() out = loop.run_until_complete( Ethtool.set( input_data=[{ # device 1 "test_dev": [{}], }], device_obj={"test_dev": dv1}, )) print(out) assert "command" in out[0]["test_dev"].keys() assert "result" in out[0]["test_dev"].keys() # check the rc assert out[0]["test_dev"]["rc"] == 0 loop = asyncio.get_event_loop() out = loop.run_until_complete( Ethtool.set( input_data=[{ # device 1 "test_dev1": [ { # command 1 "devname": "cwwmnkao", "options": "oxfsuamb", }, { # command 2 "devname": "isjjwtid", "options": "smlqfxrg", }, ], }], device_obj={ "test_dev1": dv1, "test_dev2": dv2 }, )) print(out) # check if the command was formed assert "command" in out[0]["test_dev1"].keys() # check if the result was formed assert "result" in out[0]["test_dev1"].keys() # check the rc assert out[0]["test_dev1"]["rc"] == 0 loop = asyncio.get_event_loop() out = loop.run_until_complete( Ethtool.set( input_data=[{ # device 1 "test_dev1": [{ "devname": "cwwmnkao", "options": "oxfsuamb", }], # device 2 "test_dev2": [{ "devname": "isjjwtid", "options": "smlqfxrg", }], }], device_obj={ "test_dev1": dv1, "test_dev2": dv2 }, )) print(out) # check if the command was formed assert "command" in out[0]["test_dev1"].keys() assert "command" in out[1]["test_dev2"].keys() # check if the result was formed assert "result" in out[0]["test_dev1"].keys() assert "result" in out[1]["test_dev2"].keys() # check the rc assert out[0]["test_dev1"]["rc"] == 0 assert out[1]["test_dev2"]["rc"] == 0