Add PVST test suite for T0 topologies#1
Open
bpar9 wants to merge 2 commits into
Open
Conversation
This commit adds a comprehensive PVST (Per-VLAN Spanning Tree) test suite designed for T0 topologies with two_vlan_a and four_vlan_a configurations. Test cases implemented (23 total): - Basic Functionality (TC-001 to TC-005): PVST enable, root bridge election, per-VLAN priority and timer configuration - Port State and Traffic (TC-006 to TC-008): Port state verification, L2 traffic forwarding, MAC learning - Protection Features (TC-009 to TC-011): BPDU Guard, Root Guard, PortFast - Topology Change (TC-012 to TC-013): TCN handling, link flap stability - T1 Uplinks (TC-014 to TC-015): Port-Channel uplinks, traffic path - Config Persistence (TC-016 to TC-018): Save/reload, cold/warm reboot - Statistics (TC-019 to TC-020): BPDU statistics, clear statistics - Negative Tests (TC-021 to TC-022): Invalid priority, non-existent VLAN - Scale Test (TC-023): Maximum VLAN instances Files added: - tests/stp/__init__.py - tests/stp/conftest.py - tests/stp/test_pvst_t0.py Co-Authored-By: bhavani@cisco.com <bhavani@cisco.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
- Add PTF imports: ptf.testutils, ptf.packet, ptf.mask.Mask - Add build_eth_packet() for L2 traffic tests - Add build_bpdu_packet() for BPDU Guard tests using IEEE 802.1D format - Add get_vlan_ptf_ports() for VLAN to PTF port mapping using config_facts - Add get_all_vlan_ptf_mapping() for all VLAN port mappings - Add verify_vlan_isolation() for VLAN isolation tests - Add verify_mac_learning() for MAC learning verification - Add send_and_verify_vlan_traffic() helper function - Update pvst_setup fixture to include cfg_facts, mg_facts, vlan_to_ptf - Rewrite TC-007 (L2 Traffic Forwarding) with proper PTF traffic verification - Rewrite TC-008 (MAC Learning) with PTF packet generation - Rewrite TC-009 (BPDU Guard) with BPDU packet generation - Rewrite TC-010 (Root Guard) with superior BPDU injection - Rewrite TC-011 (PortFast) with traffic verification - Rewrite TC-013 (Link Flap) with traffic verification after convergence - Rewrite TC-015 (Traffic Path) with L2 traffic verification - Use config_facts and minigraph_ptf_indices for accurate port mapping - Follow patterns from tests/vlan/test_vlan.py and tests/fdb/test_fdb.py Co-Authored-By: bhavani@cisco.com <bhavani@cisco.com>
11 tasks
bpar9
pushed a commit
that referenced
this pull request
Mar 5, 2026
…nter and global_pause test-script (sonic-net#22490) Description of PR Added support for tgen_port_info in: tests/snappi_tests/pfc/test_global_pause_with_snappi.py tests/snappi_tests/pfc/test_tx_drop_counter_with_snappi.py Summary: Fixes # (issue) Type of change Bug fix Testbed and Framework(new/improvement) New Test case Skipped for non-supported platforms Test case improvement Back port request 202205 202305 202311 202405 202411 202505 202511 Approach What is the motivation for this PR? The tgen_port_info was added as part of Snappi test infra improvement, which enabled users to select between static (from variables.override.yml) and dynamic (select 100 and 400Gbps ports) ports. This was NOT included in test_tx_drop_counter and test_global_pause test-scripts under snappi_tests/pfc section. How did you do it? Imported the tgen_port_info from snappi_fixtures.py and removed any reference to old setup_dut_port function for both test-scripts. How did you verify/test it? Verification on 202511 is present in pull-request sonic-net#22380. Verification steps for master: azureuser@7e081020c2c7:/data/tests$ date;python3 -m pytest --inventory ../ansible/ixia-sonic --host-pattern ixre-egl-board73,ixre-egl-board74 --testbed ixre-chassis17-t2 --testbed_file ../ansible/testbed.csv --show-capture=stdout --log-cli-level info --showlocals -ra --allow_recover --junit-xml=/tmp/y.xml --skip_sanity --log-file=/tmp/y.log --topology multidut-tgen -cache-clear --disable_loganalyzer snappi_tests/pfc/test_global_pause_with_snappi.py --pdb Fri Feb 20 00:07:16 UTC 2026 ====================================================================================================================== test session starts ======================================================================================================================= platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.5.0 ---- curtailed output ---- INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Config validation 0.014s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Ports configuration 1.261s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Captures configuration 0.116s ---- curtailed output ---- INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:837 DUT polling complete INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:850 Checking if all flows have stopped. Attempt #1 INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:856 All test and background traffic flows stopped INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:894 Dumping per-flow statistics INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:899 Stopping transmit on all remaining flows INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Flows stop 5.353s PASSED [ 50%] ---- curtailed output ---- INFO tests.common.plugins.memory_utilization:__init__.py:64 Before test: collected memory_values {'before_test': {}, 'after_test': {}} ------------------------------------------------------------------------------------------------------------------------- live log call -------------------------------------------------------------------------------------------------------------------------- INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Config validation 0.014s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Ports configuration 1.059s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Captures configuration 0.110s ---- curtailed output ---- INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:837 DUT polling complete INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:850 Checking if all flows have stopped. Attempt #1 INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:856 All test and background traffic flows stopped INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:894 Dumping per-flow statistics INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:899 Stopping transmit on all remaining flows INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Flows stop 5.514s PASSED [100%] ---- curtailed output ---- ----------------------------------------------------------------------------------------------------------------- generated xml file: /tmp/y.xml ----------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------- live log sessionfinish --------------------------------------------------------------------------------------------------------------------- INFO root:__init__.py:67 Can not get Allure report URL. Please check logs =========================================================================================================== 2 passed, 9 warnings in 789.04s (0:13:09) ============================================================================================================ INFO:root:Can not get Allure report URL. Please check logs azureuser@7e081020c2c7:/data/tests$ date;python3 -m pytest --inventory ../ansible/ixia-sonic --host-pattern ixre-egl-board73,ixre-egl-board74 --testbed ixre-chassis17-t2 --testbed_file ../ansible/testbed.csv --show-capture=stdout --log-cli-level info --showlocals -ra --allow_recover --junit-xml=/tmp/y.xml --skip_sanity --log-file=/tmp/y.log --topology multidut-tgen -cache-clear --disable_loganalyzer snappi_tests/pfc/test_tx_drop_counter_with_snappi.py --pdb Fri Feb 20 00:21:03 UTC 2026 ---- curtailed output ---- INFO ixnetwork_restpy.connection:connection.py:329 User info IxNetwork/tgen-ixia-03/admin-112-3670867 INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 snappi-1.27.1 INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 snappi_ixnetwork-1.27.2 INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 ixnetwork_restpy-1.6.1 INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Config validation 0.000s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Ports configuration 0.213s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Captures configuration 0.122s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Aggregation mode speed change 0.000s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Location configuration 0.288s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Layer1 configuration 0.000s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Lag Configuration 0.061s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Convert device config : 0.155s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Create IxNetwork device config : 0.000s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Push IxNetwork device config : 0.093s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Devices configuration 0.299s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Flows configuration 0.120s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Start interfaces 0.155s INFO root:__init__.py:76 -------------------- fixture tgen_port_info setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture disable_pfcwd setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture disable_pfcwd setup ends -------------------- INFO root:conftest.py:3818 skip setup dualtor mux cables on non-dualtor testbed ---- curtailed output ---- INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Config validation 0.012s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Ports configuration 1.265s INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Captures configuration 0.112s ---- curtailed output ---- INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:837 DUT polling complete INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:850 Checking if all flows have stopped. Attempt #1 INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:856 All test and background traffic flows stopped INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:894 Dumping per-flow statistics INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:899 Stopping transmit on all remaining flows ---- curtailed output ---- INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:837 DUT polling complete INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:850 Checking if all flows have stopped. Attempt #1 INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:856 All test and background traffic flows stopped INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:894 Dumping per-flow statistics INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:899 Stopping transmit on all remaining flows INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Link State operation 0.052s INFO tests.snappi_tests.pfc.files.helper:helper.py:452 Snappi port Port 0 is set to DOWN INFO tests.snappi_tests.pfc.files.helper:helper.py:457 Sleeping for 90 seconds INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Link State operation 0.058s INFO tests.snappi_tests.pfc.files.helper:helper.py:469 Snappi port Port 0 is set to UP ---- curtailed output ---- INFO root:__init__.py:67 Can not get Allure report URL. Please check logs =========================================================================================================== 2 passed, 9 warnings in 906.71s (0:15:06) ============================================================================================================ INFO:root:Can not get Allure report URL. Please check logs Signed-off-by: amitpawa <amit.2.pawar@nokia.com> * snappi: issue-22363 removed multidut-port-info import from pfc tx_drop_counter testcase Signed-off-by: amitpawa <amit.2.pawar@nokia.com> --------- Signed-off-by: amitpawa <amit.2.pawar@nokia.com>
bpar9
pushed a commit
that referenced
this pull request
Mar 5, 2026
…ion (sonic-net#22504) Description of PR The tgen_port_info infra function in common/snappi_tests/snappi_fixtures.py is used to select port (dynamically or statically) for the test. During static port selection, the variables.override.yml file is used to select Rx and Tx port for the test. However, after the test, there was no explicit test clean_up code. This PR addresses it. Summary: Fixes sonic-net#20993 Type of change Bug fix Testbed and Framework(new/improvement) New Test case Skipped for non-supported platforms Test case improvement Back port request 202205 202305 202311 202405 202411 202505 202511 Approach What is the motivation for this PR? The tgen_port_info is used to select the Rx and Tx port for the test. In case of static port selection, the function returned snappi_dut_base_config(duthosts, snappi_ports, snappi_api, setup=True), and there was no explicit cleanup after the test. How did you do it? If the 'is_override' flag is true, the static port selection code is used to select Rx and Tx ports from variables.override.yml file. Instead of returning with function 'snappi_dut_base_config', 'yield' is called to ensure that clean-up is called at the end of the test. Once yield returns back to the test, then 'setup_dut_ports' is called with setup=False to ensure that clean-up happens after the test. How did you verify/test it? For verification of this changes on 202511 branch, please refer to PR sonic-net#22441 Verification of the PR on master with multi-dut setup: azureuser@7e081020c2c7:/data/tests$ date;python3 -m pytest --inventory ../ansible/ixia-sonic --host-pattern ixre-egl-board73,ixre-egl-board74 --testbed ixre-chassis17-t2 --testbed_file ../ansible/testbed.csv --show-capture=stdout --log-cli-level info --showlocals -ra --allow_recover --junit-xml=/tmp/y.xml --skip_sanity --log-file=/tmp/y.log --topology multidut-tgen -cache-clear --disable_loganalyzer snappi_tests/pfc/test_pfc_pause_lossless_with_snappi.py -k test_pfc_pause_multi_lossless_prio --pdb Fri Feb 20 14:26:57 UTC 2026 ================================================================================================= test session starts ================================================================================================= platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.5.0 ----------- curtailed output ---------- INFO tests.conftest:conftest.py:691 Randomly select dut ixre-egl-board73 for testing INFO root:__init__.py:81 -------------------- fixture enable_packet_aging_after_test setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture enable_packet_aging_after_test setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture rand_lossless_prio setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture rand_lossless_prio setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture rand_lossy_prio setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture rand_lossy_prio setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture start_pfcwd_after_test setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture start_pfcwd_after_test setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture disable_voq_watchdog setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture disable_voq_watchdog setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture number_of_tx_rx_ports setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture number_of_tx_rx_ports setup ends -------------------- INFO root:__init__.py:69 -------------------- fixture snappi_api_serv_ip setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture snappi_api_serv_ip setup ends -------------------- INFO root:__init__.py:69 -------------------- fixture snappi_api_serv_port setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture snappi_api_serv_port setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture snappi_api setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture snappi_api setup ends -------------------- INFO tests.conftest:conftest.py:727 Randomly select dut ixre-egl-board74 for testing INFO root:__init__.py:69 -------------------- fixture prio_dscp_map setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture prio_dscp_map setup ends -------------------- INFO root:__init__.py:69 -------------------- fixture all_prio_list setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture all_prio_list setup ends -------------------- INFO root:__init__.py:69 -------------------- fixture lossless_prio_list setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture lossless_prio_list setup ends -------------------- INFO root:__init__.py:69 -------------------- fixture lossy_prio_list setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture lossy_prio_list setup ends -------------------- INFO root:__init__.py:69 -------------------- fixture get_snappi_ports setup starts -------------------- INFO root:__init__.py:69 -------------------- fixture get_snappi_ports_multi_dut setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture get_snappi_ports_multi_dut setup ends -------------------- INFO root:__init__.py:76 -------------------- fixture get_snappi_ports setup ends -------------------- INFO root:__init__.py:69 -------------------- fixture snappi_port_selection setup starts -------------------- INFO root:__init__.py:76 -------------------- fixture snappi_port_selection setup ends -------------------- INFO root:__init__.py:77 Log analyzer is disabled INFO root:__init__.py:81 -------------------- fixture disable_pfcwd setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture disable_pfcwd setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture tgen_port_info setup starts -------------------- ----------- curtailed output ---------- INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Start interfaces 0.164s INFO tests.common.snappi_tests.snappi_fixtures:snappi_fixtures.py:906 Found relevant portchannel interfaces INFO root:__init__.py:85 -------------------- fixture tgen_port_info setup ends -------------------- INFO root:conftest.py:3819 skip setup dualtor mux cables on non-dualtor testbed INFO tests.common.plugins.memory_utilization:__init__.py:64 Before test: collected memory_values {'before_test': {}, 'after_test': {}} ----------- curtailed output ---------- INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:784 Polling DUT for traffic statistics for 23 seconds ... INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:803 Polling TGEN for in-flight traffic statistics... INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:824 In-flight traffic statistics for flows: ['Test Flow Prio 3', 'Test Flow Prio 4', 'Background Flow Prio 1', 'Background Flow Prio 5', 'Background Flow Prio 6', 'Background Flow Prio 2', 'Background Flow Prio 0'] INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:825 In-flight TX frames: [68216, 68215, 81896551, 81896551, 81896551, 81896551, 81896551] INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:826 In-flight RX frames: [0, 0, 81896551, 81896551, 81896551, 81896551, 81896551] INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:832 In-flight traffic statistics for flows: ----------- curtailed output ---------- INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:837 DUT polling complete INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:850 Checking if all flows have stopped. Attempt #1 INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:856 All test and background traffic flows stopped INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:894 Dumping per-flow statistics INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:899 Stopping transmit on all remaining flows INFO snappi_ixnetwork.snappi_api:snappi_api.py:1419 Flows stop 6.608s PASSED [ 50%] ----------- curtailed output ---------- INFO root:__init__.py:81 -------------------- fixture disable_pfcwd setup starts -------------------- INFO root:__init__.py:85 -------------------- fixture disable_pfcwd setup ends -------------------- INFO root:__init__.py:81 -------------------- fixture tgen_port_info setup starts -------------------- INFO tests.common.snappi_tests.snappi_fixtures:snappi_fixtures.py:906 Found relevant portchannel interfaces INFO root:__init__.py:85 -------------------- fixture tgen_port_info setup ends -------------------- INFO root:conftest.py:3819 skip setup dualtor mux cables on non-dualtor testbed ----------- curtailed output ---------- INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:784 Polling DUT for traffic statistics for 27 seconds ... INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:803 Polling TGEN for in-flight traffic statistics... INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:824 In-flight traffic statistics for flows: ['Test Flow Prio 3', 'Test Flow Prio 4', 'Background Flow Prio 1', 'Background Flow Prio 5', 'Background Flow Prio 6', 'Background Flow Prio 2', 'Background Flow Prio 0'] INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:825 In-flight TX frames: [68221, 68222, 99137931, 99137931, 99137931, 99137931, 99137931] INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:826 In-flight RX frames: [0, 0, 99137931, 99137931, 99137931, 99137931, 99137931] INFO tests.common.snappi_tests.traffic_generation:traffic_generation.py:832 In-flight traffic statistics for flows: ----------- curtailed output ---------- INFO tests.conftest:conftest.py:3097 Dumping Disk and Memory Space information after test on ixre-egl-board73 INFO tests.conftest:conftest.py:3097 Dumping Disk and Memory Space information after test on ixre-egl-board74 INFO tests.conftest:conftest.py:3101 Collecting core dumps after test on ixre-egl-board74 INFO tests.conftest:conftest.py:3101 Collecting core dumps after test on ixre-egl-board73 INFO tests.conftest:conftest.py:3112 Collecting running config after test on ixre-egl-board74 INFO tests.conftest:conftest.py:3112 Collecting running config after test on ixre-egl-board73 INFO tests.conftest:conftest.py:3259 Core dump and config check passed for test_pfc_pause_lossless_with_snappi.py ----------- curtailed output ---------- ----------------------------------------------------------------------------------------------- live log sessionfinish ------------------------------------------------------------------------------------------------ INFO root:__init__.py:67 Can not get Allure report URL. Please check logs ============================================================================== 2 passed, 14 deselected, 10 warnings in 808.66s (0:13:28) ============================================================================== INFO:root:Can not get Allure report URL. Please check logs Signed-off-by: amitpawa <amit.2.pawar@nokia.com>
12 tasks
bpar9
pushed a commit
that referenced
this pull request
Apr 17, 2026
…kets not received on collector interface (sonic-net#22186) * [sonic-mgmt] Fix sflow/test_sflow.py failures with expected sflow packets not received on collector interface Issue #1: In some cases (like sflow config enabled for first time, device reboot), hsflowd daemon is taking little over 3 mins to be fully initialized and process collector config. During this window, hsflowd service won't send sflow packets ('CounterSample', 'FlowSample' etc) to collector interface and thus test can fail with i) "Packets are not received in active collector, collector\d+" and ii) "Expected Number of samples are not collected from Interface Ethernet\d+ in collector collector\d+ , Received \d+" hsflowd service is writing to "/etc/hsflowd.auto" once it's processed collector configuration. Thus waiting for collector info to be present in "/etc/hsflowd.auto" seems to be safe option before proceeding with sflow traffic verfication. Issue #2: If the test expects flow samples/packets on the collector interface but they aren't seen for some reason, then we are hitting "KeyError: 'flow_port_count'". Due to counter samples seen on collector interface, "data['total_samples']" will not be zero but "data['total_flow_count']" will be 0 and lead to KeyError when tried to access "data['flow_port_count']". Fix is to have assert on "total_flow_count" and "total_counter_count" before calling corresponding sample analyze functions. Signed-off-by: Vinod <vkjammala@arista.com> * Addressing review comments 1) Enhanced "wait_until_hsflowd_ready" to make it wait for all the collector IPs (instead of calling it sequentially for each IP) 2) Add docstring for "wait_until_hsflowd_ready" function 3) Updated "ast.literal_eval" usage to handle the case where "active_collectors" is passed as empty string ("" instead of "[]") Signed-off-by: Vinod <vkjammala@arista.com> * Fix pre-commit check failures Signed-off-by: Vinod <vkjammala@arista.com> * Revert PR#21674 partially to enable "sflow/test_sflow.py" test Signed-off-by: Vinod <vkjammala@arista.com> --------- Signed-off-by: Vinod <vkjammala@arista.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description of PR
Summary:
This PR adds a comprehensive PVST (Per-VLAN Spanning Tree) test suite designed for T0 topologies with two_vlan_a and four_vlan_a configurations. The test suite includes 23 test cases covering basic functionality, protection features, topology changes, configuration persistence, and scale testing.
Reviewer should start with:
tests/stp/test_pvst_t0.py- the main test file containing thePvstHelperclass, PTF traffic helpers, and all test cases.Link to Devin run: https://app.devin.ai/sessions/eccdda2912b14aca8c2a51252206d115
Requested by: bhavani@cisco.com (GitHub: @bpar9)
Updates since last revision
Added proper PTF traffic generation and verification based on patterns from
tests/vlan/test_vlan.pyandtests/fdb/test_fdb.py:ptf.testutils,ptf.packet as scapy,ptf.mask.Maskbuild_eth_packet()- L2 traffic packet constructionbuild_bpdu_packet()- IEEE 802.1D BPDU packet for BPDU Guard testsget_vlan_ptf_ports()- VLAN to PTF port mapping using config_facts/minigraphget_all_vlan_ptf_mapping()- All VLAN port mappingsverify_vlan_isolation()- VLAN isolation verificationverify_mac_learning()- MAC learning verificationsend_and_verify_vlan_traffic()- Traffic send/verify helperpvst_setupfixture to includecfg_facts,mg_facts,vlan_to_ptfType of change
Back port request
Approach
What is the motivation for this PR?
To provide automated test coverage for PVST functionality in SONiC, enabling validation of per-VLAN spanning tree instances, root bridge election, protection features (BPDU Guard, Root Guard, PortFast), and configuration persistence across reboots.
How did you do it?
Created a new
tests/stp/test module with:conftest.py: Fixtures for VLAN configuration and STP mode selectiontest_pvst_t0.py: 23 test cases organized into 9 test classes:TestPvstBasicFunctionality(5 tests): PVST enable, root bridge election, timer configurationTestPvstPortStateAndTraffic(3 tests): Port state verification, L2 forwarding, MAC learningTestPvstProtectionFeatures(3 tests): BPDU Guard, Root Guard, PortFastTestPvstTopologyChange(2 tests): TCN handling, link flap stabilityTestPvstT1Uplinks(2 tests): Port-Channel uplinks, traffic pathTestPvstConfigPersistence(3 tests): Save/reload, cold/warm rebootTestPvstStatisticsAndDebugging(2 tests): BPDU statistics, clear statisticsTestPvstNegative(2 tests): Invalid priority, non-existent VLANTestPvstScale(1 test): Maximum VLAN instancesHow did you verify/test it?
PvstHelpermatch actualshow spanning_treeoutput formatbuild_bpdu_packet()triggers BPDU Guard correctlyAny platform specific information?
No platform-specific requirements. Tests use standard SONiC STP CLI commands.
Supported testbed topology if it's a new test case?
two_vlan_aconfiguration (Vlan100, Vlan200)four_vlan_aconfiguration (Vlan1000-4000)Documentation
Test cases are based on the PVST Test Plan for T0 Topologies. Each test method includes docstrings with test case IDs (TC-PVST-T0-001 through TC-PVST-T0-023).
Human Review Checklist
config spanning_treeCLI syntax matches actual SONiC implementationPvstHelper.get_bridge_id(),get_root_id(),get_port_state(),get_topology_change_count()match actual output formatreboot()function call withlocalhost=Noneis correct for cold/warm reboot testsbuild_bpdu_packet()BPDU format triggers BPDU Guard on SONiC (uses IEEE 802.1D standard format with LLC header)get_vlan_ptf_ports()correctly maps VLAN members to PTF port indices using config_facts and minigraph_ptf_indicesverify_vlan_isolation()correctly tests VLAN flooding and isolation behavior