From f0e128d535567733f77b7f8bb76842325a2d8e6b Mon Sep 17 00:00:00 2001 From: Stepan Vovk Date: Mon, 31 Jul 2023 15:07:15 +0000 Subject: [PATCH 1/6] Fix L1, LACP, and STP tests Signed-off-by: Stepan Vovk --- .../test_suite/functional/L1/test_l1_config.py | 2 +- .../lacp/test_lacp_distribution_over_ecmp.py | 5 +++-- .../lacp/test_lacp_loopback_detection.py | 9 +++++++-- .../lacp/test_lacp_routing_over_bridge.py | 2 +- .../lacp/test_lacp_routing_over_lacp.py | 4 +++- .../lacp/test_lacp_routing_over_vlan_device.py | 6 ++++-- ...t_lacp_traffic_during_topology_convergence.py | 16 +++++++++++----- .../functional/stp/test_stp_loopback.py | 10 ++++++++-- 8 files changed, 38 insertions(+), 16 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py index 2c9df0f67..f1f9ab8ae 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py @@ -90,7 +90,7 @@ async def test_l1_settings_(testbed, l1_settings): await tgen_utils_update_l1_config(tgen_dev, tg_port, speed=speed, autoneg=True, duplex=duplex) except AssertionError as e: pytest.skip(f'TGen does not support requested mode\n{e}') - await asyncio.sleep(20) # wait needed in case port was down before + await asyncio.sleep(40) # wait needed in case port was down before out = await Ethtool.show(input_data=[{device_host_name: [{'devname': port}]}], parse_output=True) assert out[0][device_host_name]['rc'] == 0, 'Failed getting port duplex, speed.' diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_distribution_over_ecmp.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_distribution_over_ecmp.py index aa3c1bc24..a00006324 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_distribution_over_ecmp.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_distribution_over_ecmp.py @@ -56,6 +56,7 @@ async def test_lacp_ecmp_distribution_over_lag(testbed): tgen_lag_2 = ('LAG_1', [tg_ports[1]]) tgen_lag_3 = ('LAG_2', tg_ports[2:]) rate = 10000 + tolerance = 0.10 # 1. Enable IPv4 forwarding # 2. Create 3 bonds @@ -142,7 +143,7 @@ async def test_lacp_ecmp_distribution_over_lag(testbed): if row['Port Name'] not in tgen_lag_3[1]: continue err_msg = f'Expected packets {row["Valid Frames Rx."]}, actual packets: {tx_packets / 4}' - assert isclose(int(row['Valid Frames Rx.']), tx_packets / 4, rel_tol=0.05), err_msg + assert isclose(int(row['Valid Frames Rx.']), tx_packets / 4, rel_tol=tolerance), err_msg total_received = sum([int(row['Valid Frames Rx.']) for row in stats.Rows]) - assert isclose(total_received, tx_packets, rel_tol=0.05),\ + assert isclose(total_received, tx_packets, rel_tol=tolerance),\ f'Expected packets {total_received}, actual packets: {tx_packets}' diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_loopback_detection.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_loopback_detection.py index c84b93a7e..a335bd131 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_loopback_detection.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_loopback_detection.py @@ -4,6 +4,7 @@ from dent_os_testbed.lib.ip.ip_link import IpLink from dent_os_testbed.lib.mstpctl.mstpctl import Mstpctl +from dent_os_testbed.lib.ethtool.ethtool import Ethtool from dent_os_testbed.utils.test_utils.tgen_utils import (tgen_utils_get_dent_devices_with_tgen, tgen_utils_setup_streams, tgen_utils_start_traffic, @@ -45,6 +46,7 @@ async def test_lacp_loopback_detection(testbed, version): bonds[f'bond_{idx+1}'] = port bridge = 'bridge_1' wait_time = 40 if version == 'stp' else 20 + expected_rate = 0.14 # multiplied by port speed # 1. Create bridge entities and 6 bonds and set link up on them out = await IpLink.add(input_data=[{dent: [{'device': bond, @@ -123,6 +125,9 @@ async def test_lacp_loopback_detection(testbed, version): await tgen_utils_stop_traffic(tgen_dev) # 7. Verify device remain stable afterwards (during storming). + out = await Ethtool.show(input_data=[{dent: [{'devname': dut_ixia_ports[2]}]}], parse_output=True) + speed = int(out[0][dent]['parsed_output']['speed'][:-4]) + expected_rate = int(expected_rate * speed) rc, out = await device.run_cmd("echo 'Hello World'") assert rc == 0, 'FAIL: DUT crashed due to storming' assert out.strip() == 'Hello World', f'Expected got {out}' @@ -131,8 +136,8 @@ async def test_lacp_loopback_detection(testbed, version): # Verify there is storming for row in stats.Rows: if row['Port Name'] == tg_ports[0]: - err_msg = f'Expected 1400 got : {float(row["Rx. Rate (Mbps)"])}' - assert float(row['Rx. Rate (Mbps)']) > 1400, err_msg + err_msg = f'Expected {expected_rate} got : {float(row["Rx. Rate (Mbps)"])}' + assert float(row['Rx. Rate (Mbps)']) > expected_rate, err_msg # 8. Set bridge stp_state to 1. out = await IpLink.set(input_data=[{dent: [{ diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_bridge.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_bridge.py index 8e31a28f2..5cbea357f 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_bridge.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_bridge.py @@ -147,4 +147,4 @@ async def test_lacp_routing_over_bridge(testbed): stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') for row in stats.Rows: err_msg = f"Expected 0.00 loss, actual {float(row['Loss %'])}" - assert tgen_utils_get_loss(row) == 0.000, err_msg + assert tgen_utils_get_loss(row) < 0.1, err_msg diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_lacp.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_lacp.py index d4d385545..5139b88cb 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_lacp.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_lacp.py @@ -1,4 +1,6 @@ import asyncio +from math import isclose + import pytest from dent_os_testbed.lib.ip.ip_link import IpLink @@ -139,5 +141,5 @@ async def test_lacp_routing_over_lacp(testbed): stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') for row in stats.Rows: err_msg = f"Expected 0.00 loss, actual {float(row['Loss %'])}" - assert tgen_utils_get_loss(row) == 0.000, err_msg + assert isclose(tgen_utils_get_loss(row), 0.00, abs_tol=0.1), err_msg await tgen_utils_stop_traffic(tgen_dev) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_vlan_device.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_vlan_device.py index c364601a6..58c0d3cbf 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_vlan_device.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_routing_over_vlan_device.py @@ -1,4 +1,6 @@ import asyncio +from math import isclose + import pytest from dent_os_testbed.lib.ip.ip_link import IpLink @@ -12,9 +14,9 @@ tgen_utils_dev_groups_from_config, tgen_utils_get_traffic_stats, tgen_utils_setup_streams, - tgen_utils_get_loss, tgen_utils_start_traffic, tgen_utils_get_swp_info, + tgen_utils_get_loss, ) pytestmark = [pytest.mark.suite_functional_lacp, pytest.mark.asyncio, @@ -167,4 +169,4 @@ async def test_lacp_routing_over_vlan_device(testbed): stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') for row in stats.Rows: err_msg = f"Expected 0.00 loss, actual {float(row['Loss %'])}" - assert tgen_utils_get_loss(row) == 0.000, err_msg + assert isclose(tgen_utils_get_loss(row), 0.00, abs_tol=0.1), err_msg diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_traffic_during_topology_convergence.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_traffic_during_topology_convergence.py index 45e5565dd..2afdc51c1 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_traffic_during_topology_convergence.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/lacp/test_lacp_traffic_during_topology_convergence.py @@ -4,6 +4,7 @@ from dent_os_testbed.lib.ip.ip_link import IpLink from dent_os_testbed.lib.mstpctl.mstpctl import Mstpctl +from dent_os_testbed.lib.ethtool.ethtool import Ethtool from dent_os_testbed.utils.test_utils.tgen_utils import (tgen_utils_get_dent_devices_with_tgen, tgen_utils_setup_streams, tgen_utils_start_traffic, @@ -12,7 +13,7 @@ tgen_utils_traffic_generator_connect, ) pytestmark = [pytest.mark.suite_functional_lacp, pytest.mark.asyncio, - pytest.mark.usefixtures('cleanup_tgen', 'cleanup_bonds', 'cleanup_bridges')] + pytest.mark.usefixtures('cleanup_tgen', 'cleanup_bonds', 'cleanup_bridges', 'enable_mstpd')] @pytest.mark.parametrize('version', ['stp', 'rstp']) @@ -60,6 +61,7 @@ async def test_lacp_traffic_during_topology_convergence(testbed, version): bridge_names = list(bridges.keys()) tolerance = 0.15 wait_time = 40 if 'version' == 'stp' else 20 + expected_rate = 0.14 # multiplied by port speed # 1. Create 3 bridge entities and 6 bonds and set link up on them out = await IpLink.add(input_data=[{dent: [{'device': bond, 'type': 'bond', @@ -147,13 +149,17 @@ async def test_lacp_traffic_during_topology_convergence(testbed, version): rc, out = await device.run_cmd("echo 'Hello World'") assert rc == 0, 'FAIL: DUT crashed due to storming' assert out.strip() == 'Hello World', f'Expected got {out}' + await asyncio.sleep(wait_time) # 7. Verify there is a storming + out = await Ethtool.show(input_data=[{dent: [{'devname': dut_tgen_ports[2]}]}], parse_output=True) + speed = int(out[0][dent]['parsed_output']['speed'][:-4]) + expected_rate = round(int(expected_rate * speed), 2) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Port Statistics') for row in stats.Rows: if row['Port Name'] in tg_ports[:2]: - err_msg = 'Expected 1400 got : {float(row["Rx. Rate (Mbps)"])}' - assert float(row['Rx. Rate (Mbps)']) > 1400, err_msg + err_msg = f'Expected {int(expected_rate * speed)} got : {float(row["Rx. Rate (Mbps)"])}' + assert float(row['Rx. Rate (Mbps)']) > expected_rate, err_msg # 8. Set bridge stp_state to 1. out = await IpLink.set(input_data=[{dent: [{ @@ -228,8 +234,8 @@ async def test_lacp_traffic_during_topology_convergence(testbed, version): stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Port Statistics') for row in stats.Rows: if row['Port Name'] == tg_ports[1]: - err_msg = 'Expected 1400 got : {float(row["Rx. Rate (Mbps)"])}' - assert isclose(float(row['Rx. Rate (Mbps)']), 1400, rel_tol=tolerance), err_msg + err_msg = f'Expected 1400 got : {float(row["Rx. Rate (Mbps)"])}' + assert isclose(float(row['Rx. Rate (Mbps)']), expected_rate, rel_tol=tolerance), err_msg # 16. Stop the traffic. Verify there is no storming await tgen_utils_stop_traffic(tgen_dev) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_loopback.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_loopback.py index fc892ad61..f6841c5c2 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_loopback.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_loopback.py @@ -4,6 +4,7 @@ from dent_os_testbed.lib.ip.ip_link import IpLink from dent_os_testbed.lib.mstpctl.mstpctl import Mstpctl +from dent_os_testbed.lib.ethtool.ethtool import Ethtool from dent_os_testbed.utils.test_utils.tgen_utils import (tgen_utils_get_dent_devices_with_tgen, tgen_utils_setup_streams, tgen_utils_start_traffic, @@ -45,6 +46,7 @@ async def test_stp_loopback_detection(testbed, version): loopback_ports = {} for idx, port in enumerate(device.links_dict[dent][0] + device.links_dict[dent][1]): loopback_ports[f'loopback_{idx+1}'] = port + expected_rate = 0.14 # multiplied by port speed # 1. Create bridge entity out = await IpLink.add(input_data=[{dent: [{ @@ -114,12 +116,16 @@ async def test_stp_loopback_detection(testbed, version): assert rc == 0, 'FAIL: DUT crashed due to storming' assert out.strip() == 'Hello World', f'Expected got {out}' + out = await Ethtool.show(input_data=[{dent: [{'devname': dut_ixia_ports[2]}]}], parse_output=True) + speed = int(out[0][dent]['parsed_output']['speed'][:-4]) + expected_rate = round(int(expected_rate * speed), 2) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Port Statistics') + # Verify there is storming for row in stats.Rows: if row['Port Name'] == tg_ports[0]: - err_msg = f'Expected 1400 got : {float(row["Rx. Rate (Mbps)"])}' - assert float(row['Rx. Rate (Mbps)']) > 1400, err_msg + err_msg = f'Expected {int(expected_rate * speed)} got : {float(row["Rx. Rate (Mbps)"])}' + assert float(row['Rx. Rate (Mbps)']) > expected_rate, err_msg # 8. Set bridge stp_state to 1. out = await IpLink.set(input_data=[{dent: [{ From 4ef519200f56ac6b6d21d8e968d2eb9e4abc8972 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Thu, 3 Aug 2023 08:27:08 +0000 Subject: [PATCH 2/6] Fix L1 config test Check that only 1 port supports the required speed. Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/L1/test_l1_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py index f1f9ab8ae..f42509c18 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_config.py @@ -49,7 +49,7 @@ async def test_l1_settings_(testbed, l1_settings): await asyncio.sleep(10) try: - await tb_get_qualified_ports(dent_devices[0], tgen_dev.links_dict[device_host_name][1], speed, duplex, required_ports=1) + await tb_get_qualified_ports(dent_devices[0], [port], speed, duplex, required_ports=1) except ValueError as e: pytest.skip(str(e)) From b0def732b61c58945584d6711b38cb709dc5c77f Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Wed, 2 Aug 2023 16:32:51 +0000 Subject: [PATCH 3/6] Fix IPv6 nh state test Make sure tgen is not oversubscribed. Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/ipv6/test_ipv6_route.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_route.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_route.py index 5f6158c92..169a04c97 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_route.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_route.py @@ -439,7 +439,7 @@ async def test_ipv6_nh_state(testbed): 'type': 'raw', 'protocol': 'ipv6', 'ip_source': dev_groups[tg_ports[0]][0]['name'], - 'rate': 10, # % + 'rate': 5, # % 'frame_rate_type': 'line_rate', 'srcMac': '02:00:00:00:00:01', 'dstMac': dut_mac[tg_to_swp[tg_ports[0]]], From a8d0b9d668f8827909e1720472d2576cd13a76ed Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Tue, 8 Aug 2023 10:09:14 +0000 Subject: [PATCH 4/6] Fix STP off on test Tgen needs more time to calculate the correct traffic rate. Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/stp/test_stp_with_traffic.py | 1 + 1 file changed, 1 insertion(+) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_with_traffic.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_with_traffic.py index b7a24bbda..dfec5d39f 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_with_traffic.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/stp/test_stp_with_traffic.py @@ -332,6 +332,7 @@ async def test_stp_switching_off_on(testbed, version): # 7. Verify traffic is forwarded and port 2 doesn't receive any traffic stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') + await asyncio.sleep(10) for row in stats.Rows: if row['Traffic Item'] == traffic and row['Rx Port'] == tg_ports[1]: err_msg = f'Expected 0.0 got : {float(row["Rx Rate (Mbps)"])}' From b71ded6e5d62a24e29596d88519580ab3df5bb2c Mon Sep 17 00:00:00 2001 From: Francisco <74398368+fkwilken@users.noreply.github.com> Date: Tue, 8 Aug 2023 15:08:14 -0700 Subject: [PATCH 5/6] Optimize VPort Addition, Protocol Timing (#386) Signed-off-by: fkwilken --- .../ixnetwork/ixnetwork_ixia_client_impl.py | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/traffic/ixnetwork/ixnetwork_ixia_client_impl.py b/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/traffic/ixnetwork/ixnetwork_ixia_client_impl.py index ab2f4c619..5ea5c5ae7 100644 --- a/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/traffic/ixnetwork/ixnetwork_ixia_client_impl.py +++ b/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/traffic/ixnetwork/ixnetwork_ixia_client_impl.py @@ -4,7 +4,7 @@ from dent_os_testbed.lib.traffic.ixnetwork.ixnetwork_ixia_client import IxnetworkIxiaClient from ixnetwork_restpy.assistants.statistics.statviewassistant import StatViewAssistant as SVA -from ixnetwork_restpy import SessionAssistant, Files +from ixnetwork_restpy import SessionAssistant, Files, BatchAdd, BatchFind class IxnetworkIxiaClientImpl(IxnetworkIxiaClient): @@ -105,10 +105,20 @@ def run_connect(self, device, command, *argv, **kwarg): swp_ports = param['swp_ports'] dev_groups = param['dev_groups'] + # Batch Add all ixia ports to prevent 1 at a time restarting + with BatchAdd(IxnetworkIxiaClientImpl.ixnet): + for port in ixia_ports: + IxnetworkIxiaClientImpl.ixnet.Vport.add(Name=port, Location=port.replace(':', ';')) + # Batch Find to retrieve list of added port objects + with BatchFind(IxnetworkIxiaClientImpl.ixnet) as bf: + IxnetworkIxiaClientImpl.ixnet.Vport.find() + # Use Batch Find results to create name-addressable vport dict + vport_objects = {vport.Name: vport for vport in bf.results.vport} + vports = {} - for port, sport in zip(ixia_ports, swp_ports): - # Specify Location on Port Add to simplify assignment - vports[port] = (IxnetworkIxiaClientImpl.ixnet.Vport.add(Name=port, Location=port.replace(':', ';')), sport) + for port, swp_port in zip(ixia_ports, swp_ports): + # Vports dict uses port name to store vport object and swp port name + vports[port] = (vport_objects[port], swp_port) device.applog.info('Assigning ports') IxnetworkIxiaClientImpl.ixnet.AssignPorts(True) @@ -762,7 +772,12 @@ def run_protocol(self, device, command, *argv, **kwarg): if command == 'start_protocols': device.applog.info('Starting All Protocols') IxnetworkIxiaClientImpl.ixnet.StartAllProtocols(Arg1='sync') - time.sleep(15) + # Check that Protocols are Started and Up + protocolsSummary = SVA(IxnetworkIxiaClientImpl.ixnet, 'Protocols Summary') + device.applog.info('Waiting for Protocols for up to 20 seconds') + protocolsSummary.CheckCondition('Sessions Not Started', SVA.EQUAL, 0, Timeout=10, RaiseException=False) + protocolsSummary.CheckCondition('Sessions Down', SVA.EQUAL, 0, Timeout=10, RaiseException=False) + for ep in IxnetworkIxiaClientImpl.ip_eps: device.applog.info('Sending ARP on ' + ep.Name) ep.Start() From b5f27e2a0710eb938bab6b7e350cf830e6475c1e Mon Sep 17 00:00:00 2001 From: Francisco <74398368+fkwilken@users.noreply.github.com> Date: Tue, 8 Aug 2023 15:19:03 -0700 Subject: [PATCH 6/6] Pr fix dockerfile (#10) (#388) * Fix Password Policy for CI (#384) Fix Dockerfile Run Naming * Fix Docker Container Naming --------- Signed-off-by: fkwilken --- .../DentOsTestbed/Requirements.txt | 2 +- .../DentOsTestbedLib/Requirements.txt | 1 - DentOS_Framework/Dockerfile.base | 2 +- DentOS_Framework/Dockerfile.dev | 8 ++--- DentOS_Framework/Dockerfile.testing | 34 ------------------- DentOS_Framework/run.sh | 6 ++-- 6 files changed, 9 insertions(+), 44 deletions(-) delete mode 100644 DentOS_Framework/Dockerfile.testing diff --git a/DentOS_Framework/DentOsTestbed/Requirements.txt b/DentOS_Framework/DentOsTestbed/Requirements.txt index cc5e1a009..e7ccfdfc7 100644 --- a/DentOS_Framework/DentOsTestbed/Requirements.txt +++ b/DentOS_Framework/DentOsTestbed/Requirements.txt @@ -7,5 +7,5 @@ pytest pytest-asyncio pytest-html pytest-repeat -ixnetwork_restpy +ixnetwork_restpy>=1.1.10 pyvis == 0.1.9 diff --git a/DentOS_Framework/DentOsTestbedLib/Requirements.txt b/DentOS_Framework/DentOsTestbedLib/Requirements.txt index 9565fea93..e323ffa7f 100644 --- a/DentOS_Framework/DentOsTestbedLib/Requirements.txt +++ b/DentOS_Framework/DentOsTestbedLib/Requirements.txt @@ -1,3 +1,2 @@ pyyaml pykwalify -ixnetwork_restpy diff --git a/DentOS_Framework/Dockerfile.base b/DentOS_Framework/Dockerfile.base index 70c9f14c7..a690f1d9a 100644 --- a/DentOS_Framework/Dockerfile.base +++ b/DentOS_Framework/Dockerfile.base @@ -3,7 +3,7 @@ FROM ubuntu:jammy ARG DEBIAN_FRONTEND=noninteractive ENV TZ=US/Pacific -RUN apt-get -o Acquire::Check-Valid-Until=false update +RUN apt-get update RUN apt-get -y upgrade # Are those packages used anywhere? diff --git a/DentOS_Framework/Dockerfile.dev b/DentOS_Framework/Dockerfile.dev index 72de663c2..29cc13493 100644 --- a/DentOS_Framework/Dockerfile.dev +++ b/DentOS_Framework/Dockerfile.dev @@ -20,11 +20,11 @@ RUN pip3 install --no-cache-dir pdbpp==0.10.3 WORKDIR /DENT/DentOsTestbed # Install each time DentOS Framework to use the latest changes from GIT -RUN printf "#!/bin/bash\nDENT_PACKAGES=(\"/DENT/DentOsTestbed\" \"/DENT/DentOsTestbedDiscovery\" \"/DENT/DentOsTestbedLib\")\n" > /entrypoint.sh -RUN printf "pip3 cache purge" >> /entrypoint.sh -RUN printf "[ -z $SKIP_INSTALL ] && for pkg in \${DENT_PACKAGES[@]}; do cd \$pkg; pip3 install --no-cache-dir --root-user-action=ignore .; done" >> /entrypoint.sh +RUN echo "#!/bin/bash\nDENT_PACKAGES=(\"/DENT/DentOsTestbed\" \"/DENT/DentOsTestbedDiscovery\" \"/DENT/DentOsTestbedLib\")\n" > /entrypoint.sh +RUN echo "pip3 cache purge" >> /entrypoint.sh +RUN echo "[ -z $SKIP_INSTALL ] && for pkg in \${DENT_PACKAGES[@]}; do cd \$pkg; pip3 install --no-cache-dir --root-user-action=ignore .; done" >> /entrypoint.sh # `pip3 install --editable` does not work for the packages from above -RUN printf "cd /DENT/DentOsTestbed\n\$@\n" >> /entrypoint.sh +RUN echo "cd /DENT/DentOsTestbed\n\$@\n" >> /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] diff --git a/DentOS_Framework/Dockerfile.testing b/DentOS_Framework/Dockerfile.testing deleted file mode 100644 index f2fd87313..000000000 --- a/DentOS_Framework/Dockerfile.testing +++ /dev/null @@ -1,34 +0,0 @@ -FROM dent-testing-base:latest - -ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get -o Acquire::Check-Valid-Until=false update -RUN apt-get install -y \ - vim \ - iputils-ping - -RUN pip3 install --no-cache-dir pdbpp==0.10.3 - -# --editable does not work with those packages -# Once it is fixed, we will be able to simplify entrypoint -# RUN --mount=type=bind,target=/DENT/DentOsTestbed,source=DentOsTestbed,rw \ -# cd /DENT/DentOsTestbed && pip3 install --editable . -# RUN --mount=type=bind,target=/DENT/DentOsTestbedDiscovery,source=DentOsTestbedDiscovery,rw \ -# cd /DENT/DentOsTestbedDiscovery && pip3 install --editable . -# RUN --mount=type=bind,target=/DENT/DentOsTestbedLib,source=DentOsTestbedLib,rw \ -# cd /DENT/DentOsTestbedLib && pip3 install --editable . - -WORKDIR /DENT/DentOsTestbed - -# Install each time DentOS Framework to use the latest changes from GIT -RUN printf "#!/bin/bash\nDENT_PACKAGES=(\"/DENT/DentOsTestbed\" \"/DENT/DentOsTestbedDiscovery\" \"/DENT/DentOsTestbedLib\")\n" > /entrypoint.sh -RUN printf "pip3 cache purge" >> /entrypoint.sh -RUN printf "[ -z $SKIP_INSTALL ] && for pkg in \${DENT_PACKAGES[@]}; do cd \$pkg; pip3 install --no-cache-dir --root-user-action=ignore .; done" >> /entrypoint.sh -# `pip3 install --editable` does not work for the packages from above -RUN printf "cd /DENT/DentOsTestbed\n\$@\n" >> /entrypoint.sh -RUN chmod +x /entrypoint.sh - -ENTRYPOINT ["/entrypoint.sh"] - -LABEL author="Anton Putria " -LABEL version="1.0" -LABEL description="DENT env for testing" diff --git a/DentOS_Framework/run.sh b/DentOS_Framework/run.sh index b2f3a11a2..63598e66c 100755 --- a/DentOS_Framework/run.sh +++ b/DentOS_Framework/run.sh @@ -8,10 +8,10 @@ SCRIPT_DIR=$(dirname "$0") DOCKERFILE_DIR=$SCRIPT_DIR # Build base image -docker build -f "$DOCKERFILE_DIR"/Dockerfile -t dent-testing-base:latest . +docker build -f "$DOCKERFILE_DIR"/Dockerfile.base -t dent/test-framework-base:latest . # Build working image -docker build -f "$DOCKERFILE_DIR"/Dockerfile.testing -t dent-testing:latest . +docker build -f "$DOCKERFILE_DIR"/Dockerfile.auto -t dent/test-framework-dev:latest . if [ -n "$1" ]; then COMMAND="$*" @@ -23,5 +23,5 @@ docker run \ --mount=type=bind,target=/DENT/DentOsTestbedDiscovery,source="$PWD"/DentOsTestbedDiscovery \ --mount=type=bind,target=/DENT/DentOsTestbedLib,source="$PWD"/DentOsTestbedLib \ --name dent-testing-"$USER" \ - dent-testing:latest \ + dent/test-framework-dev:latest \ "$COMMAND"