From 4141fb395e76fc5ece324af15a0d182a2d184b35 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Fri, 19 May 2023 12:25:56 +0300 Subject: [PATCH 01/18] Make broadcast key optional broadcast is not always present in ip addr output Signed-off-by: Serhiy Boiko --- .../src/dent_os_testbed/utils/test_utils/tgen_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tgen_utils.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tgen_utils.py index 1150544fb..3feeb5118 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tgen_utils.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tgen_utils.py @@ -53,7 +53,8 @@ async def _get_iface_addr_info(dd, iface, info): if addr['family'] == 'inet' and addr['scope'] == 'global': info['ip'] = addr['local'].split('.') info['plen'] = addr['prefixlen'] - info['broadcast'] = addr['broadcast'].split('.') + if 'broadcast' in addr: + info['broadcast'] = addr['broadcast'].split('.') return True dd.applog.info('Cannot find the Vlan GW IP address') return False From 22fa8c601bf4216ea8fdeba1bd9546464a2c26a1 Mon Sep 17 00:00:00 2001 From: Andriy Lozovyy Date: Fri, 19 May 2023 14:38:14 +0300 Subject: [PATCH 02/18] Reduce amount of running coroutines in Devlink tests Devlink tests may fail from time to time with 15 task executed in parallel by asyncio, reduce amount of executed tasks to increase test stability Signed-off-by: Andriy Lozovyy --- .../functional/devlink/test_devlink_interact.py | 9 ++++++--- .../test_suite/functional/devlink/test_devlink_sct.py | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_interact.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_interact.py index 04775462a..8fc238353 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_interact.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_interact.py @@ -493,9 +493,12 @@ async def test_devlink_interact_sct_lag(testbed): continue coroutines_cpu_stat.append(verify_cpu_traps_rate_code_avg(dent_dev, sct['cpu_code'], sct['exp'], logs=True)) coroutines_devlink.append(verify_devlink_cpu_traps_rate_avg(dent_dev, trap_name, sct['exp'], logs=True)) - # Asyncio may fail when starting 30 tasks on DUT in parallel, separate them into chunks of 15 tasks - await asyncio.gather(*coroutines_cpu_stat) - await asyncio.gather(*coroutines_devlink) + # Asyncio may fail even with 15 tasks executed in parallel, separate coroutines into chunks of 7-8 tasks + tasks_slice = len(coroutines_cpu_stat) // 2 + await asyncio.gather(*coroutines_cpu_stat[:tasks_slice]) + await asyncio.gather(*coroutines_cpu_stat[tasks_slice:]) + await asyncio.gather(*coroutines_devlink[:tasks_slice]) + await asyncio.gather(*coroutines_devlink[tasks_slice:]) # 6.Add rule created earlier to trap user defined traffic out = await TcQdisc.add( diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_sct.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_sct.py index 98e7736ac..91583cec3 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_sct.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_sct.py @@ -141,9 +141,12 @@ async def test_devlink_sct_basic_ports(testbed, ports_num): deviation = 0.25 if sct['exp'] <= 200 and ports_num == 4 else DEVIATION coroutines_cpu_stat.append(verify_cpu_traps_rate_code_avg(dent_dev, sct['cpu_code'], sct['exp'], deviation=deviation, logs=True)) coroutines_devlink.append(verify_devlink_cpu_traps_rate_avg(dent_dev, trap_name, sct['exp'], deviation=deviation, logs=True)) - # Asyncio may fail when starting 30 tasks on DUT in parallel, separate them into chunks of 15 tasks - await asyncio.gather(*coroutines_cpu_stat) - await asyncio.gather(*coroutines_devlink) + # Asyncio may fail even with 15 tasks executed in parallel, separate coroutines into chunks of 7-8 tasks + tasks_slice = len(coroutines_cpu_stat) // 2 + await asyncio.gather(*coroutines_cpu_stat[:tasks_slice]) + await asyncio.gather(*coroutines_cpu_stat[tasks_slice:]) + await asyncio.gather(*coroutines_devlink[:tasks_slice]) + await asyncio.gather(*coroutines_devlink[tasks_slice:]) # 6.Add rule created earlier to trap user defined traffic for port_indx in range(ports_num): From f2bc36a67f5bdb045bc7f876fb6fd14474cb8408 Mon Sep 17 00:00:00 2001 From: Kostiantyn Stavruk Date: Fri, 19 May 2023 16:09:58 +0300 Subject: [PATCH 03/18] Add wait, corrections Signed-off-by: Kostiantyn Stavruk --- .../test_bridging_admin_state_down_up.py | 3 +-- .../bridging/test_bridging_ageing.py | 6 +++--- .../bridging/test_bridging_forwarding.py | 18 +++++++++++------- .../bridging/test_bridging_jumbo_frame.py | 4 ++-- .../bridging/test_bridging_static_entries.py | 2 +- ....py => test_bridging_unreg_traffic_ipv6.py} | 14 +++++++++----- .../test_port_isolation_basic_functionality.py | 2 ++ ...port_isolation_incremental_mac_addresses.py | 2 ++ ...t_isolation_interaction_ports_inside_lag.py | 2 ++ ...n_interaction_route_between_vlan_devices.py | 14 ++++++++------ ...rt_isolation_interaction_vlan_membership.py | 2 ++ .../storm_control/storm_control_utils.py | 2 +- ...m_control_rule_set_for_br_and_mc_traffic.py | 8 ++++---- ...ntrol_rule_set_for_br_and_unk_uc_traffic.py | 8 ++++---- ...est_storm_negative_known_unicast_traffic.py | 3 ++- 15 files changed, 54 insertions(+), 36 deletions(-) rename DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/{test_bridging_unregistered_traffic_ipv6.py => test_bridging_unreg_traffic_ipv6.py} (93%) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_admin_state_down_up.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_admin_state_down_up.py index e7b4abbef..773d4d3d2 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_admin_state_down_up.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_admin_state_down_up.py @@ -128,9 +128,8 @@ async def test_bridging_admin_state_down_up(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: - assert float(row['Tx Frames']) > 0.000, f'Failed>Ixia should transmit traffic: {row["Tx Frames"]}' assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_ageing.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_ageing.py index f327a8381..588913978 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_ageing.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_ageing.py @@ -111,7 +111,7 @@ async def test_bridging_ageing_refresh(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -130,7 +130,7 @@ async def test_bridging_ageing_refresh(testbed): await tgen_utils_start_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -151,7 +151,7 @@ async def test_bridging_ageing_refresh(testbed): await asyncio.sleep(2*ageing_time) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_forwarding.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_forwarding.py index c290d6d11..e091b0cf3 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_forwarding.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_forwarding.py @@ -116,7 +116,7 @@ async def test_bridging_backward_forwarding(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" @@ -316,7 +316,7 @@ async def test_bridging_forward_block_different_packets(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -403,7 +403,7 @@ async def test_bridging_fdb_flush_on_down(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -576,6 +576,7 @@ async def test_bridging_unregistered_traffic(testbed): traffic_duration = 10 mac_count = 1500 pps_value = 1000 + wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -652,9 +653,10 @@ async def test_bridging_unregistered_traffic(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -668,9 +670,10 @@ async def test_bridging_unregistered_traffic(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" @@ -684,9 +687,10 @@ async def test_bridging_unregistered_traffic(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -772,7 +776,7 @@ async def test_bridging_wrong_fcs(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert float(row['Tx Frames']) > 0.000, f'Failed>Ixia should transmit traffic: {row["Tx Frames"]}' assert tgen_utils_get_loss(row) == 100.000, \ diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_jumbo_frame.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_jumbo_frame.py index 95fed8942..51e839cd7 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_jumbo_frame.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_jumbo_frame.py @@ -125,7 +125,7 @@ async def test_bridging_frame_max_size(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -346,7 +346,7 @@ async def test_bridging_jumbo_frame_value_out_of_bounds(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_static_entries.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_static_entries.py index 7046d2091..06b88ca67 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_static_entries.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_static_entries.py @@ -114,7 +114,7 @@ async def test_bridging_static_entries(testbed): await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_unregistered_traffic_ipv6.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_unreg_traffic_ipv6.py similarity index 93% rename from DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_unregistered_traffic_ipv6.py rename to DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_unreg_traffic_ipv6.py index 1ece5aade..f1cbedf83 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_unregistered_traffic_ipv6.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_unreg_traffic_ipv6.py @@ -22,9 +22,9 @@ ] -async def test_bridging_unregistered_traffic_ipv6(testbed): +async def test_bridging_unreg_traffic_ipv6(testbed): """ - Test Name: test_bridging_unregistered_traffic_ipv6 + Test Name: test_bridging_unreg_traffic_ipv6 Test Suite: suite_functional_bridging Test Overview: Verify bridge flooding behaviour of unregistered IPv6 packets. Test Author: Kostiantyn Stavruk @@ -54,6 +54,7 @@ async def test_bridging_unregistered_traffic_ipv6(testbed): traffic_duration = 10 mac_count = 65000 pps_value = 30000 + wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -139,9 +140,10 @@ async def test_bridging_unregistered_traffic_ipv6(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" @@ -155,9 +157,10 @@ async def test_bridging_unregistered_traffic_ipv6(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" @@ -171,9 +174,10 @@ async def test_bridging_unregistered_traffic_ipv6(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 0.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} forwarded.\n{out}" diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_basic_functionality.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_basic_functionality.py index e26c4ce28..78525670c 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_basic_functionality.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_basic_functionality.py @@ -56,6 +56,7 @@ async def test_port_isolation_basic_functionality(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 15 pps_value = 1000 + wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -156,6 +157,7 @@ async def test_port_isolation_basic_functionality(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) if x == 0: expected_loss = { diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_incremental_mac_addresses.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_incremental_mac_addresses.py index a533faabf..313e15854 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_incremental_mac_addresses.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_incremental_mac_addresses.py @@ -57,6 +57,7 @@ async def test_port_isolation_incremental_mac_addresses(testbed): pps_value = 4000 mac_count = 5000 tolerance = 0.8 + wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -167,6 +168,7 @@ async def test_port_isolation_incremental_mac_addresses(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) if x == 0: expected_loss = { diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_ports_inside_lag.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_ports_inside_lag.py index a65981544..dc61e0b54 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_ports_inside_lag.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_ports_inside_lag.py @@ -52,6 +52,7 @@ async def test_port_isolation_interaction_ports_inside_lag(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 15 pps_value = 1000 + wait = 6 for x in range(2): out = await IpLink.add( @@ -159,6 +160,7 @@ async def test_port_isolation_interaction_ports_inside_lag(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) if x == 1: expected_loss = { diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_route_between_vlan_devices.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_route_between_vlan_devices.py index 13cfcc6fb..7aae2550b 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_route_between_vlan_devices.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_route_between_vlan_devices.py @@ -113,12 +113,12 @@ async def test_port_isolation_interaction_route_between_vlan_devices(testbed): ip_route_entries = out[0][device_host_name]['parsed_output'] offload_flag = str([en['flags'] for en in ip_route_entries if 'flags' in en]).strip("]'[") err_msg = 'Verify the offload flag appears in VLAN-device default routes.' - assert offload_flag == 'rt_trap', err_msg + assert 'rt_trap' in offload_flag, err_msg address_map = ( # swp port, tg port, tg ip, gw, plen (ports[0], tg_ports[0], '1.1.1.2', '1.1.1.1', 24), - (ports[1], tg_ports[1], '1.1.1.3', '1.1.1.1', 24) + (ports[1], tg_ports[1], '2.2.2.3', '2.2.2.1', 24) ) dev_groups = tgen_utils_dev_groups_from_config( @@ -130,8 +130,8 @@ async def test_port_isolation_interaction_route_between_vlan_devices(testbed): """ Set up the following streams: - — stream_0 — | — stream_1 — - swp1 -> swp4 | swp2 -> swp4 + — vlan_10 — | — vlan_11 — + swp1 -> swp2 | swp2 -> swp1 """ streams = { @@ -145,7 +145,8 @@ async def test_port_isolation_interaction_route_between_vlan_devices(testbed): 'frameSize': 150, 'rate': pps_value, 'protocol': '0x0800', - 'type': 'raw' + 'type': 'raw', + 'vlanID': 10 }, 'vlan_11': { 'ip_source': dev_groups[tg_ports[1]][0]['name'], @@ -157,7 +158,8 @@ async def test_port_isolation_interaction_route_between_vlan_devices(testbed): 'frameSize': 150, 'rate': pps_value, 'protocol': '0x0800', - 'type': 'raw' + 'type': 'raw', + 'vlanID': 11 } } diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py index 9fd192500..90f7846f3 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py @@ -56,6 +56,7 @@ async def test_port_isolation_interaction_vlan_membership(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 pps_value = 1000 + wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -172,6 +173,7 @@ async def test_port_isolation_interaction_vlan_membership(testbed): await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(wait) if x == 2: expected_loss = { diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/storm_control_utils.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/storm_control_utils.py index 3b1a14325..9367af18c 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/storm_control_utils.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/storm_control_utils.py @@ -60,7 +60,7 @@ async def verify_expected_rx_rate(kbyte_value, stats, rx_ports, deviation=0.10): rx_name = port.split('_')[0] res = math.isclose(exp_rate, float(collected[rx_name]['rx_rate']), rel_tol=deviation) assert res, f"The rate is not limited by storm control, \ - actual rate {float(collected[rx_name]['rx_rate'])} istead of {exp_rate}." + actual rate {float(collected[rx_name]['rx_rate'])} instead of {exp_rate}." async def tc_filter_add(dev, vlan_id, src_mac, dst_mac, rate, burst, device_host_name=True): diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_mc_traffic.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_mc_traffic.py index 98c8c3acc..3c98fd210 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_mc_traffic.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_mc_traffic.py @@ -154,12 +154,12 @@ async def test_storm_control_rule_set_for_br_and_mc_traffic(testbed): assert math.isclose(kbyte_value_bc*1000, float(collected['stream_1']['rx_rate']), rel_tol=deviation), \ f"The rate is not limited by storm control, \ - actual rate {kbyte_value_bc*1000} istead of {float(collected['stream_1']['rx_rate'])}." + actual rate {kbyte_value_bc*1000} instead of {float(collected['stream_1']['rx_rate'])}." for x in range(2): assert math.isclose(float(collected[f'stream_{x+2}']['tx_rate']), float(collected[f'stream_{x+2}']['rx_rate']), rel_tol=deviation), \ f"The rate is limited by storm control, actual rate {float(collected[f'stream_{x+2}']['tx_rate'])} \ - istead of {float(collected[f'stream_{x+2}']['rx_rate'])}." + instead of {float(collected[f'stream_{x+2}']['rx_rate'])}." await devlink_rate_value(dev=f'pci/0000:01:00.0/{ports[0].replace("swp","")}', name='bc_kbyte_per_sec_rate', value=0, @@ -179,10 +179,10 @@ async def test_storm_control_rule_set_for_br_and_mc_traffic(testbed): float(collected[f'stream_{1 if x==0 else 3}']['rx_rate']), rel_tol=deviation), \ f"The rate is limited by storm control, actual rate \ {float(collected[f'stream_{1 if x==0 else 3}']['tx_rate'])} \ - istead of {float(collected[f'stream_{1 if x==0 else 3}']['rx_rate'])}." + instead of {float(collected[f'stream_{1 if x==0 else 3}']['rx_rate'])}." assert math.isclose(kbyte_value_mc*1000, float(collected['stream_2']['rx_rate']), rel_tol=deviation), \ f"The rate is not limited by storm control, \ - actual rate {kbyte_value_mc*1000} istead of {float(collected['stream_2']['rx_rate'])}." + actual rate {kbyte_value_mc*1000} instead of {float(collected['stream_2']['rx_rate'])}." finally: await tgen_utils_stop_traffic(tgen_dev) await cleanup_kbyte_per_sec_rate_value(dent_dev, tgen_dev, all_values=True) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_unk_uc_traffic.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_unk_uc_traffic.py index 4ac320429..31e7fad32 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_unk_uc_traffic.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_control_rule_set_for_br_and_unk_uc_traffic.py @@ -154,12 +154,12 @@ async def test_storm_control_rule_set_for_br_and_unk_uc_traffic(testbed): assert math.isclose(kbyte_value_bc*1000, float(collected['stream_1']['rx_rate']), rel_tol=deviation), \ f"The rate is not limited by storm control, \ - actual rate {kbyte_value_bc*1000} istead of {float(collected['stream_1']['rx_rate'])}." + actual rate {kbyte_value_bc*1000} instead of {float(collected['stream_1']['rx_rate'])}." for x in range(2): assert math.isclose(float(collected[f'stream_{x+2}']['tx_rate']), float(collected[f'stream_{x+2}']['rx_rate']), rel_tol=deviation), \ f"The rate is limited by storm control, actual rate {float(collected[f'stream_{x+2}']['tx_rate'])} \ - istead of {float(collected[f'stream_{x+2}']['rx_rate'])}." + instead of {float(collected[f'stream_{x+2}']['rx_rate'])}." await devlink_rate_value(dev=f'pci/0000:01:00.0/{ports[0].replace("swp","")}', name='bc_kbyte_per_sec_rate', value=0, @@ -178,10 +178,10 @@ async def test_storm_control_rule_set_for_br_and_unk_uc_traffic(testbed): assert math.isclose(float(collected[f'stream_{x+1}']['tx_rate']), float(collected[f'stream_{x+1}']['rx_rate']), rel_tol=deviation), \ f"The rate is limited by storm control, actual rate {float(collected[f'stream_{x+1}']['tx_rate'])} \ - istead of {float(collected[f'stream_{x+1}']['rx_rate'])}." + instead of {float(collected[f'stream_{x+1}']['rx_rate'])}." assert math.isclose(kbyte_value_unk_uc*1000, float(collected['stream_3']['rx_rate']), rel_tol=deviation), \ f"The rate is not limited by storm control, \ - actual rate {kbyte_value_unk_uc*1000} istead of {float(collected['stream_3']['rx_rate'])}." + actual rate {kbyte_value_unk_uc*1000} instead of {float(collected['stream_3']['rx_rate'])}." finally: await tgen_utils_stop_traffic(tgen_dev) await cleanup_kbyte_per_sec_rate_value(dent_dev, tgen_dev, bc=True, unk_uc=True) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_negative_known_unicast_traffic.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_negative_known_unicast_traffic.py index 75cb27628..a88f361bc 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_negative_known_unicast_traffic.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/storm_control/test_storm_negative_known_unicast_traffic.py @@ -132,6 +132,7 @@ async def test_storm_negative_known_unicast_traffic(testbed): # check the traffic stats stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Port Statistics') + tx_rate = rx_rate = 0 collected = {row['Port Name']: {'tx_rate': row['Bytes Tx. Rate'], 'rx_rate': row['Bytes Rx. Rate']} for row in stats.Rows} for key in collected: @@ -141,7 +142,7 @@ async def test_storm_negative_known_unicast_traffic(testbed): tx_rate = collected[key]['tx_rate'] res = math.isclose(float(tx_rate), float(rx_rate), rel_tol=deviation) assert res, f'The rate is limited by storm control, \ - actual rate {float(rx_rate)} istead of {float(tx_rate)}.' + actual rate {float(rx_rate)} instead of {float(tx_rate)}.' out = await BridgeFdb.delete( input_data=[{device_host_name: [ From dee12cef82806927aee17b7357e7fcf60b1e7313 Mon Sep 17 00:00:00 2001 From: Andriy Lozovyy Date: Fri, 19 May 2023 18:08:17 +0300 Subject: [PATCH 04/18] Add xt action in TcFilter and refactor Devlink tests Add missing xt action in linux_tc_filter_impl.py and refactor Devlink tests Signed-off-by: Andriy Lozovyy --- .../devlink/test_devlink_shared_block.py | 22 +++++---------- .../devlink/test_devlink_single_block.py | 27 +++++-------------- .../lib/tc/linux/linux_tc_filter_impl.py | 4 +++ 3 files changed, 17 insertions(+), 36 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_shared_block.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_shared_block.py index 11e2c2309..e395be2ec 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_shared_block.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_shared_block.py @@ -7,10 +7,8 @@ from dent_os_testbed.lib.tc.tc_qdisc import TcQdisc from dent_os_testbed.lib.tc.tc_filter import TcFilter from dent_os_testbed.test.test_suite.functional.devlink.devlink_utils import ( - verify_cpu_traps_rate_code_avg, - verify_devlink_cpu_traps_rate_avg, randomize_rule_by_src_dst_field, - CPU_STAT_CODE_ACL_CODE_3, CPU_MAX_PPS) + verify_cpu_rate, CPU_MAX_PPS) from dent_os_testbed.utils.test_utils.tgen_utils import ( tgen_utils_get_dent_devices_with_tgen, @@ -137,9 +135,7 @@ async def test_devlink_same_rule_pref(testbed, block_type): # 5.Verify it is handled according to the first rule add action exp_rate = policer_rate / frame_size await asyncio.sleep(10) - - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) # 6.Delete the first rule and add it again with the same priority as before @@ -162,8 +158,7 @@ async def test_devlink_same_rule_pref(testbed, block_type): await tgen_utils_start_traffic(tgen_dev) exp_rate = policer_rate_2 / frame_size await asyncio.sleep(10) - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) @@ -249,8 +244,6 @@ async def test_devlink_rule_priority(testbed, block_type): 'pref': pref} tc_rule = tcutil_generate_rule_with_random_selectors(dut_ports[0], **rule_selectors) - if want_vlan: - tc_rule['protocol'] = choice(('0x8100', '802.1q')) if shared_block: tc_rule['block'] = block del tc_rule['dev'] @@ -299,8 +292,7 @@ async def test_devlink_rule_priority(testbed, block_type): # 5.Verify it is handled according to rule with lowest pref (highest priority) exp_rate = policer_rate / frame_size await asyncio.sleep(10) - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) # 6.Delete the first rule and add it again with the same priority as before @@ -318,8 +310,7 @@ async def test_devlink_rule_priority(testbed, block_type): # according to rule with lowest pref (highest priority) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(10) - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) # 8.Delete the rule again and add it with higher priority than the other rule @@ -338,6 +329,5 @@ async def test_devlink_rule_priority(testbed, block_type): await tgen_utils_start_traffic(tgen_dev) exp_rate = policer_rate_2 / frame_size await asyncio.sleep(10) - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py index 014b2b4fb..e59bcb8cd 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py @@ -10,11 +10,10 @@ from dent_os_testbed.lib.tc.tc_filter import TcFilter from dent_os_testbed.test.test_suite.functional.devlink.devlink_utils import ( - verify_cpu_traps_rate_code_avg, - verify_devlink_cpu_traps_rate_avg, randomize_rule_by_src_dst_field, overwrite_src_dst_stream_fields, - CPU_STAT_CODE_ACL_CODE_3, CPU_MAX_PPS, RATE_UNITS) + verify_cpu_rate, + CPU_MAX_PPS, RATE_UNITS) from dent_os_testbed.utils.test_utils.tgen_utils import ( tgen_utils_get_dent_devices_with_tgen, @@ -120,7 +119,6 @@ async def test_devlink_basic(testbed, traffic): streams = tcutil_tc_rules_to_tgen_streams({dut_ports[0]: out[0][dev_name]['parsed_output']}, frame_rate_pps=100, frame_rate_type='line_rate', frame_size=frame_size) - await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=streams) await tgen_utils_start_traffic(tgen_dev) @@ -128,8 +126,7 @@ async def test_devlink_basic(testbed, traffic): # Calculate expected pkt rate based on policer rate limitation exp_rate = policer_rate / frame_size await asyncio.sleep(10) - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) @@ -192,8 +189,6 @@ async def test_devlink_random(testbed): 'want_vlan_ethtype': True if want_ip and want_vlan else False} tc_rule = tcutil_generate_rule_with_random_selectors(dut_ports[0], **rule_selectors) - if want_vlan: - tc_rule['protocol'] = choice(('0x8100', '802.1q')) tc_rule_copy = deepcopy(tc_rule) randomize_rule_by_src_dst_field(tc_rule, rule_selectors) @@ -218,8 +213,7 @@ async def test_devlink_random(testbed): # Calculate expected pkt rate based on policer rate limitation exp_rate = policer_rate / frame_size await asyncio.sleep(10) - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) @@ -284,8 +278,6 @@ async def test_devlink_policer_log(testbed): 'want_vlan_ethtype': True if want_ip and want_vlan else False} tc_rule = tcutil_generate_rule_with_random_selectors(dut_ports[0], **rule_selectors) - if want_vlan: - tc_rule['protocol'] = choice(('0x8100', '802.1q')) tc_rule_copy = deepcopy(tc_rule) randomize_rule_by_src_dst_field(tc_rule, rule_selectors) @@ -297,8 +289,7 @@ async def test_devlink_policer_log(testbed): assert output_rule[0][dev_name]['rc'] == 0, f'Failed to get tc rule \n{output_rule}' del tc_rule['filtertype']['skip_sw'] - del tc_rule['action'] - tc_rule['action'] = 'action xt limit 3/sec -j LOG ' + tc_rule['action'] = {'xt': {'limit': '3/sec', '-j': 'LOG'}} out = await TcFilter.add(input_data=[{dev_name: [tc_rule]}]) assert out[0][dev_name]['rc'] == 0, f'Failed to create tc rule \n{out}' @@ -322,8 +313,7 @@ async def test_devlink_policer_log(testbed): assert tail_res, f'CPU matched packets are not logged {tail_res}' # 5.Verify CPU trapped packet rate is as expected - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) @@ -389,8 +379,6 @@ async def test_devlink_diff_rate_units(testbed, rate_units): 'want_vlan_ethtype': True if want_vlan and want_ip else False} tc_rule = tcutil_generate_rule_with_random_selectors(dut_ports[0], **rule_selectors) - if want_vlan: - tc_rule['protocol'] = choice(('0x8100', '802.1q')) tc_rule_copy = deepcopy(tc_rule) randomize_rule_by_src_dst_field(tc_rule, rule_selectors) @@ -415,6 +403,5 @@ async def test_devlink_diff_rate_units(testbed, rate_units): # Calculate expected pkt rate based on policer rate limitation exp_rate = policer_rate_bps / (frame_size * RATE_UNITS['bps']) await asyncio.sleep(10) - await verify_cpu_traps_rate_code_avg(dent_dev, CPU_STAT_CODE_ACL_CODE_3, exp_rate) - await verify_devlink_cpu_traps_rate_avg(dent_dev, 'acl_code_3', exp_rate) + await verify_cpu_rate(dent_dev, exp_rate) await tgen_utils_stop_traffic(tgen_dev) diff --git a/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/tc/linux/linux_tc_filter_impl.py b/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/tc/linux/linux_tc_filter_impl.py index b7c91d523..d7805ed3b 100644 --- a/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/tc/linux/linux_tc_filter_impl.py +++ b/DentOS_Framework/DentOsTestbedLib/src/dent_os_testbed/lib/tc/linux/linux_tc_filter_impl.py @@ -47,6 +47,10 @@ def format_modify(self, command, *argv, **kwarg): cmd += 'action pass ' if 'drop' in params['action']: cmd += 'action drop ' + if 'xt' in params['action']: + cmd += 'action xt ' + for field, value in params['action']['xt'].items(): + cmd += '{} {} '.format(field, value) return cmd def format_show(self, command, *argv, **kwarg): From aadf7e87c4f02ce335e90b11c5b77bd291890bb3 Mon Sep 17 00:00:00 2001 From: Kostiantyn Stavruk Date: Fri, 19 May 2023 18:38:29 +0300 Subject: [PATCH 05/18] Add fixs bum_traffic tests Signed-off-by: Kostiantyn Stavruk --- .../bridging/test_bridging_bum_traffic_bridge.py | 4 ++-- .../functional/bridging/test_bridging_bum_traffic_port.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py index 7f605aaab..ee53b7a89 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py @@ -104,7 +104,7 @@ async def test_bridging_bum_traffic_bridge_with_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, 'swp1', '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) @@ -222,7 +222,7 @@ async def test_bridging_bum_traffic_bridge_without_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, 'swp1', '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py index bf6560f3a..cae2b7b09 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py @@ -90,14 +90,14 @@ async def test_bridging_bum_traffic_port_with_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, 'swp1', '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" @@ -170,14 +170,14 @@ async def test_bridging_bum_traffic_port_without_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, 'swp1', '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) # check the traffic stats - stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" From 97290846fe10ed038d399adc4222a186f226b76f Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Fri, 19 May 2023 18:44:20 +0300 Subject: [PATCH 06/18] Skip reboot test Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/L1/test_l1_port_state.py | 1 + 1 file changed, 1 insertion(+) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_port_state.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_port_state.py index 446b9323b..85f348ee3 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_port_state.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_port_state.py @@ -92,6 +92,7 @@ async def test_l1_port_state_status(testbed): await port_state(testbed, 1) +@pytest.mark.skip(reason='https://github.com/dentproject/dentOS/issues/152') async def test_l1_link_up_state_software_power_cycle(testbed): """ Test Name: test_l1_link_up_state_software_power_cycle From 4a65ab80f9957dd81b2057f806411ee45bd372d1 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Sat, 20 May 2023 15:15:04 +0300 Subject: [PATCH 07/18] Add L1 cleanup Restore previous port speed after L1 tests. Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/L1/conftest.py | 80 +++++++++++++++++++ .../functional/L1/test_l1_autodetect.py | 2 +- .../functional/L1/test_l1_autoneg.py | 2 +- .../functional/L1/test_l1_config.py | 2 +- .../functional/L1/test_l1_forced_speed.py | 2 +- .../functional/L1/test_l1_mixed_speed.py | 2 +- 6 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/conftest.py diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/conftest.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/conftest.py new file mode 100644 index 000000000..713e6d48c --- /dev/null +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/conftest.py @@ -0,0 +1,80 @@ +from functools import reduce +import pytest_asyncio +import asyncio + +from dent_os_testbed.lib.ethtool.ethtool import Ethtool +from dent_os_testbed.lib.ip.ip_link import IpLink + +from dent_os_testbed.utils.test_utils.tgen_utils import ( + tgen_utils_get_dent_devices_with_tgen, +) + + +adv_modes = { + '10baseT/Half': 0x001, + '10baseT/Full': 0x002, + '100baseT/Half': 0x004, + '100baseT/Full': 0x008, + '1000baseT/Full': 0x020, + '10000baseT/Full': 0x1000, +} + + +@pytest_asyncio.fixture() +async def restore_port_speed(testbed): + tgen_dev, dent_devices = await tgen_utils_get_dent_devices_with_tgen(testbed, [], 2) + if not tgen_dev or not dent_devices: + print('The testbed does not have enough dent with tgen connections') + return + dent = dent_devices[0].host_name + ports = tgen_dev.links_dict[dent][1] + + out = await IpLink.show(input_data=[{dent: [{'cmd_options': '-j'}]}], parse_output=True) + assert out[0][dent]['rc'] == 0, 'Failed to get port state' + + if not all(link['operstate'] == 'UP' + for link in out[0][dent]['parsed_output'] + if link['ifname'] in ports): + # not all ports are up + # port hast to be UP to see current advertisement modes and/or speed + out = await IpLink.set(input_data=[{dent: [ + {'device': port, 'operstate': 'up'} + for port in ports + ]}]) + assert out[0][dent]['rc'] == 0, 'Failed to set operstate up' + + await asyncio.sleep(10) + + ethtool = await asyncio.gather(*[ + Ethtool.show(input_data=[{dent: [{'devname': port}]}], parse_output=True) + for port in ports + ]) + assert all(out[0][dent]['rc'] == 0 for out in ethtool), 'Failed to get ports\' speed' + + yield # Run the test + + cmd = [] + for out, port in zip(ethtool, ports): + mode = out[0][dent]['parsed_output'] + if 'Unknown!' in mode['speed']: + continue + if mode['auto-negotiation'] == 'on': + adv = reduce(lambda x, y: x | y, + [adv_modes[m] + for m in mode['advertised_link_modes'].split(' ') + if m in adv_modes]) + cmd.append({ + 'devname': port, + 'autoneg': mode['auto-negotiation'], + 'advertise': f'{adv:X}', + }) + else: # not autoneg + cmd.append({ + 'devname': port, + 'autoneg': 'off', + 'speed': int(mode['speed'][:-4]), + 'duplex': mode['duplex'].lower(), + }) + + if cmd: + await Ethtool.set(input_data=[{dent: cmd}]) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autodetect.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autodetect.py index fcaf017d6..bd82ccab5 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autodetect.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autodetect.py @@ -22,7 +22,7 @@ pytestmark = [pytest.mark.suite_functional_l1, pytest.mark.asyncio, - pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen')] + pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen', 'restore_port_speed')] @pytest.mark.parametrize('speed , duplex', diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autoneg.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autoneg.py index ef943a232..e089db9fc 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autoneg.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_autoneg.py @@ -21,7 +21,7 @@ pytestmark = [pytest.mark.suite_functional_l1, pytest.mark.asyncio, - pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen')] + pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen', 'restore_port_speed')] @pytest.mark.parametrize('speed , duplex', 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 3d2d8df73..6504aabb8 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 @@ -14,7 +14,7 @@ pytestmark = [pytest.mark.suite_functional_l1, pytest.mark.asyncio, - pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen')] + pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen', 'restore_port_speed')] @pytest.mark.parametrize('l1_settings', ['autodetect', 'autoneg']) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_forced_speed.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_forced_speed.py index af4efb030..f1d5fe797 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_forced_speed.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_forced_speed.py @@ -21,7 +21,7 @@ pytestmark = [pytest.mark.suite_functional_l1, pytest.mark.asyncio, - pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen')] + pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen', 'restore_port_speed')] @pytest.mark.parametrize('speed , duplex', diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_mixed_speed.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_mixed_speed.py index 8913b6e21..b29583bd1 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_mixed_speed.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/L1/test_l1_mixed_speed.py @@ -19,7 +19,7 @@ pytestmark = [pytest.mark.suite_functional_l1, pytest.mark.asyncio, - pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen')] + pytest.mark.usefixtures('cleanup_bridges', 'cleanup_tgen', 'restore_port_speed')] async def test_l1_mixed_speed(testbed): From e0511eb42274e5aa4d6112712a183bb1081008d0 Mon Sep 17 00:00:00 2001 From: Kostiantyn Stavruk Date: Mon, 22 May 2023 18:54:50 +0300 Subject: [PATCH 08/18] Add wait, refactor assert Signed-off-by: Kostiantyn Stavruk --- .../functional/bridging/test_bridging_bum_traffic_bridge.py | 4 ++++ .../functional/bridging/test_bridging_bum_traffic_port.py | 4 ++++ .../test_port_isolation_interaction_vlan_membership.py | 6 ++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py index ee53b7a89..cec54745d 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py @@ -58,6 +58,7 @@ async def test_bridging_bum_traffic_bridge_with_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' + wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -141,6 +142,7 @@ async def test_bridging_bum_traffic_bridge_with_rif(testbed): 'Verify that traffic from swp1 to swp2 forwarded/not forwarded in accordance.' await tcpdump + await asyncio.sleep(wait) print(f'TCPDUMP: packets={tcpdump.result()}') data = tcpdump.result() @@ -181,6 +183,7 @@ async def test_bridging_bum_traffic_bridge_without_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' + wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -259,6 +262,7 @@ async def test_bridging_bum_traffic_bridge_without_rif(testbed): 'Verify that traffic from swp1 to swp2 forwarded/not forwarded in accordance.' await tcpdump + await asyncio.sleep(wait) print(f'TCPDUMP: packets={tcpdump.result()}') data = tcpdump.result() diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py index cae2b7b09..7b1383c13 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py @@ -55,6 +55,7 @@ async def test_bridging_bum_traffic_port_with_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' + wait = 6 out = await IpAddress.add(input_data=[{device_host_name: [ {'dev': ports[0], 'prefix': f'{prefix}/24'}, @@ -103,6 +104,7 @@ async def test_bridging_bum_traffic_port_with_rif(testbed): f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" await tcpdump + await asyncio.sleep(wait) print(f'TCPDUMP: packets={tcpdump.result()}') data = tcpdump.result() @@ -140,6 +142,7 @@ async def test_bridging_bum_traffic_port_without_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' + wait = 6 out = await IpLink.set( input_data=[{device_host_name: [ @@ -183,6 +186,7 @@ async def test_bridging_bum_traffic_port_without_rif(testbed): f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" await tcpdump + await asyncio.sleep(wait) print(f'TCPDUMP: packets={tcpdump.result()}') data = tcpdump.result() diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py index 90f7846f3..3ec778ab3 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/port_isolation/test_port_isolation_interaction_vlan_membership.py @@ -1,3 +1,4 @@ +import math import pytest import asyncio @@ -192,6 +193,7 @@ async def test_port_isolation_interaction_vlan_membership(testbed): # check the traffic stats stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: - assert tgen_utils_get_loss(row) == expected_loss[row['Traffic Item']], \ - 'Verify that traffic is forwarded/not forwarded in accordance.' + assert math.isclose(expected_loss[row['Traffic Item']], tgen_utils_get_loss(row), abs_tol=0.10), \ + f"Verify that traffic is forwarded/not forwarded in accordance - Actual: {tgen_utils_get_loss(row)}, \ + Expected: {expected_loss[row['Traffic Item']]}" await tgen_utils_clear_traffic_items(tgen_dev) From 1a9f9d9263055a34777c1e6d74bbfdee7908e95b Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Wed, 24 May 2023 19:20:13 +0300 Subject: [PATCH 09/18] Increase delay in some tests Increase tcpdump timeout in bridge tests Add sleep before acl tgen stats Signed-off-by: Serhiy Boiko --- .../functional/acl/test_acl_all_selectors.py | 1 + .../bridging/test_bridging_bum_traffic_bridge.py | 16 ++++------------ .../bridging/test_bridging_bum_traffic_port.py | 16 ++++------------ 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/acl/test_acl_all_selectors.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/acl/test_acl_all_selectors.py index 8012d87a1..51263e642 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/acl/test_acl_all_selectors.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/acl/test_acl_all_selectors.py @@ -204,6 +204,7 @@ async def test_acl_all_selectors(testbed, action, use_tagged_traffic, qdisc_type await tgen_utils_stop_traffic(tgen_dev) # 10. Verify "pass" and "trap" traffic was forwarded, "drop" was dropped + await asyncio.sleep(5) ixia_stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in ixia_stats.Rows: diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py index cec54745d..43fed5aa2 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_bridge.py @@ -58,7 +58,6 @@ async def test_bridging_bum_traffic_bridge_with_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' - wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -105,7 +104,7 @@ async def test_bridging_bum_traffic_bridge_with_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=15, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) @@ -141,10 +140,7 @@ async def test_bridging_bum_traffic_bridge_with_rif(testbed): assert tgen_utils_get_loss(row) == expected_loss[row['Traffic Item']], \ 'Verify that traffic from swp1 to swp2 forwarded/not forwarded in accordance.' - await tcpdump - await asyncio.sleep(wait) - print(f'TCPDUMP: packets={tcpdump.result()}') - data = tcpdump.result() + data = await tcpdump count_of_packets = re.findall(r'(\d+) packets (captured|received|dropped)', data) for count, type in count_of_packets: @@ -183,7 +179,6 @@ async def test_bridging_bum_traffic_bridge_without_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' - wait = 6 out = await IpLink.add( input_data=[{device_host_name: [ @@ -225,7 +220,7 @@ async def test_bridging_bum_traffic_bridge_without_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=15, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) @@ -261,10 +256,7 @@ async def test_bridging_bum_traffic_bridge_without_rif(testbed): assert tgen_utils_get_loss(row) == expected_loss[row['Traffic Item']], \ 'Verify that traffic from swp1 to swp2 forwarded/not forwarded in accordance.' - await tcpdump - await asyncio.sleep(wait) - print(f'TCPDUMP: packets={tcpdump.result()}') - data = tcpdump.result() + data = await tcpdump count_of_packets = re.findall(r'(\d+) packets (captured|received|dropped)', data) for count, type in count_of_packets: diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py index 7b1383c13..4c7149c54 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/bridging/test_bridging_bum_traffic_port.py @@ -55,7 +55,6 @@ async def test_bridging_bum_traffic_port_with_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' - wait = 6 out = await IpAddress.add(input_data=[{device_host_name: [ {'dev': ports[0], 'prefix': f'{prefix}/24'}, @@ -91,7 +90,7 @@ async def test_bridging_bum_traffic_port_with_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=15, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) @@ -103,10 +102,7 @@ async def test_bridging_bum_traffic_port_with_rif(testbed): assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" - await tcpdump - await asyncio.sleep(wait) - print(f'TCPDUMP: packets={tcpdump.result()}') - data = tcpdump.result() + data = await tcpdump count_of_packets = re.findall(r'(\d+) packets (captured|received|dropped)', data) for count, type in count_of_packets: @@ -142,7 +138,6 @@ async def test_bridging_bum_traffic_port_without_rif(testbed): ports = tgen_dev.links_dict[device_host_name][1] traffic_duration = 10 prefix = '100.1.1.253' - wait = 6 out = await IpLink.set( input_data=[{device_host_name: [ @@ -173,7 +168,7 @@ async def test_bridging_bum_traffic_port_without_rif(testbed): list_streams = get_streams(srcMac, self_mac, prefix, dev_groups, tg_ports) await tgen_utils_setup_streams(tgen_dev, config_file_name=None, streams=list_streams) - tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=5, dump=True)) + tcpdump = asyncio.create_task(tb_device_tcpdump(dent_dev, ports[0], '-n', count_only=False, timeout=15, dump=True)) await tgen_utils_start_traffic(tgen_dev) await asyncio.sleep(traffic_duration) @@ -185,10 +180,7 @@ async def test_bridging_bum_traffic_port_without_rif(testbed): assert tgen_utils_get_loss(row) == 100.000, \ f"Verify that traffic from {row['Tx Port']} to {row['Rx Port']} not forwarded.\n{out}" - await tcpdump - await asyncio.sleep(wait) - print(f'TCPDUMP: packets={tcpdump.result()}') - data = tcpdump.result() + data = await tcpdump count_of_packets = re.findall(r'(\d+) packets (captured|received|dropped)', data) for count, type in count_of_packets: From 192933b9039e13de3018befae7f64f40db192e79 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Thu, 25 May 2023 09:48:22 +0000 Subject: [PATCH 10/18] Flush arp entries twice for IPv4 test To properly remove arp entries from the arp table we have to flush them twice: after first flush they become invalid, after the second flush they are deleted. Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py index ca9990f1b..f67939fea 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py @@ -108,10 +108,10 @@ async def test_ipv4_en_dis_fwd(testbed): rc, out = await dent_dev.run_cmd('sysctl -n net.ipv4.ip_forward=0') assert rc == 0, 'Failed to disable ip forwarding' - # 6. Flush neighbor (ARP) table + # 6. Flush neighbor (ARP) table twice out = await IpNeighbor.flush(input_data=[{dent: [ {'device': port} for port in ports - ]}]) + ] * 2}]) assert out[0][dent]['rc'] == 0, 'Failed to flush arp table' # 7. Transmit traffic with ip fwd disabled From c1ae3c05b150cd0efb4595a90105a2337a9f7f07 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Thu, 25 May 2023 10:50:30 +0000 Subject: [PATCH 11/18] Add delay to arp test Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/ipv4/test_ipv4_arp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py index 7f056a665..7b6a43f25 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py @@ -589,6 +589,7 @@ async def test_ipv4_arp_reachable_timeout(testbed): tg_ports = tgen_dev.links_dict[dent][0] ports = tgen_dev.links_dict[dent][1] reachable = 'REACHABLE' + nei_update_time_s = 5 address_map = ( # swp port, tg ports, swp ip, tg ip, plen (ports[0], tg_ports[0], '1.1.1.1', '1.1.1.2', 24), @@ -639,6 +640,7 @@ async def test_ipv4_arp_reachable_timeout(testbed): await send_traffic_and_verify(tgen_dev) # Verify ports are not in REACHABLE mode + await asyncio.sleep(nei_update_time_s) neighs = await get_neigh_list(dent) for nei in neighs: if nei['dev'] not in ports: @@ -657,7 +659,7 @@ async def test_ipv4_arp_reachable_timeout(testbed): await send_traffic_and_verify(tgen_dev) # Wait a few seconds to be sure that arp state is updated - await asyncio.sleep(5) + await asyncio.sleep(nei_update_time_s) # Verify ports are in REACHABLE mode neighs = await get_neigh_list(dent) From 594712ef774906f375783e20a495af080bd80969 Mon Sep 17 00:00:00 2001 From: Stepan Vovk Date: Wed, 24 May 2023 16:46:37 +0300 Subject: [PATCH 12/18] Add waits before stats collect, change platform key Signed-off-by: Stepan Vovk --- .../functional/policer/test_policer_dynamic_traps.py | 2 +- .../policer/test_policer_interaction_with_span.py | 6 ++++-- .../functional/policer/test_policer_rate_per_rule.py | 2 +- .../test_suite/functional/vlan/test_vlan_increment_mac.py | 2 +- .../dent_os_testbed/utils/test_utils/data/platforms.json | 6 +++--- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_dynamic_traps.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_dynamic_traps.py index 2b360f30e..ae475a99f 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_dynamic_traps.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_dynamic_traps.py @@ -177,7 +177,7 @@ async def test_policer_interact_with_acl_drop(testbed): # 11. Send traffic matching the rules selectors # waiting for rule to apply on dut - await asyncio.sleep(10) + await asyncio.sleep(30) # 12. Verify it is still handled according to the rule with the lowest priority stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Port Statistics') diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_interaction_with_span.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_interaction_with_span.py index b0e146372..e5762a794 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_interaction_with_span.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_interaction_with_span.py @@ -148,7 +148,7 @@ async def test_policer_interaction_span(testbed): # 5. Transmit traffic from the TX port await tgen_utils_start_traffic(tgen_dev) - await asyncio.sleep(15) + await asyncio.sleep(25) # 6. Verify RX rate on RX ports is as expected (by the police pass rule) # and that in the mirred port equals sum of police rate and transmitted rate multiplied by number of RX ports @@ -173,10 +173,11 @@ async def test_policer_interaction_span(testbed): # 7. Transmit traffic from mirred port await tgen_utils_start_traffic(tgen_dev) - await asyncio.sleep(15) + await asyncio.sleep(25) # 8. Verify RX rate on RX ports is as expected (not affected by the police pass rule) # and verify traffic also flows to the TX port + stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Port Statistics') for row in stats.Rows: if row['Port Name'] == tg_ports[0]: err_msg = f'Expected {transmit_rate * 3} got : {float(row["Rx. Rate (bps)"])}' @@ -187,6 +188,7 @@ async def test_policer_interaction_span(testbed): mirred_port_rate = transmit_rate * (len(dev_groups) - 1) + police_rate err_msg = f'Expected {mirred_port_rate} got : {float(row["Rx. Rate (bps)"])}' assert isclose(float(row['Rx. Rate (bps)']), mirred_port_rate, rel_tol=tolerance), err_msg + await asyncio.sleep(15) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: if row['Traffic Item'] == f'stream_{mirred_port}': diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_rate_per_rule.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_rate_per_rule.py index 3bf04f045..ffae2dfec 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_rate_per_rule.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/policer/test_policer_rate_per_rule.py @@ -138,7 +138,7 @@ async def test_policer_rate_per_rule(testbed): # 6. Transmit traffic await tgen_utils_start_traffic(tgen_dev) - await asyncio.sleep(15) + await asyncio.sleep(25) # 7. Verify RX rate per stream is as expected (limited by the rule) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py index 0ec53313a..d976930fb 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py @@ -66,7 +66,7 @@ async def test_vlan_with_increment_macs(testbed): tolerance = 0.7 # fdb learning tolerance out = await OnlpSystemInfo.show(input_data=[{device: [{}]}], parse_output=True) - model = out[0][device]['parsed_output']['platform_name'].strip().replace('_', '-') + model = out[0][device]['parsed_output']['product_name'].strip().replace('_', '-') mac_table = LocalFileHandler(dent_devices[0].applog).read(PLATFORMS_CONSTANTS) mac_count = json.loads(mac_table) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json index 4c81e4a8a..b42f15957 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json @@ -1,11 +1,11 @@ { - "arm64-delta-tn48m-poe-dn-r0": { + "TN48M-P-DN": { "fdb_size": 32000 }, - "arm64-accton-as5114-48x-r0": { + "AS5114-48X-O-AC-F-EC": { "fdb_size": 32000 }, - "arm64-accton-as4224-52p-r0": { + "AS4224-52P-O-AC-F-EC": { "fdb_size": 32000 } } From 1027d13c5f11a113ff26deab883b143b2eaac043 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Fri, 26 May 2023 16:38:31 +0000 Subject: [PATCH 13/18] Add polling to ipv4 arp test Signed-off-by: Serhiy Boiko --- .../functional/ipv4/test_ipv4_arp.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py index 7b6a43f25..b9c0cb499 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_arp.py @@ -640,12 +640,13 @@ async def test_ipv4_arp_reachable_timeout(testbed): await send_traffic_and_verify(tgen_dev) # Verify ports are not in REACHABLE mode - await asyncio.sleep(nei_update_time_s) - neighs = await get_neigh_list(dent) - for nei in neighs: - if nei['dev'] not in ports: - continue - assert reachable not in nei['state'], f'Arp entry should be aged {nei}' + for _ in range(3): + neighs = await get_neigh_list(dent) + if all(reachable not in nei['state'] for nei in neighs if nei['dev'] in ports): + break + await asyncio.sleep(nei_update_time_s) + else: + raise AssertionError(f'Arp entries should be aged {[nei for nei in neighs if nei["dev"] in ports]}') finally: # 6. Configure arp base reachable timeout back to default 30 sec @@ -658,15 +659,14 @@ async def test_ipv4_arp_reachable_timeout(testbed): # 7. Send traffic again await send_traffic_and_verify(tgen_dev) - # Wait a few seconds to be sure that arp state is updated - await asyncio.sleep(nei_update_time_s) - # Verify ports are in REACHABLE mode - neighs = await get_neigh_list(dent) - for nei in neighs: - if nei['dev'] not in ports: - continue - assert reachable in nei['state'], f'Arp entry should be reachable {nei}' + for _ in range(5): + neighs = await get_neigh_list(dent) + if all(reachable in nei['state'] for nei in neighs if nei['dev'] in ports): + break + await asyncio.sleep(nei_update_time_s) + else: + raise AssertionError(f'Arp entries should be reachable {[nei for nei in neighs if nei["dev"] in ports]}') async def test_ipv4_arp_ageing(testbed): From 67fa8db028901cd3730760d3dce4dc9ebe714665 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Fri, 26 May 2023 16:39:13 +0000 Subject: [PATCH 14/18] Simplify ipv6 neighbor test Neighbor behavior is dependent on linux and is somewhat random. Because of the complexity of the test it is simplified to be more consistent. Signed-off-by: Serhiy Boiko --- .../functional/ipv6/test_ipv6_nei.py | 87 ------------------- 1 file changed, 87 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_nei.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_nei.py index 3761d33d5..9071d12b2 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_nei.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv6/test_ipv6_nei.py @@ -71,12 +71,6 @@ async def test_ipv6_nei_ageing(testbed): 2.3 Check that neighbor entries are REACHABLE 2.4 Check that neighbor entries are STALE 2.5 Check that neighbor entries are aged - 3.1 Set a large gc_stale_time_s value, set small threshold values - 3.2 Resolve neighbors on first port - 3.3 Resolve neighbors on second port in the next time window - 3.4 Check that neighbor entries are STALE - 3.5 Check that neighbor entries are aged only on the first port - 3.6 Check that neighbor entries on the second port are aged in the next time window """ num_of_ports = 2 tgen_dev, dent_devices = await tgen_utils_get_dent_devices_with_tgen(testbed, [], num_of_ports) @@ -233,87 +227,6 @@ async def test_ipv6_nei_ageing(testbed): f'Expected neighbors to be STALE after no more than {new_gc_stale_time_s*2 = }s, ' + \ f'but waited for {elapsed // 1}s' - # Scenario #3 - # 3.1 Set a large gc_stale_time_s value, set small threshold values - gc_stale_time_s = 60 - gc_interval_s = 15 - config.update({ - 'net.ipv6.neigh.default.gc_interval': gc_interval_s, - 'net.ipv6.neigh.default.gc_stale_time': gc_stale_time_s, - f'net.ipv6.neigh.{ports[0]}.gc_stale_time': gc_stale_time_s, - f'net.ipv6.neigh.{ports[1]}.gc_stale_time': gc_stale_time_s, - }) - - out = await RecoverableSysctl.set(input_data=[{dent: [ - {'variable': variable, 'value': value} - for variable, value in config.items() - ]}]) - assert out[0][dent]['rc'] == 0, 'Failed to update sysctl values' - - # 3.2 Resolve neighbors on first port - out = await tgen_utils_send_ns(tgen_dev, ({'ixp': tg_ports[0]},)) - assert all(rc['success'] for rc in out), 'Failed to send NS from TG' - - out = await asyncio.gather(*[ - tb_ping_device(dent_dev, info.tg_ip, pkt_loss_treshold=0, dump=True, count=1) - for info in address_map if info.tg == tg_ports[0] - ]) - assert all(rc == 0 for rc in out), 'Some pings did not have a reply' - - # 3.3 Resolve neighbors on second port in the next time window - dent_dev.applog.info(f'Wait {gc_interval_s = }s for the next GC interval') - await asyncio.sleep(gc_interval_s) - - out = await tgen_utils_send_ns(tgen_dev, ({'ixp': tg_ports[1]},)) - assert all(rc['success'] for rc in out), 'Failed to send NS from TG' - - out = await asyncio.gather(*[ - tb_ping_device(dent_dev, info.tg_ip, pkt_loss_treshold=0, dump=True, count=1) - for info in address_map if info.tg == tg_ports[1] - ]) - assert all(rc == 0 for rc in out), 'Some pings did not have a reply' - - # Changing state from REACHABLE to STALE is random, so don't bother to - # check neighbors for REACHABLE state - start = time.time() - - # 3.4 Check that neighbor entries are STALE - expected_neis = [ - {'dev': info.swp, 'dst': info.tg_ip, 'should_exist': True, 'offload': True, 'states': ['STALE']} - for info in address_map - ] - await wait_for_nei_state(dent_dev, expected_neis, poll_interval=nei_update_time_s) - elapsed = time.time() - start - expected_time = base_reach_time_s*1.5 + gc_interval_s*2 + nei_update_time_s - assert elapsed < expected_time, \ - f'Expected neighbors to be STALE after no more than {expected_time}s, ' + \ - f'but waited for {elapsed // 1}s' - - # 3.5 Check that neighbor entries are aged only on the first port - expected_neis = [ - {'dev': info.swp, - 'dst': info.tg_ip, - 'should_exist': info.tg == tg_ports[1], - 'offload': True, - 'states': ['STALE']} - for info in address_map - ] - await wait_for_nei_state(dent_dev, expected_neis, timeout=gc_stale_time_s + gc_interval_s*2) - elapsed = time.time() - start - expected_time = gc_stale_time_s + gc_interval_s*2 + nei_update_time_s - assert elapsed < expected_time, \ - f'Expected neighbors to be STALE/aged after no more than {expected_time}s, ' + \ - f'but waited for {elapsed // 1}s' - - # 3.6 Check that neighbor entries on the second port are aged in the next time window - [nei.update({'should_exist': False}) for nei in expected_neis] - await wait_for_nei_state(dent_dev, expected_neis) - elapsed = time.time() - start - expected_time = gc_stale_time_s + gc_interval_s*3 - assert elapsed < expected_time, \ - f'Expected neighbors to be aged after no more than {expected_time}s, ' + \ - f'but waited for {elapsed // 1}s' - async def test_ipv6_nei_change(testbed): """ From 8030935f405549b5c97a6775110dd724a509f16b Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Sat, 27 May 2023 09:14:01 +0000 Subject: [PATCH 15/18] Add delay before getting TG stats Signed-off-by: Serhiy Boiko --- .../test/test_suite/functional/ipv4/test_ipv4_best_match.py | 2 ++ .../test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py | 2 ++ .../test/test_suite/functional/ipv4/test_ipv4_gw.py | 2 ++ .../test/test_suite/functional/ipv4/test_ipv4_routing.py | 2 ++ 4 files changed, 8 insertions(+) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_best_match.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_best_match.py index 9d6886eb7..52808f28c 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_best_match.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_best_match.py @@ -125,6 +125,7 @@ async def test_ipv4_bm_traffic_forwarding(testbed): await tgen_utils_stop_traffic(tgen_dev) # 6. Verify traffic is not forwarded to first Ixia port neighbor + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) @@ -154,6 +155,7 @@ async def test_ipv4_bm_traffic_forwarding(testbed): await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py index f67939fea..b9ac68608 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_en_dis_fwd.py @@ -99,6 +99,7 @@ async def test_ipv4_en_dis_fwd(testbed): await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) @@ -120,6 +121,7 @@ async def test_ipv4_en_dis_fwd(testbed): await tgen_utils_stop_traffic(tgen_dev) # Verify traffic not routed because neighbors were not resolved + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_gw.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_gw.py index 7b2d75c7e..deacdc421 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_gw.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_gw.py @@ -124,6 +124,7 @@ async def test_ipv4_default_gw(testbed): await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) @@ -156,6 +157,7 @@ async def test_ipv4_default_gw(testbed): await asyncio.sleep(traffic_duration) await tgen_utils_stop_traffic(tgen_dev) + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Traffic Item Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_routing.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_routing.py index 5386267b3..19e0952ae 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_routing.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/ipv4/test_ipv4_routing.py @@ -321,6 +321,7 @@ async def test_ipv4_route_between_vlan_devs(testbed): await tgen_utils_stop_traffic(tgen_dev) # 8. Verify traffic is forwarded to both VLAN-devices` neighbors + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) @@ -356,6 +357,7 @@ async def test_ipv4_route_between_vlan_devs(testbed): f"Route {route['dst']} for dev {route['dev']} should be offloaded" # 11. Verify traffic is forwarded to both VLAN-devices` neighbors + await asyncio.sleep(5) stats = await tgen_utils_get_traffic_stats(tgen_dev, 'Flow Statistics') for row in stats.Rows: loss = tgen_utils_get_loss(row) From 5f852ca9c85345213a52f19ff5ee3b39fa574a03 Mon Sep 17 00:00:00 2001 From: Serhiy Boiko Date: Mon, 29 May 2023 12:14:59 +0000 Subject: [PATCH 16/18] Use absolute tolerance instead of relative abs_tol allows for traffic rate deviation of +-5% regardless of the actual traffic loss. On the other hand when using rel_tol the allowed deviation depends on the current traffic loss (+-5% if loss is 100%, +-2.5% if loss is 50%, 0% if loss is 0%) Signed-off-by: Serhiy Boiko --- .../src/dent_os_testbed/utils/test_utils/tc_flower_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tc_flower_utils.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tc_flower_utils.py index 0c9e6eb55..708966c0b 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tc_flower_utils.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/tc_flower_utils.py @@ -449,5 +449,5 @@ async def tcutil_verify_tgen_stats(dev, row, rule_action='pass', dev.applog.info(f"Traffic item: {row['Traffic Item']}\n" + f"Tx Frames: {tx_packets}, Rx Frames: {row['Rx Frames']}, " + f'{loss = }, {expected_loss = :.3f} (max {tolerance = })') - assert is_close(loss, expected_loss, rel_tol=tolerance), \ + assert is_close(loss, expected_loss, abs_tol=tolerance * 100), \ f'Expected loss: {expected_loss:.3f}%, actual: {loss}%' From 77523257206d4d2a02a6f249aa5cd972f23f20c0 Mon Sep 17 00:00:00 2001 From: Andriy Lozovyy Date: Thu, 1 Jun 2023 09:15:19 +0000 Subject: [PATCH 17/18] Change frame size range Signed-off-by: Andriy Lozovyy --- .../test_suite/functional/devlink/test_devlink_single_block.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py index e59bcb8cd..b58a2c063 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/devlink/test_devlink_single_block.py @@ -337,7 +337,7 @@ async def test_devlink_diff_rate_units(testbed, rate_units): dent_dev = dent_devices[0] tg_ports = tgen_dev.links_dict[dev_name][0] dut_ports = tgen_dev.links_dict[dev_name][1] - frame_size = randint(128, 1400) + frame_size = randint(128, 500) # Calculate max possible rate for cpu trap 4000pps is max max_rate = (frame_size * CPU_MAX_PPS) * RATE_UNITS['bps'] # Max rate in bits per second policer_rate_bps = randint(2_000_000, max_rate) From b1683b4fa70a53b85c47a02565a7bbff2dcb9854 Mon Sep 17 00:00:00 2001 From: yuriilisovskyi Date: Wed, 7 Jun 2023 13:33:54 +0300 Subject: [PATCH 18/18] Revert platform names Signed-off-by: yuriilisovskyi --- .../test_suite/functional/vlan/test_vlan_increment_mac.py | 4 ++-- .../dent_os_testbed/utils/test_utils/data/platforms.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py index d976930fb..5d3ed0d88 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/test/test_suite/functional/vlan/test_vlan_increment_mac.py @@ -65,8 +65,8 @@ async def test_vlan_with_increment_macs(testbed): dut_ports = tgen_dev.links_dict[device][1] tolerance = 0.7 # fdb learning tolerance - out = await OnlpSystemInfo.show(input_data=[{device: [{}]}], parse_output=True) - model = out[0][device]['parsed_output']['product_name'].strip().replace('_', '-') + rc, model = await dent_devices[0].run_cmd(f'cat /etc/onl/platform') + model = model.strip('\n') mac_table = LocalFileHandler(dent_devices[0].applog).read(PLATFORMS_CONSTANTS) mac_count = json.loads(mac_table) diff --git a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json index b42f15957..4c81e4a8a 100644 --- a/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json +++ b/DentOS_Framework/DentOsTestbed/src/dent_os_testbed/utils/test_utils/data/platforms.json @@ -1,11 +1,11 @@ { - "TN48M-P-DN": { + "arm64-delta-tn48m-poe-dn-r0": { "fdb_size": 32000 }, - "AS5114-48X-O-AC-F-EC": { + "arm64-accton-as5114-48x-r0": { "fdb_size": 32000 }, - "AS4224-52P-O-AC-F-EC": { + "arm64-accton-as4224-52p-r0": { "fdb_size": 32000 } }