diff --git a/.flake8 b/.flake8 index 2c4d9db07..1d066969f 100644 --- a/.flake8 +++ b/.flake8 @@ -9,4 +9,47 @@ exclude = .venv venv .virtualenv - virtualenv \ No newline at end of file + virtualenv + py-scripts/sandbox + py-scripts/scripts_deprecated + +per-file-ignores = + # Temporarily ignore specific issues for failing scripts in + # 'py-scripts/tools/' directory until fixed + py-scripts/tools/lf_check.py: B007,B020,B036 + py-scripts/tools/lf_cli_to_launchjson.py: B006 + py-scripts/tools/lf_inspect.py: B006 + py-scripts/tools/lf_test_gen/lf_test_gen.py: B006,B036 + + # Temporarily ignore specific issues in failing interop scripts until fixed + py-scripts/DeviceConfig.py: B006,B036 + py-scripts/lf_interop_ping.py: B006,B036 + py-scripts/lf_interop_ping_plotter.py: B036 + py-scripts/lf_interop_port_reset_test.py: B007 + py-scripts/lf_interop_real_browser_test.py: B006,B007,B023 + py-scripts/lf_interop_rvr_test.py: B006,B007,B018 + py-scripts/lf_interop_video_streaming.py: B006,B007,B036 + py-scripts/lf_mixed_traffic.py: B015,B036 + py-scripts/real_application_tests/real_browser/lf_interop_real_browser_test.py: B006,B007,B036 + py-scripts/real_application_tests/youtube/lf_interop_youtube.py: B006,B007,B036 + py-scripts/real_application_tests/zoom_automation/lf_interop_zoom.py: B007,B036 + + # Temporarily ignore specific issues in other failing scripts + py-scripts/lf_graph.py: B006 + py-scripts/lf_multipsk.py: B007,B018 + py-scripts/lf_pcap.py: B007,B016 + py-scripts/lf_ping_sweep.py: B036 + py-scripts/lf_rf_char.py: B006,B007,B036 + py-scripts/lf_roam_test.py: B007,B012 + py-scripts/lf_rx_sensitivity_test.py: B006,B036 + py-scripts/lf_snp_test.py: B007 + py-scripts/run_voip_cx.py: B006 + py-scripts/ssh_remote.py: F824 + py-scripts/sta_connect.py: B007 + py-scripts/sta_connect2.py: B007 + py-scripts/sta_scan_test.py: B007,B018 + py-scripts/test_ip_connection.py: B007 + py-scripts/test_ip_variable_time.py: B018 + py-scripts/test_l3_longevity.py: B007 + py-scripts/test_l3_powersave_traffic.py: B007 + py-scripts/test_l3_unicast_traffic_gen.py: B006,B007,B036 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 800ea2a5d..a4a5c08d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,14 +23,14 @@ jobs: - name: flake8 Lint uses: py-actions/flake8@v2 - #with: - # plugins: "flake8-bugbear" + with: + plugins: "flake8-bugbear flake8-unused-arguments" help-check: # Tie runner to Ubuntu 22.04 LTS, as it still supports Python 3.7 # Minimum Python version on Ubuntu 24.04 LTS is Python 3.9. runs-on: ubuntu-22.04 - name: Help Check + name: Help and Help Summary Check steps: - name: Check out source repository uses: actions/checkout@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 83237faef..6c6a1df27 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,8 +11,9 @@ repos: rev: 7.0.0 hooks: - id: flake8 - #additional_dependencies: - # - "flake8-bugbear" + additional_dependencies: + - "flake8-bugbear" + - "flake8-unused-arguments" #- repo: https://github.com/shellcheck-py/shellcheck-py # rev: v0.9.0.5 diff --git a/README.md b/README.md index eea0dd02e..3784cf9af 100644 --- a/README.md +++ b/README.md @@ -1,164 +1,289 @@ # LANforge Perl, Python, and Shell Scripts -**This repository contains a collection of scripts and Python and Perl-based scripting libraries designed to automate LANforge systems.** - -Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if you have any questions or encounter issues. - ## Overview -These scripts span a variety of use cases, including automating Chamber View tests, configuring LANforge ports and traffic pairs, and much more. +**This repository contains a collection of scripts and Python and Perl-based scripting libraries designed to automate LANforge systems.** -**No additional setup is required to run these scripts on a system with LANforge pre-installed**. On your LANforge system, you can find this repository in the `/home/lanforge/scripts/` directory. (e.g. CT523c, CT521b). The contents of the directory match the version of LANforge installed on your system (see the [tagged releases](https://github.com/greearb/lanforge-scripts/tags) to clone specific version.) +These scripts span a variety of use cases, including automating Chamber View tests, configuring LANforge ports and traffic pairs, and much more. +Scripts will be kept backwards and forwards compatible with LANforge releases as much as possible. -To setup and use these scripts on a system without LANforge pre-installed or to use a specific version (e.g. specific LANforge release), please follow the instructions outlined in the [LANforge Python Scripts README](./py-scripts/README.md). +**No additional setup is required to run these scripts on a system with LANforge pre-installed**. On your LANforge system, you can find this repository in the +`/home/lanforge/scripts/` directory. The contents of the directory match the version of LANforge installed on your system (see the +[tagged releases](https://github.com/greearb/lanforge-scripts/tags) for tagged versions of scripts/automation). -For more advanced users wanting to develop their own automation, we offer the following: +As currently implemented, scripts in this repository require the directory structure as present. Many scripts import from and call into each other (primarily Python), +so modifying script location will likely break script assumptions. Things that may break assumptions and prevent script usage include moving the script to another directory. -- Auto-generated Python library in [`lanforge_client/`](./lanforge_client/) - - **NOTE: This library is under development and subject to change as it progresses.** - - Designed to make LANforge CLI commands and LANforge JSON API endpoints available in Python. - - See the [`README`](./lanforge_client/README.md) for more details. -- Perl modules in [`LANforge/`](./LANforge/) - - See the [`README`](./LANforge/README.md) for more details. - -If you would like to contribute to LANforge scripts, please read the [`CONTRIBUTING.md`](./CONTRIBUTING.md) document for more information. +Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if you have any questions or encounter issues. ## Contents -- [LANforge Perl, Python, and Shell Scripts](#lanforge-perl-python-and-shell-scripts) - - [Overview](#overview) - - [Contents](#contents) - - [Quick Tips](#quick-tips) - - [Documentation Links](#documentation-links) - - [Commonly Used Scripts](#commonly-used-scripts) - - [Exploring LANforge JSON API/Crafting CLI Commands](#exploring-lanforge-json-apicrafting-cli-commands) - - [Python Scripts](#python-scripts) - - [Perl and Shell Scripts](#perl-and-shell-scripts) - - [Compatibility](#compatibility) - - [Setup and Installation](#setup-and-installation) - - [Python Scripts](#python-scripts-1) - - [Perl Scripts](#perl-scripts) - - [License](#license) +- [Overview](#overview) +- [Contents](#contents) +- [Quick Tips](#quick-tips) + - [Documentation Links](#documentation-links) + - [Basic Terminology](#basic-terminology) +- [Setup and Installation](#setup-and-installation) + - [Installing from Source Prerequisites](#installing-from-source-prerequisites) + - [Installing from Source Setup](#installing-from-source-setup) + - [Installing from Source Perl Scripts/Automation Setup](#installing-from-source-perl-scriptsautomation-setup) +- [Scripts/Automation by Type](#scriptsautomation-by-type) + - [Creation/Configuration Scripts](#creationconfiguration-scripts) + - [Chamber View Scripts](#chamber-view-scripts) + - [Test Scripts](#test-scripts) + - [Utility Scripts](#utility-scripts) + - [Library Code Scripts](#library-code-scripts) (Not suggested) + - [Unsorted or Older Scripts](#unsorted-or-older-scripts) +- [Advanced Usage/Library-style Code](#advanced-usage-library-style-code) + - [LANforge HTTP API and Telnet CLI](#lanforge-http-api-and-telnet-cli) + - [LANforge HTTP API and Telnet CLI Commands Overview](#lanforge-http-api-and-telnet-cli-commands-overview) + - [Querying LANforge HTTP API](#querying-lanforge-http-api) + - [LANforge Command Composer (Interactive HTTP API and CLI Tool)](#lanforge-command-composer-interactive-http-api-and-cli-tool) +- [Additional System Configuration](#additional-system-configuration) + - [Configure Non-Root Serial Access](#configure-non-root-serial-access) +- [License](#license) ## Quick Tips -**NOTE:** In LANforge documentation, the term 'port' is used interchangable for network interface. - ### Documentation Links +- [LANforge Scripts/Automation Installation](#setup-and-installation) - [LANforge CLI Users Guide](https://www.candelatech.com/lfcli_ug.php) - [LANforge Scripting Cookbook](http://www.candelatech.com/scripting_cookbook.php) - [Querying the LANforge JSON API using Python Cookbook](https://www.candelatech.com/cookbook/cli/json-python) -### Commonly Used Scripts +### Basic Terminology -The `lf_*.pl` scripts are typically more complete and general purpose -scripts, though some are ancient and very specific. +| Name | Definition | +| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Port | Network interface (station, 802.1Q VLAN, Ethernet), WiFi radio, etc. | +| Resource | LANforge system ID. For example, a two LANforge system testbed would have two LANforge resources. | +| Shelf | Generally can be omitted for automation purposes (e.g. '1.1.wlan0' same as '1.wlan0'), but some scripts/automation may not permit this. | +| EID | Entity identifier. Uniquely identifies LANforge object with meaning depending on context (e.g. in 'Port Mgr' tab, EID identifies a port) | +| Port EID | Comes in format shelf, resource, port number/name, e.g. '1.1.wiphy0'. For automation pourposes, shelf and even resource may be omitted. Assumed to be '1' in such case. | +| Attenuator EID | Comes in format shelf, resource, attenuator serial, e.g. '1.1.4314'. For automation pourposes, shelf and even resource may be omitted. Assumed to be '1' in such case. | +| STA, Station, Client | Interchangable terms used to refer to a WiFi device (emulated or real) | +| Endpoint | Overloaded term which can refer to traffic generation endpoint or LANforge HTTP API endpoint. Meaning depends on context. | -In particular, these scripts are more modern and may be a good place to start: +## Setup and Installation -| Name | Purpose | -| -------------------- | ---------------------------------------------------------------------------- | -| `lf_associate_ap.pl` | LANforge server script for associating virtual stations to an arbitrary SSID | -| `lf_attenmod.pl` | Query and update CT70X programmable attenuators | -| `lf_firemod.pl` | Query and update connections (Layer 3) | -| `lf_icemod.pl` | Query and update WAN links and impairments | -| `lf_portmod.pl` | Query and update physical and virtual ports | -| `lf_tos_test.py` | Generate traffic at different QoS and report in spreadsheet | -| `lf_sniff.py` | Create packet capture files, especially OFDMA /AX captures | +There are two primary methods to use LANforge scripts: -The `lf_wifi_rest_example.pl` script shows how one might call the other scripts from -within a script. +1. Using the version available on your pre-installed LANforge system (**no setup required**) -### Exploring LANforge JSON API/Crafting CLI Commands + On pre-installed LANforge systems, LANforge scripts are installed in `/home/lanforge/scripts/py-scripts/`. No setup is required + (dependencies come pre-installed), as this is done for you during install/upgrades. -When the LANforge GUI is running, a user can use the web-based LANforge Command Composer tool to generate CLI commands, either for use directly through the telnet interface (port 4001) or indirectly through the `cli-json/` LANFORGE JSON API endpoint. + Pre-installed scripts in `/home/lanforge/scripts/py-scripts/` match the LANforge software version already installed on the system. -To access this tool, perform the following steps: +2. By installing from the Git repository (repository [here](https://github.com/greearb/lanforge-scripts)) -1. Navigate to the Help page (either from the LANforge or remotely) + Installation from source is generally required for users looking to configure LANforge automation on a system where LANforge isn't pre-installed, + install a specific version, or more advanced use cases, installation/setup is required. - - From the LANforge system (e.g. through VNC): [`http://localhost:8080/help`](http://localhost:8080/help) - - Remotely: - - Directly by IP address: `http://192.168.1.101:8080/help` - - If your network supports DNS resolution: `http://ct523c-cafe:8080/help` + Instructions for this are detailed in [this section](#installing-from-source). -2. Click on the link for your desired command, e.g. `add_sta` +### Installing from Source - - Each CLI command will display two links. The link _on the left side_ takes you to the Command Composer tool +#### Installing from Source Prerequisites -3. Set the desired fields for the command +For users who clone or download these scripts from the Git repo, some setup is required. This process is generally for more advanced users or developers. +However, if you have questions, please email [`support@candelatech.com`](mailto:support@candelatech.com), and we can guide you through. -4. Click the `Parse Command` at the top - - This generates CLI output for the fields you configured at the top of the webpage - - Generated output includes: - - CLI command for use in the telnet interface - - Commands to manually send data to the `cli-json/` LANFORGE JSON API endpoint - -More information on other LANforge JSON API endpoints can be by navigating to the main (root) endpoint `http://localhost:8080/` or querying it through `curl` (very verbose, e.g. `curl http://localhost:8080 | jq`). - -## Python Scripts - -**NOTE: LANforge Python scripts require Python 3.7+** (which is backwards compatible to Fedora 27 systems). - -See the [LANforge Python Scripts README](./py-scripts/README.md) for more information, including setup for use on non-LANforge systems. - -Existing offerings largely include test and helper scripts in addition to importable library code for external use and/or use in new automation. - -Helper scripts, especially creation and modification scripts, are designed as tools in a toolbox. Each toolbox script performs a single task, like a tool in the toolbox. For example, the [`create_station.py`](./py-scripts/create_station.py) is designed to create and configure LANforge station ports, providing many options for that specific use case. - -| Name | Purpose | -| ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `create_bond.py` | Creates and configures a single Bond port using a variable number of child ports | -| [`create_bridge.py`](./py-scripts/create_bridge.py) | Creates and configures a single Bridge port using a variable number of child ports | -| `create_chamberview_dut.py` | Creates a single LANforge DUT object, primarily useful in Chamber View | -| `create_chamberview.py` | Creates a single LANforge Chamber View Scenario | -| `create_l3.py` | Creates and configures a variable number of LANforge L3 CX traffic pairs using existing ports | -| `create_l4.py` | Creates and configures a variable number of LANforge L4 traffic endpoints using existing ports | -| [`create_macvlan.py`](./py-scripts/create_macvlan.py) | Creates and configures a variable number of MACVLAN ports (different from 802.1Q VLAN) using a single parent interface | -| [`create_qvlan.py`](./py-scripts/create_qvlan.py) | Creates and configures a variable number of 802.1Q VLAN ports using a single parent interface | -| [`create_station.py`](./py-scripts/create_station.py) | Creates and configures a variable number of WiFi stations using a single parent radio | -| `create_vap.py` | Creates and configures a variable number of WiFi virtual APs (vAPs) using a single parent radio | -| `csv_convert.py` | Python script to read in a LANforge Dataplane CSV file and output a csv file that works with a customer's RvRvO visualization tool. | -| `csv_processor.py` | Python script to assist processing csv files | -| `lf_ap_auto_test.py` | This script is used to automate running AP-Auto tests | -| `lf_dataplane_test.py` | This script is used to automate running Dataplane tests | -| `lf_ftp_test.py` | Python script will create stations and endpoints to generate and verify layer-4 traffic over an ftp connection | -| `lf_graph.py` | Classes for creating images from graphs using data sets | -| `lf_mesh_test.py` | This script is used to automate running Mesh tests | -| `lf_report.py` | This program is a helper class for reporting results for a lanforge python script | -| `lf_report_test.py` | Python script to test reporting | -| `lf_rvr_test.py` | This script is used to automate running Rate-vs-Range tests | -| `lf_snp_test.py` | Test scaling and performance (snp) run various configurations and measures data rates | -| `lf_tr398_test.py` | This script is used to automate running TR398 tests | -| `lf_wifi_capacity_test.py` | This is a test file which will run a wifi capacity test | -| `run_cv_scenario.py` | Set the LANforge to a BLANK database then it will load the specified database and start a graphical report | -| `rvr_scenario.py` | This script will set the LANforge to a BLANK database then it will load the specified database and start a graphical report | -| `scenario.py` | Python script to load a database file and control test groups | -| `sta_connect.py` | Create a station, run TCP and UDP traffic then verify traffic was received. Stations are cleaned up afterwards | -| `sta_connect2.py` | Create a station, run TCP and UDP traffic then verify traffic was received. Stations are cleaned up afterwards | -| `sta_connect_example.py` | Example of how to instantiate StaConnect and run the test | -| `sta_connect_multi_example.py` | Example of how to instantiate StaConnect and run the test | -| `stations_connected.py` | Contains examples of using realm to query stations and get specific information from them | -| `test_client_admission.py` | This script will create one station at a time and generate downstream traffic | -| `test_fileio.py` | Test FileIO traffic | -| `test_generic.py` | Test generic traffic using generic cross-connect and endpoint type | -| `test_ipv4_ttls.py` | Test connection to ttls system | -| `test_ipv6_connection.py` | Test IPV6 connection to VAPs of varying security types (WEP, WPA, WPA2, WPA3, Open) | -| `test_l3_WAN_LAN.py` | Test traffic over a bridged NAT connection | -| `test_l3_longevity.py` | Create variable stations on multiple radios, configurable rates, PDU, ToS, TCP and/or UDP traffic, upload and download, attenuation | -| `test_l3_powersave_traffic.py` | Python script to test for layer 3 powersave traffic | -| `test_l3_scenario_throughput.py` | Load an existing scenario and run the simultaneous throughput over time and generate report and P=plot the G=graph | -| `test_l3_unicast_traffic_gen.py` | Generate unicast traffic over a list of stations | -| `test_status_msg.py` | Test the status message passing functions of /status-msg | -| `test_wanlink.py` | Python script to test wanlink creation | -| `testgroup.py` | Python script to test creation and control of test groups | -| `tip_station_powersave.py` | Generate and test for powersave packets within traffic run over multiple stations | -| `update_dependencies.py` | Installs required Python dependencies required to run LANforge Python scripts. See the [`py-scripts/` README](./py-scripts/README.md#setup) for more information. | -| `wlan_capacity_calculator.py` | Standard Script for WLAN Capacity Calculator | -| `ws_generic_monitor_test.py` | This example is to demonstrate ws_generic_monitor to monitor events triggered by scripts, This script when running, will monitor the events triggered by test_ipv4_connection.py | - -## Perl and Shell Scripts +Please ensure the following criteria are met before installing LANforge scripts (installation steps [here](#installing-from-source-setup)): + +1. Familiarity with the command line (e.g. `bash`) + + - Installation will require running commands, most likely on a Linux system + +2. Python 3.7+ and Git installed on system + + - **LANforge Python automation requires Python 3.7+**. Most systems and Linux distributions should have a newer version available for install. + However, Python 3.7 continues to be our minimum supported version to ensure backwards compatibility with older LANforge systems. + + - How this is completed will depend on the system used. Generally, we encourage installing Python and Git through the + system (e.g. `apt` on Ubuntu) and installing Python libraries/dependencies in a virtual environment (detailed in instructions) + +3. Known target LANforge software version + + - **We strongly encourage matching the version of LANforge scripts to the version installed on your LANforge**, unless there is a specific need + (e.g. new feature or bug fix). While not recommended, it is possible to use the latest version as well. + +#### Installing from Source Setup + +**NOTE:** Developers and anyone looking to contribute to LANforge scripts should also familiarize themselves with the information outlined +in the [`CONBTRIBUTING.md` document](../CONTRIBUTING.md). + +**NOTE:** **For usage directly on a LANforge system, these steps are not necessary**, as the scripts/automation are already fully installed in +`/home/lanforge/scripts/` and match the version of LANforge already installed on the system. + +This section details how to setup LANforge scripts/automation using a specific version (e.g. 5.4.9). To use Perl-based scripts/automation, +please complete the below instructions then proceed to [this section](#installing-from-source-perl-scriptsautomation-setup). + +1. Open a shell and clone LANforge scripts + + ```Bash + git clone https://github.com/greearb/lanforge-scripts + ``` + +2. Get the version-tagged commits of the repository + + ```Bash + git fetch --tags + ``` + +3. List the version-tagged commits available + + ```Bash + git tag + ``` + +4. Select the matching tag for your LANforge system's version + + ```Bash + # Checkout LANforge 5.4.9 version of LANforge scripts. + git checkout lf-5.4.9 + ``` + +5. Create and source a Python virtual environment (optional but **strongly suggested**) + + We suggest Python's [builtin virtual environment tool](https://docs.python.org/3/tutorial/venv.html) for simplicity, although other + tools requiring more configuration like [Anaconda](https://anaconda.org/) will work as well. + + ```Bash + # Create Python virtual environment named 'venv' + virtualenv venv + + # Enter the Python virtual environment (Linux) + source venv/bin/activate + ``` + +6. Enter the `lanforge-scripts/py-scripts/` directory + +7. Run the dependency installation script + + ```Bash + # This step may take a moment to complete + ./update_dependencies.py + ``` + +Once you have successfully completed these steps, you can now use the LANforge Python scripts. +To use Perl scripts/automation, please proceed to [this section](#installing-from-source-perl-scriptsautomation-setup) + +#### Installing from Source Perl Scripts/Automation Setup + +To use LANforge Perl automation, the system which will run the scripts must have the following packages installed. On Linux systems, most of these packages are available through your system's package manager as `.deb` or `.rpm` packages. + +| Package | RPM | Required | +| ----------------- | ------------------ | ---------------------------- | +| Net::Telnet | perl-Net-Telnet | Yes | +| JSON | perl-JSON | Yes, for JSON parsing | +| JSON::PrettyPrint | perl-JSON-PP | No, but useful for debugging | +| Pexpect | python3-pexpect | Yes | +| XlsxWriter | python3-xlsxwriter | Yes, for Xlsx output | + +## Scripts/Automation by Type + +LANforge scripts and automation offerings vary widely, including test scripts, "toolbox" scripts (i.e. perform one task like creating stations), library code which may be imported by other scripts, and utility scripts. Given the large number of available scripts and automation, the following sections aim to guide a user to their desired script/automation based on their needs. + +For Python scripts in `py-scripts/`, run the script with the `--help_summary` option to list a summary of script functionality and purpose. +Generally, Python scripts support a `--help` option which prints all arguments supported by a given script. + +Should a script or automation not exist for your needs, please reach out to [`support@candelatech.com`](mailto:support@candelatech.com) detailing general requirements for your desired use case. + +### Creation/Configuration Scripts + +These are generally single-use scripts aimed at creating and configuring LANforge items like stations, traffic pairs, and more. + +| Name | Purpose | +| ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| [`lf_attenmod.pl`](./lf_attenmod.pl) | This program is used to modify the LANforge attenuator through the LANforge | +| [`create_bond.py`](./py-scripts/create_bond.py) | Create and configure a single Bond port using a variable number of child ports | +| [`create_bridge.py`](./py-scripts/create_bridge.py) | Create and configure a single Bridge port using a variable number of child ports | +| [`create_l3.py`](./py-scripts/create_l3.py) | Create and configure a variable number of LANforge L3 CX traffic pairs using existing ports | +| [`create_l4.py`](./py-scripts/create_l4.py) | Create and configure a variable number of LANforge L4 traffic endpoints using existing ports | +| [`create_macvlan.py`](./py-scripts/create_macvlan.py) | Create and configure a variable number of MACVLAN ports (different from 802.1Q VLAN) using a single parent interface | +| [`create_qvlan.py`](./py-scripts/create_qvlan.py) | Create and configure a variable number of 802.1Q VLAN ports using a single parent interface | +| [`create_station.py`](./py-scripts/create_station.py) | Create and configure a variable number of WiFi stations using a single parent radio | +| [`create_vap.py`](./py-scripts/create_vap.py) | Create and configure a variable number of WiFi virtual APs (vAPs) using a single parent radio | +| [`lf_firemod.pl`](./lf_firemod.pl) | Queries and modifies L3 connections | +| [`lf_icemod.pl`](./lf_icemod.pl) | Queries and modifies WANLink connections | +| [`lf_ice.pl`](./lf_ice.pl) | Creates and configures wanlinks | +| [`lf_portmod.pl`](./lf_portmod.pl) | Queries and changes LANforge physical and virtual ports | + +### Chamber View Scripts + +Automation for LANforge GUI test automation available in the 'Chamber View' window. + +See the documentation [here](./py-scripts/cv_examples/) for more information on Chamber View test overview, configuration, and automation examples. + +| Name | Purpose | +| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| [`create_chamberview_dut.py`](./py-scripts/create_chamberview_dut.py) | Create a single LANforge Chamber View DUT object, primarily useful in Chamber View tests | +| [`create_chamberview.py`](./py-scripts/create_chamberview.py) | Create a single LANforge Chamber View Scenario, useful for larger-scale test configuration where manual configuration would become tedious | +| [`lf_ap_auto_test.py`](./py-scripts/lf_ap_auto_test.py) | Automate the AP-Auto Chamber View test | +| [`lf_continuous_throughput_test.py`](./py-scripts/lf_continuous_throughput_test.py) | Automate the Continuous Throughput Chamber View test | +| [`lf_dataplane_test.py`](./py-scripts/lf_dataplane_test.py) | Automate the Dataplane Chamber View test | +| [`lf_mesh_test.py`](./py-scripts/lf_mesh_test.py) | Automate the Mesh Chamber View test | +| [`lf_rvr_test.py`](./py-scripts/lf_rvr_test.py) | Automate the Rate-vs-Range Chamber View test | +| [`lf_tr398_test.py`](./py-scripts/lf_tr398_test.py) | Automate the TR398 Issue 1 Chamber View test | +| [`lf_tr398v2_test.py`](./py-scripts/lf_tr398v2_test.py) | Automate the TR398 Issue 2 Chamber View test | +| [`lf_tr398v4_test.py`](./py-scripts/lf_tr398v4_test.py) | Automate the TR398 Issue 4 Chamber View test | +| [`lf_wifi_capacity_test.py`](./py-scripts/lf_wifi_capacity_test.py) | Automate the WiFi Capacity Chamber View test | +| [`run_cv_scenario.py`](./py-scripts/run_cv_scenario.py) | Configure a LANforge | + +### Test Scripts + +General test scripts for automating LANforge tests (see [this section](#chamber-view-scripts) for scripts which automate Chamber View tests). + +| Name | Purpose | +| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| [`lf_ftp_test.py`](./py-scripts/lf_ftp.py) | Python script will create stations and endpoints to generate and verify layer-4 traffic over an ftp connection | +| [`lf_snp_test.py`](./py-scripts/lf_snp_test.py) | Test scaling and performance (snp) run various configurations and measures data rates | +| [`sta_connect.py`](./py-scripts/sta_connect.py) | Create a station, run TCP and UDP traffic then verify traffic was received. Stations are cleaned up afterwards | +| [`sta_connect2.py`](./py-scripts/sta_connect2.py) | Create a station, run TCP and UDP traffic then verify traffic was received. Stations are cleaned up afterwards | +| [`test_fileio.py`](./py-scripts/test_fileio.py) | Test FileIO traffic | +| [`test_generic.py`](./py-scripts/test_generic.py) | Test generic traffic using generic cross-connect and endpoint type | +| [`test_l3_WAN_LAN.py`](./py-scripts/test_l3_WAN_LAN.py) | Test traffic over a bridged NAT connection | +| [`test_l3_longevity.py`](./py-scripts/test_l3_longevity.py) | Create variable stations on multiple radios, configurable rates, PDU, ToS, TCP and/or UDP traffic, upload and download, attenuation | +| [`test_l3_powersave_traffic.py`](./py-scripts/test_l3_powersave_traffic.py) | Python script to test for layer 3 powersave traffic | +| [`test_l3_unicast_traffic_gen.py`](./py-scripts/test_l3_unicast_traffic_gen.py) | Generate unicast traffic over a list of stations | +| [`tip_station_powersave.py`](./py-scripts/tip_station_powersave.py) | Generate and test for powersave packets within traffic run over multiple stations | +| [`wlan_capacity_calculator.py`](./py-scripts/wlan_capacity_calculator.py) | Standard Script for WLAN Capacity Calculator | + +### Utility Scripts + +Scripts/automation to perform small tasks on the system but not run tests or configure ports for test usage. + +| Name | Purpose | +| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [`check_large_files.sh`](./check_large_files.bash) | Utility script to increase available disk space by removing old kernels, logs, etc. as prompted | +| [`csv_convert.py`](./py-scripts/csv_convert.py) | Python script to read in a LANforge Dataplane CSV file and output a csv file that works with a customer's RvRvO visualization tool. | +| [`csv_processor.py`](./py-scripts/csv_processor.py) | Python script to assist processing csv files | +| [`lf_log_parse.pl`](./lf_log_parse.pl) | Convert the timestamp in LANforge logs (it is in unix-time, miliseconds) to readable date | +| [`lf_monitor.pl`](./lf_monitor.pl) | Monitor L4 connections | +| [`lf_parse_tshark_log.pl`](./lf_parse_tshark_log.pl) | Basic parsing of tshark logs | +| [`print_udev.sh`](./print_udev.sh) | Prints out Linux `udev` rules describing how to name ports by MAC address | +| [`sensorz.pl`](./sensorz.pl) | Displays temperature readings for CPU, mt7915 radios, ath10k radios | +| [`sysmon.sh`](./sysmon.sh) | grabs netdev stats and timestamp every second or so, saves to logfile. | +| [`topmon.sh`](./topmon.sh) | LANforge system monitor that can be used from cron | +| [`update_dependencies.py`](./py-scripts/update_dependencies.py) | Installs Python dependencies required to run LANforge Python scripts. See the [`py-scripts/README`](./py-scripts/README.md#setup) for more information. | + +### Library Code Scripts + +These scripts/automation are presently used via relative importing from other scripts, including some scripts which also run tests when invoked directly. +This method is discouraged for new automation but available when absolutely necessary. The list is non-comprehensive. + +| Name | Purpose | +| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| [`lf_graph.py`](./py-scripts/lf_graph.py) | Classes for creating images from graphs using data sets | +| [`lf_report.py`](./py-scripts/lf_report.py) | This program is a helper class for reporting results for a lanforge python script | +| [`sta_connect.py`](./py-scripts/sta_connect.py) | Create a station, run TCP and UDP traffic then verify traffic was received. Stations are cleaned up afterwards | +| [`sta_connect2.py`](./py-scripts/sta_connect2.py) | Create a station, run TCP and UDP traffic then verify traffic was received. Stations are cleaned up afterwards | + +### Unsorted or Older Scripts + +Unsorted and generally older scripts. These are generally not regularly used and may sometimes show errors. This list is non-comprehensive. | Name | Purpose | | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -168,27 +293,19 @@ Helper scripts, especially creation and modification scripts, are designed as to | `ftp-upload.pl` | Use this script to collect and upload station data to FTP site | | `imix.pl` | packet loss survey tool | | `lf_associate_ap.pl` | LANforge server script for associating virtual stations to an chosen SSID | -| `lf_attenmod.pl` | This program is used to modify the LANforge attenuator through the LANforge | | `lf_auto_wifi_cap.pl` | This program is used to automatically run LANforge-GUI WiFi Capacity tests | | `lf_cmc_macvlan.pl` | Stress test sets up traffic types of udp , tcp , continuously starts and stops the connections | | `lf_create_bcast.pl` | creates a L3 broadcast connection | | `lf_cycle_wanlinks.pl` | example of how to call lf_icemod.pl from a script | | `lf_endp_script.pl` | create a hunt script on a L3 connection endpoint | -| `lf_firemod.pl` | queries and modifies L3 connections | | `lf_generic_ping.pl` | Generate a batch of Generic lfping endpoints | | `lf_gui_cmd.pl` | Initiate a stress test | -| `lf_icemod.pl` | queries and modified WANLink connections | -| `lf_ice.pl` | adds and configures wanlinks | | `lf_l4_auth.pl` | example of scripting L4 http script with basic auth | | `lf_l4_reset.sh` | reset any layer 4 connection that reaches 0 Mbps over last minute | -| `lf_log_parse.pl` | Convert the timestamp in LANforge logs (it is in unix-time, miliseconds) to readable date | | `lf_loop_traffic.sh` | Repeatedly start and stop a L3 connection | | `lf_macvlan_l4.pl` | Set up connection types: lf_udp, lf_tcp across 1 real port and many macvlan ports on 2 machines. Then continously starts and stops the connections. | | `lf_mcast.bash` | Create a multicast L3 connection endpoint | -| `lf_monitor.pl` | Monitor L4 connections | | `lf_nfs_io.pl` | Creates and runs NFS connections | -| `lf_parse_tshark_log.pl` | Basic parsing of tshark logs | -| `lf_portmod.pl` | Queries and changes LANforge physical and virtual ports | | `lf_port_walk.pl` | Creates a series of connections, useful for basic firewall testing | | `lf_show_events.pl` | Displays and clears LANforge event log | | `lf_staggered_dl.sh` | his script starts a series of Layer-3 connections across a series of stations each station will wait $nap seconds, download $quantity KB and then remove its old CX. | @@ -202,42 +319,190 @@ Helper scripts, especially creation and modification scripts, are designed as to | `list_phy_sta.sh` | Lists virtual stations backed by specified physical radio | | `min_max_ave_station.pl` | This script looks for min-max-average bps for rx-rate in a station csv data file | | `multi_routers.pl` | Routing cleanup script that can be used with virtual routers | -| `print_udev.sh` | Prints out Linux Udev rules describing how to name ports by MAC address | -| `sensorz.pl` | Displays temperature readings for CPU and ATH10K radios | | `show-port-from-json.pl` | Example script showing how to display a slice from a JSON GUI response | | `station-toggle.sh` | Use this script to toggle a set of stations on or off | -| `sysmon.sh` | grabs netdev stats and timestamp every second or so, saves to logfile. | | `test_refcnt.pl` | creates MAC-VLANs and curl requests for each | -| `topmon.sh` | LANforge system monitor that can be used from cron | | `wait_on_ports.pl` | waits on ports to have IP addresses, can up/down port to stimulate new DHCP lease | | `wifi-roaming-times.pl` | parses `wpa_supplicant_log.wiphyX` file to determine roaming times | -## Compatibility +## Advanced Usage, Library-style Code -Scripts will be kept backwards and forwards compatible with LANforge -releases as much as possible. +For more advanced users wanting to looking their own automation, we offer the following: -## Setup and Installation +- Auto-generated Python library in [`lanforge_client/`](./lanforge_client/) + + - **NOTE: This library is under development and subject to change as it progresses.** + - Designed to make LANforge CLI commands and LANforge JSON API endpoints available in Python. + + - See the [`README`](./lanforge_client/README.md) for more details. -Pre-installed LANforge systems generally do not require additional setup, save for specific advanced use cases. The scripts version on the system (located in `/home/lanforge/scripts/`) will match the version of LANforge software installed. +- Perl modules in [`LANforge/`](./LANforge/) -As currently implemented, scripts in this repository require the structure of this directory as present. Many scripts import from and call into each other (primarily Python), so modifying script location will likely break script assumptions. Things that may break assumptions and prevent script usage include moving the script to another directory. + - See the [`README`](./LANforge/README.md) for more details. -### Python Scripts +If you would like to contribute to LANforge scripts, please read the [`CONTRIBUTING.md`](./CONTRIBUTING.md) document for more information. -See the setup steps outlined in the `py-scripts/` README [here](./py-scripts/README.md) for Python scripting setup, including configuring a specific version of LANforge scripts. +### LANforge HTTP API and Telnet CLI -### Perl Scripts +**NOTE:** The term endpoint may be confusing, as you may also see the term 'endpoint' refer to traffic generation endpoints. In this section, all reference to 'endpoint' refers +to the HTTP version unless indicated otherwise. Please see [this section](#basic-terminology) for more commonly-used LANforge terminology. -To use LANforge Perl automation, the system which will run the scripts must have the following packages installed. On Linux systems, most of these packages are available through your system's package manager as `.deb` or `.rpm` packages. +#### LANforge HTTP API and Telnet CLI Commands Overview -| Package | RPM | Required | -| ----------------- | ------------------ | ---------------------------- | -| Net::Telnet | perl-Net-Telnet | Yes | -| JSON | perl-JSON | Yes, for JSON parsing | -| JSON::PrettyPrint | perl-JSON-PP | No, but useful for debugging | -| Pexpect | python3-pexpect | Yes | -| XlsxWriter | python3-xlsxwriter | Yes, for Xlsx output | +When the LANforge GUI is running, a user can query and configure their LANforge system using the LANforge HTTP API and/or the [telnet LANforge CLI](https://www.candelatech.com/lfcli_ug.php). + +The HTTP API service runs on port 8080 _wherever the LANforge GUI runs_ and exposes HTTP API endpoints for various uses. Separately, the +LANforge testbed manager exposes direct LANforge CLI access via a telnet-like interface on port 4001. We recommend the HTTP API for most use cases. + +Most HTTP endpoints exist to query the system and generally match 1:1 with tabs in the LANforge GUI. The data available from query HTTP endpoints is +returned as JSON and corresponds to the data available in the respective GUI tab (in the table). By default, only a limited set of data is returned +for each endpoint. However, more specific fields may be queried as needed. HTTP endpoints for configuration include `/cli-json/` and `/cli-form/`, +both of which accept CLI commands in JSON and URL-encoded formats, respectively. + +Information on available HTTP API endpoints is available at the main/root HTTP endpoint `http://GUI_SYSTEM_IP_HERE:8080/`, accessible via browser or by querying it +through `curl` (very verbose, e.g. `curl http://GUI_SYSTEM_IP_HERE:8080 | jq`). Additional information is available in our online documentation as well as in the HTTP +API help page `http://GUI_SYSTEM_IP_HERE:8080/help`. + +#### Querying LANforge HTTP API + +**For users developing automation directly in Python, the LANforge HTTP API Python code available [here](./lanforge_client/) may be easier to use (less boilerplate).** +Reference automation for querying the LANforge HTTP API in Python directly (not recommended) is available [here](./py-scripts/examples/README.md). + +For most users, the existing scripts/automation are sufficient for configuring the LANforge system. However, often times users may want to query system +state while a test is running (e.g. get station statistics). What follows is a quick walk through of querying the HTTP API directly. **This section +uses a specific example, but the concepts apply to all LANforge HTTP API endpoints for querying data.** + +As detailed in [the previous section](#lanforge-http-api-and-telnet-cli-commands-overview), the LANforge HTTP API endpoints for querying system state +generally correspond 1:1 with LANforge GUI tabs. Data returned by invoking the endpoints corresponds to the data present in the respective tab (including +data not shown in hidden columns). + +Take for example a use case like querying station statistics. This data is present in the 'Port Mgr' tab and includes fields like IP address, SSID, BSSID, +link rates, mode, and much more. Through the LANforge HTTP API, this data is available by querying the `/ports/` HTTP API endpoint, specifically using an +HTTP GET request. In this example, we will perform several different queries depending on the data desired beginning with the simplest example and working +up to a more complicated query. + +1. **Querying basic data for all ports** + + Let's first start by running a query for basic data on all ports. The following `curl` command line CLI will return some basic information (keep the `| jq` + portion to pretty print the data). Notably, though, _this will only return a small portion of all available data for each port_. + + ```Bash + # Assumes LANforge GUI running at IP 192.168.1.101 (e.g. LANforge system) + # The '-s' flag means silent limiting output to only returned data + curl -s 192.168.1.101:8080/ports | jq + ``` + + As you may see, this command line CLI will only return a portion of available data data for all available ports in the testbed. + +2. **Query verbose data for a specific port** + + Say instead, we would like to query for data for the specific port `1.1.wlan0` (recall that the format of this EID is shelf, resource, and port name/number). + In this case, the following CLI command will query data for only this specific port. However, since it only queries one port, the LANforge HTTP API _will return more + verbose data than when querying all ports_. + + ```Bash + # Query basic data for only port '1.1.wlan0' + curl -s 192.168.1.101:8080/ports | jq + ``` + +3. **Query specific data for both all ports and a specific port** + + Now that we've queried basic data for all ports and more verbose data for a specific port, let's finish by running a **query for specific data from all ports**. + Keep in mind that _when querying specific data, we must specify all desired fields_. The data returned in a basic query will not be returned here unless + we specify it. + + For querying specific data, we must specify the desired data using the `?fields=` portion of the URL and comma-separate the values. These fields match the + columns in a given tab, in this case the 'Port Mgr' tab. Generally, you can take the name and convert it to lowercase to query it. For example, to query the + fields 'Alias', 'Down, 'Phantom', and 'Signal, you would add the following to the LANforge HTTP API URL `?fields=alias,down,phantom,signal`. That said, fields + with special characters require an additional step. + + Since fields are specified via URL and URLs have specific format requirements, **special characters like spaces must be _percent-encoded_**. For example, the field + 'Rx Bytes' is specified like `rx%20bytes` when URL-encoded (or `rx+bytes` with shorthand). Adding a space to a URL, for example `?fields=rx bytes` results in an + _invalid URL_. See [this webpage](https://en.wikipedia.org/wiki/Percent-encoding) for more information on percent-encoding. + + Taking all these concepts, the following command line CLI examples will query specific fields for all ports and the `1.1.wlan0` port. The specific fields queried + here are the basic fields in addition to `IP`, `SSID`, `AP` (BSSID), `Signal`, `Mode`, `Rx-Rate`, `Tx-Rate`, `Rx Bytes`, and `Tx Bytes`. + + ```Bash + # Query specific data for all ports + curl -s 192.168.1.101:8080/ports?fields=alias,down,phantom,ip,ssid,ap,signal,mode,rx-rate,tx-rate,rx+bytes,tx+bytes | jq + + # Query specific data for only port '1.1.wlan0' + curl -s 192.168.1.101:8080/ports/1/1/wlan0?fields=alias,down,phantom,ip,ssid,ap,signal,mode,rx-rate,tx-rate,rx+bytes,tx+bytes | jq + ``` + +#### LANforge Command Composer (Interactive HTTP API and CLI Tool) + +In order to better understand and use the HTTP API and CLI commands for system _configuration_, LANforge offers the web-based LANforge Command Composer. With this tool, a user can +dynamically generate CLI commands, either for use via the HTTP API via the `/cli-json/` and `/cli-form/` endpoints or directly through the telnet interface (port 4001). + +To access and use this tool, perform the following steps: + +1. In a browser, navigate to the LANforge HTTP API 'Help' page + + - Note that the IP or hostname should be the system where the _GUI_ is running + - If the GUI is running on the LANforge system (assume LANforge IP address `192.168.1.101`): + + - Access from the LANforge system (e.g. in Firefox through VNC session): + + `http://localhost:8080/help` + + - Remotely (e.g. from your laptop): + + - Directly by IP address: + + `http://192.168.1.101:8080/help` + + - Via DNS resolution, if supported by your network: + + `http://ct523c-cafe:8080/help` + +2. For the desired command (e.g. `add_sta`), click the _left_ link + + - Each CLI command will display two links. The link _on the left side_ takes you to the Command Composer tool. + The right link takes you to the command in our CLI reference documentation. + +3. Set the desired fields for the command + + - You'll likely need to reference the [LANforge CLI](https://www.candelatech.com/lfcli_ug.php) for this + +4. Click the `Parse Command` at the top + + - This generates multiple outputs at the top of the webpage, all of which perform the same operation + - Generated output includes: + - Command line CLI (via `curl`) to manually invoke the `/cli-json/` and `/cli-form/` LANforge HTTP API endpoints + - The `/cli-json/` and `/cli-form/` HTTP API endpoints accept JSON and URL-encoded LANforge CLI data, respectively, both via HTTP POST + - [LANforge CLI](https://www.candelatech.com/lfcli_ug.php) command for use in the telnet interface + +5. Test the generated command line CLIs through the LANforge HTTP API + + - Use one of the `curl` CLI commands for use in command line. The other generated output is for the telnet LANforge CLI interface + - For example, the following command will delete the port `1.1.wlan0`: + + ```Bash + curl -sqv -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '@/tmp/json_data' http://localhost:8080/cli-json/rm_vlan` + ``` + +## Additional System Configuration + +### Configure Non-Root Serial Access + +Some automation requires accessing a DUT over a USB serial port (e.g. `/dev/ttyUSB0`). By default, you must explicitly allow users to access serial devices +on Linux. Otherwise, using a USB serial device requires root permissions (e.g. have to use `sudo`). For automation, we generally suggest _not_ running with +root permissions where possible. + +There are several methods to configure this, each depending on the distribution (all require root access to the system). Often the easiest is to perform +the following: + +1. Add your user to the `dialout` and `tty` groups + + ```Bash + sudo usermod -a -G dialout,tty $USER + ``` + +2. Log out and log back in (full logout required, not just closing the terminal) + + - Can also run the `newgrp` command, but this will only affect the currently running login session (i.e. that shell) ## License diff --git a/ap_ctl.py b/ap_ctl.py index 1341562d7..0ef7cd0e5 100755 --- a/ap_ctl.py +++ b/ap_ctl.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/archive/rssi_validation/src/parser2.py b/archive/rssi_validation/src/parser2.py index 89a8fd0c0..ee954dd56 100755 --- a/archive/rssi_validation/src/parser2.py +++ b/archive/rssi_validation/src/parser2.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa import json diff --git a/cc_module_uci.py b/cc_module_uci.py new file mode 100644 index 000000000..f71c871bc --- /dev/null +++ b/cc_module_uci.py @@ -0,0 +1,474 @@ +# openwrt https://wireless.docs.kernel.org/en/latest/en/users/documentation/iw.html +import logging +import sys + +if sys.version_info[0] != 3: + print("This script requires Python 3") + exit() + +# from time import sleep +from contextlib import contextmanager +import json +import time + +import scrapli +from scrapli.driver import GenericDriver, Driver + +# from scrapli.response import Response + +# from typing import Generator, Optional, Union + + +def get_jump_function(params: dict): + def jump_through_vrf(conn: Driver): + # ./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113 + + # jump_cmd = f'./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.198' + # jump_cmd = f'./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113' + jump_cmd = f"./vrf_exec.bash {params['upstream_port']} ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa {params['auth_username']}@{params['host']}" + + # This happens after login completes + conn.channel.send_input(jump_cmd, eager=True, strip_prompt=False) + conn.channel._read_until_explicit_prompt(prompts=["password:"]) + conn.channel.send_inputs_interact( + interact_events=[ + (params['auth_password'], "Password:", True) + ], + interaction_complete_patterns=[ + "#" + ] + ) + # At this point we should be logged into the dut and need to change the prompt pattern + conn.comms_prompt_pattern = params['comms_prompt_pattern'] + + return jump_through_vrf + + +def is_cac_done(result): + good_things = "get_cac_state:0" + if good_things in result: + return True + else: + return False + + +def is_channel_allowed(channel, list): + for _channel in list: + if int(_channel) == channel: + return True + else: + return False + + +class create_controller_series_object: + def __init__(self, + dest, + user, + passwd, + band=None, + ap=None, + series=None, + scheme=None, + prompt=None, + ap_band_slot_24g=0, + ap_band_slot_5g=1, + ap_band_slot_6g=2, + ap_dual_band_slot_5g=2, + ap_dual_band_slot_6g=2, + port=22, + timeout=3, + pwd=None, + lfmgr=None, + lfuser=None, + lfpasswd=None, + upstream_port=None + ): + + if lfmgr is None: + self.lfmgr = "127.0.0.1" + else: + self.lfmgr = lfmgr + + if lfuser is None: + self.lfuser = "lanforge" + else: + self.lfuser = lfuser + + if lfpasswd is None: + self.lfpasswd = "lanforge" + else: + self.lfpasswd = lfpasswd + + if upstream_port is None: + print("upstream_port not set, exiting") + exit(0) + else: + self.upstream_port = upstream_port + + self.dest = dest + self.user = user + self.passwd = passwd + + self.phy_24g = 'phy#1' + self.radio_name_24g = "wifi1" # phy#1" + self.ap_name_24g = "ath16" + + self.phy_5g = 'phy#0' + self.radio_name_5g = "wifi0" # "phy#0" + self.ap_name_5g = "ath04" + + self.radio_name_u5g = "phy#2" + self.ap_name_u5g = "wifi5g" + + self.bandwidth = None + self.tx_power = None + self.channel = None + + self.band = band + if band in ['5g', 'l5g']: + self.radio_name_5g = self.radio_name_5g + self.ap_name = self.ap_name_5g + elif band in ['u5g']: + self.radio_name_5g = self.radio_name_u5g + self.ap_name = self.ap_name_u5g + elif band in ['24g']: + self.radio_name = self.radio_name_24g + self.ap_name = self.ap_name_24g + else: + raise Exception("Missing band type") + + self.info = "Adtran PlumeOS Device" + + self.ap_config_radio_role = "Manual" + self.ap_num_power_levels = 1 + + self.mac = "" + self.channel = "" + self.tx_power = "" + self.tx_power_dbm = "" + self.channel_count = "" + self.bandwidth = "" + + def __del__(self) -> None: + self.tear_down_mgmt() + + def tear_down_mgmt(self) -> None: + pass + # if getattr(self, "conn", None) != None: + # self.conn.close() + # self.conn = None + + def parse_network_interfaces(self, text): + # Initialize the main dictionary + result = {} + current_phy = None + + # Split the text into lines + lines = text.strip().split('\n') + + for line in lines: + line = line.strip() + if not line: + continue + + # Check for phy section + if line.startswith('phy#'): + current_phy = line + result[current_phy] = {} + # Check for Interface section + elif line.startswith('Interface'): + current_interface = line.split()[1] + if current_phy: + result[current_phy][current_interface] = {} + # Parse key-value pairs + elif current_phy and current_interface: + # Handle special case for channel line + if line.startswith('channel'): + parts = line.split(', ') + channel_info = {} + # Parse main channel info + channel_parts = parts[0].split() + channel_info['number'] = int(channel_parts[1]) + channel_info['frequency'] = channel_parts[2].strip('()') + + # Parse additional channel attributes + for part in parts[1:]: + key, value = part.split(': ', 1) + channel_info[key.strip()] = value.strip() + + result[current_phy][current_interface]['channel'] = channel_info + else: + # Handle other key-value pairs + if ' ' in line: + key, value = line.split(' ', 1) + result[current_phy][current_interface][key] = value.strip() + print(json.dumps(result, indent=2)) + return result + + def get_config_summary(self): + + config_summary = self._show_ap_dot11_summary() + if '2g' in self.band: + self.mac = config_summary[self.phy_24g][self.ap_name_24g]['addr'] + self.channel = config_summary[self.phy_24g][self.ap_name_24g]['channel']['number'] + self.tx_power = config_summary[self.phy_24g][self.ap_name_24g]['txpower'].split('.')[0] + self.tx_power_dbm = self.tx_power + self.channel_count = config_summary[self.phy_24g][self.ap_name_24g]['ifindex'] + self.bandwidth = config_summary[self.phy_24g][self.ap_name_24g]['channel']['width'] + # ap_tx_power_dbm = self.ap_current_tx_power_level = self._show_ap_dot11_summary()[self.phy_24g][self.ap_name_24g]['txpower'] + elif '5g' in self.band: + # ap_tx_power_dbm = self.ap_current_tx_power_level = self._show_ap_dot11_summary()[self.phy_5g][self.ap_name_5g]['txpower'] + self.mac = config_summary[self.phy_5g][self.ap_name_5g]['addr'] + self.channel = config_summary[self.phy_5g][self.ap_name_5g]['channel']['number'] + self.tx_power = config_summary[self.phy_5g][self.ap_name_5g]['txpower'].split('.')[0] + self.tx_power_dbm = self.tx_power + self.channel_count = config_summary[self.phy_5g][self.ap_name_5g]['ifindex'] + self.bandwidth = config_summary[self.phy_5g][self.ap_name_5g]['channel']['width'] + + def show_ap_summary(self): + pass + + def console_setup(self): + pass + + def read_ap_config_radio_role(self): + pass + + def read_country_code_and_regulatory_domain(self): + # need to have the + command = f"uci get wireless.{self.radio_name_5g}.country" + r = self.send_ap_command(command) + + self.regulatory_domain = r.result + self.country_code = r.result + + def wlan_shutdown(self): + pass + + def show_wlan_summary(self): + return " " + + def config_enable_wlan_send_no_shutdown(self): + pass + + def config_no_ap_dot11_5ghz_shutdown(self): + pass + + def config_ap_no_dot11_5ghz_shutdown(self): + pass + + def config_no_ap_dot11_24ghz_shutdown(self): + pass + + def config_ap_no_dot11_24ghz_shutdown(self): + pass + + def ap_name_shutdown(self): + pass + + def ap_name_no_shutdown(self): + pass + + def show_ap_dot11_5gz_shutdown(self): + pass + + def show_ap_dot11_24gz_shutdown(self): + pass + + def ap_dot11_5ghz_radio_role_manual_client_serving(self): + pass + + def ap_dot11_24ghz_radio_role_manual_client_serving(self): + pass + + def ap_dot11_5ghz_shutdown(self): + pass + + def ap_dot11_24ghz_shutdown(self): + pass + + def _config_dot11_tx_power(self, radio: str, ap: str, wait_for_done: bool): + if self.tx_power is None: + raise Exception("Missing tx-power") + # def send_ap_command(self, command: "str", action: "str", radio: "str", attribute:"str", value: "str") : + command = f"uci set wireless.{radio}.txpower={self.tx_power}" + r = self.send_ap_command(command) + if r.failed: + raise Exception(r.result) + + command = "wifi" + r = self.send_ap_command(command) + if r.failed: + raise Exception(r.result) + + command = f"uci get wireless.{radio}.txpower" + r = self.send_ap_command(command) + if r.failed: + raise Exception(r.result) + print(f"txpower setting: {r.result}") + + def config_dot11_5ghz_tx_power(self, wait_for_done=True): + self._config_dot11_tx_power(self.radio_name_5g, self.ap_name_5g, wait_for_done) + + def config_dot11_24ghz_tx_power(self, wait_for_done=True): + self._config_dot11_tx_power(self.radio_name_24g, self.ap_name_24g, wait_for_done) + + # TODO + def get_ap_tx_power_config(self): + # TODO need to separate out the 2g and 5g power + if '2g' in self.band: + ap_tx_power_dbm = self.ap_current_tx_power_level = self._show_ap_dot11_summary()[self.phy_24g][self.ap_name_24g]['txpower'] + elif '5g' in self.band: + ap_tx_power_dbm = self.ap_current_tx_power_level = self._show_ap_dot11_summary()[self.phy_5g][self.ap_name_5g]['txpower'] + # self._show_ap_dot11_summary()['phy#0']['ath04']['txpower'] + + ap_tx_power_dbm = ap_tx_power_dbm.split('.')[0] + # self.ap_tx_power_dbm = self.ap_current_tx_power_level = self._show_ap_dot11_summary() + self.ap_tx_power_dbm = self.ap_current_tx_power_level = ap_tx_power_dbm + + def _config_dot11_channel(self, radio: str, ap: str): + if self.channel is None: + raise Exception("Missing channel") + + # Channel: + command = f"uci set wireless.{radio}.channel={self.channel}" + r = self.send_ap_command(command) + if r.failed: + raise Exception(r.result) + + command = "wifi" + r = self.send_ap_command(command) + if r.failed: + raise Exception(r.result) + + command = f"uci get wireless.{radio}.channel" + r = self.send_ap_command(command) + if r.failed: + raise Exception(r.result) + + print(f"Channel set {r.result}") + + # need to wait for cac to be done + for _ in range(120): + r = self.get_cac_state() + if is_cac_done(r.result): + return + time.sleep(1) + else: + raise Exception("CAC is not okay") + + def config_dot11_5ghz_channel(self): + self._config_dot11_channel(self.radio_name_5g, self.ap_name_5g) + + def config_dot11_24ghz_channel(self): + self._config_dot11_channel(self.radio_name_24g, self.ap_name_24g) + + def _config_dot11_channel_width(self, radio: str, ap: str): + pass + + def config_dot11_5ghz_channel_width(self): + self._config_dot11_channel_width(self.radio_name_5g, self.ap_name_5g) + + def config_dot11_24ghz_channel_width(self): + self._config_dot11_channel_width(self.radio_name_24g, self.ap_name_24g) + + def _show_ap_dot11_summary(self) -> "dict[str]": + command = "iw dev" + r = self.send_ap_command(command) + + if r.failed: + logging.info("radio not configured, Skipping summery") + return + + results = self.parse_network_interfaces(r.result) + + return results + + def get_cac_state(self) -> "dict[str]": + command = "cfg80211tool ath04 get_cac_state" + results = self.send_ap_command(command) + + if results.failed: + logging.info("error checking cac timer") + return + + return results + + def show_ap_dot11_5gz_summary(self) -> str: + return self._show_ap_dot11_summary() + + def show_ap_dot11_24gz_summary(self) -> str: + return self._show_ap_dot11_summary() + + def show_ap_bssid_5ghz(self) -> str: + # result = self._show_ap_dot11_summary() + # bssid = result['phy#1']['ath16']['addr'] + return self._show_ap_dot11_summary()['phy#1'][self.ap_name_5g]['addr'] + + def show_ap_bssid_24ghz(self) -> str: + return self._show_ap_dot11_summary()['phy#0'][self.ap_name_24g]['addr'] + + @contextmanager + def get_mgmt(self) -> "Generator[GenericDriver]": # noqa: + if getattr(self, "conn", None) == None: # noqa: + # ./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113 + # Jump Host config + c = { + # "host":'192.168.215.198', # noqa: + "host": self.dest, # noqa: + "auth_username":self.user, # noqa: + "auth_password":self.passwd, # noqa: + "ssh_config_file": True, + "comms_prompt_pattern":"^root@HFCL:~\\#", # noqa: 231 + "timeout_ops": 120, + "timeout_transport": 240, + "upstream_port": self.upstream_port + } + + # if not getattr(self, "jump_host", None) == None: + jump_function = get_jump_function(c) + # LANforge config + c = { + # "host": '192.168.212.55', + "host": self.lfmgr, + "auth_username": self.lfuser, + "auth_password": self.lfpasswd, + "auth_strict_key": False, + "comms_prompt_pattern": "^[\\S\\7\\x1b]*\\[.*\\]\\$", + "on_open": jump_function, # on logging into LANforge will run the jump_function + "timeout_ops": 40, + "timeout_transport": 40, + "ssh_config_file": True, + } + + self.conn = GenericDriver(**c) + try: + self.conn.open() + except scrapli.exceptions.ScrapliAuthenticationFailed as e: + raise Exception( + f"Failed to open connection to {self.dest} ({e})") + yield self.conn + + def send_ap_command(self, command: "str"): + + print(f"command sent: {command}") + with self.get_mgmt() as console: + + r = console.send_command(command, failed_when_contains=["ERROR: .*"]) + + return r + + def no_logging_console(self): + pass + + def line_console_0(self): + pass + + def summary(self): + pass + + def disable_operation_status(self): + pass + + def noop(self): + return "\n\n" diff --git a/check_large_files.bash b/check_large_files.bash index 72cc9851e..6f44f1284 100755 --- a/check_large_files.bash +++ b/check_large_files.bash @@ -39,6 +39,7 @@ USAGE="$0 # Check for large files and purge many of the most inconsequencial -r # compress /home/lanforge report data and pcap files -s # empty the trash -t # remove /var/tmp files + -u # remove backed up LANforge database archives (DB-pre.20250512_202020.tar.gz) -v # verbose -z # compressed files in /home/lanforge " @@ -127,7 +128,7 @@ function disk_space_below() { # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- # #opts="" -opts="abcdehklmpqrtv" +opts="abcdehklmpqrtuv" while getopts $opts opt; do case "$opt" in a) @@ -182,6 +183,9 @@ while getopts $opts opt; do t) selections+=($opt) ;; + u) + selections+=($opt) + ;; v) quiet=0 verbose=1 @@ -219,6 +223,7 @@ declare -A totals=( [r]=0 [s]=0 [t]=0 + [u]=0 [z]=0 ) declare -A desc=( @@ -234,6 +239,7 @@ declare -A desc=( [r]="report data" [s]="trash can" [t]="/var/tmp" + [u]="test configuration backups (DB-pre\*.tar.gz)" [z]="compressed files" ) declare -A surveyors_map=( @@ -249,6 +255,7 @@ declare -A surveyors_map=( [r]="survey_report_data" [s]="survey_trash_can" [t]="survey_var_tmp" + [u]="survey_db_files" [z]="survey_compressed_files" ) @@ -265,6 +272,7 @@ declare -A cleaners_map=( [r]="compress_report_data" [s]="empty_trash_can" [t]="clean_var_tmp" + [u]="clean_db_files" [z]="clean_compressed_files" ) @@ -289,6 +297,7 @@ kernel_to_relnum() { for i in 0 1 2; do if (( $i < 2 )); then #1>&2 echo "HUNK $i: [${hunks[$i]}]" + # there is some condition that turns hunks[i] into a hex value expandos+=( $(( 100 + ${hunks[$i]} )) ) else tmpstr="00000000${hunks[i]}" @@ -627,6 +636,24 @@ compress_report_data() { echo "" } +clean_db_files() { + note "clean configuration backups" + if [[ ! -s /tmp/db-pre_files.txt ]]; then + note " no files surveyed" + return + fi + mapfile -d '' db_pre_files < /tmp/db-pre_files.txt + if (( $verbose > 0 )); then + printf " %s\n" "${db_pre_files[@]}" + sleep 1 + fi + for f in "${db_pre_files[@]}"; do + rm -f "$f" + echo -n '.' + sleep 0.05 + done +} + clean_var_tmp() { note "clean var tmp" if [[ ! -s /tmp/var_tmp_files.txt ]]; then @@ -694,6 +721,7 @@ survey_kernel_files() { # sleep 2 continue else + # there is a condition on a debug kernel where we get a bad subscript here: ser is out of range ser=$( kernel_to_relnum ${fiile#*ct} ) kernel_sort_serial[$ser]=1 # debug "file[$file] ser[$ser]" @@ -715,7 +743,7 @@ survey_kernel_files() { done < <(echo "${!kernel_sort_names[@]}" | sort | head -n -1) fi - debug "Module directories elegible for removal: " + debug "Module directories eligible for removal: " for file in "${lib_module_dirs[@]}"; do file=${file#/lib/modules/} # debug "/lib/modules/ ... $file" @@ -751,7 +779,11 @@ survey_kernel_files() { #fi # set +veux - local boot_image_sz=$(du -hc "${kernel_files[@]}" | awk '/total/{print $1}') + local boot_image_sz=0 + # On AT7 there will be none of these files + if (( ${#kernel_files[@]} > 0 )); then + boot_image_sz=$(du -hc "${kernel_files[@]}" | awk '/total/{print $1}') + fi local lib_dir_sz=$(du -hc "${lib_module_dirs[@]}" | awk '/total/{print $1}') totals[b]="kernels: $boot_image_sz, modules: $lib_dir_sz" @@ -1052,14 +1084,19 @@ survey_pcap_files() { removable_lflogs=() survey_lflogs() { - debug "Surveying lanforge, wpa_supplicant nginx and hostapd logs" + debug "Surveying hostapd, lanforge, nginx, vnc and wpa_supplicant logs" local fsiz=0 local fnum=0 cd /home/lanforge - local directories="./vr_conf/ ./wifi/ ./l4logs/ /usr/local/lanforge/nginx/ /var/log/httpd/" + local directories=".vnc/ ./vr_conf/ ./wifi/ ./l4logs/ /usr/local/lanforge/nginx/" if [[ -d .l3helper ]]; then directories="$directories ./l3helper/" fi + if [[ -d /var/log/httpd ]]; then + directories="$directories /var/log/httpd/" + elif [[ -d /var/log/apache2 ]]; then + directories="$directories /var/log/apache2/" + fi mapfile -d '' removable_lflogs < <( find $directories \ -type f -a \( \ -iname 'error.log' \ @@ -1080,6 +1117,7 @@ survey_lflogs() { -o -iname 'wpa_supplicant_log_*' \ -o -iname 'gnuforge_log_*' \ -o -iname 'helper_shared_log_*' \ + -o -iname '*:1.log' \ \) -print0 > /tmp/removable_lflogs.txt ||:) fnum=$( grep -cz '' /tmp/removable_lflogs.txt ) #printf ' %s\n' "${removable_lflogs[@]}" @@ -1131,6 +1169,25 @@ survey_report_data() { cd "$starting_dir" } +survey_db_files() { + debug "Surveying DB-pre configuration backups" + cd /home/lanforge + local fsiz=0 + local fnum=0 + find -type f -iname "DB-pre-*.tar.gz" -print0 \ + > /tmp/db-pre_files.txt 2>/dev/null ||: + + local fnum=$(grep -zc $'\0' /tmp/db-pre_files.txt) + if (( $fnum > 0 )); then + fsiz=$(du -hc \ + --files0-from=/tmp/db-pre_files.txt \ + | awk '/total/{print $1}' ) + fi + totals[u]="$fnum files ($fsiz)" + [[ x${totals[u]} = x ]] && totals[u]=0 + cd "$starting_dir" +} + # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- # # gather usage areas # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- # @@ -1264,6 +1321,7 @@ while [[ $choice != q ]]; do echo " r) report data : ${totals[r]}" echo " s) trash cans : ${totals[s]}" echo " t) clean /var/tmp : ${totals[t]}" + echo " u) DB configuration backups : ${totals[u]}" echo " z) list compressed files : ${totals[z]}" echo " q) quit" read -p "> " choice @@ -1313,6 +1371,10 @@ while [[ $choice != q ]]; do clean_var_tmp refresh=1 ;; + u ) + clean_db_files + refresh=1 + ;; z ) clean_compressed_files refresh=1 diff --git a/heatmon.bash b/heatmon.bash old mode 100644 new mode 100755 index 3ec8023ab..9a5fa3fa3 --- a/heatmon.bash +++ b/heatmon.bash @@ -12,7 +12,29 @@ if [[ ! -x /usr/bin/sensors ]]; then echo "Unable to find sensors" exit 1 fi -/usr/bin/sensors -u -j \ - | jq -c '[.| to_entries |.[] | {A: .key, T: .value.temp1.temp1_input}]' +# JQ_FORMULA='[.| to_entries |.[] | {A: .key, T: .value.temp1.temp1_input}]' +JQ_FORMULA=$( cat <<- 'EOF' +[ to_entries[] + | .key as $chip + | .value + | to_entries[] + | select(.value | type == "object") + | .key as $core + | .value + | to_entries[] + | select(.key | test("temp.*input")) + | { + # ($chip +"."+ $core):(.value), + A: ($chip +"."+ $core+"."+.key), + T: .value + } +] +EOF +) +if [[ -n "${1:-}" ]] && [[ -r "$1" ]]; then + grep -v ERROR < "$1" | jq -c "$JQ_FORMULA" +fi +/usr/bin/sensors -u -j 2>/dev/null \ + | jq -c "$JQ_FORMULA" # \ No newline at end of file diff --git a/lanforge_client/README.md b/lanforge_client/README.md index 3a655220b..8e8122802 100644 --- a/lanforge_client/README.md +++ b/lanforge_client/README.md @@ -1,47 +1,56 @@ -# LANforge API Python Library +# LANforge HTTP API Python Library ---- +This Python library provides a set of generated methods, classes, and utilities to operate the +[LANforge HTTP API](http://www.candelatech.com/cookbook.php?vol=cli&book=JSON:+Querying+the+LANforge+Client+for+JSON+Data). +A brief overview of the HTTP API and Telnet CLI can be found [here](../README.md#lanforge-http-api-and-telnet-cli). -This library provides a set of methods to operate the [LANforge JSON API](http://www.candelatech.com/cookbook.php?vol=cli&book=JSON:+Querying+the+LANforge+Client+for+JSON+Data). This is a generated library that includes Python classes and methods to perform JSON POSTs for every [LANforge CLI command](https://www.candelatech.com/lfcli_ug.php) and JSON GETs for JSON endpoints presented by the LANforge GUI. +At a high level, this library consists of wrappers around the [LANforge CLI](https://www.candelatech.com/lfcli_ug.php), +enabling users to query and configure LANforge systems/testbeds without effort spent writing tedious boilerplate code. +Components of this library invoke the HTTP API by performing HTTP GETs and HTTP POSTs to HTTP endpoints presented +by the HTTP API. As detailed [here](../README.md#lanforge-http-api-and-telnet-cli), the HTTP API endpoints correspond +1:1 with LANforge GUI tabs. _HTTP GETs query system state_ and return JSON data. _HTTP POSTs configure system state_ +and send JSON data when using this library (however, the HTTP API also supports HTTP POSTs with URL-encoded data as well). If you are new to this API, please start at the beginning of the [LANforge Scripting Cookbook](http://www.candelatech.com/scripting_cookbook.php). - -Example scripts are located in the [`examples/`](./examples/) directory. See the [`README.md`](./examples/README.md) for more information on available examples. +Simpler example scripts which use this library are available [here](./examples/), in addition to more complex scripts in +[`py-scripts/`](../py-scripts/). ## Requirements -**NOTE:** Most users also run scripts in [`lanforge-scripts/py-scripts/`](https://github.com/greearb/lanforge-scripts/tree/master/py-scripts), so make sure to follow the [setup instructions](https://github.com/greearb/lanforge-scripts/blob/master/py-scripts/README.md#setup) to use them. +- LANforge 5.4.5 or newer + +- LANforge GUI active during usage of automation + + - The LANforge GUI runs the HTTP API, so it must be active in order to use most automation + - Details on how to configure the LANforge GUI on a pre-installed system are available in [this cookbook](https://www.candelatech.com/cookbook.php?vol=misc&book=Automatically+starting+LANforge+GUI+on+login) -- Minimum LANforge GUI 5.4.5 - - As the GUI runs the JSON API, you must ensure that the GUI is running when using the JSON API - - To configure the GUI to automatically start, see [this cookbook](https://www.candelatech.com/cookbook.php?vol=misc&book=Automatically+starting+LANforge+GUI+on+login) in the documentation. -- Minimum Python 3.7 - - This library is tested on systems which run Python 3.7+ or newer, including LANforge systems Fedora 30+, as they ship with Python 3.7 or newer - - We discourage operation on earlier releases of Fedora (e.g. Fedora 27) +- LANforge Scripts/Automation Installation Setup complete + - See the setup instructions [here](../README.md#setup-and-installation) ## Features -The **lanforge_client** package contains Python library code to query and configure LANforge systems in addition to utility and logging methods. +This Python library provides a set of generated methods, classes, and utilities to operate the +[LANforge HTTP API](http://www.candelatech.com/cookbook.php?vol=cli&book=JSON:+Querying+the+LANforge+Client+for+JSON+Data). A brief listing of available library code is as follows: - [`lanforge_api.py`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py) - Contains the core Python library including classes to configure and query LANforge systems - - [`LFSession`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py#L24487) + - `LFSession` - Provides a session abstraction for querying/configuring the LANforge system - Additionally provides diagnostic tracing and callback IDs for specific types of CLI commands - - [`LFJsonQuery`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py#L19610) - - Defines GET requests to query the LANforge system + - `LFJsonQuery` + - Defines HTTP GET requests to query the LANforge system - Available endpoints are visible by performing a GET request to the root endpoint or navigating to that endpoint in your browser - e.g. `http://192.168.1.101:8080/` - - Each endpoint contains a corresponding `get_xxx()` method. For example, `/ports` can be queried by calling the [`get_port()`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py#L22141) method. - - [`LFJsonCommand`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py#L1392) - - Defines POST requests to configure the LANforge system + - Each endpoint contains a corresponding `get_xxx()` method. For example, `/ports` can be queried by calling `get_port()`. + - `LFJsonCommand` + - Defines HTTP POST requests to configure the LANforge system - Each method corresponds to a respective CLI command - Helper classes define flags and types which the CLI commands require - - For example, the [`add_sta`](http://www.candelatech.com/lfcli_ug.php#add_sta) CLI command can be configured using the [`post_add_sta()`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py#L4770) method. + - For example, the [`add_sta`](http://www.candelatech.com/lfcli_ug.php#add_sta) CLI command can be configured using `post_add_sta()`. - [`logg.py`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/logg.py) - - [`Logg`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/logg.py#L17) class and helper methods to configure LANforge API logging for [`LFJsonQuery`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py#L19610)s and [`LFJsonCommand`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/lanforge_api.py#L1392)s. + - `Logg` class and helper methods to configure LANforge API logging for `LFJsonQuery`s and `LFJsonCommand`s. - [`strutil.py`](https://github.com/greearb/lanforge-scripts/blob/master/lanforge_client/strutil.py) - Helper functions for working with strings @@ -61,7 +70,7 @@ Generally, the workflow for a script using LANforge API will look something like ### Things to Keep in Mind -This library can be used directly, plus it can be used in conjunction with the LANforge [Realm](https://github.com/greearb/lanforge-scripts/blob/master/py-json/realm.py) class. It is different than than the _Realm_ class. _Realm_ extends the [lfcli_base](https://github.com/greearb/lanforge-scripts/blob/master/py-json/LANforge/lfcli_base.py) class that provides its own (nearly identical) REST API. The lanforge_client REST methods are built into the _BaseLFJsonRequest_ class. +This library can be used directly, plus it can be used in conjunction with the LANforge [Realm](https://github.com/greearb/lanforge-scripts/blob/master/py-json/realm.py) class. It is different than than the _Realm_ class. _Realm_ extends the [lfcli_base](https://github.com/greearb/lanforge-scripts/blob/master/py-json/LANforge/lfcli_base.py) class that provides its own (nearly identical) REST API. The lanforge*client REST methods are built into the \_BaseLFJsonRequest* class. You would use the _Realm_ class to execute high-level operations like: diff --git a/lanforge_client/examples/query_metrics/README.md b/lanforge_client/examples/query_metrics/README.md index b6365109a..2ac244613 100644 --- a/lanforge_client/examples/query_metrics/README.md +++ b/lanforge_client/examples/query_metrics/README.md @@ -1,14 +1,16 @@ # LANforge Query Metrics Script ## Overview + Script designed to gather LANforge metrics for another test runs, querying once per second for a specified duration. This script supports querying ports, CXs, and LANforge vAP-associated stations. **This script assumes all specified ports, CXs, and vAPs to query already exist.** Metrics data is output as CSV. Available data is as follows: + - Port metrics: Data in 'Port Mgr' tab - CX metrics: Data in 'Layer-3' tab - - This includes CX endpoint metrics (data in 'L3 Endps' tab) + - This includes CX endpoint metrics (data in 'L3 Endps' tab) - vAP-associated station(s) metrics: Data in 'vAP Stations' tab By default, the script also clears port and CX counters for specified LANforge ports (including vAPs) and CXs. To disable this, specify the `--no_clear_port_counters` and `--no_clear_cx_counters` arguments, respectively. Clearing vAP-associated stations counters is not currently supported. @@ -19,49 +21,55 @@ See the [Example Usage](#example-usage) section below or run the script with the If you intend to run this script on a LANforge system, no setup should be required. Just make sure to set the `LF_SCRIPTS` environment variable to `/home/lanforge/scripts`. -If you intend to run this script on a non-LANforge system, please follow the instructions in the [LANforge scripts README](https://github.com/greearb/lanforge-scripts/blob/master/py-scripts/README.md). In short, the primary requirements to run LANforge scripts are Python 3.7+, a folder containing the LANforge API library code, and the `pandas` module installed. The easiest way to meet these requirements is to follow the steps in the README. +If you intend to run this script on a non-LANforge system, please follow the instructions [here](../../../README.md#setup-and-installation). In short, the primary requirements to run LANforge scripts are Python 3.7+, a folder containing the LANforge API library code, and the `pandas` module installed. The easiest way to meet these requirements is to follow the steps in the README. ## Example Usage ### Primary Options + - Specify desired ports using the `--port_eid` argument, once per port to query - Specify desired CXs using the `--cx_name` argument, once per Layer 3 CX to query - - Corresponding endpoints are automatically queried when this argument is specified + - Corresponding endpoints are automatically queried when this argument is specified - Specify desired vAPs using the `--vap_eid` argument, once per vAP to query ### Examples + - Query the 192.168.1.101 LANforge manager for metrics related to the `1.1.wlan0` and `1.1.wlan1` LANforge ports for 30 seconds: - ```Bash - LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ - --mgr 192.168.1.101 \ - --duration 30 \ - --port_eid '1.1.wlan0' \ - --port_eid '1.1.wlan1' - ``` + + ```Bash + LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ + --mgr 192.168.1.101 \ + --duration 30 \ + --port_eid '1.1.wlan0' \ + --port_eid '1.1.wlan1' + ``` - Query the 192.168.1.101 LANforge manager for metrics related to the `1.1.vap0000` and `1.1.vap0001` LANforge vAPs and any associated stations for 30 seconds: - ```Bash - LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ - --mgr 192.168.1.101 \ - --duration 30 \ - --vap_eid '1.1.vap0000' \ - --vap_eid '1.1.vap0001' - ``` + + ```Bash + LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ + --mgr 192.168.1.101 \ + --duration 30 \ + --vap_eid '1.1.vap0000' \ + --vap_eid '1.1.vap0001' + ``` - Query the 192.168.1.101 LANforge manager for metrics related to the LANforge station `1.1.wlan0` and the LANforge CX named `UDP-test-CX`. - ```Bash - LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ - --mgr 192.168.1.101 \ - --port_eid '1.1.wlan1' \ - --cx_name 'UDP-test-CX' - ``` + + ```Bash + LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ + --mgr 192.168.1.101 \ + --port_eid '1.1.wlan1' \ + --cx_name 'UDP-test-CX' + ``` - Query the 192.168.1.101 LANforge manager for the specific metrics in the `--cx_fields` argument for the LANforge CX named `UDP-test-CX`. Options `--port_fields`, `--cx_fields`, and `--vap_fields` function similarly. - ```Bash - # The queried endpoint fields correspond to columns 'Rx Rate (1m)' - # and 'Rx Drop %' in the LANforge GUI 'L3 Endps' tab - LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ - --mgr 192.168.1.101 \ - --cx_name 'UDP-test-CX' \ - --endp_fields 'rx+rate+(1m),rx+drop+%25' # URL encoded - ``` \ No newline at end of file + + ```Bash + # The queried endpoint fields correspond to columns 'Rx Rate (1m)' + # and 'Rx Drop %' in the LANforge GUI 'L3 Endps' tab + LF_SCRIPTS=/home/lanforge/scripts ./query_metrics.py \ + --mgr 192.168.1.101 \ + --cx_name 'UDP-test-CX' \ + --endp_fields 'rx+rate+(1m),rx+drop+%25' # URL encoded + ``` diff --git a/lanforge_client/lanforge_api.py b/lanforge_client/lanforge_api.py index 97bf7dab2..818bc9693 100644 --- a/lanforge_client/lanforge_api.py +++ b/lanforge_client/lanforge_api.py @@ -1759,20 +1759,55 @@ def post_adb_wifi_event_map(self, cli_cmd: str = None, param_map: dict = None): https://www.candelatech.com/lfcli_ug.php#add_adb ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + + class AddAdbFlags(IntFlag): + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- + This class is stateless. It can do binary flag math, returning the integer value. + Example Usage: + int:flag_val = 0 + flag_val = LFPost.set_flags(AddAdbFlags, 0, flag_names=['bridge', 'dhcp']) + ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + + AUTO_CONNECT_WIFI = 0x80 # Attempt to reconfigure Interop device in case it connects to wrong + # +ssid + NO_AUDIO_SCRCPY = 0x2 # Disable scrcpy audio forwarding + OMX_H264_ENCODER_SCRCPY = 0x4 # Use non-default OMX.google.h264.encoder scrcpy video encoder + USE_SCRCPY = 0x1 # Use scrcpy instead of MonkeyRemote + + # use to get in value of flag + @classmethod + def valueof(cls, name=None): + if name is None: + return name + if name not in cls.__members__: + raise ValueError("AddAdbFlags has no member:[%s]" % name) + return (cls[member].value for member in cls.__members__ if member == name) + def post_add_adb(self, adb_device: str = None, # Android device device ID adb_id: str = None, # Android device identifier (serial number). adb_model: str = None, # Android device model ID adb_product: str = None, # Android device product ID app_identifier: str = None, # Identifier that App and adb can both query (mac of wlan0) + auth: str = None, # WiFi Authentication to be used. bt_ctrl_dev: str = None, # Filepath of device's assigned BT adapter bt_mac: str = None, # Device's BT MAC address device_type: str = None, # Interop device type + eap_method: str = None, # WiFi EAP method: EAP-TTLS, EAP-PEAP + eap_user: str = None, # WiFi EAP identity. + flags: str = None, # See above + flags_mask: str = None, # Which bits in the flags value to apply. lf_username: str = None, # LANforge Interop app user-name + password: str = None, # WiFi password. + realm: str = None, # Realm this Interop device should use. Default is server's + # realm. resource: int = None, # Resource number. [W] + resource_id: str = None, # Resource-ID this Interop device should use when connecting + # to LANforge Manager. sdk_release: str = None, # Android sdk release (example: 4.4.2) sdk_version: str = None, # Android sdk version (example: 19) shelf: int = 1, # Shelf name/id. Required. [R][D:1] + ssid: str = None, # WiFi SSID to which this device should connect response_json_list: list = None, debug: bool = False, errors_warnings: list = None, @@ -1795,22 +1830,40 @@ def post_add_adb(self, data["adb_product"] = adb_product if app_identifier is not None: data["app_identifier"] = app_identifier + if auth is not None: + data["auth"] = auth if bt_ctrl_dev is not None: data["bt_ctrl_dev"] = bt_ctrl_dev if bt_mac is not None: data["bt_mac"] = bt_mac if device_type is not None: data["device_type"] = device_type + if eap_method is not None: + data["eap_method"] = eap_method + if eap_user is not None: + data["eap_user"] = eap_user + if flags is not None: + data["flags"] = flags + if flags_mask is not None: + data["flags_mask"] = flags_mask if lf_username is not None: data["lf_username"] = lf_username + if password is not None: + data["password"] = password + if realm is not None: + data["realm"] = realm if resource is not None: data["resource"] = resource + if resource_id is not None: + data["resource_id"] = resource_id if sdk_release is not None: data["sdk_release"] = sdk_release if sdk_version is not None: data["sdk_version"] = sdk_version if shelf is not None: data["shelf"] = shelf + if ssid is not None: + data["ssid"] = ssid if len(data) < 1: raise ValueError(__name__ + ": no parameters to submit") response = self.json_post(url="/cli-json/add_adb", @@ -1836,14 +1889,23 @@ def post_add_adb_map(self, cli_cmd: str = None, param_map: dict = None): adb_model=param_map.get("adb_model"), adb_product=param_map.get("adb_product"), app_identifier=param_map.get("app_identifier"), + auth=param_map.get("auth"), bt_ctrl_dev=param_map.get("bt_ctrl_dev"), bt_mac=param_map.get("bt_mac"), device_type=param_map.get("device_type"), + eap_method=param_map.get("eap_method"), + eap_user=param_map.get("eap_user"), + flags=param_map.get("flags"), + flags_mask=param_map.get("flags_mask"), lf_username=param_map.get("lf_username"), + password=param_map.get("password"), + realm=param_map.get("realm"), resource=param_map.get("resource"), + resource_id=param_map.get("resource_id"), sdk_release=param_map.get("sdk_release"), sdk_version=param_map.get("sdk_version"), shelf=param_map.get("shelf"), + ssid=param_map.get("ssid"), ) """ @@ -2454,6 +2516,7 @@ class AddChamberChamberFlags(IntFlag): flag_val = LFPost.set_flags(AddChamberChamberFlags, 0, flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + CC_ACTIVE = 0x2000 # (14) Start/stop climate control in the chamber. OPEN = 0x4 # (3) Door is open, no real isolation right now. PHANTOM = 0x1 # (1) Chamber is not actually here right now. TT_OVERRIDE = 0x800 # (11) LANforge should override manual turntable control @@ -2492,6 +2555,7 @@ def valueof(cls, name=None): def post_add_chamber(self, chamber_type: str = None, # Chamber type, see above. Use 1 for Medium if uncertain. + climate_controller_type: str = None, # Type of climate controller for this chamber. dut_name1: str = None, # Name of first DUT in this chamber or NA dut_name2: str = None, # Name of second DUT in this chamber or NA dut_name3: str = None, # Name of third DUT in this chamber or NA @@ -2527,6 +2591,8 @@ def post_add_chamber(self, data = {} if chamber_type is not None: data["chamber_type"] = chamber_type + if climate_controller_type is not None: + data["climate_controller_type"] = climate_controller_type if dut_name1 is not None: data["dut_name1"] = dut_name1 if dut_name2 is not None: @@ -2586,6 +2652,7 @@ def post_add_chamber_map(self, cli_cmd: str = None, param_map: dict = None): TODO: check for default argument values TODO: fix comma counting self.post_add_chamber(chamber_type=param_map.get("chamber_type"), + climate_controller_type=param_map.get("climate_controller_type"), dut_name1=param_map.get("dut_name1"), dut_name2=param_map.get("dut_name2"), dut_name3=param_map.get("dut_name3"), @@ -4086,6 +4153,91 @@ def post_add_l4_endp_map(self, cli_cmd: str = None, param_map: dict = None): ) """ + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- + Notes for type requests + + https://www.candelatech.com/lfcli_ug.php#add_mld_link + ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + + class AddMldLinkFlags(Enum): + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- + Example Usage: + ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + skip_flush = 1 # Do not reconfigure VAP (now). + + def post_add_mld_link(self, + ap_name: str = None, # Name for this Virtual AP, for example: vap0 + bandwidth: str = None, # Requested bandwidth: AUTO, 20, 40, 80, 160, or 320. + bss_color: str = None, # The BSS color for this link, use Zero for AUTO. + bssid: str = None, # The BSSID address, can also use parent-radio-pattern: + # xx:xx:xx:*:*:xx + flags: str = None, # Flags for this interface (see above.) + flags_mask: str = None, # Flags for this interface (see above.) + link_id: str = None, # Link index (0-2 inclusive). + resource: int = None, # Resource number. [W] + shelf: int = 1, # Shelf number. [R][D:1] + response_json_list: list = None, + debug: bool = False, + errors_warnings: list = None, + suppress_related_commands: bool = False): + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- + Example Usage: + response_json = [] + result = post_add_mld_link(response_json_list=response_json, param=value ...) + pprint.pprint( response_json ) + ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + debug |= self.debug_on + data = {} + if ap_name is not None: + data["ap_name"] = ap_name + if bandwidth is not None: + data["bandwidth"] = bandwidth + if bss_color is not None: + data["bss_color"] = bss_color + if bssid is not None: + data["bssid"] = bssid + if flags is not None: + data["flags"] = flags + if flags_mask is not None: + data["flags_mask"] = flags_mask + if link_id is not None: + data["link_id"] = link_id + if resource is not None: + data["resource"] = resource + if shelf is not None: + data["shelf"] = shelf + if len(data) < 1: + raise ValueError(__name__ + ": no parameters to submit") + response = self.json_post(url="/cli-json/add_mld_link", + post_data=data, + response_json_list=response_json_list, + errors_warnings=errors_warnings, + die_on_error=self.die_on_error, + suppress_related_commands=suppress_related_commands, + debug=debug) + return response + + def post_add_mld_link_map(self, cli_cmd: str = None, param_map: dict = None): + if not cli_cmd: + raise ValueError('cli_cmd may not be blank') + if (not param_map) or (len(param_map) < 1): + raise ValueError('param_map may not be empty') + + """ + TODO: check for default argument values + TODO: fix comma counting + self.post_add_mld_link(ap_name=param_map.get("ap_name"), + bandwidth=param_map.get("bandwidth"), + bss_color=param_map.get("bss_color"), + bssid=param_map.get("bssid"), + flags=param_map.get("flags"), + flags_mask=param_map.get("flags_mask"), + link_id=param_map.get("link_id"), + resource=param_map.get("resource"), + shelf=param_map.get("shelf"), + ) + """ + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests @@ -4418,9 +4570,9 @@ class AddProfileProfileFlags(IntFlag): EAP_TTLS = 0x80 # Use 802.1x EAP-TTLS ENABLE_POWERSAVE = 0x1000 # Enable power-save when creating stations. NAT = 0x100 # Enable NAT if this object is in a virtual router + OWE = 0x10000 # Use OWE encryption. RRM_IGNORE_BEACON_REQ = 0x2000 # Request station ignore RRM beacon measurement request. SKIP_DHCP_ROAM = 0x10 # Ask station to not re-do DHCP on roam. - SPATIAL_REUSE = 0x10000 # VAP with spatial-reuse enabled (wifi-7 only). WEP = 0x2 # Use WEP encryption WPA = 0x4 # Use WPA encryption WPA2 = 0x8 # Use WPA2 encryption @@ -5559,6 +5711,7 @@ class AddVapFlags(IntFlag): ht160_enable = 0x100000000 # Enable HT160 mode. mcast_to_ucast = 0x80000000 # Request AP to translate multicats to unicast before sending # +to STAs + mld_sub_vap = 0x400000000000 # 'Fake' VAP to store per-link info for other MLD AP. osen_enable = 0x40000000 # Enable OSEN protocol (OSU Server-only Authentication) pri_sec_ch_enable = 0x100 # Enable Primary/Secondary channel switch. short_preamble = 0x80 # Allow short-preamble @@ -12496,11 +12649,15 @@ def post_set_attenuator_map(self, cli_cmd: str = None, param_map: dict = None): ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_chamber(self, chamber: str = None, # Chamber name [W] + climate_control_device: str = None, # Device information to identify climate controller, such + # as IP address, or device file handle. cur_rotation: str = None, # Primarily used to store the last known rotation for # turntables that do not report absolute position. Use NA # or leave blank if unsure. + humidity: str = None, # Humidity, as a percent. position: str = None, # Absolute position in degrees. speed_rpm: str = None, # Speed in rpm (floating point number is accepted + temperature: str = None, # Temperature, in celcius. tilt: str = None, # Absolute tilt in degrees. turntable: str = None, # Turn-table address, for instance: 192.168.1.22:3001 response_json_list: list = None, @@ -12517,12 +12674,18 @@ def post_set_chamber(self, data = {} if chamber is not None: data["chamber"] = chamber + if climate_control_device is not None: + data["climate_control_device"] = climate_control_device if cur_rotation is not None: data["cur_rotation"] = cur_rotation + if humidity is not None: + data["humidity"] = humidity if position is not None: data["position"] = position if speed_rpm is not None: data["speed_rpm"] = speed_rpm + if temperature is not None: + data["temperature"] = temperature if tilt is not None: data["tilt"] = tilt if turntable is not None: @@ -12548,9 +12711,12 @@ def post_set_chamber_map(self, cli_cmd: str = None, param_map: dict = None): TODO: check for default argument values TODO: fix comma counting self.post_set_chamber(chamber=param_map.get("chamber"), + climate_control_device=param_map.get("climate_control_device"), cur_rotation=param_map.get("cur_rotation"), + humidity=param_map.get("humidity"), position=param_map.get("position"), speed_rpm=param_map.get("speed_rpm"), + temperature=param_map.get("temperature"), tilt=param_map.get("tilt"), turntable=param_map.get("turntable"), ) @@ -16126,6 +16292,7 @@ class SetWifiCorruptionsCorruptFlags(IntFlag): MSG_TYPE_EAPOL_4_OF_4 = 0x20 # EAPOL message 4/4 MSG_TYPE_EAPOL_ASSOC = 0x200 # EAP Association MSG_TYPE_EAPOL_KEY_REQ = 0x100 # EAP Key Request (not sure if this works properly) + MSG_TYPE_PMKID = 0x4000 # PMKID field corruption (applied as a percentage) MST_TYPE_EAPOL_ID_REQ = 0x400 # EAP Identity request MST_TYPE_EAPOL_ID_RESP = 0x800 # EAP Identity response MST_TYPE_EAPOL_OTHER_REQ = 0x1000 # EAP Requests that do not match other things. @@ -16159,6 +16326,8 @@ def post_set_wifi_corruptions(self, # above). ignore_per_mil: str = None, # Per-million: Station to randomly ignore # selected message types by this amount. + pmkid: str = None, # PMKID Override. Provide in hex (without '0x'). + # Up to 16-bytes (32 characters). port: str = None, # WiFi interface name or number. [W] req_flush: str = None, # Set to 1 if you wish to flush changes to # kernel now. @@ -16194,6 +16363,8 @@ def post_set_wifi_corruptions(self, data["ignore_flags"] = ignore_flags if ignore_per_mil is not None: data["ignore_per_mil"] = ignore_per_mil + if pmkid is not None: + data["pmkid"] = pmkid if port is not None: data["port"] = port if req_flush is not None: @@ -16231,6 +16402,7 @@ def post_set_wifi_corruptions_map(self, cli_cmd: str = None, param_map: dict = N dup_per_65535=param_map.get("dup_per_65535"), ignore_flags=param_map.get("ignore_flags"), ignore_per_mil=param_map.get("ignore_per_mil"), + pmkid=param_map.get("pmkid"), port=param_map.get("port"), req_flush=param_map.get("req_flush"), resource=param_map.get("resource"), @@ -18146,6 +18318,64 @@ def post_show_group_map(self, cli_cmd: str = None, param_map: dict = None): ) """ + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- + Notes for type requests + + https://www.candelatech.com/lfcli_ug.php#show_mld_link + ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + def post_show_mld_link(self, + link_id: str = None, # MLD Link index, 0-2 inclusive or 'ALL'. + port: str = None, # Name of network device (Port) to which olds the MLD + # Links. + resource: int = None, # Resource number. + shelf: int = 1, # Shelf number. [D:1] + response_json_list: list = None, + debug: bool = False, + errors_warnings: list = None, + suppress_related_commands: bool = False): + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- + Example Usage: + response_json = [] + result = post_show_mld_link(response_json_list=response_json, param=value ...) + pprint.pprint( response_json ) + ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" + debug |= self.debug_on + data = {} + if link_id is not None: + data["link_id"] = link_id + if port is not None: + data["port"] = port + if resource is not None: + data["resource"] = resource + if shelf is not None: + data["shelf"] = shelf + if len(data) < 1: + raise ValueError(__name__ + ": no parameters to submit") + response = self.json_post(url="/cli-json/show_mld_link", + post_data=data, + response_json_list=response_json_list, + errors_warnings=errors_warnings, + die_on_error=self.die_on_error, + suppress_related_commands=suppress_related_commands, + debug=debug) + return response + + def post_show_mld_link_map(self, cli_cmd: str = None, param_map: dict = None): + if not cli_cmd: + raise ValueError('cli_cmd may not be blank') + if (not param_map) or (len(param_map) < 1): + raise ValueError('param_map may not be empty') + + """ + TODO: check for default argument values + TODO: fix comma counting + self.post_show_mld_link(link_id=param_map.get("link_id"), + port=param_map.get("port"), + resource=param_map.get("resource"), + shelf=param_map.get("shelf"), + ) + """ + """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests @@ -20041,9 +20271,10 @@ def __init__(self, /adb/$shelf_id/$resource_id/$port_id When requesting specific column names, they need to be URL encoded: - api, app-id, bt+ctrl, bt+mac, device, device-type, model, name, phantom, - product, release, resource-id, timed-out, unauth, user-name, wifi+mac - Example URL: /adb?fields=api,app-id + a-wifi, api, app-id, bt+ctrl, bt+mac, device, device-type, eap-method, eap-user, + encryption, model, name, password, phantom, product, release, resource-id, + ssid, timed-out, unauth, user-name, wifi+mac + Example URL: /adb?fields=a-wifi,api Example py-json call (it knows the URL): record = LFJsonGet.get_adb(eid_list=['1.234', '1.344'], @@ -20052,19 +20283,28 @@ def __init__(self, The record returned will have these members: { + 'a-wifi': # Android phones may roam to other saved WiFi profiles if the preferred + # WiFi connection disconnects.If you enable this option, the LANforge + # system will attempt to detect this and force it back to the preferred + # WiFi SSID. 'api': # SDK API Version 'app-id': # Interop app identifier. 'bt ctrl': # LANforge bluetooth control device. 'bt mac': # Bluetooth MAC address 'device': # Interop device identifier. 'device-type': # Interop device type + 'eap-method': # WiFi EAP Method for Enterprise Authentication. + 'eap-user': # WiFi EAP User for Enterprise Authentication. + 'encryption': # WiFi authentication type for the WiFi connection. 'model': # Interop device model identifier. 'name': # Interop device serial number and LANforge Resource location. + 'password': # WiFi password. 'phantom': # LANforge is unable to communicate with this device. Maybe it is # unplugged? 'product': # Interop device product identifier. 'release': # SDK Release 'resource-id': # Identifier for the Resource this Interop device is associated. + 'ssid': # WiFi SSID to which this device should connect. 'timed-out': # The device has timed out too many times while running commands. It may # need to be reconnected. 'unauth': # The device is un-authorized. Enable debugging on device to use it. @@ -22288,9 +22528,10 @@ def get_gui_cli(self, dns-avg, dns-max, dns-min, eid, elapsed, entity+id, fb-avg, fb-max, fb-min, frame-rate, ftp-host, ftp-port, ftp-stor, http-p, http-r, http-t, login-denied, name, nf+%284xx%29, other-err, read, redir, rpt+timer, rslv-h, rslv-p, rx+rate, - rx+rate+%281m%29, status, time-stamp, timeout, total-buffers, total-err, total-rebuffers, - total-urls, total-wait-time, tx+rate, tx+rate+%281%C2%A0min%29, type, uc-avg, - uc-max, uc-min, urls%2Fs, video-format-bitrate, video-quality, write # hidden columns: + rx+rate+%281m%29, rx+rate+%28last%29, status, time-stamp, timeout, total-buffers, + total-err, total-rebuffers, total-urls, total-wait-time, tx+rate, tx+rate+%281%C2%A0min%29, + tx+rate+%28last%29, type, uc-avg, uc-max, uc-min, urls%2Fs, video-format-bitrate, + video-quality, write # hidden columns: rpt-time Example URL: /layer4?fields=%21conn,acc.+denied @@ -22351,6 +22592,8 @@ def get_gui_cli(self, 'rslv-p': # Couldn't resolve Proxy. 'rx rate': # Payload receive rate (bps). 'rx rate (1m)': # Payload receive rate over the last minute (bps). + 'rx rate (last)': # Real receive rate (bps) over the last report interval.This includes only + # the protocol payload (goodput). 'status': # Current State of the connection.UninitializedHas not yet been # started/stopped.InitializingBeing set up.StartingStarting the # test.RunningTest is actively running.StoppedTest has been @@ -22369,6 +22612,8 @@ def get_gui_cli(self, # Playback during Join Time and playback Buffering in Video Resume State. 'tx rate': # Payload transmit rate (bps). 'tx rate (1 min)': # Payload transmit rate over the last minute (bps). + 'tx rate (last)': # Real transmit rate (bps) over the last report interval.This includes + # only the protocol payload (goodput). 'type': # The specific type of this Layer 4-7 Endpoint. 'uc-avg': # Average time in milliseconds to complete processing of the URLfor the # last 100 requests. @@ -22451,11 +22696,12 @@ def get_layer4(self, /mlo/$shelf_id/$resource_id/$port_id When requesting specific column names, they need to be URL encoded: - active, activity, avg+chain+rssi, beacon+signal, chain+rssi, channel, disabled+reason, - dormant, dup+pkts, eid, entity+id, esr+active, last+exit, noise, parent+dev, - retry+failed, rx+bytes, rx+drop, rx+pkts, rx+rate, rx+rate+%281m%29, rx+signal, - rx-rate, time-stamp, tx+bytes, tx+pkts, tx+rate, tx+rate+%281%C2%A0min%29, tx-rate, - wifi+retries # hidden columns: + active, activity, avg+chain+rssi, bandwidth, beacon+signal, chain+rssi, channel, + disabled+reason, dormant, dup+pkts, eid, entity+id, esr+active, last+exit, + noise, nss, our+address, parent+dev, peer+address, retry+failed, rx+bytes, + rx+drop, rx+pkts, rx+rate, rx+rate+%281m%29, rx+signal, rx-rate, time-stamp, + tx+bytes, tx+pkts, tx+rate, tx+rate+%281%C2%A0min%29, tx-rate, wifi+retries, + # hidden columns: resource Example URL: /mlo?fields=active,activity @@ -22471,6 +22717,7 @@ def get_layer4(self, # includes locally generated traffic as well as anyother systems active on # this channel.This is a per-radio value. 'avg chain rssi': # Wireless signal Average per-chain RSSI. + 'bandwidth': # Current negotiated bandwidth for the link. 'beacon signal': # Wireless signal strength (RSSI) for received beacons. 'chain rssi': # Wireless signal per-chain RSSI. 'channel': # Channel at the MLO link is currently using, if known. @@ -22482,7 +22729,10 @@ def get_layer4(self, 'esr active': # MLO Link is currently active. 'last exit': # Reasons that ESR MLO mode was last exited by the driver. 'noise': # Wireless noise level. + 'nss': # Current negotiated number of spatial streams for the link. + 'our address': # Our MAC address for this MLO link 'parent dev': # + 'peer address': # Peer MAC address for this MLO link 'retry failed': # Number of Wireless packets that the MLO Link failed to send due to # excessive retries. 'rx bytes': # Number of bytes received by this MLO Link. @@ -22642,7 +22892,7 @@ def get_newsession(self, When requesting specific column names, they need to be URL encoded: 4way+time+%28us%29, activity, aid, alias, anqp+time+%28us%29, ap, avg+chain+rssi, beacon, bps+rx, bps+rx+ll, bps+tx, bps+tx+ll, bss+color, bytes+rx+ll, bytes+tx+ll, - centerfrequency, chain+rssi, channel, collisions, connections, crypt, cx+ago, + center+frequency, chain+rssi, channel, collisions, connections, crypt, cx+ago, cx+time+%28us%29, device, dhcp+%28ms%29, down, entity+id, gateway+ip, hardware, ip, ipv6+address, ipv6+gateway, key%2Fphrase, login-fail, login-ok, logout-fail, logout-ok, mac, mask, misc, mode, mtu, no+cx+%28us%29, noise, parent+dev, phantom, @@ -22662,119 +22912,119 @@ def get_newsession(self, The record returned will have these members: { - '4way time (us)': # TIme (in micro-seconds) it took to complete the last WiFi 4-way - # authentication. - 'activity': # Percent of the channel that is utilized over the last minute.This - # includes locally generated traffic as well as anyother systems active on - # this channel.This is a per-radio value. - 'aid': # Reported STA association ID (AID) - 'alias': # User-specified alias for this Port. - 'anqp time (us)': # Time (in micro-seconds) it took to complete the last WiFi ANQP - # request/response session. - 'ap': # BSSID of AP for connected stations. - 'avg chain rssi': # Wireless signal Average per-chain RSSI. - 'beacon': # Number of Wireless beacons from Cell or AP that have been missed. - 'bps rx': # Average bits per second received for the last 30 seconds. - 'bps rx ll': # Bits per second received, including low-level framing (Ethernet Only). - 'bps tx': # Average bits per second transmitted for the last 30 seconds. - 'bps tx ll': # Bits per second transmitted, including low-level framing (Ethernet - # Only). - 'bss color': # Reported Wireless BSS Color - 'bytes rx ll': # Bytes received, including low-level framing (Ethernet Only). - 'bytes tx ll': # Bytes transmitted, including low-level framing (Ethernet Only). - 'centerfrequency': # Center channel which the devices is communicating on. - 'chain rssi': # Wireless signal per-chain RSSI. - 'channel': # Channel at the device is currently on, if known. - 'collisions': # Total number of collisions reported by this Interface.For WiFi devices, - # this is number of re-transmit attempts. - 'connections': # Number of wireless connections completed. - 'crypt': # Number of Wireless packets dropped due to inability to decrypt. - 'cx ago': # How long ago was the last WiFi connection attempt started?This relates - # only to the network interface, not any higher level protocol traffic - # upon it. - 'cx time (us)': # Time (in micro-seconds) it took to completethe last WiFi connection to - # the AP.If the connection is encrypted, this measurement includesthe - # value of 4way time (us) - 'device': # Ethernet device name, as seen by the kernel. - 'dhcp (ms)': # Time (in milliseconds) it took to acquire DHCP lease,or to time out - # while trying to acquire lease. - 'down': # The interface is configured DOWN. It must be configured UP to be in - # active use. - 'entity id': # Entity ID - 'gateway ip': # Default Router/Gateway IP for the Interface. - 'hardware': # Port hardware type. - 'ip': # IP Address of the Interface. - 'ipv6 address': # IPv6 Address for this interface. If global-scope address exists, it - # will be displayed,otherwise link-local will be displayed. - 'ipv6 gateway': # IPv6 default gateway. - 'key/phrase': # WEP Key or WPA Phrase (if enabled). - 'login-fail': # The 'ifup-post' script reported failure. This is usually used for WiFi - # portallogins, but may be customized by the user for other needs. - 'login-ok': # The 'ifup-post' script reported OK. This is usually used for WiFi - # portallogins, but may be customized by the user for other needs. - 'logout-fail': # The 'ifup-post --logout' script reported failure. This is usually used - # for WiFi portallogouts, but may be customized by the user for other - # needs. - 'logout-ok': # The 'ifup-post --logout' script reported OK. This is usually used for - # WiFi portallogouts, but may be customized by the user for other needs. - 'mac': # Ethernet MAC address of the Interface. - 'mask': # IP Mask of the Interface. - 'misc': # Number of Wireless packets dropped on receive due to unspecified - # reasons. - 'mode': # Wireless radio mode (802.11a/b/g). - 'mtu': # MTU (Maximum Transmit Unit) size, in bytes. - 'no cx (us)': # How long was the WiFi disconnect duration for the last disconnection? - 'noise': # Wireless noise level. - 'parent dev': # Parent device or port of this port. Blank if this device is not a child - # of another device or port. - 'phantom': # Is the port PHANTOM (no hardware found) or not. - 'port': # Entity ID - 'port type': # Ports can be Ethernet, Radio, vAP, vSTA, Redirect, or Bridges - 'pps rx': # Average packets per second received for the last 30 seconds. - 'pps tx': # Average packets per second transmitted for the last 30 seconds. - 'qlen': # "Transmit Queue Length for this Interface. - 'reset': # Current Reset-State. - 'retry failed': # Number of Wireless packets that the interface failed to send due to - # excessive retries. - 'rf loss': # Amount of RX/RX RF Loss in 1/2 dB from SMA port to the internal - # Radio.Some radios can report this, and it can be used in calibration - # toincrease calibration accuracy. - 'rx bytes': # Total number of bytes received by this Interface. - 'rx crc': # Total number of packets dropped because of a bad CRC/FCS. - 'rx drop': # Total number of dropped packets on recieve. Usually means driver/kernel - # is being over-worked. - 'rx errors': # Total number of all types of Receive Errors. - 'rx fifo': # Total number of packets dropped because driver/kernel queues are full. - 'rx frame': # Total number of packets dropped because of framing errors at the - # physical layer. - 'rx length': # Total number of packets dropped because their length was invalid. - 'rx miss': # Total number of packets dropped because of a missed interrupt. - 'rx over': # Total number of packets dropped because of framing errors at the - # physical layer. - 'rx pkts': # Total number of packets received by this Interface. - 'rx-rate': # Reported network device RX link speed. - 'sec': # Number of secondary IP addresses configured or detected. - 'security': # WiFi Security Protocol Configured - 'signal': # Wireless signal strength (RSSI). - 'ssid': # WiFi SSID identifier.Use [BLANK] for empty SSID, which means use any - # available SSID when associating. - 'status': # Wireless link status. - 'time-stamp': # Time-Stamp - 'tx abort': # Total packets dropped on transmit because of driver abort. - 'tx bytes': # Total number of bytes sent by this Interface. - 'tx crr': # Total packets dropped on transmit because of carrier error. - 'tx errors': # Total number of all types of Transmit Errors. - 'tx fifo': # Total packets dropped on transmit because outgoing queue was full. - 'tx hb': # Total packets dropped on transmit because of transceiver heartbeat - # errors. - 'tx pkts': # Total number of packets sent by this Interface. - 'tx wind': # Total number dropped on transmit because of Out-of-Window collision. - 'tx-failed %': # Percentage of transmitted Wireless packets that were not ACKed.They - # might have succeeded on retry. - 'tx-rate': # Reported network device TX link speed. - 'wifi retries': # Number of Wireless packets that the wifi radio retried.One packet may be - # tried multiple times and each try would be counted in this stat.Not all - # radios can properly report this statistic. + '4way time (us)': # TIme (in micro-seconds) it took to complete the last WiFi 4-way + # authentication. + 'activity': # Percent of the channel that is utilized over the last minute.This + # includes locally generated traffic as well as anyother systems active on + # this channel.This is a per-radio value. + 'aid': # Reported STA association ID (AID) + 'alias': # User-specified alias for this Port. + 'anqp time (us)': # Time (in micro-seconds) it took to complete the last WiFi ANQP + # request/response session. + 'ap': # BSSID of AP for connected stations. + 'avg chain rssi': # Wireless signal Average per-chain RSSI. + 'beacon': # Number of Wireless beacons from Cell or AP that have been missed. + 'bps rx': # Average bits per second received for the last 30 seconds. + 'bps rx ll': # Bits per second received, including low-level framing (Ethernet Only). + 'bps tx': # Average bits per second transmitted for the last 30 seconds. + 'bps tx ll': # Bits per second transmitted, including low-level framing (Ethernet + # Only). + 'bss color': # Reported Wireless BSS Color + 'bytes rx ll': # Bytes received, including low-level framing (Ethernet Only). + 'bytes tx ll': # Bytes transmitted, including low-level framing (Ethernet Only). + 'center frequency': # Center channel which the devices is communicating on. + 'chain rssi': # Wireless signal per-chain RSSI. + 'channel': # Channel at the device is currently on, if known. + 'collisions': # Total number of collisions reported by this Interface.For WiFi devices, + # this is number of re-transmit attempts. + 'connections': # Number of wireless connections completed. + 'crypt': # Number of Wireless packets dropped due to inability to decrypt. + 'cx ago': # How long ago was the last WiFi connection attempt started?This relates + # only to the network interface, not any higher level protocol traffic + # upon it. + 'cx time (us)': # Time (in micro-seconds) it took to completethe last WiFi connection to + # the AP.If the connection is encrypted, this measurement includesthe + # value of 4way time (us) + 'device': # Ethernet device name, as seen by the kernel. + 'dhcp (ms)': # Time (in milliseconds) it took to acquire DHCP lease,or to time out + # while trying to acquire lease. + 'down': # The interface is configured DOWN. It must be configured UP to be in + # active use. + 'entity id': # Entity ID + 'gateway ip': # Default Router/Gateway IP for the Interface. + 'hardware': # Port hardware type. + 'ip': # IP Address of the Interface. + 'ipv6 address': # IPv6 Address for this interface. If global-scope address exists, it + # will be displayed,otherwise link-local will be displayed. + 'ipv6 gateway': # IPv6 default gateway. + 'key/phrase': # WEP Key or WPA Phrase (if enabled). + 'login-fail': # The 'ifup-post' script reported failure. This is usually used for WiFi + # portallogins, but may be customized by the user for other needs. + 'login-ok': # The 'ifup-post' script reported OK. This is usually used for WiFi + # portallogins, but may be customized by the user for other needs. + 'logout-fail': # The 'ifup-post --logout' script reported failure. This is usually used + # for WiFi portallogouts, but may be customized by the user for other + # needs. + 'logout-ok': # The 'ifup-post --logout' script reported OK. This is usually used for + # WiFi portallogouts, but may be customized by the user for other needs. + 'mac': # Ethernet MAC address of the Interface. + 'mask': # IP Mask of the Interface. + 'misc': # Number of Wireless packets dropped on receive due to unspecified + # reasons. + 'mode': # Wireless radio mode (802.11a/b/g). + 'mtu': # MTU (Maximum Transmit Unit) size, in bytes. + 'no cx (us)': # How long was the WiFi disconnect duration for the last disconnection? + 'noise': # Wireless noise level. + 'parent dev': # Parent device or port of this port. Blank if this device is not a child + # of another device or port. + 'phantom': # Is the port PHANTOM (no hardware found) or not. + 'port': # Entity ID + 'port type': # Ports can be Ethernet, Radio, vAP, vSTA, Redirect, or Bridges + 'pps rx': # Average packets per second received for the last 30 seconds. + 'pps tx': # Average packets per second transmitted for the last 30 seconds. + 'qlen': # "Transmit Queue Length for this Interface. + 'reset': # Current Reset-State. + 'retry failed': # Number of Wireless packets that the interface failed to send due to + # excessive retries. + 'rf loss': # Amount of RX/RX RF Loss in 1/2 dB from SMA port to the internal + # Radio.Some radios can report this, and it can be used in calibration + # toincrease calibration accuracy. + 'rx bytes': # Total number of bytes received by this Interface. + 'rx crc': # Total number of packets dropped because of a bad CRC/FCS. + 'rx drop': # Total number of dropped packets on recieve. Usually means driver/kernel + # is being over-worked. + 'rx errors': # Total number of all types of Receive Errors. + 'rx fifo': # Total number of packets dropped because driver/kernel queues are full. + 'rx frame': # Total number of packets dropped because of framing errors at the + # physical layer. + 'rx length': # Total number of packets dropped because their length was invalid. + 'rx miss': # Total number of packets dropped because of a missed interrupt. + 'rx over': # Total number of packets dropped because of framing errors at the + # physical layer. + 'rx pkts': # Total number of packets received by this Interface. + 'rx-rate': # Reported network device RX link speed. + 'sec': # Number of secondary IP addresses configured or detected. + 'security': # WiFi Security Protocol Configured + 'signal': # Wireless signal strength (RSSI). + 'ssid': # WiFi SSID identifier.Use [BLANK] for empty SSID, which means use any + # available SSID when associating. + 'status': # Wireless link status. + 'time-stamp': # Time-Stamp + 'tx abort': # Total packets dropped on transmit because of driver abort. + 'tx bytes': # Total number of bytes sent by this Interface. + 'tx crr': # Total packets dropped on transmit because of carrier error. + 'tx errors': # Total number of all types of Transmit Errors. + 'tx fifo': # Total packets dropped on transmit because outgoing queue was full. + 'tx hb': # Total packets dropped on transmit because of transceiver heartbeat + # errors. + 'tx pkts': # Total number of packets sent by this Interface. + 'tx wind': # Total number dropped on transmit because of Out-of-Window collision. + 'tx-failed %': # Percentage of transmitted Wireless packets that were not ACKed.They + # might have succeeded on retry. + 'tx-rate': # Reported network device TX link speed. + 'wifi retries': # Number of Wireless packets that the wifi radio retried.One packet may be + # tried multiple times and each try would be counted in this stat.Not all + # radios can properly report this statistic. } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" @@ -23405,7 +23655,7 @@ def get_resource(self, pulse+repetition+frequency+3, pulse+width, sample+rate, state, status, sweep+time, time+period+1+off, time+period+1+on, time+period+2+off, time+period+2+on, time+period+3+off, time+period+3+on, trials+center, trials+high, trials+low, - trigger+amp, trigger+dbm, uut+channel + trigger+amp, trigger+dbm, uut+channel+bandwidth Example URL: /rfgen?fields=bb-gain,burst+offset Example py-json call (it knows the URL): @@ -23456,7 +23706,7 @@ def get_resource(self, 'trigger amp': # Trigger amplitude, the amplitude threshold needed for the pulse detect # tool to detect a pulse. In 1/100ths of an amp units. 'trigger dbm': # Trigger dBm for pulse-detect tool. - 'uut channel': # UUT Channel for FCC5 configuration. + 'uut channel bandwidth': # UUT Channel for FCC5 configuration. } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" @@ -25247,6 +25497,7 @@ class and method used by a python script. This provides a dyanmic approach "add_gre": self.command_instance.post_add_gre, "add_group": self.command_instance.post_add_group, "add_l4_endp": self.command_instance.post_add_l4_endp, + "add_mld_link": self.command_instance.post_add_mld_link, "add_monitor": self.command_instance.post_add_monitor, "add_mvlan": self.command_instance.post_add_mvlan, "add_ppp_link": self.command_instance.post_add_ppp_link, @@ -25440,6 +25691,7 @@ class and method used by a python script. This provides a dyanmic approach "show_events": self.command_instance.post_show_events, "show_files": self.command_instance.post_show_files, "show_group": self.command_instance.post_show_group, + "show_mld_link": self.command_instance.post_show_mld_link, "show_mlo_link": self.command_instance.post_show_mlo_link, "show_pesq": self.command_instance.post_show_pesq, "show_ports": self.command_instance.post_show_ports, diff --git a/lf_sniff.py b/lf_sniff.py index 507ac0022..b4914a735 100755 --- a/lf_sniff.py +++ b/lf_sniff.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/lf_tos_plus_test.py b/lf_tos_plus_test.py index 8c8dd8d0d..7cda69d84 100755 --- a/lf_tos_plus_test.py +++ b/lf_tos_plus_test.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/lf_tos_test.py b/lf_tos_test.py index 7fc9bd893..f96c100a9 100755 --- a/lf_tos_test.py +++ b/lf_tos_test.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/lf_tx_power.py b/lf_tx_power.py index e3a41d34f..e7fd5a7e8 100755 --- a/lf_tx_power.py +++ b/lf_tx_power.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' NAME: lf_tx_power @@ -421,6 +421,7 @@ def main(): parser.add_argument("--series", type=str, help="[controller configuration] controller series --series 9800", required=True) parser.add_argument("--band", type=str, help="band testing --band 6g", choices=["5g", "24g", "6g", "dual_band_5g", "dual_band_6g"]) parser.add_argument("--module", type=str, help="[controller configuration] series module (cc_module_9800_3504.py) --module cc_module_9800_3504 ", required=True) + parser.add_argument("--module_scrapli", help="[controller configuration] the module is a scrapli module so needs lanforge information for jump host ", action='store_true') parser.add_argument("--timeout", type=str, help="[controller configuration] controller command timeout --timeout 3 ", default=3) # AP configuration @@ -617,19 +618,38 @@ def main(): # dynamic import of the controller module series = importlib.import_module(args.module) - # create the controller , cs is controller scheme - cs = series.create_controller_series_object( - scheme=args.scheme, - dest=args.dest, - user=args.user, - passwd=args.passwd, - prompt=args.prompt, - series=args.series, - ap=args.ap, - ap_band_slot_6g=args.ap_band_slot_6g, - port=args.port, - band=args.band, - timeout=args.timeout) + if args.module_scrapli: + # create the controller , cs is controller scheme + cs = series.create_controller_series_object( + scheme=args.scheme, + dest=args.dest, + user=args.user, + passwd=args.passwd, + prompt=args.prompt, + series=args.series, + ap=args.ap, + ap_band_slot_6g=args.ap_band_slot_6g, + port=args.port, + band=args.band, + timeout=args.timeout, + lfmgr=args.lfmgr, + lfuser=args.lfuser, + lfpasswd=args.lfpasswd, + upstream_port=args.upstream_port) + else: + # create the controller , cs is controller scheme + cs = series.create_controller_series_object( + scheme=args.scheme, + dest=args.dest, + user=args.user, + passwd=args.passwd, + prompt=args.prompt, + series=args.series, + ap=args.ap, + ap_band_slot_6g=args.ap_band_slot_6g, + port=args.port, + band=args.band, + timeout=args.timeout) cs.wlan = args.wlan cs.wlanID = args.wlanID cs.wlanSSID = args.wlanSSID @@ -639,7 +659,7 @@ def main(): # Need to get regulatory domain for title # Read the country code and regulatory domain - # + cs.console_setup() cs.read_country_code_and_regulatory_domain() @@ -652,6 +672,7 @@ def main(): # end setup logging and paths # put in test information in title name # this only works for single test passed in. + # TODO adjustments to module if args.tx_power_adjust_6E and args.band == '6g': txpowers = args.txpower.split() if args.bandwidth == '20': @@ -1732,6 +1753,8 @@ def main(): time.sleep(3) loop_count = 0 cc_dbm_rcv = False + + # TODO this needs to be moved to the module if args.series == "9800": while cc_dbm_rcv is False and loop_count <= 3: logg.info("9800 read controller dBm") @@ -1864,7 +1887,12 @@ def main(): else: cc_dbm_rcv = True cs.show_wlan_summary() - else: + # read the AP Tx Power + cs.get_ap_tx_power_config() + ap_dbm = cs.ap_tx_power_dbm + ap_power = "{pw} of {pw_levels}".format(pw=cs.ap_current_tx_power_level, pw_levels=cs.ap_num_power_levels) + + elif args.series == "3540": pss = cs.show_ap_dot11_5gz_summary() logg.info(pss) pss = cs.show_ap_dot11_24gz_summary() @@ -1913,6 +1941,26 @@ def main(): logg.info("3504 test_parameters cc_dbm: read : {}".format(cc_dbm)) logg.info("3504 test_parameters cc_ch: read : {}".format(cc_ch)) + # read the AP Tx Power + cs.get_ap_tx_power_config() + ap_dbm = cs.ap_tx_power_dbm + ap_power = "{pw} of {pw_levels}".format(pw=cs.ap_current_tx_power_level, pw_levels=cs.ap_num_power_levels) + + # Generic Modules + else: + cs.get_config_summary() + cc_mac = cs.mac + cc_ch = cs.channel + cc_power = cs.tx_power + cc_dbm = cs.tx_power_dbm + ch_count = cs.channel_count + cc_bw = cs.bandwidth + + # read the AP Tx Power + cs.get_ap_tx_power_config() + ap_dbm = cs.ap_tx_power_dbm + ap_power = "{pw} of {pw_levels}".format(pw=cs.ap_current_tx_power_level, pw_levels=cs.ap_num_power_levels) + # the mtk7921 needs to have the radio channel set and not be auto if args.mtk7921k: if args.band == '6g' or args.band == 'dual_band_6g': @@ -1938,10 +1986,6 @@ def main(): traceback.print_exception(Exception, x, x.__traceback__, chain=True) logger.warning("mtk7921 after tx_power change failed to set channel {chan}".format(chan=ch)) - # read the AP Tx Power - cs.get_ap_tx_power_config() - ap_dbm = cs.ap_tx_power_dbm - ap_power = "{pw} of {pw_levels}".format(pw=cs.ap_current_tx_power_level, pw_levels=cs.ap_num_power_levels) # Up station subprocess.run(["./lf_portmod.pl", "--manager", lfmgr, "--card", lfresource, "--port_name", lfstation, @@ -1996,8 +2040,8 @@ def main(): allow_agent=False, look_for_keys=False, banner_timeout=600) # Enable beachon rssi debug logs once per boot - # echo1 > /sys/module/mac80211/parameters/debug_beacon_rssi - # then 'journalctl -f' or dmesg should show deabon info + # echo1 > /sys/module/mac80211/parameters/debug_beacon_rssi + # then 'journalctl -f' or dmesg should show deabon info # command = 'echo lanforge | sudo echo 0 > /debug/ieee80211/{radio}/mt76/runtime-pm'.format(radio=args.radio) # may have to do sudo -s , the cd ~root to execute the command @@ -2947,6 +2991,8 @@ def main(): col += 1 worksheet.write(row, col, total_run_duration_str, green) col += 1 + if not cc_dbm : + cc_dbm = 0 if (int(cc_dbm) != int(ap_dbm)): err = "ERROR: Controller dBm : %s != AP dBm: %s. " % (cc_dbm, ap_dbm) logg.info(err) diff --git a/lf_tx_power_tool.py b/lf_tx_power_tool.py index 33083d4a5..e07311eb4 100755 --- a/lf_tx_power_tool.py +++ b/lf_tx_power_tool.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa """ NAME: lf_tx_power_dbm_tool.py diff --git a/mux_client.py b/mux_client.py index bc0500b94..7b135580d 100755 --- a/mux_client.py +++ b/mux_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/openwrt_ctl.py b/openwrt_ctl.py index 569740445..1906cb5a5 100755 --- a/openwrt_ctl.py +++ b/openwrt_ctl.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/py-json/LANforge/lfcli_base.py b/py-json/LANforge/lfcli_base.py index 138b09dda..34d4085a8 100644 --- a/py-json/LANforge/lfcli_base.py +++ b/py-json/LANforge/lfcli_base.py @@ -439,7 +439,7 @@ def check_connect(self, timeout=300): # Have actual license data (not only whitespace or newline) # Split it by whitespace into separate components - hunks = re.split("\s+", line) + hunks = re.split("\\s+", line) # Two types of licenses regular and node-locked. The only difference is # that the node-locked license also contains a MAC address of the system diff --git a/py-json/create_wanlink.py b/py-json/create_wanlink.py index ebcbf0bda..f802bb5c9 100755 --- a/py-json/create_wanlink.py +++ b/py-json/create_wanlink.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa # Create and modify WAN Links Using LANforge JSON AP : http://www.candelatech.com/cookbook.php?vol=cli&book=JSON:+Managing+WANlinks+using+JSON+and+Python # Written by Candela Technologies Inc. diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 4af294384..b0977fe30 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -1,17 +1,10 @@ -# flake8: noqa -""" -Note: This script is working as library for chamberview tests. - It holds different commands to automate test. -""" - +"""Library code for automating LANforge Chamber View tests.""" import sys import os import importlib import time import json -from pprint import pprint import logging -import traceback if sys.version_info[0] != 3: print("This script requires Python 3") @@ -29,6 +22,7 @@ def cv_base_adjust_parser(args): + # TODO: Can we add these options to base parser? if args.test_rig != "": # TODO: In future, can use TestRig once that GUI update has propagated args.set.append(["Test Rig ID:", args.test_rig]) @@ -38,6 +32,7 @@ def cv_base_adjust_parser(args): def cv_add_base_parser(parser): + """Update provided argparse argument parser with Chamber View-specific arguments.""" parser.add_argument("-m", "--mgr", dest="mgr", type=str, @@ -126,24 +121,41 @@ def cv_add_base_parser(parser): default="", help="Specify the test tag info for reporting purposes, for instance: testbed-01") + parser.add_argument("-f", "--force", + dest="force", + action="store_true", + help="Force removal of any conflicting test instances. " + "Exercise caution with this option, as it will ungracefully stop " + "any present (and running) test instances, if any. This operation " + "may rebuild the currently-selected Chamber View Scenario as well. " + "Presently this only removes test instances with the same name, " + "but in the future it may remove all instances.") + class cv_test(Realm): + """Utilities for configuring LANforge Chamber View tests and Scenarios.""" def __init__(self, - lfclient_host="localhost", - lfclient_port=8080, - lf_report_dir=None, - debug_=False, - ): + lfclient_host: str = "localhost", + lfclient_port: int = 8080, + lf_report_dir: str = None, + debug_: bool = False): + """Create new session for configuring LANforge Chamber View tests and Scenarios.""" super().__init__(lfclient_host=lfclient_host, lfclient_port=lfclient_port, - debug_=debug_ - ) + debug_=debug_) self.lf_report_dir = lf_report_dir self.report_name = None - # Add a config line to a text blob. Will create new text blob - # if none exists already. - def create_test_config(self, config_name, blob_test_name, text): + # ~~~ Chamber View test functions ~~~ + def create_test_config(self, config_name: str, blob_test_name: str, text: str): + """Create a new or update an existing Chamber View test configuration. + + Recommended to use the `build_cfg()` wrapper function instead, as this function + does not ensure the config is active before returning. + + The config name and blob test name are combined to create a unique test configuration, + referred to as a 'text blob'. + """ req_url = "/cli-json/add_text_blob" data = { "type": "Plugin-Settings", @@ -151,92 +163,104 @@ def create_test_config(self, config_name, blob_test_name, text): "text": text } - logger.info("adding -:%s:- to test config: %s blob-name: %s" %(text, config_name, blob_test_name)) + logger.info("adding -:%s:- to test config: %s blob-name: %s" % (text, config_name, blob_test_name)) self.json_post(req_url, data) - # Tell LANforge GUI Chamber View to launch a test - def create_test(self, test_name, instance, load_old_cfg): - cmd = "cv create '{0}' '{1}' '{2}'".format(test_name, instance, load_old_cfg) - return self.run_cv_cmd(str(cmd)) - - # Tell LANforge chamber view to load a scenario. - def load_test_scenario(self, instance, scenario): - cmd = "cv load '{0}' '{1}'".format(instance, scenario) - self.run_cv_cmd(cmd) - - # load test config for a chamber view test instance. - def load_test_config(self, test_config, instance): - cmd = "cv load '{0}' '{1}'".format(instance, test_config) - self.run_cv_cmd(cmd) - - # start the test - def start_test(self, instance): - cmd = "cv click '%s' Start" % instance - return self.run_cv_cmd(cmd) - - # close test - def close_test(self, instance): - cmd = "cv click '%s' 'Close'" % instance - self.run_cv_cmd(cmd) - - # Cancel - def cancel_test(self, instance): - cmd = "cv click '%s' Cancel" % instance - self.run_cv_cmd(cmd) - - # For auto save report - # NOTE: This only changes it from current, which means it - # could actually turn auto-save off instead of on. Use - # set_auto_save_report instead. - def auto_save_report(self, instance): - cmd = "cv click '%s' 'Auto Save Report'" % instance - self.run_cv_cmd(cmd) - - # Set auto save report - # onoff: true or 1 enables, other vlaue disables - def set_auto_save_report(self, instance, onoff): - cmd = "cv set '%s' 'Auto Save Report' %s" % (instance, onoff) - self.run_cv_cmd(cmd) - - # To get the report location - def get_report_location(self, instance): + def create_test(self, test_name: str, instance: str, load_old_cfg: int): + """Launch test window for specified Chamber View test (does not start the test). + + Recommended to use the `create_and_run_test()` function if creating + new test automation, as it manages process of configuring, invoking, and running + a Chamber View test. + """ + return self.run_cv_cmd(f"cv create '{test_name}' '{instance}' '{load_old_cfg}'") + + def load_test_scenario(self, instance: str, scenario: str): + """Load Chamber View test config for specified test instance (active test window). + + Recommended to use `load_test_config()` instead, as the term 'scenario' here + is overloaded with Chamber View Scenario, which is separate. + + Recommended to use the `create_and_run_test()` function if creating + new test automation, as it manages process of configuring, invoking, and running + a Chamber View test. + """ + self.run_cv_cmd(f"cv load '{instance}' '{scenario}'") + + def load_test_config(self, test_config: str, instance: str): + """Load Chamber View test config for specified test instance. + + Recommended to use the `create_and_run_test()` function if creating + new test automation, as it manages process of configuring, invoking, and running + a Chamber View test. + """ + self.run_cv_cmd(f"cv load '{instance}' '{test_config}'") + + def start_test(self, instance: str): + """Start the Chamber View test for specified test instance (assumes instance is active). + + Recommended to use the `create_and_run_test()` function if creating + new test automation, as it manages process of invoking and running + a Chamber View test.""" + return self.run_cv_cmd(f"cv click '{instance}' Start") + + def close_test(self, instance: str): + """Close the Chamber View test window for specified test instance.""" # TODO: Assume it also stops the test? + self.run_cv_cmd(f"cv click '{instance}' 'Close'") + + def cancel_test(self, instance: str): + """Cancel the Chamber View test for specified test instance.""" + self.run_cv_cmd(f"cv click '{instance}' Cancel") + + def auto_save_report(self, instance: str): + """Toggle Chamber View test 'Auto Save' option for specified test instance. + + Recommended to use `set_auto_save_report()` instead to avoid unexpected errors. + If the option is presently selected, this will un-select (disable) auto save functionality. + """ + self.run_cv_cmd(f"cv click '{instance}' 'Auto Save Report'") + + def set_auto_save_report(self, instance: str, onoff: int): + """Set Chamber View test 'Auto Save' option for specified test instance. + + Specify '1' to enable the 'Auto Save' option or '0' to disable the option. + """ + self.run_cv_cmd(f"cv set '{instance}' 'Auto Save Report' {onoff}") + + def get_report_location(self, instance: str): + """Query the report location for the specified Chamber View test instance.""" cmd = "cv get '%s' 'Report Location:'" % instance location = self.run_cv_cmd(cmd) return location - # To get if test is running or not - def get_is_running(self, instance): - cmd = "cv get '%s' 'StartStop'" % instance - val = self.run_cv_cmd(cmd) - # pprint(val) + def get_is_running(self, instance: str): + """Query test status of the specified Chamber View test instance.""" + val = self.run_cv_cmd(f"cv get '{instance}' 'StartStop'") return val[0]["LAST"]["response"] == 'StartStop::Stop' - # To save to html - def save_html(self, instance): - cmd = "cv click %s 'Save HTML'" % instance - self.run_cv_cmd(cmd) + def save_html(self, instance: str): + """Save the test results for the specified Chamber View test instance. + + This assumes that the test has completed. + """ + self.run_cv_cmd(f"cv click {instance} 'Save HTML'") - # Check if test instance exists - def get_exists(self, instance): - cmd = "cv exists %s" % instance - val = self.run_cv_cmd(cmd) - # pprint(val) + def get_exists(self, instance: str): + """Query existence of specified Chamber View test instance.""" + val = self.run_cv_cmd(f"cv exists {instance}") return val[0]["LAST"]["response"] == 'YES' - # Check if chamberview is built def get_cv_is_built(self): - cmd = "cv is_built" - val = self.run_cv_cmd(cmd) - # pprint(val) + """Query status of specified Chamber View Scenario (built or not).""" + val = self.run_cv_cmd("cv is_built") rv = val[0]["LAST"]["response"] == 'YES' logger.info("is-built: {rv} ".format(rv=rv)) return rv - # delete the test instance - def delete_instance(self, instance): - cmd = "cv delete '%s'" % instance - self.run_cv_cmd(cmd) + def delete_instance(self, instance: str): + """Delete specified Chamber View test instance.""" + self.run_cv_cmd(f"cv delete '{instance}'") # It can take a while, some test rebuild the old scenario upon exit, for instance. tries = 0 @@ -262,12 +286,17 @@ def delete_instance(self, instance): else: break - # Get port listing - def get_ports(self, url="/ports/"): + def get_ports(self, url: str = "/ports/"): + """Query manager for port information.""" response = self.json_get(url) return response - def show_text_blob(self, config_name, blob_test_name, brief): + def show_text_blob(self, config_name: str, blob_test_name: str, brief: bool): + """Query specified Chamber View config contents. + + The config name and blob test name are combined to create a unique test configuration + referred to as a 'text blob'. + """ req_url = "/cli-json/show_text_blob" response_json = [] data = {"type": "Plugin-Settings"} @@ -280,7 +309,12 @@ def show_text_blob(self, config_name, blob_test_name, brief): self.json_post(req_url, data, response_json_list_=response_json) return response_json - def rm_text_blob(self, config_name, blob_test_name): + def rm_text_blob(self, config_name: str, blob_test_name: str): + """Remove specified Chamber View config. + + The config name and blob test name are combined to create a unique test configuration + referred to as a 'text blob'. + """ req_url = "/cli-json/rm_text_blob" data = { "type": "Plugin-Settings", @@ -288,7 +322,13 @@ def rm_text_blob(self, config_name, blob_test_name): } self.json_post(req_url, data) - def rm_cv_text_blob(self, cv_type="Network-Connectivity", name=None): + # TODO: What does 'Network-Connectivity' denote? + def rm_cv_text_blob(self, cv_type: str = "Network-Connectivity", name: str = None): + """Remove specified Chamber View config. + + The config name and blob test name are combined to create a unique test configuration + referred to as a 'text blob'. + """ req_url = "/cli-json/rm_text_blob" data = { "type": cv_type, @@ -297,8 +337,8 @@ def rm_cv_text_blob(self, cv_type="Network-Connectivity", name=None): self.json_post(req_url, data) @staticmethod - def apply_cfg_options(cfg_options, enables, disables, raw_lines, raw_lines_file): - + def apply_cfg_options(cfg_options: list, enables: list, disables: list, raw_lines: list, raw_lines_file: str): + """Update specified config options list with provided configuration.""" # Read in calibration data and whatever else. if raw_lines_file != "": # Check that file exists before attempting to open @@ -322,7 +362,11 @@ def apply_cfg_options(cfg_options, enables, disables, raw_lines, raw_lines_file) for r in raw_lines: cfg_options.append(r[0]) - def build_cfg(self, config_name, blob_test, cfg_options): + def build_cfg(self, config_name: str, blob_test: str, cfg_options: list): + """Apply and make active specified Chamber View test configuration. + + This function also ensures the config is active in the GUI. + """ for value in cfg_options: self.create_test_config(config_name, blob_test, value) @@ -334,39 +378,54 @@ def build_cfg(self, config_name, blob_test, cfg_options): # the text blob. time.sleep(5) - # load_old_config is boolean - # test_name is specific to the type of test being launched (Dataplane, tr398, etc) - # ChamberViewFrame.java has list of supported test names. - # instance_name is per-test instance, it does not matter much, just use the same name - # throughout the entire run of the test. - # config_name what to call the text-blob that configures the test. Does not matter much - # since we (re)create it during the run. - # sets: Arrany of [key,value] pairs. The key is the widget name, typically the label - # before the entry field. - # pull_report: Boolean, should we download the report to current working directory. - # lf_host: LANforge machine running the GUI. - # lf_password: Password for LANforge machine running the GUI. - # cv_cmds: Array of raw chamber-view commands, such as "cv click 'button-name'" - # These (and the sets) are applied after the test is created and before it is started. - def create_and_run_test(self, load_old_cfg, test_name, instance_name, config_name, sets, - pull_report, lf_host, lf_user, lf_password, cv_cmds, local_lf_report_dir=None, ssh_port=22, - graph_groups_file=None): + def create_and_run_test(self, + load_old_cfg: bool, + test_name: str, + instance_name: str, + config_name: str, + sets: list, + pull_report: bool, + lf_host: str, + lf_user: str, + lf_password: str, + cv_cmds: list, + local_lf_report_dir: str = None, + ssh_port: int = 22, + graph_groups_file: str = None, + force: bool = False, + **kwargs): + """Create and run Chamber View test with specified configuration. + + load_old_config is boolean + test_name is specific to the type of test being launched (Dataplane, tr398, etc) + ChamberViewFrame.java has list of supported test names. + instance_name is per-test instance, it does not matter much, just use the same name + throughout the entire run of the test. + config_name what to call the text-blob that configures the test. Does not matter much + since we (re)create it during the run. + sets: Arrany of [key,value] pairs. The key is the widget name, typically the label + before the entry field. + pull_report: Boolean, should we download the report to current working directory. + lf_host: LANforge machine running the GUI. + lf_password: Password for LANforge machine running the GUI. + cv_cmds: Array of raw chamber-view commands, such as "cv click 'button-name'" + These (and the sets) are applied after the test is created and before it is started. + """ load_old = "false" if load_old_cfg: load_old = "true" + # 1. Attempt to create test as configured (does not start yet) + # + # This may fail for a number of reasons, including there + # already being an active test instance with the same name + # + # Note that this logic only checks for test instance with same name. + # It currently has no logic to detect any *other* active tests + # with a different test instance name start_try = 0 while True: - # Attempt to create test as configured - # - # This may fail for a number of reasons, including there - # already being an active test instance with the same name - # - # Note that this logic only checks for test instance with same name. - # It currently has no logic to detect any *other* active tests - # with a different test instance name response = self.create_test(test_name, instance_name, load_old) - logger.debug(f"Create test response data: {response}") # Check response data to see if test creation was successful if response and len(response) > 0: @@ -381,39 +440,40 @@ def create_and_run_test(self, load_old_cfg, test_name, instance_name, config_nam # Failed to create test, try again until our try counter expires logger.warning(f"Could not create test, try: {start_try}/60:") + if force: + self.delete_instance(instance_name) + start_try += 1 if start_try > 60: - logger.error("ERROR: Could not start within 60 tries, aborting.") + logger.critical("Could not start within 60 tries, aborting.") exit(1) time.sleep(1) + # 2. Configure test self.load_test_config(config_name, instance_name) self.set_auto_save_report(instance_name, "true") for kv in sets: cmd = "cv set '%s' '%s' '%s'" % (instance_name, kv[0], kv[1]) - logger.info("Running CV set command:{cmd}".format(cmd=cmd)) self.run_cv_cmd(cmd) for cmd in cv_cmds: - logger.info("Running CV set command:{cmd}".format(cmd=cmd)) self.run_cv_cmd(cmd) + # 3. Start test response = self.start_test(instance_name) if response[0]["LAST"]["response"].__contains__("Could not find instance:"): logger.error("ERROR: start_test failed: ", response[0]["LAST"]["response"], "\n") - # pprint(response) exit(1) + # 4. Poll test while it runs not_running = 0 ok_status = 1 while True: - cmd = "cv get_and_close_dialog" - dialog = self.run_cv_cmd(cmd) - if dialog[0]["LAST"]["response"] != "NO-DIALOG": - logger.info("Popup Dialog:\n") - logger.info(dialog[0]["LAST"]["response"]) + # Report and close any dialogs + self.get_popup_info_and_close() + # Query test status if ok_status: cmd = "cv get_status '%s'" % (instance_name) status = self.run_cv_cmd(cmd) @@ -425,6 +485,8 @@ def create_and_run_test(self, load_old_cfg, test_name, instance_name, config_nam logger.info("Status:\n") logger.info(status[0]["LAST"]["response"]) + # TODO: Only need to check this once. Maybe moving this to the end of the function + # where we already set report location check = self.get_report_location(instance_name) location = json.dumps(check[0]["LAST"]["response"]) if location != '\"Report Location:::\"': @@ -459,8 +521,9 @@ def create_and_run_test(self, load_old_cfg, test_name, instance_name, config_nam else: logger.info('Waiting on test completion for kpi') - - # Of if test stopped for some reason and could not generate report. + # Stop polling CV test if it's not running after five tries + # This includes both issues during test run (after successful creation) + # as well as normal stop logic if not self.get_is_running(instance_name): logger.info("Detected test is not running %s / 5." % (not_running)) not_running += 1 @@ -468,21 +531,22 @@ def create_and_run_test(self, load_old_cfg, test_name, instance_name, config_nam break time.sleep(1) + + # 5. Test complete, gather reports and cleanup + # + # This closes the test and any present pop-ups self.report_name = self.get_report_location(instance_name) - # Ensure test is closed and cleaned up self.delete_instance(instance_name) - # Clean up any remaining popups. + # Clean up any remaining popups while True: - cmd = "cv get_and_close_dialog" - dialog = self.run_cv_cmd(cmd) - if dialog[0]["LAST"]["response"] != "NO-DIALOG": - logger.info("Popup Dialog:\n") - logger.info(dialog[0]["LAST"]["response"]) - else: + # Just need to check if there is any dialog to complete, helper logs dialog for us + response = self.get_popup_info_and_close() + if self.get_response_string(response) == "NO-DIALOG": break - def kpi_results_present(self): + def kpi_results_present(self) -> bool: + """Query whether Chamber View test KPI results are available in configured report directory.""" kpi_csv_data_present = False kpi_csv = '' @@ -497,26 +561,30 @@ def kpi_results_present(self): if os.path.isfile(kpi_csv): kpi_size = os.path.getsize(kpi_csv) if kpi_size < 210: - logger.error("kpi_csv file may only have column headers size: {kpi_size} file: {kpi_csv}".format(kpi_size=kpi_size,kpi_csv=kpi_csv)) + logger.error(f"kpi_csv file may only have column headers size: {kpi_size} file: {kpi_csv}") else: - logger.info("kpi_csv file not empty size: {kpi_size} {kpi_csv}".format(kpi_size=kpi_size,kpi_csv=kpi_csv)) + logger.info(f"kpi_csv file not empty size: {kpi_size} {kpi_csv}") kpi_csv_data_present = True return kpi_csv_data_present - # ************************** chamber view ************************** + # ~~~ Chamber View Scenario functions ~~~ def add_text_blob_line(self, - scenario_name="Automation", - Resources="1.1", - Profile="STA-AC", - Amount="1", - DUT="DUT", - Dut_Radio="Radio-1", - Uses1="wiphy0", - Uses2="AUTO", - Traffic="http", - Freq="-1", - VLAN=""): + scenario_name: str = "Automation", + Resources: str = "1.1", + Profile: str = "STA-AC", + Amount: str = "1", + DUT: str = "DUT", + Dut_Radio: str = "Radio-1", + Uses1: str = "wiphy0", + Uses2: str = "AUTO", + Traffic: str = "http", + Freq: str = "-1", + VLAN: str = ""): + """Create and/or add configuration to specified Chamber View config. + + See the more generalized `pass_raw_lines_to_cv()` function for more information. + """ req_url = "/cli-json/add_text_blob" text_blob = "profile_link" + " " + Resources + " " + Profile + " " + Amount + " " + "\'DUT:" + " " + DUT \ @@ -534,8 +602,17 @@ def add_text_blob_line(self, self.json_post(req_url, data) def pass_raw_lines_to_cv(self, - scenario_name="Automation", - Rawline=""): + scenario_name: str = "Automation", + Rawline: str = ""): + """Create and/or add configuration to specified Chamber View Test or Scenario config. + + Each configurable in a Chamber View test corresponds to a key-value pair. + When saved to a config (text blob), each of these pairs is referred to as a 'rawline'. + + This function is generally utilized to set options for automated Chamber View tests + but can be used to configure Chamber View Scenarios. It is recommended to start with + a dedicated Chamber View test script if you're integrating this into your own automation. + """ req_url = "/cli-json/add_text_blob" data = { "type": "Network-Connectivity", @@ -544,41 +621,80 @@ def pass_raw_lines_to_cv(self, } self.json_post(req_url, data) - # This is for chamber view buttons + def apply_cv_scenario(self, cv_scenario: str): + """Stage specified Chamber View Scenario for configuration in testbed. + + Assumes Chamber View Scenario already exists. After applying the scenario, + one must build the scenario to make the configuration active on the system + (see `build_cv_scenario()`). + + While Chamber View tests may rely on existing Chamber View Scenarios, + they are unique and rely on separate configuration for use in LANforge. + """ + logger.info(f"Applying {cv_scenario} Chamber View Scenario") + self.run_cv_cmd(f"cv apply '{cv_scenario}'") - def apply_cv_scenario(self, cv_scenario): - cmd = "cv apply '%s'" % cv_scenario # To apply scenario - self.run_cv_cmd(cmd) - logger.info("Applying %s scenario" % cv_scenario) + def build_cv_scenario(self): + """Make staged Chamber View Scenario active in testbed. - def build_cv_scenario(self): # build chamber view scenario - cmd = "cv build" - self.run_cv_cmd(cmd) - logger.info("Building scenario") + Assumes scenario exists and is already staged (see `apply_cv_scenario()`). + Status of scenario can be queried with `get_cv_build_status()`. - def get_cv_build_status(self): # check if scenario is build - cmd = "cv is_built" - response = self.run_cv_cmd(cmd) + While Chamber View tests may rely on existing Chamber View Scenarios, + they are unique and rely on separate configuration for use in LANforge. + """ + logger.info("Building Chamber View Scenario") + self.run_cv_cmd("cv build") + + def get_cv_build_status(self): + """Query whether Chamber View Scenario is active (built) in testbed. + + While Chamber View tests may rely on existing Chamber View Scenarios, + they are unique and rely on separate configuration for use in LANforge. + """ + response = self.run_cv_cmd("cv is_built") return self.check_reponse(response) - def sync_cv(self): # sync - cmd = "cv sync" - logger.info(self.run_cv_cmd(cmd)) + def sync_cv(self): + """Request GUI update Chamber View with configuration active in system. - def run_cv_cmd(self, command): # Send chamber view commands - response_json = [] - req_url = "/gui-json/cmd" - data = {"cmd": command} - self.json_post(req_url, data, debug_=False, response_json_list_=response_json) - return response_json + This is generally not necessary if building a new scenario in automation. + + While Chamber View tests may rely on existing Chamber View Scenarios, + they are unique and rely on separate configuration for use in LANforge. + """ + logger.info("Syncing Chamber View") + self.run_cv_cmd("cv sync") + # ~~~ Chamber View command helpers ~~~ @staticmethod - def get_response_string(response): + def get_response_string(response: list): + """Extract response string from specified message.""" return response[0]["LAST"]["response"] + def run_cv_cmd(self, command: str): + """Send LANforge Chamber View command to GUI. + + Aside from special cases, this is generally not to be used directly. + """ + logger.debug(f"Running CV command: {command}") + + response_json = [] + self.json_post("/gui-json/cmd", + {"cmd": command}, + debug_=False, + response_json_list_=response_json) + + logger.debug(f"CV command response: {command}") + return response_json + def get_popup_info_and_close(self): - cmd = "cv get_and_close_dialog" - dialog = self.run_cv_cmd(cmd) - if dialog[0]["LAST"]["response"] != "NO-DIALOG": - logger.info("Popup Dialog:\n") - logger.info(dialog[0]["LAST"]["response"]) + """Grab info from and close any pop-up dialog box in Chamber View.""" + response = self.run_cv_cmd("cv get_and_close_dialog") + + # Always good to log the pop-up dialog string + response_str = self.get_response_string(response) + if response_str != "NO-DIALOG": + logger.info(f"Popup Dialog: {response_str}") + + return response diff --git a/py-json/l4_cxprofile.py b/py-json/l4_cxprofile.py index 40f104b2e..bf17f7909 100644 --- a/py-json/l4_cxprofile.py +++ b/py-json/l4_cxprofile.py @@ -40,14 +40,24 @@ def check_errors(self, debug=False): debug_info = {} if endp_list is not None and endp_list['endpoint'] is not None: endp_list = endp_list['endpoint'] - expected_passes = len(endp_list) - passes = len(endp_list) - for item in range(len(endp_list)): - for name, info in endp_list[item].items(): - for field in fields_list: - if info[field.replace("+", " ")] > 0: - passes -= 1 - debug_info[name] = {field: info[field.replace("+", " ")]} + if isinstance(endp_list, dict): + # if endp_list is a dict, then it is just a single endpoint, not a list + expected_passes = 1 + passes = 1 + info = endp_list + for field in fields_list: + if info[field.replace("+", " ")] > 0: + passes -= 1 + debug_info[info["name"]] = {field: info[field.replace("+", " ")]} + else: + expected_passes = len(endp_list) + passes = len(endp_list) + for item in range(len(endp_list)): + for name, info in endp_list[item].items(): + for field in fields_list: + if info[field.replace("+", " ")] > 0: + passes -= 1 + debug_info[name] = {field: info[field.replace("+", " ")]} if debug: logger.debug(debug_info) if passes == expected_passes: @@ -104,7 +114,7 @@ def get_bytes(self): if cx_name != 'uri' and cx_name != 'handler': # single CX if (type(cx_name) is str): - # single CX (str) + # single CX (str) # create a dictionary cx_name_dict = {cx_list['endpoint']['name'] : cx_list['endpoint']} for item, value in cx_name_dict.items(): @@ -112,8 +122,8 @@ def get_bytes(self): if item in self.created_cx.keys() and value_name == self.test_type: cx_map[item] = value_rx # break is needed for cx_name is not the cx_names - # {'_links': '/layer4/451', 'entity id': '1.1.12.451.11', 'name': 'sta0000_l4'} - # + # {'_links': '/layer4/451', 'entity id': '1.1.12.451.11', 'name': 'sta0000_l4'} + # break else: # multipe CX (dict) @@ -132,13 +142,21 @@ def check_request_rate(self): # raise NameError("check request rate: missing self.target_requests_per_ten") if endp_list is not None and endp_list['endpoint'] is not None: endp_list = endp_list['endpoint'] - for item in endp_list: - for name, info in item.items(): + if isinstance(endp_list, dict): + # if endp_list is a dict, then there is only a single endpoint, not a list of them + for name, item in endp_list.items(): if name in self.created_cx.keys(): expected_passes += 1 - if info['urls/s'] * self.requests_per_ten >= self.target_requests_per_ten * .9: - # logger.info(name, info['urls/s'], info['urls/s'] * self.requests_per_ten, self.target_requests_per_ten * .9) + if info['url/s'] * self.requests_per_ten >= self.target_requests_per_ten * .9: passes += 1 + else: + for item in endp_list: + for name, info in item.items(): + if name in self.created_cx.keys(): + expected_passes += 1 + if info['urls/s'] * self.requests_per_ten >= self.target_requests_per_ten * .9: + # logger.info(name, info['urls/s'], info['urls/s'] * self.requests_per_ten, self.target_requests_per_ten * .9) + passes += 1 return passes == expected_passes @@ -238,7 +256,7 @@ def monitor(self, if (monitor_interval is None) or (monitor_interval < 1): logger.critical("L4CXProfile::monitor wants monitor_interval >= 1 second") raise ValueError("L4CXProfile::monitor wants monitor_interval >= 1 second") - # verify that the file extension matches the output format + # verify that the file extension matches the output format if output_format is not None: if output_format.lower() != report_file.split('.')[-1]: logger.info('File extension %s does not match output format %s changing file extension to match output format' % (report_file, output_format)) @@ -247,7 +265,7 @@ def monitor(self, else: output_format = report_file.split('.')[-1] - # Step 1 - Assign column names + # Step 1 - Assign column names if col_names is not None and len(col_names) > 0: header_row = col_names @@ -333,7 +351,7 @@ def monitor(self, logger.debug(endpoint_data) endpoint_data["Timestamp"] = test_timestamp full_test_data_list.append(endpoint_data) - # break is needed , there is a single CX the json is formatted + # break is needed , there is a single CX the json is formatted break else: diff --git a/py-json/multicast_profile.py b/py-json/multicast_profile.py index 4267fb526..b4dd25f2a 100644 --- a/py-json/multicast_profile.py +++ b/py-json/multicast_profile.py @@ -247,7 +247,6 @@ def create_mc_rx(self, 'resource': side_rx_resource, 'port': side_rx_port, 'type': endp_type, - 'type': endp_type, 'ip_port': self.side_a_ip_port, 'is_rate_bursty': self.side_a_is_rate_bursty, 'min_rate': self.side_a_min_bps, diff --git a/py-json/test_group_profile.py b/py-json/test_group_profile.py index a79f54a79..ae01ee835 100644 --- a/py-json/test_group_profile.py +++ b/py-json/test_group_profile.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import importlib @@ -21,6 +20,7 @@ def __init__(self, lfclient_host, lfclient_port, local_realm, test_group_name=No def start_group(self): if self.group_name is not None: self.local_realm.json_post("/cli-json/start_group", {"name": self.group_name}) + self.local_realm.json_post("/cli-json/start_group", {"name": self.group_name}) else: raise ValueError("test_group name must be set.") @@ -56,10 +56,16 @@ def rm_cx(self, cx_name): def check_group_exists(self): test_groups = self.local_realm.json_get("/testgroups/all") + # This breaks on only one existing group, this expects an array not a single object if test_groups is not None and "groups" in test_groups: test_groups = test_groups["groups"] + if isinstance(test_groups, dict): + if test_groups['name'] == self.group_name: + return True + else: + return False for group in test_groups: - for k, v in group.items(): + for _, v in group.items(): if v['name'] == self.group_name: return True else: @@ -78,7 +84,7 @@ def list_groups(self): # if multiple test_group type ==list else: for group in test_groups["groups"]: - for k, v in group.items(): + for _, v in group.items(): tg_list.append(v['name']) return tg_list @@ -86,8 +92,12 @@ def list_cxs(self): test_groups = self.local_realm.json_get("/testgroups/all") if test_groups is not None: test_groups = test_groups["groups"] + # if single test_group is not empty + if not isinstance(test_groups, list): + if test_groups['name'] == self.group_name: + return test_groups['cross connects'] for group in test_groups: - for k, v in group.items(): + for _, v in group.items(): if v['name'] == self.group_name: return v['cross connects'] diff --git a/py-json/wifi_monitor_profile.py b/py-json/wifi_monitor_profile.py index ceea0cefb..a15667019 100644 --- a/py-json/wifi_monitor_profile.py +++ b/py-json/wifi_monitor_profile.py @@ -7,7 +7,7 @@ import importlib import time - + sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base") @@ -67,12 +67,16 @@ def __init__(self, lfclient_url, local_realm, up=True, debug_=False, resource_=1 self.aid = "NA" # used when sniffing /ax radios self.bssid = "00:00:00:00:00:00" # used when sniffing on /ax radios + # NOTE: Resource is parsed from the '_radio' argument which is an EID (e.g. '1.1.wiphy0' or '1.wiphy0') def create(self, resource_=1, channel=None, frequency=None, mode="AUTO", radio_="wiphy0", name_="moni0"): radio_eid = self.local_realm.name_to_eid(radio_) radio_shelf = radio_eid[0] self.resource = radio_eid[1] radio_ = radio_eid[2] - print("Creating monitor " + name_) + + if self.debug: + print("Creating monitor " + name_) + self.monitor_name = name_ computed_flags = 0 for flag_n in self.flag_names: @@ -132,7 +136,9 @@ def set_flag(self, param_name, value): self.flags_mask |= add_monitor.flags[param_name] def cleanup(self, desired_ports=None): - print("Cleaning up monitors") + if self.debug: + print("Cleaning up monitors") + if (desired_ports is None) or (len(desired_ports) < 1): if (self.monitor_name is None) or (self.monitor_name == ""): print("No monitor name set to delete") diff --git a/py-json/ws-sta-monitor.py b/py-json/ws-sta-monitor.py index ab4fb1c52..2194e6bf0 100755 --- a/py-json/ws-sta-monitor.py +++ b/py-json/ws-sta-monitor.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa """ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/py-scripts/DeviceConfig.py b/py-scripts/DeviceConfig.py index 5f0774f9d..3a9627fa6 100755 --- a/py-scripts/DeviceConfig.py +++ b/py-scripts/DeviceConfig.py @@ -172,7 +172,7 @@ async def forget_all_networks(self, port_list=[]): logger.info('Port list is empty') return - url = 'http://{}:{}/cli-json/clear_wifi_profiles'.format(self.lanforge_ip, self.port) + url = 'cli-json/clear_wifi_profiles' data_list = [] for port_data in port_list: @@ -1565,6 +1565,9 @@ def get_device_data(port_key, resource_key, port_data, resource_data): res_empty = False device_id = android["serial"] resource_id = "" + # If only one device is present in interop tab. + if not isinstance(adb_resources['devices'], list): + adb_resources['devices'] = [{adb_resources['devices']['name']: adb_resources['devices']}] for device in adb_resources['devices']: device_key = list(device.values())[0]["_links"] resource_id = list(device.values())[0]["resource-id"] diff --git a/py-scripts/README.md b/py-scripts/README.md index b2486ff36..9e5c48a40 100644 --- a/py-scripts/README.md +++ b/py-scripts/README.md @@ -2,125 +2,12 @@ This directory contains Python scripts to configure and test devices with LANforge traffic generation and network impairment systems. -For more information, see the following online documentation or email [`support@candelatech.com`](mailto:support@candelatech.com) with questions. +To learn more about automating Chamber View tests like TR-398, WiFi Capacity Test, and others, see [Chamber View Examples](./cv_examples/README.md) +for more information. -- [LANforge Scripting Cookbook](http://www.candelatech.com/scripting_cookbook.php) -- [Querying the LANforge JSON API using Python Cookbook](https://www.candelatech.com/cookbook/cli/json-python) +For more information, see [these documentation links](../README.md#documentation-links) or email [`support@candelatech.com`](mailto:support@candelatech.com) +with questions. ## Setup -**NOTE: LANforge Python scripts require Python 3.7+** (which is backwards compatible to Fedora 27 systems). - -There are two primary methods to access LANforge scripts (either for use or development): - -1. [LANforge system with the scripts pre-installed](#pre-installed-lanforge-system-usage) - -2. [Cloning or downloading the scripts from the Git repository](#cloning-from-git-repository-usage) (repository linked [here](https://github.com/greearb/lanforge-scripts)) - -### Pre-installed LANforge System Usage - -On pre-installed LANforge systems, LANforge scripts are installed in `/home/lanforge/scripts/py-scripts/`. No further setup is required (dependencies come pre-installed). These pre-installed scripts match the LANforge software version on the system. - -### Cloning from Git Repository Usage - -**NOTE:** This process is generally for more advanced users or developers. However, customers under support may email [`support@candelatech.com`](mailto:support@candelatech.com) with any questions, and we can guide you through. - -For users who clone or download these scripts from the Git repo, some setup is required. - -We assume you are familiar with the command line (e.g. `bash`) and already have both Python and Git installed (recall that Python 3.7 is the minimum supported version). - -Please complete the following two steps before running LANforge scripts on a non-LANforge system (outlined in this [section](#setup-instructions)): - -1. Ensure that the LANforge scripts version cloned matches your LANforge system version - - It is possible to run with the latest version, but this is not recommended -2. Install the required LANforge scripts dependencies - - We strongly suggest virtual environments (e.g. `virtualenv`) to avoid possible dependency issues. This is common practice when working with Python projects. - -#### Setup Instructions - -**NOTE:** Developers and anyone looking to contribute to LANforge scripts should also familiarize themselves with the information outlined in the [`CONBTRIBUTING.md` document](../CONTRIBUTING.md). - -1. Open a shell and clone LANforge scripts - - ```Bash - git clone https://github.com/greearb/lanforge-scripts - ``` - -2. Get the version-tagged commits of the repository - - ```Bash - git fetch --tags - ``` - -3. List the version-tagged commits available - - ```Bash - git tag - ``` - -4. Select the matching tag for your LANforge system's version - - ```Bash - # Checkout LANforge 5.4.7 version of LANforge scripts. - git checkout lf-5.4.7 - ``` - -5. Create and source a Python virtual environment (optional but **strongly suggested**) - - We suggest Python's [builtin virtual environment tool](https://docs.python.org/3/tutorial/venv.html) for simplicity, although other tools requiring more configuration like [Anaconda](https://anaconda.org/) will work as well. - - ```Bash - # Create Python virtual environment named 'venv' - virtualenv venv - - # Enter the Python virtual environment (Linux) - source venv/bin/activate - ``` - -6. Enter the `lanforge-scripts/py-scripts/` directory - -7. Run the dependency installation script - - ```Bash - ./update_dependencies.py - ``` - -Once you have successfully completed these steps, you can now use the LANforge Python scripts. - -## Using LANforge Python Scripts - -There are many scripts available within not just the LANforge Python scripts but the entire LANforge scripts repository. While we recognize and continue to address documenting these scripts, this section details some information that may be useful when using these scripts. - -To learn more about what a script does, most scripts support a `--help_summary` option which prints a short summary detailing what the script does. All scripts support a `--help` option which prints all arguments supported by a given script. - -To learn more about automating Chamber View tests like TR-398, WiFi Capacity Test, and others, see the [Chamber View Examples](./cv_examples/README.md) subdirectory for more information. - -### LANforge Python Scripts in py-scripts General Classifications - -- create\_ - creates network element in LANforge wiphy radio -- lf* or test* - performs a test against an Access Point or Wifi network -- other files are various utilities - -## LANforge Python Scripts Directory Structure - -- py-scripts - configuration, unit test, module, and library scripts -- cv_examples - bash scripts for ochastrating Chamberview tests -- py-json - core libraries providing direct intraction with LANforge Traffic Generator -- py-json/LANforge - JSON intraction with LANforge Traffic Generator. -- lanforge_client/ - alpha version of JSON interface to LANforge Traffic Generator. - -## Scripts accessing Serial ports. - -On Linux, you must explicitly allow users to access serial devices. Otherwise, using a USB serial device requires root permissions (e.g. have to use `sudo`). - -There are several methods to do so, each depending on the distribution (all requiring root access to the system). Often the easiest is to perform the following: - -1. Add your user to the `dialout` and `tty` groups - - ```Bash - sudo usermod -a -G dialout,tty $USER - ``` - -2. Log out and log back in (full logout required, not just closing the terminal) - - - Can also run the `newgrp` command, but this will only affect the currently running login session (i.e. that shell) +Setup instructions have been moved to [this document](../README.md#installing-from-source). diff --git a/py-scripts/attenuator_serial.py b/py-scripts/attenuator_serial.py index 4b2af5d64..73b85f756 100755 --- a/py-scripts/attenuator_serial.py +++ b/py-scripts/attenuator_serial.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ this file is used in tip for getting serial number of attenuators """ @@ -71,12 +70,12 @@ def main(): attenuator_serial.py: this file is used in tip for getting serial number of attenuators, ''') - help_summary='''\ + help_summary = '''\ attenuator_serial.py is used in tip for getting serial number of attenuators ''' parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - # used for showing help + # used for showing help args = parser.parse_args() if args.help_summary: diff --git a/py-scripts/bssid_to_dut.py b/py-scripts/bssid_to_dut.py index 3f99a0778..dea3cfc90 100755 --- a/py-scripts/bssid_to_dut.py +++ b/py-scripts/bssid_to_dut.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -# flake8: noqa import importlib import argparse import sta_scan_test import pandas as pd -import subprocess +# import subprocess import sys import os @@ -17,6 +16,7 @@ print("This script requires Python 3") exit(1) + def main(): parser = Realm.create_basic_argparse( prog='bssid_script.py', @@ -28,11 +28,11 @@ def main(): Creates a temporary station with specified ssid info (ssid, security, password) Then starts a scan, waits 15 seconds, and prints scan results to console. Takes 2 BSSIDs of ssids (given to temp station) and creates DUT (named what is given in dut_name argument). - + TODO: take scan results and calculate how many unique BSSIDs are there from the scan results, and add that many ssids to the DUT (remove hardcoded 2 ssids.) TODO: parse scan results for more than 1 SSID name (ssid-2G, ssid-5G). Add both ssids to the dut_name. - + Example: ./bssid_to_dut.py --ssid test_name --security open --radio wiphy0 --dut_name lanforge-AP ''') @@ -49,7 +49,7 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ bssid_to_dut.py creates a temporary station with specified ssid info (ssid, security, password) Then starts a scan, waits 15 seconds, and prints scan results to console. Takes 2 BSSIDs of ssids (given to temp station) and creates DUT (named what is given in dut_name argument). @@ -58,24 +58,23 @@ def main(): print(help_summary) exit(0) - station_list = args.sta_name print("about to create StaScan object...") sta_scan = sta_scan_test.StaScan(host=args.mgr, - port=args.mgr_port, - number_template="0000", - sta_list=station_list, - upstream=args.upstream_port, - ssid=args.ssid, - password=args.passwd, - radio=args.radio, - security=args.security, - use_ht160=False, - use_existing_station=args.use_existing_station, - scan_time=args.scan_time, - csv_output=args.csv_output, - mode=args.mode, - _debug_on=args.debug) + port=args.mgr_port, + number_template="0000", + sta_list=station_list, + upstream=args.upstream_port, + ssid=args.ssid, + password=args.passwd, + radio=args.radio, + security=args.security, + use_ht160=False, + use_existing_station=args.use_existing_station, + scan_time=args.scan_time, + csv_output=args.csv_output, + mode=args.mode, + _debug_on=args.debug) if (not args.use_existing_station): sta_scan.pre_cleanup() @@ -91,7 +90,7 @@ def main(): if (not args.use_existing_station): sta_scan.cleanup() - #do dataframe manipulation + # do dataframe manipulation if not isinstance(df, pd.DataFrame): print("Scan results are not in dataframe form.") else: @@ -101,18 +100,17 @@ def main(): for bss in ssid_df["bss"]: bssid_list.append(bss) - #run create_chamberview_dut script. (WIP) This section is a bit hardcoded at the moment, + # Do Not Delete , the hardcoded values are an example to create a chamberview DUT + # run create_chamberview_dut script. (WIP) This section is a bit hardcoded at the moment, # can be edited to create num ssid lines based on bssids in list, and then concat those lines to python command - ssid_line_1 = "ssid_idx=0 ssid=Dut-SSID security=WPA2 password=lanforge123 bssid=" + bssid_list[0] - ssid_line_2 = "ssid_idx=1 ssid=Dut-SSID-5G security=WPA2 password=lanforge123 bssid=" + bssid_list[1] - full_dut_command = "./create_chamberview_dut.py --lfmgr localhost -o 8080 --dut_name" + args.dut_name + "--dut_flag='DHCPD-LAN' --dut_flag='DHCPD-WAN' --ssid '" + ssid_line_1 + "' --ssid '" + ssid_line_2 + "'" - if (args.debug): - print(ssid_line_1) - print(ssid_line_2) - print(full_dut_command) - subprocess.run(full_dut_command, shell=True) + # ssid_line_1 = "ssid_idx=0 ssid=Dut-SSID security=WPA2 password=lanforge123 bssid=" + bssid_list[0] + # ssid_line_2 = "ssid_idx=1 ssid=Dut-SSID-5G security=WPA2 password=lanforge123 bssid=" + bssid_list[1] + # full_dut_command = "./create_chamberview_dut.py --lfmgr localhost -o 8080 --dut_name" + args.dut_name + "--dut_flag='DHCPD-LAN' --dut_flag='DHCPD-WAN' --ssid '" + ssid_line_1 + "' --ssid '" + ssid_line_2 + "'" # noqa: E501 + # if (args.debug): + # print(full_dut_command) + # subprocess.run(full_dut_command, shell=True) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/chamber_ctl.py b/py-scripts/chamber_ctl.py index ae7bfba70..70bad9035 100755 --- a/py-scripts/chamber_ctl.py +++ b/py-scripts/chamber_ctl.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: chamber_ctl.py @@ -29,7 +28,6 @@ if sys.version_info[0] != 3: print("This script requires Python3") exit() -import os import importlib import argparse import pprint diff --git a/py-scripts/create_bond.py b/py-scripts/create_bond.py index fbbcdbd9e..a250ccffd 100755 --- a/py-scripts/create_bond.py +++ b/py-scripts/create_bond.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: create_bond.py diff --git a/py-scripts/create_l3.py b/py-scripts/create_l3.py index cce1dbd4b..279520b0f 100755 --- a/py-scripts/create_l3.py +++ b/py-scripts/create_l3.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: create_l3.py @@ -185,11 +184,11 @@ def parse_args(): EXAMPLE: (If the specified endpoints are not present in the port manager,the cross-connects will be in a PHANTOM state.) - + # For layer-3 cx creation on LANforge: ./create_l3.py --mgr localhost --endp_a eth1 --endp_b eth2 --min_rate_a 56000 --min_rate_b 40000 --no_cleanup - + # For regression (script will create the layer-3 cx, check if it was successful, and then remove the layer-3 cx): ./create_l3.py --mgr localhost --endp_a 1.1.sta0000 --endp_b 1.2.sta0000 --min_rate_a 56000 --min_rate_b 40000 --no_cleanup @@ -198,15 +197,15 @@ def parse_args(): ./create_l3.py --mgr localhost --endp_a sta0000,sta0001 --endp_b eth2 --min_rate_a 56000 --min_rate_b 40000 --cx_type lf_udp --multi_conn_a 1 --multi_conn_b 1 --no_cleanup - + # With tos & pkts_to_send cross-connections - + ./create_l3.py --mgr localhost --endp_a sta00 --endp_b eth2 --min_ip_port_a 1000 --tos VI --pkts_to_send 10 --no_cleanup # For batch creation functionality: ./create_l3.py --mgr 192.168.200.93 --endp_a 1.1.eth1 --endp_b 1.1.wlan2 --min_rate_a 6200000 --min_rate_b 6200000 - --batch_quantity 10 --endp_a_increment 0 --endp_b_increment 1 --min_ip_port_a 1000 --min_ip_port_b 2000 + --batch_quantity 10 --endp_a_increment 0 --endp_b_increment 1 --min_ip_port_a 1000 --min_ip_port_b 2000 --ip_port_increment_a 1 --ip_port_increment_b 1 --multi_conn_a 1 --multi_conn_b 1 --no_cleanup SCRIPT_CLASSIFICATION: Creation @@ -320,10 +319,10 @@ def main(): args = parse_args() help_summary = '''\ - This script is made to set up/ crate a Layer-3 cross-connections. It allows running traffic from the upstream port - (eth1/eth2) to the station and vice versa. Additionally, it supports running traffic directly between stations. + This script is made to set up/ crate a Layer-3 cross-connections. It allows running traffic from the upstream port + (eth1/eth2) to the station and vice versa. Additionally, it supports running traffic directly between stations. The script also has a useful feature for batch modifying or batch creation functionality. - + The script will create CX only, will not run/start traffic and will not generate any report. ''' diff --git a/py-scripts/create_l3_stations.py b/py-scripts/create_l3_stations.py index 2c4bc825e..96303e7d8 100755 --- a/py-scripts/create_l3_stations.py +++ b/py-scripts/create_l3_stations.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: create_l3_stations.py @@ -289,9 +288,9 @@ def cleanup(self): def main(): help_summary = '''\ This script creates a variable number of stations with individual cross-connects and endpoints. - The stations are initially set to the UP state, but the cross-connections are kept in a stopped state. It also + The stations are initially set to the UP state, but the cross-connections are kept in a stopped state. It also supports batch creation functionality, making it convenient to generate multiple stations at once. - + The script will creates stations & CX only, will not run/start traffic and will not generate any report. ''' parser = LFCliBase.create_basic_argparse( @@ -486,5 +485,6 @@ def main(): else: ip_var_test.exit_fail() + if __name__ == "__main__": main() diff --git a/py-scripts/create_l4.py b/py-scripts/create_l4.py index 87cf0ad7d..9ad6e39e7 100755 --- a/py-scripts/create_l4.py +++ b/py-scripts/create_l4.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: create_l4.py @@ -252,8 +251,8 @@ def main(): shelf = rv[0] resource = rv[1] port_name = rv[2] - request_command = 'http://{lfmgr}:{lfport}/port/1/{resource}/{port_name}'.format( - lfmgr=args.mgr, lfport=args.mgr_port, resource=resource, port_name=port_name) + request_command = 'http://{lfmgr}:{lfport}/port/{shelf}/{resource}/{port_name}'.format( + lfmgr=args.mgr, lfport=args.mgr_port, shelf=shelf, resource=resource, port_name=port_name) logger.info("port request command: {request_command}".format(request_command=request_command)) request = requests.get(request_command, auth=(args.lf_user, args.lf_passwd)) logger.info("port request status_code {status}".format(status=request.status_code)) @@ -306,4 +305,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/create_station.py b/py-scripts/create_station.py index c443f2fec..c46631d10 100755 --- a/py-scripts/create_station.py +++ b/py-scripts/create_station.py @@ -824,6 +824,16 @@ def parse_args(): --security wpa2 \ --custom_wifi_cmd 'bgscan="simple:50:-65:300"' + # Create station with bw 320 need to also enable 160 + ./create_station.py\ + --mgr 192.168.102.197\ + --radio 1.1.wiphy11\ + --ssid TP-Link_CE22_6G\ + --passwd 79814096\ + --station_flags "be320-enable,ht160_enable"\ + --security wpa3\ + --num_stations 1 + SCRIPT_CLASSIFICATION: Creation diff --git a/py-scripts/create_vap.py b/py-scripts/create_vap.py index 021ec5633..d68903f10 100755 --- a/py-scripts/create_vap.py +++ b/py-scripts/create_vap.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: create_vap.py @@ -120,16 +119,16 @@ def build(self): logger.info("Creating VAPs") # TODO: Add cmd line arguments to control the various options of the VAP profile. if self.vap_profile.create(resource=self.resource, - radio=self.radio, - channel=self.channel, - up=True, - debug=self.debug, - use_ht40=True, - use_ht80=True, - use_ht160=False, - suppress_related_commands_=True, - use_radius=False, - hs20_enable=False): + radio=self.radio, + channel=self.channel, + up=True, + debug=self.debug, + use_ht40=True, + use_ht80=True, + use_ht160=False, + suppress_related_commands_=True, + use_radius=False, + hs20_enable=False): self._pass("PASS: VAP build finished") return True else: @@ -192,7 +191,7 @@ def main(): '--mac', help='Custom mac address', default="xx:xx:xx:xx:*:xx") - optional.add_argument('--mode', default='0') # 0 means auto # TODO: Add help for other available modes. + optional.add_argument('--mode', default='0') # 0 means auto # TODO: Add help for other available modes. optional.add_argument('--channel', default=36) optional.add_argument('--country_code', default=0) optional.add_argument('--resource', default=1) @@ -285,4 +284,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/create_vr.py b/py-scripts/create_vr.py index 47ce06f46..fd9700413 100755 --- a/py-scripts/create_vr.py +++ b/py-scripts/create_vr.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: create_vr.py @@ -77,6 +76,7 @@ # TODO - script under development + class CreateVR(Realm): def __init__(self, lfclient_host="localhost", @@ -191,8 +191,7 @@ def start(self): # resource=self.vr_name[1]) # test to make sure that vrcx is inside vr we expect self.vr_profile.vrcx_list(resource=self.vr_name[1], do_sync=True) - vr_list = self.vr_profile.router_list( - resource=self.vr_name[1], do_refresh=True) + # vr_list = self.vr_profile.router_list(resource=self.vr_name[1], do_refresh=True) router = self.vr_profile.find_cached_router( resource=self.vr_name[1], router_name=self.vr_name[2]) logger.info("cached router 120: {router}".format(router=router)) @@ -220,7 +219,7 @@ def main(): Through this script, services like DHCP, NAT can be provided to the vr. ''' # /home/lanforge-scripts/py-json/LANforge/lfcli_base.py - for bare args parser - # /home/lanforge-scripts/py-json/LANforge/lfcli_base.py - for bare args parser + # /home/lanforge-scripts/py-json/LANforge/lfcli_base.py - for bare args parser parser = LFCliBase.create_bare_argparse( prog=__file__, description="""\ @@ -240,7 +239,7 @@ def main(): kernel version: 5.19.17+ gui version: 5.4.6 -""".format(f=__file__)) +""") required = parser.add_argument_group('required arguments') required.add_argument('--vr_name', '--vr_names', required=False, help='EID of virtual router, like 1.2.vr0') diff --git a/py-scripts/csv_convert.py b/py-scripts/csv_convert.py index 9cdc7c220..1c5a9fd36 100755 --- a/py-scripts/csv_convert.py +++ b/py-scripts/csv_convert.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ This program is used to read in a LANforge Dataplane CSV file and output @@ -19,6 +18,8 @@ import sys import os import argparse +import traceback + if sys.version_info[0] != 3: print("This script requires Python 3") @@ -37,7 +38,7 @@ def __init__(self, csv_infile=None, csv_infile2=None, csv_outfile=None): i_data_rssi = -1 i_rx_mcs = -1 i_tx_mcs = -1 - rate_with_units = False + # rate_with_units = False fpo = open(csv_outfile, "w") fp = open(csv_infile) @@ -54,14 +55,14 @@ def __init__(self, csv_infile=None, csv_infile2=None, csv_outfile=None): if fp2: l2 = fp2.readline() if l2: - line = "%s,%s" %(line, l2) + line = "%s,%s" % (line, l2) # Read in initial line, this is the CSV headers. Parse it to find the column indices for # the columns we care about. x = line.split(",") cni = 0 for cn in x: - #print("cn: " + cn) + # print("cn: " + cn) # This works with the 'brief' csv output. if cn == "Attenuation [dB]": i_atten = cni @@ -80,7 +81,7 @@ def __init__(self, csv_infile=None, csv_infile2=None, csv_outfile=None): if cn == "Rotation": i_rotation = cni if cn == "Rx-Bps": - rate_with_units = True + # rate_with_units = True i_rxbps = cni # NOTE: Beacon RSSI does not exist in the 'full' csv if cn == "RSSI": @@ -89,11 +90,11 @@ def __init__(self, csv_infile=None, csv_infile2=None, csv_outfile=None): i_tx_mcs = cni if cn == "Rx-Rate": i_rx_mcs = cni - + cni += 1 # Write out out header for the new file. - fpo.write("Test Run,Position [Deg],Attenuation 1 [dB],Pal Stats Endpoint 1 Control Rssi [dBm],Pal Stats Endpoint 1 Data Rssi [dBm] Mean,Pal Stats Endpoint 1 RX rate [Mbps] Mode,Pal Stats Endpoint 1 TX rate [Mbps] Mode\n") + fpo.write("Test Run,Position [Deg],Attenuation 1 [dB],Pal Stats Endpoint 1 Control Rssi [dBm],Pal Stats Endpoint 1 Data Rssi [dBm] Mean,Pal Stats Endpoint 1 RX rate [Mbps] Mode,Pal Stats Endpoint 1 TX rate [Mbps] Mode\n") # noqa: E501 # Read rest of the input lines, processing one at a time. Covert the columns as # needed, and write out new data to the output file. @@ -103,7 +104,7 @@ def __init__(self, csv_infile=None, csv_infile2=None, csv_outfile=None): if fp2: l2 = fp2.readline() if l2: - line = "%s,%s" %(line, l2) + line = "%s,%s" % (line, l2) bottom_half = "Step Index,Position [Deg],Attenuation [dB],Traffic Pair 1 Throughput [Mbps]\n" @@ -129,7 +130,7 @@ def __init__(self, csv_infile=None, csv_infile2=None, csv_outfile=None): if fp2: l2 = fp2.readline() if l2: - line = "%s,%s" %(line, l2) + line = "%s,%s" % (line, l2) step_i += 1 @@ -144,14 +145,16 @@ def convert_to_mbps(self, val): try: units = tokens[1] if units == "Gbps": - rv = rv * 1000.0; + rv = rv * 1000.0 if units == "Kbps": rv = rv / 1000.0 return int(rv) - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) # Assume no units and that it is already mbps return int(rv) + def main(): parser = argparse.ArgumentParser( prog='csv_convert.py', @@ -161,7 +164,7 @@ def main(): ''', description=''' -csv_convert.py: +csv_convert.py: converts the candela brief csv and/or more complete csv into the data for specific customer. Both csv files need to be passed in order to have beacon rssi and phy rates since neither csv file contains all of that data. @@ -175,7 +178,7 @@ def main(): parser.add_argument('-o', '--outfile', help="output file in .csv format", default='outfile.csv') parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - help_summary='''\ + help_summary = '''\ csv_convert.py converts the candela brief csv and/or more complete csv into the data for specific customer. Both csv files need to be passed in order to have beacon rssi and phy rates since neither csv file contains all of that data. @@ -186,7 +189,6 @@ def main(): print(help_summary) exit(0) - if not args.infile or not args.infile2: print("error: the following arguments are required: -i/--infile, -I/--infile2") exit(1) diff --git a/py-scripts/csv_processor.py b/py-scripts/csv_processor.py index f3d6fbb38..315df85ca 100755 --- a/py-scripts/csv_processor.py +++ b/py-scripts/csv_processor.py @@ -1,24 +1,23 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import argparse import pandas as pd -#https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html -#https://queirozf.com/entries/pandas-dataframe-plot-examples-with-matplotlib-pyplot +# https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html +# https://queirozf.com/entries/pandas-dataframe-plot-examples-with-matplotlib-pyplot if sys.version_info[0] != 3: print("This script requires Python 3") exit(1) - + sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) -class L3CSVParcer(): - def __init__(self,csv_file): +class L3CSVParcer(): + def __init__(self, csv_file): # left this in for testing '''csv_obj = open(csv_file, 'r') @@ -29,21 +28,21 @@ def __init__(self,csv_file): if row[1] == 'rx': print(row)''' - include_summary = ['Time epoch','Time','Monitor','least','most','average'] + include_summary = ['Time epoch', 'Time', 'Monitor', 'least', 'most', 'average'] self.csv_file = csv_file - df_s = pd.read_csv(self.csv_file,header = 0, usecols = lambda column : any(substr in column for substr in include_summary)) + df_s = pd.read_csv(self.csv_file, header=0, usecols=lambda column: any(substr in column for substr in include_summary)) print('{}'.format(csv_file)) - csv_file_summary = self.csv_file.replace('results_','results_summary_') + csv_file_summary = self.csv_file.replace('results_', 'results_summary_') - df_s.to_csv(csv_file_summary, index = False, header=True) + df_s.to_csv(csv_file_summary, index=False, header=True) - include_raw = ['Time epoch','Time','Monitor','LT','MT'] + include_raw = ['Time epoch', 'Time', 'Monitor', 'LT', 'MT'] self.csv_file = csv_file - df_r = pd.read_csv(self.csv_file,header = 0, usecols = lambda column : any(substr in column for substr in include_raw)) + df_r = pd.read_csv(self.csv_file, header=0, usecols=lambda column: any(substr in column for substr in include_raw)) - csv_file_raw = self.csv_file.replace('results_','results_raw_') - df_r.to_csv(csv_file_raw, index = False, header=True) + csv_file_raw = self.csv_file.replace('results_', 'results_raw_') + df_r.to_csv(csv_file_raw, index=False, header=True) '''df_rx_delta = df_r.loc[df['Monitor'] == 'rx_delta'] @@ -123,26 +122,25 @@ def __init__(self,csv_file): def main(): - #debug_on = False + # debug_on = False parser = argparse.ArgumentParser( prog='csv_processor.py', formatter_class=argparse.RawTextHelpFormatter, epilog='''\ This script is an simple example on how to process data from a csv file. ''', - + description='''csv_processor.py: ''') - - parser.add_argument('-i','--infile', help="file of csv data", default='longevity_results_08_14_2020_14_37.csv') - parser.add_argument('--debug', help='--debug: Enable debugging',default=True) + parser.add_argument('-i', '--infile', help="file of csv data", default='longevity_results_08_14_2020_14_37.csv') + parser.add_argument('--debug', help='--debug: Enable debugging', default=True) parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') args = parser.parse_args() - help_summary='''\ + help_summary = '''\ This script is an simple example on how to process data from a csv file. This script is no longer supported. ''' @@ -150,7 +148,7 @@ def main(): print(help_summary) exit(0) - #debug_on = args.debug + # debug_on = args.debug if args.infile: csv_file_name = args.infile @@ -158,6 +156,5 @@ def main(): L3CSVParcer(csv_file_name) - if __name__ == "__main__": main() diff --git a/py-scripts/examples/README.md b/py-scripts/examples/README.md index e3e2dd232..e35eba560 100644 --- a/py-scripts/examples/README.md +++ b/py-scripts/examples/README.md @@ -1,5 +1,9 @@ # LANforge Python Script Examples -Reference Python scripts which exercise basic components of LANforge automation capabilities. +Reference Python scripts which exercise basic components of LANforge HTTP API automation capabilities. -Currently, these examples exercise only direct LANforge JSON API calls. We support this approach. However, other methods may be better suited for faster development. +Currently, these examples exercise direct HTTP API invocation. While we support this approach, +other methods with less boilerplate may be more suitable, for example the LANforge HTTP API Python +wrappers available [here](../../lanforge_client/). + +Please reach out to [`support@candelatech.com`](mailto:support@candelatech.com) should you have any questions. diff --git a/py-scripts/sta_connect_multi_example.py b/py-scripts/examples/sta_connect_multi_example.py similarity index 96% rename from py-scripts/sta_connect_multi_example.py rename to py-scripts/examples/sta_connect_multi_example.py index aa5fab490..56e8e3194 100755 --- a/py-scripts/sta_connect_multi_example.py +++ b/py-scripts/examples/sta_connect_multi_example.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa # Example of how to instantiate StaConnect and run the test import sys import os @@ -10,7 +9,7 @@ print("This script requires Python 3") exit(1) -sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) +sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../../"))) # if you lack __init__.py in this directory you will not find sta_connect module LFUtils = importlib.import_module("py-json.LANforge.LFUtils") @@ -33,16 +32,15 @@ def main(): ''') parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - args = parser.parse_args() # add this line if adding arguments + args = parser.parse_args() # add this line if adding arguments # parser.parse_args() - help_summary='''\ + help_summary = '''\ This script is an example of how to instantiate StaConnect and run the test. ''' if args.help_summary: print(help_summary) exit(0) - # create multiple OPEN stations station_names = LFUtils.port_name_series(start_id=0, end_id=1) diff --git a/py-scripts/stations_connected.py b/py-scripts/examples/stations_connected.py similarity index 96% rename from py-scripts/stations_connected.py rename to py-scripts/examples/stations_connected.py index 3a37eb23e..c406b26bc 100755 --- a/py-scripts/stations_connected.py +++ b/py-scripts/examples/stations_connected.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa # Contains examples of using realm to query stations and get specific information from them import sys import os @@ -10,7 +9,7 @@ print("This script requires Python 3") exit(1) -sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) +sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../../"))) lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base") LFCliBase = lfcli_base.LFCliBase @@ -37,7 +36,7 @@ def run(self): def num_associated(self, bssid): counter = 0 # print("there are %d results" % len(self.station_results)) - for eid, record in self.station_results.items(): + for _, record in self.station_results.items(): # print("-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ") # pprint(eid) # pprint(record) @@ -48,7 +47,7 @@ def num_associated(self, bssid): def main(): - help_summary='''\ + help_summary = '''\ This script will return the count of the number of stations connected to a specific bssid ''' parser = argparse.ArgumentParser( @@ -79,4 +78,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_add_profile.py b/py-scripts/lf_add_profile.py index d73c9a01c..69daa23eb 100755 --- a/py-scripts/lf_add_profile.py +++ b/py-scripts/lf_add_profile.py @@ -1,86 +1,76 @@ #!/usr/bin/env python3 -# flake8: noqa """ -NAME: lf_add_profile.py - -PURPOSE: Add a LANforge device profile. This can give a high level description of how the LANforge system should act. - The profile can then be selected in higher-level test cases to auto-generate lower level configuration. - -EXAMPLE: - -lf_add_profile.py , the --name refers to the profile name - - vscode sample: - "args":[ - "--mgr","192.168.0.104", - "--mgr_port","8080", - "--lf_user","lanforge", - "--lf_passwd","lanforge", - "--antenna","4", - "--instance_count","1", - // see http://www.candelatech.com/lfcli_ug.php#add_profile for the profile flags - //"--profile_flags","DHCP_SERVER,SKIP_DHCP_ROAM,NAT,ENABLE_POWERSAVE", - "--profile_flags","4105", - "--name","Routed-AP-QA13", - "--profile_type","routed_ap", - "--ssid","vap", - "--passwd","hello123", - "--dut","Routed-AP-13", - "--text","Making a Routed-AP-13", - "--log_level","debug", - "--debug"] - - Command line: - see http://www.candelatech.com/lfcli_ug.php#add_profile for the profile flags: - ./lf_add_profile.py --mgr 192.168.0.104 --mgr_port 8080 --lf_user lanforge --lf_passwd lanforge --antenna 4 - --instance_count 1 --profile_flags 4105 --name Routed-AP-QA13 --profile_type routed_ap - --ssid vap --passwd hello123 --dut Routed-AP-13 --text 'Making a Routed-AP-13 profile' - --log_level debug --debug - - Once the profile is created a chamberview scenario needs to be created based off that profile: - ./create_chamberview.py --lfmgr 192.168.0.104 --port 8080 --create_scenario QA13-2 - --raw_line 'profile_link 1.1 Routed-AP-QA13 1 NA NA wiphy1,AUTO -1 NA' --raw_line 'resource 1.1.0 0' - - The --raw_line are determined by applying the profile above - - -NOTES: - -Tested on 02/20/2023: - kernel version: 5.19.17+ - gui version: 5.4.6 - -TO DO NOTES: - +NAME: lf_add_profile.py + +PURPOSE: Create and configure a template LANforge device profile for use in + Chamber View Scenario automation. + +NOTES: The profile is not made active on the system until it is configured into + a Chamber View Scenario (e.g. via 'create_chamberview.py') and the + Chamber View Scenario is built. + + +EXAMPLE: # Add routed vAP with following configuration: + # - DHCP server + # - NAT enabled (when configured in virtual router) + # - Admin up on creation (active) + # - WPA2 security + # + # Note that the '--profile_flags' are specified in hexadecimal format + # See http://www.candelatech.com/lfcli_ug.php#add_profile for profile flags + ./lf_add_profile.py \ + --instance_count 1 \ + --profile_flags 4109 \ + --name "routed-AP-custom" \ + --profile_type routed_ap \ + --freq 2412 \ + --ssid LF-routed-AP \ + --passwd lanforge + + # Same example but using VSCode launch.json to specify CLI + # As this will likely be run from a secondary system, you'll + # need to add the "--mgr" argument and IP in that case + "args": [ + "instance_count", "1", + "profile_flags" "4109", + "name", "routed-AP-custom", + "profile_type", "routed_ap", + "freq", "2412", + "ssid", "LF-routed-AP", + "passwd", "lanforge", + ] + + # This configuration can be made active in a Chamber View Scenario as follows + # This example uses 'wiphy0' on LANforge resource 1 + ./create_chamberview.py \ + --create_scenario "LF-routed-AP-scenario" \ + --raw_line 'profile_link 1.1 LF-routed-AP 1 NA NA wiphy1,AUTO -1 NA' \ + --raw_line 'resource 1.1.0 0' + +LICENSE: Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc """ +import argparse +import importlib +import logging +import os import sys if sys.version_info[0] != 3: print("This script requires Python3") exit() -import importlib -import argparse -from pprint import pformat -import os -import logging - sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lanforge_api = importlib.import_module("lanforge_client.lanforge_api") LFUtils = importlib.import_module("py-json.LANforge.LFUtils") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand -from lanforge_client.lanforge_api import LFJsonQuery - +from lanforge_client.lanforge_api import LFSession # noqa: E402 +from lanforge_client.lanforge_api import LFJsonCommand # noqa: E402 +from lanforge_client.lanforge_api import LFJsonQuery # noqa: E402 lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") - logger = logging.getLogger(__name__) -# add_wanpath -# http://www.candelatech.com/lfcli_ug.php#add_wanpath - class lf_add_profile(): def __init__(self, @@ -123,7 +113,7 @@ def add_profile(self, _name: str = None, # Profile Name. [R] _passwd: str = None, # WiFi Password to be used (AP Mode), [BLANK] means no password. _profile_flags: str = None, # Flags for this profile, see above. - _profile_flags_list: list = [], # Flags for the profile passed as list + _profile_flags_list: list = None, # Flags for the profile passed as list _profile_type: str = None, # Profile type: See above. [W] _ssid: str = None, # WiFi SSID to be used, [BLANK] means any. _vid: str = None, # Vlan-ID (only valid for vlan profiles). @@ -131,6 +121,8 @@ def add_profile(self, _response_json_list: list = None, _errors_warnings: list = None, _suppress_related_commands: bool = False): + if not _profile_flags_list: + _profile_flags_list = [] flag_val = 0 if _profile_flags is not None: @@ -170,7 +162,6 @@ def add_profile(self, # This text will be added to the end of the notes field for Profiles. # The text must be entered one line at a time, primarily due to CLI parsing limitations. - # http://www.candelatech.com/lfcli_ug.php#add_profile_notes def add_profile_notes(self, _dut: str = None, # Profile Name. [R] @@ -188,51 +179,62 @@ def add_profile_notes(self, suppress_related_commands=_suppress_related_commands) -# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- # - -# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- # - - def main(): - help_summary='''\ - This script is helpful to create profiles on the lanforge device - ''' + help_summary = "This script is helpful to create profiles on the lanforge device" + parser = argparse.ArgumentParser( prog=__file__, formatter_class=argparse.RawTextHelpFormatter, - description='''\ - adds a chamberview profile - - add_profile Routed-AP-QA Routed-AP 0 4 1 0 vap hello123 4105 - - profile flags - 4105 = 0x1009 - - DHCP_SERVER = 0x1 # This should provide DHCP server. - WPA2 = 0x8 - ENABLE_POWERSAVE = 0x1000 # Enable power-save when creating stations. - - pass in --profile_flags 'DHCP_SERVER,WPA2,ENABLE_POWERSAVE' - - Example: - Command line: - see http://www.candelatech.com/lfcli_ug.php#add_profile for the profile flags: - ./lf_add_profile.py --mgr 192.168.0.104 --mgr_port 8080 --lf_user lanforge --lf_passwd lanforge --antenna 4\ - --instance_count 1 --profile_flags 4105 --name Routed-AP-QA13 --profile_type routed_ap\ - --ssid vap --passwd hello123 --dut Routed-AP-13 --text 'Making a Routed-AP-13 profile'\ - --log_level debug --debug - - Once the profile is created a chamberview scenario needs to be created based off that profile: - ./create_chamberview.py --lfmgr 192.168.0.104 --port 8080 --delete_scenario --create_scenario QA13-2\ - --raw_line 'profile_link 1.1 Routed-AP-QA13 1 NA NA wiphy1,AUTO -1 NA' --raw_line 'resource 1.1.0 0'\ - - The --raw_line are determined by applying the profile above - - NOTES: - Tested on 02/20/2023: - kernel version: 5.19.17+ - gui version: 5.4.6 - + description=r'''\ +NAME: lf_add_profile.py + +PURPOSE: Create and configure a template LANforge device profile for use in + Chamber View Scenario automation. + +NOTES: The profile is not made active on the system until it is configured into + a Chamber View Scenario (e.g. via 'create_chamberview.py') and the + Chamber View Scenario is built. + + +EXAMPLE: # Add routed vAP with following configuration: + # - DHCP server + # - NAT enabled (when configured in virtual router) + # - Admin up on creation (active) + # - WPA2 security + # + # Note that the '--profile_flags' are specified in hexadecimal format + # See http://www.candelatech.com/lfcli_ug.php#add_profile for profile flags + ./lf_add_profile.py \ + --instance_count 1 \ + --profile_flags 4109 \ + --name "routed-AP-custom" \ + --profile_type routed_ap \ + --freq 2412 \ + --ssid LF-routed-AP \ + --passwd lanforge + + # Same example but using VSCode launch.json to specify CLI + # As this will likely be run from a secondary system, you'll + # need to add the "--mgr" argument and IP in that case + "args": [ + "instance_count", "1", + "profile_flags" "4109", + "name", "routed-AP-custom", + "profile_type", "routed_ap", + "freq", "2412", + "ssid", "LF-routed-AP", + "passwd", "lanforge", + ] + + # This configuration can be made active in a Chamber View Scenario as follows + # This example uses 'wiphy0' on LANforge resource 1 + ./create_chamberview.py \ + --create_scenario "LF-routed-AP-scenario" \ + --raw_line 'profile_link 1.1 LF-routed-AP 1 NA NA wiphy1,AUTO -1 NA' \ + --raw_line 'resource 1.1.0 0' + +LICENSE: Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc ''') # http://www.candelatech.com/lfcli_ug.php#add_profile parser.add_argument("--host", "--mgr", dest='mgr', help='specify the GUI to connect to') @@ -246,7 +248,7 @@ def main(): parser.add_argument('--bandwidth', help="(add profile) 0 (auto), 20, 40, 80 or 160") parser.add_argument("--eap_id", help="(add profile) EAP Identifier") parser.add_argument("--flags_mask", help="(add profile) Specify what flags to set.") - parser.add_argument("--freq", help="(add profile)WiFi frequency to be used, 0 means default.") + parser.add_argument("--freq", help="(add profile)WiFi frequency to be used, -1 means AUTO.") parser.add_argument("--instance_count", help="(add profile) Number of devices (stations, vdevs, etc)") parser.add_argument("--mac_pattern", help="(add profile) Optional MAC-Address pattern, for instance: xx:xx:xx:*:*:xx") parser.add_argument("--name", help="(add profile) Profile Name. [R] ") @@ -350,23 +352,21 @@ def main(): parser.add_argument('--log_level', default=None, help='Set logging level: debug | info | warning | error | critical') parser.add_argument("--lf_logger_config_json", help="--lf_logger_config_json , json configuration of logger") parser.add_argument('--debug', help='Legacy debug flag', action='store_true') - parser.add_argument('--help_summary',help='shows summary of the script',action='store_true') + parser.add_argument('--help_summary', help='shows summary of the script', action='store_true') args = parser.parse_args() if args.help_summary: print(help_summary) exit(0) - # set up logger + # Configure logging logger_config = lf_logger_config.lf_logger_config() - # set the logger level to debug if args.log_level: logger_config.set_level(level=args.log_level) - # lf_logger_config_json will take presidence to changing debug levels + # Logger JSON config takes precedence over command line if args.lf_logger_config_json: - # logger_config.lf_logger_config_json = "lf_logger_config.json" logger_config.lf_logger_config_json = args.lf_logger_config_json logger_config.load_lf_logger_config() @@ -382,10 +382,8 @@ def main(): else: profile_flags_list = [] - # parameters for add_profile - # alias - # create side A - print("args.alias_prefix {}".format(args.alias_prefix)) + logger.info(f"Adding profile '{args.name}' to LANforge manager '{args.mgr}'") + logger.debug("args.alias_prefix {}".format(args.alias_prefix)) profile.add_profile( _alias_prefix=args.alias_prefix, # Port alias prefix, aka hostname prefix. _antenna=args.antenna, # Antenna count for this profile. @@ -409,7 +407,8 @@ def main(): for text in args.text: profile.add_profile_notes(_dut=args.name, _text=text) + logger.info(f"Added profile '{args.name}'") if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_atten_mod_test.py b/py-scripts/lf_atten_mod_test.py index 5bc92f296..d70aa7385 100755 --- a/py-scripts/lf_atten_mod_test.py +++ b/py-scripts/lf_atten_mod_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_atten_mod_test.py @@ -39,7 +38,6 @@ lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") - class CreateAttenuator(Realm): def __init__(self, host, port, serno, idx, val, _debug_on=False, @@ -69,7 +67,7 @@ def main(): description='''\ NAME: lf_atten_mod_test.py -PURPOSE: lf_atten_mod_test.py is used to modify and/or read the LANforge Attenuator settings. +PURPOSE: lf_atten_mod_test.py is used to modify and/or read the LANforge Attenuator settings. EXAMPLE: Set channel four (zero-indexed) of all attenuators on LANforge system \'192.168.200.12\' to attenuation value 220 ddB (22 dB). @@ -84,7 +82,7 @@ def main(): parser.add_argument('--atten_val', help='Requested attenuation in 1/10ths of dB (ddB).', default=0) args = parser.parse_args() - help_summary='''\ + help_summary = '''\ lf_atten_mod_test.py is used to modify and/or read the LANforge Attenuator settings. ''' if args.help_summary: diff --git a/py-scripts/lf_chamberview_tools.py b/py-scripts/lf_chamberview_tools.py index a4c2af473..41f5f0b7e 100755 --- a/py-scripts/lf_chamberview_tools.py +++ b/py-scripts/lf_chamberview_tools.py @@ -1,11 +1,10 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import importlib -import time -import json -from pprint import pprint +# import time +# import json +# from pprint import pprint import logging import argparse @@ -22,6 +21,7 @@ lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") logger = logging.getLogger(__name__) + class cv_test_tool(Realm): def __init__(self, lf_mgr="localhost", @@ -46,7 +46,6 @@ def get_is_running(self, instance): # pprint(val) return val[0]["LAST"]["response"] == 'StartStop::Stop' - def run_cv_cmd(self, command): # Send chamber view commands response_json = [] req_url = "/gui-json/cmd" @@ -63,7 +62,7 @@ def main(): Chamberview Tool to check if chamberview test is running ''') - parser.add_argument("--host", "--mgr", "--lf_mgr", dest='mgr', help='specify the GUI to connect to',default='localhost') + parser.add_argument("--host", "--mgr", "--lf_mgr", dest='mgr', help='specify the GUI to connect to', default='localhost') parser.add_argument("--mgr_port", help="specify the GUI to connect to, default 8080", default="8080") parser.add_argument("--lf_user", help="lanforge user name default: lanforge", default="lanforge") parser.add_argument("--lf_passwd", help="lanforge password default: lanforge", default="lanforge") @@ -74,7 +73,6 @@ def main(): parser.add_argument('--debug', help='Legacy debug flag', action='store_true') parser.add_argument('--help_summary', default=None, action="store_true", help='Show summary of what this script does') - args = parser.parse_args() help_summary = '''\ This script will check if chamberview test is running @@ -98,10 +96,10 @@ def main(): logger_config.load_lf_logger_config() cv_tool = cv_test_tool(lf_mgr=args.mgr, - lf_port=args.mgr_port, - lf_user=args.lf_user, - lf_passwd=args.lf_passwd, - debug=args.debug) + lf_port=args.mgr_port, + lf_user=args.lf_user, + lf_passwd=args.lf_passwd, + debug=args.debug) logger.debug("Instance {instance}".format(instance=args.instance)) @@ -109,5 +107,6 @@ def main(): logger.info("is test running {is_test_running}".format(is_test_running=is_test_running)) + if __name__ == "__main__": main() diff --git a/py-scripts/lf_create_vap_cv.py b/py-scripts/lf_create_vap_cv.py index b26dc970e..0fca515b7 100755 --- a/py-scripts/lf_create_vap_cv.py +++ b/py-scripts/lf_create_vap_cv.py @@ -154,9 +154,6 @@ LFCliBase = lfcli_base.LFCliBase LFRequest = importlib.import_module("py-json.LANforge.LFRequest") -ipvt = importlib.import_module("py-scripts.test_ip_variable_time") -IPVariableTime = ipvt.IPVariableTime - radio_modify = importlib.import_module("py-scripts.lf_modify_radio") logger = logging.getLogger(__name__) diff --git a/py-scripts/lf_csv.py b/py-scripts/lf_csv.py index 5f4ee656e..a9b9876b0 100755 --- a/py-scripts/lf_csv.py +++ b/py-scripts/lf_csv.py @@ -1,27 +1,21 @@ #!/usr/bin/env python3 -# flake8: noqa ''' -NAME: lf_csv.py +NAME: lf_csv.py -PURPOSE: -Common Library for generating csv for LANforge output -KPI - Key Performance Indicators +PURPOSE: Library code for generating CSV from LANforge output KPI data -SETUP: -/lanforge/html-reports directory needs to be present or output generated in local file +NOTES: Assumes '/home/lanforge/html-reports/' directory present -EXAMPLE: -see: /py-scripts/lf_report_test.py for example +EXAMPLE: See 'lf_report_test.py' for example usage -COPYRIGHT: - Copyright 2021 Candela Technologies Inc - License: Free to distribute and modify. LANforge systems must be licensed. +LICENSE: Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc -INCLUDE_IN_README +INCLUDE_IN_README: + False ''' import pandas as pd -from pandas import * from csv import reader import csv import argparse @@ -29,15 +23,20 @@ class lf_csv: def __init__(self, - _columns=['Stations', 'bk', 'be', 'vi', 'vo'], - _rows=[['sta0001', 'sta0002', 'sta0003', 'sta0004', 'sta0005'], - [1, 2, 3, 4, 5], - [11, 22, 33, 44, 55], - [6, 7, 8, 9, 10], - [66, 77, 88, 99, 100]], - _filename='test.csv'): - self.rows = _rows - self.columns = _columns + _columns: list = None, + _rows: list = None, + _filename: str = 'test.csv'): + DEFAULT_ROWS = [ + ['sta0001', 'sta0002', 'sta0003', 'sta0004', 'sta0005'], + [1, 2, 3, 4, 5], + [11, 22, 33, 44, 55], + [6, 7, 8, 9, 10], + [66, 77, 88, 99, 100], + ] + DEFAULT_COLUMNS = ['Stations', 'bk', 'be', 'vi', 'vo'] + + self.rows = _rows if _rows is not None else DEFAULT_ROWS + self.columns = _columns if _columns is not None else DEFAULT_COLUMNS self.filename = _filename def generate_csv(self): @@ -53,7 +52,7 @@ def generate_csv(self): csv_df.to_csv(self.filename, index=False, encoding='utf-8', na_rep='NA', float_format='%.2f') def read_csv(self, file_name, column=None): - data = read_csv(str(file_name)) + data = pd.read_csv(str(file_name)) value = data[str(column)].tolist() print("value of column", value) return value @@ -80,10 +79,10 @@ def open_csv_append(self, fields, name): def main(): help_summary = '''\ - This script is designed to generate the csv file with the test report data of lanforge tests, any file which runs - the tests can import this file to generate the csv file with the test report data. The file name is test.csv and - the file will the stored in the same directory of this file (pyscripts) while creating the object of this lf_csv - file, the data can be passed while creating the object and the report can be generated by calling the method + This script is designed to generate the csv file with the test report data of lanforge tests, any file which runs + the tests can import this file to generate the csv file with the test report data. The file name is test.csv and + the file will the stored in the same directory of this file (pyscripts) while creating the object of this lf_csv + file, the data can be passed while creating the object and the report can be generated by calling the method generate_csv() Note this is not the kpi csv format. Use lf_kpi_csv.py for the kpi csv format. ''' @@ -93,16 +92,20 @@ def main(): epilog='''\ The lf_csv is used to generate csv report of the lanforge test results ''', - description=''' -NAME: lf_csv.py + description=''' +NAME: lf_csv.py -PURPOSE: - The purpose of this test is to create a csv file for the lanforge output of a test - This file should should be imported by the file running the test and data can be passed while creating the object +PURPOSE: Library code for generating CSV from LANforge output KPI data -EXAMPLE: - # CLI To run the lf_csv to generate the csv file - python3 lf_csv.py +NOTES: Assumes '/home/lanforge/html-reports/' directory present + +EXAMPLE: See 'lf_report_test.py' for example usage + +LICENSE: Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc + +INCLUDE_IN_README: + False ''') parser.add_argument('--help_summary', help='Show summary of what this script does', default=None, action="store_true") diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index f37a4ed6a..191b2ad1d 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_ftp.py @@ -118,6 +117,7 @@ from typing import List, Optional import asyncio import csv +import traceback if sys.version_info[0] != 3: print("This script requires Python 3") @@ -147,7 +147,7 @@ def __init__(self, lfclient_host="localhost", lfclient_port=8080, sta_prefix="st profile_name=None, group_name=None, sixg_radio=None, fiveg_radio=None, upstream="eth1", _debug_on=False, _exit_on_error=False, _exit_on_fail=False, ap_name="", direction=None, duration=None, traffic_duration=None, ssh_port=None, kpi_csv=None, kpi_results=None, - lf_username="lanforge", lf_password="lanforge", clients_type="Virtual", dowebgui=False, device_list=[], test_name=None, result_dir=None, + lf_username="lanforge", lf_password="lanforge", clients_type="Virtual", dowebgui=False, device_list=None, test_name=None, result_dir=None, eap_method=None, eap_identity=None, ieee80211=None, @@ -167,9 +167,15 @@ def __init__(self, lfclient_host="localhost", lfclient_port=8080, sta_prefix="st pk_passwd=None, pac_file=None, expected_passfail_val=None, + get_live_view=False, + total_floors=0, config=False, csv_name=None): super().__init__(lfclient_host, lfclient_port, _debug=_debug_on, _exit_on_fail=_exit_on_fail) + + if not device_list: + device_list = [] + logger.info("Test is about to start") self.ssid_list = [] self.host = lfclient_host @@ -227,11 +233,14 @@ def __init__(self, lfclient_host="localhost", lfclient_port=8080, sta_prefix="st self.mac_id_list = [] self.real_client_list1 = [] self.uc_avg = [] + self.failed_cx = [] + self.tracking_map = {} self.uc_min = [] self.uc_max = [] self.url_data = [] self.bytes_rd = [] self.rx_rate = [] + self.total_err = [] self.channel_list = [] self.mode_list = [] self.cx_list = [] @@ -264,6 +273,8 @@ def __init__(self, lfclient_host="localhost", lfclient_port=8080, sta_prefix="st self.pass_fail_list = [] self.test_input_list = [] self.api_url = 'http://{}:{}'.format(self.host, self.port) + self.get_live_view = get_live_view + self.total_floors = total_floors logger.info("Test is Initialized") @@ -335,7 +346,7 @@ def query_realclients(self): for key, value in response.items(): if key == "resources": for element in value: - for a, b in element.items(): + for _, b in element.items(): self.hw_list.append(b['hw version']) for hw_version in self.hw_list: if "Win" in hw_version: @@ -352,7 +363,7 @@ def query_realclients(self): for key, value in response.items(): if key == "resources": for element in value: - for a, b in element.items(): + for _, b in element.items(): if b['phantom'] is False: self.working_resources_list.append(b["hw version"]) if "Win" in b['hw version']: @@ -523,7 +534,7 @@ def change_port_to_ip(self, upstream_port): try: target_port_ip = self.json_get(f'/port/{shelf}/{resource}/{port}?fields=ip')['interface']['ip'] upstream_port = target_port_ip - except BaseException: + except BaseException: # noqa: B036 logging.warning(f'The upstream port is not an ethernet port. Proceeding with the given upstream_port {upstream_port}.') logging.info(f"Upstream port IP {upstream_port}") else: @@ -695,7 +706,6 @@ def build(self): # if Both band then another 20 stations will connects to 2.4G self.station_profile.mode = 6 - logger.info("Test Build done") if self.clients_type == "Real": if self.direction == "Download": @@ -777,7 +787,7 @@ def api_get(self, endp: str): return response, data def start(self, print_pass=False, print_fail=False): - for rad in self.radio: + for _ in self.radio: self.cx_profile.start_cx() logger.info("Test Started") @@ -888,6 +898,50 @@ def convert_file_size_in_Bytes(self, size): # assume data is MB if no designator is on end of str else: return float(upper[:-2]) * 10 ** 6 + + def get_all_l4_data(self): + """ + Fetches the complete set of Layer-4 data and writes it to a dictionary + Returns: + dict: A dictionary mapping each Layer 4 field to a list of values in the order of CXs. + """ + + fields = [ + "name", "eid", "type", "status", "total-urls", "urls/s", "bytes-rd", "bytes-wr", + "total-buffers", "total-rebuffers", "total-wait-time", "video-format-bitrate", + "audio-format-bitrate", "frame-rate", "video-quality", "tx rate", "tx-rate-1m", + "rx rate", "rx rate (1m)", "fb-min", "fb-avg", "fb-max", "uc-min", "uc-avg", + "uc-max", "dns-min", "dns-avg", "dns-max", "total-err", "bad-proto", "bad-url", + "rslv-p", "rslv-h", "!conn", "timeout", "nf (4xx)", "http-r", "http-p", "http-t", + "acc. denied", "ftp-host", "ftp-stor", "ftp-port", "write", "read", "redir", + "login-denied", "other-err", "elapsed", "rpt timer", "time-stamp" + ] + + data = self.json_get(f"layer4/list?fields={','.join(fields)}") + + result = {field: [] for field in fields} + + endpoint = data.get("endpoint", {}) + + if isinstance(endpoint, dict): + for field in fields: + result[field].append(endpoint.get(field, None)) + else: + for created_cx in self.cx_list: + for cx in endpoint: + if created_cx in cx: + for field in fields: + result[field].append(cx[created_cx].get(field, None)) + break + + if "bytes-rd" in result: + result["bytes-rd"] = [ + float(f"{int(x) / 1_000_000:.4f}") if x is not None else None + for x in result["bytes-rd"] + ] + + return result + # FOR WEB-UI // function usd to fetch runtime values and fill the csv. def monitor_for_runtime_csv(self): @@ -905,9 +959,13 @@ def monitor_for_runtime_csv(self): max_bytes_rd = [] rx_rate_val = [] individual_device_data = {} + client_id_list = [] for port in self.input_devices_list: columns = ['TIMESTAMP', 'Bytes-rd', 'total urls', 'download_rate', 'rx_rate', 'tx_rate', 'RSSI'] individual_device_data[port] = pd.DataFrame(columns=columns) + r_id = port.split('.') + client_id_list.append('.'.join(r_id[:2])) + while (current_time < endtime): # data in json format @@ -927,11 +985,19 @@ def monitor_for_runtime_csv(self): self.data['UC-MIN'] = self.uc_min self.data['UC-AVG'] = self.uc_avg self.data['UC-MAX'] = self.uc_max + self.data['client_id'] = client_id_list + self.data['total_err'] = self.total_err rx_rate_val.append(list(self.rx_rate)) for i, port in enumerate(self.input_devices_list): - row_data = [current_time, self.bytes_rd[i], self.url_data[i], self.rx_rate[i], self.port_rx_rate[i], self.tx_rate[i], self.rssi_list[i]] - individual_device_data[port].loc[len(individual_device_data[port])] = row_data + try: + row_data = [current_time, self.bytes_rd[i], self.url_data[i], self.rx_rate[i], self.port_rx_rate[i], self.tx_rate[i], self.rssi_list[i]] + individual_device_data[port].loc[len(individual_device_data[port])] = row_data + except Exception: + # Fail-safe: if any list index/key mismatch occurs while adding row_data, + # stop execution to avoid inconsistent results. + traceback.print_exc() + exit(1) # calculating average for rx_rate for j in range(len(rx_rate_val[0])): rx_rate_sum = 0 @@ -983,7 +1049,14 @@ def monitor_for_runtime_csv(self): self.data["remaining_time"] = [[str(int(total_hours)) + " hr and " + str( int(remaining_minutes)) + " min" if int(total_hours) != 0 or int( remaining_minutes) != 0 else '<1 min'][0]] * len(self.cx_list) - df1 = pd.DataFrame(self.data) + try: + df1 = pd.DataFrame(self.data) + except Exception: + # Print the problematic data and error before exiting + logger.info("Failed to create DataFrame from self.data") + logger.info("self.data: %s", self.data) + traceback.print_exc() + exit(1) if self.dowebgui: df1.to_csv('{}/ftp_datavalues.csv'.format(self.result_dir), index=False) if self.clients_type == 'Real': @@ -1010,100 +1083,89 @@ def monitor_for_runtime_csv(self): df.to_csv(f"{endtime}-ftp-{port}.csv", index=False) individual_device_csv_names.append(f'{endtime}-ftp-{port}') self.individual_device_csv_names = individual_device_csv_names + try: + all_l4_data = self.get_all_l4_data() + df = pd.DataFrame(all_l4_data) + df.to_csv("all_l4_data.csv", index=False) + except Exception: + logger.error("All l4 data not found") - # Created a function to get uc-avg,uc,min,uc-max,ssid and all other details of the devices + def get_layer4_data(self): + """ + Fetch Layer 4 stats (uc-avg, uc-min, uc-max, urls, rx rate, bytes read, errors) + for all connections in self.cx_list. + + Returns: + dict: mapping of metric names to lists of values, one per CX. + """ + try: + url_str = 'layer4/{}/list?fields=uc-avg,uc-max,uc-min,total-urls,rx rate (1m),bytes-rd,total-err'.format(','.join(self.cx_list)) + l4_data = self.local_realm.json_get(url_str)['endpoint'] + except Exception: + logger.error("NO L4 endpoint found") + exit(1) + l4_dict = { + 'uc_avg_data': [], + 'uc_max_data': [], + 'uc_min_data': [], + 'url_times': [], + 'rx_rate': [], + 'bytes_rd': [], + 'total_err': [] + } + cx_list = self.cx_list + idx = 0 + if not isinstance(l4_data, list): + l4_data = [{l4_data['name']: l4_data}] + for cx in cx_list: + cx_found = False + for i in l4_data: + for cx_name, value in i.items(): + if cx == cx_name: + l4_dict['uc_avg_data'].append(value['uc-avg']) + l4_dict['uc_max_data'].append(value['uc-max']) + l4_dict['uc_min_data'].append(value['uc-min']) + l4_dict['url_times'].append(value['total-urls']) + l4_dict['rx_rate'].append(value['rx rate (1m)']) + l4_dict['bytes_rd'].append(value['bytes-rd']) + l4_dict['total_err'].append(value['total-err']) + cx_found = True + if not cx_found: + logger.info("apending default for http %s", cx) + self.failed_cx.append(cx) + l4_dict['uc_avg_data'].append(0 if not self.tracking_map else self.tracking_map['uc_avg_data'][idx]) + l4_dict['uc_max_data'].append(0 if not self.tracking_map else self.tracking_map['uc_max_data'][idx]) + l4_dict['uc_min_data'].append(0 if not self.tracking_map else self.tracking_map['uc_min_data'][idx]) + l4_dict['url_times'].append(0 if not self.tracking_map else self.tracking_map['url_times'][idx]) + l4_dict['rx_rate'].append(0 if not self.tracking_map else self.tracking_map['rx_rate'][idx]) + l4_dict['bytes_rd'].append(0 if not self.tracking_map else self.tracking_map['bytes_rd'][idx]) + l4_dict['total_err'].append(0 if not self.tracking_map else self.tracking_map['total_err'][idx]) + idx += 1 + self.tracking_map = l4_dict.copy() + + return l4_dict def get_device_details(self): dataset = [] self.channel_list, self.mode_list, self.ssid_list, self.uc_avg, self.uc_max, self.url_data, self.uc_min, self.bytes_rd, self.rx_rate = [], [], [], [], [], [], [], [], [] + self.total_err = [] if self.clients_type == "Real": self.get_port_data() # data in json format # data = self.json_get("layer4/list?fields=bytes-rd") - uc_avg_data = self.json_get("layer4/list?fields=uc-avg") - uc_max_data = self.json_get("layer4/list?fields=uc-max") - uc_min_data = self.json_get("layer4/list?fields=uc-min") - total_url_data = self.json_get("layer4/list?fields=total-urls") - bytes_rd = self.json_get("layer4/list?fields=bytes-rd") - rx_rate = self.json_get("layer4/list?fields=rx rate (1m)") - if 'endpoint' in uc_avg_data.keys(): - # list of layer 4 connections name - if type(uc_avg_data['endpoint']) is dict: - self.uc_avg.append(uc_avg_data['endpoint']['uc-avg']) - self.uc_max.append(uc_max_data['endpoint']['uc-max']) - self.uc_min.append(uc_min_data['endpoint']['uc-min']) - self.rx_rate.append(rx_rate['endpoint']['rx rate (1m)']) - # reading uc-avg data in json format - self.url_data.append(total_url_data['endpoint']['total-urls']) - dataset.append(bytes_rd['endpoint']['bytes-rd']) - self.bytes_rd = [float(f"{(int(i) / 1000000): .4f}") for i in dataset] - else: - for created_cx in self.cx_list: - for cx in uc_avg_data['endpoint']: - if created_cx in cx: - self.uc_avg.append(cx[created_cx]['uc-avg']) - break - - for cx in uc_max_data['endpoint']: - if created_cx in cx: - self.uc_max.append(cx[created_cx]['uc-max']) - break - - for cx in uc_min_data['endpoint']: - if created_cx in cx: - self.uc_min.append(cx[created_cx]['uc-min']) - break - - for cx in total_url_data['endpoint']: - if created_cx in cx: - self.url_data.append(cx[created_cx]['total-urls']) - break - - for cx in bytes_rd['endpoint']: - if created_cx in cx: - dataset.append(cx[created_cx]['bytes-rd']) - break - - for cx in rx_rate['endpoint']: - if created_cx in cx: - self.rx_rate.append(cx[created_cx]['rx rate (1m)']) - break - self.bytes_rd = [float(f"{(i / 1000000): .4f}") for i in dataset] - # for cx in uc_avg_data['endpoint']: - # for CX in cx: - # for created_cx in self.cx_list: - # if CX == created_cx: - # self.uc_avg.append(cx[CX]['uc-avg']) - # for cx in uc_max_data['endpoint']: - # for CX in cx: - # for created_cx in self.cx_list: - # if CX == created_cx: - # self.uc_max.append(cx[CX]['uc-max']) - # for cx in uc_min_data['endpoint']: - # for CX in cx: - # for created_cx in self.cx_list: - # if CX == created_cx: - # self.uc_min.append(cx[CX]['uc-min']) - # for cx in total_url_data['endpoint']: - # for CX in cx: - # for created_cx in self.cx_list: - # if CX == created_cx: - # self.url_data.append(cx[CX]['total-urls']) - # for cx in bytes_rd['endpoint']: - # for CX in cx: - # for created_cx in self.cx_list: - # if CX == created_cx: - # dataset.append(cx[CX]['bytes-rd']) - # self.bytes_rd=[float(f"{(i / 1000000): .4f}") for i in dataset] - # for cx in rx_rate['endpoint']: - # for CX in cx: - # for created_cx in self.cx_list: - # if CX == created_cx: - # self.rx_rate.append(cx[CX]['rx rate']) - else: - total_data = self.json_get("layer4/all") - logger.info("No endpoint found") - logger.info(total_data) + l4_data = self.get_layer4_data() + self.uc_avg = l4_data["uc_avg_data"] + self.uc_max = l4_data["uc_max_data"] + self.uc_min = l4_data["uc_min_data"] + self.rx_rate = l4_data["rx_rate"] + self.total_err = l4_data["total_err"] + self.url_data = l4_data["url_times"] + dataset = l4_data["bytes_rd"] + self.bytes_rd = [float(f"{(i / 1000000): .4f}") for i in dataset] + urls_downloaded = [] + for i in range(len(self.total_err)): + urls_downloaded.append(self.url_data[i] - self.total_err[i]) + self.url_data = list(urls_downloaded) def get_port_data(self): """ @@ -1275,8 +1337,14 @@ def my_monitor_for_real_devices(self): self.mode_list.append(str(port_data['mode'])) self.ssid_list.append(str(port_data['ssid'])) if self.dowebgui: + client_id_list = [] + for port in self.input_devices_list: + r_id = port.split('.') + client_id_list.append('.'.join(r_id[:2])) self.data_for_webui = { "client": self.cx_list, + "client_id": client_id_list, + "Rx Rate(1m)": self.rx_rate, "url_data": self.url_data, "bytes rd": self.bytes_rd, "uc_min": self.uc_min, @@ -1284,7 +1352,8 @@ def my_monitor_for_real_devices(self): "uc_avg": self.uc_avg, "start_time": self.data["start_time"], "end_time": self.data["end_time"], - "remaining_time": [0] * len(self.cx_list) + "remaining_time": [0] * len(self.cx_list), + "total_err": self.total_err } logger.info("Monitoring complete") @@ -1700,6 +1769,32 @@ def generate_graph(self, result_data): self.generate_graph_time(result_data, x_axis, b, size) # self.generate_graph_throughput(result_data, x_axis, b, size) + def add_live_view_images_to_report(self): + """ + This function looks for throughput and RSSI images for each floor + in the 'live_view_images' folder within `self.result_dir`. + It waits up to **60 seconds** for each image. If an image is found, + it's added to the `report` on a new page; otherwise, it's skipped. + """ + for floor in range(0, int(self.total_floors)): + ftp_img_path = os.path.join(self.result_dir, "live_view_images", f"ftp_{self.test_name}_{floor + 1}.png") + timeout = 60 # seconds + start_time = time.time() + + while not (os.path.exists(ftp_img_path)): + if time.time() - start_time > timeout: + print("Timeout: Images not found within 60 seconds.") + break + time.sleep(1) + while not os.path.exists(ftp_img_path): + if os.path.exists(ftp_img_path): + break + if os.path.exists(ftp_img_path): + self.report.set_custom_html('
') + self.report.build_custom() + self.report.set_custom_html(f'') + self.report.build_custom() + def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, dut_hw_version, dut_sw_version, dut_model_num, dut_serial_num, test_id, bands, csv_outfile, local_lf_report_dir, _results_dir_name='ftp_test', report_path='', config_devices=""): @@ -1767,6 +1862,10 @@ def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, report_path_date_time = self.report.get_path_date_time() if self.clients_type == "Real": shutil.move('ftp_datavalues.csv', report_path_date_time) + try: + shutil.move('all_l4_data.csv', report_path_date_time) + except Exception: + logger.error("failed to create all layer 4 csv") for csv_name in self.individual_device_csv_names: shutil.move(f"{csv_name}.csv", report_path_date_time) self.report.set_title("FTP Test") @@ -1789,6 +1888,7 @@ def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, "Security": self.security, "Device List": ", ".join(all_devices_names), "No of Devices": "Total" + f"({no_of_stations})" + total_devices, + "Failed CXs": self.failed_cx if self.failed_cx else "NONE", "File size": self.file_size, "File location": "/home/lanforge", "Traffic Direction": self.direction, @@ -1861,7 +1961,7 @@ def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, _color_name=['orange'], _show_bar_value=True, _enable_csv=True, - _graph_image_name="Total-url", _color_edge=['black'], + _graph_image_name="Total-url_ftp", _color_edge=['black'], _color=['orange'], _label=[self.direction]) graph_png = graph.build_bar_graph_horizontal() @@ -1894,7 +1994,7 @@ def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, _color_name=['steelblue'], _show_bar_value=True, _enable_csv=True, - _graph_image_name="ucg-avg", _color_edge=['black'], + _graph_image_name="ucg-avg_ftp", _color_edge=['black'], _color=['steelblue'], _label=[self.direction]) graph_png = graph.build_bar_graph_horizontal() @@ -1905,6 +2005,8 @@ def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, self.report.set_csv_filename(graph_png) self.report.move_csv_file() self.report.build_graph() + if (self.dowebgui and self.get_live_view): + self.add_live_view_images_to_report() self.report.set_obj_html("File Download Time (sec)", "The below table will provide information of " "minimum, maximum and the average time taken by clients to download a file in seconds") self.report.build_objective() @@ -1949,7 +2051,8 @@ def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, " No of times File downloaded ": self.url_data, " Time Taken to Download file (ms)": self.uc_avg, " Bytes-rd (Mega Bytes)": self.bytes_rd, - " RX RATE (Mbps) ": self.rx_rate + " RX RATE (Mbps) ": self.rx_rate, + "Failed Urls": self.total_err } if self.expected_passfail_val or self.csv_name: dataframe[" Expected output "] = self.test_input_list @@ -2311,6 +2414,67 @@ def generate_dataframe(self, groupdevlist: List[str], clients_list: List[str], m else: return None + def monitor_cx(self): + """ + This function waits for upto 20 iterations to allow all CXs (connections) to be created. + + If some CXs are still not created after 20 iterations, then the CXs related to that device are removed, + along with their associated client and MAC entries from all relevant lists. + """ + max_retry = 20 + current_retry = 0 + failed_cx = [] + flag = 0 + idx_list = [] + del_device_list = [] + del_mac_list = [] + del_input_devices_list = [] + del_device_list1 = [] + del_real_client_list = [] + while current_retry < max_retry: + failed_cx.clear() + idx_list.clear() + del_device_list.clear() + del_mac_list.clear() + del_input_devices_list.clear() + del_device_list1.clear() + del_real_client_list.clear() + created_cx_list = list(self.cx_list) + for i, created_cxs in enumerate(created_cx_list): + try: + _ = self.local_realm.json_get("layer4/%s/list?fields=%s" % + (created_cxs, 'status'))['endpoint']['status'] + except BaseException: # noqa: B036 + logger.error(f'cx not created for {self.input_devices_list[i]}') + failed_cx.append(created_cxs) + del_device_list.append(self.device_list[i]) + del_mac_list.append(self.mac_id_list[i]) + del_input_devices_list.append(self.input_devices_list[i]) + del_device_list1.append(self.real_client_list1[i]) + del_real_client_list.append(self.real_client_list[i]) + if len(failed_cx) == 0: + flag = 1 + break + logger.info(f'Try {current_retry} out of 20: Waiting for the cross-connections to be created.') + time.sleep(2) + current_retry += 1 + + if flag: + logger.info('cross connections found for all devices') + return + for cx in failed_cx: + self.cx_list.remove(cx) + for i in range(len(del_input_devices_list)): + logger.info(f'Cross connection not created for {self.input_devices_list[i]}') + self.input_devices_list.remove(del_input_devices_list[i]) + self.mac_id_list.remove(del_mac_list[i]) + self.device_list.remove(del_device_list[i]) + self.real_client_list1.remove(del_device_list1[i]) + self.real_client_list.remove(del_real_client_list[i]) + if len(self.input_devices_list) == 0: + logger.error('No cross connections created, aborting test') + exit(1) + def validate_args(args): """Validate CLI arguments.""" @@ -2578,6 +2742,8 @@ def main(): optional.add_argument("--pk_passwd", type=str, default='NA', help='Specify the password for the private key') optional.add_argument("--pac_file", type=str, default='NA', help='Specify the pac file name') + optional.add_argument('--get_live_view', help="If true will heatmap will be generated from testhouse automation WebGui ", action='store_true') + optional.add_argument('--total_floors', help="Total floors from testhouse automation WebGui ", default="0") # logging configuration optional.add_argument( "--lf_logger_config_json", @@ -2604,7 +2770,7 @@ def main(): logger_config.load_lf_logger_config() # 1st time stamp for test duration - time_stamp1 = datetime.now() + # time_stamp1 = datetime.now() # use for creating ftp_test dictionary interation_num = 0 @@ -2706,7 +2872,9 @@ def pass_fail_duration(band, file_size): expected_passfail_val=args.expected_passfail_value, csv_name=args.device_csv_name, wait_time=args.wait_time, - config=args.config + config=args.config, + get_live_view=args.get_live_view, + total_floors=args.total_floors ) interation_num = interation_num + 1 @@ -2743,6 +2911,9 @@ def pass_fail_duration(band, file_size): logger.info(obj.get_fail_message()) exit(1) + if obj.clients_type == 'Real': + obj.monitor_cx() + logger.info(f'Test started on the devices : {obj.input_devices_list}') # First time stamp time1 = datetime.now() logger.info("Traffic started running at %s", time1) @@ -2773,7 +2944,7 @@ def pass_fail_duration(band, file_size): logger.info("Test ended at %s", time2) # 2nd time stamp for test duration - time_stamp2 = datetime.now() + # time_stamp2 = datetime.now() # total time for test duration # test_duration = str(time_stamp2 - time_stamp1)[:-7] @@ -2793,6 +2964,12 @@ def pass_fail_duration(band, file_size): "Security": args.security, "Contact": "support@candelatech.com" } + # FOR WEB-UI // to fetch the last logs of the execution. + if args.dowebgui: + obj.data_for_webui["status"] = ["STOPPED"] * len(obj.url_data) + + df1 = pd.DataFrame(obj.data_for_webui) + df1.to_csv('{}/ftp_datavalues.csv'.format(obj.result_dir), index=False) # Report generation when groups are specified if args.group_name: obj.generate_report(ftp_data, date, input_setup_info, test_rig=args.test_rig, @@ -2807,13 +2984,8 @@ def pass_fail_duration(band, file_size): dut_sw_version=args.dut_sw_version, dut_model_num=args.dut_model_num, dut_serial_num=args.dut_serial_num, test_id=args.test_id, bands=args.bands, csv_outfile=args.csv_outfile, local_lf_report_dir=args.local_lf_report_dir) -# FOR WEB-UI // to fetch the last logs of the execution. - if args.dowebgui: - obj.data_for_webui["status"] = ["STOPPED"] * len(obj.url_data) - df1 = pd.DataFrame(obj.data_for_webui) - df1.to_csv('{}/ftp_datavalues.csv'.format(obj.result_dir), index=False) - # copying to home directory i.e home/user_name + if args.dowebgui: obj.copy_reports_to_home_dir() diff --git a/py-scripts/lf_graph.py b/py-scripts/lf_graph.py index c027a2fe5..598d6c425 100755 --- a/py-scripts/lf_graph.py +++ b/py-scripts/lf_graph.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_graph.py @@ -25,7 +24,7 @@ import numpy as np import pdfkit from matplotlib.colors import ListedColormap -import matplotlib.ticker as mticker +# import matplotlib.ticker as mticker import argparse import traceback import logging @@ -147,9 +146,9 @@ def build_bar_graph(self): for border in self.remove_border: ax.spines[border].set_color(None) if 'left' in self.remove_border: # to remove the y-axis labeling - yaxis_visable =False + yaxis_visable = False else: - yaxis_visable=True + yaxis_visable = True ax.yaxis.set_visible(yaxis_visable) def show_value(rectangles): @@ -157,7 +156,7 @@ def show_value(rectangles): h = rect.get_height() plt.text(rect.get_x() + rect.get_width() / 2., h, h, ha='center', va='bottom', rotation=self.text_rotation, fontsize=self.text_font) - + br1 = None for _ in self.data_set: if i > 0: br = br1 @@ -181,10 +180,10 @@ def show_value(rectangles): plt.xticks(np.arange(0, len(self.xaxis_categories), step=self.xaxis_step), - fontsize=self.xticks_font,rotation=self.xticks_rotation) + fontsize=self.xticks_font, rotation=self.xticks_rotation) else: plt.xticks([i + self._xaxis_value_location for i in np.arange(0, len(self.data_set[0]), step=self.xaxis_step)], - self.xaxis_categories, fontsize=self.xticks_font,rotation=self.xticks_rotation) + self.xaxis_categories, fontsize=self.xticks_font, rotation=self.xticks_rotation) plt.legend( handles=self.legend_handles, loc=self.legend_loc, @@ -212,12 +211,11 @@ def show_value(rectangles): raise ValueError( "Length and x-axis values and y-axis values should be same.") else: - logger.debug("No Dataset Found") + logger.debug("No Dataset Found") logger.debug("{}.csv".format(self.graph_image_name)) return "%s.png" % self.graph_image_name - class lf_bar_graph_horizontal: def __init__(self, _data_set=None, _xaxis_name="x-axis", @@ -311,27 +309,27 @@ def build_bar_graph_horizontal(self): for border in self.remove_border: ax.spines[border].set_color(None) if 'left' in self.remove_border: # to remove the y-axis labeling - yaxis_visable =False + yaxis_visable = False else: - yaxis_visable=True + yaxis_visable = True ax.yaxis.set_visible(yaxis_visable) def show_value(rectangles): for rect in rectangles: w = rect.get_width() - y = rect.get_y() - h = rect.get_height() - x = rect.get_x() + # y = rect.get_y() + # h = rect.get_height() + # x = rect.get_x() # adding 1 may not always work based on the x axis scale may need to be configurable - plt.text(w + 1 , rect.get_y() + rect.get_height() / 4., w, + plt.text(w + 1, rect.get_y() + rect.get_height() / 4., w, ha='center', va='bottom', rotation=self.text_rotation, fontsize=self.text_font) - + br1 = None for _ in self.data_set: if i > 0: br = br1 br2 = [y + self.bar_height for y in br] rects = plt.barh(br2, self.data_set[i], color=self.color[i], height=self.bar_height, - edgecolor=self.color_edge, label=self.label[i]) + edgecolor=self.color_edge, label=self.label[i]) if self.show_bar_value: show_value(rects) br1 = br2 @@ -339,7 +337,7 @@ def show_value(rectangles): else: br1 = np.arange(len(self.data_set[i])) rects = plt.barh(br1, self.data_set[i], color=self.color[i], height=self.bar_height, - edgecolor=self.color_edge, label=self.label[i]) + edgecolor=self.color_edge, label=self.label[i]) if self.show_bar_value: show_value(rects) i = i + 1 @@ -349,10 +347,10 @@ def show_value(rectangles): plt.yticks(np.arange(0, len(self.yaxis_categories), step=self.yaxis_step), - fontsize=self.yticks_font,rotation=self.yticks_rotation) + fontsize=self.yticks_font, rotation=self.yticks_rotation) else: plt.yticks([i + self._yaxis_value_location for i in np.arange(0, len(self.data_set[0]), step=self.yaxis_step)], - self.yaxis_categories, fontsize=self.yticks_font,rotation=self.yticks_rotation) + self.yaxis_categories, fontsize=self.yticks_font, rotation=self.yticks_rotation) plt.legend( handles=self.legend_handles, loc=self.legend_loc, @@ -380,13 +378,11 @@ def show_value(rectangles): raise ValueError( "Length and x-axis values and y-axis values should be same.") else: - logger.debug("No Dataset Found") + logger.debug("No Dataset Found") logger.debug("{}.csv".format(self.graph_image_name)) return "%s.png" % self.graph_image_name - - class lf_scatter_graph: def __init__(self, _x_data_set=None, @@ -467,14 +463,16 @@ def build_scatter_graph(self): return "%s.png" % self.graph_image_name # have a second yaxis with line graph + + class lf_bar_line_graph: - def __init__(self, + def __init__(self, _data_set1=None, # Note data_set2, data_set2_poly and data_set2_spline needs same size list _data_set2=None, - _data_set2_poly=[False], # Values are True or False + _data_set2_poly=[False], # Values are True or False _data_set2_poly_degree=[3], - _data_set2_interp1d=[False], # Values are True or False + _data_set2_interp1d=[False], # Values are True or False _xaxis_name="x-axis", _y1axis_name="y1-axis", _y2axis_name="y2-axis", @@ -584,7 +582,7 @@ def build_bar_line_graph(self): i = i + 1 fig, ax1 = plt.subplots(figsize=self.figsize) - + ax2 = ax1.twinx() i = 0 @@ -595,6 +593,7 @@ def show_value(rectangles): ax1.text(rect.get_x() + rect.get_width() / 2., h, h, ha='center', va='bottom', rotation=self.text_rotation, fontsize=self.text_font) + br1 = None for _ in self.data_set1: if i > 0: br = br1 @@ -616,12 +615,12 @@ def show_value(rectangles): ax1.set_ylabel(self.y1axis_name, fontweight='bold', fontsize=15) if self.xaxis_categories[0] == 0: xsteps = plt.xticks(np.arange(0, - len(self.xaxis_categories), - step=self.xaxis_step), - fontsize=self.xticks_font) + len(self.xaxis_categories), + step=self.xaxis_step), + fontsize=self.xticks_font) else: - xsteps = plt.xticks([i + self._xaxis_value_location for i in np.arange(0, len(self.data_set1[0]), step=self.xaxis_step)], - self.xaxis_categories, fontsize=self.xticks_font) + xsteps = plt.xticks([i + self._xaxis_value_location for i in np.arange(0, len(self.data_set1[0]), step=self.xaxis_step)], # noqa: F841 + self.xaxis_categories, fontsize=self.xticks_font) ax1.legend( handles=self.legend_handles, loc=self.legend_loc1, @@ -629,11 +628,11 @@ def show_value(rectangles): ncol=self.legend_ncol, fontsize=self.legend_fontsize) - # overlay line graph + def show_value2(data): for item, value in enumerate(data): - ax2.text(item, value, "{value}".format(value=value), ha='center',rotation=self.text_rotation, fontsize=self.text_font) + ax2.text(item, value, "{value}".format(value=value), ha='center', rotation=self.text_rotation, fontsize=self.text_font) i = 0 for _ in self.data_set2: @@ -647,7 +646,7 @@ def show_value2(data): show_value2(self.data_set2[i]) # do polynomial smoothing if self.data_set2_poly[i]: - poly = np.polyfit(br1,self.data_set2[i],self.data_set2_poly_degree[i]) + poly = np.polyfit(br1, self.data_set2[i], self.data_set2_poly_degree[i]) poly_y = np.poly1d(poly)(br1) ax2.plot( br1, @@ -656,7 +655,7 @@ def show_value2(data): label=self.label2_poly[i] ) if self.data_set2_interp1d[i]: - cubic_interpolation_model = interpolate.interp1d(br1, self.data_set2[i],kind="cubic") + cubic_interpolation_model = interpolate.interp1d(br1, self.data_set2[i], kind="cubic") x_sm = np.array(br1) x_smooth = np.linspace(x_sm.min(), x_sm.max(), 500) @@ -671,8 +670,8 @@ def show_value2(data): i += 1 ax2.set_xlabel(self.xaxis_name, fontweight='bold', fontsize=15) ax2.set_ylabel(self.y2axis_name, fontweight='bold', fontsize=15) - ax2.tick_params(axis = 'y', labelcolor = 'orange') - + ax2.tick_params(axis='y', labelcolor='orange') + ax2.legend( handles=self.legend_handles, loc=self.legend_loc2, @@ -701,12 +700,11 @@ def show_value2(data): raise ValueError( "Length and x-axis values and y-axis values should be same.") else: - logger.debug("No Dataset Found") + logger.debug("No Dataset Found") logger.debug("{}.csv".format(self.graph_image_name)) return "%s.png" % self.graph_image_name - class lf_stacked_graph: """ usage: This will generate a vertically stacked graph with list _data_set as well as with dictionary _data_set. @@ -727,6 +725,7 @@ class lf_stacked_graph: obj.build_stacked_graph() """ + def __init__(self, _data_set=None, _xaxis_name="Stations", @@ -790,7 +789,7 @@ def build_stacked_graph(self): if len(self.data_set) > 3: for i in range(3, len(self.data_set)): plt.bar(self.data_set[0], self.data_set[i], - bottom=np.array(self.data_set[i - 2]) + np.array(self.data_set[i - 1]),color=self.color[i - 1]) + bottom=np.array(self.data_set[i - 2]) + np.array(self.data_set[i - 1]), color=self.color[i - 1]) plt.legend(self.label) elif type(self.data_set) is dict: lable_values = [] @@ -821,7 +820,7 @@ def build_stacked_graph(self): for i, v in enumerate(fail_values): if v != 0: plt.text(i + .005, v * 0.45 + pass_values[i], "%s%s" % (v, "%"), color=self.bar_text_color, - fontweight=self.bar_font_weight, fontsize=self.bar_font_size, ha="center", va="center" , + fontweight=self.bar_font_weight, fontsize=self.bar_font_size, ha="center", va="center", rotation=self.bar_text_rotation) plt.legend([bar_1, bar_2], self.label, title=self.legend_title, bbox_to_anchor=self.legend_bbox, loc=self.legend_loc) @@ -1058,9 +1057,9 @@ def build_line_graph(self): def main(): help_summary = '''\ - This script facilitates the generation of comprehensive graphical reports. It offers a variety of graph types, - including bar graphs, horizontal bar graphs, scatter graphs, bar-line graphs, stacked graphs, horizontal stacked - graphs, and line graphs. + This script facilitates the generation of comprehensive graphical reports. It offers a variety of graph types, + including bar graphs, horizontal bar graphs, scatter graphs, bar-line graphs, stacked graphs, horizontal stacked + graphs, and line graphs. ''' # arguments parser = argparse.ArgumentParser( @@ -1198,7 +1197,7 @@ def main(): pdfkit.from_file(output_html_2, output_pdf_2, options=options) # test build_bar_graph_horizontal with defaults - dataset = [[45, 67, 34, 22, 31, 52, 60, 71, 24, 25, 45, 67, 34, 22, 31, 52, 60, 71, 24, 25], [22, 45, 12, 34, 70, 80, 14, 35, 44, 45,22, 45, 12, 34, 70, 80, 14, 35, 44, 45 ], [30, 55, 69, 37, 77, 24, 25, 77, 77, 80, 30, 55, 69, 37, 77, 24, 25, 77, 77, 80]] + dataset = [[45, 67, 34, 22, 31, 52, 60, 71, 24, 25, 45, 67, 34, 22, 31, 52, 60, 71, 24, 25], [22, 45, 12, 34, 70, 80, 14, 35, 44, 45, 22, 45, 12, 34, 70, 80, 14, 35, 44, 45], [30, 55, 69, 37, 77, 24, 25, 77, 77, 80, 30, 55, 69, 37, 77, 24, 25, 77, 77, 80]] # noqa: E501 y_axis_values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] # calculate the height of the y-axis .25 * number of values @@ -1208,21 +1207,19 @@ def main(): output_html_3 = "graph_3.html" output_pdf_3 = "graph_3.pdf" - - graph = lf_bar_graph_horizontal(_data_set=dataset, - _xaxis_name="Throughput 2 (Mbps)", - _yaxis_name="stations", - _yaxis_categories=y_axis_values, - _graph_image_name="Bi-single_radio_2.4GHz", - _label=["bi-downlink", "bi-uplink", 'uplink'], - _color=None, - _color_edge='red', - _figsize=(x_fig_size, y_fig_size), - _show_bar_value= True, - _text_font=6, - _text_rotation=True, - _enable_csv=True) + _xaxis_name="Throughput 2 (Mbps)", + _yaxis_name="stations", + _yaxis_categories=y_axis_values, + _graph_image_name="Bi-single_radio_2.4GHz", + _label=["bi-downlink", "bi-uplink", 'uplink'], + _color=None, + _color_edge='red', + _figsize=(x_fig_size, y_fig_size), + _show_bar_value=True, + _text_font=6, + _text_rotation=True, + _enable_csv=True) graph_html_obj = """

@@ -1243,4 +1240,4 @@ def main(): # Unit Test if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_interop_modify.py b/py-scripts/lf_interop_modify.py index e08171b6b..90639052b 100755 --- a/py-scripts/lf_interop_modify.py +++ b/py-scripts/lf_interop_modify.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_interop_modify.py @@ -27,13 +26,13 @@ import argparse import pprint import logging -from pprint import pprint +from pprint import pprint # noqa: F811 from urllib.parse import urlparse sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lanforge_api = importlib.import_module("lanforge_client.lanforge_api") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand -from lanforge_client.lanforge_api import LFJsonQuery +from lanforge_client.lanforge_api import LFSession # noqa: E402 +from lanforge_client.lanforge_api import LFJsonCommand # noqa: E402 +from lanforge_client.lanforge_api import LFJsonQuery # noqa: E402 lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base") LFCliBase = lfcli_base.LFCliBase realm = importlib.import_module("py-json.realm") @@ -206,7 +205,6 @@ def run(self): suppress_related_commands=True) # print(["Response", response_list]) - # to set adb_username if self.set_adb_user_name: self.command.post_add_adb(adb_device=None, @@ -273,7 +271,7 @@ def get_device_ssid(self): if 'SSID:' in z: print("yes") ind = z.index("SSID:") - ssid = z[(int(ind) + 1)] + ssid = z[(int(ind) + 1)] ssid_ = ssid.strip() ssid_1 = ssid_.replace('"', "") ssid_2 = ssid_1.replace(",", "") @@ -290,7 +288,7 @@ def get_wifi_health_monitor(self, ssid): y = x[0]["LAST"]["callback_message"] z = y.split(" ") # print(z) - value = ["ConnectAttempt", "ConnectFailure", "AssocRej", "AssocTimeout" ] + value = ["ConnectAttempt", "ConnectFailure", "AssocRej", "AssocTimeout"] return_dict = dict.fromkeys(value) if "stats\nSSID:" in z: ind = z.index("stats\nSSID:") @@ -326,16 +324,15 @@ def get_wifi_health_monitor(self, ssid): return return_dict - # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- # def main(): - desc = """modifies interop device - Operations: - * Example of loading Interop GUI: + desc = """modifies interop device + Operations: + * Example of loading Interop GUI: lf_interop_modify.py --show_gui 192.168.100.202:1 --device 1.1.KEBE2021070849 --screensize 0.4 - * Example of installing APK: + * Example of installing APK: lf_interop_modify.py --install_g interop-5.4.5.apk --device 1.1.KEBE2021070849 - * Example of capturing logs + * Example of capturing logs lf_interop_modify.py --log_dur 5 --device 1.1.KEBE2021070849 --log_destination foo4.txt * Examples of enabling/disabling wifi lf_interop_modify.py --wifi enable --device 1.1.KEBE2021070849 @@ -475,7 +472,7 @@ def main(): _debug_on=False, _exit_on_error=False, _exit_on_fail=False, - set_adb_user_name= args.set_adb_user_name, + set_adb_user_name=args.set_adb_user_name, adb_username=args.adb_username, list_ntwk=args.list_ntwk, forget_netwrk=args.forget_netwrk, diff --git a/py-scripts/lf_interop_pdu_automation.py b/py-scripts/lf_interop_pdu_automation.py index 2140cadd8..aa60fb670 100755 --- a/py-scripts/lf_interop_pdu_automation.py +++ b/py-scripts/lf_interop_pdu_automation.py @@ -1,15 +1,17 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_interop_pdu_automation.py -PURPOSE: lf_interop_pdu_automation.py is a stand-alone automation script which will automatically power on/off for -certain interval in loop to prevent the mobile phones over charging. +PURPOSE: lf_interop_pdu_automation.py is a stand-alone automation script +which will automatically power on/off for certain interval in loop to +prevent the mobile phones over charging. -USE './python3 lf_interop_pdu_automation.py --host 192.168.200.50 --user username --password pass --current -starting_status_of_port --port all/1,2,3 --on_time integer(minutes) --off_time integer(minutes) - Eg : ./python3 lf_interop_pdu_automation.py --host 192.168.200.50 --user admin --password Candela@123 --current on - --port all --on_time 1 --off_time 1' +USE './python3 lf_interop_pdu_automation.py --host 192.168.200.50 + --user username --password pass --current starting_status_of_port + --port all/1,2,3 --on_time integer(minutes) --off_time integer(minutes) + Eg : ./python3 lf_interop_pdu_automation.py --host 192.168.200.50 + --user admin --password Candela@123 --current on --port all + --on_time 1 --off_time 1' Note: Please ensure that PDU is powered on and has an ip assigned to it. @@ -20,8 +22,13 @@ import argparse from typing import Sequence from typing import Optional +import traceback -import dlipower +try: + import dlipower +except ModuleNotFoundError: + print('The module dlipower not installed, use pip install dlipower') + print('The module dlipower not available on F27, try F30+') class PDUAutomate: @@ -37,7 +44,8 @@ def __init__(self, hostname, user, password): def login(self): try: self.power_switch = dlipower.PowerSwitch(hostname=self.hostname, userid=self.user, password=self.password) - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) print('[STATUS] PDU device is Off, please connect it and try after sometime!!!') exit(0) @@ -73,7 +81,8 @@ def switch_on(self, port): port = str(self.port).split(",") for i in port: self.power_switch[int(i) - 1].state = "ON" - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) self.power_switch[int(self.port) - 1].state = "ON" else: for outlet in self.power_switch: @@ -86,7 +95,8 @@ def switch_off(self, port): port = str(self.port).split(",") for i in port: self.power_switch[int(i) - 1].state = "OFF" - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) self.power_switch[int(self.port) - 1].state = "OFF" else: for outlet in self.power_switch: diff --git a/py-scripts/lf_interop_ping_plotter.py b/py-scripts/lf_interop_ping_plotter.py index d5abd8939..fe8e10ed4 100755 --- a/py-scripts/lf_interop_ping_plotter.py +++ b/py-scripts/lf_interop_ping_plotter.py @@ -154,7 +154,9 @@ def __init__(self, server_ip=None, expected_passfail_val=None, csv_name=None, - wait_time=60): + wait_time=60, + floors=None, + get_live_view=None): super().__init__(lfclient_host=host, lfclient_port=port) self.host = host @@ -199,6 +201,8 @@ def __init__(self, self.expected_passfail_val = expected_passfail_val self.csv_name = csv_name self.wait_time = wait_time + self.floors = floors + self.get_live_view = get_live_view def change_target_to_ip(self): @@ -1052,7 +1056,8 @@ def generate_report(self, result_json=None, result_dir='Ping_Plotter_Test_Report report.set_csv_filename(graph_png) report.move_csv_file() report.build_graph() - + if self.do_webUI and self.get_live_view: + self.add_ping_packet_images(report=report) dataframe1 = pd.DataFrame({ 'Wireless Client': self.device_names, 'MAC': self.device_mac, @@ -1135,7 +1140,6 @@ def generate_report(self, result_json=None, result_dir='Ping_Plotter_Test_Report report.build_table() # closing - report.build_custom() report.build_footer() report.write_html() report.write_pdf() @@ -1242,6 +1246,39 @@ def generate_dataframe(self, groupdevlist: List[str], report_names: List[str], d else: return None + def add_ping_packet_images(self, report): + """ + Adds Ping Packet Sent, Received, and Loss heatmap images for each floor into the report. + Waits up to 60 seconds for each set of images to be generated. + """ + if self.do_webUI and self.get_live_view: + test_name = os.path.basename(self.ui_report_dir) + + for floor in range(int(self.floors)): + # Construct expected image paths + packet_sent_image = os.path.join(self.ui_report_dir, "live_view_images", f"{test_name}_ping_packet_sent_{floor + 1}.png") + packet_recv_image = os.path.join(self.ui_report_dir, "live_view_images", f"{test_name}_ping_packet_recv_{floor + 1}.png") + packet_loss_image = os.path.join(self.ui_report_dir, "live_view_images", f"{test_name}_ping_packet_loss_{floor + 1}.png") + + # Wait for all required images to be generated (up to timeout) + timeout = 60 # seconds + start_time = time.time() + + while not (os.path.exists(packet_sent_image) and os.path.exists(packet_recv_image) and os.path.exists(packet_loss_image)): + if time.time() - start_time > timeout: + print(f"Timeout: Heatmap images for floor {floor + 1} not found within {timeout} seconds.") + break + time.sleep(1) + + # Only proceed if all three images exist after waiting + if os.path.exists(packet_sent_image) and os.path.exists(packet_recv_image) and os.path.exists(packet_loss_image): + report.set_custom_html(f"

Floor {floor + 1} - Ping Packet Sent vs Received vs Lost:

") + report.build_custom() + + for image_path in [packet_sent_image, packet_recv_image, packet_loss_image]: + report.set_custom_html(f'') + report.build_custom() + def validate_args(args): # input sanity @@ -1529,6 +1566,16 @@ def main(): parser.add_argument('--device_csv_name', type=str, help='Enter the csv name to store expected values', default=None) parser.add_argument('--wait_time', type=int, help='Enter the maximum wait time for configurations to apply', default=60) + # Arguments Related to Testhouse + optional.add_argument('--get_live_view', + action="store_true", + help='specify this flag to get the liveview of the devices') + + optional.add_argument('--floors', + type=int, + default=0, + help='specify the Number of floors there in the house') + args = parser.parse_args() if args.help_summary: @@ -1637,7 +1684,8 @@ def main(): # ping object creation ping = Ping(host=mgr_ip, port=mgr_port, ssid=ssid, security=security, password=password, radio=radio, lanforge_password=mgr_password, target=target, interval=interval, sta_list=[], virtual=args.virtual, real=args.real, duration=report_duration, do_webUI=do_webUI, debug=debug, - ui_report_dir=ui_report_dir, csv_name=args.device_csv_name, expected_passfail_val=args.expected_passfail_value, wait_time=args.wait_time, group_name=group_name) + ui_report_dir=ui_report_dir, csv_name=args.device_csv_name, expected_passfail_val=args.expected_passfail_value, wait_time=args.wait_time, group_name=group_name, + floors=args.floors, get_live_view=args.get_live_view) # creating virtual stations if --virtual flag is specified if args.virtual: @@ -1697,15 +1745,25 @@ def main(): 'pac_file': pac_file, 'server_ip': server_ip, } - for device in all_devices: - if device["type"] == 'laptop': - device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["hostname"]) - else: - device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["serial"]) + # If the test is triggered from the webUI, use the provided resources + if webUI_resources is not None: + webUI_resources = webUI_resources.split(',') + print(f"WebUI resources: {webUI_resources}") + devices_list = [] + for device in webUI_resources: + devices_list.append(device.split('.')[0] + '.' + device.split('.')[1]) + dev_list = asyncio.run(obj.connectivity(device_list=devices_list, wifi_config=config_dict)) + else: + # print(f"Available devices: {all_devices}") + for device in all_devices: + if device["type"] == 'laptop': + device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["hostname"]) + else: + device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["serial"]) - logger.info(f"Available devices: {device_list}") - dev_list = input("Enter the desired resources to run the test:").split(',') - dev_list = asyncio.run(obj.connectivity(device_list=dev_list, wifi_config=config_dict)) + logger.info(f"Available devices: {device_list}") + dev_list = input("Enter the desired resources to run the test:").split(',') + dev_list = asyncio.run(obj.connectivity(device_list=dev_list, wifi_config=config_dict)) ping.select_real_devices(real_devices=Devices, device_list=dev_list) # Case 3: Config is False, no device list is provided, and no group is selected else: @@ -2200,6 +2258,10 @@ def main(): logging.info(ping.result_json) + if ping.do_webUI: + ping.copy_reports_to_home_dir() + ping.set_webUI_stop() + if args.local_lf_report_dir == "": if args.group_name: ping.generate_report(config_devices=config_devices, group_device_map=group_device_map) @@ -2211,11 +2273,6 @@ def main(): else: ping.generate_report(report_path=args.local_lf_report_dir) - if ping.do_webUI: - # copying to home directory i.e home/user_name - ping.copy_reports_to_home_dir() - if ping.do_webUI: - ping.set_webUI_stop() # print('----',rtts) # station post cleanup if not args.no_cleanup: diff --git a/py-scripts/lf_interop_port_reset_test.py b/py-scripts/lf_interop_port_reset_test.py index fb2104928..28789882d 100755 --- a/py-scripts/lf_interop_port_reset_test.py +++ b/py-scripts/lf_interop_port_reset_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_interop_port_reset_test.py @@ -45,7 +44,10 @@ import argparse import time import datetime -from datetime import datetime +# When you use from datetime import datetime, you are making the +# datetime class directly accessible in your code without +# having to prefix it with the module name +from datetime import datetime # noqa: F811 import pandas as pd import matplotlib.pyplot as plt import logging @@ -196,7 +198,7 @@ def get_count(self, value=None, keys_list=None, device=None, filter=None): for i, y in zip(keys_list, range(len(keys_list))): wifi_msg_text = value[y][i]['text'] resource = value[y][i]['resource'] - if type(wifi_msg_text) == str: + if type(wifi_msg_text) is str: wifi_msg_text_keyword_list = value[y][i]['text'].split(" ") if device is None: logging.info(f"Device {device} is None device name not existed in wifi messages...") @@ -451,7 +453,7 @@ def run(self): self.windows_list = self.base_interop_profile.windows_list self.linux_list = self.base_interop_profile.linux_list self.mac_list = self.base_interop_profile.mac_list - logging.info(f"Final Active Devices List (Android, Windows, Linux, Mac) Which support user specified release & not in phantom : {self.adb_device_list, self.base_interop_profile.windows_list, self.base_interop_profile.linux_list, self.base_interop_profile.mac_list}") + logging.info(f"Final Active Devices List (Android, Windows, Linux, Mac) Which support user specified release & not in phantom : {self.adb_device_list, self.base_interop_profile.windows_list, self.base_interop_profile.linux_list, self.base_interop_profile.mac_list}") # noqa: E501 self.all_selected_devices = self.adb_device_list + self.windows_list + self.linux_list + self.mac_list self.all_laptops = self.windows_list + self.linux_list + self.mac_list logging.info(f"All Selected Devices: {self.all_selected_devices}") @@ -499,7 +501,7 @@ def run(self): logging.info("**** The Device is not connected to the expected ssid ****") else: # logging.info(f"Waiting for {self.wait_time} sec & Checking again the status of the device") - logging.info(f"Waiting for 30 sec & Checking again") + logging.info("Waiting for 30 sec & Checking again") time.sleep(30) dev_state = self.utility.get_device_state(device=i) logging.info("Checking Device Status Again..." + str(dev_state)) @@ -633,7 +635,7 @@ def generate_overall_graph(self, reset_dict=None, figsize=(13, 5), _alignmen=Non for j in self.all_laptops: local = [] - local_2, local_3, local_4, local_5, local_6 = [], [], [], [], [] + local_2, local_3, local_4, local_5, local_6 = [], [], [], [], [] # noqa: F841 for i in reset_dict: if j in list(reset_dict[i].keys()): local.append(reset_dict[i][j]['Connected']) @@ -929,7 +931,7 @@ def generate_report(self, reset_dict=None, test_dur=None): "SSID": self.ssid, "Security": security, "Total Reset Count": self.reset, - "No of Clients": f"{len(self.all_selected_devices)} (Windows: {len(self.windows_list)}, Linux: {len(self.linux_list)}, Mac: {len(self.mac_list)}, Android: {len(self.adb_device_list)})", + "No of Clients": f"{len(self.all_selected_devices)} (Windows: {len(self.windows_list)}, Linux: {len(self.linux_list)}, Mac: {len(self.mac_list)}, Android: {len(self.adb_device_list)})", # noqa: E501 # "Wait Time": str(self.wait_time) + " sec", "Time intervel between resets": str(self.time_int) + " sec", "Test Duration": test_dur, @@ -978,7 +980,7 @@ def generate_report(self, reset_dict=None, test_dur=None): self.generate_overall_graph_table(reset_dict=reset_dict, device_list=all_devices) - d_name, device_type, model, user_name, release = [], [], [], [], [] + d_name, device_type, model, user_name, release = [], [], [], [], [] # noqa: F841 for y in all_devices: if "1.1." in y: @@ -1027,7 +1029,6 @@ def generate_report(self, reset_dict=None, test_dur=None): # "The table displays details of real clients which are involved in the test.") # self.lf_report.build_objective() - self.lf_report.build_footer() self.lf_report.write_html() self.lf_report.write_pdf_with_timestamp(_page_size='A4', _orientation='Portrait') @@ -1038,38 +1039,37 @@ def generate_report(self, reset_dict=None, test_dur=None): def main(): help_summary = '''\ - The LANforge interop port reset test enables users to use real Wi-Fi stations and connect them to the Access Point - being tested. It then disconnects and reconnects a given number of stations at different time intervals. - This test helps evaluate how well the AP handles a dynamic and busy network environment with devices joining and + The LANforge interop port reset test enables users to use real Wi-Fi stations and connect them to the Access Point + being tested. It then disconnects and reconnects a given number of stations at different time intervals. + This test helps evaluate how well the AP handles a dynamic and busy network environment with devices joining and leaving the network at random times. - + The test will basically disconnect & reconnect to the same network with real devices such as android, linux, windows and generate a report. ''' parser = argparse.ArgumentParser( prog=__file__, formatter_class=argparse.RawTextHelpFormatter, - description= - ''' + description=''' NAME: lf_interop_port_reset_test.py PURPOSE: - The LANforge interop port reset test enables users to use real Wi-Fi stations and connect them to the - Access Point (AP) being tested. It then disconnects and reconnects a given number of stations at - different time intervals. This test helps evaluate how well the AP handles a dynamic and busy network environment + The LANforge interop port reset test enables users to use real Wi-Fi stations and connect them to the + Access Point (AP) being tested. It then disconnects and reconnects a given number of stations at + different time intervals. This test helps evaluate how well the AP handles a dynamic and busy network environment with devices joining and leaving the network at random times. EXAMPLE: # To run port-reset test on specified real devices (android, laptops) - python3 lf_interop_port_reset_test.py --host 192.168.200.63 --mgr_ip 192.168.1.61 --dut Test_Dut + python3 lf_interop_port_reset_test.py --host 192.168.200.63 --mgr_ip 192.168.1.61 --dut Test_Dut --ssid RDT_wpa2 --passwd OpenWifi --encryp psk2 --reset 1 --time_int 5 --release 11 SCRIPT_CLASSIFICATION: Interop Port-Reset Test SCRIPT_CATEGORIES: Toggling, Report Generation, Each Reset Wifi Messages -NOTES: +NOTES: The primary objective of this script is to automate the process of toggling WiFi on real devices with the InterOp Application, evaluating their performance with an access point. It achieves this by simulating multiple WiFi resets as specified by the user. @@ -1168,4 +1168,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index 744663ac6..784798297 100755 --- a/py-scripts/lf_interop_qos.py +++ b/py-scripts/lf_interop_qos.py @@ -93,6 +93,7 @@ import shutil import asyncio import csv +import re from datetime import datetime, timedelta from collections import defaultdict @@ -131,7 +132,7 @@ def __init__(self, group_name=None, port=8080, test_name=None, - device_list=[], + device_list=None, result_dir=None, ap_name="", traffic_type=None, @@ -146,9 +147,24 @@ def __init__(self, _exit_on_fail=False, dowebgui=False, ip="localhost", - user_list=[], real_client_list=[], real_client_list1=[], hw_list=[], laptop_list=[], android_list=[], mac_list=[], windows_list=[], linux_list=[], - total_resources_list=[], working_resources_list=[], hostname_list=[], username_list=[], eid_list=[], - devices_available=[], input_devices_list=[], mac_id1_list=[], mac_id_list=[], + user_list=None, + real_client_list=None, + real_client_list1=None, + hw_list=None, + laptop_list=None, + android_list=None, + mac_list=None, + windows_list=None, + linux_list=None, + total_resources_list=None, + working_resources_list=None, + hostname_list=None, + username_list=None, + eid_list=None, + devices_available=None, + input_devices_list=None, + mac_id1_list=None, + mac_id_list=None, eap_method=None, eap_identity=None, ieee80211=None, @@ -170,15 +186,17 @@ def __init__(self, csv_direction=None, expected_passfail_val=None, csv_name=None, - wait_time=60): + wait_time=60, + get_live_view=False, + total_floors=0): super().__init__(lfclient_host=host, - lfclient_port=port), + lfclient_port=port) self.ssid_list = [] self.upstream = upstream self.host = host self.port = port self.test_name = test_name - self.device_list = device_list + self.device_list = device_list if device_list else [] self.result_dir = result_dir self.ssid = ssid self.security = security @@ -208,24 +226,24 @@ def __init__(self, self.cx_profile.side_a_max_bps = side_a_max_rate self.cx_profile.side_b_min_bps = side_b_min_rate self.cx_profile.side_b_max_bps = side_b_max_rate - self.hw_list = hw_list - self.laptop_list = laptop_list - self.android_list = android_list - self.mac_list = mac_list - self.windows_list = windows_list - self.linux_list = linux_list - self.total_resources_list = total_resources_list - self.working_resources_list = working_resources_list - self.hostname_list = hostname_list - self.username_list = username_list - self.eid_list = eid_list - self.devices_available = devices_available - self.input_devices_list = input_devices_list - self.real_client_list = real_client_list - self.real_client_list1 = real_client_list1 - self.user_list = user_list - self.mac_id_list = mac_id_list - self.mac_id1_list = mac_id1_list + self.hw_list = hw_list if hw_list else [] + self.laptop_list = laptop_list if laptop_list else [] + self.android_list = android_list if android_list else [] + self.mac_list = mac_list if mac_list else [] + self.windows_list = windows_list if windows_list else [] + self.linux_list = linux_list if linux_list else [] + self.total_resources_list = total_resources_list if total_resources_list else [] + self.working_resources_list = working_resources_list if working_resources_list else [] + self.hostname_list = hostname_list if hostname_list else [] + self.username_list = username_list if username_list else [] + self.eid_list = eid_list if eid_list else [] + self.devices_available = devices_available if devices_available else [] + self.input_devices_list = input_devices_list if input_devices_list else [] + self.real_client_list = real_client_list if real_client_list else [] + self.real_client_list1 = real_client_list1 if real_client_list1 else [] + self.user_list = user_list if user_list else [] + self.mac_id_list = mac_id_list if mac_id_list else [] + self.mac_id1_list = mac_id1_list if mac_id1_list else [] self.dowebgui = dowebgui self.ip = ip self.device_found = False @@ -255,13 +273,15 @@ def __init__(self, self.wait_time = wait_time self.group_device_map = {} self.config = config + self.get_live_view = get_live_view + self.total_floors = total_floors def os_type(self): response = self.json_get("/resource/all") for key, value in response.items(): if key == "resources": for element in value: - for a, b in element.items(): + for _a, b in element.items(): if "Apple" in b['hw version']: if b['kernel'] == '': self.hw_list.append('iOS') @@ -349,7 +369,7 @@ def phantom_check(self): for key, value in response.items(): if key == "resources": for element in value: - for a, b in element.items(): + for _a, b in element.items(): if b['phantom'] is False: self.working_resources_list.append(b["hw version"]) if "Win" in b['hw version']: @@ -495,7 +515,7 @@ def change_port_to_ip(self, upstream_port): try: target_port_ip = self.json_get(f'/port/{shelf}/{resource}/{port}?fields=ip')['interface']['ip'] upstream_port = target_port_ip - except BaseException: + except Exception: logging.warning(f'The upstream port is not an ethernet port. Proceeding with the given upstream_port {upstream_port}.') logging.info(f"Upstream port IP {upstream_port}") else: @@ -543,7 +563,7 @@ def create_cx(self): direction = 'UL' traffic_type = (self.traffic_type.strip("lf_")).upper() traffic_direction_list, cx_list, traffic_type_list = [], [], [] - for client in range(len(self.real_client_list)): + for _client in range(len(self.real_client_list)): traffic_direction_list.append(direction) traffic_type_list.append(traffic_type) logger.info("tos: {}".format(self.tos)) @@ -568,6 +588,66 @@ def create_cx(self): count += 1 logger.info("cross connections with TOS type created.") + def monitor_cx(self): + """ + This function waits for up to 20 iterations to allow all CXs (connections) to be created. + + If some CXs are still not created after 20 iterations, then the CXs related to that device are removed, + along with their associated client and MAC entries from all relevant lists. + """ + + max_retry = 20 + current_retry = 0 + while current_retry < max_retry: + not_running_cx = [] + overallresponse = self.json_get('/cx/all') # Get all current CXs from the layer-3 tab + created_cx_list = list(self.cx_profile.created_cx.keys()) + l3_existing_cx = list(overallresponse.keys()) + count_of_cx = 0 + for created_cxs in created_cx_list: + if created_cxs in l3_existing_cx: + count_of_cx += 1 + else: + # Extract base device name (e.g., from '1.16androidsamsunga7_UDP_UL_BE-8' to '1.16androidsamsunga7') + # to track the whole device if any TOS-based CX fails. + not_running_cx.append(created_cxs.split('_')[0]) # CX was not created + if count_of_cx == len(created_cx_list): + break + logger.info(f"Try {current_retry + 1} out of 20: Waiting for the cross-connection to be created.") + time.sleep(2) + current_retry += 1 + cxs_to_remove = [] + + # Collect all CXs related to the failed device (from `not_running_cx`), + # including those created for other TOS types, and add them to `cxs_to_remove`. + for cx in self.cx_profile.created_cx: + for not_created_cx in not_running_cx: + if not_created_cx in cx: + cxs_to_remove.append(cx) + + # Remove each failed CX and delete it from the created CX tracking dictionary. + for cx in cxs_to_remove: + logger.info(f"Removing failed CX: {cx}") + super().rm_cx(cx) + del self.cx_profile.created_cx[cx] + + devices_to_be_removed = [] + for item in not_running_cx: + match = re.match(r'^[0-9.]+', item) + if match: + devices_to_be_removed.append(match.group()) + + # If there are devices to remove, filter them out from all related client and MAC lists + # to keep the lists consistent with the currently considered devices. + if len(devices_to_be_removed) != 0: + self.real_client_list1 = [item for item in self.real_client_list1 if item.split()[0] not in devices_to_be_removed] + self.input_devices_list = [item for item in self.input_devices_list if item.split('.')[0] + '.' + item.split('.')[1] not in devices_to_be_removed] + filtered = [(dev, mac) for dev, mac in zip(self.real_client_list, self.mac_id_list) if dev.split()[0] not in devices_to_be_removed] + self.real_client_list, self.mac_id_list = zip(*filtered) if filtered else ([], []) + self.real_client_list = list(self.real_client_list) + self.mac_id_list = list(self.mac_id_list) + self.num_stations = len(self.real_client_list) + def monitor(self): # TODO: Fix this. This is poor style throughput, upload, download, upload_throughput, download_throughput, connections_upload, connections_download, avg_upload, avg_download, avg_upload_throughput, avg_download_throughput, connections_download_avg, connections_upload_avg, avg_drop_a, avg_drop_b, dropa_connections, dropb_connections = { # noqa: E501 @@ -641,6 +721,11 @@ def monitor(self): time_break = 0 # Added background_run to allow the test to continue running, bypassing the duration limit for nile requirement. rates_data = defaultdict(list) + individual_device_data = {} + cx_list = list(self.cx_profile.created_cx.keys()) + for cx in cx_list: + columns = ['bps rx a', 'bps rx b'] + individual_device_data[cx] = pd.DataFrame(columns=columns) while datetime.now() < end_time or getattr(self, "background_run", None): index += 1 current_time = datetime.now() @@ -692,7 +777,7 @@ def monitor(self): temp_download = [] temp_drop_a = [] temp_drop_b = [] - for i in range(len(self.cx_profile.created_cx)): + for _i in range(len(self.cx_profile.created_cx)): temp_upload.append([]) temp_download.append([]) temp_drop_a.append([]) @@ -798,6 +883,11 @@ def monitor(self): self.df_for_webui.append(self.overall[-1]) previous_time = current_time if self.dowebgui == "True": + for key, value in t_response.items(): + row_data = [value[0], value[1]] + individual_device_data[key].loc[len(individual_device_data[key])] = row_data + for port, df in individual_device_data.items(): + df.to_csv(f"{runtime_dir}/{port}.csv", index=False) df1 = pd.DataFrame(self.df_for_webui) df1.to_csv('{}/overall_throughput.csv'.format(runtime_dir), index=False) @@ -842,13 +932,13 @@ def monitor(self): else: time_break = 1 # average upload download and drop is calculated - for ind, k in enumerate(throughput): + for ind, _k in enumerate(throughput): avg_upload[ind].append(throughput[ind][1]) avg_download[ind].append(throughput[ind][0]) avg_drop_a[ind].append(throughput[ind][2]) avg_drop_b[ind].append(throughput[ind][3]) # # rx_rate list is calculated - for index, key in enumerate(throughput): + for index, _key in enumerate(throughput): upload[index].append(throughput[index][1]) download[index].append(throughput[index][0]) drop_a[index].append(throughput[index][2]) @@ -925,16 +1015,23 @@ def evaluate_qos(self, connections_download, connections_upload, drop_a_per, dro temp = sta.rsplit('-', 1) current_tos = temp[0].split('_')[-1] # slicing TOS from CX name temp = int(temp[1]) - if int(self.cx_profile.side_b_min_bps) != 0: - tos_download[current_tos].append(connections_download[sta]) - tos_drop_dict['rx_drop_a'][current_tos].append(drop_a_per[temp]) - tx_b_download[current_tos].append(int(f"{tx_endps_download['%s-B' % sta]['tx pkts ll']}")) - rx_a_download[current_tos].append(int(f"{rx_endps_download['%s-A' % sta]['rx pkts ll']}")) - else: - tos_download[current_tos].append(float(0)) - tos_drop_dict['rx_drop_a'][current_tos].append(float(0)) - tx_b_download[current_tos].append(int(0)) - rx_a_download[current_tos].append(int(0)) + counter = 0 + # Added exception handling for occasional cx misses observed during the test, which were affecting the overall test execution. + try: + if int(self.cx_profile.side_b_min_bps) != 0: + tos_download[current_tos].append(connections_download[sta]) + tos_drop_dict['rx_drop_a'][current_tos].append(drop_a_per[counter]) + tx_b_download[current_tos].append(int(f"{tx_endps_download['%s-B' % sta]['tx pkts ll']}")) + rx_a_download[current_tos].append(int(f"{rx_endps_download['%s-A' % sta]['rx pkts ll']}")) + else: + tos_download[current_tos].append(float(0)) + tos_drop_dict['rx_drop_a'][current_tos].append(float(0)) + tx_b_download[current_tos].append(int(0)) + rx_a_download[current_tos].append(int(0)) + except Exception: + logger.info(f'{sta}-A/B : CX Not Found') + logger.info(f"Endpoint data : {endps}") + counter += 1 tos_download.update({"bkQOS": float(f"{sum(tos_download['BK']):.2f}")}) tos_download.update({"beQOS": float(f"{sum(tos_download['BE']):.2f}")}) tos_download.update({"videoQOS": float(f"{sum(tos_download['VI']):.2f}")}) @@ -956,9 +1053,10 @@ def evaluate_qos(self, connections_download, connections_upload, drop_a_per, dro temp = sta.rsplit('-', 1) current_tos = temp[0].split('_')[-1] temp = int(temp[1]) + counter = 0 if int(self.cx_profile.side_a_min_bps) != 0: tos_upload[current_tos].append(connections_upload[sta]) - tos_drop_dict['rx_drop_b'][current_tos].append(drop_b_per[temp]) + tos_drop_dict['rx_drop_b'][current_tos].append(drop_b_per[counter]) tx_b_upload[current_tos].append(int(f"{tx_endps_upload['%s-B' % sta]['tx pkts ll']}")) rx_a_upload[current_tos].append(int(f"{rx_endps_upload['%s-A' % sta]['rx pkts ll']}")) else: @@ -966,6 +1064,7 @@ def evaluate_qos(self, connections_download, connections_upload, drop_a_per, dro tos_drop_dict['rx_drop_b'][current_tos].append(float(0)) tx_b_upload[current_tos].append(int(0)) rx_a_upload[current_tos].append(int(0)) + counter += 1 tos_upload.update({"bkQOS": float(f"{sum(tos_upload['BK']):.2f}")}) tos_upload.update({"beQOS": float(f"{sum(tos_upload['BE']):.2f}")}) tos_upload.update({"videoQOS": float(f"{sum(tos_upload['VI']):.2f}")}) @@ -1179,19 +1278,19 @@ def generate_report(self, data, input_setup_info, connections_download_avg, conn df_throughput = pd.DataFrame(res["throughput_table_df"]) report.set_table_dataframe(df_throughput) report.build_table() - for key in res["graph_df"]: + for _key in res["graph_df"]: report.set_obj_html( _obj_title=f"Overall {self.direction} throughput for {len(self.input_devices_list)} clients with different TOS.", _obj=f"The below graph represents overall {self.direction} throughput for all " - "connected stations running BK, BE, VO, VI traffic with different " - f"intended loads{load} per tos") + "connected stations running BK, BE, VO, VI traffic with different " + f"intended loads{load} per tos") report.build_objective() graph = lf_bar_graph(_data_set=data_set, _xaxis_name="Load per Type of Service", _yaxis_name="Throughput (Mbps)", _xaxis_categories=["BK,BE,VI,VO"], _xaxis_label=['1 Mbps', '2 Mbps', '3 Mbps', '4 Mbps', '5 Mbps'], - _graph_image_name=f"tos_download_{key}Hz", + _graph_image_name=f"tos_download_{_key}Hz", _label=["BK", "BE", "VI", "VO"], _xaxis_step=1, _graph_title=f"Overall {self.direction} throughput – BK,BE,VO,VI traffic streams", @@ -1216,7 +1315,6 @@ def generate_report(self, data, input_setup_info, connections_download_avg, conn report.build_graph() self.generate_individual_graph(res, report, connections_download_avg, connections_upload_avg, avg_drop_a, avg_drop_b) report.test_setup_table(test_setup_data=input_setup_info, value="Information") - report.build_custom() report.build_footer() report.write_html() report.write_pdf() @@ -1317,13 +1415,68 @@ def generate_dataframe(self, groupdevlist, clients_list, mac, ssid, tos, upload, else: return None - def generate_individual_graph(self, res, report, connections_download_avg, connections_upload_avg, avg_drop_a, avg_drop_b): + def get_live_view_images(self, multicast_exists=False): + """ + This function looks for throughput and RSSI images for each floor + in the 'live_view_images' folder within `self.result_dir`. + It waits up to **60 seconds** for each image. If an image is found,then, + their name/path will be stored for the report purposes,otherwise, it's skipped. + + Parameters: + multicast_exists (bool): Indicates whether multicast traffic is present during the test. + When running Testhouse with mixed traffic , such as both QoS and multicast, + the overall report may show duplicate RSSI live view images, since the RSSI values are identical for both the tests. + """ + image_paths_by_tos = {} # { "BE": [img1, img2, ...], "VO": [...], ... } + rssi_image_paths_by_floor = {} if not multicast_exists else {} # Empty if skipping RSSI + + for floor in range(int(self.total_floors)): + for tos in self.tos: + timeout = 60 # seconds + + throughput_image_path = os.path.join(self.result_dir, "live_view_images", f"{self.test_name}_throughput_{tos}_{floor + 1}.png") + + if not multicast_exists: + rssi_image_path = os.path.join(self.result_dir, "live_view_images", f"{self.test_name}_rssi_{floor + 1}.png") + + start_time = time.time() + + while True: + throughput_ready = os.path.exists(throughput_image_path) + rssi_ready = True if multicast_exists else os.path.exists(rssi_image_path) + + if throughput_ready and rssi_ready: + break + + if time.time() - start_time > timeout: + print(f"Timeout: Images for TOS '{tos}' on Floor {floor + 1} not found within 60 seconds.") + break + time.sleep(1) + + if throughput_ready: + image_paths_by_tos.setdefault(tos, []).append(throughput_image_path) + + # Only check and store RSSI if not multicast + if not multicast_exists and os.path.exists(rssi_image_path): + rssi_image_paths_by_floor[floor + 1] = rssi_image_path + + return image_paths_by_tos, rssi_image_paths_by_floor + + def generate_individual_graph(self, res, report, connections_download_avg, connections_upload_avg, avg_drop_a, avg_drop_b, totalfloors=None, multicast_exists=False): + # Required when generate_individual_graph() called explicitly from mixed traffic + if totalfloors is not None: + self.total_floors = totalfloors load = "" upload_list, download_list, individual_upload_list, individual_download_list = [], [], [], [] individual_set, colors, labels = [], [], [] individual_drop_a_list, individual_drop_b_list = [], [] list1 = [[], [], [], []] data_set = {} + try: + if (self.dowebgui and self.get_live_view) or multicast_exists: + tos_images, rssi_images = self.get_live_view_images() + except Exception: + logger.error("Live View images not found") # Initialized dictionaries to store average upload ,download and drop values with respect to tos avg_res = {'Upload': { 'VO': [], @@ -1359,7 +1512,7 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne if self.direction == 'Upload': load = rate_up data_set = res['test_results'][0][1] - for client in range(len(self.real_client_list)): + for _client in range(len(self.real_client_list)): individual_download_list.append('0.0') individual_drop_a_list.append('0.0') for key, val in connections_upload_avg.items(): @@ -1372,7 +1525,7 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne if self.direction == 'Download': load = rate_down data_set = res['test_results'][0][0] - for client in range(len(self.real_client_list)): + for _client in range(len(self.real_client_list)): individual_upload_list.append('0.0') individual_drop_b_list.append('0.0') for key, val in connections_download_avg.items(): @@ -1390,7 +1543,7 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne vi_tos_list = [] vo_tos_list = [] traffic_type = (self.traffic_type.strip("lf_")).upper() - for client in range(len(self.real_client_list)): + for _client in range(len(self.real_client_list)): upload_list.append(rate_up) download_list.append(rate_down) traffic_type_list.append(traffic_type.upper()) @@ -1489,6 +1642,12 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne report.set_csv_filename(graph_png) report.move_csv_file() report.build_graph() + if (self.dowebgui and self.get_live_view) or multicast_exists: + for image_path in tos_images['BK']: + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() individual_avgupload_list = [] individual_avgdownload_list = [] for i in range(len(individual_upload_list)): @@ -1612,6 +1771,12 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne report.set_csv_filename(graph_png) report.move_csv_file() report.build_graph() + if (self.dowebgui and self.get_live_view) or multicast_exists: + for image_path in tos_images['BE']: + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() individual_avgupload_list = [] individual_avgdownload_list = [] for i in range(len(individual_upload_list)): @@ -1733,6 +1898,12 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne report.set_csv_filename(graph_png) report.move_csv_file() report.build_graph() + if (self.dowebgui and self.get_live_view) or multicast_exists: + for image_path in tos_images['VI']: + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() individual_avgupload_list = [] individual_avgdownload_list = [] for i in range(len(individual_upload_list)): @@ -1854,6 +2025,12 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne report.set_csv_filename(graph_png) report.move_csv_file() report.build_graph() + if (self.dowebgui and self.get_live_view) or multicast_exists: + for image_path in tos_images['VO']: + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() individual_avgupload_list = [] individual_avgdownload_list = [] for i in range(len(individual_upload_list)): @@ -1924,6 +2101,13 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne report.set_table_dataframe(dataframe4) report.build_table() logger.info("Graph and table for VO tos are built") + if self.dowebgui and self.get_live_view and not multicast_exists: + for _floor, rssi_image_path in rssi_images.items(): + if os.path.exists(rssi_image_path): + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() else: print("No individual graph to generate.") # storing overall throughput CSV in the report directory @@ -1934,8 +2118,12 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne for cx in self.real_time_data: for tos in self.real_time_data[cx]: if tos in self.tos and len(self.real_time_data[cx][tos]['time']) != 0: - cx_df = pd.DataFrame(self.real_time_data[cx][tos]) - cx_df.to_csv('{}/{}_{}_realtime_data.csv'.format(report.path_date_time, cx, tos), index=False) + try: + cx_df = pd.DataFrame(self.real_time_data[cx][tos]) + cx_df.to_csv('{}/{}_{}_realtime_data.csv'.format(report.path_date_time, cx, tos), index=False) + except Exception: + logger.info(f'failed cx {cx} tos {tos}') + logger.info(f"overall Data {self.real_time_data}") def get_pass_fail_list(self, test_input_list, individual_avgupload_list, individual_avgdownload_list): pass_fail_list = [] @@ -2216,6 +2404,8 @@ def main(): optional.add_argument('--device_csv_name', type=str, help='Enter the csv name to store expected values', default=None) optional.add_argument("--wait_time", type=int, help="Enter the maximum wait time for configurations to apply", default=60) optional.add_argument("--config", action="store_true", help="Specify for configuring the devices") + optional.add_argument('--get_live_view', help="If true will heatmap will be generated from testhouse automation WebGui ", action='store_true') + optional.add_argument('--total_floors', help="Total floors from testhouse automation WebGui ", default="0") args = parser.parse_args() # help summary @@ -2238,13 +2428,13 @@ def main(): loads_data = loads["download"] elif args.download: loads = {'upload': [], 'download': str(args.download).split(",")} - for i in range(len(args.download)): + for _i in range(len(args.download)): loads['upload'].append(0) loads_data = loads["download"] else: if args.upload: loads = {'upload': str(args.upload).split(","), 'download': []} - for i in range(len(args.upload)): + for _i in range(len(args.upload)): loads['download'].append(0) loads_data = loads["upload"] if args.download and args.upload: @@ -2310,7 +2500,9 @@ def main(): expected_passfail_val=args.expected_passfail_value, csv_name=args.device_csv_name, wait_time=args.wait_time, - config=args.config + config=args.config, + get_live_view=args.get_live_view, + total_floors=args.total_floors ) throughput_qos.os_type() _, configured_device, _, configuration = throughput_qos.phantom_check() @@ -2349,6 +2541,7 @@ def main(): df1.to_csv('{}/overall_throughput.csv'.format(throughput_qos.result_dir), index=False) raise ValueError("Aborting the test....") throughput_qos.build() + throughput_qos.monitor_cx() throughput_qos.start(False, False) time.sleep(10) connections_download, connections_upload, drop_a_per, drop_b_per, connections_download_avg, connections_upload_avg, avg_drop_a, avg_drop_b = throughput_qos.monitor() @@ -2365,6 +2558,19 @@ def main(): "contact": "support@candelatech.com" } throughput_qos.cleanup() + + # Update webgui running json with latest entry and test status completed + if throughput_qos.dowebgui == "True": + last_entry = throughput_qos.overall[len(throughput_qos.overall) - 1] + last_entry["status"] = "Stopped" + last_entry["timestamp"] = datetime.now().strftime("%d/%m %I:%M:%S %p") + last_entry["remaining_time"] = "0" + last_entry["end_time"] = last_entry["timestamp"] + throughput_qos.df_for_webui.append( + last_entry + ) + df1 = pd.DataFrame(throughput_qos.df_for_webui) + df1.to_csv('{}/overall_throughput.csv'.format(args.result_dir, ), index=False) if args.group_name: throughput_qos.generate_report( data=data, @@ -2386,17 +2592,6 @@ def main(): # Update webgui running json with latest entry and test status completed if throughput_qos.dowebgui == "True": - last_entry = throughput_qos.overall[len(throughput_qos.overall) - 1] - last_entry["status"] = "Stopped" - last_entry["timestamp"] = datetime.now().strftime("%d/%m %I:%M:%S %p") - last_entry["remaining_time"] = "0" - last_entry["end_time"] = last_entry["timestamp"] - throughput_qos.df_for_webui.append( - last_entry - ) - df1 = pd.DataFrame(throughput_qos.df_for_webui) - df1.to_csv('{}/overall_throughput.csv'.format(args.result_dir, ), index=False) - # copying to home directory i.e home/user_name throughput_qos.copy_reports_to_home_dir() diff --git a/py-scripts/lf_interop_real_browser_test.py b/py-scripts/lf_interop_real_browser_test.py index c8bc7b305..f528810fe 100755 --- a/py-scripts/lf_interop_real_browser_test.py +++ b/py-scripts/lf_interop_real_browser_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ Purpose: To be generic script for LANforge-Interop devices(Real clients) which runs layer4-7 traffic For now the test script supports Real Browser test for Androids. @@ -74,10 +73,7 @@ import importlib import argparse import time -import datetime import pandas as pd -import numpy as np -import matplotlib.pyplot as plt import logging import json import shutil @@ -85,7 +81,6 @@ from lf_graph import lf_bar_graph_horizontal - # Check Python version compatibility if sys.version_info[0] != 3: print("This script requires Python3") @@ -110,11 +105,9 @@ lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") - - class RealBrowserTest(Realm): def __init__(self, host, ssid, passwd, encryp, suporrted_release=None, max_speed=None, url=None, - urls_per_tenm=None, duration=None, resource_ids = None, dowebgui = False,result_dir = "",test_name = None, incremental = None,postcleanup=False,precleanup=False): + urls_per_tenm=None, duration=None, resource_ids=None, dowebgui=False, result_dir="", test_name=None, incremental=None, postcleanup=False, precleanup=False): super().__init__(lfclient_host=host, lfclient_port=8080) # Initialize attributes with provided parameters self.host = host @@ -131,8 +124,8 @@ def __init__(self, host, ssid, passwd, encryp, suporrted_release=None, max_speed self.result_dir = result_dir self.test_name = test_name self.incremental = incremental - self.postCleanUp=postcleanup - self.preCleanUp=precleanup + self.postCleanUp = postcleanup + self.preCleanUp = precleanup # Initialize additional attributes self.adb_device_list = None @@ -147,7 +140,7 @@ def __init__(self, host, ssid, passwd, encryp, suporrted_release=None, max_speed self.phone_data = None # Initialize RealDevice instance - self.devices = base_RealDevice(manager_ip = self.host, selected_bands = []) + self.devices = base_RealDevice(manager_ip=self.host, selected_bands=[]) # Initialize local realm self.local_realm = realm.Realm(lfclient_host=self.host, lfclient_port=8080) # Initialize HTTP profile for testing @@ -169,7 +162,6 @@ def __init__(self, host, ssid, passwd, encryp, suporrted_release=None, max_speed # self.generic_endps_profile.type = 'youtube' # self.generic_endps_profile.name_prefix = "yt" - @property def run(self): """ @@ -211,7 +203,7 @@ def run(self): for i in self.adb_device_list: # Get the state of the device dev_state = self.utility.get_device_state(device=i) - logging.info("Device State : {dev_state}".format(dev_state = dev_state)) + logging.info("Device State : {dev_state}".format(dev_state=dev_state)) logging.info("device state" + dev_state) # Check if the device state indicates it is connected @@ -228,7 +220,7 @@ def run(self): health[i] = self.utility.get_wifi_health_monitor(device=i, ssid=self.ssid) logging.info("health health:: ", health) logging.info("Launching Interop UI") - logging.info("health :: {health}".format(health = health)) + logging.info("health :: {health}".format(health=health)) # Launch the Interop UI for the device logging.info("Launching Interop UI") self.interop.launch_interop_ui(device=i) @@ -238,7 +230,7 @@ def run(self): # Retrieve and log resource data of phones self.phone_data = self.get_resource_data() logging.info("Phone List : ", self.phone_data) - logging.info("Phone List : {phone_data}".format(phone_data = self.phone_data)) + logging.info("Phone List : {phone_data}".format(phone_data=self.phone_data)) time.sleep(5) # Pause for 5 seconds before completing @@ -283,8 +275,8 @@ def build(self): self.http_profile.dest = '/dev/null' self.http_profile.max_speed = self.max_speed self.http_profile.requests_per_ten = self.urls_per_tenm - self.http_profile.created_cx=self.convert_to_dict(self.phone_data) - if self.preCleanUp==True: + self.http_profile.created_cx = self.convert_to_dict(self.phone_data) + if self.preCleanUp: self.precleanup() self.http_profile.created_cx.clear() # for i in self.phone_data: @@ -292,9 +284,9 @@ def build(self): # Create HTTP profile self.http_profile.create(ports=self.phone_data, sleep_time=.5, suppress_related_commands_=None, http=True, - http_ip=self.url, interop=True,timeout=1000) + http_ip=self.url, interop=True, timeout=1000) - def convert_to_dict(self,input_list): + def convert_to_dict(self, input_list): """ Creating dictionary for devices for pre_cleanup """ @@ -310,7 +302,7 @@ def convert_to_dict(self,input_list): return output_dict def get_incremental_capacity_list(self): - keys=list(self.http_profile.created_cx.keys()) + keys = list(self.http_profile.created_cx.keys()) incremental_temp = [] created_incremental_values = [] index = 0 @@ -318,8 +310,8 @@ def get_incremental_capacity_list(self): incremental_temp.append(len(keys[index:])) elif len(self.incremental) == 1 and len(keys) > 1: incremental_value = self.incremental[0] - div = len(keys)//incremental_value - mod = len(keys)%incremental_value + div = len(keys) // incremental_value + mod = len(keys) % incremental_value for i in range(div): if len(incremental_temp): @@ -353,10 +345,10 @@ def start(self): for i in self.http_profile.created_cx.keys(): while self.local_realm.json_get("/cx/" + i).get(i).get('state') != 'Run': continue - except Exception as e: + except Exception as e: # noqa: F841 pass - def start_specific(self,cx_start_list): + def start_specific(self, cx_start_list): """ Starts the layer 4-7 traffic for specific CX endpoints. @@ -382,7 +374,7 @@ def start_specific(self,cx_start_list): for i in self.http_profile.created_cx.keys(): while self.local_realm.json_get("/cx/" + i).get(i).get('state') != 'Run': continue - except Exception as e: + except Exception as e: # noqa: F841 pass # def create_generic_endp(self,query_resources,os_types_dict): @@ -483,7 +475,7 @@ def postcleanup(self): # Cleans the layer 4-7 traffic for created CX end points self.http_profile.cleanup() - def cleanup(self,os_types_dict): + def cleanup(self, os_types_dict): """ Cleans up generic endpoints and associated CX endpoints based on operating system types. @@ -533,11 +525,11 @@ def my_monitor(self, data_mon): # data in json format # Construct URL to retrieve monitoring data for all created CX endpoints data = self.local_realm.json_get("layer4/%s/list?fields=%s" % - (','.join(self.http_profile.created_cx.keys()), data_mon.replace(' ', '+'))) + (','.join(self.http_profile.created_cx.keys()), data_mon.replace(' ', '+'))) data1 = [] data = data['endpoint'] # Check if only one CX endpoint is created - if len(self.http_profile.created_cx.keys()) == 1 : + if len(self.http_profile.created_cx.keys()) == 1: for cx in self.http_profile.created_cx.keys(): if cx in data['name']: data1.append(data[data_mon]) @@ -549,7 +541,6 @@ def my_monitor(self, data_mon): data1.append(info[cx][data_mon]) return data1 - def get_resource_data(self): """ Retrieves data for Real devices connected to LANforge. @@ -616,7 +607,7 @@ def get_resource_data(self): phone_radio.append('2G/5G') return station_name - def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx_list = [] ): + def monitor_for_runtime_csv(self, duration, file_path, resource_list_sorted=[], cx_list=[]): """ Monitors runtime data for a specified duration and saves it to a CSV file. @@ -635,7 +626,6 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx # self.formatted_endtime_str = dt.strftime("%Y-%m-%d %H:%M:%S") # print("formatted_endtime_str",self.formatted_endtime_str) - self.all_cx_list.extend(cx_list) resource_ids = list(map(int, self.resource_ids.split(','))) @@ -714,10 +704,10 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx resource_hw_data = self.json_get("/resource/" + i.split(".")[0] + "/" + i.split(".")[1]) hw_version = resource_hw_data['resource']['hw version'] # Filter based on hw_version and resource_ids - if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids : + if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids: # Collect device information device_type.append('Android') - username.append(resource_hw_data['resource']['user'] ) + username.append(resource_hw_data['resource']['user']) ssid.append(alias[i]['ssid']) mac.append(alias[i]['mac']) mode.append(alias[i]['mode']) @@ -756,9 +746,9 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx if remaining_time_dt < one_minute: self.data['remaining_time_webGUI'] = ["< 1 min"] * len(self.data['status']) else: - self.data['remaining_time_webGUI'] = [str(datetime.strptime(self.data['end_time_webGUI'][0], "%Y-%m-%d %H:%M:%S") - datetime.strptime(curr_time, "%Y-%m-%d %H:%M:%S"))] * len(self.data['status']) + self.data['remaining_time_webGUI'] = [str(datetime.strptime(self.data['end_time_webGUI'][0], "%Y-%m-%d %H:%M:%S") - datetime.strptime(curr_time, "%Y-%m-%d %H:%M:%S"))] * len(self.data['status']) # noqa: E501 - c = 0 + # c = 0 # Update status and other metrics using my_monitor method self.data['status'] = self.my_monitor('status') self.data["total_urls"] = self.my_monitor('total-urls') @@ -775,7 +765,6 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx self.data["!conn"] = self.my_monitor('!conn') self.data["timeout"] = self.my_monitor('timeout') - # Store metrics specific to this iteration if cx_list: iterator = self.all_cx_list @@ -789,22 +778,21 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx # Handle present value conditions if self.data['total_urls'][i] == self.urls_per_tenm or self.data['total_urls'][i] > self.urls_per_tenm: if temp[i] == 0: - temp[i] = int(( datetime.now() - current_time ).total_seconds()) + temp[i] = int((datetime.now() - current_time).total_seconds()) else: if temp[i] == -1: temp[i] = 0 else: # Handle conditions based on total_urls_dict varibale if self.total_urls_dict: - if ((self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) == self.urls_per_tenm or (self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) > self.urls_per_tenm): + if ((self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) == self.urls_per_tenm or (self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) > self.urls_per_tenm): # noqa: E501 if temp[i] == -1: - temp[i] = int((datetime.now() - current_time ).total_seconds()) - + temp[i] = int((datetime.now() - current_time).total_seconds()) # Check if the test is stopped by the user via web GUI - if self.dowebgui == True: + if self.dowebgui: with open(self.result_dir + "/../../Running_instances/{}_{}_running.json".format(self.host, - self.test_name),'r') as file: + self.test_name), 'r') as file: data = json.load(file) if data["status"] != "Running": logging.info('Test is stopped by the user') @@ -814,7 +802,7 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx for j in range(len(num)): if self.time_data[k][j] == -1: self.time_data[k][j] = 0 - k+=1 + k += 1 self.data["end_time"] = [datetime.now().strftime("%d/%m %I:%M:%S %p")] * len(self.data["end_time"]) break @@ -822,7 +810,7 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx df1 = pd.DataFrame(self.data) # Save data to CSV file based on dowebgui condition - if self.dowebgui == True: + if self.dowebgui: df1.to_csv('{}/rb_datavalues.csv'.format(self.result_dir), index=False) else: df1.to_csv(file_path, mode='w', index=False) @@ -834,14 +822,14 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx # Finalize end_time_webGUI if self.data['end_time_webGUI'][0] < current_time.strftime('%Y-%m-%d %H:%M:%S'): - self.data['end_time_webGUI'] = [current_time.strftime('%Y-%m-%d %H:%M:%S') ] * len(self.data['name']) + self.data['end_time_webGUI'] = [current_time.strftime('%Y-%m-%d %H:%M:%S')] * len(self.data['name']) curr_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') curr_time_dt = datetime.strptime(curr_time, "%Y-%m-%d %H:%M:%S") endtime_dt = datetime.strptime(self.data['end_time_webGUI'][0], "%Y-%m-%d %H:%M:%S") self.data['remaining_time_webGUI'] = ["< 1 min"] * len(self.data['status']) else: - self.data['remaining_time_webGUI'] = [str(datetime.strptime(self.data['end_time_webGUI'][0], "%Y-%m-%d %H:%M:%S") - datetime.strptime(curr_time, "%Y-%m-%d %H:%M:%S"))] * len(self.data['status']) + self.data['remaining_time_webGUI'] = [str(datetime.strptime(self.data['end_time_webGUI'][0], "%Y-%m-%d %H:%M:%S") - datetime.strptime(curr_time, "%Y-%m-%d %H:%M:%S"))] * len(self.data['status']) # noqa: E501 # Update final metrics after monitoring loop completes self.data["total_urls"] = self.my_monitor('total-urls') @@ -859,10 +847,10 @@ def monitor_for_runtime_csv(self,duration,file_path,resource_list_sorted = [],cx self.data["timeout"] = self.my_monitor('timeout') self.data["status"] = self.my_monitor('status') - if cx_list: name = self.my_monitor('name') total_urls = self.my_monitor('total-urls') + def add_to_dict(index): for num in index: key = name[num] @@ -892,15 +880,15 @@ def add_to_dict(index): # present value if self.data['total_urls'][i] == self.urls_per_tenm or self.data['total_urls'][i] > self.urls_per_tenm: if temp[i] == 0: - temp[i] = int(( datetime.now() - current_time ).total_seconds()) + temp[i] = int((datetime.now() - current_time).total_seconds()) else: if temp[i] == -1: temp[i] = 0 else: if self.total_urls_dict: - if (self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) == self.urls_per_tenm or (self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) > self.urls_per_tenm: + if (self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) == self.urls_per_tenm or (self.data['total_urls'][i] - self.total_urls_dict[self.all_cx_list[i]][-1]) > self.urls_per_tenm: # noqa: E501 if temp[i] == -1: - temp[i] = int((datetime.now() - current_time ).total_seconds()) + temp[i] = int((datetime.now() - current_time).total_seconds()) prev_cx_list = len(self.all_cx_list) - len(cx_list) for i in range(prev_cx_list): @@ -925,7 +913,6 @@ def add_to_dict(index): axis=1 ) - temp_usernames = [] idx = 0 for i in self.all_cx_list: @@ -933,7 +920,7 @@ def add_to_dict(index): if keys[idx] in usernames_csv: temp_usernames.append(usernames_csv[keys[idx]]) labels.append(temp_usernames) - idx+=1 + idx += 1 if labels: device_type = [] @@ -963,9 +950,9 @@ def add_to_dict(index): if int(i.split(".")[1]) > 1 and alias[i]["alias"] == 'wlan0': resource_hw_data = self.json_get("/resource/" + i.split(".")[0] + "/" + i.split(".")[1]) hw_version = resource_hw_data['resource']['hw version'] - if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids and resource_hw_data['resource']['user'] in labels[-1]: + if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids and resource_hw_data['resource']['user'] in labels[-1]: # noqa: E501 temp_device_type.append('Android') - temp_username.append(resource_hw_data['resource']['user'] ) + temp_username.append(resource_hw_data['resource']['user']) temp_ssid.append(alias[i]['ssid']) temp_mac.append(alias[i]['mac']) temp_mode.append(alias[i]['mode']) @@ -1008,60 +995,60 @@ def add_to_dict(index): df = pd.DataFrame(self.data) # Store final data in CSV file based on dowebgui condition - if self.dowebgui == True: + if self.dowebgui: df.to_csv('{}/rb_datavalues.csv'.format(self.result_dir), index=False) else: df.to_csv(file_path, mode='w', index=False) - def generate_graph(self, dataset, lis, bands, graph_image_name = "uc-avg"): + def generate_graph(self, dataset, lis, bands, graph_image_name="uc-avg"): x_fig_size = 18 - y_fig_size = len(lis)*.5 + 4 + y_fig_size = len(lis) * .5 + 4 graph = lf_bar_graph_horizontal(_data_set=[dataset], _xaxis_name="Time (in seconds)", - _yaxis_name="Devices", - _yaxis_categories=[i for i in lis], - _yaxis_label=[i for i in lis], - _yaxis_step=1, - _yticks_font=8, - _yticks_rotation=None, - _graph_title="Time Taken", - _title_size=16, - _figsize= (x_fig_size,y_fig_size), - _legend_loc="best", - _legend_box=(1.0, 1.0), - _color_name=['steelblue'], - _bar_height=.50, - _show_bar_value=True, - _enable_csv=True, - _graph_image_name=graph_image_name, - _color_edge=['black'], - _color=['steelblue'], - _label=bands) + _yaxis_name="Devices", + _yaxis_categories=[i for i in lis], + _yaxis_label=[i for i in lis], + _yaxis_step=1, + _yticks_font=8, + _yticks_rotation=None, + _graph_title="Time Taken", + _title_size=16, + _figsize=(x_fig_size, y_fig_size), + _legend_loc="best", + _legend_box=(1.0, 1.0), + _color_name=['steelblue'], + _bar_height=.50, + _show_bar_value=True, + _enable_csv=True, + _graph_image_name=graph_image_name, + _color_edge=['black'], + _color=['steelblue'], + _label=bands) graph_png = graph.build_bar_graph_horizontal() return graph_png - def graph_2(self, dataset2, lis, bands,graph_image_name = "Total-url"): + def graph_2(self, dataset2, lis, bands, graph_image_name="Total-url"): x_fig_size = 18 - y_fig_size = len(lis)*.5 + 4 + y_fig_size = len(lis) * .5 + 4 graph_2 = lf_bar_graph_horizontal(_data_set=[dataset2], _xaxis_name="URLs", - _yaxis_name="Devices", - _yaxis_categories=[i for i in lis], - _yaxis_label=[i for i in lis], - _yaxis_step=1, - _yticks_font=8, - _yticks_rotation=None, - _graph_title="URLs", - _title_size=16, - _figsize= (x_fig_size,y_fig_size), - _legend_loc="best", - _legend_box=(1.0, 1.0), - _color_name=['orange'], - _bar_height=.50, - _show_bar_value=True, - _enable_csv=True, - _graph_image_name=graph_image_name, - _color_edge=['black'], - _color=['orange'], - _label=bands) + _yaxis_name="Devices", + _yaxis_categories=[i for i in lis], + _yaxis_label=[i for i in lis], + _yaxis_step=1, + _yticks_font=8, + _yticks_rotation=None, + _graph_title="URLs", + _title_size=16, + _figsize=(x_fig_size, y_fig_size), + _legend_loc="best", + _legend_box=(1.0, 1.0), + _color_name=['orange'], + _bar_height=.50, + _show_bar_value=True, + _enable_csv=True, + _graph_image_name=graph_image_name, + _color_edge=['black'], + _color=['orange'], + _label=bands) graph_png = graph_2.build_bar_graph_horizontal() return graph_png @@ -1076,7 +1063,7 @@ def generate_multiple_graphs(self, report, cx_order_list): Returns: None """ bands = ['URLs'] - total_urls = self.my_monitor('total-urls') + # total_urls = self.my_monitor('total-urls') usernames_csv = {} df = pd.DataFrame(self.data) # Update usernames_csv with names and usernames in the dataframe df, if name is in all_cx_list @@ -1089,7 +1076,6 @@ def generate_multiple_graphs(self, report, cx_order_list): axis=1 ) - # Copy total_urls_dict for manipulation total_urls_dict_copy = self.total_urls_dict.copy() @@ -1106,8 +1092,8 @@ def generate_multiple_graphs(self, report, cx_order_list): incremental_temp.append(len(keys[index:])) elif len(self.incremental) == 1 and len(keys) > 1: incremental_value = self.incremental[0] - div = len(keys)//incremental_value - mod = len(keys)%incremental_value + div = len(keys) // incremental_value + mod = len(keys) % incremental_value for i in range(div): if len(incremental_temp): @@ -1166,7 +1152,7 @@ def generate_multiple_graphs(self, report, cx_order_list): if num_list: prev_list = [] prev_list.extend(num_list) - idx+=1 + idx += 1 if to_break: break @@ -1174,10 +1160,10 @@ def generate_multiple_graphs(self, report, cx_order_list): # Iterate over labels to generate graphs and reports for i in range(len(labels)): - report.set_obj_html(f'Iteration {i+1} - Incremental {created_incremental_values[i]}',"") + report.set_obj_html(f'Iteration {i+1} - Incremental {created_incremental_values[i]}', "") report.build_objective() # Generate and set graph 2 (Total URLs vs Labels) using graph_2 method - graph2 = self.graph_2(dataset2=final_dataset[i], lis=labels[i], bands=bands,graph_image_name = f'Total-url-{i}.png' ) + graph2 = self.graph_2(dataset2=final_dataset[i], lis=labels[i], bands=bands, graph_image_name=f'Total-url-{i}.png') report.set_graph_image(graph2) report.set_csv_filename(graph2) @@ -1185,34 +1171,34 @@ def generate_multiple_graphs(self, report, cx_order_list): report.move_graph_image() report.build_graph() # Set objective HTML for time vs device completion and build objective - report.set_obj_html(f"Iteration {i+1} - Time taken Vs Device For Completing {self.urls_per_tenm} RealTime URLs","") + report.set_obj_html(f"Iteration {i+1} - Time taken Vs Device For Completing {self.urls_per_tenm} RealTime URLs", "") report.build_objective() # Generate and set graph (Time vs Device) using generate_graph method - graph = self.generate_graph(dataset=self.time_data[i], lis = labels[i], bands = bands,graph_image_name = f'uc-avg-{i}.png') + graph = self.generate_graph(dataset=self.time_data[i], lis=labels[i], bands=bands, graph_image_name=f'uc-avg-{i}.png') report.set_graph_image(graph) report.set_csv_filename(graph) report.move_csv_file() report.move_graph_image() report.build_graph() - report.set_obj_html(f"Detailed Result Table - Iteration {i+1} ", f"The below tables provides detailed information for the incremental value {created_incremental_values[i]} of the web browsing test.") + report.set_obj_html(f"Detailed Result Table - Iteration {i+1} ", f"The below tables provides detailed information for the incremental value {created_incremental_values[i]} of the web browsing test.") # noqa: E501 report.build_objective() # Prepare dataframe with detailed result information dataframe = { - " DEVICE TYPE " : self.device_type[i], - " Username " : self.username[i], - " SSID " : self.ssid[i] , - " MAC " : self.mac[i], - " Channel " : self.channel[i], - " Mode " : self.mode[i], - " UC-MIN (ms) " : self.req_uc_min_val[i], - " UC-MIN (ms) " : self.req_uc_max_val[i], - " UC-MIN (ms) " : self.req_uc_avg_val[i], - " Total URLs " : self.req_total_urls[i], - " Total Errors " : self.req_total_err[i], - " RSSI " : self.rssi[i], + " DEVICE TYPE ": self.device_type[i], + " Username ": self.username[i], + " SSID ": self.ssid[i], + " MAC ": self.mac[i], + " Channel ": self.channel[i], + " Mode ": self.mode[i], + " UC-MIN (ms) ": self.req_uc_min_val[i], + " UC-MAX (ms) ": self.req_uc_max_val[i], + " UC-AVG (ms) ": self.req_uc_avg_val[i], + " Total URLs ": self.req_total_urls[i], + " Total Errors ": self.req_total_err[i], + " RSSI ": self.rssi[i], 'Link Speed': self.tx_rate[i] } @@ -1220,39 +1206,38 @@ def generate_multiple_graphs(self, report, cx_order_list): report.set_table_dataframe(dataframe1) report.build_table() - def generate_report(self, date, file_path, test_setup_info, dataset2, dataset, lis, bands, total_urls, uc_min_value, report_path = '', cx_order_list = []): + def generate_report(self, date, file_path, test_setup_info, dataset2, dataset, lis, bands, total_urls, uc_min_value, report_path='', cx_order_list=[]): logging.info("Creating Reports") - if self.dowebgui == True and report_path == '': + if self.dowebgui and report_path == '': report = lf_report.lf_report(_results_dir_name="RealBrowser_Test_report", _output_html="realbrowser.html", - _output_pdf="realbrowser.pdf", _path=self.result_dir) + _output_pdf="realbrowser.pdf", _path=self.result_dir) else: report = lf_report.lf_report(_results_dir_name="RealBrowser_Test_report", _output_html="realbrowser.html", - _output_pdf="realbrowser.pdf", _path=report_path) + _output_pdf="realbrowser.pdf", _path=report_path) report_path_date_time = report.get_path_date_time() - shutil.move('realBrowser.csv',report_path_date_time) + shutil.move('realBrowser.csv', report_path_date_time) report.set_title("Real Browser Test") report.set_date(date) report.build_banner() report.set_obj_html("Objective", "The Candela Web browser test is designed to measure the Access Point performance and stability by browsing multiple websites in real clients like" - "android, Linux, windows, and IOS which are connected to the access point. This test allows the user to choose the options like website link, the" - "number of times the page has to browse, and the Time taken to browse the page. Along with the performance other measurements made are client" - "connection times, Station 4-Way Handshake time, DHCP times, and more. The expected behavior is for the AP to be able to handle several stations" - "(within the limitations of the AP specs) and make sure all clients can browse the page.") + "android, Linux, windows, and IOS which are connected to the access point. This test allows the user to choose the options like website link, the" + "number of times the page has to browse, and the Time taken to browse the page. Along with the performance other measurements made are client" + "connection times, Station 4-Way Handshake time, DHCP times, and more. The expected behavior is for the AP to be able to handle several stations" + "(within the limitations of the AP specs) and make sure all clients can browse the page.") report.build_objective() report.set_table_title("Input Parameters") report.build_table_title() report.test_setup_table(value="Test Setup Information", test_setup_data=test_setup_info) - - report.set_obj_html("RealTime URL per device ","") + report.set_obj_html("RealTime URL per device ", "") report.build_objective() # Graph 1 if cx_order_list: self.generate_multiple_graphs(report, cx_order_list) else: - graph2 = self.graph_2(dataset2 = dataset2, lis=lis, bands=bands) + graph2 = self.graph_2(dataset2=dataset2, lis=lis, bands=bands) report.set_graph_image(graph2) report.set_csv_filename(graph2) report.move_csv_file() @@ -1260,9 +1245,9 @@ def generate_report(self, date, file_path, test_setup_info, dataset2, dataset, l report.build_graph() # Graph 2 - report.set_obj_html(f"Time taken Vs Device For Completing {self.urls_per_tenm} RealTime URLs","") + report.set_obj_html(f"Time taken Vs Device For Completing {self.urls_per_tenm} RealTime URLs", "") report.build_objective() - graph = self.generate_graph(dataset=dataset, lis = lis, bands = bands) + graph = self.generate_graph(dataset=dataset, lis=lis, bands=bands) report.set_graph_image(graph) report.set_csv_filename(graph) report.move_csv_file() @@ -1285,7 +1270,6 @@ def generate_report(self, date, file_path, test_setup_info, dataset2, dataset, l resource_ids = list(map(int, self.resource_ids.split(','))) eid_data = self.json_get("ports?fields=alias,mac,mode,Parent Dev,rx-rate,tx-rate,ssid,signal,channel") - for alias in eid_data["interfaces"]: for i in alias: # alias[i]['mac'] alias[i]['ssid'] alias[i]['mode'] resource_hw_data['resource']['user'] @@ -1294,7 +1278,7 @@ def generate_report(self, date, file_path, test_setup_info, dataset2, dataset, l hw_version = resource_hw_data['resource']['hw version'] if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids: device_type.append('Android') - username.append(resource_hw_data['resource']['user'] ) + username.append(resource_hw_data['resource']['user']) ssid.append(alias[i]['ssid']) mac.append(alias[i]['mac']) mode.append(alias[i]['mode']) @@ -1302,24 +1286,24 @@ def generate_report(self, date, file_path, test_setup_info, dataset2, dataset, l channel.append(alias[i]['channel']) tx_rate.append(alias[i]['tx-rate']) total_urls = self.my_monitor('total-urls') - urls_per_sec = self.my_monitor('urls/s') + # urls_per_sec = self.my_monitor('urls/s') uc_min_val = self.my_monitor('uc-min') uc_avg_val = self.my_monitor('uc-avg') uc_max_val = self.my_monitor('uc-max') total_err = self.my_monitor('total-err') dataframe = { - " DEVICE TYPE " : device_type, - " Username " : username, - " SSID " : ssid , - " MAC " : mac, - " Channel " : channel, - " Mode " : mode, - " UC-MIN (ms) " : uc_min_val, - " UC-MAX (ms) " : uc_max_val, - " UC-AVG (ms) " : uc_avg_val, - " Total URLs " : total_urls, - " Total Errors " : total_err, - " RSSI " : rssi, + " DEVICE TYPE ": device_type, + " Username ": username, + " SSID ": ssid, + " MAC ": mac, + " Channel ": channel, + " Mode ": mode, + " UC-MIN (ms) ": uc_min_val, + " UC-MAX (ms) ": uc_max_val, + " UC-AVG (ms) ": uc_avg_val, + " Total URLs ": total_urls, + " Total Errors ": total_err, + " RSSI ": rssi, 'Link Speed': tx_rate } dataframe1 = pd.DataFrame(dataframe) @@ -1330,24 +1314,25 @@ def generate_report(self, date, file_path, test_setup_info, dataset2, dataset, l report.set_table_title("Overall Results") report.build_table_title() dataframe2 = { - " DEVICE" : username, - " TOTAL ERRORS " : total_err, - } + " DEVICE": username, + " TOTAL ERRORS ": total_err, + } dataframe3 = pd.DataFrame(dataframe2) report.set_table_dataframe(dataframe3) report.build_table() report.build_footer() - html_file = report.write_html() + report.write_html() report.write_pdf() - if self.dowebgui == True: + if self.dowebgui: for i in range(len(self.data["end_time_webGUI"])): if self.data["status"][i] == "Run": self.data["status"][i] = "Completed" df = pd.DataFrame(self.data) - if self.dowebgui == True: + if self.dowebgui: df.to_csv('{}/rb_datavalues.csv'.format(self.result_dir), index=False) + def main(): help_summary = '''\ The Candela Web browser test is designed to measure the Access Point performance and stability by browsing multiple websites in real clients like @@ -1429,23 +1414,22 @@ def main(): ''') - - optional=parser.add_argument_group('Optional arguments to run lf_interop_real_browser_test.py') + optional = parser.add_argument_group('Optional arguments to run lf_interop_real_browser_test.py') parser.add_argument("--host", "--mgr", "--parent_port", dest="host", help='specify the GUI to connect to, assumes port ' - '8080') + '8080') parser.add_argument("--ssid", default="ssid_wpa_2g", help='specify ssid on which the test will be running') parser.add_argument("--passwd", default="something", help='specify encryption password on which the test will ' - 'be running') + 'be running') parser.add_argument("--encryp", default="psk", help='specify the encryption type on which the test will be ' 'running eg :open|psk|psk2|sae|psk2jsae') parser.add_argument("--url", default="www.google.com", help='specify the url you want to test on') parser.add_argument("--max_speed", type=int, default=0, help='specify the max speed you want in bytes') parser.add_argument("--urls_per_tenm", type=int, default=100, help='specify the number of url you want to test on ' - 'per minute') + 'per minute') parser.add_argument('--duration', type=str, help='time to run traffic') - optional.add_argument('--test_name',help='Specify test name to store the runtime csv results', default=None) - parser.add_argument('--dowebgui',help="If true will execute script for webgui", default=False, type=bool) - parser.add_argument('--result_dir',help="Specify the result dir to store the runtime logs ", default='') + optional.add_argument('--test_name', help='Specify test name to store the runtime csv results', default=None) + parser.add_argument('--dowebgui', help="If true will execute script for webgui", default=False, type=bool) + parser.add_argument('--result_dir', help="Specify the result dir to store the runtime logs ", default='') parser.add_argument("--lf_logger_config_json", help="[log configuration] --lf_logger_config_json , json configuration of logger") parser.add_argument("--log_level", help="[log configuration] --log_level debug info warning error critical") @@ -1453,10 +1437,10 @@ def main(): parser.add_argument('--device_list', type=str, help='provide resource_ids of android devices. for instance: "10,12,14"') parser.add_argument('--webgui_incremental', help="Specify the incremental values <1,2,3..>", type=str) - parser.add_argument('--incremental', help="to add incremental capacity to run the test", action = 'store_true') - optional.add_argument('--no_laptops', help="run the test without laptop devices", action = 'store_false') - parser.add_argument('--postcleanup', help="Cleanup the cross connections after test is stopped", action = 'store_true') - parser.add_argument('--precleanup', help="Cleanup the cross connections before test is started", action = 'store_true') + parser.add_argument('--incremental', help="to add incremental capacity to run the test", action='store_true') + optional.add_argument('--no_laptops', help="run the test without laptop devices", action='store_false') + parser.add_argument('--postcleanup', help="Cleanup the cross connections after test is stopped", action='store_true') + parser.add_argument('--precleanup', help="Cleanup the cross connections before test is started", action='store_true') parser.add_argument('--help_summary', help='Show summary of what this script does', action="store_true") args = parser.parse_args() @@ -1479,32 +1463,31 @@ def main(): logger_config.load_lf_logger_config() # TODO refactor to be logger for consistency - logg = logging.getLogger(__name__) - + logging.getLogger(__name__) # Extract the URL from args and remove 'http://' or 'https://' url = args.url.replace("http://", "").replace("https://", "") # Initialize an instance of RealBrowserTest with various parameters obj = RealBrowserTest(host=args.host, ssid=args.ssid, passwd=args.passwd, encryp=args.encryp, - suporrted_release=["7.0", "10", "11", "12"], max_speed=args.max_speed, - url=url, urls_per_tenm=args.urls_per_tenm, duration=args.duration, - resource_ids = args.device_list, dowebgui = args.dowebgui, - result_dir = args.result_dir,test_name = args.test_name, incremental = args.incremental,postcleanup=args.postcleanup, - precleanup=args.precleanup) + suporrted_release=["7.0", "10", "11", "12"], max_speed=args.max_speed, + url=url, urls_per_tenm=args.urls_per_tenm, duration=args.duration, + resource_ids=args.device_list, dowebgui=args.dowebgui, + result_dir=args.result_dir, test_name=args.test_name, incremental=args.incremental, postcleanup=args.postcleanup, + precleanup=args.precleanup) # Initialize empty lists and dictionaries for resource management resource_ids_sm = [] resource_set = set() resource_list = [] - os_types_dict = {} + # os_types_dict = {} # android_devices = [] # other_os_list = [] # android_list = [] # other_list = [] resource_ids_generated = "" # Process resource IDs when web GUI is enabled - if args.dowebgui == True : + if args.dowebgui: # Split resource IDs from args into a list resource_ids_sm = args.device_list.split(',') # Convert list to set to remove duplicates @@ -1515,13 +1498,13 @@ def main(): resource_ids_generated = ','.join(resource_list) resource_list_sorted = resource_list # Query devices based on the generated resource IDs - selected_devices,report_labels,selected_macs = obj.devices.query_user(dowebgui = args.dowebgui, device_list = resource_ids_generated) + selected_devices, report_labels, selected_macs = obj.devices.query_user(dowebgui=args.dowebgui, device_list=resource_ids_generated) # Modify obj.resource_ids to include only the second part of each ID (after '.') obj.resource_ids = ",".join(id.split(".")[1] for id in args.device_list.split(",")) - else : + else: # Case where args.no_laptops flag is set # if args.no_laptops: - # Retrieve all Android devices if no_laptops flag is True + # Retrieve all Android devices if no_laptops flag is True obj.android_devices = obj.devices.get_devices(only_androids=True) # else: # # Retrieve all devices and their OS types if no_laptops flag is False @@ -1558,7 +1541,7 @@ def main(): # Extract the second part of each Android device ID and convert to integers modified_list = list(map(lambda item: int(item.split('.')[1]), obj.android_devices)) - modified_other_os_list = list(map(lambda item: int(item.split('.')[1]), obj.other_os_list)) + # modified_other_os_list = list(map(lambda item: int(item.split('.')[1]), obj.other_os_list)) # Verify if all resource IDs are valid for Android devices resource_ids = [int(x) for x in sorted_string.split(',')] @@ -1599,11 +1582,11 @@ def main(): new_android = [int(item.split('.')[1]) for item in obj.android_list] resource_ids = sorted(new_android) - available_resources=list(set(resource_ids)) + available_resources = list(set(resource_ids)) else: # Query user to select devices if no resource IDs are provided - selected_devices,report_labels,selected_macs = obj.devices.query_user() + selected_devices, report_labels, selected_macs = obj.devices.query_user() # Handle cases where no devices are selected if not selected_devices: logging.info("devices donot exist..!!") @@ -1647,14 +1630,14 @@ def main(): resource_set = set(resource_list) resource_list_sorted = sorted(resource_set) resource_ids_generated = ','.join(resource_list_sorted) - available_resources=list(resource_set) + available_resources = list(resource_set) logger.info("Devices available: {}".format(available_resources)) - if len(available_resources)==0: + if len(available_resources) == 0: logging.info("There no devices available which are selected") exit() # Handle incremental values input if resource IDs are specified and in not specified case. - if args.incremental and not args.webgui_incremental : + if args.incremental and not args.webgui_incremental: if obj.resource_ids: obj.incremental = input('Specify incremental values as 1,2,3 : ') obj.incremental = [int(x) for x in obj.incremental.split(',')] @@ -1692,13 +1675,13 @@ def main(): logging.info("Initiating Test...") obj.build() time.sleep(5) - #TODO : To create cx for laptop devices + # TODO : To create cx for laptop devices # Create end-points for devices other than Android if specified # if (not args.no_laptops) and obj.other_list: # obj.create_generic_endp(obj.other_list,os_types_dict) keys = list(obj.http_profile.created_cx.keys()) - if len(keys)==0: + if len(keys) == 0: logger.error("Selected Devices are not available in the lanforge") exit(1) cx_order_list = [] @@ -1706,7 +1689,7 @@ def main(): file_path = "" if args.duration.endswith('s') or args.duration.endswith('S'): - args.duration = round(int(args.duration[0:-1])/60,2) + args.duration = round(int(args.duration[0:-1]) / 60, 2) elif args.duration.endswith('m') or args.duration.endswith('M'): args.duration = int(args.duration[0:-1]) @@ -1718,27 +1701,27 @@ def main(): args.duration = int(args.duration) if args.incremental: - incremental_capacity_list_values=obj.get_incremental_capacity_list() - if incremental_capacity_list_values[-1]!=len(available_resources): + incremental_capacity_list_values = obj.get_incremental_capacity_list() + if incremental_capacity_list_values[-1] != len(available_resources): logger.error("Incremental capacity doesnt match available devices") - if args.postcleanup==True: + if args.postcleanup: obj.postcleanup() exit(1) # Process resource IDs and incremental values if specified if obj.resource_ids: if obj.incremental: - test_setup_info_incremental_values = ','.join(map(str, obj.incremental)) + test_setup_info_incremental_values = ','.join(map(str, obj.incremental)) if len(obj.incremental) == len(available_resources): test_setup_info_total_duration = args.duration elif len(obj.incremental) == 1 and len(available_resources) > 1: if obj.incremental[0] == len(available_resources): test_setup_info_total_duration = args.duration else: - div = len(available_resources)//obj.incremental[0] - mod = len(available_resources)%obj.incremental[0] + div = len(available_resources) // obj.incremental[0] + mod = len(available_resources) % obj.incremental[0] if mod == 0: - test_setup_info_total_duration = args.duration * (div ) + test_setup_info_total_duration = args.duration * (div) else: test_setup_info_total_duration = args.duration * (div + 1) else: @@ -1773,7 +1756,7 @@ def main(): if index < len(keys): cx_order_list.append(keys[index:]) - start_time_webGUI = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + # start_time_webGUI = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # Update start and end times for webGUI for i in range(len(cx_order_list)): @@ -1792,67 +1775,64 @@ def main(): # elif len(obj.incremental) != 1 and len(keys) > 1: # end_time_webGUI = (datetime.now() + timedelta(minutes = obj.total_duration)).strftime('%Y-%m-%d %H:%M:%S') - end_time_webGUI = (datetime.now() + timedelta(minutes = obj.total_duration)).strftime('%Y-%m-%d %H:%M:%S') + end_time_webGUI = (datetime.now() + timedelta(minutes=obj.total_duration)).strftime('%Y-%m-%d %H:%M:%S') obj.data['end_time_webGUI'] = [end_time_webGUI] * len(keys) - obj.start_specific(cx_order_list[i]) if cx_order_list[i]: - logging.info("Test started on Devices with resource Ids : {selected}".format(selected = cx_order_list[i])) + logging.info("Test started on Devices with resource Ids : {selected}".format(selected=cx_order_list[i])) else: - logging.info("Test started on Devices with resource Ids : {selected}".format(selected = cx_order_list[i])) + logging.info("Test started on Devices with resource Ids : {selected}".format(selected=cx_order_list[i])) # duration = 60 * args.duration file_path = "realBrowser.csv" - start_time = time.time() + # start_time = time.time() df = pd.DataFrame(obj.data) if end_time_webGUI < datetime.now().strftime('%Y-%m-%d %H:%M:%S'): obj.data['remaining_time_webGUI'] = ['0:00'] * len(keys) else: date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - obj.data['remaining_time_webGUI'] = [datetime.strptime(end_time_webGUI,"%Y-%m-%d %H:%M:%S") - datetime.strptime(date_time,"%Y-%m-%d %H:%M:%S")] * len(keys) + obj.data['remaining_time_webGUI'] = [datetime.strptime(end_time_webGUI, "%Y-%m-%d %H:%M:%S") - datetime.strptime(date_time, "%Y-%m-%d %H:%M:%S")] * len(keys) # Monitor runtime and save results - if args.dowebgui == True: + if args.dowebgui: file_path = os.path.join(obj.result_dir, "../../Running_instances/{}_{}_running.json".format(obj.host, obj.test_name)) if os.path.exists(file_path): with open(file_path, 'r') as file: data = json.load(file) if data["status"] != "Running": break - obj.monitor_for_runtime_csv(args.duration,file_path,resource_list_sorted,cx_order_list[i]) + obj.monitor_for_runtime_csv(args.duration, file_path, resource_list_sorted, cx_order_list[i]) else: - obj.monitor_for_runtime_csv(args.duration,file_path,resource_list_sorted,cx_order_list[i]) + obj.monitor_for_runtime_csv(args.duration, file_path, resource_list_sorted, cx_order_list[i]) # time.sleep(duration) else: cx_order_list.append(keys[index:]) obj.start() if obj.resource_ids: - logging.info("Test started on Devices with resource Ids : {selected}".format(selected = obj.resource_ids)) + logging.info("Test started on Devices with resource Ids : {selected}".format(selected=obj.resource_ids)) else: - logging.info("Test started on Devices with resource Ids : {selected}".format(selected = args.device_list)) + logging.info("Test started on Devices with resource Ids : {selected}".format(selected=args.device_list)) # Set duration and file path for monitoring - duration = 60 * args.duration + # duration = 60 * args.duration file_path = "realBrowser.csv" - - - start_time = time.time() + # start_time = time.time() obj.data["name"] = obj.my_monitor('name') obj.data["start_time_webGUI"] = [datetime.now().strftime('%Y-%m-%d %H:%M:%S')] * len(keys) - obj.data['end_time_webGUI'] = [(datetime.now() + timedelta(minutes = args.duration)).strftime('%Y-%m-%d %H:%M:%S')] * len(keys) + obj.data['end_time_webGUI'] = [(datetime.now() + timedelta(minutes=args.duration)).strftime('%Y-%m-%d %H:%M:%S')] * len(keys) # Monitor runtime and save results - if args.dowebgui == True: + if args.dowebgui: # FOR WEBGUI, -This fumction is called to fetch the runtime data from layer-4 - obj.monitor_for_runtime_csv(args.duration,file_path,resource_list_sorted,cx_order_list) + obj.monitor_for_runtime_csv(args.duration, file_path, resource_list_sorted, cx_order_list) else: - obj.monitor_for_runtime_csv(args.duration,file_path,resource_list_sorted,cx_order_list) + obj.monitor_for_runtime_csv(args.duration, file_path, resource_list_sorted, cx_order_list) # as test not running on laptop devices --- no waiting for time to complete # time.sleep(duration) @@ -1860,21 +1840,20 @@ def main(): obj.stop() # Generate CSV for webGUI results if dowebgui is True - if args.dowebgui == True: + if args.dowebgui: df = pd.DataFrame(obj.data) df.to_csv('{}/rb_datavalues.csv'.format(obj.result_dir), index=False) # Additional setup for generating reports and post-cleanup if obj.resource_ids: - uc_avg_val = obj.my_monitor('uc-avg') + # uc_avg_val = obj.my_monitor('uc-avg') total_urls = obj.my_monitor('total-urls') - rx_bytes_val = obj.my_monitor('bytes-rd') - rx_rate_val = obj.my_monitor('rx rate') + # rx_bytes_val = obj.my_monitor('bytes-rd') + # rx_rate_val = obj.my_monitor('rx rate') - if args.dowebgui == True: + if args.dowebgui: obj.data_for_webui["total_urls"] = total_urls # storing the layer-4 url data at the end of test - date = str(datetime.now()).split(",")[0].replace(" ", "-").split(".")[0] # Retrieve resource data for Android devices @@ -1892,19 +1871,19 @@ def main(): resource_hw_data = obj.json_get("/resource/" + i.split(".")[0] + "/" + i.split(".")[1]) hw_version = resource_hw_data['resource']['hw version'] if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids: - username.append(resource_hw_data['resource']['user'] ) + username.append(resource_hw_data['resource']['user']) # Construct device list string for report device_list_str = ','.join([f"{name} ( Android )" for name in username]) # Setup test setup information for report test_setup_info = { - "Testname" : args.test_name, - "Device List" : device_list_str , - "No of Devices" : "Total" + "( " + str(len(phone_list)) + " )", - "Incremental Values" : "", - "Required URL Count" : args.urls_per_tenm, - "URL" : args.url + "Testname": args.test_name, + "Device List": device_list_str, + "No of Devices": "Total" + "( " + str(len(phone_list)) + " )", + "Incremental Values": "", + "Required URL Count": args.urls_per_tenm, + "URL": args.url } # if obj.incremental: # test_setup_info['Duration per Iteration (min)']= str(test_setup_info_duration_per_iteration)+ " (min)" @@ -1927,7 +1906,7 @@ def main(): # Handle incremental values and generate reports accordingly prev_inc_value = 0 - if obj.resource_ids and obj.incremental : + if obj.resource_ids and obj.incremental: for i in range(len(cx_order_list)): df = pd.DataFrame(obj.data) names_to_increment = cx_order_list[i] @@ -1949,15 +1928,15 @@ def main(): ) df1 = pd.DataFrame(obj.data) - if args.dowebgui == True: + if args.dowebgui: df1.to_csv('{}/rb_datavalues.csv'.format(obj.result_dir), index=False) df1.to_csv(file_path, mode='w', index=False) else: df1.to_csv(file_path, mode='w', index=False) # Generate report for the test - obj.generate_report(date,"realBrowser.csv", test_setup_info = test_setup_info, dataset2 = dataset2, dataset = dataset, lis = lis, bands = bands, total_urls = total_urls, uc_min_value = uc_min_value , cx_order_list = cx_order_list) + obj.generate_report(date, "realBrowser.csv", test_setup_info=test_setup_info, dataset2=dataset2, dataset=dataset, lis=lis, bands=bands, total_urls=total_urls, uc_min_value=uc_min_value, cx_order_list=cx_order_list) # noqa: E501 elif obj.resource_ids: - obj.generate_report(date,"realBrowser.csv", test_setup_info = test_setup_info, dataset2 = dataset2, dataset = dataset, lis = lis, bands = bands, total_urls = total_urls, uc_min_value = uc_min_value ) + obj.generate_report(date, "realBrowser.csv", test_setup_info=test_setup_info, dataset2=dataset2, dataset=dataset, lis=lis, bands=bands, total_urls=total_urls, uc_min_value=uc_min_value) # Perform post-cleanup operations if args.postcleanup: @@ -1968,7 +1947,7 @@ def main(): # obj.cleanup(os_types_dict) # Save webGUI data if dowebgui is True - if args.dowebgui == True and obj.resource_ids: + if args.dowebgui and obj.resource_ids: resource_ids = list(map(int, obj.resource_ids.split(','))) obj.data_for_webui["status"] = ["Completed"] * len(resource_ids) obj.data_for_webui["start_time_webGUI"] = obj.data["start_time_webGUI"] @@ -1976,5 +1955,7 @@ def main(): obj.data_for_webui["remaining_time_webGUI"] = "0" df1 = pd.DataFrame(obj.data_for_webui) df1.to_csv('{}/rb_datavalues.csv'.format(obj.result_dir), index=False) + + if __name__ == '__main__': main() diff --git a/py-scripts/lf_interop_rvr_test.py b/py-scripts/lf_interop_rvr_test.py index c80d92149..e29b4951f 100755 --- a/py-scripts/lf_interop_rvr_test.py +++ b/py-scripts/lf_interop_rvr_test.py @@ -1,25 +1,24 @@ #!/usr/bin/env python3 -# flake8: noqa - """ NAME: lf_interop_rvr_test.py PURPOSE: lf_interop_rvr_test.py will measure the performance of stations over a certain distance of the DUT. Distance is emulated using programmable attenuators and throughput test is run at each distance/RSSI step. -python3 -u lf_interop_rvr_test.py --mgr 192.168.244.97 --mgr_port 8080 --upstream eth1 --security wpa2 --ssid "SIDDDD" --password "sdvsdvs" --traffic_type lf_tcp --traffic 10000000 --test_duration 1m --sta_names 1.133.wlan0,1.160.en0 --atten_serno 1008 920 --atten_idx 1,2 all --atten_val "10..10..10" +python3 -u lf_interop_rvr_test.py --mgr 192.168.244.97 --mgr_port 8080 --upstream eth1 --security wpa2 --ssid "SIDDDD" --password "sdvsdvs" --traffic_type lf_tcp --traffic 10000000 --test_duration 1m --sta_names 1.133.wlan0,1.160.en0 --atten_serno 1008 920 --atten_idx 1,2 all --atten_val "10..10..10" # noqa: E501 Use './lf_interop_rvr_test.py --help' to see command line usage and options Copyright 2021 Candela Technologies Inc License: Free to distribute and modify. LANforge systems must be licensed. """ +import argparse +from datetime import datetime, timedelta import sys import os import importlib import logging import time import pandas as pd -import random import csv import json @@ -42,13 +41,10 @@ lf_bar_graph_horizontal = lf_graph.lf_bar_graph_horizontal interop_modify = importlib.import_module("py-scripts.lf_interop_modify") -import time -from datetime import datetime, timedelta logger = logging.getLogger(__name__) lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") -import argparse if 'py-json' not in sys.path: sys.path.append(os.path.join(os.path.abspath('..'), 'py-json')) @@ -64,9 +60,9 @@ def __init__(self, ssid=None, security=None, password="", create_sta=True, name_ mode=0, ap_model="", traffic_type="lf_tcp,lf_udp", traffic_direction="bidirectional", side_a_min_rate=0, side_a_max_rate=0, sta_names=None, side_b_min_rate=56, side_b_max_rate=0, number_template="00000", test_duration="2m", - sta_list=[1, 1],atten_dict={"2222":['all']}, + sta_list=[1, 1], atten_dict={"2222": ['all']}, atten_val=[["0"]], traffic=500, radio_list=['wiphy0', 'wiphy3'], - test_name=None,dowebgui=False,result_dir='',multiple_attenuation_values = False, + test_name=None, dowebgui=False, result_dir='', multiple_attenuation_values=False, _debug_on=False, _exit_on_error=False, _exit_on_fail=False): super().__init__(lfclient_host=host, lfclient_port=port), @@ -109,18 +105,19 @@ def __init__(self, ssid=None, security=None, password="", create_sta=True, name_ self.attenuator_profile = self.new_attenuator_profile() self.atten_dict = atten_dict self.atten_values = atten_val - self.multiple_attenuation_values=multiple_attenuation_values + self.multiple_attenuation_values = multiple_attenuation_values self.list_of_data = None self.attenuator_db_signal = [] self.throughput_phone = None self.overall_data = [] - self.dowebgui=dowebgui + self.dowebgui = dowebgui self.stop_test = False - self.test_name=test_name - self.result_dir=result_dir + self.test_name = test_name + self.result_dir = result_dir self.overall_df = [] self.overall_end_time = None self.overall_start_time = None + def initialize_attenuator(self): for atten in self.atten_dict: self.attenuator_profile.atten_serno = atten @@ -134,8 +131,8 @@ def initialize_attenuator(self): self.attenuator_profile.create() # self.attenuator_profile.show() - def set_attenuation(self, serial ,idx, value): - logger.info("setting attenutor {} module {} to {}".format(serial ,idx, value)) + def set_attenuation(self, serial, idx, value): + logger.info("setting attenutor {} module {} to {}".format(serial, idx, value)) self.attenuator_profile.atten_serno = serial self.attenuator_profile.atten_idx = idx self.attenuator_profile.atten_val = str(int(value) * 10) @@ -181,7 +178,7 @@ def cleanup(self): def build(self): throughput_dbm = {} throughput_phone = {} - phone_signal = {} + # phone_signal = {} if len(self.traffic_type) == 2: throughput_dbm = {f"{self.traffic_type[0]}": {}, f"{self.traffic_type[1]}": {}} throughput_phone = {f"{self.traffic_type[0]}": {}, f"{self.traffic_type[1]}": {}} @@ -202,7 +199,7 @@ def build(self): signal = [] for atten in self.atten_dict: for mod in self.atten_dict[atten]["modules"]: - self.set_attenuation(atten,mod,value=self.atten_dict[atten]["attenuation"][index]) + self.set_attenuation(atten, mod, value=self.atten_dict[atten]["attenuation"][index]) self.start_l3() time.sleep(20) upload, download = self.monitor() @@ -275,13 +272,13 @@ def get_resource_data(self): os_type = ( "Windows" if "Windows" in resource_hw_data['resource']['device type'] else "Mac" if "Mac OS" in resource_hw_data['resource']['device type'] else - "Linux" if ("Linux/Interop" in resource_hw_data['resource']['device type'] and + "Linux" if ("Linux/Interop" in resource_hw_data['resource']['device type'] and not resource_hw_data['resource']["ct-kernel"]) else "Android" if "Android" in resource_hw_data['resource']['device type'] else "IOS" if "IOS" in resource_hw_data['resource']['device type'] else "" ) - os_type_list.append(os_type) + os_type_list.append(os_type) # phone_radio.append(alias[i]['mode']) # Mapping Radio Name in human readable format if 'a' not in alias[i]['mode'] or "20" in alias[i]['mode']: @@ -305,7 +302,7 @@ def monitor(self): start_time = datetime.now() end_time = start_time + timedelta(seconds=int(self.test_duration)) index = -1 - connections = dict.fromkeys(list(self.cx_profile.created_cx.keys()), float(0)) + # connections = dict.fromkeys(list(self.cx_profile.created_cx.keys()), float(0)) [(upload.append([]), download.append([])) for i in range(len(self.cx_profile.created_cx))] while datetime.now() < end_time: index += 1 @@ -314,7 +311,7 @@ def monitor(self): ','.join(self.cx_profile.created_cx.keys()), ",".join(['bps rx a', 'bps rx b']))).values())[2:] throughput[index] = list( map(lambda i: [x for x in i.values()], response)) - curr_time=datetime.now() + curr_time = datetime.now() timestamps.append(curr_time.strftime("%Y-%m-%d %H:%M:%S")) # if test is executed from webui then updating csv in realtime if self.dowebgui: @@ -331,16 +328,16 @@ def monitor(self): if not self.overall_end_time or not self.overall_start_time: self.overall_start_time = start_time - self.overall_end_time = start_time + timedelta( seconds=(int(self.test_duration) * len(self.atten_values[0]))+ 20 * (len(self.atten_values[0])-1)) + self.overall_end_time = start_time + timedelta(seconds=(int(self.test_duration) * len(self.atten_values[0])) + 20 * (len(self.atten_values[0]) - 1)) time_difference = abs(self.overall_end_time - curr_time) - - overall_total_hours=time_difference.total_seconds() / 3600 - overall_remaining_minutes=(overall_total_hours % 1) * 60 - remaining_minutes_instrf=[str(int(overall_total_hours)) + " hr and " + str(int(overall_remaining_minutes)) + " min" if int(overall_total_hours) != 0 or int(overall_remaining_minutes) != 0 else '<1 min'][0] - indivisual_df = [download_sum,upload_sum,curr_time.strftime("%Y-%m-%d %H:%M:%S"),"Running",self.overall_start_time.strftime("%Y-%m-%d %H:%M:%S"),self.overall_end_time.strftime("%Y-%m-%d %H:%M:%S"),remaining_minutes_instrf] + + overall_total_hours = time_difference.total_seconds() / 3600 + overall_remaining_minutes = (overall_total_hours % 1) * 60 + remaining_minutes_instrf = [str(int(overall_total_hours)) + " hr and " + str(int(overall_remaining_minutes)) + " min" if int(overall_total_hours) != 0 or int(overall_remaining_minutes) != 0 else '<1 min'][0] # noqa: E501 + indivisual_df = [download_sum, upload_sum, curr_time.strftime("%Y-%m-%d %H:%M:%S"), "Running", self.overall_start_time.strftime("%Y-%m-%d %H:%M:%S"), self.overall_end_time.strftime("%Y-%m-%d %H:%M:%S"), remaining_minutes_instrf] # noqa: E501 self.overall_df.append(indivisual_df) - pd.DataFrame(self.overall_df,columns=["download","upload","timestamp","status","start_time","end_time","remaining_time"]).to_csv('{}/rvr_overalldata.csv'.format(self.result_dir), index=False) + pd.DataFrame(self.overall_df, columns=["download", "upload", "timestamp", "status", "start_time", "end_time", "remaining_time"]).to_csv('{}/rvr_overalldata.csv'.format(self.result_dir), index=False) # noqa: E501 # Check if test was stopped by the user with open(self.result_dir + "/../../Running_instances/{}_{}_running.json".format(self.host, self.test_name), @@ -348,7 +345,7 @@ def monitor(self): data = json.load(file) if data["status"] != "Running": logger.warning('Test is stopped by the user') - self.stop_test=True + self.stop_test = True break time.sleep(1) # # rx_rate list is calculated @@ -358,9 +355,9 @@ def monitor(self): download[i].append(throughput[key][i][0]) upload_throughput = [float(f"{(sum(i) / 1000000) / len(i): .2f}") for i in upload] download_throughput = [float(f"{(sum(i) / 1000000) / len(i): .2f}") for i in download] - logger.info("upload: {}".format( upload_throughput )) - logger.info("download: {}".format( download_throughput )) - self.overall_data.append({"timestamps":timestamps,"upload":upload,"download":download}) + logger.info("upload: {}".format(upload_throughput)) + logger.info("download: {}".format(download_throughput)) + self.overall_data.append({"timestamps": timestamps, "upload": upload, "download": download}) return upload_throughput, download_throughput def set_report_data(self, data): @@ -381,9 +378,6 @@ def set_report_data(self, data): for key in res[traffic]: if 'download' in res[traffic][key]: res[traffic][key].pop('upload') - table_df = {} - num_stations = [] - mode = [] graph_df = {} if len(self.traffic_type) == 2: graph_df = {f"{self.traffic_type[0]}": {}, f"{self.traffic_type[1]}": {}} @@ -416,7 +410,7 @@ def set_report_data(self, data): res.update({"graph_df": graph_df}) return res - def generate_report(self, data, test_setup_info, input_setup_info,report_path=''): + def generate_report(self, data, test_setup_info, input_setup_info, report_path=''): each_phone_data = self.set_report_data(self.throughput_phone) res = self.set_report_data(data) report = lf_report(_output_pdf="lf_interop_rvr_test.pdf", @@ -431,11 +425,11 @@ def generate_report(self, data, test_setup_info, input_setup_info,report_path='' report.build_banner() # objective title and description report.set_obj_html(_obj_title="Objective", _obj="The objective of this RVR test is to assess the performance of the" - " Device Under Test (DUT) across varying distances by emulating real-world" - " attenuation using programmable attenuators. This test measures throughput" - " at each RSSI step, providing insights into signal strength, link quality," - " and data transmission efficiency. The results enable the analysis of upstream" - " and downstream RSSI curves for different traffic types and station configurations using LANforge Interop.") + " Device Under Test (DUT) across varying distances by emulating real-world" + " attenuation using programmable attenuators. This test measures throughput" + " at each RSSI step, providing insights into signal strength, link quality," + " and data transmission efficiency. The results enable the analysis of upstream" + " and downstream RSSI curves for different traffic types and station configurations using LANforge Interop.") report.build_objective() report.test_setup_table(test_setup_data=test_setup_info, value="Device Under Test") report.end_content_div() @@ -458,7 +452,7 @@ def generate_report(self, data, test_setup_info, input_setup_info,report_path='' report.set_obj_html( _obj_title="Overall {} throughput for {} real clients using {} traffic." .format(res["graph_df"][traffic_type]["direction"], len(self.list_of_data[0]), "TCP" if traffic_type == - "lf_tcp" else "UDP" if traffic_type == "lf_udp" else "TCP and UDP"), + "lf_tcp" else "UDP" if traffic_type == "lf_udp" else "TCP and UDP"), _obj="The below graph represents overall {} throughput for different attenuation levels ".format( res["graph_df"][traffic_type]["direction"])) report.build_objective() @@ -531,24 +525,24 @@ def generate_report(self, data, test_setup_info, input_setup_info,report_path='' report.write_pdf() self.generate_overall_csv(report_path_date_time) - - def generate_overall_csv(self,dir_path): + + def generate_overall_csv(self, dir_path): for idx, obj in enumerate(self.overall_data): - filename = "attenuation_at_"+"-".join([atten_val[idx] for atten_val in self.atten_values]) +"_overall_data.csv" if self.multiple_attenuation_values else f"attenuation_at_{self.atten_values[0][idx]}" +"_overall_data.csv" + filename = "attenuation_at_" + "-".join([atten_val[idx] for atten_val in self.atten_values]) + "_overall_data.csv" if self.multiple_attenuation_values else f"attenuation_at_{self.atten_values[0][idx]}" + "_overall_data.csv" # noqa: E501 file_path = os.path.join(dir_path, filename) upload = obj["upload"] download = obj["download"] timestamps = obj["timestamps"] with open(file_path, mode='w', newline='') as file: writer = csv.writer(file) - + # Create header header = ['Timestamp'] for indx in range(len(upload)): header.append(f"{self.list_of_data[1][indx]}_Upload") header.append(f"{self.list_of_data[1][indx]}_Download") writer.writerow(header) - + # Write rows with timestamp, upload, and download values for idx in range(len(timestamps)): row = [timestamps[idx]] @@ -570,21 +564,21 @@ def generate_individual_graphs(self, report, res, phone_x): for traffic_type in phone_x: for phone in phone_x[traffic_type]: for direction in phone_x[traffic_type][phone]: - if direction == "Signal Strength" : + if direction == "Signal Strength": RSSISignal[phone] = phone_x[traffic_type][phone][direction] elif direction == "upload": Upload[phone] = phone_x[traffic_type][phone][direction] else: Download[phone] = phone_x[traffic_type][phone][direction] - final_dataset_per_client = {} - # creating per-client dataset based on traffic direction + final_dataset_per_client = {} + # creating per-client dataset based on traffic direction for traffic_type in phone_x: - final_dataset_per_client[traffic_type]={} + final_dataset_per_client[traffic_type] = {} for phone in phone_x[traffic_type]: - final_dataset_per_client[traffic_type][phone]={} + final_dataset_per_client[traffic_type][phone] = {} if self.traffic_direction == "bidirectional": - final_dataset_per_client[traffic_type][phone]["bidirectional"] = [phone_x[traffic_type][phone]["upload"],phone_x[traffic_type][phone]["download"]] + final_dataset_per_client[traffic_type][phone]["bidirectional"] = [phone_x[traffic_type][phone]["upload"], phone_x[traffic_type][phone]["download"]] elif self.traffic_direction == "upload": final_dataset_per_client[traffic_type][phone]["upload"] = [phone_x[traffic_type][phone]["upload"]] else: @@ -595,16 +589,16 @@ def generate_individual_graphs(self, report, res, phone_x): final_dataset_per_attenuation = {} # creating per-attenuation dataset based on traffic direction for traffic_type in res: - final_dataset_per_attenuation[traffic_type]={} + final_dataset_per_attenuation[traffic_type] = {} for attenuation in res[traffic_type]: - final_dataset_per_attenuation[traffic_type][attenuation]={} + final_dataset_per_attenuation[traffic_type][attenuation] = {} if self.traffic_direction == "bidirectional": - final_dataset_per_attenuation[traffic_type][attenuation]["bidirectional"] = [res[traffic_type][attenuation]["upload"],res[traffic_type][attenuation]["download"]] + final_dataset_per_attenuation[traffic_type][attenuation]["bidirectional"] = [res[traffic_type][attenuation]["upload"], res[traffic_type][attenuation]["download"]] elif self.traffic_direction == "upload": final_dataset_per_attenuation[traffic_type][attenuation]["upload"] = [res[traffic_type][attenuation]["upload"]] else: final_dataset_per_attenuation[traffic_type][attenuation]["download"] = [res[traffic_type][attenuation]["download"]] - res = final_dataset_per_attenuation + res = final_dataset_per_attenuation # for traffic_type in phone_x: # for phone in phone_x[traffic_type]: # for direction in phone_x[traffic_type][phone]: @@ -615,27 +609,27 @@ def generate_individual_graphs(self, report, res, phone_x): for phone in phone_x[traffic_type]: for direction in phone_x[traffic_type][phone]: traffic_name = "TCP" if (traffic_type == "lf_tcp") else "UDP" if ( - traffic_type == "lf_udp") else "TCP and UDP" + traffic_type == "lf_udp") else "TCP and UDP" report.set_obj_html(_obj_title=f"{phone} : {traffic_name} {direction}", _obj="") report.build_objective() line_graph = lf_graph.lf_line_graph(_data_set=phone_x[traffic_type][phone][direction], _xaxis_name="Attenuation", _yaxis_name='Throughput(in Mbps)' if ( - direction == 'upload' or direction == 'download' or direction == 'bidirectional' ) else 'RSSI Strength(in dBm)', - _xaxis_categories=self.attenuator_db_signal, - _graph_image_name=f"rvr_{traffic_type}_{phone}_{direction}", - _label=['upload'] if direction == 'upload' else ['download'] if direction == "download" else ["upload","download"] if direction == "bidirectional" else ['RSSI Strength'], - _color=['olivedrab'] if direction == 'upload' else ['orangered'] if direction == 'download' else ["olivedrab","orangered"] if direction == "bidirectional" else ['mediumblue'], - _xaxis_step=1, - _graph_title="Throughput vs Attenuation" if ( - direction == 'upload' or direction == 'download' or direction == "bidirectional") else "RSSI Signal Strength(in dBm)", - _title_size=16, - _figsize=(18, 6), - _legend_loc="best", - _marker=['o', 'o'], - _legend_box=None, - _dpi=200, - _enable_csv=True) + direction == 'upload' or direction == 'download' or direction == 'bidirectional') else 'RSSI Strength(in dBm)', + _xaxis_categories=self.attenuator_db_signal, + _graph_image_name=f"rvr_{traffic_type}_{phone}_{direction}", + _label=['upload'] if direction == 'upload' else ['download'] if direction == "download" else ["upload", "download"] if direction == "bidirectional" else ['RSSI Strength'], + _color=['olivedrab'] if direction == 'upload' else ['orangered'] if direction == 'download' else ["olivedrab", "orangered"] if direction == "bidirectional" else ['mediumblue'], + _xaxis_step=1, + _graph_title="Throughput vs Attenuation" if ( + direction == 'upload' or direction == 'download' or direction == "bidirectional") else "RSSI Signal Strength(in dBm)", + _title_size=16, + _figsize=(18, 6), + _legend_loc="best", + _marker=['o', 'o'], + _legend_box=None, + _dpi=200, + _enable_csv=True) line_graph_png = line_graph.build_line_graph() logger.info("graph name {}".format(line_graph_png)) @@ -659,7 +653,7 @@ def generate_individual_graphs(self, report, res, phone_x): } if self.traffic_direction == "bidirectional": table_data["Upload(in Mbps)"] = Upload[phone] - table_data["Download(in Mbps)"] = Download[phone] + table_data["Download(in Mbps)"] = Download[phone] elif self.traffic_direction == "download": table_data["Download(in Mbps)"] = Download[phone] else: @@ -673,29 +667,29 @@ def generate_individual_graphs(self, report, res, phone_x): for traffic_type in res: for attenuation in res[traffic_type]: for direction in res[traffic_type][attenuation]: - formated_attenuation=attenuation.replace('"',"").replace("'","").replace("(","").replace(")","").replace(" ","").replace(",","") + formated_attenuation = attenuation.replace('"', "").replace("'", "").replace("(", "").replace(")", "").replace(" ", "").replace(",", "") report.set_obj_html( - _obj_title=f"Individual {direction} Throughput for {len(self.list_of_data[0])} clients using {'TCP' if traffic_type == 'lf_tcp' else 'UDP' if traffic_type == 'lf_udp' else 'TCP and UDP'} traffic over {attenuation} attenuation", + _obj_title=f"Individual {direction} Throughput for {len(self.list_of_data[0])} clients using {'TCP' if traffic_type == 'lf_tcp' else 'UDP' if traffic_type == 'lf_udp' else 'TCP and UDP'} traffic over {attenuation} attenuation", # noqa: E501 _obj=f"The below graph represents Individual {self.traffic_direction} throughput of all stations when attenuation set to {attenuation}") report.build_objective() graph = lf_bar_graph_horizontal(_data_set=res[traffic_type][attenuation][direction], - _yaxis_name="Dervice Name", - _xaxis_name="Throughput(in Mbps)", - _yaxis_categories=self.list_of_data[1], - _graph_image_name=f"rvr_{traffic_type}_{formated_attenuation}", - _label=['upload'] if direction == 'upload' else ['download'] if self.traffic_direction == 'download' else ['upload','download'], - _color=['olivedrab'] if direction == 'upload' else ['orangered'] if self.traffic_direction == 'download' else ['olivedrab','orangered'], - _color_edge='grey', - _yaxis_step=1, - _graph_title=f"Individual throughput with {attenuation} attenuation", - _title_size=16, - _bar_height=0.15, - _figsize=(18, 6), - _legend_loc="best", - _legend_box=None, - _dpi=96, - _show_bar_value=True, - _enable_csv=True) + _yaxis_name="Dervice Name", + _xaxis_name="Throughput(in Mbps)", + _yaxis_categories=self.list_of_data[1], + _graph_image_name=f"rvr_{traffic_type}_{formated_attenuation}", + _label=['upload'] if direction == 'upload' else ['download'] if self.traffic_direction == 'download' else ['upload', 'download'], + _color=['olivedrab'] if direction == 'upload' else ['orangered'] if self.traffic_direction == 'download' else ['olivedrab', 'orangered'], + _color_edge='grey', + _yaxis_step=1, + _graph_title=f"Individual throughput with {attenuation} attenuation", + _title_size=16, + _bar_height=0.15, + _figsize=(18, 6), + _legend_loc="best", + _legend_box=None, + _dpi=96, + _show_bar_value=True, + _enable_csv=True) graph_png = graph.build_bar_graph_horizontal() logger.info("graph name {}".format(graph_png)) @@ -707,7 +701,7 @@ def generate_individual_graphs(self, report, res, phone_x): report.move_csv_file() report.build_graph() - logger.info("Attenuation Step(dB) {} \nThroughput(Mbps) {}".format(self.attenuator_db_signal,res[traffic_type][attenuation][direction])) + logger.info("Attenuation Step(dB) {} \nThroughput(Mbps) {}".format(self.attenuator_db_signal, res[traffic_type][attenuation][direction])) report.start_content_div() report.set_table_title("

Table for Graph") report.build_table_title() @@ -715,13 +709,13 @@ def generate_individual_graphs(self, report, res, phone_x): "Attenuation Step(dB)": [attenuation] * len(graph.data_set[0]), "Device Name": self.list_of_data[1], "Traffic type": [ - 'TCP' if traffic_type == 'lf_tcp' else 'UDP' if traffic_type == 'lf_udp' else 'TCP and UDP'] * len( + 'TCP' if traffic_type == 'lf_tcp' else 'UDP' if traffic_type == 'lf_udp' else 'TCP and UDP'] * len( graph.data_set[0]), } if self.traffic_direction == "bidirectional": table_data["Upload(in Mbps)"] = res[traffic_type][attenuation][direction][0] table_data["Download(in Mbps)"] = res[traffic_type][attenuation][direction][1] - table_data["Overall"] = [float(u) + float(d) for u, d in zip(res[traffic_type][attenuation][direction][0], res[traffic_type][attenuation][direction][1])] + table_data["Overall"] = [float(u) + float(d) for u, d in zip(res[traffic_type][attenuation][direction][0], res[traffic_type][attenuation][direction][1])] elif self.traffic_direction == "upload": table_data["Upload(in Mbps)"] = res[traffic_type][attenuation][direction][0] else: @@ -738,7 +732,7 @@ def main(): -------------------- Generic command layout: ===================================================================== - sudo python3 rvr_test.py --mgr localhost --mgr_port 8080 --upstream eth1 --num_stations 40 + sudo python3 ./lf_interop_rvr_test.py --mgr localhost --mgr_port 8080 --upstream eth1 --num_stations 40 --security wpa2 --ssid NETGEAR73-5G --password fancylotus986 --radio wiphy3 --atten_serno 2222 --atten_idx all --atten_val 10..10..20 --test_duration 1m --ap_model WAX610 --traffic 100''', allow_abbrev=False) optional = parser.add_argument_group('optional arguments') @@ -766,11 +760,11 @@ def main(): optional.add_argument('--ap_model', help="AP Model Name", default="Test-AP") # required.add_argument('--num_stations', help='number of stations to create, works only if create_sta is True', # required=True) - optional.add_argument('-as', '--atten_serno',nargs='+', help='Serial number for requested Attenuators Ex: --atten_serno srial1 serial2 serial3', default=['2222']) - optional.add_argument('-ai', '--atten_idx',nargs='+', + optional.add_argument('-as', '--atten_serno', nargs='+', help='Serial number for requested Attenuators Ex: --atten_serno srial1 serial2 serial3', default=['2222']) + optional.add_argument('-ai', '--atten_idx', nargs='+', help='Attenuator index eg. For module 1 = 0,module 2 = 1 --> --atten_idx 0,2 5 all', default='all') - optional.add_argument('-av', '--atten_val',nargs='+', + optional.add_argument('-av', '--atten_val', nargs='+', help='Requested attenuation in dB ex:--> --atten_val 0..10..40 (here attenuation start ' 'from 0 and end with 50 with increment value of 10 each time)', default='0') optional.add_argument('--debug', help="to enable debug", default=False) @@ -782,13 +776,13 @@ def main(): help="--lf_logger_config_json , json configuration of logger") parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') optional.add_argument('--dowebgui', action="store_true", - help='To notify if the script triggered from webui') - optional.add_argument('--result_dir',type=str,default='',help='result directory for webui execution') - optional.add_argument('--test_name', type=str,default=None,help='Test name parameter for webgui execution') + help='To notify if the script triggered from webui') + optional.add_argument('--result_dir', type=str, default='', help='result directory for webui execution') + optional.add_argument('--test_name', type=str, default=None, help='Test name parameter for webgui execution') args = parser.parse_args() - help_summary='''\ + help_summary = '''\ lf_interop_rvr_test.py will measure the performance of stations over a certain distance of the DUT. Distance is emulated using programmable attenuators and throughput test is run at each distance/RSSI step. ''' @@ -872,14 +866,14 @@ def main(): # If atten_vals length is less than modules or atten_serno, extend it with the last value max_len = len(args.atten_serno) multiple_attenuation_values = False - if len(args.atten_val) > 1 : + if len(args.atten_val) > 1: multiple_attenuation_values = True # Extend the attenuation values to match the length of serials if necessary if len(args.atten_val) < max_len: last_val = args.atten_val[-1] # Get the last value in atten_vals args.atten_val.extend([last_val] * (max_len - len(args.atten_val))) - - atten_dict = {serial: {'modules' : mod, 'attenuation': atten_val}for serial, mod, atten_val in zip(args.atten_serno, modules, args.atten_val)} + + atten_dict = {serial: {'modules': mod, 'attenuation': atten_val}for serial, mod, atten_val in zip(args.atten_serno, modules, args.atten_val)} logger.info(atten_dict) rvr_obj = RvR(host=args.mgr, port=args.mgr_port, @@ -898,7 +892,7 @@ def main(): ap_model=args.ap_model, atten_dict=atten_dict, atten_val=args.atten_val, - multiple_attenuation_values = multiple_attenuation_values, + multiple_attenuation_values=multiple_attenuation_values, traffic_type=args.traffic_type, traffic_direction=args.traffic_direction, sta_names=args.sta_names.split(","), @@ -933,13 +927,13 @@ def main(): input_setup_info = { "contact": "support@candelatech.com" } - rvr_obj.generate_report(data=data, test_setup_info=test_setup_info, input_setup_info=input_setup_info,report_path=rvr_obj.result_dir ) + rvr_obj.generate_report(data=data, test_setup_info=test_setup_info, input_setup_info=input_setup_info, report_path=rvr_obj.result_dir) rvr_obj.cleanup() if rvr_obj.dowebgui: - rvr_obj.overall_df[-1][3]="Stopped" - rvr_obj.overall_df[-1][5]=rvr_obj.overall_df[-1][2] - pd.DataFrame(rvr_obj.overall_df,columns=["download","upload","timestamp","status","start_time","end_time","remaining_time"]).to_csv('{}/rvr_overalldata.csv'.format(rvr_obj.result_dir), index=False) + rvr_obj.overall_df[-1][3] = "Stopped" + rvr_obj.overall_df[-1][5] = rvr_obj.overall_df[-1][2] + pd.DataFrame(rvr_obj.overall_df, columns=["download", "upload", "timestamp", "status", "start_time", "end_time", "remaining_time"]).to_csv('{}/rvr_overalldata.csv'.format(rvr_obj.result_dir), index=False) # noqa: E501 if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index aa4d83a8a..6b06bac6b 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_interop_throughput.py @@ -20,7 +19,7 @@ EXAMPLE-3: Command Line Interface to run upload scenario with packet size - python3 lf_interop_throughput.py --mgr 192.168.214.219 --mgr_port 8080 --security wpa2 --upstream_port eth1 --test_duration 1m --download 0 --upload 1000000 --traffic_type lf_udp --packet_size 17 + python3 lf_interop_throughput.py --mgr 192.168.214.219 --mgr_port 8080 --security wpa2 --upstream_port eth1 --test_duration 1m --download 0 --upload 1000000 --traffic_type lf_udp --packet_size 17 # noqa: E501 EXAMPLE-4: Command Line Interface to run bi-directional scenario with load_type intended load @@ -73,7 +72,7 @@ EXAMPLE-1: Command Line Interface to run download scenario with desired resources - python3 lf_interop_throughput.py --mgr 192.168.214.219 --mgr_port 8080 --upstream_port eth1 --test_duration 1m --download 1000000 --traffic_type lf_udp --do_interopability --device_list 1.10,1.12 + python3 lf_interop_throughput.py --mgr 192.168.214.219 --mgr_port 8080 --upstream_port eth1 --test_duration 1m --download 1000000 --traffic_type lf_udp --do_interopability --device_list 1.10,1.12 # noqa: E501 EXAMPLE-2: Command Line Interface to run bi-directional scenario in Interop web-GUI @@ -108,6 +107,11 @@ python3 lf_interop_throughput.py --mgr 192.168.204.74 --mgr_port 8080 --upstream_port eth1 --test_duration 1m --download 1000000 --traffic_type lf_udp --ssid NETGEAR_2G_wpa2 --passwd Password@123 --security wpa2 --config --device_list 1.10,1.11,1.12 --do_interopability + EXAMPLE-9: + Command Line Interface to run the test with individual configuration + python3 lf_interop_throughput.py --mgr 192.168.204.74 --mgr_port 8080 --upstream_port eth0 --test_duration 30s --traffic_type lf_udp --ssid NETGEAR_2G_wpa2 + --passwd Password@123 --security wpa2 --do_interopability --device_list 1.15,1.400 --download 10000000 --interopability_config + SCRIPT_CLASSIFICATION : Test SCRIPT_CATEGORIES: Performance, Functional, Report Generation @@ -144,11 +148,11 @@ import importlib import logging import json -import pandas as pd import shutil import asyncio import csv import matplotlib.pyplot as plt +import re logger = logging.getLogger(__name__) @@ -159,18 +163,18 @@ if 'py-json' not in sys.path: sys.path.append(os.path.join(os.path.abspath('..'), 'py-json')) -import time -import argparse -from LANforge import LFUtils +import time # noqa: E402 +import argparse # noqa: E402 +from LANforge import LFUtils # noqa: F401 E402 realm = importlib.import_module("py-json.realm") Realm = realm.Realm -from lf_report import lf_report -from lf_graph import lf_bar_graph_horizontal -from lf_graph import lf_line_graph +from lf_report import lf_report # noqa: E402 +from lf_graph import lf_bar_graph_horizontal # noqa: E402 +# from lf_graph import lf_line_graph # noqa: E402 -from datetime import datetime, timedelta +from datetime import datetime, timedelta # noqa: E402 -DeviceConfig=importlib.import_module("py-scripts.DeviceConfig") +DeviceConfig = importlib.import_module("py-scripts.DeviceConfig") lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") @@ -206,6 +210,9 @@ def __init__(self, dowebgui=False, precleanup=False, do_interopability=False, + get_live_view=False, + total_floors=0, + interopability_config=False, ip="localhost", csv_direction='', device_csv_name=None, @@ -234,7 +241,7 @@ def __init__(self, total_resources_list=None, working_resources_list=None, hostname_list=None, username_list=None, eid_list=None, devices_available=None, input_devices_list=None, mac_id1_list=None, mac_id_list=None, overall_avg_rssi=None): super().__init__(lfclient_host=host, - lfclient_port=port), + lfclient_port=port) self.ssid_list = [] self.signal_list = [] self.channel_list = [] @@ -302,6 +309,8 @@ def __init__(self, self.overall_avg_rssi = overall_avg_rssi if overall_avg_rssi is not None else [] self.dowebgui = dowebgui self.do_interopability = do_interopability + self.get_live_view = get_live_view + self.total_floors = total_floors self.ip = ip self.device_found = False self.gave_incremental = False @@ -335,6 +344,9 @@ def __init__(self, self.config = config self.configdevices = {} self.group_device_map = {} + self.config_dict = {} + self.configured_devices_check = {} + self.interopability_config = interopability_config def os_type(self): """ @@ -349,7 +361,7 @@ def os_type(self): for key, value in response.items(): if key == "resources": for element in value: - for a, b in element.items(): + for _, b in element.items(): if "Apple" in b['hw version']: if b['kernel'] == '': self.hw_list.append('iOS') @@ -372,16 +384,81 @@ def os_type(self): self.android_list.append(hw_version) self.laptop_list = self.windows_list + self.linux_list + self.mac_list + def disconnect_all_devices(self, devices_to_disconnect=None): + """ + Disconnects either all devices or a specific list of devices from Wi-Fi networks. + """ + obj = DeviceConfig.DeviceConfig(lanforge_ip=self.host, file_name=self.file_name, wait_time=self.wait_time) + # all_devices = obj.get_all_devices() + # GET ANDROIDS FROM DEVICE LIST + adb_obj = DeviceConfig.ADB_DEVICES(lanforge_ip=self.host) + + async def do_disconnect(): + all_devices = obj.get_all_devices() + # TO DISCONNECT ALL DEVICES + if devices_to_disconnect is None: + android_resources = [d for d in all_devices if d.get('os') == 'Android' and d.get('eid') in self.device_list] + if len(android_resources) > 0: + # TO STOP APP FOR ALL DEVICES FOR ANDROIDS + await adb_obj.stop_app(port_list=android_resources) + # TO FORGET ALL NETWORKS FOR ALL OS TYPES + await obj.connectivity(device_list=self.device_list, wifi_config=self.config_dict, disconnect=True) + if len(android_resources) > 0: + adb_obj.set_wifi_state(port_list=android_resources, state='disable') + + # TO DISCONNECT SPECIFIC DEVICES + else: + android_resources = [d for d in all_devices if d.get('os') == 'Android' and d.get('eid') in devices_to_disconnect] + if len(android_resources) > 0: + # To disable stop app for androids + await adb_obj.stop_app(port_list=android_resources) + await obj.connectivity(device_list=devices_to_disconnect, wifi_config=self.config_dict, disconnect=True) + if len(android_resources) > 0: + # To disable wifi for androids + adb_obj.set_wifi_state(port_list=android_resources, state='disable') + + asyncio.run(do_disconnect()) + + def configure_specific(self, device_to_configure_list): + """ + Configure specific devices using the provided list of device IDs or names. + """ + obj = DeviceConfig.DeviceConfig(lanforge_ip=self.host, file_name=self.file_name, wait_time=self.wait_time) + all_devices = obj.get_all_devices() + android_resources = [d for d in all_devices if (d.get('os') == 'Android') and d.get('eid') in device_to_configure_list] + laptop_resources = [d for d in all_devices if (d.get('os') != 'Android') and '1.' + d.get('resource') in device_to_configure_list] + devices_connected = asyncio.run(obj.connectivity(device_list=device_to_configure_list, wifi_config=self.config_dict)) + if len(devices_connected) > 0: + if android_resources: + self.configured_devices_check[android_resources[0]['user-name']] = True + elif laptop_resources: + self.configured_devices_check[laptop_resources[0]['hostname']] = True + return True + else: + if android_resources: + self.configured_devices_check[android_resources[0]['user-name']] = False + elif laptop_resources: + self.configured_devices_check[laptop_resources[0]['hostname']] = False + return False + + def extract_digits_until_alpha(self, s): + """ + Extracts digits (including decimals) from the start of a string until the first alphabet. + """ + match = re.match(r'^[\d.]+', s) + return match.group() if match else '' + def phantom_check(self): """ Checks for non-phantom resources and ports, categorizes them, and prepares a list of available devices for testing. """ port_eid_list, same_eid_list, original_port_list = [], [], [] + interop_response = self.json_get("/adb") obj = DeviceConfig.DeviceConfig(lanforge_ip=self.host, file_name=self.file_name, wait_time=self.wait_time) upstream_port_ip = self.change_port_to_ip(self.upstream) config_devices = {} - config_dict = { + self.config_dict = { 'ssid': self.ssid, 'passwd': self.password, 'enc': self.security, @@ -422,7 +499,7 @@ def phantom_check(self): self.device_list = self.device_list.split(',') if self.config: - self.device_list = asyncio.run(obj.connectivity(device_list=self.device_list, wifi_config=config_dict)) + self.device_list = asyncio.run(obj.connectivity(device_list=self.device_list, wifi_config=self.config_dict)) # Configuration of devices with SSID , Password and Security when the device list is not specified elif self.device_list == [] and self.config: all_devices = obj.get_all_devices() @@ -432,10 +509,10 @@ def phantom_check(self): device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["hostname"]) else: device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["serial"]) - logger.info("AVAILABLE RESOURCES", device_list) - self.device_list = input("Enter the desired resources to run the test:").split(',') + logger.info("AVAILABLE RESOURCES {}".format(device_list)) + self.device_list = input("Select the desired resources to run the test:").split(',') if self.config: - self.device_list = asyncio.run(obj.connectivity(device_list=self.device_list, wifi_config=config_dict)) + self.device_list = asyncio.run(obj.connectivity(device_list=self.device_list, wifi_config=self.config_dict)) # Retrieve all resources from the LANforge response = self.json_get("/resource/all") @@ -448,10 +525,10 @@ def phantom_check(self): for key, value in response.items(): if key == "resources": for element in value: - for (a, b) in element.items(): + for (_, b) in element.items(): # Check if the resource is not phantom - if b['phantom'] == False: + if b['phantom'] is False: self.working_resources_list.append(b["hw version"]) # Categorize based on hw version (type of device) @@ -469,7 +546,17 @@ def phantom_check(self): if b['kernel'] == '': self.eid_list.append(b['eid']) self.mac_list.append(b['hw version']) - self.devices_available.append(b['eid'] + " " + 'iOS' + " " + b['hostname']) + if "devices" in interop_response.keys(): + interop_devices = interop_response['devices'] + # Extract usernames of devices that match the current eid + if len([v['user-name'] for d in interop_devices for k, v in d.items() if v.get('resource-id') == b['eid']]) == 0: + self.devices_available.append(b['eid'] + " " + 'iOS' + " " + b['hostname']) + # If username is found + else: + ios_username = [v['user-name'] for d in interop_devices for k, v in d.items() if v.get('resource-id') == b['eid']][0] + self.devices_available.append(b['eid'] + " " + 'iOS' + " " + ios_username) + else: + self.devices_available.append(b['eid'] + " " + 'iOS' + " " + b['hostname']) else: self.eid_list.append(b['eid']) self.mac_list.append(b['hw version']) @@ -492,8 +579,10 @@ def phantom_check(self): for interface in response_port['interfaces']: for port, port_data in interface.items(): - # Check conditions for non-phantom ports - if (not port_data['phantom'] and not port_data['down'] and port_data['parent dev'] == "wiphy0" and port_data['alias'] != 'p2p0'): + # Select valid Wi-Fi ports: must be non-phantom, parent dev 'wiphy0', alias not 'p2p0'; + # include down ports only when interopability_config is enabled + if (not port_data['phantom'] and ((not self.interopability_config and not port_data['down']) or ( + self.interopability_config)) and port_data['parent dev'] == "wiphy0" and port_data['alias'] != 'p2p0'): # Check if the port's parent device matches with an eid in the eid_list for id in self.eid_list: if id + '.' in port: @@ -514,9 +603,9 @@ def phantom_check(self): self.user_list.append(device) configure_list = [] - if len(self.device_list) == 0 and self.config == False and self.group_name is None: + if len(self.device_list) == 0 and self.config is False and self.group_name is None: logger.info("AVAILABLE DEVICES TO RUN TEST : {}".format(self.user_list)) - self.device_list = input("Enter the desired resources to run the test:").split(',') + self.device_list = input("Select the desired resources to run the test:").split(',') # If self.device_list is provided, check availability against devices_available if len(self.device_list) != 0: devices_list = self.device_list @@ -533,7 +622,7 @@ def phantom_check(self): available_list.append(input_device) found = True break - if found == False: + if found is False: not_available.append(input_device) if self.device_list != "all": logger.warning(input_device + " is not available to run the test") @@ -567,7 +656,7 @@ def phantom_check(self): # Split devices_list into resource_eid_list resource_eid_list = devices_list.split(',') - logger.info("devices list {}".format(devices_list, resource_eid_list)) + logger.info("devices list {} {}".format(devices_list, resource_eid_list)) resource_eid_list2 = [eid + ' ' for eid in resource_eid_list] # Create resource_eid_list1 by appending dot to each eid in resource_eid_list @@ -599,7 +688,7 @@ def phantom_check(self): if eid in i: self.mac_id_list.append(i.strip(eid + ' ')) # Runtime data for webui for configuration - if self.dowebgui: + if self.dowebgui and not self.interopability_config: if len(configure_list) == 0: logger.info("No device is available to run the test") obj = { @@ -607,7 +696,7 @@ def phantom_check(self): "configuration_status": "configured" } self.updating_webui_runningjson(obj) - return + return False, self.real_client_list else: obj = { "configured_devices": configure_list, @@ -617,9 +706,18 @@ def phantom_check(self): # Check if incremental_capacity is provided and ensure selected devices are sufficient if (len(self.incremental_capacity) > 0 and int(self.incremental_capacity.split(',')[-1]) > len(self.mac_id_list)): - logger.error("Devices selected is less than given incremental capacity") - return False, self.real_client_list - + if not self.config and not self.interopability_config: + logger.error("Devices selected is less than given incremental capacity") + return False, self.real_client_list + elif (self.config and not self.do_interopability): + configured_devices = len(self.mac_id_list) + given_capacity = list(map(int, self.incremental_capacity.split(","))) + adjusted_capacity = [cap for cap in given_capacity if cap <= configured_devices] + if configured_devices not in adjusted_capacity: + adjusted_capacity.append(configured_devices) + + self.incremental_capacity = ",".join(map(str, adjusted_capacity)) + return True, self.real_client_list else: return True, self.real_client_list @@ -729,12 +827,12 @@ def create_cx(self): direction = 'UL' traffic_type = (self.traffic_type.strip("lf_")).upper() traffic_direction_list, cx_list, traffic_type_list = [], [], [] - for client in range(len(self.real_client_list)): + for _ in range(len(self.real_client_list)): traffic_direction_list.append(direction) traffic_type_list.append(traffic_type) # Construct connection names - for ip_tos in self.tos: + for _ in self.tos: for i in self.real_client_list1: for j in traffic_direction_list: for k in traffic_type_list: @@ -745,7 +843,7 @@ def create_cx(self): count = 0 # creating duplicate created_cx's for precleanup of CX's if there are already existed - if self.precleanup == True: + if self.precleanup is True: self.cx_profile.created_cx = {k: [k + '-A', k + '-B'] for k in cx_list} self.pre_cleanup() @@ -834,13 +932,16 @@ def get_layer3_endp_data(self): [4]: Status of the Device ("Run" or "Stopped") """ cx_list_endp = [] + cx_list_l3 = [] for i in self.cx_profile.created_cx.keys(): cx_list_endp.append(i + '-A') cx_list_endp.append(i + '-B') + cx_list_l3.append(i) # Fetch required throughput data from Lanforge try: # for dynamic data, taken rx rate lasts from layer3 endp tab l3_endp_data = list(self.json_get('/endp/{}/list?fields=rx rate (last),rx drop %25,name,run,name'.format(','.join(cx_list_endp)))['endpoint']) + l3_cx_data = self.json_get('/cx/all') except Exception as e: cx_data = self.json_get('/cx/all/') logger.info(cx_data) @@ -851,7 +952,7 @@ def get_layer3_endp_data(self): throughput = {} # mapping the data based upon the cx_list order for cx in cx_list: - throughput[i] = [0, 0, 0, 0, "Stopped"] + throughput[i] = [0, 0, 0, 0, "Stopped", 0] for j in l3_endp_data: key, value = next(iter(j.items())) endp_a = cx + '-A' @@ -864,13 +965,19 @@ def get_layer3_endp_data(self): throughput[i][3] = value['rx drop %'] if value['name'] == endp_a or value['name'] == endp_b: throughput[i][4] = 'Run' if value['run'] else 'Stopped' + # To add average RTT + for j in l3_cx_data: + if (j == "handler" or j == "uri"): + continue + if cx == l3_cx_data[j]['name']: + throughput[i][5] = l3_cx_data[j]['avg rtt'] i += 1 return throughput - def monitor(self, iteration, individual_df, device_names, incremental_capacity_list, overall_start_time, overall_end_time): + def monitor(self, iteration, individual_df, device_names, incremental_capacity_list, overall_start_time, overall_end_time, is_device_configured): individual_df_for_webui = individual_df.copy() # for webui throughput, upload, download, upload_throughput, download_throughput, connections_upload, connections_download = {}, [], [], [], [], {}, {} - drop_a, drop_a_per, drop_b, drop_b_per, state, state_of_device = [], [], [], [], [], [] + drop_a, drop_a_per, drop_b, drop_b_per, state, state_of_device, avg_rtt = [], [], [], [], [], [], [] # noqa: F841 test_stopped_by_user = False if (self.test_duration is None) or (int(self.test_duration) <= 1): raise ValueError("Monitor test duration should be > 1 second") @@ -891,7 +998,7 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l connections_download_realtime = dict.fromkeys(list(self.cx_profile.created_cx.keys()), float(0)) # Initialize lists for throughput and drops for each connection - [(upload.append([]), download.append([]), drop_a.append([]), drop_b.append([]), state.append([])) for i in range(len(self.cx_profile.created_cx))] + [(upload.append([]), download.append([]), drop_a.append([]), drop_b.append([]), state.append([]), avg_rtt.append([])) for i in range(len(self.cx_profile.created_cx))] # If using web GUI, set runtime directory if self.dowebgui: @@ -905,13 +1012,20 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l signal_list, channel_list, mode_list, link_speed_list, rx_rate_list = self.get_signal_and_channel_data(self.input_devices_list) signal_list = [int(i) if i != "" else 0 for i in signal_list] throughput[index] = self.get_layer3_endp_data() + # Check if next sleep would overshoot the end_time + is_last_iteration = ((current_time + timedelta(seconds=1 if self.dowebgui else self.report_timer)) >= end_time) + # For the WebUI, data is appended as "STOPPED" outside the loop. + # To prevent the last record from being duplicated, break before exiting the loop. + if is_last_iteration: + break + if self.dowebgui: time.sleep(1) # for each second data in csv while ensuring webgui individual_df_data = [] - temp_upload, temp_download, temp_drop_a, temp_drop_b = [], [], [], [] + temp_upload, temp_download, temp_drop_a, temp_drop_b, temp_avg_rtt = [], [], [], [], [] # Initialize temporary lists for each connection - [(temp_upload.append([]), temp_download.append([]), temp_drop_a.append([]), temp_drop_b.append([])) for + [(temp_upload.append([]), temp_download.append([]), temp_drop_a.append([]), temp_drop_b.append([]), temp_avg_rtt.append([])) for i in range(len(self.cx_profile.created_cx))] # Populate temporary lists with current throughput data @@ -921,12 +1035,13 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l temp_download[i].append(0) temp_drop_a[i].append(0) temp_drop_b[i].append(0) + temp_avg_rtt[i].append(0) else: temp_upload[i].append(throughput[index][i][1]) temp_download[i].append(throughput[index][i][0]) temp_drop_a[i].append(throughput[index][i][2]) temp_drop_b[i].append(throughput[index][i][3]) - + temp_avg_rtt[i].append(throughput[index][i][5]) # Calculate average throughput and drop percentages upload_throughput = [float(f"{(sum(i) / 1000000) / len(i): .2f}") for i in temp_upload] download_throughput = [float(f"{(sum(i) / 1000000) / len(i): .2f}") for i in temp_download] @@ -938,7 +1053,7 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l connections_download_realtime.update({keys[i]: float(f"{(download_throughput[i]):.2f}")}) for i in range(len(upload_throughput)): connections_upload_realtime.update({keys[i]: float(f"{(upload_throughput[i]):.2f}")}) - time_difference = abs(end_time - datetime.now()) + # time_difference = abs(end_time - datetime.now()) overall_time_difference = abs(overall_end_time - datetime.now()) overall_total_hours = overall_time_difference.total_seconds() / 3600 overall_remaining_minutes = (overall_total_hours % 1) * 60 @@ -947,9 +1062,10 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l " min" if int(overall_total_hours) != 0 or int(overall_remaining_minutes) != 0 else '<1 min'][0] if remaining_minutes_instrf != '<1 min': remaining_minutes_instrf = str(overall_time_difference).split(".")[0] - # Storing individual device throughput data(download, upload, Rx % drop A, Rx % drop B) to dataframe + # Storing individual device throughput data(download, upload, Rx % drop , Tx % drop) to dataframe for i in range(len(download_throughput)): - individual_df_data.extend([download_throughput[i], upload_throughput[i], drop_a_per[i], drop_b_per[i], int(signal_list[i]), link_speed_list[i], rx_rate_list[i]]) + individual_df_data.extend([download_throughput[i], upload_throughput[i], drop_a_per[i], drop_b_per[i], + temp_avg_rtt[i][0], int(signal_list[i]), link_speed_list[i], rx_rate_list[i]]) # Storing Overall throughput data for all devices and also start time, end time, remaining time and status of test running individual_df_data.extend([round(sum(download_throughput), @@ -969,9 +1085,9 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l if (current_time - previous_time).total_seconds() >= time_break: individual_df_for_webui.loc[len(individual_df_for_webui)] = individual_df_data if self.group_name is None: - individual_df_for_webui.to_csv('{}/throughput_data.csv'.format(runtime_dir), index=False) + individual_df.to_csv('{}/throughput_data.csv'.format(runtime_dir), index=False) else: - individual_df_for_webui.to_csv('{}/overall_throughput.csv'.format(runtime_dir), index=False) + individual_df.to_csv('{}/overall_throughput.csv'.format(runtime_dir), index=False) previous_time = current_time # Append data to individual_df and save to CSV @@ -1027,21 +1143,21 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l # Aggregate data from throughput - for index, key in enumerate(throughput): + for _, key in enumerate(throughput): for i in range(len(throughput[key])): - upload[i], download[i], drop_a[i], drop_b[i] = [], [], [], [] + upload[i], download[i], drop_a[i], drop_b[i], avg_rtt[i] = [], [], [], [], [] if throughput[key][i][4] != 'Run': upload[i].append(0) download[i].append(0) drop_a[i].append(0) drop_b[i].append(0) - + avg_rtt[i].append(0) else: upload[i].append(throughput[key][i][1]) download[i].append(throughput[key][i][0]) drop_a[i].append(throughput[key][i][2]) drop_b[i].append(throughput[key][i][3]) - + avg_rtt[i].append(throughput[key][i][5]) # Calculate average throughput and drop percentages upload_throughput = [float(f"{(sum(i) / 1000000) / len(i): .2f}") for i in upload] download_throughput = [float(f"{(sum(i) / 1000000) / len(i): .2f}") for i in download] @@ -1059,9 +1175,9 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l " min" if int(overall_total_hours) != 0 or int(overall_remaining_minutes) != 0 else '<1 min'][0] if remaining_minutes_instrf != '<1 min': remaining_minutes_instrf = str(overall_time_difference).split(".")[0] - # Storing individual device throughput data(download, upload, Rx % drop A, Rx % drop B) to dataframe + # Storing individual device throughput data(download, upload, Rx % drop , Tx % drop) to dataframe for i in range(len(download_throughput)): - individual_df_data.extend([download_throughput[i], upload_throughput[i], drop_a_per[i], drop_b_per[i], int(signal_list[i]), link_speed_list[i], rx_rate_list[i]]) + individual_df_data.extend([download_throughput[i], upload_throughput[i], drop_a_per[i], drop_b_per[i], avg_rtt[i][0], int(signal_list[i]), link_speed_list[i], rx_rate_list[i]]) # Storing Overall throughput data for all devices and also start time, end time, remaining time and status of test running individual_df_data.extend([round(sum(download_throughput), @@ -1085,20 +1201,27 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l break if not self.background_run and self.background_run is not None: break + # Exit the loop if the device is not connected or configured to match the provided SSID + if not is_device_configured and self.interopability_config: + break - for index, key in enumerate(throughput): + # individual_df = individual_df[1:-1] + # individual_df_for_webui = individual_df_for_webui[1:-1] + for _, key in enumerate(throughput): for i in range(len(throughput[key])): - upload[i], download[i], drop_a[i], drop_b[i] = [], [], [], [] + upload[i], download[i], drop_a[i], drop_b[i], avg_rtt[i] = [], [], [], [], [] if throughput[key][i][4] != 'Run': upload[i].append(0) download[i].append(0) drop_a[i].append(0) drop_b[i].append(0) + avg_rtt[i].append(0) else: upload[i].append(throughput[key][i][1]) download[i].append(throughput[key][i][0]) drop_a[i].append(throughput[key][i][2]) drop_b[i].append(throughput[key][i][3]) + avg_rtt[i].append(throughput[key][i][5]) individual_df_data = [] upload_throughput = [float(f"{(sum(i) / 1000000) / len(i): .2f}") for i in upload] @@ -1108,9 +1231,9 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l signal_list, channel_list, mode_list, link_speed_list, rx_rate_list = self.get_signal_and_channel_data(self.input_devices_list) signal_list = [int(i) if i != "" else 0 for i in signal_list] - # Storing individual device throughput data(download, upload, Rx % drop A, Rx % drop B) to dataframe after test stopped + # Storing individual device throughput data(download, upload, Rx % drop , Tx % drop) to dataframe after test stopped for i in range(len(download_throughput)): - individual_df_data.extend([download_throughput[i], upload_throughput[i], drop_a_per[i], drop_b_per[i], int(signal_list[i]), link_speed_list[i], rx_rate_list[i]]) + individual_df_data.extend([download_throughput[i], upload_throughput[i], drop_a_per[i], drop_b_per[i], avg_rtt[i][0], int(signal_list[i]), link_speed_list[i], rx_rate_list[i]]) timestamp = datetime.now().strftime("%d/%m %I:%M:%S %p") # If it's the last iteration, append final metrics and 'Stopped' status @@ -1150,7 +1273,7 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l individual_df_for_webui.to_csv('{}/overall_throughput.csv'.format(runtime_dir), index=False) individual_df.to_csv('overall_throughput.csv', index=False) else: - individual_df_for_webui.to_csv('{}/throughput_data.csv'.format(runtime_dir), index=False) + individual_df.to_csv('{}/throughput_data.csv'.format(runtime_dir), index=False) individual_df.to_csv('throughput_data.csv', index=False) else: individual_df.to_csv('throughput_data.csv', index=False) @@ -1221,7 +1344,7 @@ def check_incremental_list(self): Checks and generates a list of incremental capacities for connections. """ - if (len(self.incremental_capacity) == 0 and self.do_interopability != True and self.incremental): + if (len(self.incremental_capacity) == 0 and self.do_interopability is not True and self.incremental): self.incremental_capacity = input("Enter the incremental load to run the test:") cx_incremental_capacity_lists = [] @@ -1233,7 +1356,7 @@ def check_incremental_list(self): if len(self.incremental_capacity) == 0: incremental_capacity_1 = [device_list_length] - elif (device_list_length != 0 and len(self.incremental_capacity.split(",")) > 0): + elif device_list_length != 0 and len(self.incremental_capacity.split(",")) > 0: device_list_length = len(self.mac_id_list) incremental_capacity_length = len(self.incremental_capacity.split(",")) @@ -1295,7 +1418,7 @@ def get_incremental_capacity_list(self): incremental_capacity_1 = [device_list_length] # Check if device list is not empty and incremental capacity is provided - elif (device_list_length != 0 and len(self.incremental_capacity.split(",")) > 0): + elif device_list_length != 0 and len(self.incremental_capacity.split(",")) > 0: device_list_length = len(created_cx_lists_keys) incremental_capacity_length = len(self.incremental_capacity.split(",")) @@ -1402,6 +1525,15 @@ def build_line_graph(self, data_set, xaxis_name, yaxis_name, xaxis_categories, l return f"{graph_image_name}.png" + def convert_to_table(self, configured_devices_check): + """ + Returns usernames and their config status ('Pass' or 'Fail') as a dictionary. + """ + return { + "Username": list(configured_devices_check.keys()), + "Configuration Status": ["Pass" if status else "Fail" for status in configured_devices_check.values()] + } + def generate_report(self, iterations_before_test_stopped_by_user, incremental_capacity_list, data=None, data1=None, report_path='', result_dir_name='Throughput_Test_report', selected_real_clients_names=None): @@ -1415,14 +1547,14 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca self.num_stations = selected_real_clients_names # Initialize the report object - if self.do_interopability == False: + if self.do_interopability is False: report = lf_report(_output_pdf="throughput.pdf", _output_html="throughput.html", _path=report_path, _results_dir_name=result_dir_name) report_path = report.get_path() report_path_date_time = report.get_path_date_time() # df.to_csv(os.path.join(report_path_date_time, 'throughput_data.csv')) # For groups and profiles configuration through webgui - if self.dowebgui == True and self.group_name: + if self.dowebgui is True and self.group_name: shutil.move('overall_throughput.csv', report_path_date_time) else: shutil.move('throughput_data.csv', report_path_date_time) @@ -1433,11 +1565,11 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca # objective title and description report.set_obj_html(_obj_title="Objective", - _obj="The Candela Client Capacity test is designed to measure an Access Point’s client capacity and performance when handling different amounts of Real clients like android, Linux," - " windows, and IOS. The test allows the user to increase the number of clients in user-defined steps for each test iteration and measure the per client and the overall throughput for" + _obj="The Candela Client Capacity test is designed to measure an Access Point’s client capacity and performance when handling different amounts of Real clients like android, Linux," # noqa: E501 + " windows,MacOS and IOS. The test allows the user to increase the number of clients in user-defined steps for each test iteration and measure the per client and the overall throughput for" # noqa: E501 " this test, we aim to assess the capacity of network to handle high volumes of traffic while" - " each trial. Along with throughput other measurements made are client connection times, Station 4-Way Handshake time, DHCP times, and more. The expected behavior is for the" - " AP to be able to handle several stations (within the limitations of the AP specs) and make sure all Clients get a fair amount of airtime both upstream and downstream. An AP that" + " each trial. Along with throughput other measurements made are client connection times, Station 4-Way Handshake time, DHCP times, and more. The expected behavior is for the" # noqa: E501 + " AP to be able to handle several stations (within the limitations of the AP specs) and make sure all Clients get a fair amount of airtime both upstream and downstream. An AP that" # noqa: E501 "scales well will not show a significant overall throughput decrease as more Real clients are added.") report.build_objective() report.set_obj_html(_obj_title="Input Parameters", @@ -1558,6 +1690,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca upload_list, download_list = [], [] rssi_data = [] data_iter = data[data['Iteration'] == i + 1] + avg_rtt_data = [] # for sig in self.signal_list[0:int(incremental_capacity_list[i])]: # signal_data.append(int(sig)*(-1)) @@ -1574,22 +1707,25 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca # Checking individual device download and upload rate by searching device name in dataframe columns_with_substring = [col for col in data_iter.columns if k in col] filtered_df = data_iter[columns_with_substring] - dl_len = len(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()) - 1 - ul_len = len(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()) - 1 + download_col = filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist() + upload_col = filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist() + upload_drop_col = filtered_df[[col for col in filtered_df.columns if "Tx % Drop" in col][0]].values.tolist() + download_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop " in col][0]].values.tolist() + rssi_col = filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist() if self.load_type == "wc_intended_load": if self.direction == "Bi-direction": # Append average download and upload data from filtered dataframe - download_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) - upload_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + download_data.append(round(sum(download_col) / len(download_col), 2)) + upload_data.append(round(sum(upload_col) / len(upload_col), 2)) # Append average upload and download drop from filtered dataframe - upload_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop B" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) - download_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) - rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / - len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) + upload_drop.append(round(sum(upload_drop_col) / len(upload_drop_col), 2)) + download_drop.append(round(sum(download_drop_col) / len(download_drop_col), 2)) + rssi_data.append(int(round(sum(rssi_col) / len(rssi_col), 2) * -1)) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Calculate and append upload and download throughput to lists - upload_list.append(str(round((int(self.cx_profile.side_a_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2)) + "Mbps") - download_list.append(str(round((int(self.cx_profile.side_b_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2)) + "Mbps") + upload_list.append(str(round((int(self.cx_profile.side_a_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2))) + download_list.append(str(round((int(self.cx_profile.side_b_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2))) if self.cx_profile.side_a_min_pdu == -1: packet_size_in_table.append('AUTO') else: @@ -1599,20 +1735,20 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca elif self.direction == 'Download': # Append average download data from filtered dataframe - download_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + download_data.append(round(sum(download_col) / len(download_col), 2)) # Append 0 for upload data upload_data.append(0) - rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / - len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) + rssi_data.append(int(round(sum(rssi_col) / len(rssi_col), 2) * -1)) # Calculate and append upload and download throughput to lists - upload_list.append(str(round((int(self.cx_profile.side_a_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2)) + "Mbps") - download_list.append(str(round((int(self.cx_profile.side_b_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2)) + "Mbps") + upload_list.append(str(round((int(self.cx_profile.side_a_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2))) + download_list.append(str(round((int(self.cx_profile.side_b_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2))) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Append average download drop data from filtered dataframe - download_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + download_drop.append(round(sum(download_drop_col) / len(download_drop_col), 2)) if self.cx_profile.side_a_min_pdu == -1: packet_size_in_table.append('AUTO') else: @@ -1622,18 +1758,18 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca elif self.direction == 'Upload': # Calculate and append upload and download throughput to lists - upload_list.append(str(round((int(self.cx_profile.side_a_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2)) + "Mbps") - download_list.append(str(round((int(self.cx_profile.side_b_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2)) + "Mbps") + upload_list.append(str(round((int(self.cx_profile.side_a_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2))) + download_list.append(str(round((int(self.cx_profile.side_b_min_bps) / 1000000) / int(incremental_capacity_list[i]), 2))) - rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / - len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) + rssi_data.append(int(round(sum(rssi_col) / len(rssi_col), 2) * -1)) # Append Average upload data from filtered dataframe - upload_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + upload_data.append(round(sum(upload_col) / len(upload_col), 2)) # Append 0 for download data download_data.append(0) # Append average upload drop data from filtered dataframe - upload_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop B" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + upload_drop.append(round(sum(upload_drop_col) / len(upload_drop_col), 2)) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) if self.cx_profile.side_a_min_pdu == -1: packet_size_in_table.append('AUTO') @@ -1645,18 +1781,18 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca if self.direction == "Bi-direction": # Append average download and upload data from filtered dataframe - download_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) - upload_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + download_data.append(round(sum(download_col) / len(download_col), 2)) + upload_data.append(round(sum(upload_col) / len(upload_col), 2)) # Append average download and upload drop data from filtered dataframe - upload_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop B" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) - download_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + upload_drop.append(round(sum(upload_drop_col) / len(upload_drop_col), 2)) + download_drop.append(round(sum(download_drop_col) / len(download_drop_col), 2)) # upload_data.append(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()[-1]) - rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / - len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) + rssi_data.append(int(round(sum(rssi_col) / len(rssi_col), 2) * -1)) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Calculate and append upload and download throughput to lists - upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2)) + "Mbps") - download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2)) + "Mbps") + upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2))) + download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2))) if self.cx_profile.side_a_min_pdu == -1: packet_size_in_table.append('AUTO') @@ -1666,17 +1802,17 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca elif self.direction == 'Download': # Append average download data from filtered dataframe - download_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + download_data.append(round(sum(download_col) / len(download_col), 2)) # Append 0 for upload data upload_data.append(0) - rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / - len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) + rssi_data.append(int(round(sum(rssi_col) / len(rssi_col), 2) * -1)) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Calculate and append upload and download throughput to lists - upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2)) + "Mbps") - download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2)) + "Mbps") + upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2))) + download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2))) # Append average download drop data from filtered dataframe - download_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + download_drop.append(round(sum(download_drop_col) / len(download_drop_col), 2)) if self.cx_profile.side_a_min_pdu == -1: packet_size_in_table.append('AUTO') else: @@ -1687,13 +1823,13 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca # Calculate and append upload and download throughput to lists upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2)) + "Mbps") download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2)) + "Mbps") - rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / - len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) + rssi_data.append(int(round(sum(rssi_col) / len(rssi_col), 2) * -1)) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Append average upload data from filtered dataframe - upload_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + upload_data.append(round(sum(upload_col) / len(upload_col), 2)) # Append average upload drop data from filtered dataframe - upload_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop B" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + upload_drop.append(round(sum(upload_drop_col) / len(upload_drop_col), 2)) # Append 0 for download data download_data.append(0) @@ -1803,6 +1939,10 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca report.set_graph_image(graph_png) report.move_graph_image() report.build_graph() + if self.dowebgui and self.get_live_view: + # To add live view images coming from the Web-GUI in report + self.add_live_view_images_to_report(report) + if self.group_name: report.set_obj_html( _obj_title="Detailed Result Table For Groups ", @@ -1829,6 +1969,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca self.mode_list[0:int(incremental_capacity_list[i])], direction_in_table[0:int(incremental_capacity_list[i])], download_list[0:int(incremental_capacity_list[i])], + [str(n) for n in avg_rtt_data[0:int(incremental_capacity_list[i])]], [str(n) + " Mbps" for n in download_data[0:int(incremental_capacity_list[i])]], upload_list[0:int(incremental_capacity_list[i])], [str(n) + " Mbps" for n in upload_data[0:int(incremental_capacity_list[i])]], @@ -1850,6 +1991,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca self.mode_list[0:int(incremental_capacity_list[i])], direction_in_table[0:int(incremental_capacity_list[i])], download_list[0:int(incremental_capacity_list[i])], + [str(n) for n in avg_rtt_data[0:int(incremental_capacity_list[i])]], [str(n) + " Mbps" for n in download_data[0:int(incremental_capacity_list[i])]], upload_list[0:int(incremental_capacity_list[i])], [str(n) + " Mbps" for n in upload_data[0:int(incremental_capacity_list[i])]], @@ -1875,26 +2017,27 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca " Channel ": self.channel_list[0:int(incremental_capacity_list[i])], " Mode": self.mode_list[0:int(incremental_capacity_list[i])], # " Direction":direction_in_table[0:int(incremental_capacity_list[i])], - " Offered download rate ": download_list[0:int(incremental_capacity_list[i])], - " Observed Average download rate ": [str(n) + " Mbps" for n in download_data[0:int(incremental_capacity_list[i])]], - " Offered upload rate ": upload_list[0:int(incremental_capacity_list[i])], - " Observed Average upload rate ": [str(n) + " Mbps" for n in upload_data[0:int(incremental_capacity_list[i])]], - " RSSI ": ['' if n == 0 else '-' + str(n) + " dbm" for n in rssi_data[0:int(incremental_capacity_list[i])]], + " Offered download rate (Mbps) ": download_list[0:int(incremental_capacity_list[i])], + " Observed Average download rate (Mbps) ": [str(n) for n in download_data[0:int(incremental_capacity_list[i])]], + " Offered upload rate (Mbps) ": upload_list[0:int(incremental_capacity_list[i])], + " Observed Average upload rate (Mbps) ": [str(n) for n in upload_data[0:int(incremental_capacity_list[i])]], + " RSSI (dBm) ": ['' if n == 0 else '-' + str(n) for n in rssi_data[0:int(incremental_capacity_list[i])]], # " Link Speed ":self.link_speed_list[0:int(incremental_capacity_list[i])], + " Average RTT (ms)": avg_rtt_data[0:int(incremental_capacity_list[i])], " Packet Size(Bytes) ": [str(n) for n in packet_size_in_table[0:int(incremental_capacity_list[i])]], } if self.direction == "Bi-direction": - bk_dataframe[" Average Rx Drop B% "] = upload_drop - bk_dataframe[" Average Rx Drop A% "] = download_drop + bk_dataframe[" Average Tx Drop % "] = upload_drop + bk_dataframe[" Average Rx Drop % "] = download_drop elif self.direction == 'Download': - bk_dataframe[" Average Rx Drop A% "] = download_drop + bk_dataframe[" Average Rx Drop % "] = download_drop # adding rx drop while uploading as 0 - bk_dataframe[" Average Rx Drop B% "] = [0.0] * len(download_drop) + bk_dataframe[" Average Tx Drop % "] = [0.0] * len(download_drop) else: - bk_dataframe[" Average Rx Drop B% "] = upload_drop + bk_dataframe[" Average Tx Drop % "] = upload_drop # adding rx drop while downloading as 0 - bk_dataframe[" Average Rx Drop A% "] = [0.0] * len(upload_drop) + bk_dataframe[" Average Rx Drop % "] = [0.0] * len(upload_drop) if self.expected_passfail_value or self.device_csv_name: bk_dataframe[" Expected " + self.direction + " rate "] = [str(n) + " Mbps" for n in test_input_list] bk_dataframe[" Status "] = pass_fail_list @@ -1922,7 +2065,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca # objective title and description report.set_obj_html(_obj_title="Objective", _obj="The Candela Interoperability test is designed to measure an Access Point’s client performance when handling different amounts of Real clients" - " like android, Linux, windows, and IOS. The test allows the user to increase the number of clients in user-defined steps for each test iteration and" + " like android, Linux, windows, MacOS and IOS. The test allows the user to increase the number of clients in user-defined steps for each test iteration and" " measure the per-client throughput for each trial. Along with throughput other measurements made are client connection times, Station 4-Way" " Handshake time, DHCP times, and more. The expected behavior is for the AP to be able to handle several stations (within the limitations of the" " AP specs) and make sure all Clients get a fair amount of airtime both upstream and downstream. An AP that scales well will not show a" @@ -1987,14 +2130,25 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca } report.test_setup_table(test_setup_data=test_setup_info, value="Test Configuration") + if self.interopability_config: + + report.set_obj_html(_obj_title="Configuration Status of Devices", + _obj="The table below shows the configuration status of each device (except iOS) with respect to the SSID connection.") + report.build_objective() + + configured_dataframe = self.convert_to_table(self.configured_devices_check) + dataframe1 = pd.DataFrame(configured_dataframe) + report.set_table_dataframe(dataframe1) + report.build_table() + # Loop through iterations and build graphs, tables for each device for i in range(len(iterations_before_test_stopped_by_user)): - rssi_signal_data = [] + # rssi_signal_data = [] devices_on_running = [] download_data = [] upload_data = [] devices_data_to_create_bar_graph = [] - signal_data = [] + # signal_data = [] upload_drop = [] download_drop = [] direction_in_table = [] @@ -2002,9 +2156,13 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca upload_list, download_list = [], [] rssi_data = [] data_iter = data[data['Iteration'] == i + 1] + avg_rtt_data = [] # Fetch devices_on_running from real_client_list devices_on_running.append(self.real_client_list[data1[i][-1] - 1].split(" ")[-1]) + # If the device fails to configure, skip its data in the report + if self.interopability_config and devices_on_running[0] in self.configured_devices_check and not self.configured_devices_check[devices_on_running[0]]: + continue for k in devices_on_running: # individual_device_data=[] @@ -2012,50 +2170,55 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca # Checking individual device download and upload rate by searching device name in dataframe columns_with_substring = [col for col in data_iter.columns if k in col] filtered_df = data_iter[columns_with_substring] - dl_len = len(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()) - 1 - ul_len = len(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()) - 1 + download_col = filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist() + upload_col = filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist() + upload_drop_col = filtered_df[[col for col in filtered_df.columns if "Tx % Drop" in col][0]].values.tolist() + download_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop" in col][0]].values.tolist() + rssi_col = filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist() if self.direction == "Bi-direction": # Append download and upload data from filtered dataframe - download_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) - upload_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) - upload_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop B" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) - download_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + download_data.append(round(sum(download_col) / len(download_col), 2)) + upload_data.append(round(sum(upload_col) / len(upload_col), 2)) + upload_drop.append(round(sum(upload_drop_col) / len(upload_drop_col), 2)) + download_drop.append(round(sum(download_drop_col) / len(download_drop_col), 2)) rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) - + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Calculate and append upload and download throughput to lists - upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2)) + "Mbps") - download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2)) + "Mbps") + upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2))) + download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2))) direction_in_table.append(self.direction) elif self.direction == 'Download': # Append download data from filtered dataframe - download_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Download" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + download_data.append(round(sum(download_col) / len(download_col), 2)) # Append 0 for upload data upload_data.append(0) rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) - download_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()[1:dl_len]) / (dl_len - 1)), 2)) + download_drop.append(round(sum(download_drop_col) / len(download_drop_col), 2)) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Calculate and append upload and download throughput to lists - upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2)) + "Mbps") - download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2)) + "Mbps") + upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2))) + download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2))) direction_in_table.append(self.direction) elif self.direction == 'Upload': # Calculate and append upload and download throughput to lists - upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2)) + "Mbps") - download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2)) + "Mbps") + upload_list.append(str(round(int(self.cx_profile.side_a_min_bps) / 1000000, 2))) + download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2))) rssi_data.append(int(round(sum(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()) / len(filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()), 2)) * -1) - upload_drop.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Rx % Drop B" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + upload_drop.append(round(sum(upload_drop_col) / len(upload_drop_col), 2)) + avg_rtt_data.append(filtered_df[[col for col in filtered_df.columns if "Average RTT " in col][0]].values.tolist()[-1]) # Append upload data from filtered dataframe - upload_data.append(round((sum(filtered_df[[col for col in filtered_df.columns if "Upload" in col][0]].values.tolist()[1:ul_len]) / (ul_len - 1)), 2)) + upload_data.append(round(sum(upload_col) / len(upload_col), 2)) # Append 0 for download data download_data.append(0) @@ -2202,21 +2365,21 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca bk_dataframe[" MAC "] = self.mac_id_list[int(incremental_capacity_list[i]) - 1] bk_dataframe[" Channel "] = self.channel_list[int(incremental_capacity_list[i]) - 1] bk_dataframe[" Mode"] = self.mode_list[int(incremental_capacity_list[i]) - 1] - bk_dataframe[" Offered download rate "] = download_list[-1] - bk_dataframe[" Observed Average download rate "] = [str(download_data[-1]) + " Mbps"] - bk_dataframe[" Offered upload rate "] = upload_list[-1] - bk_dataframe[" Observed Average upload rate "] = [str(upload_data[-1]) + " Mbps"] - bk_dataframe[" RSSI "] = ['' if rssi_data[-1] == 0 else '-' + str(rssi_data[-1]) + " dbm"] - + bk_dataframe[" Offered download rate (Mbps)"] = download_list[-1] + bk_dataframe[" Observed Average download rate (Mbps)"] = [str(download_data[-1])] + bk_dataframe[" Offered upload rate (Mbps)"] = upload_list[-1] + bk_dataframe[" Observed Average upload rate (Mbps)"] = [str(upload_data[-1])] + bk_dataframe[" Average RTT (ms) "] = avg_rtt_data[-1] + bk_dataframe[" RSSI (dBm)"] = ['' if rssi_data[-1] == 0 else '-' + str(rssi_data[-1])] if self.direction == "Bi-direction": - bk_dataframe[" Average Rx Drop B% "] = upload_drop - bk_dataframe[" Average Rx Drop A% "] = download_drop + bk_dataframe[" Average Tx Drop % "] = upload_drop + bk_dataframe[" Average Rx Drop % "] = download_drop elif self.direction == 'Download': - bk_dataframe[" Average Rx Drop A% "] = download_drop - bk_dataframe[" Average Rx Drop B% "] = [0.0] * len(download_drop) + bk_dataframe[" Average Rx Drop % "] = download_drop + bk_dataframe[" Average Tx Drop % "] = [0.0] * len(download_drop) else: - bk_dataframe[" Average Rx Drop B% "] = upload_drop - bk_dataframe[" Average Rx Drop A% "] = [0.0] * len(upload_drop) + bk_dataframe[" Average Tx Drop % "] = upload_drop + bk_dataframe[" Average Rx Drop % "] = [0.0] * len(upload_drop) # When pass fail criteria is specified if self.expected_passfail_value or self.device_csv_name: bk_dataframe[" Expected " + self.direction + " rate "] = test_input_list @@ -2228,13 +2391,16 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca report.set_custom_html('
') report.build_custom() + if self.dowebgui and self.get_live_view and self.do_interopability: + self.add_live_view_images_to_report(report) + # report.build_custom() report.build_footer() report.write_html() report.write_pdf(_orientation="Landscape") # Creates a separate DataFrame for each group of devices. - def generate_dataframe(self, groupdevlist, typeofdevice, devusername, devssid, devmac, devchannel, devmode, devdirection, devofdownload, devobsdownload, + def generate_dataframe(self, groupdevlist, typeofdevice, devusername, devssid, devmac, devchannel, devmode, devdirection, devofdownload, devrtt, devobsdownload, devoffupload, devobsupload, devrssi, devExpected, devlinkspeed, devpacketsize, devstatus, upload_drop, download_drop): """ Creates a separate DataFrame for each group of devices. @@ -2262,6 +2428,7 @@ def generate_dataframe(self, groupdevlist, typeofdevice, devusername, devssid, d statuslist = [] avg_updrop = [] avg_dndrop = [] + avgrtt = [] interop_tab_data = self.json_get('/adb/')["devices"] for i in range(len(typeofdevice)): for j in groupdevlist: @@ -2279,6 +2446,7 @@ def generate_dataframe(self, groupdevlist, typeofdevice, devusername, devssid, d obsupload.append(devobsupload[i]) rssi.append(devrssi[i]) linkspeed.append(devlinkspeed[i]) + avgrtt.append(devrtt[i]) if len(upload_drop) != 0: avg_updrop.append(upload_drop[i]) if len(download_drop) != 0: @@ -2305,7 +2473,7 @@ def generate_dataframe(self, groupdevlist, typeofdevice, devusername, devssid, d offupload.append(devoffupload[i]) obsupload.append(devobsupload[i]) rssi.append(devrssi[i]) - + avgrtt.append(devrtt[i]) linkspeed.append(devlinkspeed[i]) if len(upload_drop) != 0: avg_updrop.append(upload_drop[i]) @@ -2333,6 +2501,7 @@ def generate_dataframe(self, groupdevlist, typeofdevice, devusername, devssid, d " RSSI ": rssi, " Link Speed ": linkspeed, " Packet Size(Bytes) ": packetsize, + " RTT ": avgrtt } if self.direction == "Bi-direction": @@ -2368,6 +2537,7 @@ def generate_dataframe(self, groupdevlist, typeofdevice, devusername, devssid, d " Observed upload rate ": obsupload, " RSSI ": rssi, " Link Speed ": linkspeed, + " RTT ": avgrtt } if self.direction == "Bi-direction": dataframe[" Average Rx Drop B% "] = avg_updrop @@ -2469,7 +2639,7 @@ def get_pass_fail_list(self, device_type, curr_incremental_capacity, devices_on_ test_input_list.append(5) # when expected_pass_fail value specified else: - for val in [devices_on_running[-1]]: + for _ in [devices_on_running[-1]]: test_input_list.append(self.expected_passfail_value) for k in range(len(test_input_list)): if self.csv_direction.split('_')[2] == 'BiDi': @@ -2514,7 +2684,7 @@ def change_port_to_ip(self, upstream_port): try: target_port_ip = self.json_get(f'/port/{shelf}/{resource}/{port}?fields=ip')['interface']['ip'] upstream_port = target_port_ip - except BaseException: + except Exception: logging.warning(f'The upstream port is not an ethernet port. Proceeding with the given upstream_port {upstream_port}.') logging.info(f"Upstream port IP {upstream_port}") else: @@ -2522,8 +2692,42 @@ def change_port_to_ip(self, upstream_port): return upstream_port + def add_live_view_images_to_report(self, report): + """ + This function looks for live view images for each floor + in the 'live_view_images' folder within `self.result_dir`. + It waits up to **60 seconds** for each image. If an image is found, + it's added to the `report` on a new page; otherwise, it's skipped. + """ + for floor in range(0, int(self.total_floors)): + throughput_image_path = os.path.join(self.result_dir, "live_view_images", f"{self.test_name}_throughput_{floor + 1}.png") + rssi_image_path = os.path.join(self.result_dir, "live_view_images", f"{self.test_name}_rssi_{floor + 1}.png") + timeout = 60 # seconds + start_time = time.time() + + while not (os.path.exists(throughput_image_path) and os.path.exists(rssi_image_path)): + if time.time() - start_time > timeout: + print("Timeout: Images not found within 60 seconds.") + break + time.sleep(1) + while not os.path.exists(throughput_image_path) and not os.path.exists(rssi_image_path): + if os.path.exists(throughput_image_path) and os.path.exists(rssi_image_path): + break + if os.path.exists(throughput_image_path): + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() + + if os.path.exists(rssi_image_path): + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() # To validate the input args + + def validate_args(args): if args.group_name: selected_groups = args.group_name.split(',') @@ -2642,6 +2846,11 @@ def main(): EXAMPLE-4: Command Line Interface to run the test with postcleanup python3 lf_interop_throughput.py --mgr 192.168.214.219 --mgr_port 8080 --upstream_port eth1 --test_duration 1m --download 1000000 --traffic_type lf_udp --do_interopability --postcleanup + +EXAMPLE-5: +Command Line Interface to run the test with individual device configuration +python3 lf_interop_throughput.py --mgr 192.168.204.74 --mgr_port 8080 --upstream_port eth0 --test_duration 30s --traffic_type lf_udp --ssid NETGEAR_2G_wpa2 --passwd Password@123 +--security wpa2 --do_interopability --device_list 1.15,1.400 --download 10000000 --interopability_config SCRIPT_CLASSIFICATION : Test SCRIPT_CATEGORIES: Performance, Functional, Report Generation @@ -2690,7 +2899,7 @@ def main(): required.add_argument('--tos', default="Best_Efforts") required.add_argument('--packet_size', help='Determine the size of the packet in which Packet Size Should be Greater than 16B or less than 64KB(65507)', default="-1") required.add_argument('--incremental_capacity', - help='Specify the incremental values for network load testing as a comma-separated list (e.g., 10,20,30). This defines the increments in bandwidth to evaluate performance under varying load conditions.', + help='Specify the incremental values for network load testing as a comma-separated list (e.g., 10,20,30). This defines the increments in bandwidth to evaluate performance under varying load conditions.', # noqa: E501 default=[]) required.add_argument('--load_type', help="Determine the type of load: < wc_intended_load | wc_per_client_load >", default="wc_per_client_load") required.add_argument('--do_interopability', action='store_true', help='Ensures test on devices run sequentially, capturing each device’s data individually for plotting in the final report.') @@ -2703,6 +2912,8 @@ def main(): optional.add_argument('--security', help='WiFi Security protocol: < open | wep | wpa | wpa2 | wpa3 >', default="open") optional.add_argument('--test_name', help='Specify test name to store the runtime csv results', default=None) optional.add_argument('--result_dir', help='Specify the result dir to store the runtime logs', default='') + optional.add_argument('--get_live_view', help="If true will heatmap will be generated from testhouse automation WebGui ", action='store_true') + optional.add_argument('--total_floors', help="Total floors from testhouse automation WebGui ", default="0") optional.add_argument("--expected_passfail_value", help="Specify the expected number of urls", default=None) optional.add_argument("--device_csv_name", type=str, help='Specify the csv name to store expected url values', default=None) optional.add_argument("--eap_method", type=str, default='DEFAULT', help="Specify the EAP method for authentication.") @@ -2727,6 +2938,8 @@ def main(): optional.add_argument('--profile_name', type=str, help='Specify the profile name to apply configurations to the devices.') optional.add_argument("--wait_time", type=int, help='Specify the maximum time to wait for Configuration', default=60) optional.add_argument("--config", action="store_true", help="Specify for configuring the devices") + optional.add_argument("--interopability_config", action="store_true", help="To do individual configuration for each device in interoperability") + optional.add_argument("--tput_mbps", action="store_true", help="Interpret rated download and upload values as Mbps instead of bytes") parser.add_argument('--help_summary', help='Show summary of what this script does', action="store_true") args = parser.parse_args() @@ -2741,8 +2954,17 @@ def main(): if (args.download == '0'): args.download = '2560' - logger_config = lf_logger_config.lf_logger_config() + # logger_config = lf_logger_config.lf_logger_config() + lf_logger_config.lf_logger_config() + if args.tput_mbps: + if args.download != '2560' and args.download != '0' and args.upload != '0' and args.upload != '2560': + args.download = str(int(args.download) * 1000000) + args.upload = str(int(args.upload) * 1000000) + elif args.upload != '2560' and args.upload != '0': + args.upload = str(int(args.upload) * 1000000) + else: + args.download = str(int(args.download) * 1000000) loads = {} iterations_before_test_stopped_by_user = [] gave_incremental = False @@ -2752,13 +2974,13 @@ def main(): loads_data = loads["download"] elif args.download: loads = {'upload': [], 'download': str(args.download).split(",")} - for i in range(len(args.download)): + for _ in range(len(args.download)): loads['upload'].append(2560) loads_data = loads["download"] else: if args.upload: loads = {'upload': str(args.upload).split(","), 'download': []} - for i in range(len(args.upload)): + for _ in range(len(args.upload)): loads['download'].append(2560) loads_data = loads["upload"] @@ -2836,6 +3058,8 @@ def main(): do_interopability=args.do_interopability, incremental=args.incremental, precleanup=args.precleanup, + get_live_view=args.get_live_view, + total_floors=args.total_floors, csv_direction=csv_direction, expected_passfail_value=args.expected_passfail_value, device_csv_name=args.device_csv_name, @@ -2860,7 +3084,8 @@ def main(): pk_passwd=args.pk_passwd, pac_file=args.pac_file, wait_time=args.wait_time, - config=args.config + config=args.config, + interopability_config=args.interopability_config ) if gave_incremental: @@ -2869,16 +3094,16 @@ def main(): check_condition, clients_to_run = throughput.phantom_check() - if check_condition == False: + if check_condition is False: return check_increment_condition = throughput.check_incremental_list() - if check_increment_condition == False: + if check_increment_condition is False: logger.error("Incremental values given for selected devices are incorrect") return - elif (len(args.incremental_capacity) > 0 and check_increment_condition == False): + elif (len(args.incremental_capacity) > 0 and check_increment_condition is False): logger.error("Incremental values given for selected devices are incorrect") return @@ -2892,10 +3117,11 @@ def main(): for i in range(len(clients_to_run)): # Extend individual_dataframe_column with dynamically generated column names - individual_dataframe_column.extend([f'Download{clients_to_run[i]}', f'Upload{clients_to_run[i]}', f'Rx % Drop A {clients_to_run[i]}', - f'Rx % Drop B{clients_to_run[i]}', f'RSSI {clients_to_run[i]} ', f'Tx-Rate {clients_to_run[i]} ', f'Rx-Rate {clients_to_run[i]} ']) + individual_dataframe_column.extend([f'Download{clients_to_run[i]}', f'Upload{clients_to_run[i]}', f'Rx % Drop {clients_to_run[i]}', + f'Tx % Drop{clients_to_run[i]}', f'Average RTT {clients_to_run[i]}', f'RSSI {clients_to_run[i]}', + f'Tx-Rate {clients_to_run[i]} ', f'Rx-Rate {clients_to_run[i]}']) - individual_dataframe_column.extend(['Overall Download', 'Overall Upload', 'Overall Rx % Drop A', 'Overall Rx % Drop B', 'Iteration', + individual_dataframe_column.extend(['Overall Download', 'Overall Upload', 'Overall Rx % Drop ', 'Overall Tx % Drop', 'Iteration', 'TIMESTAMP', 'Start_time', 'End_time', 'Remaining_Time', 'Incremental_list', 'status']) individual_df = pd.DataFrame(columns=individual_dataframe_column) @@ -2903,6 +3129,11 @@ def main(): overall_end_time = overall_start_time + timedelta(seconds=int(args.test_duration) * len(incremental_capacity_list)) for i in range(len(to_run_cxs)): + is_device_configured = True + if args.do_interopability: + # To get resource of device under test in interopability + device_to_run_resource = throughput.extract_digits_until_alpha(to_run_cxs[i][0]) + # Check the load type specified by the user if args.load_type == "wc_intended_load": # Perform intended load for the current iteration @@ -2915,19 +3146,30 @@ def main(): # Start specific connections for the current iteration throughput.start_specific(created_cx_lists_keys[:incremental_capacity_list[i]]) else: - if (args.do_interopability and i != 0): + if args.do_interopability and i != 0: throughput.stop_specific(to_run_cxs[i - 1]) time.sleep(5) - throughput.start_specific(to_run_cxs[i]) + if args.interopability_config: + if args.do_interopability and i == 0: + # To disconnect all the selected devices at the starting selected + throughput.disconnect_all_devices() + if args.do_interopability and "iOS" not in to_run_cxs[i][0]: + logger.info("Configuring device of resource{}".format(to_run_cxs[i][0])) + # To configure device which is under test + is_device_configured = throughput.configure_specific([device_to_run_resource]) + if is_device_configured: + throughput.start_specific(to_run_cxs[i]) # Determine device names based on the current iteration device_names = created_cx_lists_keys[:to_run_cxs_len[i][-1]] # Monitor throughput and capture all dataframes and test stop status - all_dataframes, test_stopped_by_user = throughput.monitor(i, individual_df, device_names, incremental_capacity_list, overall_start_time, overall_end_time) - + all_dataframes, test_stopped_by_user = throughput.monitor(i, individual_df, device_names, incremental_capacity_list, overall_start_time, overall_end_time, is_device_configured) + if args.do_interopability and "iOS" not in to_run_cxs[i][0] and args.interopability_config: + # Disconnecting device after running the test + throughput.disconnect_all_devices([device_to_run_resource]) # Check if the test was stopped by the user - if test_stopped_by_user == False: + if test_stopped_by_user is False: # Append current iteration index to iterations_before_test_stopped_by_user iterations_before_test_stopped_by_user.append(i) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index f54e71d7e..768a24f49 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -125,12 +125,18 @@ class VideoStreamingTest(Realm): def __init__(self, host, ssid, passwd, encryp, media_source, media_quality, suporrted_release=None, max_speed=None, url=None, urls_per_tenm=None, duration=None, resource_ids=None, dowebgui=False, result_dir="", test_name=None, incremental=None, postcleanup=False, precleanup=False, - pass_fail_val=None, csv_name=None, groups=None, profiles=None, config=None, file_name=None): + pass_fail_val=None, csv_name=None, groups=None, profiles=None, config=None, file_name=None, + floors=None, + get_live_view=None, + upstream_port=None, + device_list=None, + webgui_incremental=None): super().__init__(lfclient_host=host, lfclient_port=8080) self.adb_device_list = None self.host = host self.phn_name = [] self.ssid = ssid + self.test_setup_info_ssid = ssid self.passwd = passwd self.encryp = encryp self.media_source = media_source @@ -183,6 +189,12 @@ def __init__(self, host, ssid, passwd, encryp, media_source, media_quality, supo self.selected_profiles = profiles self.config = config self.file_name = file_name + self.floors = floors + self.get_live_view = get_live_view + self.config_obj = None + self.upstream_port = upstream_port + self.device_list = device_list + self.webgui_incremental = webgui_incremental @property def run(self): @@ -1213,7 +1225,7 @@ def generate_report(self, date, iterations_before_test_stopped_by_user, test_set report.set_table_title("Input Parameters") report.build_table_title() if self.config: - test_setup_info["SSID"] = self.ssid + test_setup_info["SSID"] = self.test_setup_info_ssid test_setup_info["Password"] = self.passwd test_setup_info["ENCRYPTION"] = self.encryp elif len(self.selected_groups) > 0 and len(self.selected_profiles) > 0: @@ -1435,6 +1447,7 @@ def generate_report(self, date, iterations_before_test_stopped_by_user, test_set report.set_graph_image(graph_png) report.move_graph_image() report.build_graph() + self.add_buffer_and_wait_time_images(report=report) # Table 1 report.set_obj_html("Overall - Detailed Result Table", "The below tables provides detailed information for the Video Streaming test.") @@ -1607,6 +1620,169 @@ def validate_args(self): logging.error("Please provide ssid password and security for configuration of devices") exit(1) + def add_buffer_and_wait_time_images(self, report): + """ + Adds VS buffer and wait time heatmap images to the report for each floor. + Waits for image generation and inserts them into the report if available. + """ + if self.dowebgui and self.get_live_view: + report.set_custom_html("

No of Buffers and Wait Time %

") + report.build_custom() + + for floor in range(int(self.floors)): + vs_buffer_image = os.path.join(self.result_dir, "live_view_images", f"{self.test_name}_vs_buffer_{floor + 1}.png") + vs_wait_time_image = os.path.join(self.result_dir, "live_view_images", f"{self.test_name}_vs_wait_time_{floor + 1}.png") + + timeout = 60 # seconds + start_time = time.time() + + while not (os.path.exists(vs_buffer_image) and os.path.exists(vs_wait_time_image)): + if time.time() - start_time > timeout: + print(f"Timeout: Heatmap images for floor {floor + 1} not found within {timeout} seconds.") + break + time.sleep(1) + + for image_path in [vs_buffer_image, vs_wait_time_image]: + if os.path.exists(image_path): + report.set_custom_html(f'') + report.build_custom() + + def handle_groups_profiles_config(self): + config_devices = {} + for i in range(len(self.selected_groups)): + config_devices[self.selected_groups[i]] = self.selected_profiles[i] + self.config_obj.initiate_group() + asyncio.run(self.config_obj.connectivity(config_devices, upstream=self.upstream_port)) + + adbresponse = self.config_obj.adb_obj.get_devices() + resource_manager = self.config_obj.laptop_obj.get_devices() + all_res = {} + df1 = self.config_obj.display_groups(self.config_obj.groups) + groups_list = df1.to_dict(orient='list') + group_devices = {} + for adb in adbresponse: + group_devices[adb['serial']] = adb['eid'] + for res in resource_manager: + all_res[res['hostname']] = res['shelf'] + '.' + res['resource'] + eid_list = [] + for grp_name in groups_list.keys(): + for g_name in self.selected_groups: + if grp_name == g_name: + for j in groups_list[grp_name]: + if j in group_devices.keys(): + eid_list.append(group_devices[j]) + elif j in all_res.keys(): + eid_list.append(all_res[j]) + device_list = ",".join(eid_list) + return device_list + + def handle_ssid_based_device_config(self, config_dict): + # When group/profile are not provided + if self.device_list: + all_devices = self.config_obj.get_all_devices() + dev_list = self.device_list.split(',') + self.device_list = asyncio.run(self.config_obj.connectivity(device_list=dev_list, wifi_config=config_dict, upstream=self.upstream_port)) + else: + if self.config: + all_devices = self.config_obj.get_all_devices() + device_list = [] + for device in all_devices: + if device["type"] != 'laptop': + device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["serial"]) + elif device["type"] == 'laptop': + device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["hostname"]) + print("Available devices:") + for device in device_list: + print(device) + self.device_list = input("Enter the desired resources to run the test:") + dev1_list = self.device_list.split(',') + self.device_list = asyncio.run(self.config_obj.connectivity(device_list=dev1_list, wifi_config=config_dict, upstream=self.upstream_port)) + return ",".join(self.device_list) + + def process_incremental_capacity(self, incremental_capacity_list_values, available_resources, gave_incremental): + if incremental_capacity_list_values[-1] != len(available_resources): + logger.error("Incremental capacity doesnt match available devices") + if self.postcleanup: + self.postcleanup() + exit(1) + # Process resource IDs and incremental values if specified + if self.resource_ids: + if self.incremental: + self.test_setup_info_incremental_values = ','.join([str(n) for n in incremental_capacity_list_values]) + if len(self.incremental) == len(available_resources): + test_setup_info_total_duration = self.duration + elif len(self.incremental) == 1 and len(available_resources) > 1: + if self.incremental[0] == len(available_resources): + test_setup_info_total_duration = self.duration + else: + div = len(available_resources) // self.incremental[0] + mod = len(available_resources) % self.incremental[0] + if mod == 0: + test_setup_info_total_duration = self.duration * (div) + else: + test_setup_info_total_duration = self.duration * (div + 1) + else: + test_setup_info_total_duration = self.duration * len(incremental_capacity_list_values) + else: + test_setup_info_total_duration = self.duration + + if self.webgui_incremental: + self.test_setup_info_incremental_values = ','.join([str(n) for n in incremental_capacity_list_values]) + elif gave_incremental: + self.test_setup_info_incremental_values = "No Incremental Value provided" + self.total_duration = test_setup_info_total_duration + + def create_test_setup_info(self, media_source, media_quality): + if self.resource_ids: + username = [] + + try: + eid_data = self.json_get("ports?fields=alias,mac,mode,Parent Dev,rx-rate,tx-rate,ssid,signal") + except KeyError: + logger.error("Error: 'interfaces' key not found in port data") + exit(1) + + resource_ids = list(map(int, self.resource_ids.split(','))) + for alias in eid_data["interfaces"]: + for i in alias: + if int(i.split(".")[1]) > 1 and alias[i]["alias"] == 'wlan0': + resource_hw_data = self.json_get("/resource/" + i.split(".")[0] + "/" + i.split(".")[1]) + hw_version = resource_hw_data['resource']['hw version'] + if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids: + username.append(resource_hw_data['resource']['user']) + + self.device_list_str = ','.join([f"{name} ( Android )" for name in username]) + + test_setup_info = { + "Testname": self.test_name, + "Device List": self.device_list_str, + "No of Devices": "Total" + "( " + str(len(username)) + " ): Android(" + str(len(username)) + ")", + "Incremental Values": "", + "URL": self.url, + "Media Source": media_source, + "Media Quality": media_quality + } + test_setup_info['Incremental Values'] = self.test_setup_info_incremental_values + # test_setup_info['Total Duration (min)'] = str(self.test_setup_info_total_duration) + return test_setup_info + + def updating_webui_running_json(self): + data = {} + data_dict = { + 'configured_devices': [self.device_list_str], + 'configuration_status': "configured" + } + file_path = self.result_dir + "/../../Running_instances/{}_{}_running.json".format(self.host, self.test_name) + + with open(file_path, 'r') as file: + data = json.load(file) + + for key in data_dict: + data[key] = data_dict[key] + + with open(file_path, 'w') as file: + json.dump(data, file, indent=4) + def main(): help_summary = '''\ @@ -1762,6 +1938,15 @@ def main(): parser.add_argument("--wait_time", type=int, help="Specify the time for configuration", default=60) parser.add_argument('--config', action='store_true', help='specify this flag whether to config devices or not') parser.add_argument("--device_csv_name", type=str, help="Specify the device csv name for pass/fail", default=None) + + # Arguments Related to Testhouse + parser.add_argument('--get_live_view', + action="store_true", + help='specify this flag to get the liveview of the devices') + parser.add_argument('--floors', + type=int, + default=0, + help='specify the Number of floors there in the house') args = parser.parse_args() if args.help_summary: @@ -1826,13 +2011,16 @@ def main(): groups=args.group_name, profiles=args.profile_name, config=args.config, - file_name=args.file_name + file_name=args.file_name, + floors=args.floors, + get_live_view=args.get_live_view ) args.upstream_port = obj.change_port_to_ip(args.upstream_port) + obj.upstream_port = args.upstream_port obj.validate_args() - config_obj = DeviceConfig.DeviceConfig(lanforge_ip=args.host, file_name=args.file_name) + obj.config_obj = DeviceConfig.DeviceConfig(lanforge_ip=args.host, file_name=args.file_name, wait_time=args.wait_time) if not args.expected_passfail_value and args.device_csv_name is None: - config_obj.device_csv_file(csv_name="device.csv") + obj.config_obj.device_csv_file(csv_name="device.csv") resource_ids_sm = [] resource_set = set() @@ -1840,35 +2028,9 @@ def main(): resource_ids_generated = "" if args.group_name and args.file_name and args.profile_name: - selected_groups = args.group_name.split(',') - selected_profiles = args.profile_name.split(',') - config_devices = {} - for i in range(len(selected_groups)): - config_devices[selected_groups[i]] = selected_profiles[i] - config_obj.initiate_group() - asyncio.run(config_obj.connectivity(config_devices, upstream=args.upstream_port)) + args.device_list = obj.handle_groups_profiles_config() - adbresponse = config_obj.adb_obj.get_devices() - resource_manager = config_obj.laptop_obj.get_devices() - all_res = {} - df1 = config_obj.display_groups(config_obj.groups) - groups_list = df1.to_dict(orient='list') - group_devices = {} - for adb in adbresponse: - group_devices[adb['serial']] = adb['eid'] - for res in resource_manager: - all_res[res['hostname']] = res['shelf'] + '.' + res['resource'] - eid_list = [] - for grp_name in groups_list.keys(): - for g_name in selected_groups: - if grp_name == g_name: - for j in groups_list[grp_name]: - if j in group_devices.keys(): - eid_list.append(group_devices[j]) - elif j in all_res.keys(): - eid_list.append(all_res[j]) - args.device_list = ",".join(id for id in eid_list) - else: + elif args.config: # When group/profile are not provided config_dict = { 'ssid': args.ssid, @@ -1893,69 +2055,28 @@ def main(): 'pac_file': args.pac_file, 'server_ip': args.upstream_port } - if args.device_list: - all_devices = config_obj.get_all_devices() - if args.group_name is None and args.file_name is None and args.profile_name is None: - dev_list = args.device_list.split(',') - if args.config: - asyncio.run(config_obj.connectivity(device_list=dev_list, wifi_config=config_dict)) - else: - if args.config: - all_devices = config_obj.get_all_devices() - device_list = [] - for device in all_devices: - if device["type"] != 'laptop': - device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["serial"]) - elif device["type"] == 'laptop': - device_list.append(device["shelf"] + '.' + device["resource"] + " " + device["hostname"]) - print("Available devices:") - for device in device_list: - print(device) - args.device_list = input("Enter the desired resources to run the test:") - dev1_list = args.device_list.split(',') - asyncio.run(config_obj.connectivity(device_list=dev1_list, wifi_config=config_dict)) - else: - obj.android_devices = obj.devices.get_devices(only_androids=True) - selected_devices, report_labels, selected_macs = obj.devices.query_user() - if not selected_devices: - logging.info("devices donot exist..!!") - return + obj.device_list = args.device_list - obj.android_list = selected_devices - # Verify if all resource IDs are valid for Android devices - if obj.android_list: - resource_ids = ",".join([item.split(".")[1] for item in obj.android_list]) + args.device_list = obj.handle_ssid_based_device_config(config_dict) - num_list = list(map(int, resource_ids.split(','))) + # process devices when test is run through webui + if args.dowebgui: + resource_set = set(args.device_list) + resource_list = sorted(resource_set) + resource_ids_generated = ",".join(resource_list) + resource_list_sorted = resource_list + obj.android_devices = obj.devices.get_devices(only_androids=True) - # Sort the list - num_list.sort() + selected_devices, report_labels, selected_macs = obj.devices.query_user( + dowebgui=args.dowebgui, + device_list=resource_ids_generated + ) + args.device_list = args.device_list.split(',') - # Join the sorted list back into a string - sorted_string = ','.join(map(str, num_list)) + obj.resource_ids = ",".join(id.split(".")[1] for id in args.device_list) - obj.resource_ids = sorted_string - resource_ids1 = list(map(int, sorted_string.split(','))) - modified_list = list(map(lambda item: int(item.split('.')[1]), obj.android_devices)) - if not all(x in modified_list for x in resource_ids1): - logging.info("Verify Resource ids, as few are invalid...!!") - exit() - resource_ids_sm = obj.resource_ids - resource_list = resource_ids_sm.split(',') - resource_set = set(resource_list) - resource_list_sorted = sorted(resource_set) - resource_ids_generated = ','.join(resource_list_sorted) - available_resources = list(resource_set) + available_resources = [int(num) for num in obj.resource_ids.split(",")] - if args.dowebgui: - resource_ids_sm = args.device_list.split(',') - resource_set = set(resource_ids_sm) - resource_list = sorted(resource_set) - resource_ids_generated = ','.join(resource_list) - resource_list_sorted = resource_list - selected_devices, report_labels, selected_macs = obj.devices.query_user(dowebgui=args.dowebgui, device_list=resource_ids_generated) - obj.resource_ids = ",".join(id.split(".")[1] for id in args.device_list.split(",")) - available_resources = [int(num) for num in obj.resource_ids.split(',')] else: obj.android_devices = obj.devices.get_devices(only_androids=True) if args.device_list: @@ -1974,6 +2095,38 @@ def main(): logger.info(f"{dev} device is not available") # Final list of available Android resource IDs available_resources = sorted(set(int(dev.split('.')[1]) for dev in obj.android_list)) + else: + obj.android_devices = obj.devices.get_devices(only_androids=True) + selected_devices, report_labels, selected_macs = obj.devices.query_user() + if not selected_devices: + logging.info("devices donot exist..!!") + return + + obj.android_list = selected_devices + # Verify if all resource IDs are valid for Android devices + if obj.android_list: + resource_ids = ",".join([item.split(".")[1] for item in obj.android_list]) + + num_list = list(map(int, resource_ids.split(','))) + + # Sort the list + num_list.sort() + + # Join the sorted list back into a string + sorted_string = ','.join(map(str, num_list)) + + obj.resource_ids = sorted_string + resource_ids1 = list(map(int, sorted_string.split(','))) + modified_list = list(map(lambda item: int(item.split('.')[1]), obj.android_devices)) + if not all(x in modified_list for x in resource_ids1): + logging.info("Verify Resource ids, as few are invalid...!!") + exit() + resource_ids_sm = obj.resource_ids + resource_list = resource_ids_sm.split(',') + resource_set = set(resource_list) + resource_list_sorted = sorted(resource_set) + resource_ids_generated = ','.join(resource_list_sorted) + available_resources = list(resource_set) logger.info(f"Available devices: {available_resources}") if len(available_resources) != 0: available_resources = obj.filter_ios_devices(available_resources) @@ -2061,41 +2214,12 @@ def main(): args.duration = int(args.duration) incremental_capacity_list_values = obj.get_incremental_capacity_list() - if incremental_capacity_list_values[-1] != len(available_resources): - logger.error("Incremental capacity doesnt match available devices") - if args.postcleanup: - obj.postcleanup() - exit(1) - # Process resource IDs and incremental values if specified - if obj.resource_ids: - if obj.incremental: - test_setup_info_incremental_values = ','.join([str(n) for n in incremental_capacity_list_values]) - if len(obj.incremental) == len(available_resources): - test_setup_info_total_duration = args.duration - elif len(obj.incremental) == 1 and len(available_resources) > 1: - if obj.incremental[0] == len(available_resources): - test_setup_info_total_duration = args.duration - else: - div = len(available_resources) // obj.incremental[0] - mod = len(available_resources) % obj.incremental[0] - if mod == 0: - test_setup_info_total_duration = args.duration * (div) - else: - test_setup_info_total_duration = args.duration * (div + 1) - else: - test_setup_info_total_duration = args.duration * len(incremental_capacity_list_values) - else: - test_setup_info_total_duration = args.duration - - if args.webgui_incremental: - test_setup_info_incremental_values = ','.join([str(n) for n in incremental_capacity_list_values]) - elif gave_incremental: - test_setup_info_incremental_values = "No Incremental Value provided" - obj.total_duration = test_setup_info_total_duration - + obj.process_incremental_capacity(incremental_capacity_list_values, available_resources, gave_incremental) actual_start_time = datetime.now() - iterations_before_test_stopped_by_user = [] + test_setup_info = obj.create_test_setup_info(media_source=media_source, media_quality=media_quality) + if args.dowebgui: + obj.updating_webui_running_json() # Calculate and manage cx_order_list ( list of cross connections to run ) based on incremental values if obj.resource_ids: @@ -2133,7 +2257,7 @@ def main(): for i in range(len(cx_order_list)): if i == 0: obj.data["start_time_webGUI"] = [datetime.now().strftime('%Y-%m-%d %H:%M:%S')] - end_time_webGUI = (datetime.now() + timedelta(minutes=obj.total_duration)).strftime('%Y-%m-%d %H:%M:%S') + end_time_webGUI = (datetime.now() + timedelta(minutes=int(args.duration))).strftime('%Y-%m-%d %H:%M:%S') obj.data['end_time_webGUI'] = [end_time_webGUI] # time.sleep(10) @@ -2169,42 +2293,7 @@ def main(): iterations_before_test_stopped_by_user.append(i) break obj.stop() - - if obj.resource_ids: - - date = str(datetime.now()).split(",")[0].replace(" ", "-").split(".")[0] - username = [] - - try: - eid_data = obj.json_get("ports?fields=alias,mac,mode,Parent Dev,rx-rate,tx-rate,ssid,signal") - except KeyError: - logger.error("Error: 'interfaces' key not found in port data") - exit(1) - - resource_ids = list(map(int, obj.resource_ids.split(','))) - for alias in eid_data["interfaces"]: - for i in alias: - if int(i.split(".")[1]) > 1 and alias[i]["alias"] == 'wlan0': - resource_hw_data = obj.json_get("/resource/" + i.split(".")[0] + "/" + i.split(".")[1]) - hw_version = resource_hw_data['resource']['hw version'] - if not hw_version.startswith(('Win', 'Linux', 'Apple')) and int(resource_hw_data['resource']['eid'].split('.')[1]) in resource_ids: - username.append(resource_hw_data['resource']['user']) - - device_list_str = ','.join([f"{name} ( Android )" for name in username]) - - test_setup_info = { - "Testname": args.test_name, - "Device List": device_list_str, - "No of Devices": "Total" + "( " + str(len(keys)) + " ): Android(" + str(len(keys)) + ")", - "Incremental Values": "", - "URL": args.url, - "Media Source": media_source.upper(), - "Media Quality": media_quality - } - test_setup_info['Incremental Values'] = test_setup_info_incremental_values - test_setup_info['Total Duration (min)'] = str(test_setup_info_total_duration) - - logging.info("Test Completed") + date = str(datetime.now()).split(",")[0].replace(" ", "-").split(".")[0] # prev_inc_value = 0 if obj.resource_ids and obj.incremental: diff --git a/py-scripts/lf_json_api.py b/py-scripts/lf_json_api.py index 91ede185b..37b596e33 100755 --- a/py-scripts/lf_json_api.py +++ b/py-scripts/lf_json_api.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: lf_json_api.py @@ -39,8 +38,8 @@ from pandas import json_normalize import json import traceback -import csv -import time +# import csv +# import time if sys.version_info[0] != 3: @@ -89,7 +88,6 @@ def __init__(self, # convert write to w and append to a self.update_csv_mode() - """ Reporting, json, and general use functions: """ def update_csv_mode(self): @@ -107,9 +105,9 @@ def update_endpoint_info(self): if not self.endpoint: return - #logger.error("update-endpoint-info, endpoint: %s non-endpoint: %s"%(self.endpoint, self.non_endpoint)); + # logger.error("update-endpoint-info, endpoint: %s non-endpoint: %s"%(self.endpoint, self.non_endpoint)); self.shelf, self.resource, self.port_name, self.endpoint_name, *nil = LFUtils.name_to_eid(self.endpoint, non_port=True) - logger.debug("shelf : {shelf} , resource : {resource}, port_name : {port_name}, endpoint_name : {endpoint_name}".format(shelf=self.shelf, resource=self.resource, port_name=self.port_name, endpoint_name=self.endpoint_name)) + logger.debug("shelf : {shelf} , resource : {resource}, port_name : {port_name}, endpoint_name : {endpoint_name}".format(shelf=self.shelf, resource=self.resource, port_name=self.port_name, endpoint_name=self.endpoint_name)) # noqa: E501 # the request can change def reformat_json(self, json_data): @@ -124,7 +122,7 @@ def reformat_json(self, json_data): inner_data = i[list(i.keys())[0]] # getting the data under each device/port/object name in list lines.append(pandas.json_normalize(inner_data)) return pandas.concat(lines, ignore_index=True) - + # TODO this is a generic one. def get_request_information(self, port=None @@ -183,7 +181,6 @@ def get_request_information(self, port=None return lanforge_json, lanforge_text, lanforge_json_formatted - """ Port Manager tab and station functions: """ # give information on a single station if the mac is entered. @@ -211,7 +208,7 @@ def get_request_single_station_information(self, port=None): request_command, auth=( self.lf_user, self.lf_passwd)) - logger.info("equivalent curl command: curl --user \"lanforge:lanforge\" -H 'Accept: application/json' http://{lf_mgr}:{lf_port}/{request}/{shelf}/{resource}/{port_name}/{mac} | json_pp ".format( + logger.info("equivalent curl command: curl --user \"lanforge:lanforge\" -H 'Accept: application/json' http://{lf_mgr}:{lf_port}/{request}/{shelf}/{resource}/{port_name}/{mac} | json_pp ".format( # noqa: E501 lf_mgr=self.lf_mgr, lf_port=self.lf_port, request=self.request, shelf=self.shelf, resource=self.resource, port_name=self.port_name, mac=self.mac )) @@ -229,7 +226,7 @@ def get_request_single_station_information(self, port=None): lanforge_json_formatted = json.dumps(lanforge_json, indent=4) logger.info("lanforge_json_formatted: {json}".format(json=lanforge_json_formatted)) - logger.info("equivalent curl command: curl --user \"lanforge:lanforge\" -H 'Accept: application/json' http://{lf_mgr}:{lf_port}/{request}/{shelf}/{resource}/{port_name}/{mac} | json_pp ".format( + logger.info("equivalent curl command: curl --user \"lanforge:lanforge\" -H 'Accept: application/json' http://{lf_mgr}:{lf_port}/{request}/{shelf}/{resource}/{port_name}/{mac} | json_pp ".format( # noqa: E501 lf_mgr=self.lf_mgr, lf_port=self.lf_port, request=self.request, shelf=self.shelf, resource=self.resource, port_name=self.port_name, mac=self.mac )) @@ -316,7 +313,7 @@ def update_port_info(self): if not self.port: return - #logger.error("update-port-info, port: %s non-port: %s"%(self.port, self.non_port)); + # logger.error("update-port-info, port: %s non-port: %s"%(self.port, self.non_port)); self.shelf, self.resource, self.port_name, *nil = LFUtils.name_to_eid(self.port) logger.debug("shelf : {shelf} , resource : {resource}, port_name : {port_name}".format(shelf=self.shelf, resource=self.resource, port_name=self.port_name)) # the request can change @@ -430,7 +427,6 @@ def get_request_wifi_stats_information(self, port=None): # TODO just return lanforge_json and lanforge_txt, lanfore_json_formated to is may be the same for all commands return lanforge_json, csv_file_wifi_stats, lanforge_text, lanforge_json_formatted - # TODO This method is left in for an example it was taken from @@ -487,7 +483,7 @@ def post_clear_port_counters(self, port=None): logger.info("request url: {request_url}".format(request_url=request_url)) logger.info("request status_code {status}".format(status=request.status_code)) - logger_msg = ("equivalent curl command: curl --user \"lanforge:lanforge\" -H 'Accept: application/json' -H 'Content-type: application/json' -X POST -d \"{json_data} http://{lf_mgr}:{lf_port}/{request}/{shelf}/{resource}/{port_name} | json_pp ".format( + logger_msg = ("equivalent curl command: curl --user \"lanforge:lanforge\" -H 'Accept: application/json' -H 'Content-type: application/json' -X POST -d \"{json_data} http://{lf_mgr}:{lf_port}/{request}/{shelf}/{resource}/{port_name} | json_pp ".format( # noqa: E501 json_data=json_data, lf_mgr=self.lf_mgr, lf_port=self.lf_port, request=self.request, shelf=self.shelf, resource=self.resource, port_name=self.port_name )) logger.info(logger_msg) @@ -554,8 +550,9 @@ def get_request_layer4_information(self, endpoint=None): try: # key = "{shelf}.{resource}.{port_name}".format(shelf=self.shelf, resource=self.resource, port_name=self.port_name) key = 'endpoint' - df = json_normalize(lanforge_json[key]) - csv_file_layer4 = "{shelf}.{resource}.{port_name}.{endpoint_name}_{request}.csv".format(shelf=self.shelf, resource=self.resource, port_name=self.port_name, endpoint_name=self.endpoint_name, request=self.request) + # df = json_normalize(lanforge_json[key]) + json_normalize(lanforge_json[key]) + csv_file_layer4 = "{shelf}.{resource}.{port_name}.{endpoint_name}_{request}.csv".format(shelf=self.shelf, resource=self.resource, port_name=self.port_name, endpoint_name=self.endpoint_name, request=self.request) # noqa: E501 # TODO: self.csv_mode & self.csv_header have not been instantiated: # df.to_csv(csv_file_layer4, mode = self.csv_mode, header = self.csv_header, index=False) except Exception as x: @@ -565,7 +562,6 @@ def get_request_layer4_information(self, endpoint=None): # TODO just return lanforge_json and lanforge_txt, lanfore_json_formated to is may be the same for all commands return lanforge_json, lanforge_text, lanforge_json_formatted, csv_file_layer4 - """Generic tab functions:""" # give information on a single station if the mac is entered. @@ -582,13 +578,13 @@ def get_request_generic_information(self, endpoint=None): # https://docs.python-requests.org/en/latest/ # https://stackoverflow.com/questions/26000336/execute-curl-command-within-a-python-script - use requests # - # curl --user "lanforge:lanforge" -H 'Accept: application/json' http://192.168.100.116:8080/generic/generic-sta00?fields=name,eid,status,rpt%23,tx+bytes,rx+bytes,tx+pkts,pdu/s+tx,rx+pkts,pdu/s+rx,dropped,bps+tx,bps+rx,command,rpt+timer,elapsed,type | json_pp - # curl --user "lanforge:lanforge" -H 'Accept: application/json' http://192.168.100.116:8080/generic/{name}?fields=fields=name,eid,status,rpt%23,tx+bytes,rx+bytes,tx+pkts,pdu/s+tx,rx+pkts,pdu/s+rx,dropped,bps+tx,bps+rx,command,rpt+timer,elapsed,type | json_pp + # curl --user "lanforge:lanforge" -H 'Accept: application/json' http://192.168.100.116:8080/generic/generic-sta00?fields=name,eid,status,rpt%23,tx+bytes,rx+bytes,tx+pkts,pdu/s+tx,rx+pkts,pdu/s+rx,dropped,bps+tx,bps+rx,command,rpt+timer,elapsed,type | json_pp # noqa: E501 + # curl --user "lanforge:lanforge" -H 'Accept: application/json' http://192.168.100.116:8080/generic/{name}?fields=fields=name,eid,status,rpt%23,tx+bytes,rx+bytes,tx+pkts,pdu/s+tx,rx+pkts,pdu/s+rx,dropped,bps+tx,bps+rx,command,rpt+timer,elapsed,type | json_pp # noqa: E501 # where --user "USERNAME:PASSWORD" # generic fields - #fields = 'name,eid,status,rpt%23,tx+bytes,rx+bytes,tx+pkts,pdu/s+tx,rx+pkts,pdu/s+rx,dropped,bps+tx,bps+rx,command,rpt+timer,elapsed,type' - fields='all' + # fields = 'name,eid,status,rpt%23,tx+bytes,rx+bytes,tx+pkts,pdu/s+tx,rx+pkts,pdu/s+rx,dropped,bps+tx,bps+rx,command,rpt+timer,elapsed,type' + fields = 'all' request_command = 'http://{lfmgr}:{lfport}/{request}/{endpoint_name}?fields={fields}'.format( lfmgr=self.lf_mgr, lfport=self.lf_port, request=self.request, endpoint_name=self.endpoint_name, fields=fields) logger.debug("request_command: {request_command}".format(request_command=request_command)) @@ -638,7 +634,7 @@ def get_request_adb_information(self, port=None): # http://192.168.100.116:8080/{request}/1/1/wlan4 | json_pp # where --user "USERNAME:PASSWORD" request_command = 'http://{lfmgr}:{lfport}/adb/1/{resource}/{port_name}'.format( - lfmgr=self.lf_mgr, lfport=self.lf_port, request=self.request, resource=self.resource, port_name=self.port_name) + lfmgr=self.lf_mgr, lfport=self.lf_port, resource=self.resource, port_name=self.port_name) request = requests.get( request_command, auth=( self.lf_user, self.lf_passwd)) @@ -672,9 +668,11 @@ def get_request_adb_information(self, port=None): return lanforge_json, lanforge_text, lanforge_json_formatted # unit test + + def main(): - lfjson_host = "localhost" - lfjson_port = 8080 + # lfjson_host = "localhost" + # lfjson_port = 8080 parser = argparse.ArgumentParser( prog="lf_json_api.py", formatter_class=argparse.RawTextHelpFormatter, @@ -719,10 +717,9 @@ def main(): parser.add_argument("--csv_mode", type=str, help="--csv_mode 'write' or 'append' default: write", choices=['append', 'write'], default='write') parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - args = parser.parse_args() - help_summary='''\ + help_summary = '''\ This script will is an example of using LANforge JSON API to use GET Requests to LANforge. ''' if args.help_summary: @@ -795,7 +792,8 @@ def main(): elif get_request == "alerts": lf_json.request = get_request - lanforge_alerts_json = lf_json.get_alerts_information() + # lanforge_alerts_json = lf_json.get_alerts_information() + lf_json.get_alerts_information() elif get_request == "wifi-stats": lf_json.request = get_request diff --git a/py-scripts/lf_json_util.py b/py-scripts/lf_json_util.py index 91257e9bb..908ab3bb2 100755 --- a/py-scripts/lf_json_util.py +++ b/py-scripts/lf_json_util.py @@ -1,8 +1,7 @@ #!/usr/bin/env python3 -# flake8: noqa import argparse -help_summary='''\ +help_summary = '''\ This file contains a helper module standardize_json_results. standardize_json_results takes a dict of information retrieved from json_get and standardizes it to use the plural version of the data requested. @@ -12,29 +11,28 @@ def standardize_json_results(results): - f'''{help_summary} - TODO: Add functionality to handle other plural vs singular data representations - ''' - if 'endpoints' not in results: + # TODO: Add functionality to handle other plural vs singular data representations + if 'endpoints' not in results: tmp_results = {} print(results) results = results['endpoint'] - name = results['name'] + name = results['name'] # noqa: F841 tmp_results['endpoints'] = [] tmp_results['endpoints'].append({results['name']: results}) results = tmp_results return results['endpoints'] -# used so help summary may work + def main(): + # Only print help summary when invoked from command line parser = argparse.ArgumentParser( - prog="lf_json_api.py", + prog="lf_json_util.py", formatter_class=argparse.RawTextHelpFormatter, description=f"""{help_summary}""") parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') args = parser.parse_args() - + if args.help_summary: print(help_summary) exit(0) @@ -42,4 +40,3 @@ def main(): if __name__ == "__main__": main() - diff --git a/py-scripts/lf_kpi_csv.py b/py-scripts/lf_kpi_csv.py index 5198af426..2b2ec8efd 100755 --- a/py-scripts/lf_kpi_csv.py +++ b/py-scripts/lf_kpi_csv.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_kpi_csv.py @@ -56,8 +55,8 @@ # Do Not pass in headers , Please use the defaults class lf_kpi_csv: def __init__(self, - # NOTE, Passing in _kpi_headers only used for testing. - # Do Not pass in headers , Please use the defaults + # NOTE, Passing in _kpi_headers only used for testing. + # Do Not pass in headers , Please use the defaults _kpi_headers=None, _kpi_filename='kpi.csv', # Currently this is the only file name accepted _kpi_path="", @@ -199,7 +198,7 @@ def main(): ''' parser.add_argument('--help_summary', default=None, action="store_true", help='Show summary of what this script does') - help_summary='''\ + help_summary = '''\ This module is included to assist in filling out the kpi.csv correctly. The kpi.csv is used for graphing data over multiple test runs. The Unit test is used for helping to become familiar with the library diff --git a/py-scripts/lf_logger_config.py b/py-scripts/lf_logger_config.py index cf21d391c..71ad72e63 100755 --- a/py-scripts/lf_logger_config.py +++ b/py-scripts/lf_logger_config.py @@ -1,13 +1,17 @@ #!/usr/bin/env python3 -# flake8: noqa +import sys +import json +import logging +import logging.config +import argparse # used for help summary -help_summary='''\ +help_summary = '''\ This program is a helper class for setting up python logger This helper is used by most of the LANforge python scripts. ''' -script_description=""" +script_description = """ NAME: lf_logger_config.py PURPOSE: @@ -61,13 +65,6 @@ INCLUDE_IN_README """ -import sys -import json -import logging -import logging.config -import argparse # used for help summary - - # gets the root logger logger = logging.getLogger() diff --git a/py-scripts/lf_macvlan.py b/py-scripts/lf_macvlan.py index 4a9791baf..cb6650928 100755 --- a/py-scripts/lf_macvlan.py +++ b/py-scripts/lf_macvlan.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_macvlan.py @@ -44,7 +43,7 @@ """ import ipaddress import logging -import os +# import os import sys import time @@ -61,9 +60,9 @@ sys.path.insert(1, "../") # lanforge_client = importlib.import_module("lanforge_client") lanforge_api = importlib.import_module("lanforge_client.lanforge_api") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand -from lanforge_client.lanforge_api import LFJsonQuery +from lanforge_client.lanforge_api import LFSession # noqa: E402 +from lanforge_client.lanforge_api import LFJsonCommand # noqa: E402 +from lanforge_client.lanforge_api import LFJsonQuery # noqa: E402 NA: str = "NA" DHCP: str = "DHCP" @@ -125,11 +124,11 @@ def set_ip(self, if (not ip_str) or (not port): raise ValueError("set_ip(): requires ip and port") netmask: str = NA - gateway: str = NA + # gateway: str = NA existing_ports: list = self.list_ports() existing_eids: list = [list(entry.keys())[0] for entry in existing_ports] - if not port in existing_eids: + if port not in existing_eids: raise ValueError(f"port {port} not found") interest_flags: int = self.SetPortInterest.dhcp.value current_flags_mask: int = self.SetPortCurrentFlags.use_dhcp.value @@ -225,7 +224,7 @@ def set_state(self, # print(f"type of item_d {type(item_d)} : item_d:{item_d}") eid: str = list(item_d.keys())[0] # print(f"is EID:{eid} in {my_port_list}") - if not eid in my_port_list: + if eid not in my_port_list: # print(f"ignoring port {eid}") continue filtered_list.append(eid) @@ -236,8 +235,7 @@ def set_state(self, interest_flags: int = self.SetPortInterest.current_flags.value | self.SetPortInterest.ifdown.value current_flags: int = 0 if state == "up" else self.SetPortCurrentFlags.if_down.value current_flags_mask: int = self.SetPortCurrentFlags.if_down.value - probe_flags_i: int = self.NcShowPortsProbeFlags.GW.value \ - | self.NcShowPortsProbeFlags.EASY_IP_INFO.value + probe_flags_i: int = self.NcShowPortsProbeFlags.GW.value | self.NcShowPortsProbeFlags.EASY_IP_INFO.value for item in filtered_list: port_hunks: list = str(item).split(".") # pprint.pprint(["port hunks", port_hunks]) @@ -289,7 +287,7 @@ def remove_vlans(self, logger.warning(f"will remove non-macvlan port {eid}") included_ports.append(eid) continue - if (port_dict[self.PHANTOM] == True) or (port_dict[self.PHANTOM] == "True"): + if (port_dict[self.PHANTOM] is True) or (port_dict[self.PHANTOM] == "True"): logger.warning(f"will remove phantom port {eid}") included_ports.append(eid) continue @@ -361,10 +359,9 @@ def new_macvlan(self, if debug: print(f"MAX VLAN NUM: {maximum_vlan_num}") - port_cmd_flags: str = NA + # port_cmd_flags: str = NA port_current_flags: int = 0 - port_current_flags_mask: int = self.SetPortCurrentFlags.if_down.value \ - | self.SetPortCurrentFlags.use_dhcp.value + port_current_flags_mask: int = self.SetPortCurrentFlags.if_down.value | self.SetPortCurrentFlags.use_dhcp.value port_interest_flags: int = self.SetPortInterest.rpt_timer.value if state == "down": @@ -438,8 +435,7 @@ def new_macvlan(self, parent_port_hunks: list = parent_port.split(".") portnum = int(maximum_vlan_num) + 1 - probe_flags_i: int = self.NcShowPortsProbeFlags.GW.value \ - | self.NcShowPortsProbeFlags.EASY_IP_INFO.value + probe_flags_i: int = self.NcShowPortsProbeFlags.GW.value | self.NcShowPortsProbeFlags.EASY_IP_INFO.value while portnum <= (int(maximum_vlan_num) + int(qty)): # print(f"\n ===== ===== ===== ===== ===== add_m {portnum} ===== ===== ===== ===== =====") self.lfcommand.post_add_mvlan(flags=self.ADD_MVLAN_FLAGS[state], @@ -532,7 +528,7 @@ def list_ports(self, debug=self.debug) else: hunks = parent_port.split('.') - resource = f"{hunks[0]}.{hunks[1]}" + resource = f"{hunks[0]}.{hunks[1]}" # noqa: F841 resource_list = f"{hunks[0]}.{hunks[1]}.list" response: list = self.lfquery.get_port(eid_list=[resource_list], requested_col_names=self.port_columns, @@ -557,7 +553,7 @@ def list_ports(self, filtered_response.append(response) response = filtered_response if not response: - logger.error(f"* * unable to get a port list:") + logger.error("* * unable to get a port list:") pprint.pprint(self.errors_warnings) return response @@ -632,7 +628,7 @@ def main(): ip_str = args.ip if args.ip is not None: if args.ip == "dhcp": - ip_str = DHCP + ip_str = DHCP # noqa: F841 my_macvlan: macvlan = macvlan(session=lfsession, parent_port=args.parent_port, diff --git a/py-scripts/lf_mixed_traffic.py b/py-scripts/lf_mixed_traffic.py index 17437a332..31615d2b6 100755 --- a/py-scripts/lf_mixed_traffic.py +++ b/py-scripts/lf_mixed_traffic.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_mixed_traffic.py @@ -796,15 +795,15 @@ def ping_test(self, ssid='', password='', security='', target='', interval='', _ 'sent': result_data['tx pkts'], 'recv': result_data['rx pkts'], 'dropped': result_data['dropped'], - 'min_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[0] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], - 'avg_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[1] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], - 'max_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[2] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], + 'min_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[0] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'avg_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[1] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'max_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[2] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 'mac': current_device_data['mac'], 'channel': current_device_data['channel'], 'ssid': current_device_data['ssid'], 'mode': current_device_data['mode'], 'name': [current_device_data['user'] if current_device_data['user'] != '' else current_device_data['hostname']][0], - 'os': ['Windows' if 'Win' in current_device_data['hw version'] else 'Linux' if 'Linux' in current_device_data['hw version'] else 'Mac' if 'Apple' in current_device_data['hw version'] else 'Android'][0], + 'os': ['Windows' if 'Win' in current_device_data['hw version'] else 'Linux' if 'Linux' in current_device_data['hw version'] else 'Mac' if 'Apple' in current_device_data['hw version'] else 'Android'][0], # noqa: E501 'remarks': [], 'last_result': [result_data['last results'].split('\n')[-2] if len(result_data['last results']) != 0 else ""][0]} result_json[station]['remarks'] = self.ping_test_obj.generate_remarks(result_json[station]) @@ -819,15 +818,15 @@ def ping_test(self, ssid='', password='', security='', target='', interval='', _ 'sent': ping_data['tx pkts'], 'recv': ping_data['rx pkts'], 'dropped': ping_data['dropped'], - 'min_rtt': [(ping_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[0]).replace(',', '') if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], - 'avg_rtt': [(ping_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[1]).replace(',', '') if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], - 'max_rtt': [(ping_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[2]).replace(',', '') if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], + 'min_rtt': [(ping_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[0]).replace(',', '') if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'avg_rtt': [(ping_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[1]).replace(',', '') if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'max_rtt': [(ping_data['last results'].split('\n')[-2].split()[-1].split(':')[-1].split('/')[2]).replace(',', '') if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 'mac': current_device_data['mac'], 'channel': current_device_data['channel'], 'ssid': current_device_data['ssid'], 'mode': current_device_data['mode'], 'name': [current_device_data['user'] if current_device_data['user'] != '' else current_device_data['hostname']][0], - 'os': ['Windows' if 'Win' in current_device_data['hw version'] else 'Linux' if 'Linux' in current_device_data['hw version'] else 'Mac' if 'Apple' in current_device_data['hw version'] else 'Android'][0], + 'os': ['Windows' if 'Win' in current_device_data['hw version'] else 'Linux' if 'Linux' in current_device_data['hw version'] else 'Mac' if 'Apple' in current_device_data['hw version'] else 'Android'][0], # noqa: E501 'remarks': [], 'last_result': [ping_data['last results'].split('\n')[-2] if len(ping_data['last results']) != 0 else ""][0]} result_json[station]['remarks'] = self.ping_test_obj.generate_remarks(result_json[station]) @@ -847,9 +846,9 @@ def ping_test(self, ssid='', password='', security='', target='', interval='', _ 'sent': result_data['tx pkts'], 'recv': result_data['rx pkts'], 'dropped': result_data['dropped'], - 'min_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split('/')[0] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], - 'avg_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split('/')[1] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], - 'max_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split('/')[2] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], + 'min_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split('/')[0] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'avg_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split('/')[1] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'max_rtt': [result_data['last results'].split('\n')[-2].split()[-1].split('/')[2] if len(result_data['last results']) != 0 and 'min/avg/max' in result_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 'mac': current_device_data['mac'], 'channel': current_device_data['channel'], 'ssid': current_device_data['ssid'], @@ -871,9 +870,9 @@ def ping_test(self, ssid='', password='', security='', target='', interval='', _ 'sent': ping_data['tx pkts'], 'recv': ping_data['rx pkts'], 'dropped': ping_data['dropped'], - 'min_rtt': [ping_data['last results'].split('\n')[-2].split()[-1].split('/')[0] if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], - 'avg_rtt': [ping_data['last results'].split('\n')[-2].split()[-1].split('/')[1] if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], - 'max_rtt': [ping_data['last results'].split('\n')[-2].split()[-1].split('/')[2] if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], + 'min_rtt': [ping_data['last results'].split('\n')[-2].split()[-1].split('/')[0] if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'avg_rtt': [ping_data['last results'].split('\n')[-2].split()[-1].split('/')[1] if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 + 'max_rtt': [ping_data['last results'].split('\n')[-2].split()[-1].split('/')[2] if len(ping_data['last results']) != 0 and 'min/avg/max' in ping_data['last results'].split('\n')[-2] else '0'][0], # noqa: E501 'mac': current_device_data['mac'], 'channel': current_device_data['channel'], 'ssid': current_device_data['ssid'], @@ -959,7 +958,7 @@ def qos_test_overall_real(qos_tos_real=None): self.qos_test_obj.avg_drop_b = [] time.sleep(10) try: - connections_download, connections_upload, drop_a_per, drop_b_per, self.qos_test_obj.connections_download_avg, self.qos_test_obj.connections_upload_avg, self.qos_test_obj.avg_drop_a, self.qos_test_obj.avg_drop_b = self.qos_test_obj.monitor() + connections_download, connections_upload, drop_a_per, drop_b_per, self.qos_test_obj.connections_download_avg, self.qos_test_obj.connections_upload_avg, self.qos_test_obj.avg_drop_a, self.qos_test_obj.avg_drop_b = self.qos_test_obj.monitor() # noqa: E501 except Exception as e: print(f"Failed at Monitoring the CX... {e}") self.qos_test_obj.stop() @@ -1006,7 +1005,7 @@ def qos_test_overall_real(qos_tos_real=None): self.qos_test_obj.generate_report(data=self.data, input_setup_info={"contact": "support@candelatech.com"}, report_path=self.report_path, - result_dir_name=f"Qos_Test_Report_{qos_tos_real}{band}", connections_upload_avg=self.qos_test_obj.connections_upload_avg, connections_download_avg=self.qos_test_obj.connections_download_avg, avg_drop_a=self.qos_test_obj.avg_drop_a, avg_drop_b=self.qos_test_obj.avg_drop_b) + result_dir_name=f"Qos_Test_Report_{qos_tos_real}{band}", connections_upload_avg=self.qos_test_obj.connections_upload_avg, connections_download_avg=self.qos_test_obj.connections_download_avg, avg_drop_a=self.qos_test_obj.avg_drop_a, avg_drop_b=self.qos_test_obj.avg_drop_b) # noqa: E501 self.data_set, self.load, self.res = self.qos_test_obj.generate_graph_data_set(self.data) @@ -1303,7 +1302,7 @@ def http_test(self, ssid, password, security, http_file_size, target_per_ten, ht self.http_obj.devices_list = self.user_query[1] self.http_obj.macid_list = self.user_query[2] # removing the iOS devices from station list - self.http_obj.port_list, self.http_obj.devices_list, self.http_obj.macid_list = self.filter_iOS_devices(self.user_query[0], self.user_query[1], self.user_query[2]) + self.http_obj.port_list, self.http_obj.devices_list, self.http_obj.macid_list = self.filter_iOS_devices(self.user_query[0], self.user_query[1], self.user_query[2]) # noqa: E501 self.http_dev = self.http_obj.devices_list self.http_mac = self.http_obj.macid_list if (len(self.http_obj.port_list) == 0): @@ -1368,7 +1367,7 @@ def http_test(self, ssid, password, security, http_file_size, target_per_ten, ht uc_avg_val = self.http_obj.data['uc_avg'] url_times = self.http_obj.data['url_data'] rx_bytes_val = self.http_obj.data['bytes_rd'] - rx_rate_val = self.http_obj.data['rx_rate'] + rx_rate_val = self.http_obj.data['rx rate (1m)'] else: uc_avg_val = self.http_obj.my_monitor('uc-avg') url_times = self.http_obj.my_monitor('total-urls') @@ -1658,7 +1657,8 @@ def multicast_test(self, endp_types=None, mc_tos=None, side_a_min=0, side_b_min= logger.info("Start the test and run for a duration") # TODO: Check return value of start() self.multicast_test_obj.start(False) - csv_results_file = self.multicast_test_obj.get_results_csv() + # csv_results_file = self.multicast_test_obj.get_results_csv() + self.multicast_test_obj.get_results_csv() report.set_title("Multicast Test") report.build_banner_cover() report.start_content_div2() @@ -1726,7 +1726,7 @@ def generate_all_report(self): "DUT Firmware": self.dut_firmware, "SSID": self.ssid, "Security": self.security, - "No of Devices": f"{len(self.user_query[0]) if self.real else len(self.station_list)} (Virtual Clients: {virtual_sta_count}, Windows: {windows_count}, Linux: {linux_count}, Mac: {mac_count}, Android: {android_count} ,iOS: {ios_count})", + "No of Devices": f"{len(self.user_query[0]) if self.real else len(self.station_list)} (Virtual Clients: {virtual_sta_count}, Windows: {windows_count}, Linux: {linux_count}, Mac: {mac_count}, Android: {android_count} ,iOS: {ios_count})", # noqa: E501 "Test Duration (HH:MM:SS)": self.time_formate} self.lf_report_mt.set_table_title("Test Setup Information") self.lf_report_mt.build_table_title() @@ -1958,7 +1958,7 @@ def generate_all_report(self): _yaxis_name="Throughput (Mbps)", _xaxis_categories=["BK,BE,VI,VO"], _xaxis_label=['1 Mbps', '2 Mbps', '3 Mbps', '4 Mbps', '5 Mbps'], - _graph_image_name=f"tos_", + _graph_image_name="tos_", _label=["BK", "BE", "VI", "VO"], _xaxis_step=1, _graph_title=f"Overall {qos_obj.direction} throughput – BK,BE,VO,VI traffic streams", @@ -1994,8 +1994,8 @@ def generate_all_report(self): self.lf_report_mt.test_setup_table(test_setup_data=ftp_test_config_df, value="Test Setup Information") self.lf_report_mt.set_obj_html(_obj_title=f"No.of times file {self.ftp_test_obj.direction}", _obj=f"The below graph represents number of times a file {self.ftp_test_obj.direction} for each client" - f" (WiFi) traffic. X-axis shows “No of times file {self.ftp_test_obj.direction}” and Y-axis shows " - f"“Client names“.") + f" (WiFi) traffic. X-axis shows “No of times file {self.ftp_test_obj.direction}” and Y-axis shows " + f"“Client names“.") self.lf_report_mt.build_objective() sta_list = "" if self.real: @@ -2032,7 +2032,7 @@ def generate_all_report(self): self.lf_report_mt.build_graph() self.lf_report_mt.set_obj_html(_obj_title=f"Average time taken to {self.ftp_test_obj.direction} file ", _obj=f"The below graph represents average time taken to {self.ftp_test_obj.direction} for each client " - f"(WiFi) traffic. X-axis shows “Average time taken to {self.ftp_test_obj.direction} a file ” and Y-axis shows “Client names“.") + f"(WiFi) traffic. X-axis shows “Average time taken to {self.ftp_test_obj.direction} a file ” and Y-axis shows “Client names“.") self.lf_report_mt.build_objective() graph = lf_graph.lf_bar_graph_horizontal(_data_set=[self.ftp_test_obj.uc_avg], _xaxis_name=f"Average time taken to {self.ftp_test_obj.direction} file in ms", @@ -2148,7 +2148,7 @@ def generate_all_report(self): self.lf_report_mt.test_setup_table(test_setup_data=multicast_test_config_df, value="Test Setup Information") for tos in tos_list: if self.client_dict_A[tos]["ul_A"] and self.client_dict_A[tos]["dl_A"]: - min_bps_a = self.client_dict_A["min_bps_a"] + # min_bps_a = self.client_dict_A["min_bps_a"] min_bps_b = self.client_dict_A["min_bps_b"] client_ul_A_data = [] @@ -2199,7 +2199,7 @@ def generate_all_report(self): self.lf_report_mt.set_obj_html( _obj_title=f"Individual throughput with intended load {int(min_bps_b) / 1000000} Mbps station for traffic {tos} (WiFi).", _obj=f"The below graph represents individual throughput for {dataset_length} clients running {tos} " - f"(WiFi) traffic. Y- axis shows “Client names“ and X-axis shows “Throughput in Mbps”.") + f"(WiFi) traffic. Y- axis shows “Client names“ and X-axis shows “Throughput in Mbps”.") self.lf_report_mt.build_objective() graph = lf_graph.lf_bar_graph_horizontal(_data_set=dataset_list, _xaxis_name="Throughput in Mbps", @@ -2539,7 +2539,7 @@ def main(): Bands = args.band[0].split(',') # checking all required arguments for wifi config - if (args.use_default_config == False): + if (args.use_default_config is False): if ('2.4G' in Bands): if (args.twog_ssid is None): print('--twog_ssid is required') @@ -2594,7 +2594,7 @@ def main(): configure = not args.use_default_config # Virtual stations setting up the start_id, num_sta, sta_list # num_sta = args.num_stations - station_list = [] + # station_list = [] # for creating directory and placing reports parent_dir = os.getcwd() @@ -2848,7 +2848,7 @@ def main(): mixed_obj.ftp_test_obj, mixed_obj.ftp_test_status = t3_parent.recv() t3.join() if "4" in args.tests: - mixed_obj.http_obj, mixed_obj.dataset, mixed_obj.dataset1, mixed_obj.dataset2, mixed_obj.bytes_rd, mixed_obj.rx_rate, mixed_obj.lis, mixed_obj.http_test_status = t4_parent.recv() + mixed_obj.http_obj, mixed_obj.dataset, mixed_obj.dataset1, mixed_obj.dataset2, mixed_obj.bytes_rd, mixed_obj.rx_rate, mixed_obj.lis, mixed_obj.http_test_status = t4_parent.recv() # noqa: E501 t4.join() if "5" in args.tests: class temp_multi_cast_obj(): @@ -2931,7 +2931,7 @@ def __init__(self, client_dict_A, client_dict_B): mixed_obj.ssid = ssid mixed_obj.security = security # tests will run with respect to bands - logger.info("Selected Tests List: ".format(args.tests)) + logger.info(f"Selected Tests List: {args.tests}") if args.tests: if args.parallel: if "1" in args.tests: @@ -3047,7 +3047,7 @@ def __init__(self, client_dict_A, client_dict_B): mixed_obj.ftp_test_obj, mixed_obj.ftp_test_status = t3_parent.recv() t3.join() if "4" in args.tests: - mixed_obj.http_obj, mixed_obj.dataset, mixed_obj.dataset1, mixed_obj.dataset2, mixed_obj.bytes_rd, mixed_obj.rx_rate, mixed_obj.lis, mixed_obj.http_test_status = t4_parent.recv() + mixed_obj.http_obj, mixed_obj.dataset, mixed_obj.dataset1, mixed_obj.dataset2, mixed_obj.bytes_rd, mixed_obj.rx_rate, mixed_obj.lis, mixed_obj.http_test_status = t4_parent.recv() # noqa: E501 t4.join() if "5" in args.tests: class temp_multi_cast_obj(): diff --git a/py-scripts/lf_multipsk.py b/py-scripts/lf_multipsk.py index c2fcb87cf..bb3f26147 100755 --- a/py-scripts/lf_multipsk.py +++ b/py-scripts/lf_multipsk.py @@ -1,14 +1,20 @@ #!/usr/bin/env python3 -# flake8: noqa -help_summary=''' - This script is to test the multipsk feature in access point. Multipsk feature states connecting clients using same - ssid but different passwords , here we will create two or 3 passwords with different vlan id on single ssid +import sys +import os +import importlib +import argparse +import time +import logging + +help_summary = ''' + This script is to test the multipsk feature in access point. Multipsk feature states connecting clients using same + ssid but different passwords , here we will create two or 3 passwords with different vlan id on single ssid and try to connect client with different passwords. ''' -script_description=""" +script_description = """ NAME: lf_multipsk.py PURPOSE: @@ -37,12 +43,6 @@ Copyright 2021 Candela Technologies Inc License: Free to distribute and modify. LANforge systems must be licensed. """ -import sys -import os -import importlib -import argparse -import time -import logging logger = logging.getLogger(__name__) @@ -171,7 +171,7 @@ def monitor_vlan_ip(self): # TODO: Properly detect if it is a real vlan interface, don't just match on a period in the name. if "." in i['upstream']: # print(str(i['upstream']) + " is a vlan upstream port") - logger.info("checking VLAN upstream port: %s ip .." %(i['upstream'])) + logger.info("checking VLAN upstream port: %s ip .." % (i['upstream'])) data = self.json_get("ports/list?fields=IP") for val in data["interfaces"]: for j in val: @@ -363,7 +363,6 @@ def main(): parser.add_argument('--mode', help="Mode for lf_multipsk", default=None) args = parser.parse_args() - if args.help_summary: print(help_summary) exit(0) @@ -415,7 +414,7 @@ def main(): multi_obj.build() multi_obj.start() - time.sleep(60) #TODO: Shouldn't need this much sleep, maybe some wait_for_foo method instead? + time.sleep(60) # TODO: Shouldn't need this much sleep, maybe some wait_for_foo method instead? multi_obj.monitor_vlan_ip() if args.n_vlan == "1": multi_obj.get_sta_ip() @@ -423,15 +422,18 @@ def main(): multi_obj.get_sta_ip_for_more_vlan() logger.info("checking for vlan ips") - result = multi_obj.compare_ip() + # result = multi_obj.compare_ip() + multi_obj.compare_ip() logger.info("now checking ip for non vlan port") multi_obj.monitor_non_vlan_ip() multi_obj.get_non_vlan_sta_ip() if args.mode == "BRIDGE": - result1 = multi_obj.compare_nonvlan_ip_bridge() + # result1 = multi_obj.compare_nonvlan_ip_bridge() + multi_obj.compare_nonvlan_ip_bridge() else: - result1 = multi_obj.compare_nonvlan_ip_nat() + # result1 = multi_obj.compare_nonvlan_ip_nat() + multi_obj.compare_nonvlan_ip_nat() # TODO: Verify connections were able to start and pass traffic. @@ -444,6 +446,6 @@ def main(): else: multi_obj.exit_fail() + if __name__ == '__main__': main() - diff --git a/py-scripts/lf_pcap.py b/py-scripts/lf_pcap.py index 46a07272b..f3e167f00 100755 --- a/py-scripts/lf_pcap.py +++ b/py-scripts/lf_pcap.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_pcap.py @@ -479,7 +478,7 @@ def check_frame_present(self, pcap_file, filter='(wlan.fixed.category_code == 6) if pcap_file is not None: cap = self.read_pcap(pcap_file=pcap_file, apply_filter=filter) packet_count = 0 - value, data = '', None + # value, data = '', None for pkt in cap: # print(pkt) if 'wlan.mgt' in pkt: @@ -532,14 +531,14 @@ def main(): This script requires pyshark to be installed before,you can install it by running "pip install pyshark" EXAMPLE: -see: /py-scritps/lf_pcap.py +see: /py-scritps/lf_pcap.py --------------------- ''') parser.add_argument('--pcap_file', '-p', help='provide the pcap file path', dest="pcap_file", default=None) parser.add_argument('--apply_filter', '-f', help='apply the filter you want to', dest='apply_filter', default=None) parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - help_summary='''\ + help_summary = '''\ Common Library for reading pcap files and check packet information for specific filters. SETUP: This script requires pyshark and tshark to be installed before @@ -568,5 +567,6 @@ def main(): # pcap_obj.get_packet_info(pcap_obj.pcap_file) pcap_obj.read_time(pcap_file="roam_11r_ota_iteration_0_2022-05-05-22-20.pcap") + if __name__ == "__main__": main() diff --git a/py-scripts/lf_ping_sweep.py b/py-scripts/lf_ping_sweep.py index 7e6d7f155..a697c70c3 100755 --- a/py-scripts/lf_ping_sweep.py +++ b/py-scripts/lf_ping_sweep.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: lf_ping_sweep.py @@ -11,12 +10,12 @@ Note: The script uses Nmap tool. If Namp not present in the system , it can be installed using the command: sudo apt-get install nmap - + EXAMPLE: - + CLI Example1: python3 lf_ping_sweep.py -e eth1 -ip 192.168.1.1/24 --duration 10h --csv_name ping_sweep_1 --reporting_down_time_percentage 30% - + CLI Example2 - with data packets: python3 lf_ping_sweep.py -e eth1 -ip 192.168.1.1/24 --data_lengths 32 64 128 500 --duration 10m --csv_name ping_sweep_1 --reporting_down_time_percentage 50% @@ -36,7 +35,7 @@ import matplotlib.pyplot as plt from matplotlib.lines import Line2D import subprocess -from datetime import datetime , timedelta +from datetime import datetime, timedelta import csv import pandas as pd @@ -50,16 +49,11 @@ logger = logging.getLogger(__name__) - if sys.version_info[0] != 3: print("This script requires Python 3") exit(1) - - - - class ping_sweep(): def __init__(self, eth_interface="eth1", @@ -86,13 +80,10 @@ def __init__(self, self.report = lf_report.lf_report(_results_dir_name="ping_sweep", _output_html="Ping_Sweep.html", _output_pdf="Ping_Sweep.pdf", _path="") - - - def run_ping(self): # print(type(self.data_lengths)) - cmd_output = False - out_put_to_ptint = "" + # cmd_output = False + # out_put_to_ptint = "" for data_length in self.data_lengths: host_status = {} start_time = time.time() @@ -106,209 +97,204 @@ def run_ping(self): if data_length == "6": command = f"sudo nmap -e {self.eth_interface} {self.target_ip}" csv_file = f'{self.csv_file}_{str(datetime.now()).split(",")[0].replace(" ", "-").split(".")[0]}.csv' - #print(f"csv file name: {csv_file}") + # print(f"csv file name: {csv_file}") csv_file = os.path.join(self.report.path_date_time, csv_file) # print(csv_file,"----csv------") - #print(f"command used: {command}") + # print(f"command used: {command}") logger.info("command : {}".format(command)) logger.info("Admin password used: {} ".format(self.admin_pass)) logger.info("csv file name: {} ".format(csv_file)) - status_dict = {} - sweep_count_dict={} - latency_dict ={} + sweep_count_dict = {} + latency_dict = {} mac_address_dict = {} ip_host_name = {} - count =0 - existing_ips=[] - ips_from_response=[] + count = 0 + existing_ips = [] + ips_from_response = [] to_break_while = False while time.time() - start_time < self.scan_duration: - self.last_sweep_ending_timestamp = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S") - # print(self.last_sweep_ending_timestamp,"last_sweep_ending_timestamp-----") - cmd_with_expect = f''' - spawn {command} - expect -re ".*password.*" - send "{self.admin_pass}\\r" - interact - ''' - process = subprocess.Popen(['expect', '-c', cmd_with_expect], text=True, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - # result = subprocess.run(command, shell=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - # check=True) - - stdout ="" - stderr = "" - time_format = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S") - - try: - - stdout, stderr = process.communicate(timeout=self.scan_duration - (time.time() - start_time)) - except subprocess.TimeoutExpired: - #print("duration exceeded while waiting for output,terminating the current execution") - logger.info("duration exceeded while waiting for output,terminating the current execution") - if count == 0: - to_break_while = True - # self.data_lengths.remove(data_length) - process.terminate() - process.wait() - - if to_break_while: + self.last_sweep_ending_timestamp = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S") + # print(self.last_sweep_ending_timestamp,"last_sweep_ending_timestamp-----") + cmd_with_expect = f''' + spawn {command} + expect -re ".*password.*" + send "{self.admin_pass}\\r" + interact + ''' + process = subprocess.Popen(['expect', '-c', cmd_with_expect], text=True, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + # result = subprocess.run(command, shell=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + # check=True) + + stdout = "" + stderr = "" + time_format = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S") + + try: + + stdout, stderr = process.communicate(timeout=self.scan_duration - (time.time() - start_time)) + except subprocess.TimeoutExpired: + # print("duration exceeded while waiting for output,terminating the current execution") + logger.info("duration exceeded while waiting for output,terminating the current execution") + if count == 0: + to_break_while = True + # self.data_lengths.remove(data_length) + process.terminate() + process.wait() + + if to_break_while: + break + timestamp_list.append(time.time()) + # stdout = result.stdout + # out_put_to_ptint = stdout + for line in stderr.splitlines(): + # print(line,"line------------") + # line = line.decode("utf-8") + if "Failed" or "QUITTING!" in line: + logger.info(stderr) + to_break_while = True + break + + # print(stdout,"-------------------------------------------------------------------------------------") + ip_address = "" + # status = "" + latency = 0 + # time_format = time.time() + for line in stdout.splitlines(): + # print(line,"line------------") + # line = line.decode("utf-8") + if "QUITTING!" in line: + logger.info(stdout) + to_break_while = True break - timestamp_list.append(time.time()) - # stdout = result.stdout - # out_put_to_ptint = stdout - for line in stderr.splitlines(): - # print(line,"line------------") - # line = line.decode("utf-8") - if "Failed" or "QUITTING!" in line: - logger.info(stderr) - to_break_while = True - break - - # print(stdout,"-------------------------------------------------------------------------------------") - ip_address = "" - status = "" - latency = 0 - #time_format = time.time() - for line in stdout.splitlines(): - # print(line,"line------------") - # line = line.decode("utf-8") - if "QUITTING!" in line: - logger.info(stdout) - to_break_while = True - break - if "Starting Nmap" in line: - - start_time_match = re.search(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2} \w+', line) - #if start_time_match: - - #time_format = start_time_match.group().replace(' IST', '').replace(' PDT', '').replace(' PST', '') - #self.last_sweep_ending_timestamp = datetime.strptime(time_format,"%Y-%m-%d %H:%M") - #self.last_sweep_ending_timestamp = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S") - #time_format = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S") - # print(self.sweep_terminated_time,"check2----") - elif "Nmap scan report for" in line: - cmd_output = True - ip_address = line.split()[-1].replace("(", "").replace(")","") - ips_from_response.append(ip_address) + if "Starting Nmap" in line: + pass + # start_time_match = re.search(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2} \w+', line) + # if start_time_match: + + # time_format = start_time_match.group().replace(' IST', '').replace(' PDT', '').replace(' PST', '') + # self.last_sweep_ending_timestamp = datetime.strptime(time_format,"%Y-%m-%d %H:%M") + # self.last_sweep_ending_timestamp = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S") + # time_format = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S") + # print(self.sweep_terminated_time,"check2----") + elif "Nmap scan report for" in line: + # cmd_output = True + ip_address = line.split()[-1].replace("(", "").replace(")", "") + ips_from_response.append(ip_address) + status_dict[ip_address] = 0 + if ip_address in list(sweep_count_dict.keys()): + sweep_count_dict[ip_address] += 1 + else: + sweep_count_dict[ip_address] = 1 + + latency_dict[ip_address] = 0 + mac_address_dict[ip_address] = "N/A" + ip_host_name[ip_address] = "N/A" + if ip_address not in list(status_dict.keys()): status_dict[ip_address] = 0 - if ip_address in list(sweep_count_dict.keys()): - sweep_count_dict[ip_address] += 1 - else: - sweep_count_dict[ip_address] = 1 - - - latency_dict[ip_address] = 0 - mac_address_dict[ip_address] = "N/A" - ip_host_name[ip_address] = "N/A" - if ip_address not in list(status_dict.keys()): - status_dict[ip_address] = 0 - # pattern = r'Nmap scan report for(?: (\S+))?( \(\d+\.\d+\.\d+\.\d+\))?' - # pattern = r'Nmap scan report for (\S+)(?: \(\d+\.\d+\.\d+\.\d+\))?' - pattern = r'Nmap scan report for (\S+)(?: \(\d+\.\d+\.\d+\.\d+\))?' - match = re.search(pattern, line) - if match: - if line.split()[-2] != "for": - ip_host_name[ip_address] = match.group(1) - - elif "Host is up" in line: - host_status[ip_address] = 'active' - status_dict[ip_address] = 1 - status = 'active' - latency_match = re.search(r'\((.*?) latency\)', line) - latency = "N/A" - if latency_match: - latency = latency_match.group(1) - # print(latency,"latency---") - latency_dict[ip_address] = latency - - - - elif "MAC Address: " in line: - # pattern = r'([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' - pattern = r'MAC Address: ([0-9A-Fa-f:]+)(?: \(([^)]+)\))?' - mac_match = re.search(pattern,line) - mac_address_dict[ip_address] = "N/A" - # ip_host_name[ip_address] = "N/A" - - if mac_match: - mac_address_dict[ip_address] = mac_match.group(1) - # print(mac_match.group(0)) - if mac_match.group(2): - ip_host_name[ip_address] = mac_match.group(2) - - - elif "Nmap done" in line: - # print(status_dict, "status_dict") - last_sweep_ending_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M") - self.last_sweep_ending_timestamp = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S") - if csv_file not in self.created_csv_files and len(list(status_dict.keys())) > 0: - self.created_csv_files.append(csv_file) - - new_column_data = [start_time] + list(status_dict.keys()) - file_exists = os.path.isfile(csv_file) - with open(csv_file, mode='a+', newline='') as file: - csv_writer = csv.writer(file) - - if not file_exists: - header = ['Host Ip'] - csv_writer.writerow(header) - - # Write the IP addresses as rows - for ip in list(status_dict.keys()): - csv_writer.writerow([ip]) - - file.seek(0) - reader = csv.reader(file) - data = [row for row in reader] - # print(data,"data---") - existing_ips = [row[0] for row in data] - - # print(existing_ipm_s,"---existing") - # print(ips_froresponse,"---resp") - # if count > 0: - for ip in existing_ips: - - if ip != "Host Ip" and ip not in ips_from_response: - status_dict[ip] = 0 - # data = [row for row in reader] - # print(data) - count += 1 - logger.info("iteration {}".format(count)) - existing_ips = [] - ips_from_response = [] - # print(status_dict.keys(),"status_dict.keys()--------") - for ip in status_dict.keys(): - value_found = any(row[0] == ip for row in data) - if not value_found: - new_row_data = [ip] + ['0'] * (count - 1) - # new_row_data.append(status_dict[ip]) - data.append(new_row_data) - for i, row in enumerate(data): - - if i ==0: - row.append(time_format) + # pattern = r'Nmap scan report for(?: (\S+))?( \(\d+\.\d+\.\d+\.\d+\))?' + # pattern = r'Nmap scan report for (\S+)(?: \(\d+\.\d+\.\d+\.\d+\))?' + pattern = r'Nmap scan report for (\S+)(?: \(\d+\.\d+\.\d+\.\d+\))?' + match = re.search(pattern, line) + if match: + if line.split()[-2] != "for": + ip_host_name[ip_address] = match.group(1) + + elif "Host is up" in line: + host_status[ip_address] = 'active' + status_dict[ip_address] = 1 + # status = 'active' + latency_match = re.search(r'\((.*?) latency\)', line) + latency = "N/A" + if latency_match: + latency = latency_match.group(1) + # print(latency,"latency---") + latency_dict[ip_address] = latency + + elif "MAC Address: " in line: + # pattern = r'([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' + pattern = r'MAC Address: ([0-9A-Fa-f:]+)(?: \(([^)]+)\))?' + mac_match = re.search(pattern, line) + mac_address_dict[ip_address] = "N/A" + # ip_host_name[ip_address] = "N/A" + + if mac_match: + mac_address_dict[ip_address] = mac_match.group(1) + # print(mac_match.group(0)) + if mac_match.group(2): + ip_host_name[ip_address] = mac_match.group(2) + + elif "Nmap done" in line: + # print(status_dict, "status_dict") + # last_sweep_ending_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M") + self.last_sweep_ending_timestamp = datetime.strptime(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S") + if csv_file not in self.created_csv_files and len(list(status_dict.keys())) > 0: + self.created_csv_files.append(csv_file) + + # new_column_data = [start_time] + list(status_dict.keys()) + file_exists = os.path.isfile(csv_file) + with open(csv_file, mode='a+', newline='') as file: + csv_writer = csv.writer(file) + + if not file_exists: + header = ['Host Ip'] + csv_writer.writerow(header) + + # Write the IP addresses as rows + for ip in list(status_dict.keys()): + csv_writer.writerow([ip]) + + file.seek(0) + reader = csv.reader(file) + data = [row for row in reader] + # print(data,"data---") + existing_ips = [row[0] for row in data] + + # print(existing_ipm_s,"---existing") + # print(ips_froresponse,"---resp") + # if count > 0: + for ip in existing_ips: + + if ip != "Host Ip" and ip not in ips_from_response: + status_dict[ip] = 0 + # data = [row for row in reader] + # print(data) + count += 1 + logger.info("iteration {}".format(count)) + existing_ips = [] + ips_from_response = [] + # print(status_dict.keys(),"status_dict.keys()--------") + for ip in status_dict.keys(): + value_found = any(row[0] == ip for row in data) + if not value_found: + new_row_data = [ip] + ['0'] * (count - 1) + # new_row_data.append(status_dict[ip]) + data.append(new_row_data) + for i, row in enumerate(data): + + if i == 0: + row.append(time_format) + else: + if status_dict[row[0]] == 1: + text = f"{status_dict[row[0]]},{latency_dict[row[0]]}" else: - if status_dict[row[0]] == 1: - text = f"{status_dict[row[0]]},{latency_dict[row[0]]}" - else: - text = f"{status_dict[row[0]]}" - - row.append(text) - file.truncate(0) # Clear the file contents - file.seek(0) - # writer = csv.writer(file) - csv_writer.writerows(data) - if to_break_while: - break + text = f"{status_dict[row[0]]}" + + row.append(text) + file.truncate(0) # Clear the file contents + file.seek(0) + # writer = csv.writer(file) + csv_writer.writerows(data) + if to_break_while: + break self.last_sweep_ending_timestamp_list.append(self.last_sweep_ending_timestamp) # if not cmd_output: # print(out_put_to_ptint) - # exit(0) + # exit(0) if len(list(status_dict.keys())) > 0: for ip in list(status_dict.keys()): @@ -323,8 +309,7 @@ def run_ping(self): self.host_name_list.append(list(ip_host_name.values())) # print(self.host_name_list) - - def get_graph_png(self,csv_name,y_labels,datasets,x_labels): + def get_graph_png(self, csv_name, y_labels, datasets, x_labels): num_ips = len(y_labels) num_timestamps = len(x_labels) @@ -343,15 +328,15 @@ def get_graph_png(self,csv_name,y_labels,datasets,x_labels): else: ax.barh(y_labels[i], bar_width, height=0.5, left=j * bar_width, color='#ff0000') - ax.set_xlabel('Time stamp',fontsize=13) - ax.set_ylabel("IP's",fontsize=13) + ax.set_xlabel('Time stamp', fontsize=13) + ax.set_ylabel("IP's", fontsize=13) ax.set_yticks(y_labels) - ax.set_yticklabels(y_labels,fontsize=12) + ax.set_yticklabels(y_labels, fontsize=12) # No of timestamps divided by value gives you no of labels to skip, the value is the no of x axis labels to be displayed timstamp_interval = max(1, num_timestamps // 30) ax.set_xticks([j * bar_width for j in range(0, num_timestamps, timstamp_interval)]) ax.set_xticklabels([x_labels[j] for j in range(0, num_timestamps, timstamp_interval)], rotation=45, - fontsize=10,ha="right") + fontsize=10, ha="right") plt.tight_layout() ax.invert_yaxis() legend_labels = ['Active', 'In active'] @@ -367,7 +352,7 @@ def get_graph_png(self,csv_name,y_labels,datasets,x_labels): return "%s.png" % image_name - def generate_report(self,test_setup_info): + def generate_report(self, test_setup_info): logger.info("List of CSV files created: {}".format(self.created_csv_files)) # report = lf_report.lf_report(_results_dir_name="ping_sweep", _output_html="Ping_Sweep.html", # _output_pdf="Ping_Sweep.pdf", _path="") @@ -380,13 +365,13 @@ def generate_report(self,test_setup_info): self.report.test_setup_table(value="Test Setup Information", test_setup_data=test_setup_info) self.report.set_obj_html("Objective", - "Candela Ping Sweep Test is designed to discover devices within the network" - "connectivity by measuring latency. It also detects issues like client unavailability time," - "and average latency, ensuring effective device communication and identifying" - "connectivity problems") + "Candela Ping Sweep Test is designed to discover devices within the network" + "connectivity by measuring latency. It also detects issues like client unavailability time," + "and average latency, ensuring effective device communication and identifying" + "connectivity problems") self.report.build_objective() # self.created_csv_files = ["ping_sweep__32_2023-11-07-21:14:21.csv","ping_sweep__128_2023-11-07-22:14:21"] - #print(self.created_csv_files,"created_csv_files") + # print(self.created_csv_files,"created_csv_files") individual_test_duration = self.scan_duration if self.scan_duration < 60: individual_test_duration = f"{self.scan_duration} sec" @@ -396,7 +381,7 @@ def generate_report(self,test_setup_info): else: hours = self.scan_duration / 3600 individual_test_duration = f"{str(round(abs(hours), 1))} hour" if hours == 1.0 else f"{str(round(abs(hours), 1))} hours" - for i,csv_name in enumerate(self.created_csv_files): + for i, csv_name in enumerate(self.created_csv_files): file_exists = os.path.isfile(csv_name) if not file_exists: continue @@ -406,28 +391,28 @@ def generate_report(self,test_setup_info): data = [row for row in reader] # print(data) file.seek(0) - csv_timestamps = next(reader) + csv_timestamps = next(reader) x_labels = csv_timestamps[1:] csv_ips = [row[0] for row in data][1:] # print([row for row in data][1:]) # print(csv_timestamps) # print(csv_ips) - print(self.last_sweep_ending_timestamp_list[i],"--> check1 - Last Sweep end time.") - logger.info("sweep ending timestamp: {i} --> {time} ".format(i=i,time=self.last_sweep_ending_timestamp_list[i])) + print(self.last_sweep_ending_timestamp_list[i], "--> check1 - Last Sweep end time.") + logger.info("sweep ending timestamp: {i} --> {time} ".format(i=i, time=self.last_sweep_ending_timestamp_list[i])) datasets = [] avg_latency_list = [] disconnection_list = [] - self.actual_sweep_duration = self.last_sweep_ending_timestamp_list[i] - datetime.strptime(x_labels[0].replace(" PDT","").replace(" PST",""),"%Y-%m-%d %H:%M:%S") - print(self.actual_sweep_duration,"--> check2 - Actual sweep duration.") - logger.info("Actual sweep duration: {i} --> {act_time}".format(i=i,act_time = self.actual_sweep_duration)) - self.percentage_duration = self.actual_sweep_duration * (int(self.percentage[:-1]) /100) + self.actual_sweep_duration = self.last_sweep_ending_timestamp_list[i] - datetime.strptime(x_labels[0].replace(" PDT", "").replace(" PST", ""), "%Y-%m-%d %H:%M:%S") + print(self.actual_sweep_duration, "--> check2 - Actual sweep duration.") + logger.info("Actual sweep duration: {i} --> {act_time}".format(i=i, act_time=self.actual_sweep_duration)) + self.percentage_duration = self.actual_sweep_duration * (int(self.percentage[:-1]) / 100) # print(f"{self.percentage_duration} --> {self.percentage[:-1]} percentage of sweep duration") for values in [row for row in data][1:]: # print(values[1:],"values------------") # print([value.split(",")[0] for value in values[1:]],"status----------") avg_latency = 0 active_over_duration = 0 - dataset_individual_list=[] + dataset_individual_list = [] first_zero_present = False first_zero = 0 sum_of_disconnection = 0 @@ -435,45 +420,45 @@ def generate_report(self,test_setup_info): disconnection_time = 0 # print(values[1:]) # print(x_labels) - for j,value in enumerate(values[1:]): + for j, value in enumerate(values[1:]): if value.split(",")[0] == "1": active_over_duration += 1 try: avg_latency += float(value.split(",")[1][:-1]) - except: + except BaseException: print("no latency value in csv") # print(value.split(",")[0]) if first_zero_present: next_zero_before_one = x_labels[j] - disconnection_time = datetime.strptime(next_zero_before_one.replace(" PDT","").replace(" PST",""), "%Y-%m-%d %H:%M:%S") - datetime.strptime(first_zero.replace(" PDT","").replace(" PST",""), "%Y-%m-%d %H:%M:%S") - disconnection_time=disconnection_time.total_seconds() + disconnection_time = datetime.strptime(next_zero_before_one.replace(" PDT", "").replace(" PST", ""), "%Y-%m-%d %H:%M:%S") - datetime.strptime(first_zero.replace(" PDT", "").replace(" PST", ""), "%Y-%m-%d %H:%M:%S") # noqa: E501 + disconnection_time = disconnection_time.total_seconds() sum_of_disconnection += disconnection_time first_zero_present = False elif value.split(",")[0] == "0": if not first_zero_present: first_zero = x_labels[j] - if j+1 != len(values[1:]): + if j + 1 != len(values[1:]): first_zero_present = True - if j+1 == len(values[1:]) and first_zero_present: + if j + 1 == len(values[1:]) and first_zero_present: # print(first_zero) # print(x_labels[j]) - disconnection_time = datetime.strptime(x_labels[j].replace(" PDT","").replace(" PST",""), - "%Y-%m-%d %H:%M:%S") - datetime.strptime(first_zero.replace(" PDT","").replace(" PST",""), - "%Y-%m-%d %H:%M:%S") + disconnection_time = datetime.strptime(x_labels[j].replace(" PDT", "").replace(" PST", ""), + "%Y-%m-%d %H:%M:%S") - datetime.strptime(first_zero.replace(" PDT", "").replace(" PST", ""), + "%Y-%m-%d %H:%M:%S") disconnection_time = disconnection_time.total_seconds() sum_of_disconnection += disconnection_time # print(sum_of_disconnection,"=====") - elif j+1 == len(values[1:]) and not first_zero_present: + elif j + 1 == len(values[1:]) and not first_zero_present: if value.split(",")[0] == "0": # print(self.last_sweep_ending_timestamp) - disconnection_time = self.last_sweep_ending_timestamp_list[i] - datetime.strptime(x_labels[j].replace(" PDT","").replace(" PST",""),"%Y-%m-%d %H:%M:%S") + disconnection_time = self.last_sweep_ending_timestamp_list[i] - datetime.strptime(x_labels[j].replace(" PDT", "").replace(" PST", ""), "%Y-%m-%d %H:%M:%S") disconnection_time = disconnection_time.total_seconds() - #print(disconnection_time,"disconnection_time") + # print(disconnection_time,"disconnection_time") sum_of_disconnection += disconnection_time dataset_individual_list.append(value.split(",")[0]) avg_latency_list.append(avg_latency / active_over_duration) @@ -483,7 +468,7 @@ def generate_report(self,test_setup_info): dataset_individual_list = [] y_labels = csv_ips - graph_png = self.get_graph_png(csv_name,y_labels,datasets,x_labels) + graph_png = self.get_graph_png(csv_name, y_labels, datasets, x_labels) # print(self.data_lengths ,"self.data_lengths[i] ") if self.executed_data_lengths[i] == "6": self.report.set_graph_title(f"Individual Ping Sweep Graph for {individual_test_duration} duration:") @@ -502,18 +487,16 @@ def generate_report(self,test_setup_info): data = [row for row in reader] # print(data) file.seek(0) - csv_timestamps = next(reader) + csv_timestamps = next(reader) x_labels = csv_timestamps[1:] # print(data,"data----") csv_ips = [row[0] for row in data] # print(csv_ips,"=========") # print([row[0] for row in data]) if self.executed_data_lengths[i] == "6": - self.report.set_table_title( - f"Individual client table report:") + self.report.set_table_title("Individual client table report:") else: - self.report.set_table_title( - f"Individual client table report for {self.executed_data_lengths[i]} data-packet size:") + self.report.set_table_title(f"Individual client table report for {self.executed_data_lengths[i]} data-packet size:") # report.set_table_title(f"Individual client table report for {self.data_lengths[i]} data-packet size") self.report.build_table_title() # print(avg_latency_list) @@ -528,56 +511,55 @@ def generate_report(self,test_setup_info): # print(len(disconnection_list),"disconnection_list") # print(self.no_of_sweeps_per_ip,"active sweeps ") dataframe = pd.DataFrame({ - 'Sl.no.': [i for i in range(1,len(csv_ips)+1)], - 'Device name':self.host_name_list[i], + 'Sl.no.': [i for i in range(1, len(csv_ips) + 1)], + 'Device name': self.host_name_list[i], 'IP Address': csv_ips, 'Client MAC': self.host_mac_list[i], 'Total Sweeps': [self.no_of_ping_sweeps[i]] * len(avg_latency_list), 'Active Sweeps': self.no_of_sweeps_per_ip[i], "Avg Latency[ms]": avg_latency_list, - "Client unreachability Time[sec]":disconnection_list + "Client unreachability Time[sec]": disconnection_list }) self.report.set_table_dataframe(dataframe) self.report.build_table() ips = [] unavail_percent = [] device_name = [] - client_macs=[] - sorted_disconnection_list = sorted(disconnection_list,reverse=True) + client_macs = [] + # sorted_disconnection_list = sorted(disconnection_list, reverse=True) + sorted(disconnection_list, reverse=True) # print(self.actual_sweep_duration.total_seconds(),"self.actual_sweep_duration.total_seconds()") - - for index,dur in enumerate(disconnection_list): - round((dur/self.actual_sweep_duration.total_seconds())*100,2) - if float(self.percentage[:-1]) < round((dur/self.actual_sweep_duration.total_seconds())*100,2): + + for index, dur in enumerate(disconnection_list): + round((dur / self.actual_sweep_duration.total_seconds()) * 100, 2) + if float(self.percentage[:-1]) < round((dur / self.actual_sweep_duration.total_seconds()) * 100, 2): ips.append(csv_ips[index]) device_name.append(self.host_name_list[i][index]) client_macs.append(self.host_mac_list[i][index]) - unavail_percent.append(round((dur/self.actual_sweep_duration.total_seconds())*100,2)) + unavail_percent.append(round((dur / self.actual_sweep_duration.total_seconds()) * 100, 2)) # unavail_percent.append(round((disconnection_list[index]/600)*100,2)) - self.report.set_table_title(f"Summary table:") - self.report.build_table_title() + self.report.set_table_title("Summary table:") + self.report.build_table_title() dataframe1 = pd.DataFrame({ - 'Sl.no.': [i for i in range(1,len(ips)+1)], - 'Device name':device_name, + 'Sl.no.': [i for i in range(1, len(ips) + 1)], + 'Device name': device_name, 'IP Address': ips, 'Client MAC': client_macs, - "Client unavailability perccentage":unavail_percent, + "Client unavailability perccentage": unavail_percent, "Reason": ["host down, received no-response"] * len(ips) }) self.report.set_table_dataframe(dataframe1) self.report.build_table() self.report.build_footer() html_file = self.report.write_html() - #print("returned html file {}".format(html_file)) + # print("returned html file {}".format(html_file)) logger.info("returned html file {}".format(html_file)) - + # print(html_file) self.report.write_pdf() - - def main(): parser = argparse.ArgumentParser( prog="lf_ping_sweep.py", @@ -595,7 +577,7 @@ def main(): ---------------------------------------------------------------------------------------------- CLI Example1: python3 lf_ping_sweep.py -e eth1 -ip 192.168.1.1/24 --duration 10h --csv_name ping_sweep_1 --reporting_down_time_percentage 30% - + CLI Example2 - with data packets: python3 lf_ping_sweep.py -e eth1 -ip 192.168.1.1/24 --data_lengths 32 64 128 500 --duration 10m --csv_name ping_sweep_1 --reporting_down_time_percentage 50% @@ -607,16 +589,15 @@ def main(): ---------------------------------------------------------------------------------------------- """) parser.add_argument("-e", "--ethernet_interface", type=str, help="ethernet interface ") - parser.add_argument("-ip","--target_ip",help="mention the target ip or network subnet") + parser.add_argument("-ip", "--target_ip", help="mention the target ip or network subnet") parser.add_argument("-dur", "--duration", type=str, help="provide the scanning duration in either hours or minutes or seconds,ex: 2h or 30m or 50s") - parser.add_argument("-csv", "--csv_name", type=str, help="provide the file name in which the csv should be created",default="ping_sweep") - parser.add_argument("-data_len","--data_lengths", type=str, nargs='+', help="List of data lengths",default=["6"]) - parser.add_argument("-admin_password","--admin_pass", type=str, help="provide the admin/root password",default="lanforge") - parser.add_argument("-reporting_down_time_percentage","--reporting_down_time_percentage", type=str, help="provide the percentage for calculation of ips which were down more than the percentage of duration, default is 30",default="30%") + parser.add_argument("-csv", "--csv_name", type=str, help="provide the file name in which the csv should be created", default="ping_sweep") + parser.add_argument("-data_len", "--data_lengths", type=str, nargs='+', help="List of data lengths", default=["6"]) + parser.add_argument("-admin_password", "--admin_pass", type=str, help="provide the admin/root password", default="lanforge") + parser.add_argument("-reporting_down_time_percentage", "--reporting_down_time_percentage", type=str, help="provide the percentage for calculation of ips which were down more than the percentage of duration, default is 30", default="30%") # noqa: E501 parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - - help_summary=''' + help_summary = ''' This Ping Sweep Test script is designed to discover devices within the network connectivity by measuring latency. It also detects issues like client unavailability time, and average latency, ensuring effective device communication and identifying @@ -627,7 +608,8 @@ def main(): print(help_summary) exit(0) - logger_config = lf_logger_config.lf_logger_config() + # logger_config = lf_logger_config.lf_logger_config() + lf_logger_config.lf_logger_config() scan_duration = 60 # print(args.data_lengths) # print(type(args.data_lengths)) @@ -636,7 +618,7 @@ def main(): test_duration_suffix = args.duration[-1] multiplier = duration_suffixes[test_duration_suffix] scan_duration = int(args.duration[:-1]) * multiplier - + logger.info("Test Initaited.") ping_sweep_obj = ping_sweep(eth_interface=args.ethernet_interface, target_ip=args.target_ip, @@ -644,7 +626,7 @@ def main(): admin_pass=args.admin_pass, data_lengths=args.data_lengths, scan_duration=scan_duration, - percentage= args.reporting_down_time_percentage + percentage=args.reporting_down_time_percentage ) ping_sweep_obj.run_ping() test_duration = timedelta(seconds=scan_duration * len(args.data_lengths)) @@ -664,29 +646,22 @@ def main(): "Total test Duration (HH:MM:SS)": test_duration, "Packet size": "Default", "Target ip": args.target_ip, - "Reporting down-time %":args.reporting_down_time_percentage + "Reporting down-time %": args.reporting_down_time_percentage } else: test_setup_info = { "Total test Duration (HH:MM:SS)": test_duration, - "Packet size": args.data_lengths , + "Packet size": args.data_lengths, "Duration per packet length": individual_test_duration, "Target ip": args.target_ip, - "Reporting down-time %":args.reporting_down_time_percentage + "Reporting down-time %": args.reporting_down_time_percentage - } + } if len(ping_sweep_obj.created_csv_files) > 0: logger.info("Generating Report.") ping_sweep_obj.generate_report(test_setup_info=test_setup_info) - - - - - - - if __name__ == "__main__": main() diff --git a/py-scripts/lf_report.py b/py-scripts/lf_report.py index 726698e3b..11261e693 100755 --- a/py-scripts/lf_report.py +++ b/py-scripts/lf_report.py @@ -493,17 +493,23 @@ def update_allure_results_history(self, allure_results_path=""): if not os.path.exists(self.allure_results_history_path): os.makedirs(self.allure_results_history_path) + # check to see if the history directory is present + if not os.path.exists(self.allure_report_history): + os.makedirs(self.allure_report_history) + # allure_report directory try: files = os.listdir(self.allure_report_history) - for fname in files: - allure_report_history_file = str(self.allure_report_history_path) + '/' + str(fname) - allure_results_history_file = str(self.allure_results_history_path) + '/' + str(fname) - shutil.copy(allure_report_history_file, allure_results_history_file) - + if not files: + for fname in files: + allure_report_history_file = str(self.allure_report_history_path) + '/' + str(fname) + allure_results_history_file = str(self.allure_results_history_path) + '/' + str(fname) + shutil.copy(allure_report_history_file, allure_results_history_file) + else: + logger.warning("Directory empty is this a first run?: {history}".format(history=self.allure_report_history)) except Exception as x: traceback.print_exception(Exception, x, x.__traceback__, chain=True) - logger.info("Either no allure report present or the copy of history failed.") + logger.warning("Either no allure report present or the copy of history failed.") def copy_allure_report(self): # TODO abiltiy to set the Allure results dir diff --git a/py-scripts/lf_report_test.py b/py-scripts/lf_report_test.py index c5d215ecb..67e9774a2 100755 --- a/py-scripts/lf_report_test.py +++ b/py-scripts/lf_report_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: lf_report_test.py @@ -41,7 +40,7 @@ def main(): # Testing: generate data frame - help_summary='''\ + help_summary = '''\ This script is useful to test the functionality of the lf_graph and lf_report modules and generates pdf and html reports ''' parser = argparse.ArgumentParser( @@ -75,7 +74,7 @@ def main(): default='localhost') # the args parser is not really used , this is so the report is not generated when testing # the imports with --help - parser.add_argument('--help_summary',help='provides help_summary to understand the script',action="store_true") + parser.add_argument('--help_summary', help='provides help_summary to understand the script', action="store_true") args = parser.parse_args() if args.help_summary: print(help_summary) @@ -255,7 +254,8 @@ def main(): # report.write_pdf(_page_size = 'A4', _orientation='Landscape') report.write_pdf(_page_size='Legal', _orientation='Landscape') # report.write_pdf(_page_size = 'Legal', _orientation='Portrait') - # report.generate_report() + + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_rf_char.py b/py-scripts/lf_rf_char.py index 8e73a040c..2a1c45f70 100755 --- a/py-scripts/lf_rf_char.py +++ b/py-scripts/lf_rf_char.py @@ -1,6 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa - """ NAME: lf_rf_test.py @@ -37,9 +35,9 @@ import importlib import datetime import pandas as pd -import json -import traceback -import csv +# import json +# import traceback +# import csv import time import re import platform @@ -48,10 +46,10 @@ sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lanforge_api = importlib.import_module("lanforge_client.lanforge_api") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand -from lanforge_client.lanforge_api import LFJsonQuery -from lanforge_client.logg import Logg +from lanforge_client.logg import Logg # noqa: E402 +from lanforge_client.lanforge_api import LFJsonQuery # noqa: E402 +from lanforge_client.lanforge_api import LFJsonCommand # noqa: E402 +from lanforge_client.lanforge_api import LFSession # noqa: E402 LFUtils = importlib.import_module("py-json.LANforge.LFUtils") lf_json_api = importlib.import_module("py-scripts.lf_json_api") @@ -128,7 +126,7 @@ def __init__(self, self.polling_interval = polling_interval self.duration = duration - self.timeout_sec = timeout_sec # max seconds to establish the traffic command + self.timeout_sec = timeout_sec # max seconds to establish the traffic command self.frame = frame self.frame_interval = frame_interval @@ -140,7 +138,7 @@ def __init__(self, self.gen_endpoint = '' self.cx_state = '' - self.bookmark_event_id : int = 0 + self.bookmark_event_id: int = 0 # create api_json self.json_vap_api = lf_json_api.lf_json_api(lf_mgr=self.lf_mgr, @@ -198,7 +196,6 @@ def __init__(self, # logging self.debug = debug - def remove_generic_cx(self): # self.command.die_on_error = False # self.exit_on_error = False @@ -236,7 +233,6 @@ def remove_generic_cx(self): suppress_related_commands=True, debug=True) - def get_recent_lease_events(self): """ Check DHCP lease info from DHCP events. @@ -263,20 +259,19 @@ def get_recent_lease_events(self): # pprint(["events", dhcp_events]) return dhcp_events - def dut_info(self): self.json_vap_api.request = 'stations' json_stations = [] sta_ap = '' dut_ip = '' dut_mac = '' - dut_hostname = '' + # dut_hostname = '' self.shelf, self.resource, self.port_name, *nil = LFUtils.name_to_eid(self.vap_port) self.vap_eid = "%s.%s.%s" % (self.shelf, self.resource, self.port_name) event_recs = self.get_recent_lease_events() - other_findings : dict = {} + other_findings: dict = {} # look for event containing the vap_name then get the station IP from events logger.info(f"Gathering station DUT info from vAP \'{self.port_name}\' events") @@ -285,7 +280,7 @@ def dut_info(self): if not (('event description' in record) or record['event description']): continue - hunks : list[str] = record['event description'].split(" ") + hunks: list[str] = record['event description'].split(" ") if hunks[6] != self.port_name: if hunks[6] not in other_findings: other_findings[hunks[6]] = [] @@ -345,12 +340,12 @@ def dut_info(self): if sta_ap == "": logger.info(" No stations using vAP [%s]" % self.vap_eid) - station_macs : list[str] = [] + station_macs: list[str] = [] for record in json_stations['stations']: bss = next(iter(record)) - station_macs.append(bss[bss.rindex('.')+1:]) - logger.info(" stations seen: "+", ".join(station_macs)) - #logger.warning(pformat(json_stations)) + station_macs.append(bss[bss.rindex('.') + 1:]) + logger.info(" stations seen: " + ", ".join(station_macs)) + # logger.warning(pformat(json_stations)) return False # Make sure the station is on correct IP vap @@ -394,7 +389,7 @@ def dut_info(self): if (m is not None): dut_mac = m.group(1) dut_ip = m.group(2) - dut_hostname = m.group(3) + # dut_hostname = m.group(3) else: pat = "(\\S+)\\s+(\\S+)" m = re.search(pat, line) @@ -408,7 +403,7 @@ def dut_info(self): logger.error(f"Port probe MAC mismatch. Expected {self.dut_mac}, found {dut_mac}") return False self.dut_ip = dut_ip - #self.dut_hostname = dut_hostname + # self.dut_hostname = dut_hostname logger.info(f"Found station DUT with MAC {self.dut_mac} and IPv4 address {self.dut_ip}") return True @@ -528,7 +523,6 @@ def set_gen_cmd(self): debug=False, timeout=10) - def set_cx_state(self): self.command.post_set_cx_state(cx_name=self.gen_endpoint, cx_state=self.cx_state, @@ -546,8 +540,6 @@ def bookmark_events(self): # pprint(events_rec[noun]) self.bookmark_event_id = int(events_rec[noun]["id"]) - - def configure_vap(self): """Configure vAP including mode, channel, channel width, txpower.""" # Set vAP transmit power. This should already be validated in argument validation step. @@ -569,23 +561,23 @@ def configure_vap(self): vap_flags = "NA" vap_flagmask = "NA" - t_channel : int = 0 - t_band : int = 0 + t_channel: int = 0 + t_band: int = 0 if "e" in self.vap_channel: # we are 6Ghz - t_channel = int( self.vap_channel[0:-1]) + t_channel = int(self.vap_channel[0:-1]) logger.warning("6gz channel is {}".format(t_channel)) if (t_channel >= 1) and (t_channel <= 233): - t_band=6 + t_band = 6 else: t_channel = int(self.vap_channel) if (t_channel >= 1) and (t_channel <= 15): - t_band=2 + t_band = 2 elif (t_channel >= 32) and (t_channel <= 177): - t_band=5 + t_band = 5 elif (t_channel >= 191): - t_band=6 + t_band = 6 if t_channel == 0: raise Exception("strange channel: {}".format(self.vap_channel)) if t_band < 2: @@ -604,8 +596,8 @@ def configure_vap(self): | self.command.AddVapFlags.use_rrm_report t_flags: int = -1 t_flagmask: int = self.command.AddVapFlags.disable_ht40 \ - | self.command.AddVapFlags.disable_ht80 \ - | self.command.AddVapFlags.ht160_enable + | self.command.AddVapFlags.disable_ht80 \ + | self.command.AddVapFlags.ht160_enable if t_band == 6: # have to specify hostapd_config in flags to make sure that custom config # checkbox gets turned off @@ -628,8 +620,8 @@ def configure_vap(self): if self.vap_bw == "20": t_flags |= self.command.AddVapFlags.disable_ht40 - # disabling ht80 appears to remove usefulness of disable_ht40 - # | self.command.AddVapFlags.disable_ht80 + # disabling ht80 appears to remove usefulness of disable_ht40 + # | self.command.AddVapFlags.disable_ht80 if self.vap_bw == "40": t_flags |= self.command.AddVapFlags.disable_ht80 if self.vap_bw == "80": @@ -653,10 +645,10 @@ def configure_vap(self): v_name = self.vap_port if self.vap_port.find('.') > -1: - v_name = self.vap_port[self.vap_port.rindex('.')+1:] + v_name = self.vap_port[self.vap_port.rindex('.') + 1:] r_name = self.vap_radio if self.vap_radio.find('.') > -1: - r_name = self.vap_radio[self.vap_radio.rindex('.')+1:] + r_name = self.vap_radio[self.vap_radio.rindex('.') + 1:] logger.debug("configure_vap: vap_mode [{}]".format(self.vap_mode)) logger.debug("configure_vap: vap_radio [{}]".format(self.vap_radio)) @@ -676,7 +668,7 @@ def configure_vap(self): flags_mask=vap_flagmask, debug=True) queried_mode = "none" - e_w : list = [] + e_w: list = [] poll_start_sec = lanforge_api._now_sec() deadline_sec = poll_start_sec + 16 while (queried_mode == "none") and (deadline_sec > lanforge_api._now_sec()): @@ -687,7 +679,7 @@ def configure_vap(self): if not response: logger.error("No response to query get_port()") else: - logger.debug(" Response: %s" % pformat(response)) + logger.debug(" Response: %s" % pformat(response)) if e_w: logger.warning("get_port warnings: %s" % pformat(e_w)) if "mode" in response: @@ -707,10 +699,10 @@ def configure_vap(self): # again. Lets prompt the port and the virtual router to # refresh to help get our dhcp leases visible as soon as possible time.sleep(1) - ncsp_flags : int = LFJsonCommand.NcShowPortsProbeFlags.WIFI \ - | LFJsonCommand.NcShowPortsProbeFlags.MII \ - | LFJsonCommand.NcShowPortsProbeFlags.BRIDGE \ - | LFJsonCommand.NcShowPortsProbeFlags.GW + ncsp_flags: int = LFJsonCommand.NcShowPortsProbeFlags.WIFI \ + | LFJsonCommand.NcShowPortsProbeFlags.MII \ + | LFJsonCommand.NcShowPortsProbeFlags.BRIDGE \ + | LFJsonCommand.NcShowPortsProbeFlags.GW self.command.post_nc_show_ports(shelf=1, resource=self.resource, port=self.port_name, @@ -721,7 +713,6 @@ def configure_vap(self): self.command.post_show_vr(shelf=1, resource=self.resource, router='all') self.command.post_show_vrcx(shelf=1, resource=self.resource, cx_name='all') - def verify_dut_stations(self, deadline_millis: int, dhcp_lookup_ms: int, max_dhcp_lookups: int): """ Verify that there exists one or more station DUTs with DHCP leases from the vAP DUT. @@ -730,7 +721,7 @@ def verify_dut_stations(self, deadline_millis: int, dhcp_lookup_ms: int, max_dhc begin_lease_lookup_ms = now_millis() last_vap_reset = now_millis() try_count = int(max_dhcp_lookups) - found_station : bool = False + found_station: bool = False # Iterate for defined number of tries, counting down 'try_count' until we find # stations with DHCP leases corresponding to this vAP @@ -749,10 +740,10 @@ def verify_dut_stations(self, deadline_millis: int, dhcp_lookup_ms: int, max_dhc self.command.post_nc_show_ports(shelf=1, resource=self.resource, port=self.port_name, - probe_flags=(LFJsonCommand.NcShowPortsProbeFlags.WIFI \ - | LFJsonCommand.NcShowPortsProbeFlags.MII \ - | LFJsonCommand.NcShowPortsProbeFlags.ETHTOOL \ - | LFJsonCommand.NcShowPortsProbeFlags.EASY_IP_INFO), + probe_flags=(LFJsonCommand.NcShowPortsProbeFlags.WIFI | + LFJsonCommand.NcShowPortsProbeFlags.MII | + LFJsonCommand.NcShowPortsProbeFlags.ETHTOOL | + LFJsonCommand.NcShowPortsProbeFlags.EASY_IP_INFO), debug=self.debug) # rf_char.command.post_show_vr(shelf=1, resource=rf_char.resource, router='all', debug=rf_char.debug) @@ -760,7 +751,7 @@ def verify_dut_stations(self, deadline_millis: int, dhcp_lookup_ms: int, max_dhc resource=self.resource, port=self.port_name, key='probe_port.quiet.' + self.vap_eid) - time.sleep(dhcp_lookup_ms/1000) + time.sleep(dhcp_lookup_ms / 1000) try_count -= 1 # A vAP can take about 15 seconds to acquire a lease, hopefully 10. @@ -770,7 +761,7 @@ def verify_dut_stations(self, deadline_millis: int, dhcp_lookup_ms: int, max_dhc logger.warning(f"Resetting vAP port {v_name}") if v_name.find('.') > -1: - v_name = self.vap_port[ self.vap_port.rindex('.')+1 :] + v_name = self.vap_port[self.vap_port.rindex('.') + 1:] self.command.post_reset_port(shelf=1, resource=self.resource, @@ -857,7 +848,7 @@ def start(self): cur_time = datetime.datetime.now() end_time = self.parse_time(self.duration) + cur_time polling_interval_milliseconds = self.duration_time_to_milliseconds(self.polling_interval) - sleep_interval = (polling_interval_milliseconds/1000)/2 + sleep_interval = (polling_interval_milliseconds / 1000) / 2 interval = 0 # initialize time stamps json_vap_port_stats, *nil = self.json_vap_api.get_request_port_information(port=self.vap_port) @@ -910,7 +901,7 @@ def start(self): # port not needed for all json_stations, *nil = self.json_vap_api.get_request_stations_information() logger.info("json_stations {json}".format(json=pformat(json_stations))) - chain_rssi : list = [] + chain_rssi: list = [] if "station" in json_stations: self.rssi_signal.append(json_stations['station']['signal']) chain_rssi_str = json_stations['station']['chain rssi'] @@ -920,7 +911,7 @@ def start(self): # pprint(json_stations) # This should give us faster lookup if I knew how to use it. # sta_key = "0.0.0.%s"%(self.dut_mac) - #pprint("key: %s"%(sta_key)) + # pprint("key: %s"%(sta_key)) for s in json_stations['stations']: keys = list(s.keys()) vals = s[keys[0]] @@ -972,8 +963,8 @@ def start(self): # TODO make the get_request more generic just set the request self.json_rad_api.request = 'wifi-stats' # Read the vap device stats, it will also be able to report underlying radio stats as needed. - request_attempts : int = 6 - json_wifi_stats : dict = None + request_attempts: int = 6 + json_wifi_stats: dict = None while request_attempts >= 0: request_attempts -= 1 json_wifi_stats, *nil = self.json_rad_api.get_request_wifi_stats_information(port=self.vap_port) @@ -985,7 +976,7 @@ def start(self): continue request_attempts = -1 - logger.debug("wifi-stats output, vap-radio: %s radio port name %s:"%(self.vap_radio, self.port_name)) + logger.debug("wifi-stats output, vap-radio: %s radio port name %s:" % (self.vap_radio, self.port_name)) # pprint(json_wifi_stats) # Stop Traffic @@ -1015,6 +1006,7 @@ def num_sort(strn): return int(computed_num[0]) return -1 + def length_sort(strn): return len(strn[0]) @@ -1194,7 +1186,7 @@ def parse_args(): help="number of attempts to check for DHCP lease before aborting script", type=int, default=20) - parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') + parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') return parser.parse_args() @@ -1209,18 +1201,21 @@ def validate_args(args: argparse.Namespace): logger.error("--vap_port is a required parameter") exit(1) - if not args.vap_port: + if not args.vap_radio: logger.error("--vap_radio is a required parameter") exit(1) - if not args.vap_vw: - logger.error("--vap_radio is a required parameter") + if not args.vap_bw: + logger.error("--vap_bw is a required parameter") exit(1) if not args.vap_channel: - logger.error("--vap_radio is a required parameter") + logger.error("--vap_channel is a required parameter") exit(1) + if not args.vap_antenna: + logger.error("--vap_antenna is a required parameter") + exit(1) # vAP radio required as full EID if not args.vap_radio.startswith("1."): @@ -1257,7 +1252,7 @@ def validate_args(args: argparse.Namespace): exit(1) txpower_int = int(txpower_int_str) - if not(-1 <= txpower_int and txpower_int <= 30): + if not (-1 <= txpower_int and txpower_int <= 30): logger.error("vAP TX power must be either \'DEFAULT\' or an integer within range -1 to 30, inclusive") exit(1) @@ -1326,7 +1321,7 @@ def configure_reporting(no_html: bool, # Configure report CSV generation # TODO: Use KPI CSV? - #kpi_csv = lf_kpi_csv.lf_kpi_csv( + # kpi_csv = lf_kpi_csv.lf_kpi_csv( # _kpi_path=kpi_path, # _kpi_test_rig=test_rig, # _kpi_test_tag=test_tag, @@ -1343,7 +1338,7 @@ def configure_reporting(no_html: bool, csv_outfile = report.file_add_path(csv_outfile) logger.info(f"Test CSV data will be output to file \'{csv_outfile}\'") else: - logger.info(f"No CSV output file specified, disabling test CSV data output") + logger.info("No CSV output file specified, disabling test CSV data output") return report @@ -1457,10 +1452,10 @@ def generate_report(rf_char: RfCharTest, data_set_debug = """inspect data sets for even distribution: tx_interval: {} tx_interval_time: {} - rssi_signal: {} - rssi_1: {} - rssi_2: {} - rssi_3: {} + rssi_signal: {} + rssi_1: {} + rssi_2: {} + rssi_3: {} rssi_4: {}""".format(len(tx_interval), len(tx_interval_time), len(rssi_signal), @@ -1476,11 +1471,11 @@ def generate_report(rf_char: RfCharTest, " RSSI 1 ": [i for i in rssi_1], " RSSI 2 ": [j for j in rssi_2], " RSSI 3 ": [m for m in rssi_3], - " RSSI 4 ": [l for l in rssi_4]}) + " RSSI 4 ": [n for n in rssi_4]}) except Exception as e: logger.error("Unable to build pandas DataFrame. Check for uneven data.") print(e) - print (data_set_debug) + print(data_set_debug) sys.exit(1) report.set_table_dataframe(df_rssi_info.replace(np.nan, '')) @@ -1518,20 +1513,20 @@ def generate_report(rf_char: RfCharTest, report.build_graph() # tx-rate / rx-rate negotiated rates line chart - rx_rates : list[float] = [] - tx_rates : list[float] = [] + rx_rates: list[float] = [] + tx_rates: list[float] = [] for index in range(0, min(len(rf_char.rx_rate), len(rf_char.tx_rate))): rx_str = rf_char.rx_rate[index] tx_str = rf_char.tx_rate[index] # print ("t:[{}] r:[{}] ".format(tx_str, rx_str)) if "Mbps" in rx_str: - rx_rates.append(float(rx_str[0 : rx_str.find(" ")])) + rx_rates.append(float(rx_str[0: rx_str.find(" ")])) else: rx_rates.append(0.0) if "Mbps" in tx_str: - tx_rates.append(float(tx_str[0 : tx_str.find(" ")])) + tx_rates.append(float(tx_str[0: tx_str.find(" ")])) else: tx_rates.append(0.0) @@ -2542,12 +2537,12 @@ def generate_report(rf_char: RfCharTest, def main(): args = parse_args() - help_summary='''\ + help_summary = '''\ The purpose of this script is to do RF Characteristics Test. This script is a work in progress put on hold. ''' if args.help_summary: print(help_summary) - exit(0) + exit(0) configure_logger(log_level=args.log_level, logger_json_config=args.lf_logger_config_json) diff --git a/py-scripts/lf_roam_test.py b/py-scripts/lf_roam_test.py index c371c7436..64cc03da1 100755 --- a/py-scripts/lf_roam_test.py +++ b/py-scripts/lf_roam_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_roam_test.py @@ -116,7 +115,7 @@ import logging import time import datetime -from datetime import datetime +from datetime import datetime # noqa: F811 import pandas as pd import paramiko from itertools import chain @@ -1491,7 +1490,7 @@ def run(self, file_n=None): else: auth_time = self.pcap_obj.read_time( pcap_file=str(file_name), - filter="(wlan.fixed.auth.alg == 2 && wlan.fixed.status_code == 0x0000 && wlan.fixed.auth_seq == 0x0001) && (wlan.sa == %s)" % ( + filter="(wlan.fixed.auth.alg == 2 && wlan.fixed.status_code == 0x0000 && wlan.fixed.auth_seq == 0x0001) && (wlan.sa == %s)" % ( # noqa: E501 str(i))) print("Authentication Request Frame time is", auth_time) @@ -1559,7 +1558,7 @@ def run(self, file_n=None): print("Re-Association status is successful") logging.info("Re-Association status is successful") reasso_t = self.pcap_obj.read_time(pcap_file=str(file_name), - filter="(wlan.fc.type_subtype eq 3 && wlan.fixed.status_code == 0x0000 && wlan.tag.number == 55) && (wlan.da == %s)" % ( + filter="(wlan.fc.type_subtype eq 3 && wlan.fixed.status_code == 0x0000 && wlan.tag.number == 55) && (wlan.da == %s)" % ( # noqa: E501 str(i))) print("Re-Association time is", reasso_t) logging.info("Re-Association time is " + str(reasso_t)) @@ -1604,7 +1603,7 @@ def run(self, file_n=None): "Authentication Request is present") auth_time = self.pcap_obj.read_time( pcap_file=str(file_name), - filter="(wlan.fixed.auth.alg == 2 && wlan.fixed.status_code == 0x0000 && wlan.fixed.auth_seq == 0x0001) && (wlan.sa == %s)" % ( + filter="(wlan.fixed.auth.alg == 2 && wlan.fixed.status_code == 0x0000 && wlan.fixed.auth_seq == 0x0001) && (wlan.sa == %s)" % ( # noqa: E501 str(i))) print("Authentication time is", auth_time) logging.info( @@ -1954,18 +1953,18 @@ def generate_report(self, csv_list, kernel_lst, current_path=None): "1. The BSSID of the station remains unchanged after roaming from one AP to another.
" "2. No roaming occurs, as all stations are connected to the same AP.
") else: - report.set_obj_html("Pass/Fail Criteria:", - "The following are the criteria for PASS the test:

" - "1. The BSSID of the station should change after roaming from one AP to another.
" - "2. The station should not experience any disconnections during/after the roaming process.
" - "3. The duration of the roaming process should be less than 50 ms.
" - "
" - "The following are the criteria for FAIL the test:

" - "1. The BSSID of the station remains unchanged after roaming from one AP to another.
" - "2. No roaming occurs, as all stations are connected to the same AP.
" - "3. The captured packet does not contain a Reassociation Response Frame.
" - "4. The station experiences disconnection during/after the roaming process.
" - "5. The duration of the roaming process exceeds 50 ms.
") + report.set_obj_html("Pass/Fail Criteria:", + "The following are the criteria for PASS the test:

" + "1. The BSSID of the station should change after roaming from one AP to another.
" + "2. The station should not experience any disconnections during/after the roaming process.
" + "3. The duration of the roaming process should be less than 50 ms.
" + "
" + "The following are the criteria for FAIL the test:

" + "1. The BSSID of the station remains unchanged after roaming from one AP to another.
" + "2. No roaming occurs, as all stations are connected to the same AP.
" + "3. The captured packet does not contain a Reassociation Response Frame.
" + "4. The station experiences disconnection during/after the roaming process.
" + "5. The duration of the roaming process exceeds 50 ms.
") report.build_objective() for i in csv_list: report.move_data(directory="csv_data", _file_name=str(i)) @@ -2061,13 +2060,13 @@ def generate_report(self, csv_list, kernel_lst, current_path=None): def main(): help_summary = '''\ - The script is designed to support both hard and soft roaming, ensuring a smooth transition for devices between - access points (APs). Additionally, the script captures packets in two scenarios: when a device is connected to - an AP and when it roams from one AP to another. These captured packets help analyze the performance and stability - of the roaming process. In essence, the script serves as a thorough test for assessing how well APs handle + The script is designed to support both hard and soft roaming, ensuring a smooth transition for devices between + access points (APs). Additionally, the script captures packets in two scenarios: when a device is connected to + an AP and when it roams from one AP to another. These captured packets help analyze the performance and stability + of the roaming process. In essence, the script serves as a thorough test for assessing how well APs handle roaming and the overall network stability when clients move between different access points. - - The roaming test will create stations with advanced/802.1x and 11r key management, create CX traffic between upstream + + The roaming test will create stations with advanced/802.1x and 11r key management, create CX traffic between upstream port and stations, run traffic and generate a report. ''' parser = argparse.ArgumentParser( @@ -2083,10 +2082,10 @@ def main(): Summary : ---------- -The primary focus of this script is to enable seamless roaming of clients/stations between two access points (APs). +The primary focus of this script is to enable seamless roaming of clients/stations between two access points (APs). The test can be conducted with a single or multiple stations, with single or multiple iterations. -The script will create stations/clients with advanced/802.1x and 11r key management. By default, it will create a +The script will create stations/clients with advanced/802.1x and 11r key management. By default, it will create a single station/client. Once the stations are created, the script will generate CX traffic between the upstream port and the stations and run the traffic before roam. @@ -2097,7 +2096,7 @@ def main(): These packet captures will be used to analyze the performance and stability of the roaming process. -Overall, this script is designed to provide a comprehensive test of the roaming functionality of the APs and the +Overall, this script is designed to provide a comprehensive test of the roaming functionality of the APs and the stability of the network when clients move between APs. The following are the criteria for PASS the test: @@ -2116,7 +2115,7 @@ def main(): ############################################ -# Examples Commands for different scenarios +# Examples Commands for different scenarios ############################################ Hard Roam @@ -2146,10 +2145,10 @@ def main(): --dut_name ["AP1","AP2"] --traffic_type "lf_udp" --log_file False --debug False --iteration_based EXAMPLE: For multiple station and multiple iteration with multicast traffic enable - python3 lf_roam_test.py --mgr 192.168.100.221 --ap1_bssid "10:f9:20:fd:f3:4b" --ap2_bssid "14:16:9d:53:58:cb" + python3 lf_roam_test.py --mgr 192.168.100.221 --ap1_bssid "10:f9:20:fd:f3:4b" --ap2_bssid "14:16:9d:53:58:cb" --fiveg_radios "1.1.wiphy1" --band "fiveg" --sniff_radio "wiphy2" --num_sta 2 --ssid_name "RoamAP5g" --security "wpa2" - --security_key "something" --duration None --upstream "eth2" --iteration 1 --channel "36" --option "ota" - --dut_name ["AP1","AP2"] --traffic_type "lf_udp" --log_file False --debug False --iteration_based --sta_type normal --multicast True + --security_key "something" --duration None --upstream "eth2" --iteration 1 --channel "36" --option "ota" + --dut_name ["AP1","AP2"] --traffic_type "lf_udp" --log_file False --debug False --iteration_based --sta_type normal --multicast True Soft Roam @@ -2175,7 +2174,7 @@ def main(): python3 lf_roam_test.py --mgr 192.168.100.221 --ap1_bssid "68:7d:b4:5f:5c:3b" --ap2_bssid "14:16:9d:53:58:cb" --fiveg_radios "1.1.wiphy1" --band "fiveg" --sniff_radio "wiphy2" --num_sta 10 --ssid_name "RoamAP5g" --security "wpa2" --security_key "something" --duration None --upstream "eth2" --iteration 10 --channel "40" --option "ota" - --dut_name ["AP1","AP2"] --traffic_type "lf_udp" --log_file False --debug False --iteration_based --soft_roam True + --dut_name ["AP1","AP2"] --traffic_type "lf_udp" --log_file False --debug False --iteration_based --soft_roam True =============================================================================== @@ -2290,4 +2289,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_rssi_process.py b/py-scripts/lf_rssi_process.py index c44ad70df..bfdd4543d 100755 --- a/py-scripts/lf_rssi_process.py +++ b/py-scripts/lf_rssi_process.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa + ''' NAME: lf_rssi_process.py @@ -27,8 +27,6 @@ lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") - - # Exit Codes # 0: Success # 1: Python Error @@ -36,25 +34,26 @@ # 3: Radio disconnected before exit threshold expected RSSI; PNG will still be generated # 4: Attempted Bandwidth HT80 used with Channel 6 + class lf_rssi_process: def __init__(self, - csv_file_list='NA', - png_dir='NA', - bandwidths_list='NA', - channel_list='NA', - antenna_list=0, - pathloss_list='NA' - ): + csv_file_list='NA', + png_dir='NA', + bandwidths_list='NA', + channel_list='NA', + antenna_list=0, + pathloss_list='NA' + ): self.csv_file_list = csv_file_list self.num_station_csv = len(self.csv_file_list) self.CSV_FILE = csv_file_list # TODO this needs to be a list for compatibility self.PNG_OUTPUT_DIR = png_dir - # TODO the args are passed in as metavar so it may be looped - # for the module the looping takes place outside the loop so this + # TODO the args are passed in as metavar so it may be looped + # for the module the looping takes place outside the loop so this # hack will be used for now self.bandwidths_list = bandwidths_list self.BANDWIDTH = 'NA' - self.channel_list= channel_list + self.channel_list = channel_list self.CHANNEL = 'NA' self.antenna_list = antenna_list self.ANTENNA = 'NA' @@ -86,14 +85,13 @@ def set_channel_path_loss(self): # TODO remove hard coded values # also capitalized variables # need to check for 2G channels - + self.BASE_PATH_LOSS = 36 if int(self.CHANNEL) <= 11: self.BASE_PATH_LOSS = float(self.pathloss_list[0]) elif int(self.CHANNEL) >= 34 and int(self.CHANNEL) <= 177: self.BASE_PATH_LOSS = float(self.pathloss_list[1]) - # helper functions def filt(self, lst): # filter out all instances of nan return lst[~(np.isnan(lst))] @@ -111,7 +109,7 @@ def expected_signal(self, attenuation): # theoretical expected signal # early exit for disconnected radio before threshold expected RSSI # TODO this should not be necessary as the data collection should skip # TODO - + def check_data(self, signal, signal_exp): if self.CHANNEL <= 11: self.CHECK_RADIOS.remove(1) # TODO: Make generic @@ -134,7 +132,7 @@ def check_compatibility(self): def read_all_csv_files(self): csv_file_index = 0 for csv_file in self.csv_file_list: - #self.csv_data = + # self.csv_data = if not os.path.exists(csv_file): logger.error("File not found {csv_file}".format(csv_file=csv_file)) sys.exit(2) @@ -144,15 +142,14 @@ def read_all_csv_files(self): for row in reader: self.csv_data[csv_file_index].append(row) - csv_file_index += 1 - + csv_file_index += 1 # Read in the data this probably should be generic # TODO remove not used - def read_csv_file(self, csv_file,index): + def read_csv_file(self, csv_file, index): self.CSV_FILE = csv_file # read data from file - #self.csv_data = + # self.csv_data = if not os.path.exists(self.CSV_FILE): logger.error("File not found {csv_file}".format(csv_file=self.CSV_FILE)) sys.exit(2) @@ -163,14 +160,13 @@ def read_csv_file(self, csv_file,index): self.csv_data[index].append(row) def populate_signal_and_attenuation_data_create_png(self): - # Each station has its own csv file - data_index = (len(self.csv_file_list) - 1) + # Each station has its own csv file + data_index = (len(self.csv_file_list) - 1) for channel in self.channel_list: self.CHANNEL = channel self.set_channel_path_loss() - for bandwidth in self.bandwidths_list: # used for title self.BANDWIDTH = bandwidth @@ -180,44 +176,45 @@ def populate_signal_and_attenuation_data_create_png(self): self.atten_data = [[], [], [], [], [], [], []] self.signal_data = [[], [], [], [], [], [], []] - + # csv_index is the all the csv data for an individual station - for csv_index in range (0, len(self.csv_file_list) ): + for csv_index in range(0, len(self.csv_file_list)): # run index is the data collected for a specific run for run_index in range(1, len(self.csv_data[csv_index])): # attenuation data # attenuation is in 1/10 dBm # position 11 in csv is the attenuation location counting from zero - logger.debug("bandwidth {bw} csv bandwidth {csv_bw}".format(bw=self.BANDWIDTH,csv_bw=self.csv_data[csv_index][run_index][29])) - logger.debug("channel {ch} csv channel {csv_ch}".format(ch=self.CHANNEL,csv_ch=self.csv_data[csv_index][run_index][27])) - logger.debug("antenna {at} csv antenna {csv_at}".format(at=self.ANTENNA,csv_at=self.csv_data[csv_index][run_index][30])) + logger.debug("bandwidth {bw} csv bandwidth {csv_bw}".format(bw=self.BANDWIDTH, csv_bw=self.csv_data[csv_index][run_index][29])) + logger.debug("channel {ch} csv channel {csv_ch}".format(ch=self.CHANNEL, csv_ch=self.csv_data[csv_index][run_index][27])) + logger.debug("antenna {at} csv antenna {csv_at}".format(at=self.ANTENNA, csv_at=self.csv_data[csv_index][run_index][30])) # neeed to compare channel, bandwidth, antenna - if ((self.csv_data[csv_index][run_index][29] == self.BANDWIDTH) - and (self.csv_data[csv_index][run_index][27] == self.CHANNEL) - and (self.csv_data[csv_index][run_index][30] == self.ANTENNA)): + if ((self.csv_data[csv_index][run_index][29] == self.BANDWIDTH) and + (self.csv_data[csv_index][run_index][27] == self.CHANNEL) and + (self.csv_data[csv_index][run_index][30] == self.ANTENNA)): + self.atten_data[csv_index].append(float(self.csv_data[csv_index][run_index][11])/10) # signal data is position 17 rssi = self.csv_data[csv_index][run_index][17] - rssi = rssi.replace(' dBm','') + rssi = rssi.replace(' dBm', '') rssi = float(rssi) - if rssi: + if rssi: self.signal_data[csv_index].append(rssi) else: self.signal_data[csv_index].append(np.nan) - logger.debug("csv_index: {csv} run_index: {run}".format(csv=csv_index,run=run_index)) - - logger.debug("channel: {channel} bandwidth: {bandwidth} antenna: {antenna} atten_data: {atten_data}".format(channel=self.CHANNEL,bandwidth=self.BANDWIDTH,antenna=self.ANTENNA,atten_data=self.atten_data)) - logger.debug("channel: {channel} bandwidth: {bandwidth} antenna: {antenna} signal_data: {signal_data}".format(channel=self.CHANNEL,bandwidth=self.BANDWIDTH,antenna=self.ANTENNA,signal_data=self.signal_data)) + logger.debug("csv_index: {csv} run_index: {run}".format(csv=csv_index, run=run_index)) + + logger.debug("channel: {channel} bandwidth: {bandwidth} antenna: {antenna} atten_data: {atten_data}".format(channel=self.CHANNEL, bandwidth=self.BANDWIDTH, antenna=self.ANTENNA, atten_data=self.atten_data)) # noqa: E501 + logger.debug("channel: {channel} bandwidth: {bandwidth} antenna: {antenna} signal_data: {signal_data}".format(channel=self.CHANNEL, bandwidth=self.BANDWIDTH, antenna=self.ANTENNA, signal_data=self.signal_data)) # noqa: E501 # all the data is now ready to create png for specific bandwidth self.create_png_files(index=data_index) - - # TODO the index is actually the total number of stations that + + # TODO the index is actually the total number of stations that # the csv data was gathered from - def create_png_files(self,index): + def create_png_files(self, index): # remove empty list from lists self.atten_data = [ele for ele in self.atten_data if ele != []] self.signal_data = [ele for ele in self.signal_data if ele != []] @@ -225,10 +222,10 @@ def create_png_files(self,index): atten = np.array(self.atten_data).T signal = np.array(self.signal_data).T - signal_avg = np.array([self.avg(row) for row in signal]) + # signal_avg = np.array([self.avg(row) for row in signal]) signal_exp = self.expected_signal(atten[:, 0]) signal_dev = np.array([signal[i] - signal_exp[i] for i in range(0, len(signal))]) - signal_avg_dev = signal_exp - signal_avg + # signal_avg_dev = signal_exp - signal_avg COLORS = { 'red': '#dc322f', @@ -245,61 +242,60 @@ def create_png_files(self,index): } color_index = { - 1 : 'red', - 2 : 'orange', - 3 : 'yellow', - 4 : 'green', - 5 : 'blue', - 6 : 'violet', - 7 : 'magenta', - 8 : 'cyan', - 9 : 'black', - 10 : 'gray', - 11 : 'dark_gray' + 1: 'red', + 2: 'orange', + 3: 'yellow', + 4: 'green', + 5: 'blue', + 6: 'violet', + 7: 'magenta', + 8: 'cyan', + 9: 'black', + 10: 'gray', + 11: 'dark_gray' } # TODO The legend needs to be dynamic. logger.debug("length of list of lists {length}".format(length=len(self.csv_data))) legend = {} # Use the number of lists to determing the legend - # should only need to read a single sample to get the radios and not + # should only need to read a single sample to get the radios and not # loop though all # TODO think of a more accurate way - j = 0 # csv data index starting a zero + j = 0 # csv data index starting a zero while j <= index: # we are reading the station and radio from the csv , # this should be fixed in the csv so o.k. to read from the same spot - legend[self.csv_data[j][1][24]] = '{station} {radio}'.format(station=self.csv_data[j][1][24],radio=self.csv_data[j][1][25] ) + legend[self.csv_data[j][1][24]] = '{station} {radio}'.format(station=self.csv_data[j][1][24], radio=self.csv_data[j][1][25]) # i += 1 logger.debug("legend {legend}".format(legend=legend)) j += 1 - plt.rc('font', family='Liberation Serif') plt.style.use('dark_background') fig = plt.figure(figsize=(8, 8), dpi=100) ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) ax.plot(atten[:, 0], signal_exp, color=COLORS['gray'], alpha=1.0, label='Expected') - #if self.CHANNEL <= 6: - # ax.plot(atten[:, 0], signal[:, 0], color=COLORS['red'], alpha=1.0, label=legend['sta0000']) # TODO: Make generic - #if self.CHANNEL >= 34 and self.CHANNEL <= 177: - # TODO Need to read the radio and creat the legend + # if self.CHANNEL <= 6: + # ax.plot(atten[:, 0], signal[:, 0], color=COLORS['red'], alpha=1.0, label=legend['sta0000']) # TODO: Make generic + # if self.CHANNEL >= 34 and self.CHANNEL <= 177: + # TODO Need to read the radio and creat the legend # TODO needs to be dynamic Focus on 5g for now # TODO only capture data for radios that support the mode # TODO using the number of lists in self.atten_data to see how much to plot - # TODO look for a better way + # TODO look for a better way # The index for self.data is incremented due to column headers logger.debug("length of lists of lists {length}".format(length=len(self.atten_data))) logger.info("plotting Attenuation vs. Signal ") - j = 0 # csv data index starting a zero, this is the number of csv files each csv file corresponds to one station + j = 0 # csv data index starting a zero, this is the number of csv files each csv file corresponds to one station while j <= index: ax.plot(atten[:, j], signal[:, j], color=COLORS[color_index[j+1]], alpha=1.0, label=legend[self.csv_data[j][j+1][24]]) # TODO: Make generic j += 1 ax.set_title('Attenuation vs. Signal:\n' + F'VAP={self.csv_data[0][1][19]}, ' - + F'VAP Radio=TODO' + + 'VAP Radio=TODO' + F'Channel={self.CHANNEL}, ' + F'Bandwidth={self.BANDWIDTH}, ' + F'Antenna={self.ANTENNA_LEGEND[self.ANTENNA]}') @@ -318,10 +314,10 @@ def create_png_files(self,index): # if self.CHANNEL <= 11: # ax.plot(atten[:, 0], signal_dev[:, 0], color=COLORS['red'], label=legend['sta0000']) # if self.CHANNEL >= 36 and self.CHANNEL <= 177: - i = 0 + # i = 0 j = 0 while j <= index: - ax.plot(atten[:, j], signal_dev[:, j], color=COLORS[color_index[j+1]], label=legend[self.csv_data[j][j+1][24]]) + ax.plot(atten[:, j], signal_dev[:, j], color=COLORS[color_index[j+1]], label=legend[self.csv_data[j][j+1][24]]) j += 1 ax.set_title('Atteunuation vs. Signal Deviation:\n' @@ -343,8 +339,6 @@ def create_png_files(self,index): # self.check_data(signal, signal_exp) # sys.exit(0) - - # Starting point for running this from cmd line. # note: when adding command line delimiters : +,=@ # https://stackoverflow.com/questions/37304799/cross-platform-safe-to-use-command-line-string-separator @@ -368,14 +362,14 @@ def main(): -------------------- ''' ) - #parser = argparse.ArgumentParser(description='Input and output files.') + # parser = argparse.ArgumentParser(description='Input and output files.') parser.add_argument('--csv', action="append", help='../output.csv') parser.add_argument('--png_dir', metavar='o', type=str, help='../PNGs') # TODO read the bandwidth from the csv data parser.add_argument('--bandwidths', help='--bandwidths list of bandwidths "20 40 80 160" space separated, default : "20" ', default='20') parser.add_argument('--channels', help='--channels list of channels "6 36" space separated, default: "36" ', default='36') parser.add_argument('--antennas', help=''' - --antennas list of antennas "0, 1, 4, 7, 8" default: + --antennas list of antennas "0, 1, 4, 7, 8" default: self.ANTENNA_LEGEND = { 0: 'Diversity (All)', 1: 'Fixed-A (1x1)', @@ -384,8 +378,8 @@ def main(): 8: 'ABCD (4x4)' } default is 0 - ''', default= 0) - parser.add_argument('--pathloss_list', help='list of path loss for 2g, 5g, 6g default: 26.74 31.87 0',default='26.74 31.87 0') + ''', default=0) + parser.add_argument('--pathloss_list', help='list of path loss for 2g, 5g, 6g default: 26.74 31.87 0', default='26.74 31.87 0') parser.add_argument('--log_level', default=None, help='Set logging level: debug | info | warning | error | critical') # logging configuration parser.add_argument("--lf_logger_config_json", help="--lf_logger_config_json , json configuration of logger") @@ -393,7 +387,7 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ Module to Process the data that was measured during lf_rssi_check.py , the process will take in a list of csv files extract the data and graph ''' @@ -414,11 +408,10 @@ def main(): logger_config.lf_logger_config_json = args.lf_logger_config_json logger_config.load_lf_logger_config() - bandwidths_list = args.bandwidths.split() - channel_list = args.channels.split() - antenna_list = args.antennas.split() - pathloss_list = args.pathloss_list.split() - + bandwidths_list = args.bandwidths.split() + channel_list = args.channels.split() + antenna_list = args.antennas.split() + pathloss_list = args.pathloss_list.split() # CSV_FILE = args.csv # PNG_OUTPUT_DIR = args.png_dir @@ -429,20 +422,17 @@ def main(): rssi_process = lf_rssi_process( csv_file_list=args.csv, png_dir=args.png_dir, - bandwidths_list = bandwidths_list, - channel_list = channel_list, - antenna_list = antenna_list, - pathloss_list = pathloss_list, + bandwidths_list=bandwidths_list, + channel_list=channel_list, + antenna_list=antenna_list, + pathloss_list=pathloss_list, ) - - rssi_process.read_all_csv_files() - # using the csv as a count + # using the csv as a count # process the collected csv data rssi_process.populate_signal_and_attenuation_data_create_png() - if __name__ == "__main__": main() diff --git a/py-scripts/lf_rx_sensitivity_test.py b/py-scripts/lf_rx_sensitivity_test.py index 5a4a798d7..708104b75 100755 --- a/py-scripts/lf_rx_sensitivity_test.py +++ b/py-scripts/lf_rx_sensitivity_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ Note: To Run this script gui should be opened with @@ -103,13 +102,13 @@ import argparse import time import json -from os import path +# from os import path if sys.version_info[0] != 3: print("This script requires Python 3") exit(1) - + sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) cv_test_manager = importlib.import_module("py-json.cv_test_manager") @@ -188,7 +187,7 @@ def run(self): # Test related settings cfg_options = [] - ### HERE### + # ## HERE### self.apply_cfg_options(cfg_options, self.enables, self.disables, self.raw_lines, self.raw_lines_file) # cmd line args take precedence and so come last in the cfg array. @@ -227,7 +226,7 @@ def main(): IMPORTANT: Start lanforge with socket 3990 : ./lfclient.bash -cli-socket 3990 lfclient.bash is located in the LANforgeGUI_X.X.X directory - On local or remote system: ./lfclient.bash -cli-socket 3990 -s LF_MGR + On local or remote system: ./lfclient.bash -cli-socket 3990 -s LF_MGR On local system the -s LF_MGR will be local_host if not provided Open this file in an editor and read the top notes for more details. @@ -251,42 +250,42 @@ def main(): see sample json file: lf_rx_sensitivity_config.json - Sample .json between using eth1 and eth2 + Sample .json between using eth1 and eth2 { - "mgr":"192.168.0.101", - "port":"8080", - "lf_user":"lanforge", - "lf_password":"lanforge", - "instance_name":"rx-sensitivity-instance", - "config_name":"test_con", - "upstream":"1.1.eth1", - "dut":"asus_5g", - "duration":"15s", - "station":"1.1.eth2", - "download_speed":"85%", - "upload_speed":"0", - "raw_line": ["txo_preamble: VHT", "txo_mcs: 4 OFDM, HT, VHT;5 OFDM, HT, VHT;6 OFDM, HT, VHT;7 OFDM, HT, VHT", "spatial_streams: 3", "bandw_options: 80", "txo_sgi: ON", "txo_retries: No Retry", "txo_txpower: 17"] + "mgr":"192.168.0.101", + "port":"8080", + "lf_user":"lanforge", + "lf_password":"lanforge", + "instance_name":"rx-sensitivity-instance", + "config_name":"test_con", + "upstream":"1.1.eth1", + "dut":"asus_5g", + "duration":"15s", + "station":"1.1.eth2", + "download_speed":"85%", + "upload_speed":"0", + "raw_line": ["txo_preamble: VHT", "txo_mcs: 4 OFDM, HT, VHT;5 OFDM, HT, VHT;6 OFDM, HT, VHT;7 OFDM, HT, VHT", "spatial_streams: 3", "bandw_options: 80", "txo_sgi: ON", "txo_retries: No Retry", "txo_txpower: 17"] # noqa: E501 } Sample .json between using eth1 and station 1.1.sta0002 { - "mgr":"192.168.0.101", - "port":"8080", - "lf_user":"lanforge", - "lf_password":"lanforge", - "instance_name":"rx-sensitivity-instance", - "config_name":"test_con", - "upstream":"1.1.eth1", - "dut":"asus_5g", - "duration":"15s", - "station":"1.1.sta0002", - "download_speed":"85%", - "upload_speed":"0", - "raw_line": ["txo_preamble: VHT", "txo_mcs: 4 OFDM, HT, VHT;5 OFDM, HT, VHT;6 OFDM, HT, VHT;7 OFDM, HT, VHT", "spatial_streams: 3", "bandw_options: 80", "txo_sgi: ON", "txo_retries: No Retry", "txo_txpower: 17"] + "mgr":"192.168.0.101", + "port":"8080", + "lf_user":"lanforge", + "lf_password":"lanforge", + "instance_name":"rx-sensitivity-instance", + "config_name":"test_con", + "upstream":"1.1.eth1", + "dut":"asus_5g", + "duration":"15s", + "station":"1.1.sta0002", + "download_speed":"85%", + "upload_speed":"0", + "raw_line": ["txo_preamble: VHT", "txo_mcs: 4 OFDM, HT, VHT;5 OFDM, HT, VHT;6 OFDM, HT, VHT;7 OFDM, HT, VHT", "spatial_streams: 3", "bandw_options: 80", "txo_sgi: ON", "txo_retries: No Retry", "txo_txpower: 17"] # noqa: E501 } """ - ) + ) cv_add_base_parser(parser) # see cv_test_manager.py @@ -308,8 +307,7 @@ def main(): parser.add_argument("--report_dir", default="") parser.add_argument('--help_summary', default=None, action="store_true", help='Show summary of what this script does') - - help_summary=''' + help_summary = ''' This script is used to automate running RX Sensitivity tests. You may need to view a RX Sensitivity test configured through the GUI to understand the options and how best to input data. @@ -325,7 +323,7 @@ def main(): try: with open(args.json, 'r') as json_config: json_data = json.load(json_config) - except: + except BaseException: print("Error reading {}".format(args.json)) # json configuation takes presidence to command line # TODO see if there is easier way to search presence, look at parser args @@ -364,26 +362,26 @@ def main(): cv_base_adjust_parser(args) CV_Test = RxSensitivityTest(lf_host=args.mgr, - lf_port=args.port, - lf_user=args.lf_user, - lf_password=args.lf_password, - instance_name=args.instance_name, - config_name=args.config_name, - upstream=args.upstream, - pull_report=args.pull_report, - load_old_cfg=args.load_old_cfg, - download_speed=args.download_speed, - upload_speed=args.upload_speed, - duration=args.duration, - dut=args.dut, - station=args.station, - enables=args.enable, - disables=args.disable, - raw_lines=args.raw_line, - raw_lines_file=args.raw_lines_file, - sets=args.set, - graph_groups=args.graph_groups - ) + lf_port=args.port, + lf_user=args.lf_user, + lf_password=args.lf_password, + instance_name=args.instance_name, + config_name=args.config_name, + upstream=args.upstream, + pull_report=args.pull_report, + load_old_cfg=args.load_old_cfg, + download_speed=args.download_speed, + upload_speed=args.upload_speed, + duration=args.duration, + dut=args.dut, + station=args.station, + enables=args.enable, + disables=args.disable, + raw_lines=args.raw_line, + raw_lines_file=args.raw_lines_file, + sets=args.set, + graph_groups=args.graph_groups + ) CV_Test.setup() CV_Test.run() diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index a785e5337..fea1607fe 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -1,47 +1,38 @@ #!/usr/bin/env python3 -# flake8: noqa +# TODO: Multiple sniffers, grab AID from LANforge station for use in OFDMA sniffing """ - NAME: lf_sniff_radio.py - PURPOSE: This script will sniff a Radio after changing the Radio settings. - - Radio settings: channel radio mode AUTO, 802.11a, 802.11b, etc... refer - py-json/LANforge/set_wifi_radio.py for different modes - - EXAMPLE: python3 lf_sniff_radio.py - --mgr localhost - --mgr_port 8080 - --outfile /home/lanforge/test_sniff.pcap - --duration 20 - --channel 52 - --radio_mode AUTO - --monitor_name moni0a - - NOTES: - - The configuration of the monitor is: sudo iw dev info - Sample: - - [lanforge@ct523c-3b7b ~]$ sudo iw dev SNIFF_5G_40 info - Interface SNIFF_5G_40 - ifindex 2413 - wdev 0x900000002 - addr 04:f0:21:85:62:22 - type monitor - wiphy 9 - channel 36 (5180 MHz), width: 20 MHz (no HT), center1: 5180 MHz - txpower 0.00 dBm - [lanforge@ct523c-3b7b ~]$ - - # manual way to set the center frequency - iw dev moni10a set freq
- - # sometimes the radio wiphy 9 (above) may not match the wiphy radio - when iw parent is not matching, can be show with command: - cat /sys/class/ieee80211/wiphy0/index - - IK: two features from lf_sniff that are needed for ofdma sniffing is obtaining the AID - and using multiple sniffer radios for targeting multiple stations - +NAME: lf_sniff_radio.py + +PURPOSE: This script runs a WiFi packet capture using the provided radio, creating the capture + interface as specified. + +EXAMPLE: # Capture on specified channel for 20 seconds, saving output to file + ./lf_sniff_radio.py \ + --radio 1.1.wiphy0 \ + --channel 52 \ + --duration 20 \ + --outfile /home/lanforge/wifi_capture.pcap \ + + # Capture 6 GHz channels on AX210/BE200 radios + # This requires workaround for firmware limitation, where radio must detect supported + # regulatory domain before enabling 6 GHz channels + ./lf_sniff_radio.py \ + --radio 1.1.wiphy0 \ + --duration 20 \ + --channel_bw 80 \ + --channel_freq 5955 \ + --center_freq 5985 \ + --6ghz_workaround \ + --num_stations 1 \ + --security wpa2 \ + --ssid test_ssid \ + --password lf_axe11000_5g \ + --6ghz_workaround_scan_time 1 + +NOTES: Configuration utilizes the 'iw' utility to some extent + + While monitor configuration may largely be viewed through the LANforge GUI, + commands like 'iw moni0 info' may be useful to verify configuration. """ import sys import os @@ -50,6 +41,7 @@ import time import paramiko import logging +import traceback logger = logging.getLogger(__name__) @@ -76,7 +68,7 @@ def __init__(self, channel_bw=None, center_freq=None, radio_mode="AUTO", - debug_on_=True, + debug_on_=False, monitor_name=None, sniff_snapshot_bytes=None, sniff_flags=None, @@ -85,9 +77,7 @@ def __init__(self, self.lfclient_host = lfclient_host self.lfclient_port = lfclient_port self.debug = debug_on_ - # self.local_realm = realm.Realm(lfclient_host=self.lfclient_host, - # lfclient_port=self.lfclient_port, - # debug_=self.debug) + self.monitor = self.new_wifi_monitor_profile() self.outfile = outfile self.radio = radio @@ -99,44 +89,47 @@ def __init__(self, self.mode = radio_mode self.monitor_name = monitor_name self.monitor_info = '' - self.sniff_snapshot_bytes = sniff_snapshot_bytes # default to max size - self.sniff_flags = sniff_flags # will default to dumpcap, see wifi_monitor_profile::SNIFF_X constants - - # TODO allow the channel_frequency to be entered - # if self.channel is None and self.channel_freq is None: - # print("either --channel or --channel_freq needs to be set") - # exit(1) - # elif self.channel_freq is not None: - # self.freq = self.channel_freq + self.sniff_snapshot_bytes = sniff_snapshot_bytes # default to max size + self.sniff_flags = sniff_flags # will default to dumpcap, see wifi_monitor_profile::SNIFF_X constants + + # User should enter either channel frequency in MHz or the channel number if self.channel_freq is not None: self.freq = self.channel_freq - logger.info("channel frequency {freq}".format(freq=self.channel_freq)) - # conversion of 6e channel to frequency - # ch_6e = (f - 5000 ) / 5 - # f = (ch_6e * 5) + 5000 - elif self.channel is not None: - if self.channel != 'AUTO': - if 'e' in self.channel: - channel_6e = self.channel.replace('e', '') - self.freq = ((int(channel_6e) + 190) * 5) + 5000 - lf_6e_chan = int(channel_6e) + 190 - logger.info("6e_chan: {chan} lf_6e_chan: {lf_chan} frequency: {freq}".format(chan=self.channel, lf_chan=lf_6e_chan, freq=self.freq)) - self.channel = lf_6e_chan + logger.debug(f"User input frequency: {self.channel_freq}") + + elif self.channel and self.channel != "AUTO": + if 'e' in self.channel: + # 6 GHz channel specified per-specification + # + # Conversion formulas between 6 GHz channel and frequency (in MHz): + # Channel = (Frequency - 5000) / 5 + # Frequency = (Channel * 5) + 5000 + channel_6e = self.channel.replace('e', '') + self.freq = ((int(channel_6e) + 190) * 5) + 5000 + self.channel = int(channel_6e) + 190 + + logger.debug(f"User input channel: {channel_6e}e, Calculated channel: {self.channel}, Calculated frequency: {self.freq}") + else: + if int(self.channel) <= 13: + # Standard 2.4 GHz channel + self.freq = 2407 + int(self.channel) * 5 + elif int(self.channel) == 14: + # Channel 14 in 2.4 GHz band is a special case. It doesn't follow formula + # for other 2.4 GHz channels and is only permitted in Japan for legacy modes + # (DSSS and CCK, aka 802.11b) + self.freq = 2484 else: - if int(self.channel) <= 13: - # channel 1 is 2412 , - self.freq = 2407 + int(self.channel) * 5 - elif int(self.channel) == 14: - self.freq = 2484 - # 5g or 6g Candela numbering - else: - self.freq = int(self.channel) * 5 + 5000 - logger.info("channel: {chan} frequency: {freq}".format(chan=self.channel, freq=self.freq)) - - if self.channel_bw != '20': - if self.center_freq is None: - logger.info("--center_freq need to be set for bw greater the 20") - exit(1) + # Either 5 GHz channel specified per-specification or 6 GHz channel specified per-Candela numbering + self.freq = int(self.channel) * 5 + 5000 + + logger.debug(f"User input channel: {channel}, Calculated frequency: {self.freq}") + + # Presently center frequency is needed for channel widths larger than 20 MHz + # TODO: Permit omission of center frequency and implement calculation in script + if self.channel_bw != '20' and not self.center_freq: + logger.error("Center frequency must be specified for channel widths larger than 20 MHz " + "using the '--center_freq' parameter. Run with '--help' for more information") + exit(1) def setup(self, ht40_value, ht80_value, ht160_value): # TODO: Store original channel settings so that radio can be set back to original values. @@ -146,54 +139,80 @@ def setup(self, ht40_value, ht80_value, ht160_value): self.monitor.create(radio_=self.radio, channel=self.channel, frequency=self.freq, mode=self.mode, name_=self.monitor_name) def start(self): + """Run packet capture.""" + monitor_eid = "1." + str(self.monitor.resource) + "." + self.monitor_name + + # Configure monitor to active state + logger.info(f"Configuring packet capture interface '{monitor_eid}'") self.monitor.admin_up() - LFUtils.wait_until_ports_appear(self.lfclient_url, self.monitor_name, debug=self.debug) - # TODO: Use LFUtils.wait_until_ports_admin_up instead of sleep, check return code. - # time.sleep(5) - self.set_freq(ssh_root=self.lfclient_host, ssh_passwd='lanforge', freq=self.freq) + + # Wait for monitor to exist + # TODO: Handle error from 'wait_until_ports_appear()', if any + # TODO: Change to use 'wait_until_ports_admin_up()' or similar if exists for this port type + LFUtils.wait_until_ports_appear(self.lfclient_url, monitor_eid, debug=self.debug) + + # Configure monitor frequency + self._set_freq(ssh_root=self.lfclient_host, ssh_passwd='lanforge', freq=self.freq) + + # Run packet capture for specified duration + logger.info(f"Running packet capture with interface '{monitor_eid}'") self.monitor.start_sniff(capname=self.outfile, duration_sec=self.duration, flags=self.sniff_flags, snap_len_bytes=self.sniff_snapshot_bytes) for i in range(0, self.duration): - logger.info("running sniffer for {duration} more seconds".format(duration=(self.duration - i))) + sec_remaining = self.duration - i + logger.debug(f"Running capture sniffer for {sec_remaining} more seconds") time.sleep(1) - logger.info("Sniffing Completed Success Check {outfile}".format(outfile=self.outfile)) + + # Capture complete + # Log location of output capture file and set monitor to inactive state + logger.info(f"Packet capture complete. Capture file available at '{self.outfile}' " + f"on remote system '{self.lfclient_host}'") self.monitor.admin_down() time.sleep(2) - # for 6E - # For example for channel 7 with 80Mhz bw , here are the monitor commands possible - # iw dev moni10a set freq 5955 80 5985 - # iw dev moni10a set freq 5975 80 5985 - # iw dev moni10a set freq 5995 80 5985 - # iw dev moni10a set freq 6015 80 5985 + def _set_freq(self, ssh_root, ssh_passwd, freq=0): + """Configure existing WiFi monitor interface via SSH.""" - # for 20 MHz the center frequency does not need to be entered since it is the same - - def set_freq(self, ssh_root, ssh_passwd, freq=0): if self.channel_bw == '20': + # Don't need to specify center frequency for 20 MHz channels, as only one possible cmd = f'. lanforge.profile\nsudo iw dev {self.monitor_name} set freq {freq}\n' else: + # Channel widths larger than 20 MHz require specifying center frequency with this CLI, as multiple possible + # + # For example, channel 7 (80 MHz channel in 6 GHz band) has four possible center frequencies: + # iw dev moni10a set freq 5955 80 5985 + # iw dev moni10a set freq 5975 80 5985 + # iw dev moni10a set freq 5995 80 5985 + # iw dev moni10a set freq 6015 80 5985 cmd = f'. lanforge.profile\nsudo iw dev {self.monitor_name} set freq {freq} {self.channel_bw} {self.center_freq}\n' cmd1 = f'iw dev {self.monitor_name} info' try: + # Initiate SSH connection to LANforge system ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ssh_root, 22, 'lanforge', ssh_passwd) time.sleep(10) + + # Configure channel/frequency stdout = ssh.exec_command(cmd, get_pty=True) stdout[0].write(f"{ssh_passwd}\n") stdout[0].flush() - stdout = (stdout[1].readlines()) - print(stdout, "----- set channel frequency") + + stdout = ''.join(stdout[1].readlines()) + logger.info(f"Set channel/frequency output:\n{stdout}") # NOTE: This prints out password + + # Query channel/frequency stdout = ssh.exec_command(cmd1) - stdout = (stdout[1].readlines()) - print(stdout, "----- channel frequency info") + stdout = ''.join(stdout[1].readlines()) + logger.info(f"Query channel/frequency output:\n{stdout}") + except paramiko.ssh_exception.NoValidConnectionsError as e: - print("####", e, "####") + logger.error(f"Failed to connect over SSH to system '{ssh_root}': {e}") exit(1) + except TimeoutError as e: - print("####", e, "####") + logger.error(f"SSH connection timed out: {e}") exit(1) ssh.close() @@ -210,160 +229,161 @@ def parse_args(): formatter_class=argparse.RawTextHelpFormatter, epilog='lf_sniff_radio.py will create a monitor on LANforge (cli command add_monitor)', - description='''\ - This script will sniff a Radio following modifications to its settings. - lf_sniff_radio.py will create a monitor and be able to capture wireshark pcap files: - - The monitor also uses iw commands to set up the proper bw and frequency to be monitored - - Note: - - iw [options] dev set freq [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] - dev set freq [5|10|20|40|80|80+80|160] [ []] - - Example to monitor channel 36 (5180) - sudo iw dev set freq 5180 40 5190 - - for bw of 20 do not need to set the control frequency - - Verify the configuration with :(need to do sudo) - iw dev info - - example: - [lanforge@ct523c-3ba3 ~]$ sudo iw dev SNIFF_5G_40 info - [sudo] password for lanforge: - Interface SNIFF_5G_40 - ifindex 49 - wdev 0x2 - addr d8:f8:83:36:4c:a0 - type monitor - wiphy 0 - channel 36 (5180 MHz), width: 20 MHz, center1: 5180 MHz - txpower 0.00 dBm - [lanforge@ct523c-3ba3 ~]$ - - - Help: 5Ghz frequencies - - Tested on 02/16/2023: - kernel version: 5.19.17+ - gui version: 5.4.6 - the script modified a radio and created a pcap file as expected when ran directly on a lanforge system (ct523c & ct521a). - - ''', - - usage='\n' - 'Creating a sniffer generally:\n' - '\t./lf_sniff_radio.py\n' - '\t --mgr localhost\n' - '\t --mgr_port 8080\n' - '\t --radio wiphy0\n' - '\t --outfile /home/lanforge/test_sniff.pcap\n' - '\t --duration 1\n' - '\t --channel 36\n' - '\t --channel_bw 40\n' - '\t --center_freq 5190\n' - '\t --radio_mode AUTO\n' - '\t --monitor_name moni0\n' - '\t\n' - 'Creating a 6GHz sniffer on AX210/BE200 radios:\n' - '\t./lf_sniff_radio.py\n' - '\t --mgr 192.168.0.104\n' - '\t --mgr_port 8080\n' - '\t --radio wiphy7\n' - '\t --outfile /home/lanforge/sniff_6G_80.pcap\n' - '\t --duration 20\n' - '\t //--channel 1e\n' - '\t --channel_bw 80\n' - '\t --channel_freq 5955\n' - '\t --center_freq 5985\n' - '\t --radio_mode AUTO\n' - '\t --monitor_name moni0\n' - '\t --disable_ht40 0\n' - '\t --disable_ht80 0\n' - '\t --ht160_enable 0\n' - '\t --6ghz_workaround\n' - '\t --num_stations 1\n' - '\t --security wpa2\n' - '\t --ssid axe11000_5g\n' - '\t --password lf_axe11000_5g\n' - '\t --6ghz_workaround_scan_time 10') - - parser.add_argument('--mgr', type=str, help='IP Address of LANforge', + description=r""" +NAME: lf_sniff_radio.py + +PURPOSE: This script runs a WiFi packet capture using the provided radio, creating the capture + interface as specified. + +EXAMPLE: # Capture on specified channel for 20 seconds, saving output to file + ./lf_sniff_radio.py \ + --radio 1.1.wiphy0 \ + --channel 52 \ + --duration 20 \ + --outfile /home/lanforge/wifi_capture.pcap \ + + # Capture 6 GHz channels on AX210/BE200 radios + # This requires workaround for firmware limitation, where radio must detect supported + # regulatory domain before enabling 6 GHz channels + ./lf_sniff_radio.py \ + --radio 1.1.wiphy0 \ + --duration 20 \ + --channel_bw 80 \ + --channel_freq 5955 \ + --center_freq 5985 \ + --6ghz_workaround \ + --num_stations 1 \ + --security wpa2 \ + --ssid test_ssid \ + --password lf_axe11000_5g \ + --6ghz_workaround_scan_time 1 + +NOTES: Configuration utilizes the 'iw' utility to some extent + + While monitor configuration may largely be viewed through the LANforge GUI, + commands like 'iw moni0 info' may be useful to verify configuration. + """) + + parser.add_argument('--mgr', + type=str, + help='IP Address of LANforge', default="localhost") - parser.add_argument('--mgr_port', type=int, help='HTTP Port of LANforge', + parser.add_argument('--mgr_port', + type=int, + help='HTTP Port of LANforge', default=8080) - parser.add_argument('--radio', type=str, help='Radio to sniff with', + + parser.add_argument('--radio', + type=str, + help='Radio to sniff with', default="wiphy0") - parser.add_argument('--outfile', type=str, help='Give the filename with path', + parser.add_argument('--outfile', + type=str, + help='Give the filename with path', default="/home/lanforge/test_pcap.pcap") - parser.add_argument('--duration', type=int, help='Duration in sec for which you want to capture', + parser.add_argument('--duration', + type=int, + help='Duration in sec for which you want to capture', default=60) - parser.add_argument('--channel', type=str, + parser.add_argument('--channel', + type=str, help='Set channel pn selected Radio, the channel [52, 56 ...]\n' 'channel will get converted to the control frequency.\n' 'Must enter Channel', default='36') - parser.add_argument('--channel_freq', type=str, + parser.add_argument('--channel_freq', + type=str, help='Frequency that the channel operates at\n' 'Must enter --channel or --channel_freq\n' '--channel_freq takes presidence if both entered if value not zero') - parser.add_argument('--channel_bw', type=str, help='Select the bandwidth to be monitored, [ [20|40|80|80+80|160]], default=20', + parser.add_argument('--channel_bw', + type=str, + help='Select the bandwidth to be monitored, [ [20|40|80|80+80|160]], default=20', default='20') - parser.add_argument('--center_freq', type=str, + parser.add_argument('--center_freq', + type=str, help='Select the bandwidth to be monitored\n' '(not needed if channel width is 20MHz', default=None) - parser.add_argument('--radio_mode', type=str, help='Select the radio mode [AUTO, 802.11a, 802.11b, 802.11ab ...]', + parser.add_argument('--radio_mode', + type=str, + help='Select the radio mode [AUTO, 802.11a, 802.11b, 802.11ab ...]', default="AUTO") - parser.add_argument('--monitor_name', type=str, help='Wi-Fi monitor name', + parser.add_argument('--monitor_name', + type=str, + help='Wi-Fi monitor name', default="sniffer0") - parser.add_argument('--disable_ht40', type=str, help='Enable/Disable \"disable_ht40\" [0-disable,1-enable]', + parser.add_argument('--disable_ht40', + type=str, + help='Enable/Disable \"disable_ht40\" [0-disable,1-enable]', default=0) - parser.add_argument('--disable_ht80', type=str, help='Enable/Disable \"disable_ht80\" [0-disable,1-enable]', + parser.add_argument('--disable_ht80', + type=str, + help='Enable/Disable \"disable_ht80\" [0-disable,1-enable]', default=0) - parser.add_argument('--ht160_enable', type=str, help='Enable/Disable \"ht160_enable\\ [0-disable,1-enable]" ', + parser.add_argument('--ht160_enable', + type=str, + help='Enable/Disable \"ht160_enable\\ [0-disable,1-enable]" ', default=0) + + # 6 GHz Intel AX210/BE200 workaround options + # TODO: Highlight in help that these arguments are for 6 GHz workaround only parser.add_argument('--6ghz_workaround', '--ax210', + dest='do_6ghz_workaround', help='Perform workaround for Intel AX210 or BE200 radio 6GHz monitor mode firmware limitation\n' 'before sniffing packets. Radio firmware requires a scan of 6GHz-capable regulatory domain\n' 'before granting access to 6GHz channels on a monitor mode interface.\n', - dest='do_6ghz_workaround', action='store_true') - parser.add_argument('--6ghz_workaround_scan_time', '--ax210_scan_time', help='Time to wait for scan in 6GHz workaround', + parser.add_argument('--6ghz_workaround_scan_time', '--ax210_scan_time', dest='do_6ghz_workaround_scan_time', + help='Time to wait for scan in 6GHz workaround', default='20') - parser.add_argument('--num_stations', type=int, help='Number of stations to create default 1 for AX210 sniffing', + parser.add_argument('--num_stations', # TODO: Make into dummy arg, only one permitted on Intel radios + type=int, + help='Number of stations to create default 1 for AX210 sniffing', default=1) - parser.add_argument('--number_template', help='Start the station numbering with a particular number. Default is 0000', + parser.add_argument('--number_template', + help='Start the station numbering with a particular number. Default is 0000', default=0000) - parser.add_argument('--station_list', help='Optional: User defined station names, can be a comma or space separated list', nargs='+', + parser.add_argument('--station_list', + help='Optional: User defined station names, can be a comma or space-separated list', + nargs='+', default=None) - parser.add_argument('--upstream_port', help='Upstream port', + parser.add_argument('--upstream_port', + help='Upstream port', default='eth2') - parser.add_argument('--side_a_min_rate', help='bps rate minimum for side_a default: 1024000', + parser.add_argument('--side_a_min_rate', + help='bps rate minimum for side_a default: 1024000', default=1024000) - parser.add_argument('--side_b_min_rate', help='bps rate minimum for side_b default: 1024000', + parser.add_argument('--side_b_min_rate', + help='bps rate minimum for side_b default: 1024000', default=1024000) - parser.add_argument('--sta_prefix', help='Prefix used when creating station', + parser.add_argument('--sta_prefix', + help='Prefix used when creating station', default='wlan') - parser.add_argument('--security', help='WiFi Security protocol: < open | wep | wpa | wpa2 | wpa3 >', + parser.add_argument('--security', + help='WiFi Security protocol: < open | wep | wpa | wpa2 | wpa3 >', default='open') - parser.add_argument('--ssid', help='WiFi SSID for script objects to associate to', + parser.add_argument('--ssid', + help='WiFi SSID for script objects to associate to', default='axe11000_5g') - parser.add_argument('--password', help='WiFi passphrase/password/key', + parser.add_argument('--password', + help='WiFi passphrase/password/key', default='[BLANK]') - parser.add_argument('--mode', help='Used to force mode of stations default: 0 (auto)', + parser.add_argument('--mode', + help='Used to force mode of stations default: 0 (auto)', default=0) parser.add_argument('--ap', help='Used to force a connection to a particular AP') # Logging information - # logging configuration - parser.add_argument('--log_level', help='Set logging level: debug | info | warning | error | critical', + parser.add_argument('--log_level', + help='Set logging level: debug | info | warning | error | critical', default=None) - parser.add_argument("--lf_logger_config_json", help="--lf_logger_config_json , json configuration of logger") + parser.add_argument("--lf_logger_config_json", + help="--lf_logger_config_json , json configuration of logger") - parser.add_argument('--sniff_bytes', help='keep this many bytes per packet, helps to reduce overall capture size', + parser.add_argument('--sniff_bytes', + help='keep this many bytes per packet, helps to reduce overall capture size', default=None) parser.add_argument('--sniff_using', help='Default sniffer is Wireshark, which is only useful from a desktop setting.\n' @@ -374,7 +394,9 @@ def parse_args(): 'mate_xterm: make tshark/dumpcap interactive in an xterm\n' 'mate_kill_dumpcap: kill previously issued dumpcap', default=None) - parser.add_argument('--help_summary',help='shows summary of the script',action='store_true') + parser.add_argument('--help_summary', + help='shows summary of the script', + action='store_true') return parser.parse_args() @@ -401,20 +423,20 @@ def do_6ghz_workaround(args): station_list = args.station_list create_l3 = createL3.CreateL3(host=args.mgr, - port=args.mgr_port, - number_template=str(args.number_template), - sta_list=station_list, - name_prefix="VT", - upstream=args.upstream_port, - ssid=args.ssid, - password=args.password, - radio=args.radio, - security=args.security, - side_a_min_rate=args.side_a_min_rate, - side_b_min_rate=args.side_b_min_rate, - mode=args.mode, - ap=args.ap, - _debug_on=True) + port=args.mgr_port, + number_template=str(args.number_template), + sta_list=station_list, + name_prefix="VT", + upstream=args.upstream_port, + ssid=args.ssid, + password=args.password, + radio=args.radio, + security=args.security, + side_a_min_rate=args.side_a_min_rate, + side_b_min_rate=args.side_b_min_rate, + mode=args.mode, + ap=args.ap, + _debug_on=True) create_l3.build() create_l3.start() @@ -428,11 +450,12 @@ def do_6ghz_workaround(args): def main(): - args = parse_args() + help_summary = "This script performs WiFi packet capture using the radio and channel specified " \ + "by the user for the configured duration. When performing 6 GHz packet capture " \ + "using an Intel AX210 or BE200 2x2 radio, a workaround is required. See the output " \ + "when run with '--help' or the header of the script for example usage." - help_summary='''\ - This script is intended to sniff the radio specified by the user on a particular channel for a specified duration. - ''' + args = parse_args() if args.help_summary: print(help_summary) exit(0) @@ -459,9 +482,11 @@ def main(): if bytesize > -1: sniff_snaplen_choice = bytesize else: - raise ValueError("bad sniff_bytes") - except: - print(f"Strange sniff length [{args.sniff_bytes}], please choose a positive value") + raise ValueError("bad '--sniff_bytes'") + + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) + logger.error(f"Unsupported/bad sniff length '{args.sniff_bytes}', please choose a positive whole number") exit(1) # The '**vars(args)' unpacks arguments into named parameters @@ -472,23 +497,21 @@ def main(): sniff_flags=sniff_flags_choice, sniff_snapshot_bytes=sniff_snaplen_choice, **vars(args)) - obj.setup(int(args.disable_ht40), int(args.disable_ht80), int(args.ht160_enable)) + # Perform pre-capture configuration + obj.setup(int(args.disable_ht40), int(args.disable_ht80), int(args.ht160_enable)) if args.do_6ghz_workaround: workaround_cx.stop() + time.sleep(5) # TODO: Add wait-for logic instead of a sleep - # TODO: Add wait-for logic instead of a sleep - time.sleep(5) - - # check + # Run capture obj.start() - obj.cleanup() + # Capture complete, perform cleanup + obj.cleanup() if args.do_6ghz_workaround: workaround_cx.cleanup() - # TODO: Check if passed or not. - if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_snp_test.py b/py-scripts/lf_snp_test.py index 39091d760..80eea1e7e 100755 --- a/py-scripts/lf_snp_test.py +++ b/py-scripts/lf_snp_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_snp_test.py snp == Scaling and Performance @@ -152,6 +151,8 @@ import csv import random import logging +import traceback + if sys.version_info[0] != 3: print("This script requires Python 3") @@ -964,7 +965,7 @@ def controller_show_ap_channel(self): break logg.info("configure ap {} channel {} chan_width {}".format(self.ap, self.channel, self.chan_width)) - # Verify channel and channel width. + # Verify channel and channel width. ################################################################################ @@ -1419,7 +1420,7 @@ def start(self, print_pass=False, print_fail=False): cur_time = datetime.datetime.now() logg.info("Getting initial values.") - # the total_dl_bps and total_up_bps is for all stations + # the total_dl_bps and total_up_bps is for all stations old_rx_values, rx_drop_percent, endps, total_dl_bps, total_ul_bps = self.__get_rx_values() end_time = self.parse_time(self.test_duration) + cur_time @@ -1438,7 +1439,7 @@ def start(self, print_pass=False, print_fail=False): time.sleep(1) self.epoch_time = int(time.time()) - # the total_dl_bps and total_up_bps is for all stations + # the total_dl_bps and total_up_bps is for all stations new_rx_values, rx_drop_percent, endps, total_dl_bps, total_ul_bps = self.__get_rx_values() print("main loop, total-dl: ", total_dl_bps, " total-ul: ", total_ul_bps) @@ -1448,7 +1449,7 @@ def start(self, print_pass=False, print_fail=False): # __compare_vals - does the calculations Result, rx_bytes, csv_rx_row_data = self.__compare_vals(old_rx_values, new_rx_values, total_dl_bps, total_ul_bps) - # save the best rate for the interval + # save the best rate for the interval if rx_bytes > best_rx_bytes: best_rx_bytes = rx_bytes @@ -1485,7 +1486,7 @@ def cleanup(self): for station_profile in self.station_profiles: station_profile.cleanup() - # for details csv file + # for details csv file def csv_generate_column_details_headers(self): # test_keys used to generate the test_id csv_rx_headers = self.test_keys.copy() @@ -1569,51 +1570,51 @@ def main(): Task Description: Ultimate Aim ################################################################################## ----------------- -Candela Scaling and Performance Test (SNP) +Candela Scaling and Performance Test (SNP) The Test supports configuraiton of a Controller which configures An AP and the Configuration of LANforge or Multiple LANforges -configured into a "Realm". +configured into a "Realm". ######################################### # Examples -# ####################################### -EXAMPLE: +# ####################################### +EXAMPLE: Use --print_test_config at end of command to see test configuration Test configurations take presidence to command line parameters Using Coded Test Configuration --controller_test_1 - ./lf_snp_test.py --controller_ip 10.195.197.234 --controller_user admin --controller_passwd Milpitas@123 + ./lf_snp_test.py --controller_ip 10.195.197.234 --controller_user admin --controller_passwd Milpitas@123 --controller_aps 'Vanc-e' --controller_series "9800" --endp_types 'lf_udp' --upstream_port eth2 --controller_prompt "Can-SnP-9120" --controller_test_1 --print_test_config Using Coded Test Configuration --controller_test_1 - ./lf_snp_test.py --controller_ip 10.195.197.234 --controller_user admin --controller_passwd Milpitas@123 + ./lf_snp_test.py --controller_ip 10.195.197.234 --controller_user admin --controller_passwd Milpitas@123 --controller_aps 'Vanc-e' --controller_series "9800" --endp_types 'lf_udp' --upstream_port eth2 --controller_prompt "Can-SnP-9120" --controller_test_1 --print_test_config Using Coded Test Configuration: - ./lf_snp_test.py -cc 192.168.100.112 -cu admin -cpw Cisco123 -cca APA453.0E7B.CF9C -cs "3504" --endp_types 'lf_udp' --upstream_port eth2 --controller_test_3 - --controller_prompt "(Cisco Controller)" + ./lf_snp_test.py -cc 192.168.100.112 -cu admin -cpw Cisco123 -cca APA453.0E7B.CF9C -cs "3504" --endp_types 'lf_udp' --upstream_port eth2 --controller_test_3 + --controller_prompt "(Cisco Controller)" --print_test_config Using Commandline with defaults: - ./lf_snp_test.py --controller_ip 192.168.100.112 --controller_user admin --controller_passwd Cisco123 --controller_aps APA453.0E7B.CF9C --controller_series "3504" - --controller_prompt "(Cisco Controller)" --radio "radio==1.wiphy0 stations==1 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto" + ./lf_snp_test.py --controller_ip 192.168.100.112 --controller_user admin --controller_passwd Cisco123 --controller_aps APA453.0E7B.CF9C --controller_series "3504" + --controller_prompt "(Cisco Controller)" --radio "radio==1.wiphy0 stations==1 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto" --print_test_config Using Commandline: - ./lf_snp_test.py --controller_ip 192.168.100.112 --controller_user admin --controller_passwd Cisco123 --controller_aps APA453.0E7B.CF9C - --controller_series "3504" --upstream_port eth2 --controller_prompt "(Cisco Controller)" --controller_wifimode "a" --controller_chan_5ghz "36" - --radio "radio==1.wiphy0 stations==10 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==ac" --controller_client_densities "10" + ./lf_snp_test.py --controller_ip 192.168.100.112 --controller_user admin --controller_passwd Cisco123 --controller_aps APA453.0E7B.CF9C + --controller_series "3504" --upstream_port eth2 --controller_prompt "(Cisco Controller)" --controller_wifimode "a" --controller_chan_5ghz "36" + --radio "radio==1.wiphy0 stations==10 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==ac" --controller_client_densities "10" --print_test_config Using Commandline: Setting --test_duration "20s" --polling_interval to 5s -ccd "2" (--controller_client_densities) - ./lf_snp_test.py --controller_ip 192.168.100.112 --controller_user admin --controller_passwd Cisco123 --controller_aps APA453.0E7B.CF9C - --controller_series "3504" --upstream_port eth2 --controller_prompt "(Cisco Controller)" --controller_wifimode "auto" --controller_chan_5ghz "36" - --radio "radio==1.wiphy0 stations==2 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==an" --controller_client_densities "2" + ./lf_snp_test.py --controller_ip 192.168.100.112 --controller_user admin --controller_passwd Cisco123 --controller_aps APA453.0E7B.CF9C + --controller_series "3504" --upstream_port eth2 --controller_prompt "(Cisco Controller)" --controller_wifimode "auto" --controller_chan_5ghz "36" + --radio "radio==1.wiphy0 stations==2 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==an" --controller_client_densities "2" --print_test_config ############################################# @@ -1637,7 +1638,7 @@ def main(): Note: wave-2 radios can act as ac, an, (802.11an-AC) or legacy a/b/g (802.11bgn-AC) ############################################# -Wifi Modes +Wifi Modes ############################################# 11ax (2.4 ghz or 5 ghz), 11ac (5 ghz only), 11n (2.4ghz or 5 ghz), 11bg (2.4 ghz) (controller) @@ -1657,12 +1658,12 @@ def main(): 24 Ghz Radios and Wifi Modes ############################################# Wifi mode: 11ax - 24ghz -Radios : ax200 - 802.11 /b/g/n/AX +Radios : ax200 - 802.11 /b/g/n/AX Wifi mode: 11ac - 24ghz Radios : ax200 802.11 /b/g/n/AX (2.4Ghz doesn't officially support /AC, but often chips will do /AC there anyway) (invalid) -Wifi mode: 11n - 24ghz +Wifi mode: 11n - 24ghz Radios : ax200 802.11 /b/g/n/AX Wifi mode: 11bg - 24ghz @@ -1673,7 +1674,7 @@ def main(): ############################################ controller_wifimode == "anAX" or controller_wifimode == "abgn" or controller_wifimode == "bg": radios = radio_AX200_abgn_ax_dict[controller_client_density] - + controller_wifimode == "an" or controller_wifimode == "anAC": radios = radio_ath10K_9984_an_AC_dict[controller_client_density] @@ -1689,11 +1690,11 @@ def main(): 1.wiphy5 802.11abgn-ax iwlwifi(AX200) 523 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn 1.wiphy6 802.11abgn-ax iwlwifi(AX200) 523 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn 1.wiphy7 802.11abgn-ax iwlwifi(AX200) 523 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn -1.wiphy8 802.11an-AC ath10k(9984) 523 - 64 stations - 5ghz +1.wiphy8 802.11an-AC ath10k(9984) 523 - 64 stations - 5ghz 1.wiphy9 802.11an-AC ath10k(9984) 523 - 64 stations - 5ghz 2.wiphy0 802.11abgn-ax iwlwifi(AX200) 521 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn -2.wiphy1 802.11abgn-ax iwlwifi(AX200) 521 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn +2.wiphy1 802.11abgn-ax iwlwifi(AX200) 521 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn 3.wiphy0 802.11abgn-ax iwlwifi(AX200) 521 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn 3.wiphy1 802.11abgn-ax iwlwifi(AX200) 521 - 1 stations - 5ghz/24ghz use only for 802.11ax - 24gz abgn @@ -1720,15 +1721,15 @@ def main(): ######################################################################################################## LANForge Monitored Values Per Polling Interval 'rx bytes' - bytes transmitted - 'rx rate' - bits per second + 'rx rate' - bits per second - in DL direction: -B tx -> -A rx, (side_b_tx_min_bps) LANforge Eth endpoint transmits bytes (AP/DUT), station endpoint (Wifi) LANForge receives them. station-end-rx-bps (bits per second) is download rx-bps (bits per second) - in UL direction: -A tx -> -B rx, (side_a_tx_min_bps) LANforge Eth endpoint receives bytes (AP/DUT), station endpoint (Wifi) LANForge transmits them. ethernet-end-rx-bps (bits per second) is upload load rx-bps (bits per second) + in DL direction: -B tx -> -A rx, (side_b_tx_min_bps) LANforge Eth endpoint transmits bytes (AP/DUT), station endpoint (Wifi) LANForge receives them. station-end-rx-bps (bits per second) is download rx-bps (bits per second) # noqa: E501 + in UL direction: -A tx -> -B rx, (side_a_tx_min_bps) LANforge Eth endpoint receives bytes (AP/DUT), station endpoint (Wifi) LANForge transmits them. ethernet-end-rx-bps (bits per second) is upload load rx-bps (bits per second) # noqa: E501 ######################################################################################################### LANforge GUI what is displayed in the Column and how to access the value with cli or json ######################################################################################################### -# NOTE: see how rx rate is used in script and can monitor any values in similiar manner +# NOTE: see how rx rate is used in script and can monitor any values in similiar manner GUI Column Display Layer3_cols argument to type in (to print in report) @@ -1853,7 +1854,7 @@ def main(): # Script AP parameters for reading AP, - not used in this script ################################################################# parser.add_argument('-api', '--ap_info', action='append', nargs=1, type=str, - help='(enter 0 if does not apply) --ap_info \"ap_scheme== ap_prompt== ap_ip== ap_port== ap_user== ap_pw== ap_tty==\" ') + help='(enter 0 if does not apply) --ap_info \"ap_scheme== ap_prompt== ap_ip== ap_port== ap_user== ap_pw== ap_tty==\" ') # noqa: E501 # --ap_info "ap_scheme==serial ap_prompt==APA53.0E7B.CF9C ap_ip==0 ap_port==0 ap_user==admin ap_pw==Admin123 ap_tty==/dev/ttyUSB2" ############################################# @@ -1905,7 +1906,6 @@ def main(): parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - ############################################################## # # Scaling and Performance Args Parser @@ -1920,7 +1920,7 @@ def main(): # Help Summary ############################################################### - help_summary='''\ + help_summary = '''\ This script is functional and is an example. This program is to test an AP connected to a controller. The AP name is configurable. @@ -1932,7 +1932,6 @@ def main(): print(help_summary) exit(0) - ############################################################### # Gather Test Data ############################################################### @@ -2055,10 +2054,10 @@ def main(): ['radio==1.wiphy8 stations==10 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] radio_ath10K_9984_an_AC_list_020_one = [ ['radio==1.wiphy8 stations==20 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_list_050_one = [ - ['radio==1.wiphy8 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_list_050_one = [ - ['radio==1.wiphy8 stations==64 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath10K_9984_an_AC_list_050_one = [ + # ['radio==1.wiphy8 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath10K_9984_an_AC_list_050_one = [ + # ['radio==1.wiphy8 stations==64 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] radio_ath10K_9984_an_AC_dict_one = {'1': radio_ath10K_9984_an_AC_list_001_one, '10': radio_ath10K_9984_an_AC_list_010_one, @@ -2074,7 +2073,7 @@ def main(): ############################################################ # - # Radio Dictionary for multiple LANforge in Realm + # Radio Dictionary for multiple LANforge in Realm # Configuration used by command switch --controller_test_2 # ############################################################ @@ -2093,28 +2092,28 @@ def main(): ['radio==2.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], ['radio==2.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] - radio_AX200_abgn_ax_list_020 = [ - ['radio==1.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy2 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy3 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy4 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy5 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy6 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy7 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==2.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==2.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==3.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==3.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==4.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==4.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==5.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==5.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==6.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==6.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==6.wiphy2 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==6.wiphy3 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ] + # radio_AX200_abgn_ax_list_020 = [ + # ['radio==1.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy2 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy3 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy4 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy5 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy6 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy7 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==2.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==2.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==3.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==3.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==4.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==4.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==5.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==5.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==6.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==6.wiphy1 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==6.wiphy2 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==6.wiphy3 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ] radio_AX200_abgn_ax_list_024 = [ ['radio==1.wiphy0 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], @@ -2151,13 +2150,13 @@ def main(): ['radio==1.wiphy8 stations==1 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] radio_ath10K_9984_an_AC_list_010 = [ ['radio==1.wiphy8 stations==10 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_list_020 = [ - ['radio==1.wiphy8 stations==20 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath10K_9984_an_AC_list_020 = [ + # ['radio==1.wiphy8 stations==20 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] radio_ath10K_9984_an_AC_list_050 = [ ['radio==1.wiphy8 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_list_100 = [ - ['radio==1.wiphy8 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], - ['radio==1.wiphy9 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath10K_9984_an_AC_list_100 = [ + # ['radio==1.wiphy8 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], + # ['radio==1.wiphy9 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto']] radio_ath10K_9984_an_AC_list_200 = [ ['radio==1.wiphy8 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], ['radio==1.wiphy9 stations==50 ssid==test-can ssid_pw==[BLANK] security==open wifimode==auto'], @@ -2176,7 +2175,7 @@ def main(): ############################################################# # - # Static dictionary for radios on 191.168.100.178 + # Static dictionary for radios on 191.168.100.178 # Static Configuration Candela Tech Realm () # Configuration used by command switch --controller_test_3 # @@ -2202,18 +2201,18 @@ def main(): ['radio==1.wiphy0 stations==1 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] radio_ath10K_9984_an_AC_list_010 = [ ['radio==1.wiphy0 stations==10 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_list_020 = [ - ['radio==1.wiphy0 stations==20 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath10K_9984_an_AC_list_020 = [ + # ['radio==1.wiphy0 stations==20 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] radio_ath10K_9984_an_AC_list_050 = [ ['radio==1.wiphy0 stations==50 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_list_001_wiphy0 = [ - ['radio==1.wiphy0 stations==1 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_list_010_wiphy0 = [ - ['radio==1.wiphy0 stations==10 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath10K_9984_an_AC_list_001_wiphy0 = [ + # ['radio==1.wiphy0 stations==1 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath10K_9984_an_AC_list_010_wiphy0 = [ + # ['radio==1.wiphy0 stations==10 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath10K_9984_an_AC_dict_test_wiphy0 = {'1': radio_ath10K_9984_an_AC_list_001_wiphy0, - '10': radio_ath10K_9984_an_AC_list_010_wiphy0} + # radio_ath10K_9984_an_AC_dict_test_wiphy0 = {'1': radio_ath10K_9984_an_AC_list_001_wiphy0, + # '10': radio_ath10K_9984_an_AC_list_010_wiphy0} radio_ath10K_9984_an_AC_dict_test = {'1': radio_ath10K_9984_an_AC_list_001, '10': radio_ath10K_9984_an_AC_list_010, @@ -2223,22 +2222,23 @@ def main(): # Test to use ath9K #################################################################### - radio_ath9K_9984_abgn_list_001 = [ - ['radio==1.wiphy1 stations==1 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath9K_9984_abgn_list_010 = [ - ['radio==1.wiphy1 stations==10 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath9K_9984_abgn_list_020 = [ - ['radio==1.wiphy1 stations==20 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath9K_9984_abgn_list_050 = [ - ['radio==1.wiphy1 stations==50 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - radio_ath9K_9984_abgn_list_200 = [ - ['radio==1.wiphy1 stations==200 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] - - radio_ath9K_9984_abgn_dict_test = {'1': radio_ath9K_9984_abgn_list_001, - '10': radio_ath9K_9984_abgn_list_010, - '20': radio_ath9K_9984_abgn_list_020, - '50': radio_ath9K_9984_abgn_list_050, - '200': radio_ath9K_9984_abgn_list_200} + # radio_ath9K_9984_abgn_list_001 = [ + # ['radio==1.wiphy1 stations==1 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath9K_9984_abgn_list_010 = [ + # ['radio==1.wiphy1 stations==10 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath9K_9984_abgn_list_020 = [ + # ['radio==1.wiphy1 stations==20 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath9K_9984_abgn_list_050 = [ + # ['radio==1.wiphy1 stations==50 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + # radio_ath9K_9984_abgn_list_200 = [ + # ['radio==1.wiphy1 stations==200 ssid==test_candela ssid_pw==[BLANK] security==open wifimode==auto']] + + # radio_ath9K_9984_abgn_dict_test = {'1': radio_ath9K_9984_abgn_list_001, + # '10': radio_ath9K_9984_abgn_list_010, + # '20': radio_ath9K_9984_abgn_list_020, + # '50': radio_ath9K_9984_abgn_list_050, + # '200': radio_ath9K_9984_abgn_list_200} + #################################################################### # Test to only use teh ath9K #################################################################### @@ -2441,8 +2441,9 @@ def main(): try: report_path = report.get_report_path() logg.info("Reports Directory Created: {}".format(report_path)) - except: - logg.info("Reports Directory Created") + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) + logg.info("Reports Directory may not have been Created") exit(1) __ap_set = None @@ -2476,7 +2477,7 @@ def main(): for controller_client_density in controller_client_densities: radios = "" ######################################################## - # Validate radio configuration + # Validate radio configuration # If controller_client_density is NOT supported continue ######################################################## @@ -2503,7 +2504,8 @@ def main(): radios = radio_AX200_abgn_ax_dict[controller_client_density] logg.info("controller_client_density:{} radios: {}".format( controller_client_density, radios)) - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) logg.info( "CONTROLLER DENSITY INVALID FOR RADIO DICTIONARY: controller_client_density: {} not supported for configuration".format( controller_client_density)) @@ -2519,7 +2521,8 @@ def main(): radios = radio_ath10K_9984_an_AC_dict[ controller_client_density] logg.info("radios: {}".format(radios)) - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) logg.info( "CONTROLLER DENSITY INVALID FOR RADIO DICTIONARY: controller_client_density: {} not supported for configuration".format( controller_client_density)) @@ -2536,12 +2539,13 @@ def main(): logg.info("##################################") exit(1) else: # controller_band == "b" - if controller_wifimode == "an" or controller_wifimode == "anAX" or controller_wifimode == "abgn" or controller_wifimode == "bg" or controller_wifimode == "auto": + if controller_wifimode == "an" or controller_wifimode == "anAX" or controller_wifimode == "abgn" or controller_wifimode == "bg" or controller_wifimode == "auto": # noqa: E501 # AX200 dual band try: radios = radio_AX200_abgn_ax_dict[controller_client_density] logg.info("radios: {}".format(radios)) - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) logg.info( "CONTROLLER DENSITY INVALID FOR RADIO DICTIONARY: controller_client_density: {} not supported for configuration".format( controller_client_density)) @@ -2574,7 +2578,7 @@ def main(): side_b_tx_min_bps_dl)) logg.info( "####################################################################") - test_config = "AP=={} Band=={} chan_5ghz=={} chan_24ghz=={} wifi_mode=={} BW=={} encryption=={} ap_mode=={} clients=={} packet_type=={} direction=={} pdu=={}".format( + test_config = "AP=={} Band=={} chan_5ghz=={} chan_24ghz=={} wifi_mode=={} BW=={} encryption=={} ap_mode=={} clients=={} packet_type=={} direction=={} pdu=={}".format( # noqa: E501 controller_ap, controller_band, controller_chan_5ghz, controller_chan_24ghz, controller_wifimode, controller_chan_width, @@ -2705,7 +2709,7 @@ def main(): logg.info( "###############################################") logg.info( - "controller_ap: {} controller_band: {} controller_chan_width: {} controller_ap_mode: {} controller_tx_power: {} controller_chan_5ghz: {} controller_chan_24ghz: {}".format( + "controller_ap: {} controller_band: {} controller_chan_width: {} controller_ap_mode: {} controller_tx_power: {} controller_chan_5ghz: {} controller_chan_24ghz: {}".format( # noqa: E501 controller_ap, controller_band, controller_chan_width, controller_ap_mode, @@ -2713,7 +2717,7 @@ def main(): controller_chan_5ghz, controller_chan_24ghz)) logg.info( - "__ap_set: {} __band_set: {} __chan_width_set: {} __ap_mode_set: {} __tx_power_set: {} __chan_5ghz_set: {} __chan_24ghz_set: {}".format( + "__ap_set: {} __band_set: {} __chan_width_set: {} __ap_mode_set: {} __tx_power_set: {} __chan_5ghz_set: {} __chan_24ghz_set: {}".format( # noqa: E501 __ap_set, __band_set, __chan_width_set, __ap_mode_set, __tx_power_set, __chan_5ghz_set, @@ -2773,7 +2777,7 @@ def main(): reset_port_enable_list.append(False) reset_port_time_min_list.append('0s') reset_port_time_max_list.append('0s') - # no stations for testing reconfiguration of the controller - + # no stations for testing reconfiguration of the controller - if args.no_stations: logg.info( "#################################################") @@ -2881,7 +2885,7 @@ def main(): if not ip_var_test.passes(): logg.info("stop test failed") logg.info(ip_var_test.get_fail_message()) - # clean up + # clean up radio_name_list = [] number_of_stations_per_radio_list = [] ssid_list = [] @@ -2895,11 +2899,11 @@ def main(): ip_var_test.passes() logg.info( "Full test passed, all connections increased rx rate") - ########################################## + # ######################################### # # Build Results # - ########################################## + # ######################################### if args.csv_outfile: logg.info("Report CSV Details: {}".format(csv_outfile)) logg.info("Report CSV Results: {}".format(csv_results)) @@ -2914,8 +2918,8 @@ def main(): if args.log: logg.info("output_log: {}".format(outfile_log)) - # TODO: Check pass/fail and do exit code accordingly. + if __name__ == "__main__": main() diff --git a/py-scripts/lf_test_generic.py b/py-scripts/lf_test_generic.py index 4ee0d81e1..825c6638f 100755 --- a/py-scripts/lf_test_generic.py +++ b/py-scripts/lf_test_generic.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_test_generic.py @@ -11,10 +10,10 @@ depending on what test is being run. Ping will test for successful pings, speedtest will test for download speed, upload speed, and ping time, generic will test for successful generic commands. -This script also *does not* use any other file except lanforge_api.py. +This script also *does not* use any other file except lanforge_api.py. SETUP: -Make sure the generic tab is enabled in the GUI by going to the Port Manager, clicking the '+' tab, checking the 'generic' tab. +Make sure the generic tab is enabled in the GUI by going to the Port Manager, clicking the '+' tab, checking the 'generic' tab. EXAMPLES: LFPING : @@ -29,10 +28,10 @@ ./lf_test_generic.py --mgr 192.168.102.211 --test_type speedtest --lf_user lanforge --lf_passwd lanforge --num_stations 3 --log_level debug --ssid mesh-lanforge --passwd lanforge --security wpa2 --radio wiphy1 --test_duration 2m --create_report --no_upload --single_connection --report_file_path "/home/lanforge/test_generic_1" - + IPERF3 : iperf: create 1 client and 1 server. client is already existing & server is on lanforge. - + ./lf_test_generic.py --mgr 192.168.102.211 --port 8080 --use_existing_eid "1.1.sta00015,1.1.eth3" --test_type iperf3 --server_port 5201 --client_port 5201 --target "1.1.eth3" --create_report --port_mgr_cols "alias,rx bytes,tx bytes" @@ -58,7 +57,6 @@ import sys import os import importlib -import pprint import argparse import time import datetime @@ -66,28 +64,27 @@ import re import csv import pandas as pd -import numpy as np -from pandas import json_normalize -from lf_json_util import standardize_json_results +# from pandas import json_normalize +# from lf_json_util import standardize_json_results sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lanforge_api = importlib.import_module("lanforge_client.lanforge_api") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand -from lanforge_client.lanforge_api import LFJsonQuery -from lanforge_client.logg import Logg +from lanforge_client.lanforge_api import LFSession # noqa: E402 +from lanforge_client.lanforge_api import LFJsonCommand # noqa: E402 +from lanforge_client.lanforge_api import LFJsonQuery # noqa: E402 +from lanforge_client.logg import Logg # noqa: E402 -#stand-alone (not dependent on realm) +# stand-alone (not dependent on realm) lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") lf_report = importlib.import_module("py-scripts.lf_report") lf_graph = importlib.import_module("py-scripts.lf_graph") lf_kpi_csv = importlib.import_module("py-scripts.lf_kpi_csv") -from lf_graph import lf_bar_graph_horizontal -from lf_graph import lf_bar_graph -from lf_report import lf_report +# from lf_graph import lf_bar_graph_horizontal +# from lf_graph import lf_bar_graph # noqa: E402 +from lf_report import lf_report # noqa: E402 lf_bar_graph = lf_graph.lf_bar_graph lf_scatter_graph = lf_graph.lf_scatter_graph @@ -101,18 +98,19 @@ logger.critical("This script requires Python 3") exit(1) + class GenTest(): def __init__(self, lf_user, lf_passwd, ssid, security, passwd, - name_prefix, num_stations, port_mgr_cols, gen_tab_cols, report_file_path, output_format = "csv", client_port = None,server_port=None, - host="localhost", port=8080, create_report = False, use_existing_eid=None, monitor_interval = "2s", - test_duration="20s",test_type="ping", target=None, cmd=None, spdtest_no_download = False, spdtest_no_upload = False, spdtest_single_connection = False, - spdtest_enable_debug = False, spdtest_enable_report= False, spdtest_ookla = False, interval=0.1, destination_url_lfcurl = None, - radio=None, file_output_lfcurl=None, lf_logger_json = None, log_level = "debug", loop_count=None, - _debug_on=False, _exit_on_error=False, die_on_error = False,_exit_on_fail=False): - self.host=host - self.port=port - self.lf_user=lf_user - self.lf_passwd=lf_passwd + name_prefix, num_stations, port_mgr_cols, gen_tab_cols, report_file_path, output_format="csv", client_port=None, server_port=None, + host="localhost", port=8080, create_report=False, use_existing_eid=None, monitor_interval="2s", + test_duration="20s", test_type="ping", target=None, cmd=None, spdtest_no_download=False, spdtest_no_upload=False, spdtest_single_connection=False, + spdtest_enable_debug=False, spdtest_enable_report=False, spdtest_ookla=False, interval=0.1, destination_url_lfcurl=None, + radio=None, file_output_lfcurl=None, lf_logger_json=None, log_level="debug", loop_count=None, + _debug_on=False, _exit_on_error=False, die_on_error=False, _exit_on_fail=False): + self.host = host + self.port = port + self.lf_user = lf_user + self.lf_passwd = lf_passwd self.ssid = ssid self.radio = radio self.num_stations = num_stations @@ -120,13 +118,13 @@ def __init__(self, lf_user, lf_passwd, ssid, security, passwd, self.passwd = passwd self.name_prefix = name_prefix - #Generic test args + # Generic test args self.cmd = cmd self.test_type = test_type self.file_output_lfcurl = file_output_lfcurl self.destination_url_lfcurl = destination_url_lfcurl - #speedtest specific + # speedtest specific self.spdtest_no_download = spdtest_no_download self.spdtest_no_upload = spdtest_no_upload self.spdtest_single_connection = spdtest_single_connection @@ -140,7 +138,7 @@ def __init__(self, lf_user, lf_passwd, ssid, security, passwd, self.client_port = client_port self.server_port = server_port - #Test duration, sleep interval for monitoring/data collection, logging/debugging + # Test duration, sleep interval for monitoring/data collection, logging/debugging self.monitor_interval = monitor_interval self.lfclient_url = "http://%s:%s" % (self.host, self.port) self.test_duration = test_duration @@ -149,12 +147,12 @@ def __init__(self, lf_user, lf_passwd, ssid, security, passwd, self.log_level = log_level self.lf_logger_json = lf_logger_json - #TODO currently un-used args. Add to test below. + # TODO currently un-used args. Add to test below. self.exit_on_error = _exit_on_error self.exit_on_fail = _exit_on_fail self.die_on_error = die_on_error - #reporting + # reporting self.output_format = output_format self.report_file_path = report_file_path self.create_report = create_report @@ -181,7 +179,7 @@ def __init__(self, lf_user, lf_passwd, ssid, security, passwd, self.created_endp = [] self.created_cx = [] - #CSV data collection, add files and writers + # CSV data collection, add files and writers self.port_csv_files = {} self.port_csv_writers = {} @@ -189,10 +187,10 @@ def __init__(self, lf_user, lf_passwd, ssid, security, passwd, self.gen_csv_writers = {} if self.create_report: - #TODO add to results.csv as a 'combined' results. - #split self.port_mgr_cols into list + # TODO add to results.csv as a 'combined' results. + # split self.port_mgr_cols into list self.port_mgr_cols = str.split(port_mgr_cols, ",") - #split self.gen_tab_cols into list + # split self.gen_tab_cols into list self.gen_tab_cols = str.split(gen_tab_cols, ",") # create csv results writer and open results file to be written to results = self.report_file_path + "/results." + self.output_format @@ -203,91 +201,91 @@ def __init__(self, lf_user, lf_passwd, ssid, security, passwd, if (int(self.num_stations) > 0): self.sta_list = self.port_name_series(prefix="sta", start_id=int(number_template), - end_id= int(self.num_stations) + int(number_template) - 1, + end_id=int(self.num_stations) + int(number_template) - 1, padding_number=10000, radio=self.radio) if (use_existing_eid): - #split list from user to create functional list used in script. + # split list from user to create functional list used in script. self.use_existing_eid = use_existing_eid.split(",") else: self.use_existing_eid = use_existing_eid # evaluate if iperf3-server on lanforge if (self.target): - if re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', self.target) == None: - #not an ip address + if re.match('\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}', self.target) is None: + # not an ip address self.iperf3_target_lanforge = True else: - #TODO add check to self.target. ip address of lanforge port may be given by user, - # which specifies if lanforge server is wanted. + # TODO add check to self.target. ip address of lanforge port may be given by user, + # which specifies if lanforge server is wanted. self.iperf3_target_lanforge = False def check_tab_exists(self): - json_response = self.command.json_get(self.lfclient_url+"/generic/") + json_response = self.command.json_get(self.lfclient_url + "/generic/") if json_response is None: return False return True # Write initial headers to port csv file (all ports used, created & existing ports) def csv_add_port_column_headers(self, port_eid): - #create file name + # create file name file_name = self.report_file_path + "/port-" + port_eid + "." + self.output_format - #open file in write mode, returns TextIOWrapper + # open file in write mode, returns TextIOWrapper txt_strm = open(file_name, "w") - #create writer + # create writer port_csv_writer = csv.writer(txt_strm, delimiter=",") - #save writer and TextIOWrapper + # save writer and TextIOWrapper self.port_csv_files[port_eid] = txt_strm self.port_csv_writers[port_eid] = port_csv_writer - #write headers + # write headers port_csv_writer.writerow(self.port_mgr_cols) - #flush stream + # flush stream txt_strm.flush() # write initial headers to gen cx files def csv_add_gen_column_headers(self, gen_endp): - #create file name + # create file name file_name = self.report_file_path + "/gen-endp-" + gen_endp + "." + self.output_format - #open file in write mode, returns TextIOWrapper + # open file in write mode, returns TextIOWrapper txt_strm = open(file_name, "w") - #create writer + # create writer gen_csv_writer = csv.writer(txt_strm, delimiter=",") - #save writer and TextIOWrapper + # save writer and TextIOWrapper self.gen_csv_files[gen_endp] = txt_strm self.gen_csv_writers[gen_endp] = gen_csv_writer - #write headers + # write headers gen_csv_writer.writerow(self.gen_tab_cols) - #flush stream + # flush stream txt_strm.flush() - + def write_port_csv(self, eid): port_shelf, port_resource, port_name, *nil = self.name_to_eid(eid) # get writer port_csv_writer = self.port_csv_writers[eid] port_csv_file = self.port_csv_files[eid] - #write fields to string, to add to json_get command + # write fields to string, to add to json_get command fields_str = "fields=" for cols in self.port_mgr_cols[:-1]: - fields_str = fields_str + "" + cols +"," - fields_str = fields_str + self.port_mgr_cols[-1] #add last field + fields_str = fields_str + "" + cols + "," + fields_str = fields_str + self.port_mgr_cols[-1] # add last field # fetch data w/json json_url = "%s/ports/%s/%s/%s?%s" % (self.lfclient_url, port_shelf, port_resource, port_name, fields_str) json_response = self.query.json_get(url=json_url, debug=self.debug) - - #append fetched data to row, to add to csv file + + # append fetched data to row, to add to csv file row = [] if (json_response is not None): json_re_intf = json_response['interface'] @@ -303,17 +301,17 @@ def write_gen_csv(self, endp): gen_csv_writer = self.gen_csv_writers[endp] gen_csv_file = self.gen_csv_files[endp] - #write fields to string, to add to json_get command + # write fields to string, to add to json_get command fields_str = "fields=" for cols in self.gen_tab_cols[:-1]: - fields_str = fields_str + "" + cols +"," - fields_str = fields_str + self.gen_tab_cols[-1] #add last field + fields_str = fields_str + "" + cols + "," + fields_str = fields_str + self.gen_tab_cols[-1] # add last field # fetch data w/json json_url = "%s/generic/%s?%s" % (self.lfclient_url, endp, fields_str) json_response = self.query.json_get(url=json_url, debug=self.debug) - - #append fetched data to row, to add to csv file + + # append fetched data to row, to add to csv file row = [] if (json_response is not None): json_re_intf = json_response['endpoint'] @@ -324,7 +322,7 @@ def write_gen_csv(self, endp): gen_csv_writer.writerow(row) gen_csv_file.flush() - #TODO: This is an example and is only configured for ping currently. + # TODO: This is an example and is only configured for ping currently. # This can be edited and added to if the user wants reporting and the test they are running is not ping. def generate_report(self, result_dir='Generic_Test_Report', report_path=''): print('Generating Report for lf_test_generic...') @@ -366,47 +364,47 @@ def generate_report(self, result_dir='Generic_Test_Report', report_path=''): effectively over the network and pinpoint potential issues affecting connectivity. ''') report.build_objective() - - #TODO make graph creation customizable via command line - #get data from saved csv. + + # TODO make graph creation customizable via command line + # get data from saved csv. gen_endp_names = [] dataset = [] for endp_name in self.created_endp: gen_endp_names.append(endp_name) io_file = self.gen_csv_files[endp_name] - #get csv and convert to pandas, take last row of pandas. - #csv_df = pd.read_csv("/home/diptidhond/test_generic_1/gen-endp-ping-3.csv") + # get csv and convert to pandas, take last row of pandas. + # csv_df = pd.read_csv("/home/diptidhond/test_generic_1/gen-endp-ping-3.csv") csv_df = pd.read_csv(io_file.name) - #edit df with columns & rows we want - #take last row + # edit df with columns & rows we want + # take last row last_row_df = csv_df.tail(1) - #take out all other un-necessary columns if needed - #last_row = last_row_df[["tx pkts", "rx pkts", "dropped"]] + # take out all other un-necessary columns if needed + # last_row = last_row_df[["tx pkts", "rx pkts", "dropped"]] - #convert dataframe to 1 dimensional array, to reg list, take idx 0, append to dataset array + # convert dataframe to 1 dimensional array, to reg list, take idx 0, append to dataset array array = last_row_df.to_numpy().tolist()[0] array_but_first = array[1:] dataset.append(array_but_first) graph = lf_bar_graph(_data_set=dataset, - _xaxis_name="Generic Cross-Connects", - _yaxis_name="Pkt Count", - _xaxis_categories=gen_endp_names, - _graph_image_name="Rx vs Tx Vs Dropped", - _label=["rx pkts", "tx pkts", "dropped pkts"], - _color=['darkorange', 'forestgreen', 'blueviolet'], - _color_edge='red', - _grp_title="Rx Pkts vs Tx Pkts vs Dropped Pkts", - _xaxis_step=1, - _show_bar_value=True, - _text_font=7, - _text_rotation=45, - _xticks_font=7, - _legend_loc="best", - _legend_box=(1, 1), - _legend_ncol=1, - _legend_fontsize=None, - _enable_csv=True) + _xaxis_name="Generic Cross-Connects", + _yaxis_name="Pkt Count", + _xaxis_categories=gen_endp_names, + _graph_image_name="Rx vs Tx Vs Dropped", + _label=["rx pkts", "tx pkts", "dropped pkts"], + _color=['darkorange', 'forestgreen', 'blueviolet'], + _color_edge='red', + _grp_title="Rx Pkts vs Tx Pkts vs Dropped Pkts", + _xaxis_step=1, + _show_bar_value=True, + _text_font=7, + _text_rotation=45, + _xticks_font=7, + _legend_loc="best", + _legend_box=(1, 1), + _legend_ncol=1, + _legend_fontsize=None, + _enable_csv=True) graph_png = graph.build_bar_graph() @@ -424,14 +422,14 @@ def generate_report(self, result_dir='Generic_Test_Report', report_path=''): def monitor_test(self): print("Starting monitoring") - #TODO: add checking if stations have disconnected, try to reconnect - #TODO: add checking if cross-connects have stopped. figure out why (if due to test being done, or if just randomly stopped.) - #TODO: add reporting-- save data at same intervals as sleeping? + # TODO: add checking if stations have disconnected, try to reconnect + # TODO: add checking if cross-connects have stopped. figure out why (if due to test being done, or if just randomly stopped.) + # TODO: add reporting-- save data at same intervals as sleeping? monitor_interval = self.duration_time_to_seconds(self.monitor_interval) end_time = datetime.datetime.now().timestamp() + self.duration_time_to_seconds(self.test_duration) while (datetime.datetime.now().timestamp() < end_time): - #write to all csv files + # write to all csv files if (self.create_report): if (self.sta_list and self.port_mgr_cols): for sta_alias in self.sta_list: @@ -445,38 +443,38 @@ def monitor_test(self): time.sleep(monitor_interval) def start(self): - #admin up all created stations & existing stations + # admin up all created stations & existing stations interest_flags_list = ['ifdown'] - set_port_interest_rslt=self.command.set_flags(LFJsonCommand.SetPortInterest, starting_value=0, flag_names= interest_flags_list) + set_port_interest_rslt = self.command.set_flags(LFJsonCommand.SetPortInterest, starting_value=0, flag_names=interest_flags_list) if self.sta_list: for sta_alias in self.sta_list: port_shelf, port_resource, port_name, *nil = self.name_to_eid(sta_alias) - #write headers to csv + # write headers to csv if (self.create_report): self.csv_add_port_column_headers(sta_alias) - self.command.post_set_port(shelf = port_shelf, - resource = port_resource, - port = port_name, - netmask= "255.255.255.0", #sometimes the cli complains about the netmask being NA, so set it to a random netmask (netmask is overriden anyways with dhcp) - current_flags= 0, + self.command.post_set_port(shelf=port_shelf, + resource=port_resource, + port=port_name, + netmask="255.255.255.0", # sometimes the cli complains about the netmask being NA, so set it to a random netmask (netmask is overriden anyways with dhcp) + current_flags=0, interest=set_port_interest_rslt, - report_timer= self.report_timer) - + report_timer=self.report_timer) + if self.use_existing_eid: for eid in self.use_existing_eid: port_shelf, port_resource, port_name, *nil = self.name_to_eid(eid) - #write headers to csv + # write headers to csv if (self.create_report): self.csv_add_port_column_headers(eid) - self.command.post_set_port(shelf = port_shelf , - resource = port_resource, - port = port_name, - netmask= "255.255.255.0", #sometimes the cli complains about the netmask being NA, so set it to a random netmask(netmask is overriden anyways with dhcp) - current_flags= 0, - interest=set_port_interest_rslt, - report_timer= self.report_timer) - - #Check if created stations admin-up and have ips + self.command.post_set_port(shelf=port_shelf, + resource=port_resource, + port=port_name, + netmask="255.255.255.0", # sometimes the cli complains about the netmask being NA, so set it to a random netmask(netmask is overriden anyways with dhcp) + current_flags=0, + interest=set_port_interest_rslt, + report_timer=self.report_timer) + + # Check if created stations admin-up and have ips if (self.sta_list): if self.wait_for_action("port", self.sta_list, "up", 3000): print("All created stations went admin up.") @@ -488,7 +486,7 @@ def start(self): else: self.print("Stations failed to get IPs") - #Check if existing ports admin-up and got ips + # Check if existing ports admin-up and got ips if (self.use_existing_eid): if self.wait_for_action("port", self.use_existing_eid, "up", 3000): print("All exiting ports went admin up.") @@ -500,10 +498,10 @@ def start(self): else: self.print("All existing ports failed to get IPs") - #at this point, all endpoints have been created, start all endpoints + # at this point, all endpoints have been created, start all endpoints if self.created_cx: for cx in self.created_cx: - self.command.post_set_cx_state(cx_name= cx, + self.command.post_set_cx_state(cx_name=cx, cx_state="RUNNING", test_mgr="default_tm", debug=self.debug) @@ -513,82 +511,82 @@ def stop(self): # set_cx_state default_tm CX_ping-hi STOPPED if self.created_cx: for cx in self.created_cx: - self.command.post_set_cx_state(cx_name= cx, + self.command.post_set_cx_state(cx_name=cx, cx_state="STOPPED", test_mgr="default_tm", debug=self.debug) - #admin stations down + # admin stations down if self.sta_list: for sta_alias in self.sta_list: port_shelf, port_resource, port_name, *nil = self.name_to_eid(sta_alias) - self.command.post_set_port(shelf = port_shelf, - resource = port_resource, - port = port_name, - current_flags= 1, # vs 0x0 = interface up - interest=8388610, # = current_flags + ifdown - report_timer= self.report_timer) - #admin stations down + self.command.post_set_port(shelf=port_shelf, + resource=port_resource, + port=port_name, + current_flags=1, # vs 0x0 = interface up + interest=8388610, # = current_flags + ifdown + report_timer=self.report_timer) + # admin stations down if self.use_existing_eid: for eid in self.use_existing_eid: port_shelf, port_resource, port_name, *nil = self.name_to_eid(eid) - self.command.post_set_port(shelf = port_shelf, - resource = port_resource, - port = port_name, - current_flags= 1, # vs 0x0 = interface up - interest=8388610, # = current_flags + ifdown - report_timer= self.report_timer) + self.command.post_set_port(shelf=port_shelf, + resource=port_resource, + port=port_name, + current_flags=1, # vs 0x0 = interface up + interest=8388610, # = current_flags + ifdown + report_timer=self.report_timer) def build(self): - #create stations + # create stations if self.sta_list: logger.info("Creating stations") types = {"wep": "wep_enable", "wpa": "wpa_enable", "wpa2": "wpa2_enable", "wpa3": "use-wpa3", "open": "[BLANK]"} if self.security in types.keys(): add_sta_flags = [] - set_port_interest = ['rpt_timer','current_flags', 'dhcp'] - set_port_current=['use_dhcp'] - #add appropriate flags for security + set_port_interest = ['rpt_timer', ' current_flags', 'dhcp'] + set_port_current = ['use_dhcp'] + # add appropriate flags for security if self.security != "open": add_sta_flags.extend([types[self.security], "create_admin_down"]) - #go through each test-created station and create station in lanforge + # go through each test-created station and create station in lanforge for sta_alias in self.sta_list: port_shelf, port_resource, port_name, *nil = self.name_to_eid(sta_alias) - sta_flags_rslt = self.command.set_flags(LFJsonCommand.AddStaFlags, starting_value=0, flag_names= add_sta_flags) - set_port_interest_rslt=self.command.set_flags(LFJsonCommand.SetPortInterest, starting_value=0, flag_names= set_port_interest) - set_port_current_rslt=self.command.set_flags(LFJsonCommand.SetPortCurrentFlags, starting_value=0, flag_names= set_port_current) + sta_flags_rslt = self.command.set_flags(LFJsonCommand.AddStaFlags, starting_value=0, flag_names=add_sta_flags) + set_port_interest_rslt = self.command.set_flags(LFJsonCommand.SetPortInterest, starting_value=0, flag_names=set_port_interest) + set_port_current_rslt = self.command.set_flags(LFJsonCommand.SetPortCurrentFlags, starting_value=0, flag_names=set_port_current) if self.security == "wpa3": self.command.post_add_sta(flags=sta_flags_rslt, - flags_mask=sta_flags_rslt, - radio=self.radio, - resource=port_resource, - shelf=port_shelf, - sta_name=port_name, - ieee80211w=2, - mode=0, - mac="xx:xx:xx:*:*:xx", - ssid=self.ssid, - key=self.passwd, - debug=self.debug) + flags_mask=sta_flags_rslt, + radio=self.radio, + resource=port_resource, + shelf=port_shelf, + sta_name=port_name, + ieee80211w=2, + mode=0, + mac="xx:xx:xx:*:*:xx", + ssid=self.ssid, + key=self.passwd, + debug=self.debug) else: self.command.post_add_sta(flags=sta_flags_rslt, - flags_mask=sta_flags_rslt, - radio=self.radio, - resource=port_resource, - shelf=port_shelf, - mac="xx:xx:xx:*:*:xx", - key=self.passwd, - mode=0, - ssid=self.ssid, - sta_name=port_name, - debug=self.debug) - #tell lanforge to show ports + flags_mask=sta_flags_rslt, + radio=self.radio, + resource=port_resource, + shelf=port_shelf, + mac="xx:xx:xx:*:*:xx", + key=self.passwd, + mode=0, + ssid=self.ssid, + sta_name=port_name, + debug=self.debug) + # tell lanforge to show ports self.command.post_nc_show_ports(port=port_name, resource=port_resource, shelf=port_shelf) - #wait until port appears + # wait until port appears wfa_list = [sta_alias] self.wait_for_action("port", wfa_list, "appear", 3000) @@ -601,70 +599,69 @@ def build(self): report_timer=self.report_timer, debug=self.debug, resource=port_resource) - + else: raise ValueError("security type given: %s : is invalid. Please set security type as wep, wpa, wpa2, wpa3, or open." % self.security) if (self.test_type == 'iperf3'): - #admin up server port, we need IP for client generic endp creation. + # admin up server port, we need IP for client generic endp creation. # This code is only executed if we are NOT given a target ip address. (e.g. given 1.1.eth2 instead of 192.168.101.3) if (self.iperf3_target_lanforge): server_shelf, server_resource, server_port_name, *nil = self.name_to_eid(self.target) - set_port_interest_rslt=self.command.set_flags(LFJsonCommand.SetPortInterest, starting_value=0, flag_names= ['ifdown']) - self.command.post_set_port(shelf = server_shelf, - resource = server_resource, - port = server_port_name, - netmask= "255.255.255.0", #sometimes the cli complains about the netmask being NA, so set it to a random netmask(netmask is overriden anyways with dhcp) - current_flags= 0, - interest=set_port_interest_rslt, - report_timer= self.report_timer) + set_port_interest_rslt = self.command.set_flags(LFJsonCommand.SetPortInterest, starting_value=0, flag_names=['ifdown']) + self.command.post_set_port(shelf=server_shelf, + resource=server_resource, + port=server_port_name, + netmask="255.255.255.0", # sometimes the cli complains about the netmask being NA, so set it to a random netmask(netmask is overriden anyways with dhcp) + current_flags=0, + interest=set_port_interest_rslt, + report_timer=self.report_timer) self.wait_for_action("port", [self.target], "up", 3000) self.wait_for_action("port", [self.target], "ip", 3000) - - #create endpoints - #create 1 endp for each eid. + # create endpoints + # create 1 endp for each eid. unique_alias = 0 if self.sta_list: unique_alias += len(self.sta_list) if self.use_existing_eid: unique_alias += len(self.use_existing_eid) - #these cannot be interop clients + # these cannot be interop clients if self.sta_list: for sta_alias in self.sta_list: sta_eid = self.name_to_eid(sta_alias) self.create_generic_endp(sta_eid, self.test_type, unique_alias, interop_device=False) - unique_alias-=1 + unique_alias -= 1 - #check if these are interop devices.. - if self.use_existing_eid: #use existing eid will have iperf3-server eid, if we are using lanforge iperf3-server. + # check if these are interop devices.. + if self.use_existing_eid: # use existing eid will have iperf3-server eid, if we are using lanforge iperf3-server. for eid_alias in self.use_existing_eid: eid_list = self.name_to_eid(eid_alias) is_interop = self.is_device_interop(eid_list) - self.create_generic_endp(eid_list, self.test_type, unique_alias, interop_device = is_interop) - unique_alias-=1 + self.create_generic_endp(eid_list, self.test_type, unique_alias, interop_device=is_interop) + unique_alias -= 1 - #show all endps - self.command.post_nc_show_endpoints(endpoint= 'all', extra ='history') + # show all endps + self.command.post_nc_show_endpoints(endpoint='all', extra='history') - #create cross-connects + # create cross-connects if self.created_endp is not None: for endp in self.created_endp: endp_cx_name = "CX_" + endp - self.command.post_add_cx(alias= endp_cx_name, + self.command.post_add_cx(alias=endp_cx_name, test_mgr="default_tm", - rx_endp= "D_"+endp, - tx_endp= endp, + rx_endp="D_" + endp, + tx_endp=endp, debug=self.debug) self.created_cx.append(endp_cx_name) - #wait for cross-connects to appear + # wait for cross-connects to appear if self.wait_for_action("cx", self.created_endp, "appear", 3000): print("Generic cx creation completed.") else: print("Generic cx creation was not completed.") - - #This function takes an eid list and returns an ip address. + + # This function takes an eid list and returns an ip address. def eid_to_ip(self, eid_list): device_shelf, device_resource, device_port_name, *nil = eid_list json_url = "%s/ports/%s/%s/%s?fields=device,ip" % (self.lfclient_url, device_shelf, device_resource, device_port_name) @@ -675,18 +672,18 @@ def eid_to_ip(self, eid_list): else: return None - #This function takes eid_list and returns interop device type or False. + # This function takes eid_list and returns interop device type or False. def is_device_interop(self, eid_list): return False - #device_shelf, device_resource, device_port_name, *nil = eid_list - #json_url = "%s/ports/%s/%s/%s?fields=hw version" % (self.lfclient_url, device_shelf, device_resource, device_port_name) - #json_response = self.query.json_get(url=json_url, - # debug=self.debug) - #if json_response is not None: - #return json_response['hw version'] - #else: + # device_shelf, device_resource, device_port_name, *nil = eid_list + # json_url = "%s/ports/%s/%s/%s?fields=hw version" % (self.lfclient_url, device_shelf, device_resource, device_port_name) + # json_response = self.query.json_get(url=json_url, + # debug=self.debug) + # if json_response is not None: + # return json_response['hw version'] + # else: # return False - + def create_generic_endp(self, eid_list, type, unique_num, interop_device): """ :param eid: list format of eid. example: ['1', '1', 'sta0010'] @@ -696,14 +693,14 @@ def create_generic_endp(self, eid_list, type, unique_num, interop_device): :return: no return """ unique_alias = type + "-" + str(unique_num) - #construct generic endp command + # construct generic endp command cmd = "" eid_shelf = eid_list[0] eid_resource = eid_list[1] eid_name = eid_list[2] if (self.cmd): - cmd=self.cmd + cmd = self.cmd elif (type == 'iperf3'): if (self.iperf3_target_lanforge): if (eid_list == self.name_to_eid(self.target)): @@ -713,7 +710,7 @@ def create_generic_endp(self, eid_list, type, unique_num, interop_device): unique_alias = "client-" + unique_alias cmd = self.do_iperf('client', unique_alias, eid_list) else: - #the case that user chose to not to use and create lanforge iperf server + # the case that user chose to not to use and create lanforge iperf server unique_alias = "client-" + unique_alias cmd = self.do_iperf('client', unique_alias, eid_list) @@ -722,7 +719,7 @@ def create_generic_endp(self, eid_list, type, unique_num, interop_device): if (interop_device): standard_ping = False os_type = interop_device - #construct ping command based on interop device type + # construct ping command based on interop device type if 'Win/x86' in os_type: cmd = "py lfping.py -S %s -n -1 -dest_ip %s" % (self.eid_to_ip(eid_name), self.target) elif 'Apple/x86' in os_type: @@ -730,7 +727,7 @@ def create_generic_endp(self, eid_list, type, unique_num, interop_device): elif 'Linux/x86' in os_type: standard_ping = True else: - #Android + # Android cmd = "ping -i %s %s" % (self.interval, self.target) if (standard_ping): @@ -743,21 +740,21 @@ def create_generic_endp(self, eid_list, type, unique_num, interop_device): cmd = cmd + " -I %s " % eid_name if (self.target): cmd = cmd + str(self.target) - + elif (type == 'iperf3-client'): - # iperf3 --forceflush --format k --precision 4 -c 192.168.10.1 -t 60 --tos 0 -b 1K --bind_dev sta0000 + # iperf3 --forceflush --format k --precision 4 -c 192.168.10.1 -t 60 --tos 0 -b 1K --bind_dev sta0000 # -i 5 --pidfile /tmp/lf_helper_iperf3_testing.pid -p 101 cmd = self.do_iperf('client', unique_alias, eid_list) elif (self.test_type == 'iperf3-server'): - # iperf3 --forceflush --format k --precision 4 -s --bind_dev sta0000 + # iperf3 --forceflush --format k --precision 4 -s --bind_dev sta0000 # -i 5 --pidfile /tmp/lf_helper_iperf3_testing.pid -p 101 cmd = self.do_iperf('server', unique_alias, eid_list) elif (self.test_type == 'lfcurl'): # ./scripts/lf_curl.sh -p sta0000 -i 192.168.50.167 -o /dev/null -n 1 -d 8.8.8.8 cmd = cmd + str("./scripts/lf_curl.sh -p %s" % eid_name) - #TODO: get ip address of -i (sta0000) if i is a station, but not if eth port. + # TODO: get ip address of -i (sta0000) if i is a station, but not if eth port. if (self.file_output_lfcurl): cmd = cmd + " -o %s" % self.file_output_lfcurl if (self.loop_count): @@ -768,11 +765,11 @@ def create_generic_endp(self, eid_list, type, unique_num, interop_device): if (self.spdtest_ookla): cmd = "speedtest --interface=%s --format=csv" % eid_name else: - #do lanforge speedtest + # do lanforge speedtest # vrf_exec.bash eth3 speedtest-cli --csv --share --single --debug # vrf_exec.bash eth3 speedtest-cli --csv --no-upload # vrf_exec.bash eth3 speedtest-cli --csv - cmd = cmd + "vrf_exec.bash %s speedtest-cli --csv" % eid_name # bas command + cmd = cmd + "vrf_exec.bash %s speedtest-cli --csv" % eid_name # bas command if (self.spdtest_enable_report): cmd = cmd + " --share" if (self.spdtest_no_download): @@ -786,44 +783,43 @@ def create_generic_endp(self, eid_list, type, unique_num, interop_device): else: raise ValueError("Was not able to identify type given in arguments.") - #create initial generic endp + # create initial generic endp # add_gen_endp testing 1 1 sta0000 gen_generic - self.command.post_add_gen_endp(alias = unique_alias, + self.command.post_add_gen_endp(alias=unique_alias, shelf=eid_shelf, resource=eid_resource, port=eid_name, p_type="gen_generic") self.created_endp.append(unique_alias) - - #did generic endp appear in port manager? + + # did generic endp appear in port manager? if self.wait_for_action("endp", self.created_endp, "appear", 3000): print("Generic endp creation completed.") else: print("Generic endps were not created.") print("This is the generic cmd we are sending to server...: " + cmd) - self.command.post_set_gen_cmd(name = unique_alias, - command= cmd) + self.command.post_set_gen_cmd(name=unique_alias, + command=cmd) - #add headers to endp file if user asks to create report + # add headers to endp file if user asks to create report if (self.create_report): self.csv_add_gen_column_headers(unique_alias) - - def do_iperf (self, type, alias, eid_list): + def do_iperf(self, type, alias, eid_list): """ :param type: takes in options 'client' or 'server' :param alias: takes in alias. example: 'sta0000' :param eid: takes in eid list. ['1','1','sta0000'] :return: returns constructed iperf command """ - #TODO: allow for multiple ports to be passed in for multiple servers on 1 eth port or 1 virt sta (for example). - #TODO: allow for multiple targets to be passed in for multiple servers. + # TODO: allow for multiple ports to be passed in for multiple servers on 1 eth port or 1 virt sta (for example). + # TODO: allow for multiple targets to be passed in for multiple servers. cmd = "iperf3 --forceflush --format k --precision 4" - #TODO check if dest, client_port and server_port are not empty - eid_shelf = eid_list[0] - eid_resource = eid_list[1] + # TODO check if dest, client_port and server_port are not empty + # eid_shelf = eid_list[0] + # eid_resource = eid_list[1] eid_name = eid_list[2] if (type == 'client'): if (self.iperf3_target_lanforge): @@ -833,19 +829,19 @@ def do_iperf (self, type, alias, eid_list): cmd = cmd + str(" -c %s" % server_ip_addr) + " -t 60 --tos 0 -b 1K " + str("--bind_dev %s" % eid_name) cmd = cmd + " -i 3 --pidfile /tmp/lf_helper_iperf3_%s.pid" % alias if (self.client_port): - #add port that should match server_port + # add port that should match server_port cmd = cmd + " -p %s" % self.client_port - #server + # server else: - #iperf3 --forceflush --format k --precision 4 -s --bind_dev eth2 -i 5 --pidfile /tmp/lf_helper_iperf3_server_iperf_1.pid eth2 + # iperf3 --forceflush --format k --precision 4 -s --bind_dev eth2 -i 5 --pidfile /tmp/lf_helper_iperf3_server_iperf_1.pid eth2 cmd = cmd + " -s" + str(" --bind_dev %s" % eid_name) + " -i 3 --pidfile /tmp/lf_helper_iperf3_%s.pid" % alias if (self.server_port): - #add port that should match client port + # add port that should match client port cmd = cmd + " -p %s" % self.server_port return cmd def cleanup(self): - #delete all created endps, cross-connects and created stations + # delete all created endps, cross-connects and created stations logger.info("Cleaning up all cxs, endpoints, and created stations") if self.created_cx: for cx_name in self.created_cx: @@ -857,9 +853,9 @@ def cleanup(self): for sta_name in self.sta_list: if self.port_exists(sta_name, self.debug): port_shelf, port_resource, port_name, *nil = self.name_to_eid(sta_name) - self.command.post_rm_vlan(port= port_name, - resource= port_resource, - shelf= port_shelf, + self.command.post_rm_vlan(port=port_name, + resource=port_resource, + shelf=port_shelf, debug=self.debug) if self.wait_for_action("port", self.sta_list, "disappear", 3000): @@ -868,9 +864,9 @@ def cleanup(self): print("Ports were not successfully cleaned up.") def duration_time_to_seconds(self, time_string): - #this function is used to convert self.test_duration to seconds + # this function is used to convert self.test_duration to seconds if isinstance(time_string, str): - pattern = re.compile("^(\d+)([dhms]$)") + pattern = re.compile("^(\\d+)([dhms]$)") td = pattern.match(time_string) if td: dur_time = int(td.group(1)) @@ -888,7 +884,7 @@ def duration_time_to_seconds(self, time_string): else: raise ValueError("time_string must be of type str. Type %s provided" % type(time_string)) return duration_sec - + def port_name_series(self, prefix="sta", start_id=0, end_id=1, padding_number=10000, radio=None): """ This produces a named series similar to "sta000, sta001, sta002...sta0(end_id)" @@ -916,7 +912,7 @@ def port_exists(self, port_eid, debug=None): if current_stations: return True return False - + def wait_for_action(self, lf_type, type_list, action, secs_to_wait): """ :param lf_type: type of object given in object list. @@ -927,10 +923,10 @@ def wait_for_action(self, lf_type, type_list, action, secs_to_wait): :return: no returns """ - #TODO allow test config of secs_to_wait + # TODO allow test config of secs_to_wait if type(type_list) is not list: raise Exception("wait_for_action: type_list is not a list") - else: + else: compared_pass = len(type_list) for attempt in range(0, int(secs_to_wait / 2)): passed = set() @@ -938,40 +934,39 @@ def wait_for_action(self, lf_type, type_list, action, secs_to_wait): # Port Manager Actions if lf_type == "port": for sta_alias in type_list: - port_shelf, port_resource, port_name, *nil = self.name_to_eid(sta_alias) + port_shelf, port_resource, port_name, *nil = self.name_to_eid(sta_alias) if action == "appear": - #http://192.168.102.211:8080/ports/1/1/sta0000?fields=device,down + # http://192.168.102.211:8080/ports/1/1/sta0000?fields=device,down json_url = "%s/ports/%s/%s/%s?fields=device,down" % (self.lfclient_url, port_resource, port_shelf, port_name) json_response = self.query.json_get(url=json_url, debug=self.debug) - #if sta is found by json response & not phantom - if json_response is not None and (json_response['interface']['down'] == True): + # if sta is found by json response & not phantom + if json_response is not None and (json_response['interface']['down'] is True): passed.add("%s.%s.%s" % (port_shelf, port_resource, port_name)) elif action == "up": json_url = "%s/ports/%s/%s/%s?fields=device,down" % (self.lfclient_url, port_resource, port_shelf, port_name) json_response = self.query.json_get(url=json_url, debug=self.debug) - #if sta is up - if json_response is not None and (json_response['interface']['down'] == False): + # if sta is up + if json_response is not None and (json_response['interface']['down'] is False): passed.add("%s.%s.%s" % (port_shelf, port_resource, port_name)) elif action == "disappear": json_url = "%s/ports/%s/%s/%s?fields=device" % (self.lfclient_url, port_resource, port_shelf, port_name) json_response = self.query.json_get(url=json_url, debug=self.debug) - #if device is not found + # if device is not found if json_response is None: passed.add("%s.%s.%s" % (port_shelf, port_resource, port_name)) elif action == "ip": json_url = "%s/ports/%s/%s/%s?fields=device,ip" % (self.lfclient_url, port_resource, port_shelf, port_name) json_response = self.query.json_get(url=json_url, debug=self.debug) - #if device is not found + # if device is not found if json_response is not None and (json_response['interface']['ip'] != "0.0.0.0"): passed.add("%s.%s.%s" % (port_shelf, port_resource, port_name)) - # Generic Tab Actions else: compared_pass = len(self.created_endp) @@ -984,7 +979,7 @@ def wait_for_action(self, lf_type, type_list, action, secs_to_wait): if json_response is not None: passed.add(endp_name) - #check if cross-connect appears + # check if cross-connect appears else: if json_response is not None and (json_response['endpoint']['status'] != "NO-CX"): passed.add(endp_name) @@ -999,17 +994,17 @@ def wait_for_action(self, lf_type, type_list, action, secs_to_wait): def check_args(self): print("Checking args passed into test") - #TODO validate all args, depending on which test is used. - #TODO: in args, check if file_out_lfcurl and destination_url_lfcurl is None. then state that defaults are being used and apply defaults - #Station creation specific + # TODO validate all args, depending on which test is used. + # TODO: in args, check if file_out_lfcurl and destination_url_lfcurl is None. then state that defaults are being used and apply defaults + # Station creation specific if (self.sta_list) and self.security != "open": if (self.passwd is None) or (self.passwd == ""): raise ValueError("use_security: %s requires passphrase or [BLANK]" % self.security) - #Generic endp specific + # Generic endp specific if ((self.test_type == "iperf3" or self.test_type == "iperf3-client") and self.target is None): - raise ValueError ("To execute test type 'iperf3' or 'iperf3-client', a target must be specified as an IP address or port eid.") - - #This takes in a eid string (e.g. '1.1.sta000') and returns an eid list in list order of [shelf, resource, port name] + raise ValueError("To execute test type 'iperf3' or 'iperf3-client', a target must be specified as an IP address or port eid.") + + # This takes in a eid string (e.g. '1.1.sta000') and returns an eid list in list order of [shelf, resource, port name] def name_to_eid(self, eid_input, non_port=False): rv = [1, 1, "", ""] if (eid_input is None) or (eid_input == ""): @@ -1062,6 +1057,7 @@ def name_to_eid(self, eid_input, non_port=False): return rv + def main(): # definition of create_basic_argparse in lanforge-scripts/py-json/LANforge/lfcli_base.py around line 700 @@ -1086,10 +1082,10 @@ def main(): ./lf_test_generic.py --mgr 192.168.102.211 --test_type speedtest --lf_user lanforge --lf_passwd lanforge --num_stations 3 --log_level debug --ssid mesh-lanforge --passwd lanforge --security wpa2 --radio wiphy1 --test_duration 2m --create_report --no_upload --single_connection --report_file_path "/home/lanforge/test_generic_1" - + IPERF3 : iperf: create 1 client and 1 server. client is already existing & server is on lanforge. - + ./lf_test_generic.py --mgr 192.168.102.211 --port 8080 --use_existing_eid "1.1.sta00015,1.1.eth3" --test_type iperf3 --server_port 5201 --client_port 5201 --target "1.1.eth3" --create_report --port_mgr_cols "alias,rx bytes,tx bytes" @@ -1216,7 +1212,7 @@ def main(): optional.add_argument('--mgr_port', help='port which lanforge is running on, on lanforge machine script should be run on. example: 8080', default=8080) optional.add_argument('--cmd', help='specifies command to be run by generic type endp', default=None) - #generic endpoint configurations + # generic endpoint configurations optional.add_argument('--spdtest_enable_debug', action="store_true", help='check enable debug box for speedtest cross connect(s)') optional.add_argument('--spdtest_enable_report', action="store_true", help='check enable report box for speedtest cross connect(s)') optional.add_argument('--spdtest_no_download', action="store_true", help='do not run download for speedtest cross connect') @@ -1227,20 +1223,19 @@ def main(): optional.add_argument('--destination_url_lfcurl', help='destination url for lfcurl', default=None) optional.add_argument('--loop_count', help='determines the number of loops to use in lf_curl and lfping', default=None) optional.add_argument('--interval', help='ping interval configuration', default=0.2) - optional.add_argument('--target', - help='Target for lfping (ex: www.google.com). ALSO arg to specify IP address (if server is OFF lanforge, ex: 192.168.101.1) or LANforge eid (if server port is ON lanfoge, ex: 1.1.eth3) of iperf3 server used for iperf3-client target.', default=None) - optional.add_argument('--client_port', help="the port number of the iperf client endpoint. example: -p 5011",default=None) - optional.add_argument('--server_port', help="the port number of the iperf server endpoint. example: -p 5011",default=None) + optional.add_argument('--target', help='Target for lfping (ex: www.google.com). ALSO arg to specify IP address (if server is OFF lanforge, ex: 192.168.101.1) or LANforge eid (if server port is ON lanfoge, ex: 1.1.eth3) of iperf3 server used for iperf3-client target.', default=None) # noqa: E501 + optional.add_argument('--client_port', help="the port number of the iperf client endpoint. example: -p 5011", default=None) + optional.add_argument('--server_port', help="the port number of the iperf server endpoint. example: -p 5011", default=None) # args for creating stations or using existing eid - optional.add_argument('--use_existing_eid', help="EID of ports we want to use. Example: '1.1.sta000, 1.1.eth1, 1.1.eth2' ",default=None) - optional.add_argument('--radio', help="radio that stations should be created on",default=None) - optional.add_argument('--num_stations', help="number of stations that are to be made, defaults to 1",default=1) - optional.add_argument('--ssid', help="ssid for stations to connect to",default=None) - optional.add_argument('--passwd', '-p', help="password to ssid for stations to connect to",default=None) + optional.add_argument('--use_existing_eid', help="EID of ports we want to use. Example: '1.1.sta000, 1.1.eth1, 1.1.eth2' ", default=None) + optional.add_argument('--radio', help="radio that stations should be created on", default=None) + optional.add_argument('--num_stations', help="number of stations that are to be made, defaults to 1", default=1) + optional.add_argument('--ssid', help="ssid for stations to connect to", default=None) + optional.add_argument('--passwd', '-p', help="password to ssid for stations to connect to", default=None) optional.add_argument('--mode', help='Used to force mode of stations', default=None) optional.add_argument('--ap', help='Used to force a connection to a particular AP, bssid of specific AP', default=None) - optional.add_argument('--security', help='security for station ssids. options: {open | wep | wpa | wpa2 | wpa3}' ) + optional.add_argument('--security', help='security for station ssids. options: {open | wep | wpa | wpa2 | wpa3}') # dut info optional.add_argument("--dut_hw_version", help="dut hw version for kpi.csv, hardware version of the device under test", default="") @@ -1253,30 +1248,29 @@ def main(): optional.add_argument("--test_tag", help="test tag for kpi.csv, test specific information to differentiate the test", default="") # args for reporting - optional.add_argument('--output_format', help= 'choose either csv or xlsx. currently xlsx is under construction.',default='csv') + optional.add_argument('--output_format', help='choose either csv or xlsx. currently xlsx is under construction.', default='csv') optional.add_argument('--report_file_path', help='directory to store results in. example: /home/lanforge/report-data/directory-to-store-results', default=None) - optional.add_argument( '--gen_tab_cols', help='Columns wished to be monitored from generic endpoint tab. please use list format. examples example: "name,tx pkts,rx pkts".',default= "name,tx pkts,rx pkts,dropped") - optional.add_argument( '--port_mgr_cols', help='Columns wished to be monitored from port manager tab. example: "ap,ip,parent dev"',default= "ap,ip,parent dev") - optional.add_argument('--compared_report', help='report path and file which is wished to be compared with new report',default= None) - optional.add_argument('--create_report',action="store_true", help='specify this flag if test should create report. This means that html, pdf, and csv data is saved and created.') + optional.add_argument('--gen_tab_cols', help='Columns wished to be monitored from generic endpoint tab. please use list format. examples example: "name,tx pkts,rx pkts".', default="name,tx pkts,rx pkts,dropped") # noqa: E501 + optional.add_argument('--port_mgr_cols', help='Columns wished to be monitored from port manager tab. example: "ap,ip,parent dev"', default="ap,ip,parent dev") + optional.add_argument('--compared_report', help='report path and file which is wished to be compared with new report', default=None) + optional.add_argument('--create_report', action="store_true", help='specify this flag if test should create report. This means that html, pdf, and csv data is saved and created.') # args for test duration & monitor interval - optional.add_argument('--monitor_interval',help='frequency of monitors measurements;example: 250ms, 35s, 2h',default='2s') + optional.add_argument('--monitor_interval', help='frequency of monitors measurements;example: 250ms, 35s, 2h', default='2s') optional.add_argument('--test_duration', help='duration of the test eg: 30s, 2m, 4h', default="2m") - #debug and logger + # debug and logger optional.add_argument('--log_level', default=None, help='Set logging level: debug | info | warning | error | critical') optional.add_argument('--lf_logger_json', help="--lf_logger_config_json , json configuration of logger") optional.add_argument('--debug', '-d', default=False, action="store_true", help='Enable debugging') optional.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - - #check if the arguments are empty? + # check if the arguments are empty? if (len(sys.argv) <= 2 and not sys.argv[1]): print("This python file needs the minimum required args. See add the --help flag to check out all possible arguments.") sys.exit(1) - help_summary='''\ + help_summary = '''\ lf_test_generic.py will create stations and endpoints to generate traffic based on a command-line specified command type. This script will create a variable number of stations to test generic endpoints. Multiple command types can be tested @@ -1284,9 +1278,9 @@ def main(): depending on what test is being run. Ping will test for successful pings, speedtest will test for download speed, upload speed, and ping time, generic will test for successful generic commands. -This script also *does not* use any other file except lanforge_api.py. +This script also *does not* use any other file except lanforge_api.py. ''' - + args = parser.parse_args() if args.help_summary: print(help_summary) @@ -1303,7 +1297,7 @@ def main(): if args.create_report: if args.report_file_path is None: new_file_path = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-h-%M-m-%S-s")).replace(':', - '-') + '-lf_test_generic' # create path name + '-') + '-lf_test_generic' # create path name if os.path.exists('/home/lanforge/report-data/'): rpt_file_path = os.path.join('/home/lanforge/report-data/', new_file_path) os.mkdir(rpt_file_path) @@ -1311,7 +1305,7 @@ def main(): curr_dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) rpt_file_path = os.path.join(curr_dir_path, new_file_path) os.mkdir(rpt_file_path) - #create correct file path + # create correct file path else: if not os.path.exists(args.report_file_path): os.mkdir(args.report_file_path) @@ -1324,65 +1318,66 @@ def main(): output = 'csv' print("Report file path for csv files and report generated (if expecting report) :" + rpt_file_path) else: - #give blank values for parser + # give blank values for parser rpt_file_path = "" output = "csv" - #TODO edit name_prefix + # TODO edit name_prefix lf_generic_test = GenTest(host=args.mgr, port=args.mgr_port, - lf_user=args.lf_user, lf_passwd=args.lf_passwd, - radio=args.radio, - num_stations = args.num_stations, - use_existing_eid=args.use_existing_eid, - name_prefix="GT", - test_type=args.test_type, - target=args.target, - cmd=args.cmd, - interval=args.interval, - ssid=args.ssid, - passwd=args.passwd, - create_report=args.create_report, - port_mgr_cols=args.port_mgr_cols, - gen_tab_cols=args.gen_tab_cols, - security=args.security, - test_duration=args.test_duration, - monitor_interval=args.monitor_interval, - file_output_lfcurl=args.file_output_lfcurl, - destination_url_lfcurl = args.destination_url_lfcurl, - spdtest_enable_debug= args.spdtest_enable_debug, - spdtest_enable_report= args.spdtest_enable_report, - spdtest_no_download= args.spdtest_no_download, - spdtest_no_upload= args.spdtest_no_upload, - spdtest_single_connection= args.spdtest_single_connection, - spdtest_ookla= args.spdtest_ookla, - report_file_path = rpt_file_path, - output_format = output, - loop_count=args.loop_count, - client_port=args.client_port, - server_port=args.server_port, - _debug_on=args.debug, - log_level=args.log_level, - lf_logger_json = args.lf_logger_json) + lf_user=args.lf_user, lf_passwd=args.lf_passwd, + radio=args.radio, + num_stations=args.num_stations, + use_existing_eid=args.use_existing_eid, + name_prefix="GT", + test_type=args.test_type, + target=args.target, + cmd=args.cmd, + interval=args.interval, + ssid=args.ssid, + passwd=args.passwd, + create_report=args.create_report, + port_mgr_cols=args.port_mgr_cols, + gen_tab_cols=args.gen_tab_cols, + security=args.security, + test_duration=args.test_duration, + monitor_interval=args.monitor_interval, + file_output_lfcurl=args.file_output_lfcurl, + destination_url_lfcurl=args.destination_url_lfcurl, + spdtest_enable_debug=args.spdtest_enable_debug, + spdtest_enable_report=args.spdtest_enable_report, + spdtest_no_download=args.spdtest_no_download, + spdtest_no_upload=args.spdtest_no_upload, + spdtest_single_connection=args.spdtest_single_connection, + spdtest_ookla=args.spdtest_ookla, + report_file_path=rpt_file_path, + output_format=output, + loop_count=args.loop_count, + client_port=args.client_port, + server_port=args.server_port, + _debug_on=args.debug, + log_level=args.log_level, + lf_logger_json=args.lf_logger_json) if not lf_generic_test.check_tab_exists(): raise ValueError("Error received from GUI when trying to request generic tab information, please ensure generic tab is enabled") - + lf_generic_test.check_args() - + lf_generic_test.build() lf_generic_test.start() logger.info("Starting connections with 5 second settle time.") lf_generic_test.start() - time.sleep(5) # give traffic a chance to get started. + time.sleep(5) # give traffic a chance to get started. lf_generic_test.monitor_test() print("Done with connection monitoring") - + lf_generic_test.stop() - #lf_generic_test.generate_report() + # lf_generic_test.generate_report() lf_generic_test.cleanup() + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index 433c08b6b..c7bb6b2dd 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -90,7 +90,7 @@ import shutil import json from lf_graph import lf_bar_graph_horizontal - +import traceback import asyncio from typing import List, Optional import csv @@ -116,10 +116,10 @@ class HttpDownload(Realm): def __init__(self, lfclient_host, lfclient_port, upstream, num_sta, security, ssid, password, ap_name, target_per_ten, file_size, bands, start_id=0, twog_radio=None, fiveg_radio=None, sixg_radio=None, _debug_on=False, _exit_on_error=False, - test_name=None, _exit_on_fail=False, client_type="", port_list=[], devices_list=[], macid_list=[], lf_username="lanforge", lf_password="lanforge", result_dir="", dowebgui=False, - device_list=[], get_url_from_file=None, file_path=None, device_csv_name='', expected_passfail_value=None, file_name=None, group_name=None, profile_name=None, eap_method=None, + test_name=None, _exit_on_fail=False, client_type="", port_list=None, devices_list=None, macid_list=None, lf_username="lanforge", lf_password="lanforge", result_dir="", dowebgui=False, + device_list=None, get_url_from_file=None, file_path=None, device_csv_name='', expected_passfail_value=None, file_name=None, group_name=None, profile_name=None, eap_method=None, eap_identity=None, ieee80211=None, ieee80211u=None, ieee80211w=None, enable_pkc=None, bss_transition=None, power_save=None, disable_ofdma=None, roam_ft_ds=None, key_management=None, - pairwise=None, private_key=None, ca_cert=None, client_cert=None, pk_passwd=None, pac_file=None, config=False, wait_time=60): + pairwise=None, private_key=None, ca_cert=None, client_cert=None, pk_passwd=None, pac_file=None, config=False, wait_time=60, get_live_view=False, total_floors=0,): # super().__init__(lfclient_host=lfclient_host, # lfclient_port=lfclient_port) self.ssid_list = [] @@ -165,6 +165,8 @@ def __init__(self, lfclient_host, lfclient_port, upstream, num_sta, security, ss self.created_cx = {} self.station_list = [] self.radio = [] + self.failed_cx = [] + self.tracking_map = {} self.get_url_from_file = get_url_from_file self.file_path = file_path self.file_name = file_name @@ -195,6 +197,8 @@ def __init__(self, lfclient_host, lfclient_port, upstream, num_sta, security, ss self.api_url = 'http://{}:{}'.format(self.host, self.port) self.group_device_map = {} self.individual_device_csv_names = [] + self.get_live_view = get_live_view + self.total_floors = total_floors # The 'phantom_check' will be handled within the 'get_real_client_list' function def get_real_client_list(self): @@ -280,7 +284,7 @@ def get_real_client_list(self): for key, value in response.items(): if key == "resources": for element in value: - for a, b in element.items(): + for _, b in element.items(): if not b['phantom']: working_resources_list.append(b["hw version"]) if "Win" in b['hw version']: @@ -630,6 +634,59 @@ def stop(self): df1 = pd.DataFrame(self.data) df1.to_csv("http_datavalues.csv", index=False) + def get_layer4_data(self): + """ + Fetch Layer 4 stats (uc-avg, uc-min, uc-max, urls, rx rate, bytes read, errors) + for all connections in self.cx_list. + Returns: + dict: mapping of metric names to lists of values, one per CX. + """ + cx_list = list(self.http_profile.created_cx.keys()) + try: + url_str = 'layer4/{}/list?fields=uc-avg,uc-max,uc-min,total-urls,rx rate (1m),bytes-rd,total-err'.format(','.join(cx_list)) + l4_data = self.local_realm.json_get(url_str)['endpoint'] + except Exception: + logger.error("l4 DATA not found") + exit(1) + l4_dict = { + 'uc_avg_data': [], + 'uc_max_data': [], + 'uc_min_data': [], + 'url_times': [], + 'rx_rate': [], + 'bytes_rd': [], + 'total_err': [] + } + if not isinstance(l4_data, list): + l4_data = [{l4_data['name']: l4_data}] + idx = 0 + for cx in cx_list: + cx_found = False + for i in l4_data: + for cx_name, value in i.items(): + if cx == cx_name: + l4_dict['uc_avg_data'].append(value['uc-avg']) + l4_dict['uc_max_data'].append(value['uc-max']) + l4_dict['uc_min_data'].append(value['uc-min']) + l4_dict['url_times'].append(value['total-urls']) + l4_dict['rx_rate'].append(value['rx rate (1m)']) + l4_dict['bytes_rd'].append(value['bytes-rd']) + l4_dict['total_err'].append(value['total-err']) + cx_found = True + if not cx_found: + self.failed_cx.append(cx) + l4_dict['uc_avg_data'].append(0 if not self.tracking_map else self.tracking_map['uc_avg_data'][idx]) + l4_dict['uc_max_data'].append(0 if not self.tracking_map else self.tracking_map['uc_max_data'][idx]) + l4_dict['uc_min_data'].append(0 if not self.tracking_map else self.tracking_map['uc_min_data'][idx]) + l4_dict['url_times'].append(0 if not self.tracking_map else self.tracking_map['url_times'][idx]) + l4_dict['rx_rate'].append(0 if not self.tracking_map else self.tracking_map['rx_rate'][idx]) + l4_dict['bytes_rd'].append(0 if not self.tracking_map else self.tracking_map['bytes_rd'][idx]) + l4_dict['total_err'].append(0 if not self.tracking_map else self.tracking_map['total_err'][idx]) + idx += 1 + self.tracking_map = l4_dict.copy() + + return l4_dict + def monitor_for_runtime_csv(self, duration): time_now = datetime.now() @@ -661,12 +718,18 @@ def monitor_for_runtime_csv(self, duration): # uc_min_data = self.json_get("layer4/list?fields=uc-min") # total_url_data = self.json_get("layer4/list?fields=total-urls") # bytes_rd = self.json_get("layer4/list?fields=bytes-rd") - uc_avg_data = self.my_monitor('uc-avg') - uc_max_data = self.my_monitor('uc-max') - uc_min_data = self.my_monitor('uc-min') - url_times = self.my_monitor('total-urls') - rx_rate = self.my_monitor('rx rate (1m)') - bytes_rd = self.my_monitor('bytes-rd') + l4_dict = self.get_layer4_data() + uc_avg_data = l4_dict['uc_avg_data'] + uc_max_data = l4_dict['uc_max_data'] + uc_min_data = l4_dict['uc_min_data'] + url_times = l4_dict['url_times'] + rx_rate = l4_dict['rx_rate'] + bytes_rd = l4_dict['bytes_rd'] + total_err = l4_dict['total_err'] + urls_downloaded = [] + for i in range(len(total_err)): + urls_downloaded.append(url_times[i] - total_err[i]) + url_times = list(urls_downloaded) self.data["MAC"] = self.macid_list self.data["SSID"] = self.ssid_list self.data["Channel"] = self.channel_list @@ -675,9 +738,16 @@ def monitor_for_runtime_csv(self, duration): individual_rx_data = [] individual_rx_data.extend([current_time]) for i, port in enumerate(self.port_list): - row_data = [current_time, bytes_rd[i], url_times[i], rx_rate[i], rx_rate_list[i], tx_rate_list[i], rssi_list[i]] - individual_device_data[port].loc[len(individual_device_data[port])] = row_data - + # logger.info(f"row data HTTP",row_data) + + try: + row_data = [current_time, bytes_rd[i], url_times[i], rx_rate[i], rx_rate_list[i], tx_rate_list[i], rssi_list[i]] + individual_device_data[port].loc[len(individual_device_data[port])] = row_data + except Exception: + # Fail-safe: if any list index/key mismatch occurs while adding row_data, + # stop execution to avoid inconsistent results. + traceback.print_exc() + exit(1) if len(max_bytes_rd) == 0: max_bytes_rd = list(bytes_rd) for i in range(len(max_bytes_rd)): @@ -706,6 +776,7 @@ def monitor_for_runtime_csv(self, duration): self.data["uc_avg"] = uc_avg_data self.data["bytes_rd"] = bytes_rd self.data["rx rate (1m)"] = rx_rate + self.data["total_err"] = total_err else: self.data["status"] = ["RUNNING"] * len(self.devices_list) self.data["url_data"] = [0] * len(self.devices_list) @@ -714,6 +785,7 @@ def monitor_for_runtime_csv(self, duration): self.data["uc_min"] = [0] * len(self.devices_list) self.data["bytes_rd"] = [0] * len(self.devices_list) self.data["rx rate (1m)"] = [0] * len(self.devices_list) + self.data["total_err"] = [0] * len(self.devices_list) time_difference = abs(end_time - datetime.now()) total_hours = time_difference.total_seconds() / 3600 remaining_minutes = (total_hours % 1) * 60 @@ -722,7 +794,11 @@ def monitor_for_runtime_csv(self, duration): self.data["remaining_time"] = [[str(int(total_hours)) + " hr and " + str( int(remaining_minutes)) + " min" if int(total_hours) != 0 or int(remaining_minutes) != 0 else '<1 min'][ 0]] * len(self.devices_list) - df1 = pd.DataFrame(self.data) + try: + df1 = pd.DataFrame(self.data) + except Exception: + traceback.print_exc() + exit(1) if self.dowebgui: df1.to_csv('{}/http_datavalues.csv'.format(self.result_dir), index=False) elif self.client_type == 'Real': @@ -744,7 +820,55 @@ def monitor_for_runtime_csv(self, duration): for port, df in individual_device_data.items(): df.to_csv(f"{endtime}-http-{port}.csv", index=False) individual_device_csv_names.append(f'{endtime}-http-{port}') - self.individual_device_csv_names = individual_device_csv_names + self.individual_device_csv_names = individual_device_csv_names.copy() + try: + all_l4_data = self.get_all_l4_data() + df = pd.DataFrame(all_l4_data) + df.to_csv("all_l4_data.csv", index=False) + except Exception: + logger.error("All l4 data not found") + + def get_all_l4_data(self): + """ + Fetches the complete set of Layer-4 data and writes it to a dictionary + Returns: + dict: A dictionary mapping each Layer 4 field to a list of values in the order of CXs. + """ + fields = [ + "name", "eid", "type", "status", "total-urls", "urls/s", "bytes-rd", "bytes-wr", + "total-buffers", "total-rebuffers", "total-wait-time", "video-format-bitrate", + "audio-format-bitrate", "frame-rate", "video-quality", "tx rate", "tx-rate-1m", + "rx rate", "rx rate (1m)", "fb-min", "fb-avg", "fb-max", "uc-min", "uc-avg", + "uc-max", "dns-min", "dns-avg", "dns-max", "total-err", "bad-proto", "bad-url", + "rslv-p", "rslv-h", "!conn", "timeout", "nf (4xx)", "http-r", "http-p", "http-t", + "acc. denied", "ftp-host", "ftp-stor", "ftp-port", "write", "read", "redir", + "login-denied", "other-err", "elapsed", "rpt timer", "time-stamp" + ] + + data = self.local_realm.json_get(f"layer4/list?fields={','.join(fields)}") + + result = {field: [] for field in fields} + + endpoint = data.get("endpoint", {}) + cx_list = self.http_profile.created_cx.keys() + if isinstance(endpoint, dict): + for field in fields: + result[field].append(endpoint.get(field, None)) + else: + for created_cx in cx_list: + for cx in endpoint: + if created_cx in cx: + for field in fields: + result[field].append(cx[created_cx].get(field, None)) + break + + if "bytes-rd" in result: + result["bytes-rd"] = [ + float(f"{int(x) / 1_000_000:.4f}") if x is not None else None + for x in result["bytes-rd"] + ] + + return result def my_monitor(self, data_mon): # data in json format @@ -810,7 +934,7 @@ def download_time_in_sec(self, result_data): for i in download_time: try: download_time[i] = result_data[i]['dl_time'] - except BaseException: + except Exception: download_time[i] = [] print("dl_times: ", download_time) lst = [] @@ -860,7 +984,7 @@ def speed_in_Mbps(self, result_data): for i in speed: try: speed[i] = result_data[i]['speed'] - except BaseException: + except Exception: speed[i] = [] lst = [] lst1 = [] @@ -991,7 +1115,7 @@ def generate_graph(self, dataset, lis, bands): _color_name=['steelblue'], _show_bar_value=True, _enable_csv=True, - _graph_image_name="ucg-avg", _color_edge=['black'], + _graph_image_name="ucg-avg_http", _color_edge=['black'], _color=['steelblue'], _label=bands) graph_png = graph.build_bar_graph_horizontal() @@ -1023,7 +1147,7 @@ def graph_2(self, dataset2, lis, bands): _color_name=['orange'], _show_bar_value=True, _enable_csv=True, - _graph_image_name="Total-url", _color_edge=['black'], + _graph_image_name="Total-url_http", _color_edge=['black'], _color=['orange'], _label=bands) graph_png = graph_2.build_bar_graph_horizontal() @@ -1041,6 +1165,26 @@ def get_device_port_details(self): self.mode_list.append(str(port_data['mode'])) self.ssid_list.append(str(port_data['ssid'])) + def add_live_view_images_to_report(self, report): + for floor in range(0, int(self.total_floors)): + http_img_path = os.path.join(self.result_dir, "live_view_images", f"http_{self.test_name}_{floor + 1}.png") + timeout = 60 # seconds + start_time = time.time() + + while not (os.path.exists(http_img_path)): + if time.time() - start_time > timeout: + print("Timeout: Images not found within 60 seconds.") + break + time.sleep(1) + while not os.path.exists(http_img_path): + if os.path.exists(http_img_path): + break + if os.path.exists(http_img_path): + report.set_custom_html('
') + report.build_custom() + report.set_custom_html(f'') + report.build_custom() + def generate_report(self, date, num_stations, duration, test_setup_info, dataset, lis, bands, threshold_2g, threshold_5g, threshold_both, dataset2, dataset1, # summary_table_value, result_data, test_rig, rx_rate, @@ -1058,6 +1202,10 @@ def generate_report(self, date, num_stations, duration, test_setup_info, dataset # It ensures no blocker for virtual clients if self.client_type == 'Real': shutil.move('http_datavalues.csv', report_path_date_time) + try: + shutil.move('all_l4_data.csv', report_path_date_time) + except Exception: + logging.info("failed to generate all l4 data csv") # Moving indiviudal csv's to report directory for csv_name in self.individual_device_csv_names: shutil.move(f"{csv_name}.csv", report_path_date_time) @@ -1096,6 +1244,8 @@ def generate_report(self, date, num_stations, duration, test_setup_info, dataset report.move_csv_file() report.move_graph_image() report.build_graph() + if (self.dowebgui and self.get_live_view): + self.add_live_view_images_to_report(report) # report.set_obj_html("Summary Table Description", "This Table shows you the summary " # "result of Webpage Download Test as PASS or FAIL criteria. If the average time taken by " + @@ -1289,7 +1439,8 @@ def generate_report(self, date, num_stations, duration, test_setup_info, dataset " No of times File downloaded ": dataset2, " Average time taken to Download file (ms)": dataset, " Bytes-rd (Mega Bytes) ": dataset1, - "Rx Rate (Mbps)": rx_rate + "Rx Rate (Mbps)": rx_rate, + "Failed url's": self.data["total_err"] } if self.expected_passfail_value or self.device_csv_name: dataframe[" Expected value of no of times file downloaded"] = test_input_list @@ -1426,7 +1577,7 @@ def change_port_to_ip(self, upstream_port): try: target_port_ip = self.local_realm.json_get(f'/port/{shelf}/{resource}/{port}?fields=ip')['interface']['ip'] upstream_port = target_port_ip - except BaseException: + except Exception: logging.warning(f'The upstream port is not an ethernet port. Proceeding with the given upstream_port {upstream_port}.') logging.info(f"Upstream port IP {upstream_port}") else: @@ -1521,6 +1672,59 @@ def get_signal_and_link_speed_data(self): rx_rate_list.append('-') return signal_list, link_speed_list, rx_rate_list + def monitor_cx(self): + """ + This function waits for upto 20 iterations to allow all CXs (connections) to be created. + + If some CXs are still not created after 20 iterations, then the CXs related to that device are removed, + along with their associated client and MAC entries from all relevant lists. + """ + max_retry = 20 + current_retry = 0 + failed_cx = [] + flag = 0 + idx_list = [] + del_device_list, del_mac_list, del_port_list, del_device_list1 = [], [], [], [] + while current_retry < max_retry: + failed_cx.clear() + idx_list.clear() + del_device_list.clear() + del_mac_list.clear() + del_port_list.clear() + del_device_list1.clear() + created_cx_list = list(self.http_profile.created_cx.keys()) + for i, created_cxs in enumerate(created_cx_list): + try: + _ = self.local_realm.json_get("layer4/%s/list?fields=%s" % + (created_cxs, 'status'))['endpoint']['status'] + except Exception: + logger.error(f'cx not created for {self.port_list[i]}') + failed_cx.append(created_cxs) + del_device_list.append(self.device_list[i]) + del_mac_list.append(self.macid_list[i]) + del_port_list.append(self.port_list[i]) + del_device_list1.append(self.devices_list[i]) + if len(failed_cx) == 0: + flag = 1 + break + logger.info(f'Try {current_retry} out of 20: Waiting for the cross-connections to be created.') + time.sleep(2) + current_retry += 1 + + if flag: + logger.info('cross connections found for all devices') + return + for cx in failed_cx: + del self.http_profile.created_cx[cx] + for i in range(len(del_port_list)): + self.port_list.remove(del_port_list[i]) + self.macid_list.remove(del_mac_list[i]) + self.device_list.remove(del_device_list[i]) + self.devices_list.remove(del_device_list1[i]) + if len(self.port_list) == 0: + logger.error('No cross connections created, aborting test') + exit(1) + def validate_args(args): if args.expected_passfail_value and args.device_csv_name: @@ -1735,6 +1939,8 @@ def main(): optional.add_argument("--wait_time", type=int, help='Specify the maximum time to wait for Configuration', default=60) optional.add_argument("--config", action="store_true", help="Specify for configuring the devices") + optional.add_argument('--get_live_view', help="If true will heatmap will be generated from testhouse automation WebGui ", action='store_true') + optional.add_argument('--total_floors', help="Total floors from testhouse automation WebGui ", default="0") help_summary = '''\ lf_webpage.py will verify that N clients are connected on a specified band and can download some amount of file data from the HTTP server while measuring the time taken by clients to download the file and number of @@ -1862,7 +2068,9 @@ def main(): expected_passfail_value=args.expected_passfail_value, device_csv_name=args.device_csv_name, wait_time=args.wait_time, - config=args.config + config=args.config, + get_live_view=args.get_live_view, + total_floors=args.total_floors ) if args.client_type == "Real": if not isinstance(args.device_list, list): @@ -1886,38 +2094,6 @@ def main(): "configuration_status": "configured" } http.updating_webui_runningjson(obj) - android_devices, windows_devices, linux_devices, mac_devices = 0, 0, 0, 0 - all_devices_names = [] - device_type = [] - total_devices = "" - for i in device_list: - split_device_name = i.split(" ") - if 'android' in split_device_name: - all_devices_names.append(split_device_name[2] + ("(Android)")) - device_type.append("Android") - android_devices += 1 - elif 'Win' in split_device_name: - all_devices_names.append(split_device_name[2] + ("(Windows)")) - device_type.append("Windows") - windows_devices += 1 - elif 'Lin' in split_device_name: - all_devices_names.append(split_device_name[2] + ("(Linux)")) - device_type.append("Linux") - linux_devices += 1 - elif 'Mac' in split_device_name: - all_devices_names.append(split_device_name[2] + ("(Mac)")) - device_type.append("Mac") - mac_devices += 1 - - # Build total_devices string based on counts - if android_devices > 0: - total_devices += f" Android({android_devices})" - if windows_devices > 0: - total_devices += f" Windows({windows_devices})" - if linux_devices > 0: - total_devices += f" Linux({linux_devices})" - if mac_devices > 0: - total_devices += f" Mac({mac_devices})" args.num_stations = len(port_list) if not args.get_url_from_file: http.file_create(ssh_port=args.ssh_port) @@ -1928,6 +2104,9 @@ def main(): http.set_values() http.precleanup() http.build() + if args.client_type == 'Real': + http.monitor_cx() + logger.info(f'Test started on the devices : {http.port_list}') test_time = datetime.now() # Solution For Leap Year conflict changed it to %Y test_time = test_time.strftime("%Y %d %H:%M:%S") @@ -1947,7 +2126,7 @@ def main(): uc_avg_val = http.data['uc_avg'] url_times = http.data['url_data'] rx_bytes_val = http.data['bytes_rd'] - rx_rate_val = http.data['rx rate (1m)'] + rx_rate_val = list(http.data['rx rate (1m)']) else: uc_avg_val = http.my_monitor('uc-avg') url_times = http.my_monitor('total-urls') @@ -2080,7 +2259,71 @@ def main(): if int(duration == 3600) or (int(duration) > 3600): duration = str(duration / 3600) + "h" + android_devices, windows_devices, linux_devices, mac_devices = 0, 0, 0, 0 + all_devices_names = [] + device_type = [] + total_devices = "" + for i in http.devices_list: + split_device_name = i.split(" ") + if 'android' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Android)")) + device_type.append("Android") + android_devices += 1 + elif 'Win' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Windows)")) + device_type.append("Windows") + windows_devices += 1 + elif 'Lin' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Linux)")) + device_type.append("Linux") + linux_devices += 1 + elif 'Mac' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Mac)")) + device_type.append("Mac") + mac_devices += 1 + + # Build total_devices string based on counts + if android_devices > 0: + total_devices += f" Android({android_devices})" + if windows_devices > 0: + total_devices += f" Windows({windows_devices})" + if linux_devices > 0: + total_devices += f" Linux({linux_devices})" + if mac_devices > 0: + total_devices += f" Mac({mac_devices})" if args.client_type == "Real": + android_devices, windows_devices, linux_devices, mac_devices = 0, 0, 0, 0 + all_devices_names = [] + device_type = [] + total_devices = "" + for i in http.devices_list: + split_device_name = i.split(" ") + if 'android' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Android)")) + device_type.append("Android") + android_devices += 1 + elif 'Win' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Windows)")) + device_type.append("Windows") + windows_devices += 1 + elif 'Lin' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Linux)")) + device_type.append("Linux") + linux_devices += 1 + elif 'Mac' in split_device_name: + all_devices_names.append(split_device_name[2] + ("(Mac)")) + device_type.append("Mac") + mac_devices += 1 + + # Build total_devices string based on counts + if android_devices > 0: + total_devices += f" Android({android_devices})" + if windows_devices > 0: + total_devices += f" Windows({windows_devices})" + if linux_devices > 0: + total_devices += f" Linux({linux_devices})" + if mac_devices > 0: + total_devices += f" Mac({mac_devices})" if args.group_name: group_names = ', '.join(configuration.keys()) profile_names = ', '.join(configuration.values()) @@ -2089,7 +2332,7 @@ def main(): "AP name": args.ap_name, "Configuration": configmap, "Configured Devices": ", ".join(all_devices_names), - "No of Devices": "Total" + f"({args.num_stations})" + total_devices, + "No of Devices": "Total" + f"({len(all_devices_names)})" + total_devices, "Traffic Direction": "Download", "Traffic Duration ": duration } @@ -2099,7 +2342,7 @@ def main(): "SSID": ssid, "Device List": ", ".join(all_devices_names), "Security": security, - "No of Devices": "Total" + f"({args.num_stations})" + total_devices, + "No of Devices": "Total" + f"({len(all_devices_names)})" + total_devices, "Traffic Direction": "Download", "Traffic Duration ": duration } @@ -2128,6 +2371,8 @@ def main(): test_input_infor["File size"] = args.file_size else: test_setup_info["File location (URLs from the File)"] = args.file_path + if args.client_type == "Real": + test_setup_info["failed_cx's"] = http.failed_cx if http.failed_cx else "NONE" # dataset = http.download_time_in_sec(result_data=result_data) rx_rate = [] for i in result_data: @@ -2158,6 +2403,16 @@ def main(): # "": args.bands, # "PASS/FAIL": data # } + if args.dowebgui: + http.data_for_webui["status"] = ["STOPPED"] * len(http.devices_list) + http.data_for_webui['rx rate (1m)'] = http.data['rx rate (1m)'] + http.data_for_webui['total_err'] = http.data['total_err'] + http.data_for_webui["start_time"] = http.data["start_time"] + http.data_for_webui["end_time"] = http.data["end_time"] + http.data_for_webui["remaining_time"] = http.data["remaining_time"] + df1 = pd.DataFrame(http.data_for_webui) + df1.to_csv('{}/http_datavalues.csv'.format(http.result_dir), index=False) + http.generate_report(date, num_stations=args.num_stations, duration=args.duration, test_setup_info=test_setup_info, dataset=dataset, lis=lis, bands=args.bands, threshold_2g=args.threshold_2g, threshold_5g=args.threshold_5g, @@ -2171,13 +2426,6 @@ def main(): http.postcleanup() # FOR WEBGUI, filling csv at the end to get the last terminal logs if args.dowebgui: - http.data_for_webui["status"] = ["STOPPED"] * len(http.devices_list) - http.data_for_webui["start_time"] = http.data["start_time"] - http.data_for_webui["end_time"] = http.data["end_time"] - http.data_for_webui["remaining_time"] = http.data["remaining_time"] - df1 = pd.DataFrame(http.data_for_webui) - df1.to_csv('{}/http_datavalues.csv'.format(http.result_dir), index=False) - http.copy_reports_to_home_dir() diff --git a/py-scripts/lf_wifi_capacity_test.py b/py-scripts/lf_wifi_capacity_test.py index 8d098c1b7..a5d39e4e3 100755 --- a/py-scripts/lf_wifi_capacity_test.py +++ b/py-scripts/lf_wifi_capacity_test.py @@ -1,340 +1,57 @@ #!/usr/bin/env python3 """ -NAME: lf_wifi_capacity_test.py - -PURPOSE: This script runs wifi capacity test on the existing stations or runs on the stations specified -(if --stations argument is mentioned or stations can be created using -cs with stations names mentioned with --stations) -by creating layer3 cross connects and generates html and pdf report. - -EXAMPLE: -example 1: -./lf_wifi_capacity_test.py --mgr localhost --port 8080 --lf_user lanforge --lf_password lanforge \ ---instance_name wct_instance --config_name wifi_config --upstream 1.1.eth1 --batch_size 1,3,5,7,9,12 --loop_iter 1 \ ---protocol UDP-IPv4 --duration 6000 --pull_report --stations 1.1.sta0000,1.1.sta0001 \ ---create_stations --radio wiphy0 --ssid test-ssid --security open --paswd [BLANK] \ ---test_rig Testbed-01 --set DUT_NAME linksys-8450 - -example 2: -./lf_wifi_capacity_test.py --mgr localhost --port 8080 --lf_user lanforge --lf_password lanforge \ ---instance_name wct_instance --config_name wifi_config --upstream 1.1.eth1 --batch_size 1 --loop_iter 1 \ ---protocol UDP-IPv4 --duration 6000 --pull_report --stations 1.1.sta0000,1.1.sta0001 \ ---create_stations --radio wiphy0 --ssid test-ssid --security open --paswd [BLANK] \ ---test_rig Testbed-01 -test_tag TAG - -example 3: -./lf_wifi_capacity_test.py --mgr 192.168.200.165 --upstream 1.1.eth1 --batch_size 1,5 --protocol UDP-IPv4 --duration 30000 - --upload_rate 1Gbps --download_rate 1Gbps --raw_line 'ip_tos: 128' --raw_line 'do_pf: 1' --raw_line 'pf_min_period_dl: 100' - --raw_line 'pf_min_period_ul: 300' --raw_line 'pf_max_reconnects: 3' --num_stations 5 --start_id 333 --create_stations - --radio wiphy0 --ssid Netgear-5g --security wpa2 --paswd sharedsecret --test_rig Testbed-01 --set DUT_NAME linksys-8450 - --pull_report -SCRIPT_CLASSIFICATION : Test -SCRIPT_CATEGORIES: Performance, Functional, KPI Generation, Report Generation - -NOTES: This script is used to automate wifi capacity tests.You need a configured upstream to run the script. -To Run this script gui should be opened with -192.168.200.147:1 - path: cd LANforgeGUI_5.4.3 (5.4.3 can be changed with GUI version) - pwd (Output : /home/lanforge/LANforgeGUI_5.4.3) - ./lfclient.bash -cli-socket 3990 - - This is a test file which will run a wifi capacity test. - ex. on how to run this script (if stations are available in lanforge): - - ./lf_wifi_capacity_test.py --mgr localhost --port 8080 --lf_user lanforge --lf_password lanforge \ - --instance_name this_inst --config_name test_con --upstream 1.1.eth2 --batch_size 1,5,25,50,100 --loop_iter 1 \ - --protocol UDP-IPv4 --duration 6000 --pull_report \ - - - --pull_report == If specified, this will pull reports from lanforge to your code directory, - from where you are running this code - - --stations == Enter stations to use for wifi capacity - - --set DUT_NAME XXXX == Determines which DUT the wifi capacity test should use to get details on - - -STATUS: BETA RELEASE - -VERIFIED_ON: -Working date - 11/05/2023 -Build version - 5.4.6 -kernel version - 6.2.14+ - -LICENSE: - Free to distribute and modify. LANforge systems must be licensed. - Copyright 2023 Candela Technologies Inc - -INCLUDE_IN_README: False - - - - -Example of raw text config for Capacity, to show other possible options: - -sel_port-0: 1.1.eth1 -sel_port-1: 1.1.sta00000 -sel_port-2: 1.1.sta00001 -sel_port-3: 1.1.sta00002 -sel_port-4: 1.1.sta00003 -sel_port-5: 1.1.sta00004 -sel_port-6: 1.1.sta00005 -sel_port-7: 1.1.sta00006 -sel_port-8: 1.1.sta00007 -sel_port-9: 1.1.sta00008 -sel_port-10: 1.1.sta00009 -sel_port-11: 1.1.sta00010 -sel_port-12: 1.1.sta00011 -sel_port-13: 1.1.sta00012 -sel_port-14: 1.1.sta00013 -sel_port-15: 1.1.sta00014 -sel_port-16: 1.1.sta00015 -sel_port-17: 1.1.sta00016 -sel_port-18: 1.1.sta00017 -sel_port-19: 1.1.sta00018 -sel_port-20: 1.1.sta00019 -sel_port-21: 1.1.sta00020 -sel_port-22: 1.1.sta00021 -sel_port-23: 1.1.sta00022 -sel_port-24: 1.1.sta00023 -sel_port-25: 1.1.sta00024 -sel_port-26: 1.1.sta00025 -sel_port-27: 1.1.sta00026 -sel_port-28: 1.1.sta00027 -sel_port-29: 1.1.sta00028 -sel_port-30: 1.1.sta00029 -sel_port-31: 1.1.sta00030 -sel_port-32: 1.1.sta00031 -sel_port-33: 1.1.sta00032 -sel_port-34: 1.1.sta00033 -sel_port-35: 1.1.sta00034 -sel_port-36: 1.1.sta00035 -sel_port-37: 1.1.sta00036 -sel_port-38: 1.1.sta00037 -sel_port-39: 1.1.sta00038 -sel_port-40: 1.1.sta00039 -sel_port-41: 1.1.sta00040 -sel_port-42: 1.1.sta00041 -sel_port-43: 1.1.sta00042 -sel_port-44: 1.1.sta00043 -sel_port-45: 1.1.sta00044 -sel_port-46: 1.1.sta00045 -sel_port-47: 1.1.sta00046 -sel_port-48: 1.1.sta00047 -sel_port-49: 1.1.sta00048 -sel_port-50: 1.1.sta00049 -sel_port-51: 1.1.sta00500 -sel_port-52: 1.1.sta00501 -sel_port-53: 1.1.sta00502 -sel_port-54: 1.1.sta00503 -sel_port-55: 1.1.sta00504 -sel_port-56: 1.1.sta00505 -sel_port-57: 1.1.sta00506 -sel_port-58: 1.1.sta00507 -sel_port-59: 1.1.sta00508 -sel_port-60: 1.1.sta00509 -sel_port-61: 1.1.sta00510 -sel_port-62: 1.1.sta00511 -sel_port-63: 1.1.sta00512 -sel_port-64: 1.1.sta00513 -sel_port-65: 1.1.sta00514 -sel_port-66: 1.1.sta00515 -sel_port-67: 1.1.sta00516 -sel_port-68: 1.1.sta00517 -sel_port-69: 1.1.sta00518 -sel_port-70: 1.1.sta00519 -sel_port-71: 1.1.sta00520 -sel_port-72: 1.1.sta00521 -sel_port-73: 1.1.sta00522 -sel_port-74: 1.1.sta00523 -sel_port-75: 1.1.sta00524 -sel_port-76: 1.1.sta00525 -sel_port-77: 1.1.sta00526 -sel_port-78: 1.1.sta00527 -sel_port-79: 1.1.sta00528 -sel_port-80: 1.1.sta00529 -sel_port-81: 1.1.sta00530 -sel_port-82: 1.1.sta00531 -sel_port-83: 1.1.sta00532 -sel_port-84: 1.1.sta00533 -sel_port-85: 1.1.sta00534 -sel_port-86: 1.1.sta00535 -sel_port-87: 1.1.sta00536 -sel_port-88: 1.1.sta00537 -sel_port-89: 1.1.sta00538 -sel_port-90: 1.1.sta00539 -sel_port-91: 1.1.sta00540 -sel_port-92: 1.1.sta00541 -sel_port-93: 1.1.sta00542 -sel_port-94: 1.1.sta00543 -sel_port-95: 1.1.sta00544 -sel_port-96: 1.1.sta00545 -sel_port-97: 1.1.sta00546 -sel_port-98: 1.1.sta00547 -sel_port-99: 1.1.sta00548 -sel_port-100: 1.1.sta00549 -sel_port-101: 1.1.sta01000 -sel_port-102: 1.1.sta01001 -sel_port-103: 1.1.sta01002 -sel_port-104: 1.1.sta01003 -sel_port-105: 1.1.sta01004 -sel_port-106: 1.1.sta01005 -sel_port-107: 1.1.sta01006 -sel_port-108: 1.1.sta01007 -sel_port-109: 1.1.sta01008 -sel_port-110: 1.1.sta01009 -sel_port-111: 1.1.sta01010 -sel_port-112: 1.1.sta01011 -sel_port-113: 1.1.sta01012 -sel_port-114: 1.1.sta01013 -sel_port-115: 1.1.sta01014 -sel_port-116: 1.1.sta01015 -sel_port-117: 1.1.sta01016 -sel_port-118: 1.1.sta01017 -sel_port-119: 1.1.sta01018 -sel_port-120: 1.1.sta01019 -sel_port-121: 1.1.sta01020 -sel_port-122: 1.1.sta01021 -sel_port-123: 1.1.sta01022 -sel_port-124: 1.1.sta01023 -sel_port-125: 1.1.sta01024 -sel_port-126: 1.1.sta01025 -sel_port-127: 1.1.sta01026 -sel_port-128: 1.1.sta01027 -sel_port-129: 1.1.sta01028 -sel_port-130: 1.1.sta01029 -sel_port-131: 1.1.sta01030 -sel_port-132: 1.1.sta01031 -sel_port-133: 1.1.sta01032 -sel_port-134: 1.1.sta01033 -sel_port-135: 1.1.sta01034 -sel_port-136: 1.1.sta01035 -sel_port-137: 1.1.sta01036 -sel_port-138: 1.1.sta01037 -sel_port-139: 1.1.sta01038 -sel_port-140: 1.1.sta01039 -sel_port-141: 1.1.sta01040 -sel_port-142: 1.1.sta01041 -sel_port-143: 1.1.sta01042 -sel_port-144: 1.1.sta01043 -sel_port-145: 1.1.sta01044 -sel_port-146: 1.1.sta01045 -sel_port-147: 1.1.sta01046 -sel_port-148: 1.1.sta01047 -sel_port-149: 1.1.sta01048 -sel_port-150: 1.1.sta01049 -sel_port-151: 1.1.sta01500 -sel_port-152: 1.1.sta01501 -sel_port-153: 1.1.sta01502 -sel_port-154: 1.1.sta01503 -sel_port-155: 1.1.sta01504 -sel_port-156: 1.1.sta01505 -sel_port-157: 1.1.sta01506 -sel_port-158: 1.1.sta01507 -sel_port-159: 1.1.sta01508 -sel_port-160: 1.1.sta01509 -sel_port-161: 1.1.sta01510 -sel_port-162: 1.1.sta01511 -sel_port-163: 1.1.sta01512 -sel_port-164: 1.1.sta01513 -sel_port-165: 1.1.sta01514 -sel_port-166: 1.1.sta01515 -sel_port-167: 1.1.sta01516 -sel_port-168: 1.1.sta01517 -sel_port-169: 1.1.sta01518 -sel_port-170: 1.1.sta01519 -sel_port-171: 1.1.sta01520 -sel_port-172: 1.1.sta01521 -sel_port-173: 1.1.sta01522 -sel_port-174: 1.1.sta01523 -sel_port-175: 1.1.sta01524 -sel_port-176: 1.1.sta01525 -sel_port-177: 1.1.sta01526 -sel_port-178: 1.1.sta01527 -sel_port-179: 1.1.sta01528 -sel_port-180: 1.1.sta01529 -sel_port-181: 1.1.sta01530 -sel_port-182: 1.1.sta01531 -sel_port-183: 1.1.sta01532 -sel_port-184: 1.1.sta01533 -sel_port-185: 1.1.sta01534 -sel_port-186: 1.1.sta01535 -sel_port-187: 1.1.sta01536 -sel_port-188: 1.1.sta01537 -sel_port-189: 1.1.sta01538 -sel_port-190: 1.1.sta01539 -sel_port-191: 1.1.sta01540 -sel_port-192: 1.1.sta01541 -sel_port-193: 1.1.sta01542 -sel_port-194: 1.1.sta01543 -sel_port-195: 1.1.sta01544 -sel_port-196: 1.1.sta01545 -sel_port-197: 1.1.wlan4 -sel_port-198: 1.1.wlan5 -sel_port-199: 1.1.wlan6 -sel_port-200: 1.1.wlan7 -show_events: 1 -show_log: 0 -port_sorting: 0 -kpi_id: WiFi Capacity -bg: 0xE0ECF8 -test_rig: -show_scan: 1 -auto_helper: 1 -skip_2: 0 -skip_5: 0 -skip_5b: 1 -skip_dual: 0 -skip_tri: 1 -batch_size: 1 -loop_iter: 1 -duration: 6000 -test_groups: 0 -test_groups_subset: 0 -protocol: UDP-IPv4 -dl_rate_sel: Total Download Rate: -dl_rate: 1000000000 -ul_rate_sel: Total Upload Rate: -ul_rate: 10000000 -prcnt_tcp: 100000 -l4_endp: -pdu_sz: -1 -mss_sel: 1 -sock_buffer: 0 -ip_tos: 0 -multi_conn: -1 -min_speed: -1 -ps_interval: 60-second Running Average -fairness: 0 -naptime: 0 -before_clear: 5000 -rpt_timer: 1000 -try_lower: 0 -rnd_rate: 1 -leave_ports_up: 0 -down_quiesce: 0 -udp_nat: 1 -record_other_ssids: 0 -clear_reset_counters: 0 -do_pf: 0 -pf_min_period_dl: 0 -pf_min_period_ul: 0 -pf_max_reconnects: 0 -use_mix_pdu: 0 -pdu_prcnt_pps: 1 -pdu_prcnt_bps: 0 -pdu_mix_ln-0: -show_scan: 1 -show_golden_3p: 0 -save_csv: 0 -show_realtime: 1 -show_pie: 1 -show_per_loop_totals: 1 -show_cx_time: 1 -show_dhcp: 1 -show_anqp: 1 -show_4way: 1 -show_latency: 1 - +NAME: lf_wifi_capacity_test.py + +PURPOSE: This script runs LANforge GUI-based WiFi Capacity test. + +NOTES: Upon successful termination, the test PDF and HTML reports are saved. + The report is optionally copied to the current directory on the executing system + when the '--pull_report' option is specified. + +EXAMPLE: # Run 60 second default DL/UL-rate UDP IPv4 traffic-based test with + # pre-existing and pre-configured station 'sta0000' + # + # Report is copied to current directory on executing system given + # the '--pull_report' option from remote LANforge 192.168.1.101 + ./lf_wifi_capacity_test.py \ + --mgr 192.168.1.101 \ + --pull_report \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000 \ + --protocol UDP \ + --duration 60s + + # Run 5 minute second 1 Gbps DL rate TCP IPv4 traffic-based test with + # pre-existing and pre-configured stations 'sta0000' and 'sta0001' + # together + ./lf_wifi_capacity_test.py \ + --pull_report \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000,1.1.sta0001 \ + --protocol TCP \ + --duration 5m \ + --batch_size 2 + + # Run test using values and options as defined in pre-existing config + # Can use additional options like '--duration', '--batch_size', etc. + # to override those in config + ./lf_wifi_capacity_test.py \ + --pull_report \ + --config_name existing_wct_config + +SCRIPT_CLASSIFICATION: + Test + +SCRIPT_CATEGORIES: + Performance, Functional, KPI Generation, Report Generation + +STATUS: Functional + +LICENSE: Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc. + +INCLUDE_IN_README: + False """ import sys import os @@ -398,7 +115,8 @@ def __init__(self, local_lf_report_dir="", sta_list="", verbosity="5", - ): + force: bool = False, + **kwargs): super().__init__(lfclient_host=lfclient_host, lfclient_port=lf_port) if enables is None: @@ -446,6 +164,7 @@ def __init__(self, self.local_lf_report_dir = local_lf_report_dir self.stations_list = sta_list self.verbosity = verbosity + self.force = force def setup(self): if self.create_stations and self.stations != "": @@ -538,10 +257,9 @@ def run(self): cmd = "cv click '%s' 'Interleave Sort'" % self.instance_name cv_cmds.append(cmd) - self.create_and_run_test(self.load_old_cfg, self.test_name, self.instance_name, - self.config_name, self.sets, - self.pull_report, self.lfclient_host, self.lf_user, self.lf_password, - cv_cmds, ssh_port=self.ssh_port, graph_groups_file=self.graph_groups, local_lf_report_dir=self.local_lf_report_dir) + self.create_and_run_test(lf_host=self.lfclient_host, + cv_cmds=cv_cmds, + **vars(self)) self.rm_text_blob(self.config_name, blob_test) # To delete old config with same name @@ -564,74 +282,59 @@ def main(): parser = argparse.ArgumentParser( prog="lf_wifi_capacity_test.py", formatter_class=argparse.RawTextHelpFormatter, - description=""" - -NAME: lf_wifi_capacity_test.py - -PURPOSE: This script runs wifi capacity test on the existing stations or runs on the stations specified -(if --stations argument is mentioned or stations can be created using -cs with stations names mentioned with --stations) -by creating layer3 cross connects and generates html and pdf report. - -EXAMPLE: -example 1: -./lf_wifi_capacity_test.py --mgr localhost --port 8080 --lf_user lanforge --lf_password lanforge \ ---instance_name wct_instance --config_name wifi_config --upstream 1.1.eth1 --batch_size 1,3,5,7,9,12 --loop_iter 1 \ ---protocol UDP-IPv4 --duration 6000 --pull_report --stations 1.1.sta0000,1.1.sta0001 \ ---create_stations --radio wiphy0 --ssid test-ssid --security open --paswd [BLANK] \ ---test_rig Testbed-01 --set DUT_NAME linksys-8450 - -example 2: -./lf_wifi_capacity_test.py --mgr localhost --port 8080 --lf_user lanforge --lf_password lanforge \ ---instance_name wct_instance --config_name wifi_config --upstream 1.1.eth1 --batch_size 1 --loop_iter 1 \ ---protocol UDP-IPv4 --duration 6000 --pull_report --stations 1.1.sta0000,1.1.sta0001 \ ---create_stations --radio wiphy0 --ssid test-ssid --security open --paswd [BLANK] \ ---test_rig Testbed-01 -test_tag TAG - -example 3: -./lf_wifi_capacity_test.py --mgr 192.168.200.165 --upstream 1.1.eth1 --batch_size 1,5 --protocol UDP-IPv4 --duration 30000 - --upload_rate 1Gbps --download_rate 1Gbps --raw_line 'ip_tos: 128' --raw_line 'do_pf: 1' --raw_line 'pf_min_period_dl: 100' - --raw_line 'pf_min_period_ul: 300' --raw_line 'pf_max_reconnects: 3' --num_stations 5 --start_id 333 --create_stations - --radio wiphy0 --ssid Netgear-5g --security wpa2 --paswd sharedsecret --test_rig Testbed-01 --set DUT_NAME linksys-8450 - --pull_report - -SCRIPT_CLASSIFICATION : Test -SCRIPT_CATEGORIES: Performance, Functional, KPI Generation, Report Generation - -NOTES: This script is used to automate wifi capacity tests.You need a configured upstream to run the script. -To Run this script gui should be opened with -192.168.200.147:1 - path: cd LANforgeGUI_5.4.3 (5.4.3 can be changed with GUI version) - pwd (Output : /home/lanforge/LANforgeGUI_5.4.3) - ./lfclient.bash -cli-socket 3990 - -This is a test file which will run a wifi capacity test. - ex. on how to run this script (if stations are available in lanforge): - - ./lf_wifi_capacity_test.py --mgr localhost --port 8080 --lf_user lanforge --lf_password lanforge \ - --instance_name this_inst --config_name test_con --upstream 1.1.eth2 --batch_size 1,5,25,50,100 --loop_iter 1 \ - --protocol UDP-IPv4 --duration 6000 --pull_report \ - - --pull_report == If specified, this will pull reports from lanforge to your code directory, - from where you are running this code - - --stations == Enter stations to use for wifi capacity - - --set DUT_NAME XXXX == Determines which DUT the wifi capacity test should use to get details on - - -STATUS: BETA RELEASE - -VERIFIED_ON: -Working date - 11/05/2023 -Build version - 5.4.6 -kernel version - 6.2.14+ - -LICENSE: - Free to distribute and modify. LANforge systems must be licensed. - Copyright 2023 Candela Technologies Inc - -INCLUDE_IN_README: False - + description=r""" +NAME: lf_wifi_capacity_test.py + +PURPOSE: This script runs LANforge GUI-based WiFi Capacity test. + +NOTES: Upon successful termination, the test PDF and HTML reports are saved. + The report is optionally copied to the current directory on the executing system + when the '--pull_report' option is specified. + +EXAMPLE: # Run 60 second default DL/UL-rate UDP IPv4 traffic-based test with + # pre-existing and pre-configured station 'sta0000' + # + # Report is copied to current directory on executing system given + # the '--pull_report' option from remote LANforge 192.168.1.101 + ./lf_wifi_capacity_test.py \ + --mgr 192.168.1.101 \ + --pull_report \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000 \ + --protocol UDP \ + --duration 60s + + # Run 5 minute second 1 Gbps DL rate TCP IPv4 traffic-based test with + # pre-existing and pre-configured stations 'sta0000' and 'sta0001' + # together + ./lf_wifi_capacity_test.py \ + --pull_report \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000,1.1.sta0001 \ + --protocol TCP \ + --duration 5m \ + --batch_size 2 + + # Run test using values and options as defined in pre-existing config + # Can use additional options like '--duration', '--batch_size', etc. + # to override those in config + ./lf_wifi_capacity_test.py \ + --pull_report \ + --config_name existing_wct_config + +SCRIPT_CLASSIFICATION: + Test + +SCRIPT_CATEGORIES: + Performance, Functional, KPI Generation, Report Generation + +STATUS: Functional + +LICENSE: Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc. + +INCLUDE_IN_README: + False """) cv_add_base_parser(parser) # see cv_test_manager.py @@ -718,37 +421,12 @@ def main(): WFC_Test = WiFiCapacityTest(lfclient_host=args.mgr, lf_port=args.port, - lf_user=args.lf_user, - lf_password=args.lf_password, - instance_name=args.instance_name, - config_name=args.config_name, - upstream=args.upstream, - batch_size=args.batch_size, - loop_iter=args.loop_iter, - protocol=args.protocol, - duration=args.duration, - pull_report=args.pull_report, - load_old_cfg=args.load_old_cfg, - download_rate=args.download_rate, - upload_rate=args.upload_rate, - sort=args.sort, - stations=args.stations, - create_stations=args.create_stations, - radio=args.radio, - ssid=args.ssid, - security=args.security, - paswd=args.paswd, enables=args.enable, disables=args.disable, raw_lines=args.raw_line, - raw_lines_file=args.raw_lines_file, sets=args.set, - graph_groups=args.graph_groups, - test_rig=args.test_rig, - test_tag=args.test_tag, - local_lf_report_dir=args.local_lf_report_dir, sta_list=station_list, - verbosity=args.verbosity) + **vars(args)) WFC_Test.setup() WFC_Test.run() diff --git a/py-scripts/measure_station_time_up.py b/py-scripts/measure_station_time_up.py index 077e0d36d..c0bddbfdc 100755 --- a/py-scripts/measure_station_time_up.py +++ b/py-scripts/measure_station_time_up.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ Script for creating a variable number of stations. @@ -97,7 +96,7 @@ def build(self): radio=item) start_num = self.num_sta + start_num + 1 sta_names.extend(sta_list) - # TODO: Add checks for return code + # TODO: Add checks for return code self.station_profile.create(radio=item, sta_names_=sta_list, debug=self.debug) def station_up(self): @@ -161,7 +160,7 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ ./measure_station_time_up.py is for creating a variable number of stations and measures the time it took to admin them up and get IP addresses. ''' @@ -169,12 +168,10 @@ def main(): print(help_summary) exit(0) - if not args.report_file: print("error: the following arguments are required: --report_file") exit(1) - if args.report_file.split('.')[-1] not in ['pkl', 'csv', 'xlsx']: raise NameError('Please make sure your file name ends with either pkl, csv, or xlsx') @@ -223,5 +220,6 @@ def main(): # TODO: Add KPI: Min/max/avg of each station's time to get an IP address, data can be read/deduced # by looking at port-mgr output. + if __name__ == "__main__": main() diff --git a/py-scripts/modify_station.py b/py-scripts/modify_station.py index 6687e88c6..a5b809011 100755 --- a/py-scripts/modify_station.py +++ b/py-scripts/modify_station.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ Script for modifying stations. """ @@ -181,7 +180,7 @@ def adjust_radio(self, radio_eid=None): num_matching = 0 pprint.pprint(["port_list:", port_list]) if isinstance(port_list, dict): - for eid, record in port_list.items(): + for _, record in port_list.items(): if not record["parent dev"]: continue if self.radio.endswith(record["parent dev"]): @@ -328,7 +327,7 @@ def main(): optional.add_argument('--mode', default='NA', help=f"set station wifi mode: " - f"{', '.join(list(add_sta.add_sta_modes.keys()))}") + f"{', '.join(list(add_sta.add_sta_modes.keys()))}") optional.add_argument('--bssid', help="specify the BSSID of the AP to associate with, or DEFAULT") optional.add_argument('--ip', diff --git a/py-scripts/real_application_tests/teams_automation/lf_interop_teams.py b/py-scripts/real_application_tests/teams_automation/lf_interop_teams.py new file mode 100644 index 000000000..bfc890daa --- /dev/null +++ b/py-scripts/real_application_tests/teams_automation/lf_interop_teams.py @@ -0,0 +1,990 @@ +#!/usr/bin/env python3 +""" + NAME: lf_interop_teams.py + + PURPOSE: lf_interop_teams.py provides the available devices and allows the user to start Microsoft Teams call conference meeting for the user-specified duration + + EXAMPLE-1: + Command Line Interface to run Teams: + python3 lf_interop_teams.py --mgr 192.168.204.75 --upstream_port 1.1.eth1 --participants 3 --duration 1 --audio --video + + EXAMPLE-2: + Command Line Interface to run Teams on Specified Resources: + python3 lf_interop_teams.py --mgr 192.168.204.75 --upstream_port 1.1.eth1 --participants 3 --duration 1 --audio --video --resources 1.95,1.400,1.300 + + + NOTES: + 1. Use 'python3 lf_interop_teams.py --help' to see command line usage and options. + 2. Always specify the duration in minutes (for example: --duration 3 indicates a duration of 3 minutes). + 3. If --resources are not given after passing the CLI, a list of available devices will be displayed on the terminal. + 4. Enter the resource numbers separated by commas (,) in the resource argument Eg: (1.95,1.200). + +""" +import os +import csv +import time +import requests +import threading +import argparse +import pytz +from datetime import datetime, timedelta +from flask import Flask, request, jsonify +import importlib +import pandas as pd +import shutil +import logging +import json +import sys +import traceback +import glob + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../..')) +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../..')) + + +lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base") +LFCliBase = lfcli_base.LFCliBase +LFUtils = importlib.import_module("py-json.LANforge.LFUtils") +realm = importlib.import_module("py-json.realm") +Realm = realm.Realm +lf_report = importlib.import_module("py-scripts.lf_report") +lf_report = lf_report.lf_report +lf_graph = importlib.import_module("py-scripts.lf_graph") +lf_bar_graph = lf_graph.lf_bar_graph +lf_scatter_graph = lf_graph.lf_scatter_graph +lf_bar_graph_horizontal = lf_graph.lf_bar_graph_horizontal +lf_line_graph = lf_graph.lf_line_graph +lf_stacked_graph = lf_graph.lf_stacked_graph +lf_horizontal_stacked_graph = lf_graph.lf_horizontal_stacked_graph +DeviceConfig = importlib.import_module("py-scripts.DeviceConfig") +lf_base_interop_profile = importlib.import_module("py-scripts.lf_base_interop_profile") +RealDevice = lf_base_interop_profile.RealDevice + +# Set up logging +logger = logging.getLogger(__name__) +log = logging.getLogger('werkzeug') +log.setLevel(logging.ERROR) + +# Import LF logger configuration module +lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") + + +class TeamsAutomation(Realm): + def __init__(self, + lanforge_ip=None, + duration=None, + upstream_port=None, + no_pre_cleanup=None, + no_post_cleanup=None, + participants_req=None, + audio=None, + video=None, + do_webui=None, + test_name=None, + report_dir=None + + ): + super().__init__(lfclient_host=lanforge_ip) + self.app = Flask(__name__) + self.lanforge_ip = lanforge_ip + self.duration = duration + self.upstream_port = upstream_port + self.no_pre_cleanup = no_pre_cleanup + self.no_post_cleanup = no_post_cleanup + self.realdevice = None + self.real_sta_list = [] + self.real_sta_data_dict = {} + self.real_sta_os_types = [] + self.real_sta_hostname = [] + self.hostname_os_combination = [] + self.wifi_interfaces = [] + self.windows = 0 + self.linux = 0 + self.mac = 0 + self.meet_link = None + self.participants_joined = None + self.participants_req = participants_req + self.test_start = False + self.start_time = None + self.end_time = None + self.audio = None + self.video = None + self.login_completed = False + self.credentials = [] + self.cred_index = 0 + self.tz = pytz.timezone('Asia/Kolkata') + self.generic_endps_profile = self.new_generic_endp_profile() + self.generic_endps_profile.name_prefix = "zoom" + self.generic_endps_profile.type = "zoom" + self.audio = audio + self.video = video + self.audio_stats_header = [ + 'Sent Audio bitrate(Kbps)', + 'Sent Audio Packets', + 'Audio RTT(ms)', + 'sent Audio codec', + 'Received Audio Jitter(ms)', + 'Receievd Audio Packet Loss(%)', + 'Received Audio Packets', + 'Recevied Audio Codec' + ] + + self.video_stats_header = [ + 'Sent video bitrate(Mbps)', + 'Received video bitrate(Mbps)', + 'Sent video frame rate(fps)', + 'Sent video resolution(px)', + 'video RTT (ms)', + 'sent video packets', + 'sent video codec', + 'video processing' + ] + + if self.audio: + self.header = ['timestamp'] + self.audio_stats_header + if self.video: + if self.audio: + self.header += self.video_stats_header + else: + self.header = ['timestamp'] + self.video_stats_header + self.data_store = {} + self.stop_signal = False + self.path = os.path.join(os.getcwd(), "teams_test_results") + if not os.path.exists(self.path): + os.makedirs(self.path) + self.do_webui = do_webui + self.test_name = test_name + self.report_dir = report_dir + self.execute_finally = False + + def updating_webui_runningjson(self, obj): + data = {} + file_path = self.path + "/../../Running_instances/{}_{}_running.json".format(self.lanforge_ip, self.test_name) + + # Wait until the file exists + while not os.path.exists(file_path): + logging.info("Waiting for the running json file to be created") + time.sleep(1) + logging.info("Running Json file found") + with open(file_path, 'r') as file: + data = json.load(file) + + for key in obj: + data[key] = obj[key] + + with open(file_path, 'w') as file: + json.dump(data, file, indent=4) + + def update_webui_data(self): + if len(self.real_sta_hostname) == 0: + logging.info("No device is available to run the test") + obj = { + "status": "Stopped", + "configuration_status": "configured" + } + self.updating_webui_runningjson(obj) + return + else: + obj = { + "configured_devices": self.real_sta_hostname, + "configuration_status": "configured", + "no_of_devices": f' Total({len(self.real_sta_os_types)}) : W({self.windows}),L({self.linux}),M({self.mac})', + "device_list": self.hostname_os_combination, + } + self.updating_webui_runningjson(obj) + + def wait_for_flask(self, url="http://127.0.0.1:5005/test_server", timeout=10): + """Wait until the Flask server is up, but exit if it takes longer than `timeout` seconds.""" + start_time = time.time() + while time.time() - start_time < timeout: + try: + response = requests.get(url, timeout=1) + if response.status_code == 200: + logging.info("Flask server is up and running!") + return + except requests.exceptions.ConnectionError: + time.sleep(1) + logging.error("Flask server did not start within 10 seconds. Exiting.") + sys.exit(1) + + def run(self): + flask_thread = threading.Thread(target=self.start_flask_server) + flask_thread.daemon = True + flask_thread.start() + self.wait_for_flask() + + if self.generic_endps_profile.create(ports=[self.real_sta_list[0]], real_client_os_types=[self.real_sta_os_types[0]]): + logging.info('Real client generic endpoint creation completed.') + else: + logging.error('Real client generic endpoint creation failed.') + exit(0) + + if self.real_sta_os_types[0] == "windows": + cmd = f"py teams_host.py --ip {self.upstream_port}" + self.generic_endps_profile.set_cmd(self.generic_endps_profile.created_endp[0], cmd) + elif self.real_sta_os_types[0] == 'linux': + + cmd = "su -l lanforge ctteams.bash %s %s %s" % (self.wifi_interfaces[0], self.upstream_port, "host") + + self.generic_endps_profile.set_cmd(self.generic_endps_profile.created_endp[0], cmd) + elif self.real_sta_os_types[0] == 'macos': + cmd = "sudo bash ctteams.bash %s %s" % (self.upstream_port, "host") + self.generic_endps_profile.set_cmd(self.generic_endps_profile.created_endp[0], cmd) + self.generic_endps_profile.start_cx() + time.sleep(5) + + while not self.login_completed: + try: + + generic_endpoint = self.json_get(f'/generic/{self.generic_endps_profile.created_endp[0]}') + endp_status = generic_endpoint["endpoint"]["status"] + if endp_status == "Stopped": + logging.error("Failed to Start the Host Device") + self.generic_endps_profile.cleanup() + os._exit(1) + time.sleep(5) + except Exception as e: + logging.info(f"Error while checking login_completed status: {e}") + time.sleep(5) + + if self.generic_endps_profile.create(ports=self.real_sta_list[1:], real_client_os_types=self.real_sta_os_types[1:]): + logging.info('Real client generic endpoint creation completed.') + else: + logging.error('Real client generic endpoint creation failed.') + exit(0) + for i in range(1, len(self.real_sta_os_types)): + + if self.real_sta_os_types[i] == "windows": + cmd = f"py teams_client.py --ip {self.upstream_port}" + self.generic_endps_profile.set_cmd(self.generic_endps_profile.created_endp[i], cmd) + elif self.real_sta_os_types[i] == 'linux': + cmd = "su -l lanforge ctteams.bash %s %s %s" % (self.wifi_interfaces[i], self.upstream_port, "client") + self.generic_endps_profile.set_cmd(self.generic_endps_profile.created_endp[i], cmd) + elif self.real_sta_os_types[i] == 'macos': + cmd = "sudo bash ctteams.bash %s %s" % (self.upstream_port, "client") + self.generic_endps_profile.set_cmd(self.generic_endps_profile.created_endp[i], cmd) + + self.generic_endps_profile.start_cx() + + while not self.test_start: + + logging.info("WAITING FOR THE TEST TO BE STARTED") + time.sleep(5) + + self.set_start_time() + logging.info("TEST WILL BE STARTING") + + while datetime.now(self.tz) < self.end_time or not self.check_gen_cx(): + if self.stop_signal: + break + + time.sleep(5) + + def generate_report(self): + report = lf_report(_output_pdf='teams_call_report.pdf', + _output_html='teams_call_report.html', + _results_dir_name="teams_call_report", + _path=self.path) + self.report_path_date_time = report.get_path_date_time() + + report.set_title("Teams Call Automated Report") + report.build_banner() + + report.set_table_title("Objective:") + report.build_table_title() + report.set_text("The objective is to conduct automated Teams call tests across multiple laptops to gather statistics on sent audio, video, and received audio, video performance." + + "The test will collect these statistics and store them in a CSV file. Additionally, automated graphs will be generated using the collected data.") + report.build_text_simple() + + report.set_table_title("Test Parameters:") + report.build_table_title() + testtype = "" + if self.audio and self.video: + testtype = "AUDIO & VIDEO" + elif self.audio: + testtype = "AUDIO" + elif self.video: + testtype = "VIDEO" + + test_parameters = pd.DataFrame([{ + + 'No of Clients': f'W({self.windows}),L({self.linux}),M({self.mac})', + 'Test Duration(min)': self.duration, + "HOST": self.real_sta_list[0], + "TEST TYPE": testtype + + }]) + report.set_table_dataframe(test_parameters) + report.build_table() + + # Read per-device average metrics + df = pd.read_csv(os.path.join(self.path, "teams_call_avg_data.csv")) + df.columns = df.columns.str.strip() + + report.set_table_title("Test Devices:") + report.build_table_title() + + device_details = pd.DataFrame({ + 'Hostname': self.real_sta_hostname, + 'OS Type': self.real_sta_os_types, + }) + report.set_table_dataframe(device_details) + report.build_table() + + if self.audio: + metrics = [ + ("Audio RTT(ms)", "Audio RTT (ms)"), + ("Received Audio Jitter(ms)", "Received Audio Jitter (ms)"), + ("Sent Audio bitrate(Kbps)", "Sent Audio Bitrate (Kbps)"), + ] + + if self.video: + # Create bar graphs for each metric + metrics = [ + ("Sent video bitrate(Mbps)", "Sent Video Bitrate (Mbps)"), + ("Received video bitrate(Mbps)", "Received Video Bitrate (Mbps)"), + ("sent video packets", "Sent Video Packets"), + ] + if self.audio and self.video: + # Create bar graphs for each metric + metrics = [ + ("Audio RTT(ms)", "Audio RTT (ms)"), + ("Received Audio Jitter(ms)", "Received Audio Jitter (ms)"), + ("Sent Audio bitrate(Kbps)", "Sent Audio Bitrate (Kbps)"), + ("Sent video bitrate(Mbps)", "Sent Video Bitrate (Mbps)"), + ("Received video bitrate(Mbps)", "Received Video Bitrate (Mbps)"), + ("sent video packets", "Sent Video Packets"), + ] + + for column, title in metrics: + report.set_graph_title(f"Average {title}") + report.build_graph_title() + + bar_graph_horizontal = lf_bar_graph_horizontal( + _data_set=[df[column].tolist()], + _xaxis_name=f"AVG {title}", + _yaxis_name="Devices", + _yaxis_label=df["Device Name"].tolist(), + _yaxis_categories=df["Device Name"].tolist(), + _yaxis_step=1, + _yticks_font=8, + _bar_height=.25, + _color_name=["orange"], + _show_bar_value=True, + _figsize=(16, len(df) * 1 + 4), + _graph_title=f"AVG {title} Per Device", + _graph_image_name=title.replace(" ", "_"), + _label=[title] + ) + graph_image = bar_graph_horizontal.build_bar_graph_horizontal() + report.set_graph_image(graph_image) + report.move_graph_image() + report.build_graph() + + if self.audio: + selected_columns = [ + "Device Name", + "Sent Audio bitrate(Kbps)", + "Sent Audio Packets", + "Audio RTT(ms)", + "Received Audio Jitter(ms)", + "Receievd Audio Packet Loss(%)", + ] + + column_headings = { + "Device Name": "Device Name", + "Sent Audio bitrate(Kbps)": "AVG Sent Audio Bitrate (Kbps)", + "Sent Audio Packets": "AVG Sent Audio Packets", + "Audio RTT(ms)": "AVG Audio RTT (ms)", + "Received Audio Jitter(ms)": "AVG Received Audio Jitter (ms)", + "Receievd Audio Packet Loss(%)": "AVG Received Audio Packet Loss (%)", + } + + filtered_df = df[selected_columns].rename(columns=column_headings) + + report.set_table_title("Test Audio Results Table") + report.build_table_title() + report.set_table_dataframe(filtered_df) + report.build_table() + + if self.video: + selected_columns = [ + "Device Name", + "Sent video bitrate(Mbps)", + "Received video bitrate(Mbps)", + "Sent video frame rate(fps)", + "video RTT (ms)", + "sent video packets", + ] + + column_headings = { + "Device Name": "Device Name", + "Sent video bitrate(Mbps)": "AVG Sent Video Bitrate (Mbps)", + "Received video bitrate(Mbps)": "AVG Received Video Bitrate (Mbps)", + "Sent video frame rate(fps)": "AVG Sent Video Frame Rate (fps)", + "video RTT (ms)": "AVG Video RTT (ms)", + "sent video packets": "AVG Sent Video Packets", + } + + filtered_df = df[selected_columns].rename(columns=column_headings) + + report.set_table_title("Test Video Results Table") + report.build_table_title() + report.set_table_dataframe(filtered_df) + report.build_table() + + report.write_html() + report.write_pdf() + + def check_gen_cx(self): + try: + + for gen_endp in self.generic_endps_profile.created_endp: + generic_endpoint = self.json_get(f'/generic/{gen_endp}') + + if not generic_endpoint or "endpoint" not in generic_endpoint: + logging.info(f"Error fetching endpoint data for {gen_endp}") + return False + + endp_status = generic_endpoint["endpoint"].get("status", "") + + if endp_status not in ["Stopped", "WAITING", "NO-CX", "PHANTOM", "FTM_WAIT"]: + return False + + return True + except Exception as e: + logging.error(f"Error in check_gen_cx function {e}", exc_info=True) + logging.info(f"generic endpoint data {generic_endpoint}") + + def set_start_time(self): + self.start_time = datetime.now(self.tz) + timedelta(seconds=30) + self.end_time = self.start_time + timedelta(minutes=self.duration) + return [self.start_time, self.end_time] + + def filter_ios_devices(self, device_list): + """ + Filters out iOS devices from the given device list based on hardware and software identifiers. + + This method accepts a list or comma-separated string of device identifiers and removes + devices identified as iOS (Apple) based on their hardware version, app ID, and kernel info + fetched via the `/resource/{shelf}/{resource}` API endpoint. + + Supported input formats for each device: + - "shelf.resource" + - "shelf.resource.port" + - "resource" (assumes shelf = 1) + + iOS devices are identified if: + - 'Apple' is found in the hardware version, and + - `app-id` is not empty and is either non-zero or the kernel is empty + + Args: + device_list (Union[list[str], str]): A list or comma-separated string of devices to be filtered. + + Returns: + Union[list[int], str]: A list of valid (non-iOS) device IDs as integers, + or a comma-separated string if the input was a string. + + Logs: + - Warnings for invalid formats or missing device data. + - Info when an iOS device is skipped. + - Exceptions if errors occur during processing. + + """ + modified_device_list = device_list + if isinstance(device_list, str): + modified_device_list = device_list.split(',') + + filtered_list = [] + + for device in modified_device_list: + device = str(device).strip() + try: + if device.count('.') == 1: + shelf, resource = device.split('.') + elif device.count('.') == 2: + shelf, resource, port = device.split('.') + elif device.count('.') == 0: + shelf, resource = 1, device + else: + logger.warning("Invalid device format: %s", device) + continue + + device_data_resp = self.json_get(f'/resource/{shelf}/{resource}') + if not device_data_resp or 'resource' not in device_data_resp: + logger.warning("Device data not found for %s", device) + continue + + device_data = device_data_resp['resource'] + hw_version = device_data.get('hw version', '') + app_id = device_data.get('app-id', '') + kernel = device_data.get('kernel', '') + + if 'Apple' in hw_version and app_id != '' and (app_id != '0' or kernel == ''): + logger.info("%s is an iOS device. Currently, we do not support iOS devices.", device) + else: + filtered_list.append(device) + + except Exception as e: + logger.exception(f"Error processing device {device}: {e}") + continue + + if isinstance(device_list, str): + filtered_list = ','.join(filtered_list) + + self.device_list = filtered_list + return filtered_list + + def select_real_devices(self, real_sta_list=None): + """ + Selects real devices for testing. + + Args: + - real_sta_list (list, optional): List of specific real station names to select for testing. + + Returns: + - list: List of selected real station names for testing. + """ + final_device_list = [] + self.realdevice.get_devices() + + # Retrieve real station list + if real_sta_list is None: + self.real_sta_list, _, _ = self.realdevice.query_user() + else: + if not self.do_webui: + interface_data = self.json_get("/port/all") + interfaces = interface_data["interfaces"] + real_sta_list = [sta.strip() for sta in real_sta_list.split(',') if sta.strip()] + for device in real_sta_list: + for interface_dict in interfaces: + for key, value in interface_dict.items(): + key_parts = key.split(".") + extracted_key = ".".join(key_parts[:2]) + if ( + extracted_key == device + and not value["phantom"] + and not value["down"] + and value["parent dev"] != "" + and value["ip"] != "0.0.0.0" + ): + final_device_list.append(key) + break + + self.real_sta_list = final_device_list + else: + self.real_sta_list = real_sta_list.split(',') + + # Abort if no stations + if len(self.real_sta_list) == 0: + logger.error("There are no real devices in this testbed. Aborting test") + exit(0) + + self.realdevice.get_devices() + self.real_sta_list = self.filter_ios_devices(self.real_sta_list) + + if len(self.real_sta_list) == 0: + logger.error("There are no real devices in this testbed. Aborting test") + exit(0) + + # Filter and store device data + for sta_name in self.real_sta_list[:]: + if sta_name not in self.realdevice.devices_data: + logger.error(f"Real station '{sta_name}' not in devices data, ignoring it from testing") + self.real_sta_list.remove(sta_name) + continue + self.real_sta_data_dict[sta_name] = self.realdevice.devices_data[sta_name] + + # Populate OS types and hostnames + self.real_sta_os_types = [ + self.real_sta_data_dict[name]['ostype'] for name in self.real_sta_data_dict + ] + self.real_sta_hostname = [ + self.real_sta_data_dict[name]['hostname'] for name in self.real_sta_data_dict + ] + self.hostname_os_combination = [ + f"{hostname} ({os_type})" + for hostname, os_type in zip(self.real_sta_hostname, self.real_sta_os_types) + ] + self.wifi_interfaces = [item.split('.')[2] for item in self.real_sta_list] + + # Count OS types + for os_type in self.real_sta_os_types: + if os_type == 'windows': + self.windows += 1 + elif os_type == 'linux': + self.linux += 1 + elif os_type == 'macos': + self.mac += 1 + logger.info(f"Selected Real Devices: {self.real_sta_list}") + + return self.real_sta_list + + # Load the credentials on server startup + def load_credentials(self): + with open('teams_cred.csv', newline='') as csvfile: + reader = csv.DictReader(csvfile) + self.credentials = list(reader) + + def move_csv_files(self): + for file in os.listdir(self.path): + if file.endswith(".csv"): + src = os.path.join(self.path, file) + dest = os.path.join(self.report_path_date_time, file) + shutil.move(src, dest) + + def shutdown(self): + """ + Gracefully shut down the application. + """ + logging.info("Initiating graceful shutdown...") + + self.stop_signal = True + time.sleep(10) + logging.info("Exiting the application.") + os._exit(0) + + def start_flask_server(self): + + @self.app.route('/check_stop', methods=['GET']) + def check_stop(): + return jsonify({"stop": self.stop_signal}) + + @self.app.route('/get_credentials', methods=['GET']) + def get_credentials(): + if self.cred_index < len(self.credentials): + row = self.credentials[self.cred_index] + self.cred_index += 1 + return jsonify({ + "email": row['email'], + "password": row['password'] + }) + else: + logging.error("Not enough credentials for devices") + return jsonify({"log": "Not enough credentials for devices"}), 404 + + @self.app.route('/test_server', methods=['GET']) + def test_server_status(): + return jsonify({"status": "Server is running"}), 200 + + @self.app.route('/meeting_link', methods=['GET', 'POST']) + def meeting_link(): + if request.method == 'GET': + return jsonify({"meet_link": self.meet_link}) + elif request.method == 'POST': + data = request.json + self.meet_link = data.get('meet_link', '') + logger.info(f"Meeting Link Updated: {self.meet_link}") + return jsonify({"message": "Meeting Link Updated sucessfully"}) + + @self.app.route('/login_completed', methods=['POST']) + def login_completed(): + if request.method == 'POST': + data = request.json + login_completed_status = int(data.get('login_completed', 0)) + self.login_completed = bool(login_completed_status) + return jsonify({"message": f"Updated login_completed status to {bool(login_completed_status)}"}) + + @self.app.route('/get_participants_joined', methods=['GET']) + def get_participants_joined(): + return jsonify({"participants": self.participants_joined}) + + @self.app.route('/set_participants_joined', methods=['POST']) + def set_participants_joined(): + data = request.json + self.participants_joined = data.get('participants_joined', None) + return jsonify({"message": f"Updated participants jopind status to {self.participants_joined}"}) + + @self.app.route('/get_participants_req', methods=['GET']) + def get_participants_req(): + return jsonify({"participants": self.participants_req}) + + @self.app.route('/test_started', methods=['GET', 'POST']) + def test_started(): + if request.method == 'GET': + return jsonify({"test_started": self.test_start}) + elif request.method == 'POST': + data = request.json + self.test_start = data.get('test_started', False) + return jsonify({"message": f"Updated test_start status to {self.test_start}"}) + + @self.app.route('/get_start_end_time', methods=['GET']) + def get_start_end_time(): + return jsonify({ + "start_time": self.start_time.isoformat() if self.start_time is not None else None, + "end_time": self.end_time.isoformat() if self.end_time is not None else None + }) + + @self.app.route('/stats_opt', methods=['GET']) + def stats_to_be_collected(): + return jsonify({ + 'audio_stats': self.audio, + "video_stats": self.video + }) + + @self.app.route('/stop_teams', methods=['GET']) + def stop_teams(): + """ + Endpoint to stop the Zoom test and trigger a graceful application shutdown. + """ + logging.info("Stopping the test through web UI") + self.stop_signal = True + # Respond to the client + response = jsonify({"message": "Stopping Teams Test"}) + response.status_code = 200 + # Trigger shutdown in a separate thread to avoid blocking + shutdown_thread = threading.Thread(target=self.shutdown) + shutdown_thread.start() + return response + + @self.app.route('/upload_stats', methods=['POST']) + def upload_stats(): + data = request.json + + for hostname, stats in data.items(): + self.data_store[hostname] = stats + + csv_file = os.path.join(self.path, f'{hostname}.csv') + with open(csv_file, mode='a', newline='') as file: + writer = csv.writer(file) + + if os.path.getsize(csv_file) == 0: + writer.writerow( + self.header + ) + timestamp = stats.get('timestamp', '') + if self.audio and self.video: + audio = stats.get('audio_stats', {}) + video = stats.get('video_stats', {}) + row = [ + timestamp, + audio.get("au_sent_bitrate", 0), + audio.get("au_sent_pkts", 0), + audio.get("au_rtt", 0), + audio.get("au_sent_codec", "NA"), + audio.get("au_recv_jitter", 0), + audio.get("au_recv_pkt_loss", 0), + audio.get("au_recv_pkts", 0), + audio.get("au_recv_codec", "NA"), + video.get("vi_sent_bitrate", 0), + video.get("vi_recv_bitrate", 0), + video.get("vi_sent_frame_rate", 0), + video.get("vi_sent_res", "NA"), + video.get("vi_rtt", 0), + video.get("vi_sent_pkts", 0), + video.get("vi_sent_codec", "NA"), + video.get("vi_processing", "NA"), + ] + elif self.audio: + audio = stats.get('audio_stats', {}) + row = [ + timestamp, + audio.get("au_sent_bitrate", 0), + audio.get("au_sent_pkts", 0), + audio.get("au_rtt", 0), + audio.get("au_sent_codec", "NA"), + audio.get("au_recv_jitter", 0), + audio.get("au_recv_pkt_loss", 0), + audio.get("au_recv_pkts", 0), + audio.get("au_recv_codec", "NA"), + ] + + elif self.video: + video = stats.get('video_stats', {}) + row = [ + timestamp, + video.get("vi_sent_bitrate", 0), + video.get("vi_recv_bitrate", 0), + video.get("vi_sent_frame_rate", 0), + video.get("vi_sent_res", "NA"), + video.get("vi_rtt", 0), + video.get("vi_sent_pkts", 0), + video.get("vi_sent_codec", "NA"), + video.get("vi_processing", "NA"), + ] + writer.writerow(row) + + return jsonify({"status": "success"}), 200 + + try: + self.app.run(host='0.0.0.0', port=5005, debug=True, threaded=True, use_reloader=False) + except Exception as e: + logging.info(f"Error starting Flask server: {e}") + sys.exit(0) + + def create_avg_data(self): + output_file = os.path.join(self.path, "teams_call_avg_data.csv") + summary_rows = [] + + for csv_path in glob.glob(os.path.join(self.path, "*.csv")): + if csv_path.endswith("teams_cred.csv"): + continue + df = pd.read_csv(csv_path) + + device_name = os.path.splitext(os.path.basename(csv_path))[0] + df = df.drop(columns=["timestamp"], errors="ignore") + + numeric_cols = df.select_dtypes(include="number").columns + averages = df[numeric_cols].mean().round(2) + + row = averages.to_dict() + row["Device Name"] = device_name + summary_rows.append(row) + + summary_df = pd.DataFrame(summary_rows) + + cols = ["Device Name"] + [col for col in summary_df.columns if col != "Device Name"] + summary_df = summary_df[cols] + + summary_df.to_csv(output_file, index=False) + logger.info(f"Avg data saved to {output_file}") + + def stop_test_in_webui(self): + try: + url = f"http://{self.lanforge_ip}:5454/update_status_yt" + headers = { + 'Content-Type': 'application/json', + } + + data = { + 'status': 'Completed', + 'name': self.test_name + } + + response = requests.post(url, json=data, headers=headers) + + if response.status_code == 200: + logging.info("Successfully updated STOP status to 'Completed'") + pass + else: + logging.error(f"Failed to update STOP status: {response.status_code} - {response.text}") + + except Exception as e: + logging.error(f"An error occurred while updating status: {e}") + + +def main(): + try: + + parser = argparse.ArgumentParser( + prog='lf_interop_teams.py', + formatter_class=argparse.RawTextHelpFormatter, + epilog=''' Allows user to run the Microsoft Teams Call test on a target resource for the given duration. ''', + description=""" + NAME: lf_interop_teams.py + + PURPOSE: lf_interop_teams.py provides the available devices and allows the user to start Microsoft Teams call conference meeting for the user-specified duration + + EXAMPLE-1: + Command Line Interface to run Teams: + python3 lf_interop_teams.py --mgr 192.168.204.75 --upstream_port 1.1.eth1 --participants 3 --duration 1 --audio --video + + EXAMPLE-2: + Command Line Interface to run Teams on Specified Resources: + python3 lf_interop_teams.py --mgr 192.168.204.75 --upstream_port 1.1.eth1 --participants 3 --duration 1 --audio --video --resources 1.95,1.400,1.300 + + + NOTES: + 1. Use 'python3 lf_interop_teams.py --help' to see command line usage and options. + 2. Always specify the duration in minutes (for example: --duration 3 indicates a duration of 3 minutes). + 3. If --resources are not given after passing the CLI, a list of available devices will be displayed on the terminal. + 4. Enter the resource numbers separated by commas (,) in the resource argument Eg: (1.95,1.200). + + + """) + + # Define required arguments group + required = parser.add_argument_group('Required arguments') + # Define optional arguments group + optional = parser.add_argument_group('Optional arguments') + + required.add_argument('--mgr', type=str, help="hostname where LANforge GUI is running", required=True) + required.add_argument('--duration', type=int, help='duration to run the test in min', required=True) + required.add_argument('--upstream_port', type=str, help='Specify The Upstream Port name or IP address', required=True) + required.add_argument('--participants', type=int, help='No of Devices in the test', required=True) + + # Add optional arguments + optional.add_argument('--resources', help='Specify the real device ports seperated by comma') + optional.add_argument('--no_pre_cleanup', action="store_true", help='specify this flag to stop cleaning up generic cxs before the test') + optional.add_argument('--no_post_cleanup', action="store_true", help='specify this flag to stop cleaning up generic cxs after the test') + optional.add_argument('--log_level', help='Level of the logs to be dispalyed', default='info') + optional.add_argument('--lf_logger_config_json', help='lf_logger config json') + optional.add_argument('--audio', action='store_true') + optional.add_argument('--video', action='store_true') + optional.add_argument('--do_webUI', action='store_true', help='useful to specify whether we are running through webui or cli') + optional.add_argument('--testname', help="report directory while running test through web ui") + optional.add_argument('--report_dir', help="report directory while running test through web ui") + + args = parser.parse_args() + + # set the logger level to debug + logger_config = lf_logger_config.lf_logger_config() + + if args.log_level: + logger_config.set_level(level=args.log_level) + + if args.lf_logger_config_json: + logger_config.lf_logger_config_json = args.lf_logger_config_json + logger_config.load_lf_logger_config() + + teams = TeamsAutomation( + lanforge_ip=args.mgr, + duration=args.duration, + upstream_port=args.upstream_port, + no_pre_cleanup=args.no_pre_cleanup, + no_post_cleanup=args.no_post_cleanup, + participants_req=args.participants, + audio=args.audio, + video=args.video, + do_webui=args.do_webUI, + test_name=args.testname, + report_dir=args.report_dir + + ) + + teams.realdevice = RealDevice(manager_ip=args.mgr, + server_ip="192.168.1.61", + ssid_2g='Test Configured', + passwd_2g='', + encryption_2g='', + ssid_5g='Test Configured', + passwd_5g='', + encryption_5g='', + ssid_6g='Test Configured', + passwd_6g='', + encryption_6g='', + selected_bands=['5G']) + + teams.select_real_devices(real_sta_list=args.resources) + if args.do_webUI: + teams.path = args.report_dir + teams.update_webui_data() + teams.load_credentials() + teams.run() + time.sleep(10) + teams.create_avg_data() + teams.execute_finally = True + + except Exception as e: + logging.error(f"AN ERROR OCCURED WHILE RUNNING TEST {e}") + traceback.print_exc() + + finally: + if not ('--help' in sys.argv or '-h' in sys.argv): + if teams.execute_finally: + teams.stop_signal = True + teams.generate_report() + teams.move_csv_files() + if args.do_webUI: + teams.stop_test_in_webui() + logger.info("Waiting for Browser Cleanup at Client Side") + time.sleep(10) + logger.info("Browser Cleanup Completed") + if not teams.no_post_cleanup: + teams.generic_endps_profile.cleanup() + logger.info("Test Completed") + + +if __name__ == "__main__": + main() diff --git a/py-scripts/run_cv_scenario.py b/py-scripts/run_cv_scenario.py index 79ff28c15..cf0cd36b5 100755 --- a/py-scripts/run_cv_scenario.py +++ b/py-scripts/run_cv_scenario.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa # This script will set the LANforge to a BLANK database then it will load the specified database # and start a graphical report import logging @@ -36,6 +35,7 @@ # configure the test profile with auto save selected so that # the auto_save parameter does not toggle on and off + class RunCvScenario(LFCliBase): def __init__(self, lfhost="localhost", lfport=8080, debug_=False, lanforge_db_=None, cv_scenario_=None, cv_test_=None, test_scenario_=None, report_file_name=None): @@ -51,7 +51,7 @@ def __init__(self, lfhost="localhost", lfport=8080, debug_=False, lanforge_db_=N self.report_verbosity = None self.leave_test_open = False self.toggle_autosave = False - self.set_autosave = None; + self.set_autosave = None self.click_save = False self.commands_pre: list = [] self.commands_start: list = [] @@ -134,7 +134,7 @@ def wait_for_db_load_and_sync(self): for event_o in events_response[pronoun]: if load_completed: break - for (key, record) in event_o.items(): + for (_, record) in event_o.items(): if "event description" not in record: continue if not record["event description"]: @@ -192,13 +192,13 @@ def start(self, debug_=False): commands = [] if self.cv_scenario and self.cv_scenario != "DFLT": commands.extend(["cv sync", - "sleep 4", - "cv apply '%s'" % self.cv_scenario, - "sleep 4", - "cv build", - "sleep 4", - "cv is_built", - ]) + "sleep 4", + "cv apply '%s'" % self.cv_scenario, + "sleep 4", + "cv build", + "sleep 4", + "cv is_built", + ]) commands.extend(["cv sync", "echo - waiting to sync", "sleep 4", @@ -325,7 +325,7 @@ def main(): formatter_class=argparse.RawTextHelpFormatter, description="""Chamber View testing script: Load a Chamber View (CV) scenario, build it, and run a test. -Example of loading a CV scenario, build it, and run the WiFi Capacity +Example of loading a CV scenario, build it, and run the WiFi Capacity test using a previously saved profile: ./run_cv_scenario.py --lfmgr 127.0.0.1 --lanforge_db 'handsets' \\ --cv_scenario Mobile20 \\ @@ -334,7 +334,7 @@ def main(): Example of running a WiFi Capacity test using the current CV scenario. This combination of parameters will not re-generate the present CV scenario: - ./run_cv_scenario.py --lanforge_db DFLT \\ + ./run_cv_scenario.py --lanforge_db DFLT \\ --cv_scenario CURRENT \\ --cv_test 'WiFi Capacity' \\ --test_profile DEFAULT @@ -378,7 +378,7 @@ def main(): "every time you load test profile DEFAULT, Auto Save Report will be enabled " "every second time.") parser.add_argument("--enable_auto_save", default=False, action="store_true", - help="Enable the Auto Save Report checkbox. "); + help="Enable the Auto Save Report checkbox. ") parser.add_argument("--click_save", default=False, action="store_true", help="Show the save-report dialog as if you clicked 'Save HTML'. " "Both the HTML and PDF reports are created, " @@ -409,8 +409,7 @@ def main(): help="name of the report file") parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - - help_summary='''\ + help_summary = '''\ Chamber View testing script: Load a Chamber View (CV) scenario, build it, and run a test. ''' @@ -427,8 +426,6 @@ def main(): if args.debug is not None: debug = args.debug - - report_file_n = "untitled_report" if args.report_file_name: report_file_n = args.report_file_name diff --git a/py-scripts/run_voip_cx.py b/py-scripts/run_voip_cx.py index 0bf4bfdd3..5a0337bd9 100755 --- a/py-scripts/run_voip_cx.py +++ b/py-scripts/run_voip_cx.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ This script will start a named set of voip connections and report their data to a csv file @@ -36,16 +35,16 @@ import time import traceback # from time import sleep -from pprint import pprint +from pprint import pprint # noqa:F811 if sys.version_info[0] != 3: print("This script requires Python 3") exit(1) sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lanforge_api = importlib.import_module("lanforge_client.lanforge_api") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand -from lanforge_client.lanforge_api import LFJsonQuery +from lanforge_client.lanforge_api import LFSession # noqa: E402 +from lanforge_client.lanforge_api import LFJsonCommand # noqa: E402 +from lanforge_client.lanforge_api import LFJsonQuery # noqa: E402 logger = logging.getLogger(__name__) @@ -83,7 +82,7 @@ def num_calls(self): @num_calls.setter def num_calls(self, num_calls: str): """Set number of calls for endpoint when in loop mode.""" - self._num_calls= num_calls + self._num_calls = num_calls @property def phone_num(self): @@ -220,6 +219,7 @@ def __init_csv_output(self, csv_file: str): self.last_written_row = 0 except Exception as e: traceback.print_exc() + pprint(['exception:', e]) exit(1) def __initialize_voip_cxs(self, cx_names_str: str, **kwargs): @@ -245,13 +245,13 @@ def __initialize_voip_cxs(self, cx_names_str: str, **kwargs): # If only one CX and is 'all' or 'ALL', user specified to use all VoIP CXs. # Check for equality, as want to make sure user can specify # a cx name with string 'all' or 'ALL' in it. - if len(cx_list) == 1 and (cx_list[0] == "all") or (cx_list[0]== "ALL"): - logger.debug(f"Querying all VoIP CXs") + if len(cx_list) == 1 and (cx_list[0] == "all") or (cx_list[0] == "ALL"): + logger.debug("Querying all VoIP CXs") else: logger.debug(f"Querying parsed VoIP CXs: {cx_list}") # TODO: Don't hardcode endpoint names - #queried_endps = self.__query_voip_endps(endp_list=["all"]) + # queried_endps = self.__query_voip_endps(endp_list=["all"]) queried_cxs = self.__query_voip_cxs(cx_list=cx_list) for queried_cx in queried_cxs: @@ -373,7 +373,6 @@ def __configure_voip_endps(self, **kwargs): logger.error(f"Error configuring endpoint \'{endp.name}\'") logger.error(pprint(['exception:', e, e_w_list])) - def __query_voip_cxs(self, cx_list: list, columns: list = ["name"]): """Query and return all VoIP CXs.""" e_w_list: list = [] @@ -394,7 +393,6 @@ def __query_voip_cxs(self, cx_list: list, columns: list = ["name"]): return response - def __query_voip_endps(self, endp_list: list, columns: list = ["name"]): """Query and return all VoIP endpoints.""" e_w_list: list = [] @@ -417,7 +415,7 @@ def __query_voip_endps(self, endp_list: list, columns: list = ["name"]): def start(self): """Start specified VoIP CXs.""" - logger.debug(f"Starting CXs") + logger.debug("Starting CXs") e_w_list: list = [] lf_cmd: LFJsonCommand = self.lfsession.get_command() @@ -429,10 +427,10 @@ def start(self): try: logger.debug(f"Starting CX \'{cx_name}\'") lf_cmd.post_set_cx_state(cx_name=cx_name, - test_mgr='ALL', - suppress_related_commands=True, - cx_state=lf_cmd.SetCxStateCxState.RUNNING.value, - errors_warnings=e_w_list) + test_mgr='ALL', + suppress_related_commands=True, + cx_state=lf_cmd.SetCxStateCxState.RUNNING.value, + errors_warnings=e_w_list) except Exception as e: pprint(['exception:', e, "cx:", cx_name, e_w_list]) @@ -483,22 +481,22 @@ def monitor(self): # stop until endpoints actually starts the test else script terminates early. while wait_flag_A or wait_flag_B: response = lf_query.get_voip_endp(eid_list=all_endps, - debug=False, - errors_warnings=e_w_list) + debug=False, + errors_warnings=e_w_list) if not response: - # pprint(e_w_list) - raise ValueError("unable to find endpoint data") + # pprint(e_w_list) + raise ValueError("unable to find endpoint data") for entry in response: name = list(entry.keys())[0] record = entry[name] - if "-A" in name: # endp A + if "-A" in name: # endp A if "Stopped" != record['state']: wait_flag_A = False - if "-B" in name: # endp B + if "-B" in name: # endp B if "Stopped" != record['state']: wait_flag_B = False @@ -522,18 +520,18 @@ def monitor(self): record = entry[name] # print(f"checking {name}, ", end=None) - if "-A" in name: # endp A + if "-A" in name: # endp A if (int(record['mos-lqo#']) == 0) and (float(record['mos-lqo']) != 0): if (append_row_zero_endp_A_flag): - self.append_to_csv(ep_name=name, ep_record=record) # check record + self.append_to_csv(ep_name=name, ep_record=record) # check record append_row_zero_endp_A_flag = False if int(record['mos-lqo#']) != old_mos_value_A: self.append_to_csv(ep_name=name, ep_record=record) old_mos_value_A = int(record['mos-lqo#']) - if "-B" in name: # endp B + if "-B" in name: # endp B if (int(record['mos-lqo#']) == 0) and (float(record['mos-lqo']) != 0): if append_row_zero_endp_B_flag: @@ -619,13 +617,13 @@ def parse_args(): "Order and length must match the order of connections passed in the " "\'--cx_list\' argument.", nargs="*") - parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') + parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') return parser.parse_args() def main(): - help_summary='''\ + help_summary = '''\ This script will start a named set of voip connections and report their data to a csv file ''' args = parse_args() diff --git a/py-scripts/rvr_scenario.py b/py-scripts/rvr_scenario.py index 259db1272..7baf3c28d 100755 --- a/py-scripts/rvr_scenario.py +++ b/py-scripts/rvr_scenario.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa # This script will set the LANforge to a BLANK database then it will load the specified database # and start a graphical report import sys @@ -181,17 +180,15 @@ def main(): parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - args = parser.parse_args() - help_summary='''\ + help_summary = '''\ LANforge Reporting Script: Load a scenario and run a RvR report. ''' if args.help_summary: print(help_summary) exit(0) - if not args.cv_scenario or not args.cv_test or not args.test_profile: print("Warning: --cv_scenario , --cv_test and --test_settings required ") exit(1) diff --git a/py-scripts/sandbox/README.md b/py-scripts/sandbox/README.md index 9cf8a163c..7c9193d47 100644 --- a/py-scripts/sandbox/README.md +++ b/py-scripts/sandbox/README.md @@ -1,3 +1,4 @@ # LANforge Scripts Sandbox Staging area for new LANforge scripts, in various states of functionality. +These scripts generally are not included in automated code quality checks. diff --git a/py-scripts/bandsteering.py b/py-scripts/sandbox/bandsteering.py similarity index 96% rename from py-scripts/bandsteering.py rename to py-scripts/sandbox/bandsteering.py index 4e5e9c272..d7867b005 100755 --- a/py-scripts/bandsteering.py +++ b/py-scripts/sandbox/bandsteering.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ This script is to run check Band Steering. @@ -18,8 +17,8 @@ sys.path.append(os.path.join(os.path.abspath('..'), 'py-json')) from LANforge.lfcli_base import LFCliBase from LANforge import LFUtils +# import realm from realm import Realm -import realm import pprint from lf_report import lf_report @@ -76,7 +75,7 @@ def __init__(self, self.number_template = _number_template self.debug = _debug_on self.up = _up - self.traffic_type=_traffic_type + self.traffic_type = _traffic_type self.set_txo_data = _set_txo_data self.station_profile = self.new_station_profile() self.cx_profile = self.new_l3_cx_profile() @@ -111,7 +110,7 @@ def precleanup(self): def build(self): if not self.port_exists("sta0000"): - # Build stations + # Build stations self.station_profile.use_security(self.security, self.ssid, self.password) self.station_profile.set_number_template(self.number_template) @@ -141,11 +140,11 @@ def build(self): def run(self): if self.wait_for_ip(self.sta_list): - print("Stations got IP") - url = "/port/1/1/sta0000/channel?fields=channel" - channel = self.json_get(url, debug_=False)['interface'] + print("Stations got IP") + url = "/port/1/1/sta0000/channel?fields=channel" + channel = self.json_get(url, debug_=False)['interface'] else: - raise Exception("failed to get ip for stations") + raise Exception("failed to get ip for stations") # Build stations self.station_profile.use_security(self.security, self.ssid, self.password) self.station_profile.set_number_template(self.number_template) @@ -202,7 +201,8 @@ def run(self): def get_data(self): # x-axis iterations, y-axis station mode mode = [] - iterations = self.iter + # iterations = self.iter + self.iter sta_names = self.get_station_names() sta_names.pop(0) for sta in sta_names: @@ -308,17 +308,17 @@ def main(): This script is used to check the bandsteering , if the stations are getting connected to 2.4GHz and 5GHz. ''' parser = LFCliBase.create_basic_argparse( - prog='bs_obj.py', + prog='bandsteering.py', formatter_class=argparse.RawTextHelpFormatter, epilog='''\ Create stations ''', description='''\ - bs_obj.py + bandsteering.py -------------------- Command example: -./bs_obj.py +./bandsteering.py --radio wiphy0 --radio_2g wiphy1 --radio_5g wiphy2 @@ -328,7 +328,8 @@ def main(): --passwd BLANK --debug ''') - required = parser.add_argument_group('required arguments') + # required = parser.add_argument_group('required arguments') + parser.add_argument_group('required arguments') # required.add_argument('--security', help='WiFi Security protocol: < open | wep | wpa | wpa2 | wpa3 >', required=True) parser.add_argument("--radio_2g", help="radio for 2.4 Ghz") parser.add_argument("--radio_5g", help="radio for 5 Ghz") @@ -395,4 +396,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/sandbox/cmr_ap_asus_mod.py b/py-scripts/sandbox/cmr_ap_asus_mod.py index 702d22318..82eccc433 100644 --- a/py-scripts/sandbox/cmr_ap_asus_mod.py +++ b/py-scripts/sandbox/cmr_ap_asus_mod.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa """ diff --git a/py-scripts/sandbox/lf_check_ap.py b/py-scripts/sandbox/lf_check_ap.py index 3a9f389e7..95a554ad1 100755 --- a/py-scripts/sandbox/lf_check_ap.py +++ b/py-scripts/sandbox/lf_check_ap.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/py-scripts/sandbox/lf_check_igg.py b/py-scripts/sandbox/lf_check_igg.py index 5f3fdb5f2..363a72341 100755 --- a/py-scripts/sandbox/lf_check_igg.py +++ b/py-scripts/sandbox/lf_check_igg.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/py-scripts/sandbox/lf_json_autogen_test.py b/py-scripts/sandbox/lf_json_autogen_test.py index b9559f00b..66ceed811 100644 --- a/py-scripts/sandbox/lf_json_autogen_test.py +++ b/py-scripts/sandbox/lf_json_autogen_test.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/py-scripts/lf_rssi_check.py b/py-scripts/sandbox/lf_rssi_check.py similarity index 96% rename from py-scripts/lf_rssi_check.py rename to py-scripts/sandbox/lf_rssi_check.py index 9a9891304..92931a3e3 100755 --- a/py-scripts/lf_rssi_check.py +++ b/py-scripts/sandbox/lf_rssi_check.py @@ -16,9 +16,9 @@ EXAMPLE: - Usage something like: rssi_check.py --channels “6 36” --antenna “0 1 4 7 8” --bw “20 40 80” --vap 1.1.vap0 --stas “1.2.wlan0 1.2.wlan1” --attenuator 1.1.xxxx --attenuation_step 1 --step_duration + Usage something like: rssi_check.py --channels “6 36” --antenna “0 1 4 7 8” --bw “20 40 80” --vap 1.1.vap0 --stas “1.2.wlan0 1.2.wlan1” --attenuator 1.1.xxxx --attenuation_step 1 --step_duration Skip bw that does not match selected channels. - + increase attenuation until STA disconnects, then stop recording data there. It should be around RSSI -88, but part of this is to verify that. Implementation should be something like: @@ -37,7 +37,7 @@ If STA is disconnected, then do not record RSSI. Else record RSSI. Record theoretical RSSI (txpower minus calibrated path-loss minus attenuation) - + NOTES: @@ -148,6 +148,10 @@ INCLUDE_IN_README """ +from lanforge_client.logg import Logg +from lanforge_client.lanforge_api import LFJsonQuery +from lanforge_client.lanforge_api import LFJsonCommand +from lanforge_client.lanforge_api import LFSession import argparse import csv import datetime @@ -173,10 +177,6 @@ sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lanforge_api = importlib.import_module("lanforge_client.lanforge_api") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand -from lanforge_client.lanforge_api import LFJsonQuery -from lanforge_client.logg import Logg lf_report = importlib.import_module("py-scripts.lf_report") @@ -233,7 +233,7 @@ def __init__(self, rates_are_totals=False, mconn=1, vap_list='NA', - pathloss_list = ['0','0','0'], + pathloss_list=['0', '0', '0'], channels_list='-1', bandwidths_list='NA', antenna_list='0', @@ -261,8 +261,8 @@ def __init__(self, existing_station_lists=None, # ap module - ap_read = False, - ap_module = None, + ap_read=False, + ap_module=None, ap_test_mode=False, ap_ip=None, ap_user=None, @@ -277,20 +277,20 @@ def __init__(self, ap_if_6g="eth8", ap_report_dir="", ap_file="", - ap_band_list=['2g','5g','6g']): + ap_band_list=['2g', '5g', '6g']): # LANforge information - self.lfclient_host=lfclient_host - self.lfclient_port=lfclient_port + self.lfclient_host = lfclient_host + self.lfclient_port = lfclient_port self.lf_user = lf_user self.lf_passwd = lf_passwd # create api_json self.lanforge_radio_json = None self.radio_json_api = lf_json_api.lf_json_api(lf_mgr=self.lfclient_host, - lf_port=self.lfclient_port, - lf_user=self.lf_user, - lf_passwd=self.lf_passwd) + lf_port=self.lfclient_port, + lf_user=self.lf_user, + lf_passwd=self.lf_passwd) try: self.lanforge_radio_json, *nil = self.radio_json_api.get_request_radio_information() @@ -321,7 +321,6 @@ def __init__(self, self.query: LFJsonQuery self.query = self.session.get_query() - self.eth_endps = [] self.total_stas = 0 if side_a_min_rate is None: @@ -451,32 +450,31 @@ def __init__(self, self.ul_port_csv_files = {} self.ul_port_csv_writers = {} - # AP information + # AP information self.ap = None self.ap_obj = None self.ap_read = ap_read self.ap_module = ap_module - self.ap_test_mode=ap_test_mode - self.ap_ip=ap_ip - self.ap_user=ap_user - self.ap_passwd=ap_passwd - self.ap_scheme=ap_scheme - self.ap_serial_port=ap_serial_port - self.ap_ssh_port=ap_ssh_port - self.ap_telnet_port=ap_telnet_port - self.ap_serial_baud=ap_serial_baud - self.ap_if_2g=ap_if_2g - self.ap_if_5g=ap_if_5g - self.ap_if_6g=ap_if_6g - self.ap_report_dir=ap_report_dir - self.ap_file=ap_file - self.ap_band_list=ap_band_list - + self.ap_test_mode = ap_test_mode + self.ap_ip = ap_ip + self.ap_user = ap_user + self.ap_passwd = ap_passwd + self.ap_scheme = ap_scheme + self.ap_serial_port = ap_serial_port + self.ap_ssh_port = ap_ssh_port + self.ap_telnet_port = ap_telnet_port + self.ap_serial_baud = ap_serial_baud + self.ap_if_2g = ap_if_2g + self.ap_if_5g = ap_if_5g + self.ap_if_6g = ap_if_6g + self.ap_report_dir = ap_report_dir + self.ap_file = ap_file + self.ap_band_list = ap_band_list # AP information import the module if self.ap_read and self.ap_module is not None: ap_module = importlib.import_module(self.ap_module) - self.ap = ap_module.create_ap_obj( + self.ap = ap_module.create_ap_obj( ap_test_mode=self.ap_test_mode, ap_ip=self.ap_ip, ap_user=self.ap_user, @@ -496,8 +494,6 @@ def __init__(self, # this is needed to access the methods of the imported object self.ap.say_hi() - - else: logger.info("self.ap_read set to True and self.module is None, will set self.ap_read to False") self.ap_read = False @@ -579,7 +575,6 @@ def set_port_report_timer(self, port=None, milliseconds=1000): report_timer=int(milliseconds), debug=self.debug) - def get_results_csv(self): # print("self.csv_results_file {}".format(self.csv_results_file.name)) return self.csv_results_file.name @@ -653,7 +648,7 @@ def get_endp_stats_for_port(self, port_eid, endps): total_dl_rate += int(endp["rx rate"]) total_dl_rate_ll += int(endp["rx rate ll"]) total_dl_pkts_ll += int(endp["rx pkts ll"]) - dl_tx_drop_percent = round(endp["rx drop %"], 2) + # dl_tx_drop_percent = round(endp["rx drop %"], 2) # -B upload side else: total_ul_rate += int(endp["rx rate"]) @@ -900,7 +895,6 @@ def build(self, rebuild=False): def start(self, print_pass=False): - # at the beginning of the test set the attenuation or the stations will not # get an IP # TODO need to index though the attenuators @@ -910,7 +904,6 @@ def start(self, print_pass=False): atten_mod_test = lf_attenuator.CreateAttenuator(host=self.lfclient_host, port=self.lfclient_port, serno='all', idx='all', val=atten_val, _debug_on=self.debug) atten_mod_test.build() - logger.info("Bringing up stations") self.admin_up(self.side_b) for station_profile in self.station_profiles: @@ -1015,7 +1008,7 @@ def start(self, print_pass=False): if self.ap_read: for band in self.ap_band_list: - self.ap.clear_stats(band) + self.ap.clear_stats(band) # for selected channels # for selected bandwidths @@ -1028,9 +1021,7 @@ def start(self, print_pass=False): # If STA is disconnected, then do not record RSSI. Else record RSSI. # Record theoretical RSSI (txpower minus calibrated path-loss minus attenuation) - - - # selecting the vap should be here. + # selecting the vap should be here. for vap in self.vap_list: # vap could be 'NA' in the case of a real AP if vap != 'NA': @@ -1051,15 +1042,12 @@ def start(self, print_pass=False): self.set_port_report_timer(port=vap_radio, milliseconds=1000) self.set_port_report_timer(port=vap, milliseconds=1000) - - - for channel in self.channels_list: if int(channel) == -1: # TODO need to set the pathloss based on channel if channel set to auto logger.info("channel set to auto {channel} passloss set to self.pathloss[1]".format(channel=channel)) pathloss = self.pathloss_list[1] - elif int(channel) <= 11: + elif int(channel) <= 11: pathloss = self.pathloss_list[0] elif int(channel) <= 191: pathloss = self.pathloss_list[1] @@ -1075,13 +1063,13 @@ def start(self, print_pass=False): # if channel != 'NA': # TODO this nees to be refactored to radio_port_list - # defaulty is '-1' which is auto + # defaulty is '-1' which is auto modify_radio = lf_modify_radio.lf_modify_radio(lf_mgr=self.lfclient_host, - lf_port=self.lfclient_port, - lf_user=self.lf_user, - lf_passwd=self.lf_passwd, - debug=self.debug - ) + lf_port=self.lfclient_port, + lf_user=self.lf_user, + lf_passwd=self.lf_passwd, + debug=self.debug + ) shelf, resource, radio, *nil = LFUtils.name_to_eid(vap_radio) @@ -1094,52 +1082,51 @@ def start(self, print_pass=False): for bandwidth in self.bandwidths_list: if bandwidth == '20': lf_modify_vap = modify_vap.ModifyVAP(_host=self.lfclient_host, - _port=self.lfclient_port, - _vap_list=vap, - _enable_flags = ['disable_ht80','disable_ht40'], - _disable_flags = ['ht160_enable'] - ) + _port=self.lfclient_port, + _vap_list=vap, + _enable_flags=['disable_ht80', 'disable_ht40'], + _disable_flags=['ht160_enable'] + ) lf_modify_vap.set_vap() elif bandwidth == '40': lf_modify_vap = modify_vap.ModifyVAP(_host=self.lfclient_host, - _port=self.lfclient_port, - _vap_list=vap, # it is not a list it is a single vap - _enable_flags = ['disable_ht80'], - _disable_flags = ['disable_ht40','ht160_enable'], - ) + _port=self.lfclient_port, + _vap_list=vap, # it is not a list it is a single vap + _enable_flags=['disable_ht80'], + _disable_flags=['disable_ht40', 'ht160_enable'], + ) lf_modify_vap.set_vap() elif bandwidth == '80': lf_modify_vap = modify_vap.ModifyVAP(_host=self.lfclient_host, - _port=self.lfclient_port, - _vap_list=vap, - _enable_flags = ['disable_ht40'], - _disable_flags = ['disable_ht80','ht160_enable'], - ) + _port=self.lfclient_port, + _vap_list=vap, + _enable_flags=['disable_ht40'], + _disable_flags=['disable_ht80', 'ht160_enable'], + ) lf_modify_vap.set_vap() elif bandwidth == '160': lf_modify_vap = modify_vap.ModifyVAP(_host=self.lfclient_host, - _port=self.lfclient_port, - _vap_list=vap, - _enable_flags = ['ht160_enable'], - _disable_flags = ['disable_ht80','disable_ht40'], - ) + _port=self.lfclient_port, + _vap_list=vap, + _enable_flags=['ht160_enable'], + _disable_flags=['disable_ht80', 'disable_ht40'], + ) lf_modify_vap.set_vap() else: logger.info("No change to bw") - for antenna in self.antenna_list: - + # get the parent device for the vap shelf, resource, radio_name, *nil = LFUtils.name_to_eid(vap_radio) # add tx_power to set_wifi_radio modify_radio.set_wifi_radio(_resource=resource, - _radio=radio_name, - _shelf=shelf, - _antenna=antenna) + _radio=radio_name, + _shelf=shelf, + _antenna=antenna) - # Set the Attenuation Create the loops + # Set the Attenuation Create the loops # need to have atten start and atten step if len(self.atten_vals) == 0: atten = self.atten_start @@ -1156,10 +1143,10 @@ def start(self, print_pass=False): # TODO Need to be able to work with multiple attenuators # TODO the index is currently set to all for atten_idx in self.attenuators: - atten_mod_test = lf_attenuator.CreateAttenuator(host=self.lfclient_host, port=self.lfclient_port, serno='all', idx='all', val=atten_val, _debug_on=self.debug) + atten_mod_test = lf_attenuator.CreateAttenuator(host=self.lfclient_host, port=self.lfclient_port, serno='all', idx='all', val=atten_val, _debug_on=self.debug) # noqa: E501 atten_mod_test.build() - # TODO the realm version does not work + # TODO the realm version does not work # self.set_atten(atten_idx, atten_val) logger.info("Starting multicast traffic (if any configured)") @@ -1222,7 +1209,6 @@ def start(self, print_pass=False): self.ap.read_rx_ul_stats(band) self.ap.read_chanim_stats(band) - # Query all of ports # Note: the endp eid is : shelf.resource.port.endp-id port_eids = self.gather_port_eids() @@ -1231,7 +1217,6 @@ def start(self, print_pass=False): eid = self.name_to_eid(port_eid) url = "/port/%s/%s/%s" % (eid[0], eid[1], eid[2]) - # read LANforge to get the mac # reads the specific information for the response = self.json_get(url) @@ -1246,24 +1231,24 @@ def start(self, print_pass=False): mac = port_data['mac'] logger.debug("mac : {mac}".format(mac=mac)) - # search for data fro the port mac + # search for data fro the port mac tx_dl_mac_found, ap_row_tx_dl = self.ap.tx_dl_stats(mac) rx_ul_mac_found, ap_row_rx_ul = self.ap.rx_ul_stats(mac) xtop_reported, ap_row_chanim = self.ap.chanim_stats(mac) self.get_endp_stats_for_port(port_data["port"], endps) - + if tx_dl_mac_found: - logger.info("mac {mac} ap_row_tx_dl {ap_row_tx_dl}".format(mac=mac,ap_row_tx_dl = ap_row_tx_dl)) + logger.info("mac {mac} ap_row_tx_dl {ap_row_tx_dl}".format(mac=mac, ap_row_tx_dl=ap_row_tx_dl)) # Find latency, jitter for connections # using this port. - latency, jitter, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll, ul_rx_drop_percent, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, dl_rx_drop_percent = self.get_endp_stats_for_port( + latency, jitter, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll, ul_rx_drop_percent, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, dl_rx_drop_percent = self.get_endp_stats_for_port( # noqa: E501 port_data["port"], endps) ap_row_tx_dl.append(ap_row_chanim) - # port data contains RSSI and AP information - # note if AP is NA the information is not valid + # port data contains RSSI and AP information + # note if AP is NA the information is not valid # for RSSI testing then skip this information # TODO only a single sample for each period or should we take more # and do an average. @@ -1293,15 +1278,15 @@ def start(self, print_pass=False): total_dl_rate_ll, total_dl_pkts_ll, dl_rx_drop_percent, - ap_row_tx_dl) # this is where the AP data is added + ap_row_tx_dl) # this is where the AP data is added - # now report the ap_chanim_stats + # now report the ap_chanim_stats if rx_ul_mac_found: # Find latency, jitter for connections # using this port. # TODO just read and return the "port" - latency, jitter, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll, ul_rx_drop_percent, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, dl_tx_drop_percent = self.get_endp_stats_for_port( + latency, jitter, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll, ul_rx_drop_percent, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, dl_tx_drop_percent = self.get_endp_stats_for_port( # noqa: E501 port_data["port"], endps) self.write_ul_port_csv( len(temp_stations_list), @@ -1317,14 +1302,13 @@ def start(self, print_pass=False): total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll, - ul_rx_drop_percent, + ul_rx_drop_percent, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, dl_tx_drop_percent, ap_row_rx_ul) # ap_ul_row added - logger.info("ap_row_rx_ul {ap_row_rx_ul}".format(ap_row_rx_ul=ap_row_rx_ul)) #################################### @@ -1342,7 +1326,7 @@ def start(self, print_pass=False): for port_eid in port_eids: eid = self.name_to_eid(port_eid) url = "/port/%s/%s/%s" % (eid[0], - eid[1], eid[2]) + eid[1], eid[2]) response = self.json_get(url) if (response is None) or ( "interface" not in response): @@ -1351,15 +1335,13 @@ def start(self, print_pass=False): pprint(response) else: port_data = response['interface'] - latency, jitter, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll, ul_rx_drop_percent, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, dl_rx_drop_percent = self.get_endp_stats_for_port( + latency, jitter, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll, ul_rx_drop_percent, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, dl_rx_drop_percent = self.get_endp_stats_for_port( # noqa: E501 port_data["port"], endps) # from port eid get the parent radio - - - # port data contains RSSI and AP information - # note if AP is NA the information is not valid + # port data contains RSSI and AP information + # note if AP is NA the information is not valid # for RSSI testing then skip this information if port_data['ap'] != 'NA': self.write_port_csv( @@ -1370,7 +1352,7 @@ def start(self, print_pass=False): dl_pdu_str, atten_val, port_eid, - port_data, # This has additional data + port_data, # This has additional data vap, channel, pathloss, @@ -1389,39 +1371,36 @@ def start(self, print_pass=False): # TODO add collect layer 3 data - # Process all the data into png files + # Process all the data into png files port_eids = self.gather_port_eids() if self.use_existing_station_lists: port_eids.extend(self.existing_station_lists.copy()) - + for port_eid in port_eids: logger.debug("csv port files: {port_file}".format(port_file=self.port_csv_files[port_eid])) name = self.port_csv_files[port_eid].name if 'eth' not in name: self.port_csv_data.append(name) - + # read an element out of the list to get the parent directory self.png_directory = os.path.dirname(self.port_csv_data[0]) - + # all the station csv files have been gahtered logger.debug("csv_file_list{port_list}".format(port_list=self.port_csv_data)) rssi_process = lf_rssi_process.lf_rssi_process( - csv_file_list=self.port_csv_data, - png_dir=self.png_directory, # TODO read parent directory - bandwidths_list = self.bandwidths_list, - channel_list = self.channels_list, - antenna_list = self.antenna_list, - pathloss_list=self.pathloss_list - ) + csv_file_list=self.port_csv_data, + png_dir=self.png_directory, # TODO read parent directory + bandwidths_list=self.bandwidths_list, + channel_list=self.channels_list, + antenna_list=self.antenna_list, + pathloss_list=self.pathloss_list + ) rssi_process.read_all_csv_files() - # using the csv as a count + # using the csv as a count # process the collected csv data rssi_process.populate_signal_and_attenuation_data_create_png() - - - # TODO make all port csv files into one concatinated csv files # Create empty dataframe all_dl_ports_df = pd.DataFrame() @@ -1455,8 +1434,8 @@ def start(self, print_pass=False): all_dl_ports_stations_df.to_csv(all_dl_port_stations_file_name) # we should be able to add the values for each eid - all_dl_ports_stations_sum_df = all_dl_ports_stations_df.groupby(['Time epoch'])[['Rx-Bps','Tx-Bps','Rx-Latency','Rx-Jitter', - 'Ul-Rx-Goodput-bps','Ul-Rx-Rate-ll','Ul-Rx-Pkts-ll','Dl-Rx-Goodput-bps','Dl-Rx-Rate-ll','Dl-Rx-Pkts-ll']].sum() + all_dl_ports_stations_sum_df = all_dl_ports_stations_df.groupby(['Time epoch'])[['Rx-Bps', 'Tx-Bps', 'Rx-Latency', 'Rx-Jitter', + 'Ul-Rx-Goodput-bps', 'Ul-Rx-Rate-ll', 'Ul-Rx-Pkts-ll', 'Dl-Rx-Goodput-bps', 'Dl-Rx-Rate-ll', 'Dl-Rx-Pkts-ll']].sum() # noqa: E501 all_dl_ports_stations_sum_file_name = self.outfile[:-4] all_dl_port_stations_sum_file_name = all_dl_ports_stations_sum_file_name + "-dl-all-eids-sum-per-interval.csv" @@ -1471,12 +1450,10 @@ def start(self, print_pass=False): all_dl_ports_stations_sum_df['Dl-Rx-Goodput-bps-Diff'] = all_dl_ports_stations_sum_df['Dl-Rx-Goodput-bps'].diff() all_dl_ports_stations_sum_df['Dl-Rx-Rate-ll-Diff'] = all_dl_ports_stations_sum_df['Dl-Rx-Rate-ll'].diff() all_dl_ports_stations_sum_df['Dl-Rx-Pkts-ll-Diff'] = all_dl_ports_stations_sum_df['Dl-Rx-Pkts-ll'].diff() - + # write out the data all_dl_ports_stations_sum_df.to_csv(all_dl_port_stations_sum_file_name) - - # if there are multiple loops then delete the df del all_dl_ports_df @@ -1499,7 +1476,7 @@ def start(self, print_pass=False): # copy over all_ul_ports_df so as create a dataframe summ of the data for each iteration all_ul_ports_stations_df = all_ul_ports_df.copy(deep=True) - # drop rows that have eth + # drop rows that have eth all_ul_ports_stations_df = all_ul_ports_stations_df[~all_ul_ports_stations_df['Name'].str.contains('eth')] logger.info(pformat(all_ul_ports_stations_df)) @@ -1509,8 +1486,8 @@ def start(self, print_pass=False): all_ul_ports_stations_df.to_csv(all_ul_ports_stations_file_name) # we add all the values based on the epoch time - all_ul_ports_stations_sum_df = all_dl_ports_stations_df.groupby(['Time epoch'])[['Rx-Bps','Tx-Bps','Rx-Latency','Rx-Jitter', - 'Ul-Rx-Goodput-bps','Ul-Rx-Rate-ll','Ul-Rx-Pkts-ll','Dl-Rx-Goodput-bps','Dl-Rx-Rate-ll','Dl-Rx-Pkts-ll']].sum() + all_ul_ports_stations_sum_df = all_dl_ports_stations_df.groupby(['Time epoch'])[['Rx-Bps', 'Tx-Bps', 'Rx-Latency', 'Rx-Jitter', + 'Ul-Rx-Goodput-bps', 'Ul-Rx-Rate-ll', 'Ul-Rx-Pkts-ll', 'Dl-Rx-Goodput-bps', 'Dl-Rx-Rate-ll', 'Dl-Rx-Pkts-ll']].sum() # noqa: E501 all_ul_ports_stations_sum_file_name = self.outfile[:-4] all_ul_port_stations_sum_file_name = all_ul_ports_stations_sum_file_name + "-ul-all-eids-sum-per-interval.csv" @@ -1572,6 +1549,7 @@ def start(self, print_pass=False): "PASS: Requested-Rate: %s <-> %s PDU: %s <-> %s All tests passed" % (ul, dl, ul_pdu, dl_pdu), print_pass) # dl_values + def write_port_csv( self, sta_count, @@ -1580,7 +1558,7 @@ def write_port_csv( ul_pdu, dl_pdu, atten, - port_eid, # TODO this looks to be the alias + port_eid, # TODO this looks to be the alias port_data, vap, channel, @@ -1597,23 +1575,23 @@ def write_port_csv( total_dl_rate_ll, total_dl_pkts_ll, dl_rx_drop_percent, - ap_row_tx_dl = ''): + ap_row_tx_dl=''): row = [self.epoch_time, self.time_stamp(), sta_count, ul, ul, dl, dl, dl_pdu, dl_pdu, ul_pdu, ul_pdu, atten, port_eid ] - # TODO + # TODO # curl -XGET http://"$HOST":8080/port/1/2/"$STA_NAMES"?fields=rx-rate,signal,channel,ssid,ap,chain+rssi,avg+chain+rssi,mode | json_pp > "$OUTPUT_DIR/sta_data$TEST_INDEX.json" # find the parent radio and model of radio # TODO there needs to be an easier way port = port_data['port'] eid = self.name_to_eid(port) - # TODO the eth - port_eid_full = "{shelf}.{resource}.{port_name}".format(shelf=eid[0],resource=eid[1],port_name=port_data['alias']) + # TODO the eth + port_eid_full = "{shelf}.{resource}.{port_name}".format(shelf=eid[0], resource=eid[1], port_name=port_data['alias']) if 'eth' not in port_data['alias']: - parent_radio = "{shelf}.{resource}.{radio}".format(shelf=eid[0],resource=eid[1],radio=port_data['parent dev']) + parent_radio = "{shelf}.{resource}.{radio}".format(shelf=eid[0], resource=eid[1], radio=port_data['parent dev']) if self.lanforge_radio_json is not None: radio_model = self.lanforge_radio_json[parent_radio]['driver'].split('Driver:', maxsplit=1)[-1].split(maxsplit=1)[0] else: @@ -1622,14 +1600,13 @@ def write_port_csv( parent_radio = 'NA' radio_model = 'NA' - - logger.debug("sta_port: {sta} radio: {radio} radio model: {model}".format(sta=port_eid_full,radio=parent_radio,model=radio_model)) + logger.debug("sta_port: {sta} radio: {radio} radio model: {model}".format(sta=port_eid_full, radio=parent_radio, model=radio_model)) row = row + [port_data['bps rx'], port_data['bps tx'], port_data['rx-rate'], port_data['tx-rate'], - port_data['signal'], #RSSI + port_data['signal'], # RSSI port_data['channel'], port_data['ssid'], port_data['ap'], @@ -1716,7 +1693,7 @@ def write_ul_port_csv( # Add in info queried from AP. if self.ap_read: logger.debug("ap_row_rx_ul len {ap_row_rx_ul_len} ap_stats_ul_col_titles len {rx_col_len} ap_ul_row {ap_ul_row}".format( - ap_row_rx_ul_len=len(ap_row_rx_ul), rx_col_len=len(self.ap_stats_ul_col_titles), ap_ul_row = ap_row_rx_ul)) + ap_row_rx_ul_len=len(ap_row_rx_ul), rx_col_len=len(self.ap_stats_ul_col_titles), ap_ul_row=ap_row_rx_ul)) if len(ap_row_rx_ul) == len(self.ap_stats_ul_col_titles): logger.debug("ap_row_rx_ul {}".format(ap_row_rx_ul)) for col in ap_row_rx_ul: @@ -1727,7 +1704,6 @@ def write_ul_port_csv( writer.writerow(row) self.ul_port_csv_files[port_eid].flush() - def record_kpi_csv( self, sta_count, @@ -1862,7 +1838,6 @@ def set_attenuator(self, atten_val): atten_mod_test = lf_attenuator.CreateAttenuator(host=self.lfclient_host, port=self.lfclient_port, serno='all', idx='all', val=atten_val, _debug_on=self.debug) atten_mod_test.build() - @staticmethod def csv_generate_column_headers(): csv_rx_headers = ['Time epoch', 'Time', 'Monitor', 'UL-Min-Requested', 'UL-Max-Requested', 'DL-Min-Requested', @@ -2063,8 +2038,8 @@ def valid_endp_types(_endp_type): # note: when adding command line delimiters : +,=@ # https://stackoverflow.com/questions/37304799/cross-platform-safe-to-use-command-line-string-separator def main(): - lfjson_host = "localhost" - lfjson_port = 8080 + # lfjson_host = "localhost" + # lfjson_port = 8080 endp_types = "lf_udp" parser = argparse.ArgumentParser( @@ -2403,9 +2378,9 @@ def main(): ''') # the local_lf_report_dir is the parent directory of where the results are used with lf_check.py - parser.add_argument('--local_lf_report_dir', - help='--local_lf_report_dir override the report path (lanforge/html-reports), primary used when making another directory lanforge/html-report/', - default="") + parser.add_argument('--local_lf_report_dir', + help='--local_lf_report_dir override the report path (lanforge/html-reports), primary used when making another directory lanforge/html-report/', + default="") parser.add_argument( "--results_dir_name", default="lf_rssi_check", @@ -2490,7 +2465,6 @@ def main(): help='--lf_passwd default : lanforge', default='lanforge') - parser.add_argument( '--test_duration', help='--test_duration example --time 5d (5 days) default: 3m options: number followed by d, h, m or s', @@ -2577,7 +2551,7 @@ def main(): parser.add_argument( '--pathloss', - help='--pathloss, --pathloss <2g> <5g> <6g>, 2g measured at 26.74, 5g measured at 31.87 default : 0 0 0 this can be a list <2g loss> <5g loss> <6g loss>', + help='--pathloss, --pathloss <2g> <5g> <6g>, 2g measured at 26.74, 5g measured at 31.87 default : 0 0 0 this can be a list <2g loss> <5g loss> <6g loss>', default='0 0 0') parser.add_argument( @@ -2592,7 +2566,7 @@ def main(): # TODO need to know radio type parser.add_argument('--antennas', help=''' - --antennas list of antennas "0, 1, 4, 7, 8" default: + --antennas list of antennas "0, 1, 4, 7, 8" default: self.ANTENNA_LEGEND = { 0: 'Diversity (All)', 1: 'Fixed-A (1x1)', @@ -2601,7 +2575,7 @@ def main(): 8: 'ABCD (4x4)' } default is 0 - ''', default= 0) + ''', default=0) parser.add_argument( '--attenuators', @@ -2617,7 +2591,7 @@ def main(): '--atten_start', help='--atten_start, start of attenuator settings in ddb units (1/10 of db) , 200 is 20 dBm default: 200', default='200') - + parser.add_argument( '--atten_stop', help='--atten_stop, stop of attenuator settings in ddb units (1/10 of db) , 800 is 80 dBm default: 880, this is 88 dBm where the station should disconnect', @@ -2684,8 +2658,7 @@ def main(): parser.add_argument('--ap_band_list', help="--ap_band_list '2g,5g,6g' supported bands", default='2g,5g,6g') parser.add_argument('--help_summary', default=None, action="store_true", help='Show summary of what this script does') - - help_summary='''\ + help_summary = '''\ This script is used to validate RSSI for specific radios, currently a work in progress put on hold. ''' @@ -2694,7 +2667,6 @@ def main(): print(help_summary) exit(0) - # initialize pass / fail test_passed = False @@ -2759,7 +2731,6 @@ def main(): radios = args.radio else: radios = None - # Create report, when running with the test framework (lf_check.py) # results need to be in the same directory @@ -2908,7 +2879,7 @@ def main(): reset_port_time_max_list.append('0s') index = 0 - # TODO verify that is isn't a + # TODO verify that is isn't a for (radio_name_, number_of_stations_per_radio_) in zip( radio_name_list, number_of_stations_per_radio_list): number_of_stations = int(number_of_stations_per_radio_) @@ -2964,7 +2935,7 @@ def main(): # Todo list of VAP # TODO will all the radios be tested concurrently , then cannot break untill - # all radios receive a RSSI reading. + # all radios receive a RSSI reading. if args.vap == "": vap_list = [] else: @@ -3041,8 +3012,8 @@ def main(): no_cleanup=args.no_cleanup, use_existing_station_lists=args.use_existing_station_list, existing_station_lists=existing_station_lists, - ap_read = args.ap_read, - ap_module = args.ap_module, + ap_read=args.ap_read, + ap_module=args.ap_module, ap_test_mode=args.ap_test_mode, ap_ip=args.ap_ip, ap_user=args.ap_user, @@ -3057,9 +3028,9 @@ def main(): ap_if_6g=args.ap_if_6g, ap_report_dir="", ap_file=args.ap_file, - ap_band_list = args.ap_band_list.split(',') - - ) + ap_band_list=args.ap_band_list.split(',') + + ) if args.no_pre_cleanup or args.use_existing_station_list: logger.info("No station pre clean up any existing cxs on LANforge") @@ -3100,10 +3071,9 @@ def main(): logger.info("--no_cleanup or --no_stop_traffic set stations will be left intack") else: ip_var_test.cleanup() - + # put the Attenuator back to 20 dBm ip_var_test.set_attenuator(atten_val='200') - if ip_var_test.passes(): test_passed = True @@ -3217,5 +3187,3 @@ def main(): if __name__ == "__main__": main() - - diff --git a/py-scripts/lf_setup_radius_server.py b/py-scripts/sandbox/lf_setup_radius_server.py similarity index 99% rename from py-scripts/lf_setup_radius_server.py rename to py-scripts/sandbox/lf_setup_radius_server.py index 42c642e5c..7b85d714a 100755 --- a/py-scripts/lf_setup_radius_server.py +++ b/py-scripts/sandbox/lf_setup_radius_server.py @@ -124,7 +124,7 @@ def copy_certs(self): -parser = argparse.ArgumentParser(prog='lf_setup_radius_server.py', description='''lf_setup_radius_server.py: Summary +parser = argparse.ArgumentParser(prog='lf_setup_radius_server.py', description='''lf_setup_radius_server.py: Summary :This script will be able to add a configuration provided by the user to the Radius server's users configuration. ''') diff --git a/py-scripts/lf_test_max_association.py b/py-scripts/sandbox/lf_test_max_association.py similarity index 98% rename from py-scripts/lf_test_max_association.py rename to py-scripts/sandbox/lf_test_max_association.py index 2bc9703d2..cc8834f7d 100755 --- a/py-scripts/lf_test_max_association.py +++ b/py-scripts/sandbox/lf_test_max_association.py @@ -376,13 +376,13 @@ def layer3_connections(self): except ValueError: raise ValueError('Try setting the upstream port flag if your device does not have an eth1 port') - if type(self.layer3_columns) is not list: + if not isinstance(self.layer3_columns, list): self.layer3_columns = list(self.layer3_columns.split(",")) # send col names here to file to reformat else: self.layer3_columns = self.layer3_columns # send col names here to file to reformat - if type(self.port_mgr_columns) is not list: + if not isinstance(self.port_mgr_columns, list): self.port_mgr_columns = list(self.port_mgr_columns.split(",")) # send col names here to file to reformat else: @@ -600,13 +600,13 @@ def stop(self): logger.info("Stopping CX Traffic") self.cx_profile.stop_cx() end_time = time.ctime() - logger.info("Test End: %s", end_time) + logger.info("Test End: %s", end_time) # guide script during test run & collect data def run(self): self.start_cxs() start_time = time.ctime() - logger.info("Test Start: %s", start_time) + logger.info("Test Start: %s", start_time) # time.sleep(int(self.test_duration)) station_names = [] station_names.extend(self.station_profile.station_names.copy()) @@ -684,7 +684,7 @@ def record_kpi_csv( sta_list_len = len(sta_list) endp_list_len = len(endp_rx_map) - total_ul_dl_rate = total_ul_rate+total_dl_rate + total_ul_dl_rate = total_ul_rate + total_dl_rate # logic for Subtest-Pass & Subtest-Fail columns # 0 = FAIL, 1 = PASS (on kpi.csv output) @@ -889,10 +889,10 @@ def csv_add_column_headers(self): def main(): help_summary = '''\ - The Maximum Client Association Test is designed to test the capability of a newly built LANforge system. - The objective of the test is to create the maximum number of virtual station interfaces on the system installed WIFI + The Maximum Client Association Test is designed to test the capability of a newly built LANforge system. + The objective of the test is to create the maximum number of virtual station interfaces on the system installed WIFI radio, associate the stations to the specified AP and run a long duration layer-3 UDP bidirectional traffic test. - + The test will create stations, create CX traffic & run traffic specified time period and generate a report. ''' parser = argparse.ArgumentParser( @@ -910,31 +910,31 @@ def main(): - Create sta-to-eth Layer-3 CX for 9.6Kbps bidirectional overnight maximum-client wifi test. EXAMPLE: - # To run the test on specified time duration on all available radios + # To run the test on specified time duration on all available radios [Automatically detect the available radios in lanforge & will create the max supported radios on each radios.] - - ./lf_test_max_association.py --mgr 192.168.200.64 --ssid 208NETWORK --ssid_pw lanforge --security wpa2 - --csv_outfile ./lf_test_max_association --test_rig CT_01 --test_tag MAX_STA --dut_hw_version 1.0 - --dut_model_num ct521a--dut_sw_version 5.4.6 --dut_serial_num 361c --upstream_port 1.1.eth1 + + ./lf_test_max_association.py --mgr 192.168.200.64 --ssid 208NETWORK --ssid_pw lanforge --security wpa2 + --csv_outfile ./lf_test_max_association --test_rig CT_01 --test_tag MAX_STA --dut_hw_version 1.0 + --dut_model_num ct521a--dut_sw_version 5.4.6 --dut_serial_num 361c --upstream_port 1.1.eth1 --upload_bps 6200000 --download_bps 6200000 --test_duration 30s - + # To run the test based on specified time duration and radios - - ./lf_test_max_association.py --mgr 192.168.200.64 - --radio 'radio==1.1.wiphy0,ssid==208NETWORK,ssid_pw==lanforge,security==wpa2' - --radio 'radio==1.1.wiphy1,ssid==208NETWORK,ssid_pw==lanforge,security==wpa2' - --csv_outfile ./lf_test_max_association --test_rig CT_01 --test_tag MAX_STA - --dut_hw_version 1.0 --dut_model_num ct521a --dut_sw_version 5.4.6 --dut_serial_num 361c + + ./lf_test_max_association.py --mgr 192.168.200.64 + --radio 'radio==1.1.wiphy0,ssid==208NETWORK,ssid_pw==lanforge,security==wpa2' + --radio 'radio==1.1.wiphy1,ssid==208NETWORK,ssid_pw==lanforge,security==wpa2' + --csv_outfile ./lf_test_max_association --test_rig CT_01 --test_tag MAX_STA + --dut_hw_version 1.0 --dut_model_num ct521a --dut_sw_version 5.4.6 --dut_serial_num 361c --test_duration 30s --upstream_port 1.1.eth1 - + # To run overnight test using chambered AP's on specified radios only. - + ./lf_test_max_association.py --mgr --radio 'radio==1.1.wiphy0,ssid==,ssid_pw==,security==' --radio 'radio==1.1.wiphy1,ssid==,ssid_pw==,security==' --csv_outfile lf_test_max_association --test_rig CT_01 --test_tag MAX_STA --dut_hw_version 1.0 --dut_model_num lf0350 --dut_sw_version 5.4.5 --dut_serial_num 361c - + # For an overnight test using chambered AP's with no security enabled: ./lf_test_max_association.py --mgr --radio 'radio==1.1.wiphy0,ssid==,ssid_pw==[BLANK],security==open' diff --git a/py-scripts/sandbox/logger_example.py b/py-scripts/sandbox/logger_example.py index e2b3af1ac..d15371c4c 100755 --- a/py-scripts/sandbox/logger_example.py +++ b/py-scripts/sandbox/logger_example.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa import logging diff --git a/py-scripts/sandbox/logger_example_1.py b/py-scripts/sandbox/logger_example_1.py index 1d85044d5..735b2ccf7 100755 --- a/py-scripts/sandbox/logger_example_1.py +++ b/py-scripts/sandbox/logger_example_1.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa import logging diff --git a/py-scripts/modify_vap.py b/py-scripts/sandbox/modify_vap.py similarity index 97% rename from py-scripts/modify_vap.py rename to py-scripts/sandbox/modify_vap.py index 56856305d..4309641e6 100755 --- a/py-scripts/modify_vap.py +++ b/py-scripts/sandbox/modify_vap.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ Script for modifying VAPs. """ @@ -8,14 +7,14 @@ import importlib import argparse import logging -from pprint import pformat +# from pprint import pformat if sys.version_info[0] != 3: print("This script requires Python 3") exit(1) - + sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base") @@ -26,6 +25,7 @@ logger = logging.getLogger(__name__) + class ModifyVAP(Realm): def __init__(self, _ssid="NA", @@ -64,9 +64,9 @@ def __init__(self, self.dhcp = _dhcp self.vap_profile = self.new_vap_profile() shelf, resource, port, *nil = self.name_to_eid(eid=self.vap_list, debug=self.debug) - self.vap_profile.resource = resource + self.vap_profile.resource = resource self.vap_profile.shelf = shelf - self.vap_profile.add_vap_data["resource"] = resource + self.vap_profile.add_vap_data["resource"] = resource self.vap_profile.add_vap_data["shelf"] = shelf self.vap_profile.vap_name = port self.vap_profile.ssid = self.ssid @@ -147,7 +147,7 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ ./modify_vap.py will modify VAPs on a system. Use the enable_flag to create a flag on a VAP. Turn off a flag with the disable_flag option. A list of available flags are available in the add_vap.py file in py-json/LANforge. @@ -161,7 +161,7 @@ def main(): if (args.log_level): logger_config.set_level(level=args.log_level) - + if args.lf_logger_config_json: logger_config.lf_logger_config_json = args.lf_logger_config_json logger_config.load_lf_logger_config() @@ -170,7 +170,6 @@ def main(): logger.critical("the folowing arguments are required: --vap :") exit(1) - modify_vap = ModifyVAP(_host=args.mgr, _port=args.mgr_port, _ssid=args.ssid, @@ -183,7 +182,8 @@ def main(): _radio=args.radio, _proxy_str=args.proxy, _debug_on=args.debug) - json_response = modify_vap.set_vap() + modify_vap.set_vap() + # json_response = modify_vap.set_vap() logger.info("modify_vap.set_vap ") diff --git a/py-scripts/sta_connect_bssid_mac.py b/py-scripts/sandbox/sta_connect_bssid_mac.py similarity index 97% rename from py-scripts/sta_connect_bssid_mac.py rename to py-scripts/sandbox/sta_connect_bssid_mac.py index f4a3c0bab..af2dd62c3 100755 --- a/py-scripts/sta_connect_bssid_mac.py +++ b/py-scripts/sandbox/sta_connect_bssid_mac.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' Name: sta_connect_bssid_mac.py Purpose: @@ -89,13 +88,13 @@ def main(): # This has --mgr, --mgr_port and --debug parser = LFCliBase.create_bare_argparse(prog="sta_connect_bssid_mac.py", description=""" - --mgr localhost --mgr_port 8080 - --ssid "TestAP-Jitendra" + --mgr localhost --mgr_port 8080 + --ssid "TestAP-Jitendra" --radio wiphy0 --security "open" // "wpa" // "wpa2" - --passwd "BLANK" - --bssid 78:d2:94:4f:20:c5,78:d2:94:4f:20:c5 - --sta_name "sta001,sta002" + --passwd "BLANK" + --bssid 78:d2:94:4f:20:c5,78:d2:94:4f:20:c5 + --sta_name "sta001,sta002" --mac 04:f0:21:89:3e:ea,04:f0:21:89:4e:ea --bss_trans """ @@ -116,7 +115,7 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ Work in progress. The script can create stations and can be used to set multiple BSSID, MAC to each individual station. ''' diff --git a/py-scripts/sta_connect_example.py b/py-scripts/sandbox/sta_connect_example.py similarity index 97% rename from py-scripts/sta_connect_example.py rename to py-scripts/sandbox/sta_connect_example.py index 7f585d2aa..d01dbd22b 100755 --- a/py-scripts/sta_connect_example.py +++ b/py-scripts/sandbox/sta_connect_example.py @@ -1,17 +1,15 @@ #!/usr/bin/env python3 -# flake8: noqa # Example of how to instantiate StaConnect and run the test import sys import os import importlib -import time import argparse if sys.version_info[0] != 3: print("This script requires Python 3") exit(1) - + sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) # if you lack __init__.py in this directory you will not find sta_connect module @@ -21,6 +19,7 @@ StaConnect = sta_connect.StaConnect LFUtils = importlib.import_module("py-json.LANforge.LFUtils") + def main(): parser = LFCliBase.create_basic_argparse( prog='sta_connect_example.py', @@ -30,14 +29,13 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ This script is no longer supported: Example of how to instantiate StaConnect and run the test. ''' if args.help_summary: print(help_summary) exit(0) - monitor_interval = LFCliBase.parse_time(args.test_duration).total_seconds() if args.upstream_port is None: args.upstream_port = "eth2" diff --git a/py-scripts/test_client_admission.py b/py-scripts/sandbox/test_client_admission.py similarity index 99% rename from py-scripts/test_client_admission.py rename to py-scripts/sandbox/test_client_admission.py index 5c6c9c15d..819d3cb9a 100755 --- a/py-scripts/test_client_admission.py +++ b/py-scripts/sandbox/test_client_admission.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ This script will create one station at a time and generate downstream traffic at 5Mbps then again create next station create layer3 and will continue doing same until Ap stops admiting client This script can be used for for client admission test for particular AP @@ -13,7 +12,7 @@ import argparse import time - + sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) LFUtils = importlib.import_module("py-json.LANforge.LFUtils") @@ -120,7 +119,7 @@ def main(): # parser.add_argument() args = parser.parse_args() - help_summary='''\ + help_summary = '''\ Script not functional or no longer supported: This script will create one station at a time and generate downstream traffic at 5Mbps then again create next station create layer3 and will continue doing same @@ -131,7 +130,6 @@ def main(): print(help_summary) exit(0) - obj = LoadLayer3(lfclient_host=args.host, lfclient_port=8080, ssid=args.ssid, paswd=args.passwd, security=args.security, radio=args.radio, num_sta=args.num_sta) obj.precleanup() diff --git a/py-scripts/test_wanlink.py b/py-scripts/sandbox/test_wanlink.py similarity index 99% rename from py-scripts/test_wanlink.py rename to py-scripts/sandbox/test_wanlink.py index 1ac829eb5..193b18f84 100755 --- a/py-scripts/test_wanlink.py +++ b/py-scripts/sandbox/test_wanlink.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa # Create and modify WAN Links from the command line. # Written by Candela Technologies Inc. # Updated by: Erin Grimes @@ -17,7 +16,6 @@ print("This script requires Python 3") exit(1) - sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base") @@ -31,7 +29,6 @@ lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") - class LANtoWAN(Realm): def __init__(self, args): super().__init__(args['host'], args['port']) @@ -80,7 +77,7 @@ def main(): # todo: jitter A and B parseargs = parser.parse_args() - help_summary='''\ + help_summary = '''\ This script will create and modify WAN Links from the command line. ''' @@ -112,7 +109,6 @@ def main(): "debug": parseargs.debug } - # set up logger logger_config = lf_logger_config.lf_logger_config() diff --git a/py-scripts/scenario.py b/py-scripts/scenario.py index 6322c10d1..b53965466 100755 --- a/py-scripts/scenario.py +++ b/py-scripts/scenario.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import importlib @@ -135,11 +134,11 @@ def main(): -------------------- Generic command example: scenario.py --load db1 --action overwrite --clean_dut --clean_chambers - + scenario.py --start test_group1 - + scenario.py --quiesce test_group1 - + scenario.py --stop test_group1 ''') @@ -160,19 +159,18 @@ def main(): group.add_argument('--start', help='name of test group to start', default=None) group.add_argument('--quiesce', help='name of test group to quiesce', default=None) group.add_argument('--stop', help='name of test group to stop', default=None) - parser.add_argument('--timeout', help='Stop trying to load scenario after this many seconds', default=120) + parser.add_argument('--timeout', help='Stop trying to load scenario after this many seconds', default=120, type=int) parser.add_argument('--quit_on_phantom', help='do not load the database if a phantom port is present', action='store_true') parser.add_argument('--check_phantom', help='check if these ports are phantom', default=None, nargs="+") args = parser.parse_args() - help_summary='''\ + help_summary = '''\ The script, scenario.py, will load a database file and control test groups. ''' if args.help_summary: print(help_summary) exit(0) - scenario = LoadScenario(mgr=args.mgr, scenario=args.load, action=args.action, @@ -203,7 +201,7 @@ def main(): print('sleeping 30 seconds, please upgrade your LANforge for a better experience, more information at https://www.candelatech.com/downloads.php#releases') time.sleep(30) - if build_version >= [5, 4, 4]: + if build_version >= [5, 4, 4] and args.load: scenario.check_if_complete() # scenario_loader.load_scenario() diff --git a/py-scripts/scripts_deprecated/README.md b/py-scripts/scripts_deprecated/README.md index 551618471..296f42049 100644 --- a/py-scripts/scripts_deprecated/README.md +++ b/py-scripts/scripts_deprecated/README.md @@ -1,3 +1,4 @@ # Deprecated LANforge Scripts -Formerly but no longer supported scripts. Mainly used as final staging area before final removal. \ No newline at end of file +Formerly but no longer supported scripts. Mainly used as final staging area before final removal. +These scripts generally are not included in automated code quality checks. diff --git a/py-scripts/scripts_deprecated/event_break_flood.py b/py-scripts/scripts_deprecated/event_break_flood.py index cb4629b2b..85831564d 100755 --- a/py-scripts/scripts_deprecated/event_break_flood.py +++ b/py-scripts/scripts_deprecated/event_break_flood.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa import threading diff --git a/py-scripts/scripts_deprecated/lf_mail.py b/py-scripts/scripts_deprecated/lf_mail.py index 079bef4c4..da04ddf93 100755 --- a/py-scripts/scripts_deprecated/lf_mail.py +++ b/py-scripts/scripts_deprecated/lf_mail.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa import smtplib import argparse diff --git a/py-scripts/lf_we_can_scan.py b/py-scripts/scripts_deprecated/lf_we_can_scan.py similarity index 99% rename from py-scripts/lf_we_can_scan.py rename to py-scripts/scripts_deprecated/lf_we_can_scan.py index c771de584..59892aab3 100755 --- a/py-scripts/lf_we_can_scan.py +++ b/py-scripts/scripts_deprecated/lf_we_can_scan.py @@ -298,7 +298,7 @@ def main(): Used to verify if a ssid is available in a scan of a real client(Mobile Phones) ''', description='''\ - Verifies that wheather a station is available in a scan of a phone with specified resource id, for each + Verifies that wheather a station is available in a scan of a phone with specified resource id, for each resouce id it performs a scan and compares if given ssid is present in the scan. Example: diff --git a/py-scripts/test_ipv4_ps.py b/py-scripts/scripts_deprecated/test_ipv4_ps.py similarity index 100% rename from py-scripts/test_ipv4_ps.py rename to py-scripts/scripts_deprecated/test_ipv4_ps.py diff --git a/py-scripts/test_ipv4_ttls.py b/py-scripts/scripts_deprecated/test_ipv4_ttls.py similarity index 99% rename from py-scripts/test_ipv4_ttls.py rename to py-scripts/scripts_deprecated/test_ipv4_ttls.py index ee8c06d54..a8bb03187 100755 --- a/py-scripts/test_ipv4_ttls.py +++ b/py-scripts/scripts_deprecated/test_ipv4_ttls.py @@ -338,7 +338,7 @@ def main(): python ./test_ipv4_ttls.py --upstream_port eth1 - --radio wiphy0 + --radio wiphy0 --num_stations 3 --ssid ssid-wpa-1 --key ssid-wpa-1 diff --git a/py-scripts/test_l3_scenario_throughput.py b/py-scripts/scripts_deprecated/test_l3_scenario_throughput.py similarity index 100% rename from py-scripts/test_l3_scenario_throughput.py rename to py-scripts/scripts_deprecated/test_l3_scenario_throughput.py diff --git a/py-scripts/scripts_deprecated/tip-cicd-sanity/Nightly_Sanity.py b/py-scripts/scripts_deprecated/tip-cicd-sanity/Nightly_Sanity.py index 45736ac29..11cd6eef3 100755 --- a/py-scripts/scripts_deprecated/tip-cicd-sanity/Nightly_Sanity.py +++ b/py-scripts/scripts_deprecated/tip-cicd-sanity/Nightly_Sanity.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa import sys import os diff --git a/py-scripts/scripts_deprecated/tip-cicd-sanity/cloudsdk.py b/py-scripts/scripts_deprecated/tip-cicd-sanity/cloudsdk.py index adf3a7bbb..a4e6aafe1 100755 --- a/py-scripts/scripts_deprecated/tip-cicd-sanity/cloudsdk.py +++ b/py-scripts/scripts_deprecated/tip-cicd-sanity/cloudsdk.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ################################################################################## diff --git a/py-scripts/scripts_deprecated/tip-cicd-sanity/lab_ap_info.py b/py-scripts/scripts_deprecated/tip-cicd-sanity/lab_ap_info.py index dc2d15356..e9e5da11b 100755 --- a/py-scripts/scripts_deprecated/tip-cicd-sanity/lab_ap_info.py +++ b/py-scripts/scripts_deprecated/tip-cicd-sanity/lab_ap_info.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ##AP Models Under Test diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index d66d42e65..b81c6514e 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -1,136 +1,166 @@ -#!/usr/bin/python3 -# flake8: noqa - -################################################################################## -# Run command on remote system over ssh -# -# Example: -# /home/greearb/ssh_remote.py --remote_args " r5g bssid=d8:f8:83:35:db:e9" -# -# example do_ap script on remote system: -# -# #!/bin/bash -# -# cd /home/lanforge -# . lanforge.profile -# ./vrf_exec.bash eth2 python3 foo_ap.py $* -# -# foo_ap.py knows how to log into AP and grab stats. -################################################################################## - -import paramiko -from paramiko import SSHClient -import socket +#!/usr/bin/env python3 +""" +NAME: ssh_remote.py + +PURPOSE: Run command on a remote system over SSH + +NOTES: By default, the program runs with user 'root' and password 'lanforge'. + +EXAMPLE: # Run command with no arguments using test port over SSH + ./ssh_remote.py \ + --ip 192.168.1.101 \ + --prog ls + + # Run command 'ls --recursive' + ./ssh_remote.py \ + --ip 192.168.1.101 \ + --prog ls \ + --remote_args 'recursive' + + # Run command 'ls -r' (recursive but with shorter '-r' flag) + ./ssh_remote.py \ + --ip 192.168.1.101 \ + --prog "ls -r" + + # Run command with non-default user and password + ./ssh_remote.py \ + --ip 192.168.1.101 \ + --username lanforge \ + --password egrofnal \ + --prog ls +""" import argparse import logging +import paramiko +import socket + +HELP_SUMMARY = "Runs a command on a remote system over SSH. Useful for DUT automation " \ + "in LANforge Chamber View tests" -global ip -global ssh_port -global user_name -global password -global timeout -global prog +# Default values +ip = "192.168.100.157" +ssh_port = 22 +username = "root" +password = "lanforge" +prog = "/home/lanforge/do_ap" +timeout = 5 +remote_args = "" -ip="192.168.100.157" -ssh_port=22 -username="root" -password="lanforge" -prog="/home/lanforge/do_ap" -timeout=5 -remote_args="" +# Grab logger for this module for easy usage +logger = logging.getLogger(__name__) -def get_info(cmd): +def get_info(cmd: str, ip: str, ssh_port: int, username: str, password: str, timeout: int, **kwargs): try: - #logging.getLogger("paramiko").setLevel(logging.DEBUG) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - #print("Connecting to Remote System...") + + # Connect to remote system + logger.debug(f"Connecting to remote system '{ip}:{ssh_port}' with username '{username}' and password '{password}'") client.connect(ip, username=username, password=password, port=ssh_port, timeout=timeout, allow_agent=False, look_for_keys=False) - #print("Running cmd: %s" %(cmd)) + + # Run command on remote system + logger.debug(f"Running command on remote system: {cmd}") stdin, stdout, stderr = client.exec_command(cmd) - - output = str(stdout.read(), 'utf-8') - #print("Output:\n") - print(output) + # Print output from command (both in debug and non-debug mode. This is grabbed by automation) + output = str(stdout.read(), 'utf-8') + logger.debug("Command output:\n") + print(output) # Using 'logger.info()' here will result in timeout for large command output except paramiko.ssh_exception.AuthenticationException as e: - print(e) - print("Authentication Error, Check Credentials") + logger.error(e) + logger.error("Authentication error, check credentials") return except paramiko.SSHException as e: - print(e) - print("Cannot SSH to the remote system: %s:%i user: %s password: %s" % (ip, ssh_port, username, password)) + logger.error(e) + logger.error(f"Failed to connect to remote system '{ip}:{ssh_port}' with username '{username}' and password '{password}'") return except socket.timeout as e: - print(e) - print("AP Unreachable") + logger.error(e) + logger.error("AP Unreachable") return return -def main(): - global ip - global prog - global username - global password - global remote_args - +def parse_args(): parser = argparse.ArgumentParser( - prog='ssh_remote.py', + prog="ssh_remote.py", formatter_class=argparse.RawTextHelpFormatter, - epilog='''\ - Run command against remoate machine over ssh - ''', - - description=''' - Run command against remoate machine over ssh - ''') - - parser.add_argument( - '--prog', - help='Remote command to execute', - default=prog) - - parser.add_argument( - '--remote_args', - help='Arguments for remote command', - default="") - - parser.add_argument( - '--ip', - help='IP address of remote system', - default=ip) - - parser.add_argument( - '--username', - help='User-name for remote machine', - default=username) - - parser.add_argument( - '--password', - help='Password for remote machine', - default=password) - - parser.add_argument( - '--help_summary', - action="store_true", - help='Show summary of what this script does') - - args = parser.parse_args() - - help_summary='''\ -This script is an example do_ap script on remote system. -''' + description="Run command on remote system over SSH") + + # Command and command argument options + parser.add_argument("--prog", + help="Remote command to execute", + default=prog) + parser.add_argument("--remote_args", + help="Arguments for remote command", + default="") + + # SSH options + parser.add_argument("--ip", + help="IP address of remote system", + default=ip) + parser.add_argument("-p", "--port", "--ssh_port", + dest="ssh_port", + help="SSH port for remote system", + default=ssh_port) + parser.add_argument("--user", "--username", + dest="username", + help="Username for remote machine", + default=username) + + parser.add_argument("--passwd", "--password", + dest="password", + help="Password for remote machine", + default=password) + parser.add_argument("--timeout", + help="SSH timeout for connection failures", + default=timeout) + + parser.add_argument("--help_summary", + action="store_true", + help="Show summary of what this script does") + parser.add_argument("--debug", + action="store_true", + help="Run in debugging mode with logging enabled and in verbose mode.") + + return parser.parse_args() + + +def configure_logging(debug: bool): + """Configure logging based on user configuration. + + Since the output of this script is parsed in other automation, configure default + logging to output with no timestamp. When debug mode is enabled, add back the timestamp + and output more verbose logs. + """ + # Configure SSH client library logging + paramiko_logger = logging.getLogger("paramiko") + paramiko_logger.setLevel(logging.ERROR) + + if not debug: + # Configure logging with no timestamp format. Only permit this module to log at INFO level. + # Set all others to ERROR level to ensure other automation, which output of this script, + # does not break unnecessarily + logging.basicConfig(level=logging.ERROR, format="") + logging.getLogger(__name__).setLevel(logging.INFO) + + else: + # Configure logging with timestamp format. Permit this module and SSH client module to + # log at DEBUG level. Set all other modules to INFO level + logging.basicConfig(level=logging.INFO) + logging.getLogger(__name__).setLevel(logging.DEBUG) + logging.getLogger("paramiko").setLevel(logging.DEBUG) + + +def main(): + args = parse_args() if args.help_summary: - print(help_summary) + print(HELP_SUMMARY) exit(0) - ip = args.ip - username = args.username - password = args.password - prog = args.prog; + configure_logging(args.debug) cmd = args.prog ra = args.remote_args.split() @@ -138,8 +168,10 @@ def main(): cmd += " --" cmd += a - get_info(cmd) + # **vars(args) unpacks the arguments dict into arguments to function + # with all non-argument key-value pairs set in the '**kwargs' variable + get_info(cmd=cmd, **vars(args)) + if __name__ == '__main__': main() - diff --git a/py-scripts/sta_connect.py b/py-scripts/sta_connect.py index 6b1171fc8..a4faf7091 100755 --- a/py-scripts/sta_connect.py +++ b/py-scripts/sta_connect.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: sta_connect.py @@ -137,7 +136,7 @@ def compare_vals(self, name, postVal, print_pass=False, print_fail=True): def remove_stations(self): for name in self.station_names: self.rm_port(name, check_exists=True, debug_=self.debug) - #LFUtils.removePort(self.resource, name, self.lfclient_url) + # LFUtils.removePort(self.resource, name, self.lfclient_url) if LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=self.station_names, debug=self.debug): self._pass("All ports disappeared") @@ -269,10 +268,10 @@ def setup(self): self._fail("Not all ports came up in time") # station_info = self.jsonGet(self.mgr_url, "%s?fields=port,ip,ap" % (self.getStaUrl())) - duration = 0 - maxTime = 300 - ip = "0.0.0.0" - ap = "" + # duration = 0 + # maxTime = 300 + # ip = "0.0.0.0" + # ap = "" print("Waiting for %s stations to associate to AP: " % len(self.station_names), end="") if self.wait_for_ip(self.station_names): @@ -531,8 +530,8 @@ def cleanup(self): def main(): - help_summary='''\ - This script will create a station, create TCP and UDP traffic, run it a short amount of time, and verify whether + help_summary = '''\ + This script will create a station, create TCP and UDP traffic, run it a short amount of time, and verify whether traffic was sent and received. ''' parser = Realm.create_basic_argparse( @@ -626,4 +625,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/py-scripts/sta_connect2.py b/py-scripts/sta_connect2.py index 2c8f84606..c5976240b 100755 --- a/py-scripts/sta_connect2.py +++ b/py-scripts/sta_connect2.py @@ -1,12 +1,11 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: sta_connect2.py Purpose: - Test will create a station, create TCP and UDP traffic, run it a short amount of time, + Test will create a station, create TCP and UDP traffic, run it a short amount of time, and verify whether traffic was sent and received. It also verifies the station connected - to the requested BSSID if bssid is specified as an argument. + to the requested BSSID if bssid is specified as an argument. The script will clean up the station and connections at the end of the test. EXAMPLE: @@ -36,7 +35,7 @@ from pprint import pformat import time import logging -import datetime +# import datetime import platform @@ -62,13 +61,14 @@ WPA = "wpa" WPA2 = "wpa2" WPA3 = "wpa3" -OWE = "owe" # a wpa3 mode +OWE = "owe" # a wpa3 mode MODE_AUTO = 0 BLANK = "[BLANK]" + class StaConnect2(Realm): def __init__(self, host, port, _dut_ssid="jedway-open-1", _dut_passwd="NA", _dut_bssid="", - _user="", _passwd="", _radio="wiphy0", _sta_mode=0, + _user="", _passwd="", _radio="wiphy0", _sta_mode=0, _resource=1, _upstream_resource=1, _upstream_port="eth1", _sta_name=None, _sta_prefix=None, _bringup_time_sec=300, debug_=False, _dut_security=OPEN, _exit_on_error=False, @@ -161,7 +161,7 @@ def get_rx_values(self): # logger.info("endp_list: {endp_list}".format(endp_list=endp_list)) endp_rx_drop_map = {} endp_rx_map = {} - our_endps = {} + # our_endps = {} endps = [] total_ul = 0 @@ -411,7 +411,7 @@ def start(self): "probe_flags": 1} # logger.info("start() - data1: %s", data) self.json_post("/cli-json/nc_show_ports", data) - #print("start() - ln 252 - self.j") + # print("start() - ln 252 - self.j") self.station_profile.admin_up() LFUtils.waitUntilPortsAdminUp(self.resource, self.lfclient_url, self.station_names) @@ -564,7 +564,6 @@ def stop(self): # print("self.l3_udp_profile.created_cx -ln 412-: ", self.l3_udp_profile.created_cx) # print("self.l3_tcp_profile.created_cx: ", self.l3_tcp_profile.created_cx) - def cleanup(self): # remove all endpoints and cxs if self.cleanup_on_exit: @@ -779,14 +778,14 @@ def csv_add_column_headers(self): def main(): help_summary = '''\ - Test will create a station, create TCP and UDP traffic, run it a short amount of time, + Test will create a station, create TCP and UDP traffic, run it a short amount of time, and verify whether traffic was sent and received. It also verifies the station connected - to the requested BSSID if bssid is specified as an argument. + to the requested BSSID if bssid is specified as an argument. The script will clean up the station and connections at the end of the test. ''' - lfjson_host = "localhost" - lfjson_port = 8080 + # lfjson_host = "localhost" + # lfjson_port = 8080 parser = argparse.ArgumentParser( prog="sta_connect2.py", formatter_class=argparse.RawTextHelpFormatter, @@ -795,23 +794,23 @@ def main(): LANforge Unit Test: Connect Station to AP - sta_connect2.py --------------------------- Summary: -This will create a station, create TCP and UDP traffic, run it a short amount of time, and verify whether traffic -was sent and received. It also verifies the station connected to the requested BSSID if bssid is specified +This will create a station, create TCP and UDP traffic, run it a short amount of time, and verify whether traffic +was sent and received. It also verifies the station connected to the requested BSSID if bssid is specified as an argument. The script will clean up the station and connections at the end of the test. --------------------------- -CLI Example: -./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 +CLI Example: +./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 --upstream_port eth1 --radio wiphy1 CLI Example for kpi.csv report output: -./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 ---upstream_port eth2 --csv_outfile sta_connect2.csv --test_rig LF-Lab --test_tag L3 --dut_hw_version Linux +./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 +--upstream_port eth2 --csv_outfile sta_connect2.csv --test_rig LF-Lab --test_tag L3 --dut_hw_version Linux --dut_model_num 1 --dut_sw_version 5.4.5 --dut_serial_num 1234 CLI Example for kpi.csv, variable tx/rx rates, and pdu size: -./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 ---upstream_port eth2 --download_bps 768000 --upload_bps 256000 --side_a_pdu 300 --side_b_pdu 750 ---csv_outfile sta_connect2.csv --test_rig LF-Lab --test_tag L3 --dut_hw_version Linux --dut_model_num 1 +./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 +--upstream_port eth2 --download_bps 768000 --upload_bps 256000 --side_a_pdu 300 --side_b_pdu 750 +--csv_outfile sta_connect2.csv --test_rig LF-Lab --test_tag L3 --dut_hw_version Linux --dut_model_num 1 --dut_sw_version 5.4.5 --dut_serial_num 1234 Note: --sta_mode use values in second column @@ -835,15 +834,15 @@ def main(): aAX | 15 # 802.11a-AX (6E disables /n and /ac) ---------------------------- +--------------------------- """, - epilog=""" + epilog=""" --------------------------- -CLI Example: -./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 +CLI Example: +./sta_connect2.py --mgr localhost --dut_ssid --dut_passwd --dut_security wpa2 --upstream_port eth2 --radio wiphy1 """ -) + ) parser.add_argument("-m", "--mgr", type=str, help="address of the LANforge GUI machine (localhost is default)", default='localhost') parser.add_argument("-o", "--port", type=int, help="IP Port the LANforge GUI is listening on (8080 is default)", @@ -915,8 +914,8 @@ def main(): help="--csv_outfile ", default="") # logging configuration: - parser.add_argument('--log_level', default=None, - help='Set logging level: debug | info | warning | error | critical') + parser.add_argument('--log_level', default=None, + help='Set logging level: debug | info | warning | error | critical') parser.add_argument("--lf_logger_config_json", help="--lf_logger_config_json , json configuration of logger") @@ -943,7 +942,6 @@ def main(): logger_config.lf_logger_config_json = args.lf_logger_config_json logger_config.load_lf_logger_config() - # for kpi.csv generation local_lf_report_dir = args.local_lf_report_dir test_rig = args.test_rig @@ -983,7 +981,7 @@ def main(): # if args.csv_outfile is None: current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) - csv_outfile = "{}_{}-test_ip_variable_time.csv".format( + csv_outfile = "{}_{}-sta_connect2.csv".format( args.csv_outfile, current_time) csv_outfile = report.file_add_path(csv_outfile) logger.info("csv output file : {}".format(csv_outfile)) @@ -1055,7 +1053,7 @@ def main(): report.set_obj_html("Objective", "The Station Connection 2 Test is designed to test the performance of the " "Access Point with running TCP and UDP traffic for an amount of time. " "Verifies the station connected to the requested BSSID if bssid is specified." - ) + ) report.build_objective() test_setup_info = { @@ -1105,7 +1103,6 @@ def main(): if platform.system() == 'Linux': report.write_pdf_with_timestamp(_page_size='letter', _orientation='portrait') - staConnect.stop() # exit(1) @@ -1116,7 +1113,6 @@ def main(): # py-json/lanforge/lfcli_base.py - get_all_message(): logger.info(staConnect.get_all_message()) - # cleanup stations if not args.no_cleanup: staConnect.cleanup() @@ -1127,8 +1123,7 @@ def main(): if platform.system() == 'Linux': logger.info("Test Results PDF located: {report}".format(report=report.write_output_pdf)) - - # Added Exit codes + # Added Exit codes if not is_passing: logger.info("FAIL: Some tests failed") exit(1) diff --git a/py-scripts/sta_scan_test.py b/py-scripts/sta_scan_test.py index bcf751502..d5c08e0c0 100755 --- a/py-scripts/sta_scan_test.py +++ b/py-scripts/sta_scan_test.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: sta_scan_test.py @@ -85,7 +84,7 @@ def __init__(self, def start(self): if self.use_existing_station: # bring up existing sta list - #print(self.sta_list) + # print(self.sta_list) for s in self.sta_list: eid = LFUtils.name_to_eid(s) up_request = LFUtils.port_up_request(resource_id=eid[1], port_name=eid[2]) @@ -113,7 +112,7 @@ def start(self): # TODO: Make configurable # Wait for scans to complete. if self.debug: - print("Waiting for %s seconds for scan to complete" %(self.scan_time)) + print("Waiting for %s seconds for scan to complete" % (self.scan_time)) time.sleep(self.scan_time) # Get results for all stations. @@ -132,7 +131,7 @@ def start(self): results = scan_results['scan-results'] df = pd.DataFrame([list(result.values())[0] for result in results]) if self.debug: - print("Scan results for port: %s\n%s"%(port, scan_results)) + print("Scan results for port: %s\n%s" % (port, scan_results)) if self.csv_output: # TODO: This clobbers output of previous station, need a way to # append (and add resource and wlan to the csv output so that @@ -177,7 +176,7 @@ def main(): Optionally creates a station with specified ssid info (can be real or fake ssid, if fake use open for security). If not creating a station, it can use existing station. Then starts a scan and waits 15 seconds, finally scan results are printed to console. - + Example: ./sta_scan_test.py --ssid test_name --security open --radio wiphy0 ./sta_scan_test.py --sta_name 1.14.wlan0 1.1.wlan0 --use_existing_station --scan_time 5 @@ -193,7 +192,7 @@ def main(): default=15, type=int) args = parser.parse_args() - help_summary='''\ + help_summary = '''\ This scripts optionally creates a station with specified ssid info (can be real or fake ssid, if fake use open for security). If not creating a station, it can use existing station. Then starts a scan and waits 15 seconds, finally scan results are printed to console. @@ -202,7 +201,6 @@ def main(): print(help_summary) exit(0) - station_list = args.sta_name sta_scan_test = StaScan(host=args.mgr, port=args.mgr_port, diff --git a/py-scripts/temp_graph.py b/py-scripts/temp_graph.py new file mode 100644 index 000000000..224befe9f --- /dev/null +++ b/py-scripts/temp_graph.py @@ -0,0 +1,231 @@ +#!/bin/env python3 +""" +NAME: temp_graph.py + +PURPOSE: +temp_graph.py will take heatmon temperature logs and create parsed CSVs +and optional graphical reports. +First obtain heatmon output from journalctl -t heatmon > log.txt + +EXAMPLE (only creating CSVs): + ./temp_graph.py -i heat_log.txt + +EXAMPLE (creating an html report page): + ./temp_graph.py -i heat_log.txt -r + +EXAMPLE (reporting with a band chart): + ./temp_graph.py -i heat_log.txt -r -m band + +SCRIPT_CATEGORIES: Report Generation + +STATUS: Under Development + +VERIFIED_ON: AUGUST 2025, + GUI Version: 5.5.1 + Kernel Version: 6.11.12+ + +COPYRIGHT: + Copyright 2025 Candela Technologies Inc + License: Free to distribute and modify. LANforge systems must be licensed. +""" +import argparse +import re +import csv +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib.dates as mdates +import time +import os + +_out_dir = "Temp_Graphing_" +_max_legend_entries = 4 + + +def _next_table_name(num: int, timestamp: str, core=False) -> str: + p_num = str(num).zfill(3) + c = "Core" if core else "" + return f"{_out_dir}{timestamp}/{c}temp_csv_{p_num}.csv" + + +def _next_png_name(num: int) -> str: + p_num = str(num).zfill(3) + return f"temperature_data_{p_num}.png" + + +def _switch_out_files(tables, num: int, timestamp): + tables.append(open(_next_table_name(num, timestamp), 'w+', newline='')) + tables.append(open(_next_table_name(num+1, timestamp, True), + 'w+', newline='')) + rad_writer = csv.writer(tables[num]) + core_writer = csv.writer(tables[num + 1]) + rad_writer.writerow(['datetime', 'device', 'temperature']) + core_writer.writerow(['datetime', 'device', 'temperature']) + return rad_writer, core_writer + + +def _get_graph_title(df, num, rig): + dt = df['datetime'].iloc + start_d = f"{str(dt[0].month)}/{str(dt[0].day)}" + start_t = f"{str(dt[0].hour)}:{str(dt[0].minute)}" + end_d = f"{str(dt[-1].month)}/{str(dt[-1].day)}" + end_t = f"{str(dt[-1].hour)}:{str(dt[-1].minute)}" + dev = "Cores" if num % 2 == 0 else "Radios" + return f"{rig} {dev} From {start_d} {start_t} to {end_d} {end_t}" + + +def main(): + help_summary = '''\ +temp_graph creates a graph of device temperature data over time using +a log file passed with -i that can be generated +using the shell command 'journalctl -t heatmon > log.txt' + +This file is then parsed into a series of CSVs and optionally: +-a set of graph pngs (-s) +-an html report page (-r) +''' + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--inputfile", help="The path to the input file", + default=None) + parser.add_argument("-m", "--mode", help="change style of graph created", + default="all") + parser.add_argument("-s", "--save_output", + help="saves the output graphs as PNGs", + default=False, action="store_true") + parser.add_argument("-r", "--report", + help="create a report.html page with the graph(s)", + default=False, action="store_true") + parser.add_argument("-c", "--cutoff", default=20, + help="max time in minutes between two table entries") + parser.add_argument("--help_summary", default=False, action="store_true") + + args = parser.parse_args() + + if args.help_summary: + print(help_summary) + exit(0) + + # Try to safely open the files passed to us + try: + in_file = open(args.inputfile, "r") + except OSError: + print("Unable to open input file " + args.inputfile) + exit(1) + + _tstamp = time.ctime()[4:13].replace(' ', '_') + try: + os.makedirs((_out_dir + _tstamp), exist_ok=True) + except OSError: + print("Error creating output directory") + exit(1) + """ + todo: update this documentation to explain the multi-charting process + + Look through each line of the input file. Each line should be in the form: + MON DD HH:MM:SS .(*?) [({"A":"DEVICENAME", "T":(TEMP|null)})*?] + The number of (A,T) pairs may differ from line to line. + The values of T may be null due to issues in temperature reporting. + + A line with n (A,T) pairs will be written into output file as n lines, + with each (A,T) pair having its own line. This is for ease of graphing. + """ + + rig = None + out_tables = [] + table_stats = [] + rad_writer, core_writer = _switch_out_files(out_tables, + len(out_tables), _tstamp) + prev_date = None + for line in in_file: + # Skip lines that we suspect don't fit our pattern + if line.find("heatmon") == -1 or line.find("ERROR") != -1: + continue + mon = time.strptime(line[:3], '%b').tm_mon + t = pd.to_datetime(line[4:15], format='%d %H:%M:%S') + t = t.replace(month=mon, year=time.localtime().tm_year) + if prev_date and (t - prev_date).seconds > (int(args.cutoff) * 60): + # Switch to new table + rad_writer, core_writer = _switch_out_files(out_tables, + len(out_tables), + _tstamp) + prev_date = t + if rig is None: + rig = re.search(r':.. .*? ', line) + rig = rig.group(0)[4:-1] if rig else None + device_matches = re.finditer(r'A":"(.*?)"', line) + temp_matches = re.finditer(r'T":(.*?|null)}', line) + devices = [] + temps = [] + for device_match in device_matches: + devices.append(device_match.group(1)) + for temp_match in temp_matches: + temps.append(temp_match.group(1)) + for i in range(len(devices)): + if "core" in devices[i]: + core_writer.writerow([t, devices[i], temps[i]]) + else: + rad_writer.writerow([t, devices[i], temps[i]]) + + for file in out_tables: + file.flush() + file.close() + + in_file.close() + + date_format = mdates.DateFormatter('%H:%M') + + for file_num in range(len(out_tables)): + file = out_tables[file_num] + df = pd.read_csv(file.name) + df['datetime'] = pd.to_datetime(df['datetime'], + format="%Y-%m-%d %H:%M:%S") + _, ax = plt.subplots() + min_temps = df.groupby('datetime')['temperature'].min() + max_temps = df.groupby('datetime')['temperature'].max() + mean_temps = df.groupby('datetime')['temperature'].mean() + if args.mode == "band": + plt.plot(mean_temps.index, mean_temps.values, color='red') + if args.mode == "all": + for device, sub_df in df.groupby('device'): + sub_df.plot(ax=ax, x='datetime', + y='temperature', label=device, x_compat=True) + ax.legend(title='devices') + plt.legend(bbox_to_anchor=(1, 1)) + _, labels = plt.gca().get_legend_handles_labels() + table_stats.append({ + 'min': df['temperature'].min(), + 'max': df['temperature'].max(), + 'avg': round(df['temperature'].mean(), 2) + }) + ax.xaxis.set_major_formatter(date_format) + plt.title(_get_graph_title(df, file_num, rig)) + plt.xlabel("Time") + plt.ylabel("Temperature (" + chr(176) + "C)") + if args.mode == "band": + plt.fill_between(min_temps.index, + min_temps.values, + max_temps.values, + color='blue', alpha=0.3) + _, labels = plt.gca().get_legend_handles_labels() + if args.mode != "band" and len(labels) > _max_legend_entries: + plt.gca().get_legend().remove() + if args.save_output or args.report: + plt.savefig(_out_dir + _tstamp + "/" + _next_png_name(file_num)) + + if args.report: + # write a report.html page with the graphs we made + with open(_out_dir + _tstamp + '/report' + '.html', 'w') as f: + f.write(" \n \n ") + for file_num in range(len(out_tables)): + f.write('\"graph') + f.write('') + f.write('') + f.write(f'') + f.write(f'') + f.write(f'') + f.write('
Min Max Avg
{table_stats[file_num]["min"]}{table_stats[file_num]["max"]}{table_stats[file_num]["avg"]}
') + f.write("
\n ") + + +main() diff --git a/py-scripts/test_fileio.py b/py-scripts/test_fileio.py index d169754bd..6bbf3e70d 100755 --- a/py-scripts/test_fileio.py +++ b/py-scripts/test_fileio.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: test_fileio.py @@ -19,12 +18,23 @@ https://candelatech.atlassian.net/wiki/spaces/~261521142/pages/979435521/Lanforge+File-IO+Test+Notes EXAMPLE: -./test_fileio.py --macvlan_parent --num_ports --use_macvlans +./test_fileio.py --macvlan_parent --num_ports --use_macvlans --first_mvlan_ip --netmask --gateway -./test_fileio.py --macvlan_parent eth2 --num_ports 3 --use_macvlans --first_mvlan_ip 192.168.92.13 +./test_fileio.py --macvlan_parent eth2 --num_ports 3 --use_macvlans --first_mvlan_ip 192.168.92.13 --netmask 255.255.255.0 --gateway 192.168.92.1 +EXAMPLE (creating a scenario without running it): +./test_fileio.py --macvlan_parent --num_port --use_macvlans + --first_mvlan_ip --netmask --gateway + --use_test_groups --write_only_test_group + --read_only_test_group --save_config + +./test_fileio.py --macvlan_parent eth1 --num_port 2 --use_macvlans + --first_mvlan_ip 192.168.0.34 --netmask 255.255.255.0 --gateway 192.168.0.105 + --use_test_groups --write_only_test_group write_group_0 + --read_only_test_group read_group_0 --save_config + TODO: Create external document Use './test_fileio.py --help' to see command line usage and options @@ -565,22 +575,22 @@ def main(): test_fileio.py: -------------------- Generic command layout: -./test_fileio.py --macvlan_parent --num_ports --use_macvlans +./test_fileio.py --macvlan_parent --num_ports --use_macvlans --first_mvlan_ip --netmask --gateway -./test_fileio.py --macvlan_parent eth2 --num_ports 3 --use_macvlans --first_mvlan_ip 192.168.92.13 +./test_fileio.py --macvlan_parent eth2 --num_ports 3 --use_macvlans --first_mvlan_ip 192.168.92.13 --netmask 255.255.255.0 --gateway 192.168.92.1 - -./test_fileio.py --radio 1.wiphy0 --test_duration 1m --macvlan_parent eth1 --num_ports 3 --use_macvlans + +./test_fileio.py --radio 1.wiphy0 --test_duration 1m --macvlan_parent eth1 --num_ports 3 --use_macvlans --use_ports eth1#0,eth1#1,eth1#2 --connections_per_port 2 --mode write - -./test_fileio.py --radio 1.wiphy0 --test_duration 1m --macvlan_parent eth1 --num_ports 3 --use_macvlans - --first_mvlan_ip 10.40.3.100 --netmask 255.255.240.0 --gateway 10.40.0.1 - --use_test_groups --write_only_test_group test_wo --read_only_test_group test_ro + +./test_fileio.py --radio 1.wiphy0 --test_duration 1m --macvlan_parent eth1 --num_ports 3 --use_macvlans + --first_mvlan_ip 10.40.3.100 --netmask 255.255.240.0 --gateway 10.40.0.1 + --use_test_groups --write_only_test_group test_wo --read_only_test_group test_ro --add_to_group test_wo --cxs test_wo0000,test_wo0001,test_wo0002 ./test_fileio.py --radio 1.wiphy0 --test_duration 1m --macvlan_parent eth1 --num_ports 3 --use_macvlans - --use_ports eth1#0=10.40.3.103,eth1#1,eth1#2 --connections_per_port 2 + --use_ports eth1#0=10.40.3.103,eth1#1,eth1#2 --connections_per_port 2 --netmask 255.255.240.0 --gateway 10.40.0.1 ''') @@ -624,6 +634,8 @@ def main(): parser.add_argument('--read_only_test_group', help='specifies name to use for read only test group', default=None) parser.add_argument('--write_only_test_group', help='specifies name to use for write only test group', default=None) parser.add_argument('--mode', help='write,read,both', default='both', type=str) + parser.add_argument('--save_config', help='save test setup as scenario without running', + default=False, action='store_true') # kpi_csv arguments parser.add_argument( "--test_rig", @@ -669,7 +681,7 @@ def main(): default=None) args = parser.parse_args() - help_summary='''\ + help_summary = '''\ test_fileio.py will create stations or macvlans with matching fileio endpoints to generate and verify fileio related traffic. This script will create a variable number of stations or macvlans to test fileio traffic. Pre-existing stations and @@ -685,7 +697,6 @@ def main(): print(help_summary) exit(0) - parent = LFUtils.name_to_eid(args.macvlan_parent) shelf = parent[0] resource = parent[1] @@ -808,6 +819,17 @@ def main(): ip_test.build() if not ip_test.passes(): print(ip_test.get_fail_message()) + + if args.save_config: + if not args.use_test_groups: + print("Test groups were not selected to be used. Test groups will not be saved") + else: + if args.write_only_test_group: + print(f'Saving write-only connections as {args.write_only_test_group}') + if args.read_only_test_group: + print(f'Saving read-only connections as {args.read_only_test_group}') + exit(0) + ip_test.start(False, False) ip_test.report = lf_report.lf_report(_results_dir_name="test_fileio", _output_html="fileio_test.html", @@ -839,7 +861,7 @@ def main(): cur_time = datetime.datetime.now() time.sleep(1) new_rx_values = ip_test.get_values() - for key, value in new_rx_values.items(): + for _, value in new_rx_values.items(): write_bps += value['write-bps'] read_bps += value['read-bps'] @@ -847,7 +869,7 @@ def main(): if ip_test.compare_vals(new_rx_values): passes += 1 else: - ip_test._fail("FAIL: Not all stations increased traffic")#, print_fail) + ip_test._fail("FAIL: Not all stations increased traffic") # , print_fail) # break # old_rx_values = new_rx_values cur_time = datetime.datetime.now() @@ -867,8 +889,7 @@ def main(): ip_test.kpi_csv.kpi_csv_write_dict(ip_test.kpi_csv.kpi_dict) if passes == expected_passes: - ip_test._pass("PASS: All tests passes")#, print_pass) - + ip_test._pass("PASS: All tests passes") # , print_pass) ip_test.stop() if not ip_test.passes(): diff --git a/py-scripts/test_generic.py b/py-scripts/test_generic.py index c4d7dd593..0b4486e76 100755 --- a/py-scripts/test_generic.py +++ b/py-scripts/test_generic.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: test_generic.py @@ -19,17 +18,17 @@ EXAMPLE: LFPING: - ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --ssid Logan-Test-Net --passwd Logan-Test-Net - --security wpa2 --num_stations 4 --type lfping --dest 192.168.1.1 --debug --log_level info + ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --ssid Logan-Test-Net --passwd Logan-Test-Net + --security wpa2 --num_stations 4 --type lfping --dest 192.168.1.1 --debug --log_level info --report_file /home/lanforge/reports/LFPING.csv --test_duration 20s --upstream_port 1.1.eth2 LFCURL (under construction): - ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --file_output /home/lanforge/reports/LFCURL.csv + ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --file_output /home/lanforge/reports/LFCURL.csv --num_stations 2 --ssid Logan-Test-Net --passwd Logan-Test-Net --security wpa2 --type lfcurl --dest 192.168.1.1 GENERIC: - ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --num_stations 2 --ssid Logan-Test-Net + ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --num_stations 2 --ssid Logan-Test-Net --report_file /home/lanforge/reports/GENERIC.csv --passwd Logan-Test-Net --security wpa2 --type generic SPEEDTEST: - ./test_generic.py --radio 1.1.wiphy0 --num_stations 2 --report_file /home/lanforge/reports/SPEEDTEST.csv + ./test_generic.py --radio 1.1.wiphy0 --num_stations 2 --report_file /home/lanforge/reports/SPEEDTEST.csv --ssid Logan-Test-Net --passwd Logan-Test-Net --type speedtest --speedtest_min_up 20 --speedtest_min_dl 20 --speedtest_max_ping 150 --security wpa2 IPERF3 (under construction): ./test_generic.py --mgr localhost --mgr_port 4122 --radio wiphy1 --num_stations 3 --ssid jedway-wpa2-x2048-4-1 --passwd jedway-wpa2-x2048-4-1 --security wpa2 --type iperf3 @@ -123,7 +122,7 @@ def check_tab_exists(self): else: return True - def generate_report(self, test_rig, test_tag, dut_hw_version, dut_sw_version, + def generate_report(self, test_rig, test_tag, dut_hw_version, dut_sw_version, dut_model_num, dut_serial_num, test_id, csv_outfile, monitor_endps, generic_cols): report = lf_report.lf_report(_results_dir_name="test_generic_test") @@ -143,7 +142,7 @@ def generate_report(self, test_rig, test_tag, dut_hw_version, dut_sw_version, generic_cols = [self.replace_special_char(x) for x in generic_cols] generic_cols.append('last results') generic_fields = ",".join(generic_cols) - + gen_url = "/generic/%s?fields=%s" % (",".join(monitor_endps), generic_fields) endps = standardize_json_results(self.json_get(gen_url)) @@ -173,14 +172,14 @@ def generate_report(self, test_rig, test_tag, dut_hw_version, dut_sw_version, last_results=data[endpoint]['last results']) kpi_csv.kpi_dict['Units'] = "" kpi_csv.kpi_dict['Graph-Group'] = "Endpoint Last Results" - kpi_csv.kpi_csv_write_dict(kpi_csv.kpi_dict) + kpi_csv.kpi_csv_write_dict(kpi_csv.kpi_dict) if csv_outfile is not None: current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) csv_outfile = "{}_{}-sta_connect.csv".format( csv_outfile, current_time) csv_outfile = report.file_add_path(csv_outfile) - print("csv output file : {}".format(csv_outfile)) + print("csv output file : {}".format(csv_outfile)) def start(self): self.station_profile.admin_up() @@ -264,7 +263,7 @@ def main(): test_generic.py -------------------- Generic command example: -python3 ./test_generic.py +python3 ./test_generic.py --mgr localhost (optional) --mgr_port 4122 (optional) --upstream_port eth1 (optional) @@ -275,24 +274,24 @@ def main(): --passwd admin123 (required) --type lfping {generic | lfping | iperf3-client | speedtest | lf_curl} (required) --dest 10.40.0.1 (required - also target for iperf3) - --test_duration 2m - --interval 1s - --debug + --test_duration 2m + --interval 1s + --debug - Example commands: + Example commands: LFPING: - ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --ssid Logan-Test-Net --passwd Logan-Test-Net - --security wpa2 --num_stations 4 --type lfping --dest 192.168.1.1 --debug --log_level info + ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --ssid Logan-Test-Net --passwd Logan-Test-Net + --security wpa2 --num_stations 4 --type lfping --dest 192.168.1.1 --debug --log_level info --report_file /home/lanforge/reports/LFPING.csv --test_duration 20s --upstream_port 1.1.eth2 LFCURL: - ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --file_output /home/lanforge/reports/LFCURL.csv + ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --file_output /home/lanforge/reports/LFCURL.csv --num_stations 2 --ssid Logan-Test-Net --passwd Logan-Test-Net --security wpa2 --type lfcurl --dest 192.168.1.1 GENERIC: - ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --num_stations 2 --ssid Logan-Test-Net + ./test_generic.py --mgr localhost --mgr_port 4122 --radio 1.1.wiphy0 --num_stations 2 --ssid Logan-Test-Net --report_file /home/lanforge/reports/GENERIC.csv --passwd Logan-Test-Net --security wpa2 --type generic SPEEDTEST: - ./test_generic.py --radio 1.1.wiphy0 --num_stations 2 --report_file /home/lanforge/reports/SPEEDTEST.csv + ./test_generic.py --radio 1.1.wiphy0 --num_stations 2 --report_file /home/lanforge/reports/SPEEDTEST.csv --ssid Logan-Test-Net --passwd Logan-Test-Net --type speedtest --speedtest_min_up 20 --speedtest_min_dl 20 --speedtest_max_ping 150 --security wpa2 IPERF3 (under construction): ./test_generic.py --mgr localhost --mgr_port 4122 --radio wiphy1 --num_stations 3 --ssid jedway-wpa2-x2048-4-1 --passwd jedway-wpa2-x2048-4-1 --security wpa2 --type iperf3 @@ -318,7 +317,7 @@ def main(): parser.add_argument("--lf_user", type=str, help="user: lanforge") parser.add_argument("--lf_passwd", type=str, help="passwd: lanforge") - + parser.add_argument("--test_rig", default="", help="test rig for kpi.csv, testbed that the tests are run on") parser.add_argument("--test_tag", default="", help="test tag for kpi.csv, test specific information to differentiate the test") @@ -335,7 +334,7 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ test_generic.py will create stations and endpoints to generate traffic based on a command-line specified command type. This script will create a variable number of stations to test generic endpoints. Multiple command types can be tested @@ -359,16 +358,16 @@ def main(): shelf = rv[0] resource = rv[1] port_name = rv[2] - request_command = 'http://{lfmgr}:{lfport}/port/1/{resource}/{port_name}'.format( - lfmgr=args.mgr, lfport=args.mgr_port, resource=resource, port_name=port_name) + request_command = 'http://{lfmgr}:{lfport}/port/{shelf}/{resource}/{port_name}'.format( + lfmgr=args.mgr, lfport=args.mgr_port, shelf=shelf, resource=resource, port_name=port_name) logger.info("port request command: {request_command}".format(request_command=request_command)) request = requests.get(request_command, auth=(args.lf_user, args.lf_passwd)) logger.info("port request status_code {status}".format(status=request.status_code)) lanforge_json = request.json() - lanforge_json_formatted = json.dumps(lanforge_json, indent=4) - try: + lanforge_json_formatted = json.dumps(lanforge_json, indent=4) + try: key = 'interface' df = json_normalize(lanforge_json[key]) args.dest = df['ip'].iloc[0] @@ -376,7 +375,6 @@ def main(): traceback.print_exception(Exception, x, x.__traceback__, chain=True) logger.error("json returned : {lanforge_json_formatted}".format(lanforge_json_formatted=lanforge_json_formatted)) - num_sta = 2 if (args.num_stations is not None) and (int(args.num_stations) > 0): num_stations_converted = int(args.num_stations) @@ -388,7 +386,6 @@ def main(): # check if home/lanforge/report-data exists. if not, save # in new folder based in current file's directory - systeminfopath = None if args.report_file is None: new_file_path = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-h-%M-m-%S-s")).replace(':', @@ -470,13 +467,13 @@ def main(): logger.error(generic_test.get_fail_message()) generic_test.exit_fail() - if type(args.gen_cols) is not list: + if not isinstance(args.gen_cols, list): generic_cols = list(args.gen_cols.split(",")) # send col names here to file to reformat else: generic_cols = args.gen_cols # send col names here to file to reformat - if type(args.port_mgr_cols) is not list: + if not isinstance(args.port_mgr_cols, list): port_mgr_cols = list(args.port_mgr_cols.split(",")) # send col names here to file to reformat else: @@ -493,7 +490,7 @@ def main(): logger.info("Starting connections with 5 second settle time.") generic_test.start() - time.sleep(5) # give traffic a chance to get started. + time.sleep(5) # give traffic a chance to get started. resource_id = LFUtils.name_to_eid(args.radio)[1] @@ -502,9 +499,9 @@ def main(): must_increase_cols = ["rx bytes"] mon_endp = generic_test.generic_endps_profile.created_endp generic_test.generate_report(test_rig=args.test_rig, test_tag=args.test_tag, dut_hw_version=args.dut_hw_version, - dut_sw_version=args.dut_sw_version, dut_model_num=args.dut_model_num, - dut_serial_num=args.dut_serial_num, test_id=args.test_id, csv_outfile=args.csv_outfile, - monitor_endps=mon_endp, generic_cols=generic_cols) + dut_sw_version=args.dut_sw_version, dut_model_num=args.dut_model_num, + dut_serial_num=args.dut_serial_num, test_id=args.test_id, csv_outfile=args.csv_outfile, + monitor_endps=mon_endp, generic_cols=generic_cols) generic_test.generic_endps_profile.monitor(generic_cols=generic_cols, must_increase_cols=must_increase_cols, sta_list=station_list, @@ -526,7 +523,6 @@ def main(): generic_test.cleanup(station_list) - if len(generic_test.get_passed_result_list()) > 0: logger.info("Test-Generic Passing results:\n%s" % "\n".join(generic_test.get_passed_result_list())) if len(generic_test.generic_endps_profile.get_passed_result_list()) > 0: @@ -542,5 +538,6 @@ def main(): else: generic_test.exit_fail() + if __name__ == "__main__": main() diff --git a/py-scripts/test_ip_connection.py b/py-scripts/test_ip_connection.py index da43cef7a..7f418aef8 100755 --- a/py-scripts/test_ip_connection.py +++ b/py-scripts/test_ip_connection.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: test_ip_connection.py This script combines functionality of test_ipv4_connection.py and test_ipv6_connection.py. @@ -198,22 +197,22 @@ def main(): test_ip_connection.py -------------------------------------- Generic ipv6 command example: -python3 ./test_ip_connection.py - --upstream_port eth1 - --radio wiphy0 +python3 ./test_ip_connection.py + --upstream_port eth1 + --radio wiphy0 --num_stations 3 --ipv6 --proxy - --security {open|wep|wpa|wpa2|wpa3} - --ssid netgear + --security {open|wep|wpa|wpa2|wpa3} + --ssid netgear --passwd admin123 - --mode 1 + --mode 1 --ap "00:0e:8e:78:e1:76" --test_id - --timeout 120 + --timeout 120 --debug -Generic ipv4 command example: +Generic ipv4 command example: ./test_ip_connection.py --upstream_port eth1 --radio wiphy0 @@ -227,13 +226,13 @@ def main(): parser.add_argument("--ap", help="Add BSSID of access point to connect to") parser.add_argument('--mode', help=Realm.Help_Mode) parser.add_argument('--timeout', - help='--timeout sets the length of time to wait until a connection is successful', - default=30) + help='--timeout sets the length of time to wait until a connection is successful', + default=30) parser.add_argument('--use_existing_sta', help='Used an existing stationsto a particular AP', action='store_true') args = parser.parse_args() - help_summary='''\ + help_summary = '''\ ./test_ip_connection.py may not be functional , added this summary to allow the help_summary check to pass The script si create station then attemp to authenticate, associate, and receive IP address on the chosen SSID ''' @@ -241,7 +240,6 @@ def main(): print(help_summary) exit(0) - if args.radio is None: raise ValueError("--radio required") diff --git a/py-scripts/test_ip_variable_time.py b/py-scripts/test_ip_variable_time.py index 5bb19d403..577d05c88 100755 --- a/py-scripts/test_ip_variable_time.py +++ b/py-scripts/test_ip_variable_time.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: test_ip_variable_time.py @@ -265,6 +264,8 @@ import logging import time import csv +import traceback + if sys.version_info[0] != 3: print("This script requires Python 3") @@ -530,7 +531,8 @@ def start(self): self.station_profile.admin_up() try: self.csv_add_column_headers() - except: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) logger.debug("csv result file is None") temp_stas = self.station_profile.station_names.copy() # logger.info("temp_stas {temp_stas}".format(temp_stas=temp_stas)) @@ -539,7 +541,7 @@ def start(self): self._pass("All stations got IPs") else: self._fail("Stations failed to get IPs") - #self.exit_fail() + # self.exit_fail() self.cx_profile.start_cx() def stop(self): @@ -579,14 +581,15 @@ def build(self): logger.info("Creating stations") try: self.station_profile.mode = self.mode[i] - except Exception as e: + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) self.station_profile.mode = 0 self.station_profile.create(radio=self.radio[i], sta_names_=self.sta_list[i], debug=self.debug) self._pass("PASS: Station build finished") self.cx_profile.create(endp_type=self.traffic_type, side_a=self.sta_list[i], - side_b=self.upstream[i], - sleep_time=0) + side_b=self.upstream[i], + sleep_time=0) def run(self): if self.report_file is None: @@ -642,14 +645,16 @@ def run(self): layer3connections = ','.join([[*x.keys()][0] for x in self.json_get('endp')['endpoint']]) except ValueError: raise ValueError('Unable to find layer 3 connections.') + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) - if type(self.layer3_cols) is not list: + if not isinstance(self.layer3_cols, list): layer3_cols = list(self.layer3_cols.split(",")) # send col names here to file to reformat else: layer3_cols = self.layer3_cols # send col names here to file to reformat - if type(self.port_mgr_cols) is not list: + if not isinstance(self.port_mgr_cols, list): port_mgr_cols = list(self.port_mgr_cols.split(",")) # send col names here to file to reformat else: @@ -664,8 +669,8 @@ def run(self): try: # monitor interval returns milliseconds monitor_interval = Realm.parse_time(self.monitor_interval).total_seconds() - except ValueError as error: - logger.critical(error) + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) logger.critical( "The time string provided for monitor_interval argument is invalid. Please see supported time stamp increments and inputs for monitor_interval in --help. ") return ValueError( @@ -699,7 +704,7 @@ def run(self): # logger.info(layer3endps) # for i in range(len(self.upstream)): comp_sta_list = [] - list(map(comp_sta_list.extend,self.sta_list)) + list(map(comp_sta_list.extend, self.sta_list)) self.cx_profile.monitor(layer3_cols=layer3_cols, sta_list=comp_sta_list, port_mgr_cols=port_mgr_cols, @@ -711,7 +716,7 @@ def run(self): output_format=output, compared_report=compared_rept, script_name='test_ip_variable_time', - resource= self.resource, + resource=self.resource, debug=self.debug) # fill out data kpi.csv and results reports @@ -753,15 +758,17 @@ def run_only(self): layer3connections = ','.join([[*x.keys()][0] for x in self.json_get('endp')['endpoint']]) except ValueError: raise ValueError('Try setting the upstream port flag if your device does not have an eth1 port') + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) - if type(self.layer3_cols) is not list: + if not isinstance(self.layer3_cols, list): layer3_cols = list(self.layer3_cols.split(",")) # send col names here to file to reformat else: layer3_cols = self.layer3_cols # send col names here to file to reformat - if type(self.port_mgr_cols) is not list: + if not isinstance(self.port_mgr_cols, list): port_mgr_cols = list(self.port_mgr_cols.split(",")) # send col names here to file to reformat else: @@ -775,8 +782,8 @@ def run_only(self): try: monitor_interval = Realm.parse_time(self.monitor_interval).total_seconds() - except ValueError as error: - logger.critical(error) + except Exception as x: + traceback.print_exception(Exception, x, x.__traceback__, chain=True) logger.critical( "The time string provided for monitor_interval argument is invalid. Please see supported time stamp increments and inputs for monitor_interval in --help. ") return ValueError( @@ -792,17 +799,16 @@ def run_only(self): new_l3_endps_list.append(item) layer3endps = ','.join(str(l3endps) for l3endps in new_l3_endps_list) - comp_sta_list = [] list(map(comp_sta_list.extend, self.sta_list)) self.cx_profile.monitor_without_disturbing_other_monitor(layer3_cols=layer3_cols, - sta_list=comp_sta_list, - port_mgr_cols=port_mgr_cols, - duration_sec=self.test_duration, - monitor_interval_ms=monitor_interval, - created_cx=layer3endps, - script_name='test_ip_variable_time2', - debug=self.debug) + sta_list=comp_sta_list, + port_mgr_cols=port_mgr_cols, + duration_sec=self.test_duration, + monitor_interval_ms=monitor_interval, + created_cx=layer3endps, + script_name='test_ip_variable_time2', + debug=self.debug) # fill out data kpi.csv and results reports temp_stations_list = [] @@ -989,34 +995,34 @@ def record_results( def csv_generate_results_column_headers(self): if self.traffic_type.endswith("tcp"): csv_rx_headers = [ - 'Time epoch', - 'Time', - 'Station-Count', - 'UL-Min-Requested', - 'UL-Max-Requested', - 'DL-Min-Requested', - 'DL-Max-Requested', - # 'Attenuation', - 'TCP-Upload-bps', - 'TCP-Download-bps', - 'Total-TCP-Upload-bps', - 'Total-TCP-Download-bps', - 'Total-TCP-UL/DL-bps'] + 'Time epoch', + 'Time', + 'Station-Count', + 'UL-Min-Requested', + 'UL-Max-Requested', + 'DL-Min-Requested', + 'DL-Max-Requested', + # 'Attenuation', + 'TCP-Upload-bps', + 'TCP-Download-bps', + 'Total-TCP-Upload-bps', + 'Total-TCP-Download-bps', + 'Total-TCP-UL/DL-bps'] elif self.traffic_type.endswith("udp"): csv_rx_headers = [ - 'Time epoch', - 'Time', - 'Station-Count', - 'UL-Min-Requested', - 'UL-Max-Requested', - 'DL-Min-Requested', - 'DL-Max-Requested', - # 'Attenuation', - 'UDP-Upload-bps', - 'UDP-Download-bps', - 'Total-UDP-Upload-bps', - 'Total-UDP-Download-bps', - 'Total-UDP-UL/DL-bps'] + 'Time epoch', + 'Time', + 'Station-Count', + 'UL-Min-Requested', + 'UL-Max-Requested', + 'DL-Min-Requested', + 'DL-Max-Requested', + # 'Attenuation', + 'UDP-Upload-bps', + 'UDP-Download-bps', + 'Total-UDP-Upload-bps', + 'Total-UDP-Download-bps', + 'Total-UDP-UL/DL-bps'] return csv_rx_headers @@ -1030,9 +1036,9 @@ def csv_add_column_headers(self): def main(): help_summary = '''\ - This script is designed to generate a variable number (N) of stations and establish cross connections while - facilitating the execution of UDP/TCP layer 3 traffic for a duration specified by the user. Additionally, it - supports the utilization of existing stations and the creation of stations across multiple radios. Furthermore, + This script is designed to generate a variable number (N) of stations and establish cross connections while + facilitating the execution of UDP/TCP layer 3 traffic for a duration specified by the user. Additionally, it + supports the utilization of existing stations and the creation of stations across multiple radios. Furthermore, stations can connect to multiple SSIDs as specified by the user. ''' # Realm args parser is one directory up then traverse into /py-json/LANforge/lfcli_base.py @@ -1078,10 +1084,10 @@ def main(): --a_min 600000000 --b_min 600000000 --upstream_port eth2 --mode '5' --layer3_cols 'name','tx rate','rx rate' `--port_mgr_cols 'alias','channel','activity','mode' --num_stations 2 - + 4. Create Multiple stations and run traffic with different upstream port - ./test_ip_variable_time.py --mgr 192.168.200.37 --radio wiphy0 wiphy0 --ssid ssid_2g ssid_5g - --test_duration 60s --output_format csv --traffic_type lf_tcp --a_min 600000000 --b_min 600000000 + ./test_ip_variable_time.py --mgr 192.168.200.37 --radio wiphy0 wiphy0 --ssid ssid_2g ssid_5g + --test_duration 60s --output_format csv --traffic_type lf_tcp --a_min 600000000 --b_min 600000000 --upstream_port eth2 eth1 --mode '5' --num_stations 1 --passwd pass_2g pass_5g --security wpa2 wpa2 SCRIPT_CLASSIFICATION: Creation & Runs Traffic @@ -1100,7 +1106,7 @@ def main(): Mode 2: When station is already available, - + This script will create layer3 cross-connects and endpoints It will then create layer 3 traffic over a specified amount of time, testing for increased traffic at regular intervals. This test will pass if all stations increase traffic over the full test duration. @@ -1147,8 +1153,8 @@ def main(): Using the layer3_cols flag: Currently the output function does not support inputting the columns in layer3_cols the way they are displayed in the GUI. - This quirk is under construction. To output certain columns in the GUI in your final report, please match the according - GUI column displayed to it's counterpart to have the additional columns correctly displayed in your report. + This quirk is under construction. To output certain columns in the GUI in your final report, please match the according + GUI column displayed to it's counterpart to have the additional columns correctly displayed in your report. Note that the report will prepend "l3-" to the supplied layer3_col flags. GUI Column Display Layer3_cols argument to type in (to print in report) @@ -1291,7 +1297,7 @@ def main(): search for create_basic_argsparse --mgr --mgr_port --upstream_port --num_stations --radio --security --ssid --passwd -STATUS: Functional +STATUS: Functional VERIFIED_ON: 15-JULY-2023, Build Version: 5.4.6 @@ -1340,9 +1346,9 @@ def main(): ) optional.add_argument('--debug_log', default=None, help="Specify a file to send debug output to") - optional.add_argument('--no_cleanup', help='Do not cleanup before exit', action='store_true') + optional.add_argument('--no_cleanup', help='Do not cleanup before exit', action='store_true') - #-----required--------------- + # -----required--------------- required.add_argument('--radio', nargs="+", help='radio EID, e.g: --radio wiphy0 wiphy2') required.add_argument('--security', nargs="+", default=["open"], help='WiFi Security protocol: < open | wep | wpa | wpa2 | wpa3 > e.g: --security open wpa') @@ -1353,21 +1359,21 @@ def main(): optional.add_argument('--mode', nargs="+", help='Used to force mode of stations e.g: --mode 11 9') optional.add_argument('--ap', nargs="+", help='Used to force a connection to a particular AP') optional.add_argument('--traffic_type', help='Select the Traffic Type [lf_udp, lf_tcp, udp, tcp], type will be ' - 'adjusted automatically between ipv4 and ipv6 based on use of --ipv6 flag') + 'adjusted automatically between ipv4 and ipv6 based on use of --ipv6 flag') optional.add_argument('--output_format', help='choose either csv or xlsx') optional.add_argument('--report_file', help='where you want to store results', default=None) optional.add_argument('--a_min', help='--a_min bps rate minimum for side_a', default=256000) optional.add_argument('--b_min', help='--b_min bps rate minimum for side_b', default=256000) optional.add_argument('--test_duration', help='--test_duration sets the duration of the test', default="2m") optional.add_argument('--layer3_cols', help='Additional columns wished to be monitored from the layer 3 endpoint tab for reporting', - default=['name', 'tx bytes', 'rx bytes', 'tx rate', 'rx rate']) + default=['name', 'tx bytes', 'rx bytes', 'tx rate', 'rx rate']) optional.add_argument('--port_mgr_cols', help='Additional columns wished to be monitored from port manager tab for reporting', - default=['alias', 'ap', 'ip', 'parent dev', 'rx-rate']) + default=['alias', 'ap', 'ip', 'parent dev', 'rx-rate']) optional.add_argument('--compared_report', help='report path and file which is wished to be compared with new report', - default=None) + default=None) optional.add_argument('--monitor_interval', - help='how frequently do you want your monitor function to take measurements, 35s, 2h, lowest is 250ms', - default='1000ms') + help='how frequently do you want your monitor function to take measurements, 35s, 2h, lowest is 250ms', + default='1000ms') optional.add_argument('--ipv6', help='Sets the test to use IPv6 traffic instead of IPv4', action='store_true') parser.add_argument('--use_existing_sta', help='Used an existing stations to a particular AP', action='store_true') parser.add_argument('--sta_names', help='Used to force a connection to a particular AP', default="sta0000") @@ -1426,7 +1432,6 @@ def main(): logger_config.lf_logger_config_json = args.lf_logger_config_json logger_config.load_lf_logger_config() - # for kpi.csv generation local_lf_report_dir = args.local_lf_report_dir test_rig = args.test_rig @@ -1483,8 +1488,8 @@ def main(): logger.info("two") station_list = [] for i in args.radio: - station_list.append(LFUtils.portNameSeries(prefix_="R"+str(args.radio.index(i))+"-sta", start_id_=0, end_id_=num_sta - 1, - padding_number_=10000, radio=i)) + station_list.append(LFUtils.portNameSeries(prefix_="R" + str(args.radio.index(i)) + "-sta", start_id_=0, end_id_=num_sta - 1, + padding_number_=10000, radio=i)) else: logger.info("three") station_list = args.sta_names.split(",") @@ -1567,7 +1572,7 @@ def main(): "cross-connects and enpoints. The test will then monitor for increased " "traffic at regular intervals, and if all stations increase traffic " "over the full test duration, the test will pass." - ) + ) report.build_objective() test_setup_info = { diff --git a/py-scripts/test_l3.py b/py-scripts/test_l3.py index 7f8fa668d..0a812a0fb 100755 --- a/py-scripts/test_l3.py +++ b/py-scripts/test_l3.py @@ -661,7 +661,6 @@ realm = importlib.import_module("py-json.realm") DeviceConfig = importlib.import_module("py-scripts.DeviceConfig") lf_attenuator = importlib.import_module("py-scripts.lf_atten_mod_test") -modify_vap = importlib.import_module("py-scripts.modify_vap") lf_modify_radio = importlib.import_module("py-scripts.lf_modify_radio") lf_cleanup = importlib.import_module("py-scripts.lf_cleanup") Realm = realm.Realm @@ -2023,6 +2022,12 @@ def build(self, rebuild=False): for station_profile in self.station_profiles: self.station_names_list.extend(station_profile.station_names) + # with changes that came in around 3/2025 the station_names_list was moved + # from start to build, since test l3 can do a rebuild due to being able to run + # multiple iterations thus the station list would grow there is a need + # on build to remove duplicates + self.station_names_list = list(set(self.station_names_list)) + if self.dataplane: self._pass( "PASS: CX build finished: created/updated: %s connections." % diff --git a/py-scripts/test_l3_WAN_LAN.py b/py-scripts/test_l3_WAN_LAN.py index 9c0677e1d..83b82ac2b 100755 --- a/py-scripts/test_l3_WAN_LAN.py +++ b/py-scripts/test_l3_WAN_LAN.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import importlib @@ -94,7 +93,7 @@ def __compare_vals(old_list, new_list): passes = 0 expected_passes = 0 if len(old_list) == len(new_list): - for item, value in old_list.items(): + for item, _ in old_list.items(): expected_passes += 1 if new_list[item] > old_list[item]: passes += 1 @@ -220,8 +219,8 @@ def main(): parser.add_argument('--vr_name', help='--vr_name sets the name to be used by the virtual router', default="vr_test") args = parser.parse_args() - help_summary='''\ -Work in progress. This script is for testing WAN to LAN traffic. + help_summary = '''\ +Work in progress. This script is for testing WAN to LAN traffic. ''' if args.help_summary: print(help_summary) diff --git a/py-scripts/test_l3_longevity.py b/py-scripts/test_l3_longevity.py index 269376940..21705be5e 100755 --- a/py-scripts/test_l3_longevity.py +++ b/py-scripts/test_l3_longevity.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ ## NAME: test_l3_longevity.py @@ -103,7 +102,7 @@ # used for Attenuator and possible vap testing testing lf_attenuator = importlib.import_module("py-scripts.lf_atten_mod_test") -modify_vap = importlib.import_module("py-scripts.modify_vap") +# modify_vap = importlib.import_module("py-scripts.modify_vap") lf_modify_radio = importlib.import_module("py-scripts.lf_modify_radio") # cleanup library @@ -1625,7 +1624,7 @@ def start(self, print_pass=False): # Find latency, jitter for connections # using this port. - latency, jitter, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll = self.get_endp_stats_for_port(port_data["port"], endps) + latency, jitter, total_dl_rate, total_dl_rate_ll, total_dl_pkts_ll, total_ul_rate, total_ul_rate_ll, total_ul_pkts_ll = self.get_endp_stats_for_port(port_data["port"], endps) # noqa: E501 # now report the ap_chanim_stats along # side of the ap_stats_5g @@ -2006,7 +2005,7 @@ def start(self, print_pass=False): logger.info(pformat(response)) else: cx_data = response[cx_name] - type, state, pkt_rx_a, pkt_rx_b, bps_rx_a, bps_rx_b, rx_drop_percent_a, rx_drop_percent_b, drop_pkts_a, drop_pkts_b, avg_rtt, rpt_timer, eid = self.get_l3_stats_for_cx(cx_data) + type, state, pkt_rx_a, pkt_rx_b, bps_rx_a, bps_rx_b, rx_drop_percent_a, rx_drop_percent_b, drop_pkts_a, drop_pkts_b, avg_rtt, rpt_timer, eid = self.get_l3_stats_for_cx(cx_data) # noqa: E501 self.write_l3_csv(cx_name, type, @@ -2056,7 +2055,7 @@ def start(self, print_pass=False): # we should be able to add the values for each eid all_dl_ports_stations_sum_df = all_dl_ports_stations_df.groupby(['Time epoch'])[['Rx-Bps', 'Tx-Bps', 'Rx-Latency', 'Rx-Jitter', - 'Ul-Rx-Goodput-bps', 'Ul-Rx-Rate-ll', 'Ul-Rx-Pkts-ll', 'Dl-Rx-Goodput-bps', 'Dl-Rx-Rate-ll', 'Dl-Rx-Pkts-ll']].sum() + 'Ul-Rx-Goodput-bps', 'Ul-Rx-Rate-ll', 'Ul-Rx-Pkts-ll', 'Dl-Rx-Goodput-bps', 'Dl-Rx-Rate-ll', 'Dl-Rx-Pkts-ll']].sum() # noqa: E501 all_dl_ports_stations_sum_file_name = self.outfile[:-4] all_dl_port_stations_sum_file_name = all_dl_ports_stations_sum_file_name + "-dl-all-eids-sum-per-interval.csv" diff --git a/py-scripts/test_l3_powersave_traffic.py b/py-scripts/test_l3_powersave_traffic.py index e06d892f1..604db38fe 100755 --- a/py-scripts/test_l3_powersave_traffic.py +++ b/py-scripts/test_l3_powersave_traffic.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import importlib @@ -188,14 +187,13 @@ def main(): args = parser.parse_args() - help_summary='''\ -Script not functional or no longer supported: see script py-scripts/test_l3.py as replacement + help_summary = '''\ +Script shows example of creating L3 connections: see script py-scripts/test_l3.py as replacement ''' if args.help_summary: print(help_summary) exit(0) - lfjson_host = args.mgr lfjson_port = 8080 station_list = LFUtils.portNameSeries(prefix_="sta", start_id_=0, end_id_=0, padding_number_=10000) diff --git a/py-scripts/test_l3_unicast_traffic_gen.py b/py-scripts/test_l3_unicast_traffic_gen.py index 1a1261e80..1c42c6ffd 100755 --- a/py-scripts/test_l3_unicast_traffic_gen.py +++ b/py-scripts/test_l3_unicast_traffic_gen.py @@ -1,11 +1,10 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: test_l3_unicaast_traffic_gen.py -NOTES: - -Looke at lanforge_api.py EAP-PEAP # Use EAP-PEAP connection logic on all ssids, deprecated, see add_dut_ssid. +NOTES: +This script is not functional : consider moving to scripts deprecated +Look at lanforge_api.py EAP-PEAP # Use EAP-PEAP connection logic on all ssids, deprecated, see add_dut_ssid. COPYRIGHT: Copyright 2022 Candela Technoligies Inc @@ -18,7 +17,7 @@ import time import datetime import logging -import copy +# import copy if sys.version_info[0] != 3: print("This script requires Python 3") @@ -34,35 +33,34 @@ logger = logging.getLogger(__name__) - class L3VariableTimeLongevity(Realm): - def __init__(self, - host='localhost', - port='8080', - endp_type=None, - side_b=None, - radios=None, - radio_name_list=None, - number_of_stations_per_radio_list=None, - ssid_list=[], - ssid_password_list=[], - security_list=[], - station_lists=[], - key_mgt_list=[], - pairwise_list=[], - group_list=None, - eap_list=None, - name_prefix=None, - resource=None, - side_a_min_rate=1240000, - side_a_max_rate=0, - side_b_min_rate=1240000, - side_b_max_rate=0, - number_template="00", - test_duration="125s", - _debug_on=False, - _exit_on_error=False, - _exit_on_fail=False): + def __init__(self, + host='localhost', + port='8080', + endp_type=None, + side_b=None, + radios=None, + radio_name_list=None, + number_of_stations_per_radio_list=None, + ssid_list=[], + ssid_password_list=[], + security_list=[], + station_lists=[], + key_mgt_list=[], + pairwise_list=[], + group_list=None, + eap_list=None, + name_prefix=None, + resource=None, + side_a_min_rate=1240000, + side_a_max_rate=0, + side_b_min_rate=1240000, + side_b_max_rate=0, + number_template="00", + test_duration="125s", + _debug_on=False, + _exit_on_error=False, + _exit_on_fail=False): super().__init__(lfclient_host=host, lfclient_port=port, debug_=_debug_on, _exit_on_fail=_exit_on_fail) self.host = host self.port = port @@ -130,11 +128,10 @@ def __init__(self, ipaddr_type_avail="[BLANK]", network_auth_type="[BLANK]", anqp_3gpp_cell_net="[BLANK]" - ) - self.station_profile.set_command_param("add_sta","ieee80211w", 2) - self.station_profile.set_command_flag("add_sta","80211u_enable", 0) - self.station_profile.set_command_flag("add_sta","8021x_radius", 1) - + ) + self.station_profile.set_command_param("add_sta", "ieee80211w", 2) + self.station_profile.set_command_flag("add_sta", "80211u_enable", 0) + self.station_profile.set_command_flag("add_sta", "8021x_radius", 1) self.station_profile.number_template = self.number_template self.station_profile.mode = 0 @@ -187,7 +184,7 @@ def start(self, print_pass=False, print_fail=False): station_profile.admin_up() if self.wait_for_ip(station_list=station_list, timeout_sec=10 * len(station_list)): if self.debug: - logger_info("ips acquired {}".format(station_list)) + logger.info("ips acquired {}".format(station_list)) else: if self.wait_for_ip(station_list=station_list): logger.info("tried again, ip qcquired {}".format(station_list)) @@ -263,18 +260,18 @@ def cleanup(self): def build(self): # refactor in LFUtils.port_zero_request() - #resource = 1 + # resource = 1 # refactor into LFUtils - #data = { + # data = { # "shelf": 1, # "resource": resource, # "port": "br0", # "network_devs": "eth1," - #} - #url = "cli-json/add_br" - #self.json_post(url, data) + # } + # url = "cli-json/add_br" + # self.json_post(url, data) data = LFUtils.port_dhcp_up_request(self.resource, self.side_b) self.json_post("/cli-json/set_port", data) @@ -335,36 +332,36 @@ def main(): description='''\ test_l3_unicast_traffic_gen.py: -------------------- -Basic Idea: +Basic Idea: -create stations, create traffic between upstream port and stations, run traffic. +create stations, create traffic between upstream port and stations, run traffic. The traffic on the stations will be checked once per minute to verify that traffic is transmitted and received. Test will exit on failure of not receiving traffic for one minute on any station. -Scripts are executed from: ./lanforge/py-scripts +Scripts are executed from: ./lanforge/py-scripts -Stations start counting form zero, thus stations count from zero - number of las +Stations start counting form zero, thus stations count from zero - number of las Generic command layout: python ./test_l3_unicast_traffic_gen.py - --test_duration - --endp_type - --upstream_port + --test_duration + --endp_type + --upstream_port --radio -Note: +Note: multiple --radio switches may be entered up to the number of radios available: --radio --radio -: number followed by one of the following +: number followed by one of the following d - days h - hours m - minutes s - seconds -: +: lf_udp : IPv4 UDP traffic lf_tcp : IPv4 TCP traffic lf_udp6 : IPv6 UDP traffic @@ -377,11 +374,11 @@ def main(): 4. Radio #1 wiphy0 has 32 stations, ssid = candelaTech-wpa2-x2048-4-1, ssid password = candelaTech-wpa2-x2048-4-1 5. Radio #2 wiphy1 has 64 stations, ssid = candelaTech-wpa2-x2048-5-3, ssid password = candelaTech-wpa2-x2048-5-3 -Example: +Example: Some of the command line switches are in /py-json/lfcli_base.py python3 .\\test_l3_unicast_traffic_gen.py --lfmgr --test_duration 4m --endp_type lf_tcp --upstream_port eth1 \ --radio wiphy0 32 candelaTech-wpa2-x2048-4-1 candelaTech-wpa2-x2048-4-1 \ - --radio wiphy1 64 candelaTech-wpa2-x2048-5-3 candelaTech-wpa2-x2048-5-3 + --radio wiphy1 64 candelaTech-wpa2-x2048-5-3 candelaTech-wpa2-x2048-5-3 ''') @@ -392,16 +389,14 @@ def main(): help='--endp_type example --endp_type lf_udp, default: lf_udp , options: lf_udp, lf_udp6, lf_tcp, lf_tcp6', default='lf_udp', type=valid_endp_type) - - requiredNamed = parser.add_argument_group('required arguments') requiredNamed.add_argument('--radio_list', action='append', nargs='*', - help=''' + help=''' --radio_list if radio list is 4 in length the security defaults to wpa2, all other parameters are 'DEFAULT' - if radio list is 5 in length, security is set, all other parameters are 'DEFAULT' + if radio list is 5 in length, security is set, all other parameters are 'DEFAULT' if radio list is 6 in length, key management is set to OWE, security needs to be set so radio list key_management = OWE @@ -413,7 +408,7 @@ def main(): eap_methods = EAP-PEAP (WPA2 TLS) [14] - if radio list is + if radio list is Key_management = WPA-EAP EAP Methods = EAP-TLS EAP Identity = testuser @@ -426,7 +421,7 @@ def main(): Enabled PKC = checked (WPA2 TTLS) [10] - if radio list is + if radio list is Key_management = WPA-EAP EAP Methods = EAP-TTLS EAP Identity = testuser @@ -436,7 +431,7 @@ def main(): (WPA3 TLS) [16] - if radio list is + if radio list is Key_management = WPA-EAP-SUITE-B-192 Pairwise Ciphers = GCMP-256 (wpa3) Group Ciphers = GCMP - 256 (wpa3) @@ -452,7 +447,7 @@ def main(): (WPA3 TTLS) [12] - if radio list is + if radio list is Key_management = WPA-EAP Pairwise Ciphers = GCMP-256 (wpa3) Group Ciphers = GCMP-256 (wpa3) @@ -470,7 +465,7 @@ def main(): ''') args = parser.parse_args() - help_summary='''\ + help_summary = '''\ Script Deprecated: This script is replaced by py-scripts/test_l3.py. ''' if args.help_summary: @@ -493,7 +488,7 @@ def main(): side_b = LFUtils.name_to_eid(args.upstream_port) resource = side_b[1] - upstream_port = side_b[2] + upstream_port = side_b[2] radio_offset = 0 number_of_stations_offset = 1 @@ -508,28 +503,24 @@ def main(): eap_offset = 8 # WPA2_TLS - - - # WPA2_TTLS - wpa2_ttls_key_mgt_offset = 5 - wpa2_ttls_eap_methods = 6 - wpa2_ttls_eap_identity = 7 - wpa2_ttls_eap_password = 8 - wpa2_ttls_pk_password = 9 + # WPA2_TTLS + # wpa2_ttls_key_mgt_offset = 5 + # wpa2_ttls_eap_methods = 6 + # wpa2_ttls_eap_identity = 7 + # wpa2_ttls_eap_password = 8 + # wpa2_ttls_pk_password = 9 # WPA3_TTLS - wpa3_ttls_key_mgt_offset = 5 - wpa3_ttls_pairwise_offset = 6 - wpa3_ttls_group_offset = 7 - wpa3_ttls_eap_methods = 8 - wpa3_ttls_eap_identity = 9 - wpa3_ttls_eap_password = 10 + # wpa3_ttls_key_mgt_offset = 5 + # wpa3_ttls_pairwise_offset = 6 + # wpa3_ttls_group_offset = 7 + # wpa3_ttls_eap_methods = 8 + # wpa3_ttls_eap_identity = 9 + # wpa3_ttls_eap_password = 10 # Ieee80211w = Required # Advanced/8021x = checked - - MAX_NUMBER_OF_STATIONS = 64 radio_name_list = [] @@ -540,7 +531,7 @@ def main(): key_mgt_list = [] pairwise_list = [] group_list = [] - eap_list = [] + eap_list = [] logger.info("radio_list length {radio_list}".format(radio_list=len(args.radio_list))) @@ -578,11 +569,11 @@ def main(): else: logger.info(''' if radio list is 4 in length the security defaults to wpa2, all other parameters are 'DEFAULT' - if radio list is 5 in length, security is set, all other parameters are 'DEFAULT' + if radio list is 5 in length, security is set, all other parameters are 'DEFAULT' if radio list is 6 in length, key management is set to OWE, security needs to be set so radio list if radio list is 9 then all parameters are set Acceptable lengths are 4,5,6,9 - ''' ) + ''') exit(2) security_list.append(security) @@ -591,7 +582,6 @@ def main(): group_list.append(group) eap_list.append(eap) - station_lists = [] for radio_list in range(0, len(args.radio_list)): number_of_stations = int(number_of_stations_per_radio_list[radio_list]) @@ -602,25 +592,25 @@ def main(): end_id_=number_of_stations + radio_list * 1000, padding_number_=10000) station_lists.append(station_list) - ip_var_test = L3VariableTimeLongevity(host=args.mgr, - port=args.mgr_port, - station_lists=station_lists, - name_prefix="var_time", - resource=resource, - endp_type=args.endp_type, - side_b=upstream_port, - radios=args.radio_list, - radio_name_list=radio_name_list, - number_of_stations_per_radio_list=number_of_stations_per_radio_list, - ssid_list=ssid_list, - ssid_password_list=ssid_password_list, - security_list=security_list, - key_mgt_list=key_mgt_list, - pairwise_list=pairwise_list, - group_list=group_list, - eap_list=eap_list, - test_duration=args.test_duration, - _debug_on=args.debug) + ip_var_test = L3VariableTimeLongevity(host=args.mgr, + port=args.mgr_port, + station_lists=station_lists, + name_prefix="var_time", + resource=resource, + endp_type=args.endp_type, + side_b=upstream_port, + radios=args.radio_list, + radio_name_list=radio_name_list, + number_of_stations_per_radio_list=number_of_stations_per_radio_list, + ssid_list=ssid_list, + ssid_password_list=ssid_password_list, + security_list=security_list, + key_mgt_list=key_mgt_list, + pairwise_list=pairwise_list, + group_list=group_list, + eap_list=eap_list, + test_duration=args.test_duration, + _debug_on=args.debug) ip_var_test.pre_cleanup() ip_var_test.build() diff --git a/py-scripts/test_l4.py b/py-scripts/test_l4.py index 8b2ad4858..de7b85a88 100755 --- a/py-scripts/test_l4.py +++ b/py-scripts/test_l4.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: test_l4.py @@ -83,6 +82,17 @@ --report_file test_l4.csv --test_rig Test-Lab --test_tag L4 --dut_hw_version Linux --dut_model_num 1 --dut_sw_version 5.4.5 --dut_serial_num 1234 --test_id "L4 data" +EXAMPLE (using existing stations): + ./test_l4.py --mgr localhost --upstream_port eth1 --use_ports "sta000 sta0001" + --test_duration 1m --url "dl http://192.168/-.103/ /dev/null" + --requests_per_ten 600 --test_type 'urls' --test_rig Test-Lab + --dut_hw_version Linux --test_id "L4 data" + +EXAMPLE (using existing MACVLANS): + ./test_l4.py --mgr localhost --upstream_port eth1 --use_ports eth1#0 --test_duration 1m + --url "dl http://192.168/-.103/ /dev/null" --requests_per_ten 600 --test_type 'urls' + --test_rig Test-Lab --dut_hw_version Linux --test_id "L4 data" + STATUS: UNDER DEVELOPMENT COPYRIGHT: @@ -114,8 +124,8 @@ realm = importlib.import_module("py-json.realm") Realm = realm.Realm lanforge_api = importlib.import_module("lanforge_client.lanforge_api") -from lanforge_client.lanforge_api import LFSession -from lanforge_client.lanforge_api import LFJsonCommand +from lanforge_client.lanforge_api import LFSession # noqa: E402 +from lanforge_client.lanforge_api import LFJsonCommand # noqa: E402 F401 TestGroupProfile = realm.TestGroupProfile port_utils = importlib.import_module("py-json.port_utils") PortUtils = port_utils.PortUtils @@ -156,7 +166,8 @@ def __init__(self, test_type=None, _exit_on_error=False, _exit_on_fail=False, - l4_7_port=None): + l4_7_port=None, + port_list=None): super().__init__(lfclient_host=host, lfclient_port=port, debug_=_debug_on) self.host = host @@ -193,7 +204,6 @@ def __init__(self, stream_warnings=True, require_session=True, exit_on_error=True) - self.command: LFJsonCommand self.command = self.session.get_command() self.station_profile.lfclient_url = self.lfclient_url self.station_profile.ssid = self.ssid @@ -206,6 +216,7 @@ def __init__(self, self.ftp_passwd = ftp_passwd self.source = source self.dest = dest + self.port_list = port_list self.ftp = ftp self.http = False @@ -252,9 +263,7 @@ def get_rx_values(self): endp_list = self.json_get("/layer4/all") # logger.info("endp_list: {endp_list}".format(endp_list=endp_list)) - endp_rx_drop_map = {} endp_rx_map = {} - our_endps = {} endps = [] total_bytes_rd = 0 @@ -356,13 +365,13 @@ def get_rx_values(self): # logger.debug("total-dl: ", total_dl, " total-ul: ", total_ul, "\n") return endp_rx_map, endps, total_bytes_rd, total_bytes_wr, total_rx_rate, total_tx_rate, urls_seconds, total_urls - def set_port_report_timer(self,cx_names=None): - for cx_name in cx_names: + def set_port_report_timer(self, cx_names=None): + for cx_name in cx_names: self.command.post_set_cx_report_timer(cx_name=cx_name, - test_mgr="default_tm", - milliseconds=int(self.rpt_timer), - debug=self.debug) - + test_mgr="default_tm", + milliseconds=int(self.rpt_timer), + debug=self.debug) + def build(self): l4_7_port_lst = [] if 'http' in self.url: @@ -370,7 +379,13 @@ def build(self): self.http = True if 'ftp' in self.url: self.port_util.set_ftp(port_name=self.name_to_eid(self.upstream_port)[2], resource=1, on=True) - if len(self.sta_list) > 0: + if self.port_list: + logger.info("Checking that all {num} specified ports exist".format(num=len(self.port_list))) + if not LFUtils.wait_until_ports_appear(port_list=self.port_list): + logger.critical("Not all ports specified ports exist") + exit(1) + self._pass("PASS: Specified ports found") + elif len(self.sta_list) > 0: # Build stations self.station_profile.use_security(self.security, self.ssid, self.password) logger.info("Creating stations") @@ -401,21 +416,34 @@ def build(self): temp_url = self.url.split("//") temp_url = ("//%s:%s@" % (self.ftp_user, self.ftp_passwd)).join(temp_url) self.cx_profile.url = temp_url - self.cx_profile.create( - ports=l4_7_port_lst if len(l4_7_port_lst) > 0 else self.station_profile.station_names, - sleep_time=.5, debug_=self.debug, suppress_related_commands_=True) + if self.port_list is None: + self.cx_profile.create( + ports=l4_7_port_lst if len(l4_7_port_lst) > 0 else self.station_profile.station_names, + sleep_time=.5, debug_=self.debug, suppress_related_commands_=True) + else: + self.cx_profile.create( + ports=l4_7_port_lst if len(l4_7_port_lst) > 0 else self.port_list, + sleep_time=.5, debug_=self.debug, suppress_related_commands_=True) else: # If port name is None, station names will be taken as port name - self.cx_profile.create( - ports=l4_7_port_lst if len(l4_7_port_lst) > 0 else self.station_profile.station_names, - sleep_time=.5, debug_=self.debug, suppress_related_commands_=None) + if self.port_list is None: + self.cx_profile.create( + ports=l4_7_port_lst if len(l4_7_port_lst) > 0 else self.station_profile.station_names, + sleep_time=.5, debug_=self.debug, suppress_related_commands_=None) + else: + self.cx_profile.create( + ports=l4_7_port_lst if len(l4_7_port_lst) > 0 else self.port_list, + sleep_time=.5, debug_=self.debug, suppress_related_commands_=None) def start(self, print_pass=False, print_fail=False): if self.ftp: self.port_util.set_ftp(port_name=self.name_to_eid(self.upstream_port)[2], resource=1, on=True) temp_stas = self.sta_list.copy() - self.station_profile.admin_up() + if self.port_list is None: + self.station_profile.admin_up() + else: + LFUtils.waitUntilPortsAdminUp(port_list=self.port_list) if len(temp_stas) > 0: if self.wait_for_ip(temp_stas): self._pass("All stations got IPs", print_pass) @@ -435,7 +463,10 @@ def stop(self): self.port_util.set_ftp(port_name=self.name_to_eid(self.upstream_port)[2], resource=1, on=False) if self.http: self.port_util.set_http(port_name=self.name_to_eid(self.upstream_port)[2], resource=1, on=False) - self.station_profile.admin_down() + if self.port_list is None: + self.station_profile.admin_down() + else: + LFUtils.waitUntilPortsAdminDown(port_list=self.port_list) def cleanup(self, sta_list, clean_all_sta=False, clean_all_l4_7=False): if clean_all_l4_7: @@ -444,7 +475,7 @@ def cleanup(self, sta_list, clean_all_sta=False, clean_all_l4_7=False): self.cx_profile.created_cx = {} if len(exist_l4['endpoint']) > 1: for i in exist_l4['endpoint']: - if i[list(i.keys())[0]]['name']!="": + if i[list(i.keys())[0]]['name'] != "": self.cx_profile.created_cx[list(i.keys())[0]] = 'CX_' + i[list(i.keys())[0]]['name'] else: if self.cx_profile.created_cx[exist_l4['endpoint']['name']] != "": @@ -461,8 +492,7 @@ def cleanup(self, sta_list, clean_all_sta=False, clean_all_l4_7=False): self.station_profile.cleanup(desired_stations=exist_sta) else: self.station_profile.cleanup(sta_list) - LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=sta_list, - debug=self.debug) + LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=sta_list, debug=self.debug) # builds test data into kpi.csv report def record_kpi_csv( @@ -692,6 +722,11 @@ def main(): default="") test_l4_parser.add_argument("--lf_user", type=str, help="--lf_user lanforge user name ", ) test_l4_parser.add_argument("--lf_passwd", type=str, help="--lf_passwd lanforge password ") + test_l4_parser.add_argument('--use_ports', help='list of comma separated ports to use with ips, \'=\' separates name and ip' + '{ port_name1=ip_addr1,port_name1=ip_addr2 }. ' + 'Ports without ips will be left alone', default=None) + test_l4_parser.add_argument('--force_port_cleanup', help='causes the test to delete the passed-in ports created by the user', + default=False, action='store_true') # kpi_csv arguments test_l4_parser.add_argument( @@ -734,7 +769,7 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ Work in Progress: This script will create stations and endpoints to generate and verify layer-4 traffic by monitoring the urls/s, bytes-rd, or bytes-wr attribute of the endpoints. @@ -889,8 +924,8 @@ def main(): shelf = rv[0] resource = rv[1] port_name = rv[2] - request_command = 'http://{lfmgr}:{lfport}/port/1/{resource}/{port_name}'.format( - lfmgr=args.mgr, lfport=args.mgr_port, resource=resource, port_name=port_name) + request_command = 'http://{lfmgr}:{lfport}/port/{shelf}/{resource}/{port_name}'.format( + lfmgr=args.mgr, lfport=args.mgr_port, shelf=shelf, resource=resource, port_name=port_name) logger.info("port request command: {request_command}".format(request_command=request_command)) request = requests.get(request_command, auth=(args.lf_user, args.lf_passwd)) @@ -917,8 +952,16 @@ def main(): if (args.l4_7_port_name is not None) and (int(args.num_stations) == 0): num_sta = 0 - station_list = LFUtils.portNameSeries(prefix_="sta", start_id_=0, end_id_=num_sta - 1, padding_number_=10000, - radio=args.radio) + port_list = None + if args.use_ports is not None: + temp_pl = args.use_ports.replace(',', ' ') + port_list = temp_pl.split() + station_list = None + if port_list and len(port_list) > 0: + station_list = port_list + else: + station_list = LFUtils.portNameSeries(prefix_="sta", start_id_=0, end_id_=num_sta - 1, padding_number_=10000, + radio=args.radio) ip_test = IPV4L4(host=args.mgr, port=args.mgr_port, ssid=args.ssid, @@ -944,11 +987,12 @@ def main(): target_requests_per_ten=args.target_per_ten, requests_per_ten=args.requests_per_ten, rpt_timer=args.rpt_timer, - l4_7_port=args.l4_7_port_name) - ip_test.cleanup(station_list, clean_all_sta=False if num_sta else True, clean_all_l4_7=False if num_sta else True) + l4_7_port=args.l4_7_port_name, + port_list=port_list) + if port_list is None: + ip_test.cleanup(station_list, clean_all_sta=False if num_sta else True, clean_all_l4_7=False if num_sta else True) ip_test.build() ip_test.start() - l4_cx_results = {} layer4traffic_list = [] layer4_tm = [] ip_test_json_data = ip_test.json_get('layer4')['endpoint'] @@ -962,10 +1006,10 @@ def main(): for endp in ip_test.json_get('layer4')['endpoint']: if endp[list(endp.keys())[0]]['name'] != '': layer4traffic_list.append([*endp.keys()][0]) - layer4traffic = ','.join([str(elem) for i,elem in enumerate(layer4traffic_list)]) + layer4traffic = ','.join([str(elem) for i, elem in enumerate(layer4traffic_list)]) # TODO pass in what is to be monitored on the command line - for cx_name in layer4traffic_list : - layer4_tm.append('CX_'+cx_name) + for cx_name in layer4traffic_list: + layer4_tm.append('CX_' + cx_name) ip_test.set_port_report_timer(cx_names=layer4_tm) ip_test.cx_profile.monitor(col_names=['name', 'bytes-rd', 'urls/s', 'bytes-wr'], # report_file is for the monitor @@ -996,7 +1040,6 @@ def main(): csv_results_file = ip_test.get_csv_name() logger.info("csv_results_file: %s", csv_results_file) # csv_results_file = kpi_path + "/" + kpi_filename - report_title = "Layer 4-7 Traffic Generation " report.set_title("Layer 4-7 Traffic Generation: test_l4.py") report.build_banner_left() report.start_content_div2() @@ -1054,7 +1097,8 @@ def main(): if not args.no_cleanup: # time.sleep(15) - ip_test.cleanup(station_list) + if port_list is None or args.force_port_cleanup: + ip_test.cleanup(station_list) if not is_passing: logger.info(ip_test.get_fail_message()) diff --git a/py-scripts/test_status_msg.py b/py-scripts/test_status_msg.py index a9b2479cf..5c8421d0d 100755 --- a/py-scripts/test_status_msg.py +++ b/py-scripts/test_status_msg.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import importlib @@ -272,7 +271,7 @@ def main(): parser.add_argument('--message', type=str, help='message to include') args = parser.parse_args() - help_summary='''\ + help_summary = '''\ This scripts will test the status message passing functions of /status-msg: - create a session: PUT /status-msg/ - post message: POST /status-msg/ @@ -286,7 +285,6 @@ def main(): print(help_summary) exit(0) - status_messages = TestStatusMessage(args.mgr, args.mgr_port, _debug_on=args.debug, diff --git a/py-scripts/testgroup.py b/py-scripts/testgroup.py index a185163c1..bbb43ae2f 100755 --- a/py-scripts/testgroup.py +++ b/py-scripts/testgroup.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: testgroup.py @@ -196,7 +195,7 @@ def __init__(self, host, port, # why? self.station_profile = None self.cx_profile = None - if self.sta_list and len(self.sta_list) >0: + if self.sta_list and len(self.sta_list) > 0: self.station_profile = self.new_station_profile() self.cx_profile = self.new_l3_cx_profile() self.station_profile.lfclient_url = self.lfclient_url @@ -252,9 +251,9 @@ def build(self): # sta_names_=self.sta_list, # debug=self.debug) if self.station_profile.create( - radio=self.radio, - sta_names_=self.sta_list, - debug=self.debug): + radio=self.radio, + sta_names_=self.sta_list, + debug=self.debug): self._pass("Stations created.") else: self._fail("Stations not properly created.") diff --git a/py-scripts/throughput_qos.py b/py-scripts/throughput_qos.py index 5ce80767c..00c3260a4 100755 --- a/py-scripts/throughput_qos.py +++ b/py-scripts/throughput_qos.py @@ -478,9 +478,9 @@ def monitor(self): keys = list(connections_download.keys()) for i in range(len(download_throughput)): - connections_download.update({keys[i]: float(f"{(download_throughput[i] ):.2f}")}) + connections_download.update({keys[i]: float(f"{(download_throughput[i]):.2f}")}) for i in range(len(upload_throughput)): - connections_upload.update({keys[i]: float(f"{(upload_throughput[i] ):.2f}")}) + connections_upload.update({keys[i]: float(f"{(upload_throughput[i]):.2f}")}) return connections_download, connections_upload, drop_a_per, drop_b_per def evaluate_qos(self, connections_download, connections_upload, drop_a_per, drop_b_per): @@ -971,7 +971,7 @@ def generate_individual_graph(self, res, report): vi_tos_list = [] vo_tos_list = [] traffic_type = (self.traffic_type.strip("lf_")).upper() - for client in range(len(self.sta_list)): + for _ in range(len(self.sta_list)): upload_list.append(rate_up) download_list.append(rate_down) traffic_type_list.append(traffic_type.upper()) diff --git a/py-scripts/tip_station_powersave.py b/py-scripts/tip_station_powersave.py index 89b127821..bc309854c 100755 --- a/py-scripts/tip_station_powersave.py +++ b/py-scripts/tip_station_powersave.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import sys import os import importlib @@ -12,7 +11,7 @@ print("This script requires Python 3") exit(1) - + sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base") @@ -25,12 +24,12 @@ ''' This script uses filters from realm's PacketFilter class to filter pcap output for specific packets. Currently it uses a filter for association packets using wlan.fc.type_subtype<=3. It is also using a filter -for QOS Null packets using wlan.fc.type_subtype==44. Both filters are also looking for the existence of +for QOS Null packets using wlan.fc.type_subtype==44. Both filters are also looking for the existence of either the station MAC or the AP MAC in wlan.addr These are returned as an array of lines from the output in the format $subtype $mac_addresses $wlan.fc.pwrmgt ''' -#Currently, this test can only be applied to UDP connections +# Currently, this test can only be applied to UDP connections class TIPStationPowersave(LFCliBase): @@ -86,7 +85,7 @@ def __init__(self, host, port, self.cx_prof_bg.side_a_max_bps = side_a_max_rate_ self.cx_prof_bg.side_b_max_bps = side_a_min_rate_ - #upload + # upload self.cx_prof_upload = self.local_realm.new_l3_cx_profile() self.cx_prof_upload.side_a_min_bps = side_a_min_rate_ self.cx_prof_upload.side_b_min_bps = 0 @@ -98,7 +97,7 @@ def __init__(self, host, port, self.cx_prof_upload.side_b_min_pdu = pdu_size_ self.cx_prof_upload.side_b_max_pdu = 0, - #download + # download self.cx_prof_download = self.local_realm.new_l3_cx_profile() self.cx_prof_download.side_a_min_bps = 0 self.cx_prof_download.side_b_min_bps = side_b_min_rate_ @@ -113,13 +112,13 @@ def __init__(self, host, port, self.pcap_file = None self.test_duration = traffic_duration_ if isinstance(self.test_duration, int): - self.test_duration = "%s"%traffic_duration_ + self.test_duration = "%s" % traffic_duration_ if isinstance(self.test_duration, str): self.test_duration = self.local_realm.parse_time(self.test_duration) self.pause_duration = pause_duration_ if isinstance(self.pause_duration, int): - self.pause_duration = "%s"%pause_duration_ + self.pause_duration = "%s" % pause_duration_ if isinstance(self.pause_duration, str): self.pause_duration = self.local_realm.parse_time(self.pause_duration) @@ -150,7 +149,7 @@ def build(self): port_list=[self.monitor_name], debug=self.debug) time.sleep(0.2) - mon_j = self.json_get("/port/1/%s/%s"%(self.resource, self.monitor_name)) + mon_j = self.json_get("/port/1/%s/%s" % (self.resource, self.monitor_name)) if ("interface" not in mon_j): raise ValueError("No monitor found") @@ -164,8 +163,8 @@ def build(self): debug=self.debug, suppress_related_commands_=True) temp_sta_map = {} - for name in self.powersave_sta_list + self.normal_sta_list: - temp_sta_map[name]=1 + for name in self.powersave_sta_list + self.normal_sta_list: + temp_sta_map[name] = 1 print("Stations we want:") pprint.pprint(temp_sta_map) if len(temp_sta_map) < 1: @@ -182,18 +181,18 @@ def build(self): bg_side_a_eids = [] for port in self.normal_sta_list: - bg_side_a_eids.append( "%s.%s"%(self.resource, port)) + bg_side_a_eids.append("%s.%s" % (self.resource, port)) ul_side_a_eids = [] for port in self.normal_sta_list: - ul_side_a_eids.append( "%s.%s"%(self.resource, port)) + ul_side_a_eids.append("%s.%s" % (self.resource, port)) dl_side_a_eids = [] for port in self.normal_sta_list: - dl_side_a_eids.append( "%s.%s"%(self.resource, port)) + dl_side_a_eids.append("%s.%s" % (self.resource, port)) print("Creating background cx profile ") - self.cx_prof_bg.name_prefix= "udp_bg" + self.cx_prof_bg.name_prefix = "udp_bg" self.cx_prof_bg.create(endp_type="lf_udp", side_a=bg_side_a_eids, side_b="1.eth1") @@ -211,10 +210,10 @@ def build(self): side_b="1.eth1") print("Collecting lanforge eth0 IP...") - eth0_resp = self.json_get("/port/1/%s/eth0?fields=port,alias,ip"%self.resource, debug_=self.debug) + eth0_resp = self.json_get("/port/1/%s/eth0?fields=port,alias,ip" % self.resource, debug_=self.debug) # would be nice to have a not_found() kind of method if (eth0_resp is None) or ("items" in eth0_resp) or ("empty" in eth0_resp) or ("interface" not in eth0_resp): - self._fail("Unable to query %s.eth0"%self.resource, print_=True) + self._fail("Unable to query %s.eth0" % self.resource, print_=True) exit(1) self.eth0_ip = eth0_resp["interface"]["ip"] if self.eth0_ip == "0.0.0.0": @@ -223,10 +222,9 @@ def build(self): self.sta_mac_map = {} - def __get_rx_values(self): cx_list = self.json_get("/endp/list?fields=name,rx+bytes", debug_=False) - #print("==============\n", cx_list, "\n==============") + # print("==============\n", cx_list, "\n==============") cx_rx_map = {} for cx_name in cx_list['endpoint']: if cx_name != 'uri' and cx_name != 'handler': @@ -248,13 +246,13 @@ def start(self, print_pass=False, print_fail=False): :return: """ - #admin up on new monitor + # admin up on new monitor self.wifi_monitor_profile.admin_up() now = datetime.datetime.now() test_start = time.time() date_time = now.strftime("%Y-%m-%d-%H%M%S") curr_mon_name = self.wifi_monitor_profile.monitor_name - self.pcap_file = "%s/%s-%s.pcap"%(self.pcap_save_path, curr_mon_name, date_time) + self.pcap_file = "%s/%s-%s.pcap" % (self.pcap_save_path, curr_mon_name, date_time) capture_duration = 60 + 4 * (self.test_duration.total_seconds() + self.pause_duration.total_seconds() + 4) self.wifi_monitor_profile.start_sniff(self.pcap_file, capture_duration) @@ -274,7 +272,7 @@ def start(self, print_pass=False, print_fail=False): temp_stas.append(self.local_realm.name_to_eid(sta)[2]) for sta in self.sta_powersave_enabled_profile.station_names: temp_stas.append(self.local_realm.name_to_eid(sta)[2]) - uri = "/port/1/%s/%s?fields=alias,ip,mac,ap"%( + uri = "/port/1/%s/%s?fields=alias,ip,mac,ap" % ( self.resource, ",".join(temp_stas) ) @@ -286,24 +284,23 @@ def start(self, print_pass=False, print_fail=False): self.sta_mac_map = LFUtils.portListToAliasMap(port_info_r) self.cx_prof_bg.start_cx() - print("Upload starts at: %d"%time.time()) + print("Upload starts at: %d" % time.time()) self.cx_prof_upload.start_cx() time.sleep(self.test_duration.total_seconds()) self.cx_prof_upload.stop_cx() - print("Upload ends at: %d"%time.time()) + print("Upload ends at: %d" % time.time()) time.sleep(float(self.pause_duration.total_seconds())) # here is where we should sleep long enough for station to go to sleep - print("Download begins at: %d"%time.time()) + print("Download begins at: %d" % time.time()) self.cx_prof_download.start_cx() time.sleep(float(self.test_duration.total_seconds())) self.cx_prof_download.stop_cx() - print("Download ends at: %d"%time.time()) + print("Download ends at: %d" % time.time()) print(" %d " % (time.time() - test_start)) - def stop(self): - #switch off new monitor + # switch off new monitor self.wifi_monitor_profile.admin_down() self.cx_prof_bg.stop_cx() self.cx_prof_download.stop_cx() @@ -315,12 +312,12 @@ def stop(self): if self.pcap_file is None: self._fail("Did not configure pcap file", print_=True) exit(1) - homepage_url = "http://%s/"%self.eth0_ip + homepage_url = "http://%s/" % self.eth0_ip webpage = LFRequest.plain_get(url_=homepage_url, debug_=True) if webpage is None: self._fail("Unable to find wepage for LANforge", print_=True) exit(1) - homepage_url="http://%s/lf_reports/"%self.eth0_ip + homepage_url = "http://%s/lf_reports/" % self.eth0_ip webpage = LFRequest.plain_get(url_=homepage_url, debug_=True) if webpage is None: self._fail("Unable to find /lf_reports/ page", print_=True) @@ -328,7 +325,7 @@ def stop(self): pprint.pprint(self.sta_mac_map) interesting_macs = {} - for eid,record in self.sta_mac_map.items(): + for _eid, record in self.sta_mac_map.items(): interesting_macs[record['alias']] = [record['mac'], record['ap']] results = {} @@ -347,7 +344,7 @@ def stop(self): total_fail = 0 total_pass = 0 - for station,filters in results.items(): + for _station, filters in results.items(): for filter in filters: fail_count = 0 pass_count = 0 @@ -372,17 +369,15 @@ def stop(self): self._fail("not done writing pcap logic", print_=True) exit(1) - - - def cleanup(self): self.wifi_monitor_profile.cleanup(desired_ports=[self.monitor_name]) - #self.cx_prof_download.cleanup() + # self.cx_prof_download.cleanup() self.local_realm.remove_all_cxs(remove_all_endpoints=True) - #self.cx_prof_upload.cleanup() + # self.cx_prof_upload.cleanup() self.sta_powersave_enabled_profile.cleanup(desired_stations=self.powersave_sta_list) self.sta_powersave_disabled_profile.cleanup(desired_stations=self.normal_sta_list) + def main(): parser = argparse.ArgumentParser( @@ -395,7 +390,7 @@ def main(): description='''\ This script uses filters from realm's PacketFilter class to filter pcap output for specific packets. Currently it uses a filter for association packets using wlan.fc.type_subtype<=3. It is also using a filter -for QOS Null packets using wlan.fc.type_subtype==44. Both filters are also looking for the existence of +for QOS Null packets using wlan.fc.type_subtype==44. Both filters are also looking for the existence of either the station MAC or the AP MAC in wlan.addr These are returned as an array of lines from the output in the format $subtype $mac_addresses $wlan.fc.pwrmgt @@ -404,10 +399,10 @@ def main(): ''') parser.add_argument('--help_summary', action="store_true", help='Show summary of what this script does') - help_summary='''\ + help_summary = '''\ This script uses filters from realm's PacketFilter class to filter pcap output for specific packets. Currently it uses a filter for association packets using wlan.fc.type_subtype<=3. It is also using a filter -for QOS Null packets using wlan.fc.type_subtype==44. Both filters are also looking for the existence of +for QOS Null packets using wlan.fc.type_subtype==44. Both filters are also looking for the existence of either the station MAC or the AP MAC in wlan.addr These are returned as an array of lines from the output in the format $subtype $mac_addresses $wlan.fc.pwrmgt @@ -418,12 +413,11 @@ def main(): print(help_summary) exit(0) - lfjson_host = "localhost" lfjson_port = 8080 - #station_list = LFUtils.portNameSeries(prefix_="sta", start_id_=0, end_id_=4, padding_number_=10000) - normal_station_list = ["sta1000" ] - powersave_station_list = ["sta0001","sta0002","sta0003","sta0004"] + # station_list = LFUtils.portNameSeries(prefix_="sta", start_id_=0, end_id_=4, padding_number_=10000) + normal_station_list = ["sta1000"] + powersave_station_list = ["sta0001", "sta0002", "sta0003", "sta0004"] ip_powersave_test = TIPStationPowersave(lfjson_host, lfjson_port, ssid="jedway-open-149", password="[BLANK]", @@ -447,7 +441,6 @@ def main(): ip_powersave_test.stop() ip_powersave_test.cleanup() + if __name__ == "__main__": - main() - diff --git a/py-scripts/tools/ct_dut_json/ct_001_AX88U_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_001_AX88U_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_001_AX88U_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_001_AX88U_dut.json index 423385b4a..7efe381bf 100644 --- a/py-scripts/tools/ct_dut_json/ct_001_AX88U_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_001_AX88U_dut.json @@ -6,7 +6,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME ASUSRT-AX88U", @@ -23,4 +23,3 @@ "DATABASE_SQLITE":"./tools/CT_001_AX88U.db" } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_001_AXE16000_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_001_AXE16000_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_001_AXE16000_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_001_AXE16000_dut.json index 9c70f5457..ab3fb9a6e 100644 --- a/py-scripts/tools/ct_dut_json/ct_001_AXE16000_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_001_AXE16000_dut.json @@ -6,7 +6,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME ASUS_GT-AXE16000", @@ -25,4 +25,3 @@ "DATABASE_SQLITE":"./tools/CT_001_AXE16000.db" } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_002_AX12_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_002_AX12_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_002_AX12_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_002_AX12_dut.json index b4fb1d1b3..efdabbd5f 100644 --- a/py-scripts/tools/ct_dut_json/ct_002_AX12_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_002_AX12_dut.json @@ -6,7 +6,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME Netgear-AX12", @@ -23,4 +23,3 @@ } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_002_AX16K_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_002_AX16K_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_002_AX16K_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_002_AX16K_dut.json index 5a502eb90..f96606695 100644 --- a/py-scripts/tools/ct_dut_json/ct_002_AX16K_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_002_AX16K_dut.json @@ -6,7 +6,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME ASUS_16k", @@ -24,4 +24,3 @@ } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_003_AX88U_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_003_AX88U_dut.json similarity index 96% rename from py-scripts/tools/ct_dut_json/ct_003_AX88U_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_003_AX88U_dut.json index 9e1486928..666eeacb1 100644 --- a/py-scripts/tools/ct_dut_json/ct_003_AX88U_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_003_AX88U_dut.json @@ -6,7 +6,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME ASUSRT-AX88U", @@ -14,8 +14,7 @@ "wireless_network_dict":{ "ssid_idx=0":{"ssid_idx":"0","SSID_USED":"asus11ax-2","SSID_PW_USED":"hello123","BSSID_TO_USE":"0c:9d:92:02:42:e0","SECURITY_USED":"wpa2"}, "ssid_idx=1":{"ssid_idx":"1","SSID_USED":"asus11ax-5","SSID_PW_USED":"hello123","BSSID_TO_USE":"0c:9d:92:02:42:e4","SECURITY_USED":"wpa2"} - } + } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_004_AX88U_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_004_AX88U_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_004_AX88U_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_004_AX88U_dut.json index f168654e6..12257f794 100644 --- a/py-scripts/tools/ct_dut_json/ct_004_AX88U_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_004_AX88U_dut.json @@ -6,7 +6,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME ASUSRT-AX88U", @@ -21,7 +21,3 @@ "DATABASE_SQLITE":"./tools/CT_004_AX88U.db" } } - - - - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_005_AXE11000_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_005_AXE11000_dut.json similarity index 100% rename from py-scripts/tools/ct_dut_json/ct_005_AXE11000_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_005_AXE11000_dut.json diff --git a/py-scripts/tools/ct_dut_json/ct_005_R7000_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_005_R7000_dut.json similarity index 100% rename from py-scripts/tools/ct_dut_json/ct_005_R7000_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_005_R7000_dut.json diff --git a/py-scripts/tools/ct_dut_json/ct_008_TP_BE19000_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_008_TP_BE19000_dut.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_008_TP_BE19000_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_008_TP_BE19000_dut.json index 7c2faf207..d615f1c36 100644 --- a/py-scripts/tools/ct_dut_json/ct_008_TP_BE19000_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_008_TP_BE19000_dut.json @@ -17,14 +17,9 @@ "UPSTREAM_ALIAS":"eth1", "DATABASE_SQLITE":"ct_008_tp_link_db.db", "wireless_network_dict":{ - - "ssid_idx=0":{"ssid_idx":"0", "SSID_USED":"TP-Link_C672","SSID_PW_USED":"19719207","BSSID_TO_USE":"dc:62:79:ed:c6:74","SECURITY_USED":"wpa2"}, - "ssid_idx=1":{"ssid_idx":"1", "SSID_USED":"TP-Link_C672_5G","SSID_PW_USED":"19719207","BSSID_TO_USE":"dc:62:79:ed:c6:75","SECURITY_USED":"wpa2"}, - "ssid_idx=2":{"ssid_idx":"2", "SSID_USED":"TP-Link_C672_6G","SSID_PW_USED":"19719207","BSSID_TO_USE":"f6:62:79:ed:c6:76","SECURITY_USED":"wpa3"} - } } } diff --git a/py-scripts/tools/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json index f2ac10022..1f52ecf80 100644 --- a/py-scripts/tools/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json @@ -17,14 +17,9 @@ "UPSTREAM_ALIAS":"eth2", "DATABASE_SQLITE":"ct_008_vap_at7_db.db", "wireless_network_dict":{ - - "ssid_idx=0":{"ssid_idx":"0", "SSID_USED":"at7_2g","SSID_PW_USED":"hello123","BSSID_TO_USE":"DEFAULT","SECURITY_USED":"wpa3"}, - "ssid_idx=1":{"ssid_idx":"1", "SSID_USED":"at7_5g","SSID_PW_USED":"hello123","BSSID_TO_USE":"DEFAULT","SECURITY_USED":"wpa3"}, - "ssid_idx=2":{"ssid_idx":"2", "SSID_USED":"at7_6g","SSID_PW_USED":"hello123","BSSID_TO_USE":"DEFAULT","SECURITY_USED":"wpa3"} - } } } diff --git a/py-scripts/tools/archive/ct_dut_json/ct_009_ASUS_BE96U_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_009_ASUS_BE96U_dut.json new file mode 100644 index 000000000..4160278b3 --- /dev/null +++ b/py-scripts/tools/archive/ct_dut_json/ct_009_ASUS_BE96U_dut.json @@ -0,0 +1,27 @@ +{ + "ct_009_ASUS_BE96U_dut":{ + "Notes":[ + "This json file describes device under test run configuration used as input for --dut_json for lf_check.py" + + ] + }, + "test_dut":{ + "DUT_SET_NAME": "DUT_NAME ASUS_BE96U", + "USE_DUT_NAME": "ASUS_BE96U", + "DUT_HW":"'BCM6726_2G_5G_BCM67263_6G'", + "DUT_SW":"'3.0.0.6.102_37839'", + "DUT_MODEL":"'ASUS_BE96U'", + "DUT_SERIAL":"RBIG6G200524FM6", + "UPSTREAM_PORT":"1.1.eth3", + "UPSTREAM_ALIAS":"eth3", + "DATABASE_SQLITE":"ct_009_asus_be96u_db.db", + "wireless_network_dict":{ + "ssid_idx=0":{"ssid_idx":"0", "SSID_USED":"be96u","SSID_PW_USED":"hello123","BSSID_TO_USE":"7a:9c:25:a0:b3:31","SECURITY_USED":"wpa2"}, + "ssid_idx=1":{"ssid_idx":"1", "SSID_USED":"be96u_5G","SSID_PW_USED":"hello123","BSSID_TO_USE":"9a:9c:25:a0:be:35","SECURITY_USED":"wpa2"}, + "ssid_idx=2":{"ssid_idx":"2", "SSID_USED":"be96u_6G","SSID_PW_USED":"hello123","BSSID_TO_USE":"e8:9c:25:a0:b3:39","SECURITY_USED":"wpa3"}, + "ssid_idx=3":{"ssid_idx":"3", "SSID_USED":"ASUS_MLO","SSID_PW_USED":"lanforge","BSSID_TO_USE":"7a:9c:25:a0:b3:32","SECURITY_USED":"wpa3"}, + "ssid_idx=4":{"ssid_idx":"4", "SSID_USED":"ASUS_MLO","SSID_PW_USED":"lanforge","BSSID_TO_USE":"9a:9c:25:a0:b3:36 ","SECURITY_USED":"wpa3"}, + "ssid_idx=5":{"ssid_idx":"5", "SSID_USED":"ASUS_MLO","SSID_PW_USED":"lanforge","BSSID_TO_USE":"e8:9c:25:A0:B3:3A","SECURITY_USED":"wpa3"} + } + } +} diff --git a/py-scripts/tools/archive/ct_dut_json/ct_009_TP_LINK_BE800_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_009_TP_LINK_BE800_dut.json new file mode 100644 index 000000000..507e88037 --- /dev/null +++ b/py-scripts/tools/archive/ct_dut_json/ct_009_TP_LINK_BE800_dut.json @@ -0,0 +1,27 @@ +{ + "ct_009_TP_LINK_BE800_dut":{ + "Notes":[ + "This json file describes device under test run configuration used as input for --dut_json for lf_check.py" + + ] + }, + "test_dut":{ + "DUT_SET_NAME": "DUT_NAME TP_LINK_BE800", + "USE_DUT_NAME": "TP_LINK_BE800", + "DUT_HW":"'QNC9224_2G_QNC9274_5G_6G'", + "DUT_SW":"'1.2.3 Build 20250314 rel.45415(5553)'", + "DUT_MODEL":"'TP_LINK_BE800'", + "DUT_SERIAL":"8C-90-2D-0D-3C-7E", + "UPSTREAM_PORT":"1.1.eth2", + "UPSTREAM_ALIAS":"eth2", + "DATABASE_SQLITE":"ct_009_TP_Link_db.db", + "wireless_network_dict":{ + "ssid_idx=0":{"ssid_idx":"0", "SSID_USED":"TP-Link_3C7E","SSID_PW_USED":"25520545","BSSID_TO_USE":"8c:90:2d:0d:3c:80","SECURITY_USED":"wpa2"}, + "ssid_idx=1":{"ssid_idx":"1", "SSID_USED":"TP-Link_3C7E_5G","SSID_PW_USED":"25520545","BSSID_TO_USE":"8c:90:2d:0d:3c:81","SECURITY_USED":"wpa2"}, + "ssid_idx=2":{"ssid_idx":"2", "SSID_USED":"TP-Link_3C7E_6G","SSID_PW_USED":"25520545","BSSID_TO_USE":"96:90:2d:0d:3c:82","SECURITY_USED":"wpa3"}, + "ssid_idx=3":{"ssid_idx":"3", "SSID_USED":"TP-Link_3C7E_MLO","SSID_PW_USED":"25520545","BSSID_TO_USE":"de:90:2d:0d:3c:80","SECURITY_USED":"wpa3"}, + "ssid_idx=4":{"ssid_idx":"4", "SSID_USED":"TP-Link_3C7E_MLO","SSID_PW_USED":"25520545","BSSID_TO_USE":"de:90:2d:0d:3c:81","SECURITY_USED":"wpa3"}, + "ssid_idx=5":{"ssid_idx":"5", "SSID_USED":"TP-Link_3C7E_MLO","SSID_PW_USED":"25520545","BSSID_TO_USE":"96:90:2d:0d:3c:83","SECURITY_USED":"wpa3"} + } + } +} diff --git a/py-scripts/tools/ct_dut_json/ct_9136_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_9136_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_9136_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_9136_dut.json index b31b6f543..bc05a310b 100644 --- a/py-scripts/tools/ct_dut_json/ct_9136_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_9136_dut.json @@ -4,7 +4,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "AP687D.B45C.2B24", @@ -21,4 +21,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_9164_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_9164_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_9164_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_9164_dut.json index 37ff6fe40..82900a870 100644 --- a/py-scripts/tools/ct_dut_json/ct_9164_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_9164_dut.json @@ -4,7 +4,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "APCC9C.3EF1.0AE0", @@ -20,4 +20,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_9166_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_9166_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_9166_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_9166_dut.json index 6a739f863..21ff76edd 100644 --- a/py-scripts/tools/ct_dut_json/ct_9166_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_9166_dut.json @@ -4,7 +4,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "APCC9C.3EF4.E0B0", @@ -20,4 +20,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json b/py-scripts/tools/archive/ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json rename to py-scripts/tools/archive/ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json index d666f75c4..88535043d 100644 --- a/py-scripts/tools/ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json @@ -22,8 +22,6 @@ "UPSTREAM_PORT": "1.1.eth3", "UPSTREAM_ALIAS": "eth3", "DATABASE_SQLITE":"./tools/CT_007_ASUS_AXE160000_10Gbps_eth3.db" - + } } - - diff --git a/py-scripts/tools/ct_dut_json/ct_ASUS_AXE16000_2_5_Gbps_eth1.json b/py-scripts/tools/archive/ct_dut_json/ct_ASUS_AXE16000_2_5_Gbps_eth1.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_ASUS_AXE16000_2_5_Gbps_eth1.json rename to py-scripts/tools/archive/ct_dut_json/ct_ASUS_AXE16000_2_5_Gbps_eth1.json index dd3c62a2c..ddd140530 100644 --- a/py-scripts/tools/ct_dut_json/ct_ASUS_AXE16000_2_5_Gbps_eth1.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_ASUS_AXE16000_2_5_Gbps_eth1.json @@ -22,8 +22,6 @@ "UPSTREAM_PORT": "1.1.eth1", "UPSTREAM_ALIAS": "eth1", "DATABASE_SQLITE":"./tools/CT_007_ASUS_AXE160000_2_5_Gbps_eth1.db" - + } } - - diff --git a/py-scripts/tools/ct_dut_json/ct_AX88U_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_AX88U_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_AX88U_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_AX88U_dut.json index 5aadaae78..aedc54d5d 100644 --- a/py-scripts/tools/ct_dut_json/ct_AX88U_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_AX88U_dut.json @@ -6,7 +6,7 @@ "The dut related configuration is contained in this file", "DUT_SET_NAME is an input to wifi capacity, dataplane and ap_auto tests, for --set parameter", "The DUT_NAME must be part of DUT_SET_NAME" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME ASUSRT-AX88U", @@ -17,4 +17,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_TPLINK_AXE16000_10_Gbps_eth3.json b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_AXE16000_10_Gbps_eth3.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_TPLINK_AXE16000_10_Gbps_eth3.json rename to py-scripts/tools/archive/ct_dut_json/ct_TPLINK_AXE16000_10_Gbps_eth3.json index 3bae79864..be39a23a1 100644 --- a/py-scripts/tools/ct_dut_json/ct_TPLINK_AXE16000_10_Gbps_eth3.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_AXE16000_10_Gbps_eth3.json @@ -26,5 +26,3 @@ "DATABASE_SQLITE":"./tools/CT_007_TPLINK_AXE16000_10_Gbps_eth1.db" } } - - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_TPLINK_AXE16000_2_5_Gbps_eth1.json b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_AXE16000_2_5_Gbps_eth1.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_TPLINK_AXE16000_2_5_Gbps_eth1.json rename to py-scripts/tools/archive/ct_dut_json/ct_TPLINK_AXE16000_2_5_Gbps_eth1.json index d39d310e3..a40c23da2 100644 --- a/py-scripts/tools/ct_dut_json/ct_TPLINK_AXE16000_2_5_Gbps_eth1.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_AXE16000_2_5_Gbps_eth1.json @@ -26,5 +26,3 @@ "DATABASE_SQLITE":"./tools/CT_007_TPLINK_AXE16000_2_5_Gbps_eth1.db" } } - - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth2.json b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth2.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth2.json rename to py-scripts/tools/archive/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth2.json index 8a8853d0d..386c910ad 100644 --- a/py-scripts/tools/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth2.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth2.json @@ -26,5 +26,3 @@ "DATABASE_SQLITE":"./tools/CT_007_TPLINK_CE22.db" } } - - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth3.json b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth3.json similarity index 99% rename from py-scripts/tools/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth3.json rename to py-scripts/tools/archive/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth3.json index b9361d79a..db0f83d8a 100644 --- a/py-scripts/tools/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth3.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth3.json @@ -26,5 +26,3 @@ "DATABASE_SQLITE":"./tools/CT_007_TPLINK_CE22.db" } } - - \ No newline at end of file diff --git a/py-scripts/tools/ct_dut_json/ct_id_AX88U_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_id_AX88U_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_id_AX88U_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_id_AX88U_dut.json index dde448732..a5fadee34 100644 --- a/py-scripts/tools/ct_dut_json/ct_id_AX88U_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_id_AX88U_dut.json @@ -4,7 +4,7 @@ "This json file describes the device undertest as input to ./lf_check.py", "The variables that are capitalize are used for configuration", "The dut related configuration is contained in this file" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME RT-AX88U", @@ -20,4 +20,4 @@ "UPSTREAM_PORT": "1.1.eth2", "UPSTREAM_ALIAS": "eth2" } -} \ No newline at end of file +} diff --git a/py-scripts/tools/ct_dut_json/ct_id_AXE11000_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_id_AXE11000_dut.json similarity index 98% rename from py-scripts/tools/ct_dut_json/ct_id_AXE11000_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_id_AXE11000_dut.json index 39b685209..60bd645de 100644 --- a/py-scripts/tools/ct_dut_json/ct_id_AXE11000_dut.json +++ b/py-scripts/tools/archive/ct_dut_json/ct_id_AXE11000_dut.json @@ -4,7 +4,7 @@ "This json file describes the device undertest as input to ./lf_check.py", "The variables that are capitalize are used for configuration", "The dut related configuration is contained in this file" - ] + ] }, "test_dut":{ "DUT_SET_NAME": "DUT_NAME GT-AXE11000", @@ -22,4 +22,4 @@ "UPSTREAM_ALIAS": "eth2" } -} \ No newline at end of file +} diff --git a/py-scripts/tools/ct_dut_json/lf_create_dut_json.py b/py-scripts/tools/archive/ct_dut_json/lf_create_dut_json.py similarity index 98% rename from py-scripts/tools/ct_dut_json/lf_create_dut_json.py rename to py-scripts/tools/archive/ct_dut_json/lf_create_dut_json.py index 25a37972c..621e67db2 100755 --- a/py-scripts/tools/ct_dut_json/lf_create_dut_json.py +++ b/py-scripts/tools/archive/ct_dut_json/lf_create_dut_json.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_create_dut_json.py @@ -121,7 +120,8 @@ def main(): prog='lf_create_dut_json.py', formatter_class=argparse.RawTextHelpFormatter, epilog='''\ - lf_create_dut_json.py creates lf_dut.json file for --json_dut input to lf_check.py + lf_create_dut_json.py creates lf_dut.json file for --json_dut input to lf_check.py + The lf_dut.json file contains dut configuration information NOTE: cannot have extra blank lines at the end of the json to work properly @@ -168,9 +168,9 @@ def main(): parser.add_argument('--dut_sw', help='--dut_sw ', default='dut_sw') parser.add_argument('--dut_model', help='--dut_model ', default='dut_model') parser.add_argument('--dut_serial', help='--dut_serial ', default='123456578') - parser.add_argument('--dut_upstream_port', help='--dut_upstream_port shelf.resource. example 1.1.eth3 default eth1',default='1.1.eth2') + parser.add_argument('--dut_upstream_port', help='--dut_upstream_port shelf.resource. example 1.1.eth3 default eth1', default='1.1.eth2') parser.add_argument('--dut_upstream_alias', help='--dut_upstream_alias example eth3 ', default='eth2') - parser.add_argument('--dut_database', help='--dut_database example ./tools/CT_007_AXE160000_2_5_Gbps_eth1.db default ./tools/DUT_DB',default='./tools/DUT_DB') + parser.add_argument('--dut_database', help='--dut_database example ./tools/CT_007_AXE160000_2_5_Gbps_eth1.db default ./tools/DUT_DB', default='./tools/DUT_DB') parser.add_argument( '--ssid_idx', @@ -178,7 +178,7 @@ def main(): nargs=1, required=True, help=''' - The ssid_idx is used to enter multiple ssid, ssid password, bssid, security types + The ssid_idx is used to enter multiple ssid, ssid password, bssid, security types Example: --ssid_idx ssid_idx==0,SSID_USED==,SSID_PW_USED==,BSSID_TO_USE==,SECURITY_USED==' @@ -251,7 +251,7 @@ def main(): "").replace( ",", " ").split())) - except Exception as x: + except Exception as x: traceback.print_exception(Exception, x, x.__traceback__, chain=True) logger.error( "Check the format of the --ssid_idx , verify there is == between keys and values in ssid_idx {ssid_idx_}".format( diff --git a/py-scripts/tools/ct_rig_json/ct_9136_WLC1_lanforge.json b/py-scripts/tools/archive/ct_rig_json/ct_9136_WLC1_lanforge.json similarity index 98% rename from py-scripts/tools/ct_rig_json/ct_9136_WLC1_lanforge.json rename to py-scripts/tools/archive/ct_rig_json/ct_9136_WLC1_lanforge.json index 5c2e42c83..e17a5c19f 100644 --- a/py-scripts/tools/ct_rig_json/ct_9136_WLC1_lanforge.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_9136_WLC1_lanforge.json @@ -2,7 +2,7 @@ "ct_us_001":{ "Notes":[ "This json file describes LANforge system and test run configuration" - ] + ] }, "test_rig_parameters":{ "TEST_BED": "CT-TB1-WLC1", @@ -21,4 +21,4 @@ "EMAIL_TITLE_TXT": "Lanforge Tx Power Testing CT-RM204-TB1", "EMAIL_TXT": "Lanforge Tx Power Testing CT-RM204-TB1 " } -} \ No newline at end of file +} diff --git a/py-scripts/tools/ct_rig_json/ct_test_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_test_rig.json similarity index 98% rename from py-scripts/tools/ct_rig_json/ct_test_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_test_rig.json index ef2ff60ff..ae2d642f8 100644 --- a/py-scripts/tools/ct_rig_json/ct_test_rig.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_test_rig.json @@ -2,7 +2,7 @@ "test_rig":{ "Notes":[ "This json file describes LANforge system and test run configuration" - ] + ] }, "test_rig_parameters":{ "TEST_BED": "CT-TEST-001", @@ -21,4 +21,4 @@ "EMAIL_TITLE_TXT": "Lanforge QA Testing", "EMAIL_TXT": "Lanforge QA Testing" } -} \ No newline at end of file +} diff --git a/py-scripts/tools/ct_rig_json/ct_us_001_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_us_001_rig.json similarity index 79% rename from py-scripts/tools/ct_rig_json/ct_us_001_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_001_rig.json index d33e067a6..aab160de2 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_001_rig.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_001_rig.json @@ -16,7 +16,7 @@ "UPSTREAM_PORT": "1.1.eth2", "UPSTREAM_ALIAS": "eth2", "TEST_TIMEOUT": 600, - "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,alex.gavin@candelatech.com,dylan.eskew@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", + "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", "EMAIL_TITLE_TXT": "CT-US-001 (192.168.100.116)", "EMAIL_TXT": "CT-US-001 (192.168.100.116)" diff --git a/py-scripts/tools/ct_rig_json/ct_us_002_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_us_002_rig.json similarity index 79% rename from py-scripts/tools/ct_rig_json/ct_us_002_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_002_rig.json index 6e21aebbc..77f1f7268 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_002_rig.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_002_rig.json @@ -16,7 +16,7 @@ "UPSTREAM_PORT": "1.1.eth2", "UPSTREAM_ALIAS": "eth2", "TEST_TIMEOUT": 600, - "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,alex.gavin@candelatech.com,dylan.eskew@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", + "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", "EMAIL_TITLE_TXT": "CT-US-002 (192.168.100.200)", "EMAIL_TXT": "CT-US-002 (192.168.100.200" diff --git a/py-scripts/tools/ct_rig_json/ct_us_003_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_us_003_rig.json similarity index 79% rename from py-scripts/tools/ct_rig_json/ct_us_003_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_003_rig.json index bdcca0968..7c108b00e 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_003_rig.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_003_rig.json @@ -2,7 +2,7 @@ "ct_us_003":{ "Notes":[ "This json file describes LANforge system and test run configuration" - ] + ] }, "test_rig_parameters":{ "TEST_BED": "CT-US-003", @@ -16,13 +16,9 @@ "UPSTREAM_PORT": "1.1.eth2", "UPSTREAM_ALIAS": "eth2", "TEST_TIMEOUT": 600, - "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,dylan.eskew@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", + "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", "EMAIL_TITLE_TXT": "CT-US-003 192.168.100.181)", "EMAIL_TXT": "CT-US-003" } } - - - - \ No newline at end of file diff --git a/py-scripts/tools/ct_rig_json/ct_us_004_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_us_004_rig.json similarity index 79% rename from py-scripts/tools/ct_rig_json/ct_us_004_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_004_rig.json index 497675131..55db09735 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_004_rig.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_004_rig.json @@ -16,7 +16,7 @@ "UPSTREAM_PORT": "1.1.eth2", "UPSTREAM_ALIAS": "eth2", "TEST_TIMEOUT": 300, - "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,alex.gavin@candelatech.com,dylan.eskew@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", + "EMAIL_LIST_PRODUCTION": "konikofi@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", "EMAIL_TITLE_TXT": "CT-US-004 (192.168.100.194)", "EMAIL_TXT": "CT-US-004 (192.168.100.194)" diff --git a/py-scripts/tools/ct_rig_json/ct_us_005_rig_AXE11000.json b/py-scripts/tools/archive/ct_rig_json/ct_us_005_rig_AXE11000.json similarity index 100% rename from py-scripts/tools/ct_rig_json/ct_us_005_rig_AXE11000.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_005_rig_AXE11000.json diff --git a/py-scripts/tools/ct_rig_json/ct_us_005_rig_R7000.json b/py-scripts/tools/archive/ct_rig_json/ct_us_005_rig_R7000.json similarity index 100% rename from py-scripts/tools/ct_rig_json/ct_us_005_rig_R7000.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_005_rig_R7000.json diff --git a/py-scripts/tools/ct_rig_json/ct_us_007_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_us_007_rig.json similarity index 81% rename from py-scripts/tools/ct_rig_json/ct_us_007_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_007_rig.json index b453cfdd8..d3b86764f 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_007_rig.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_007_rig.json @@ -20,7 +20,7 @@ "ATTENUATOR_1": "1.1.3360", "ATTENUATOR_2": "1.1.65535", "ATTENUATOR_3": "1.1.1018", - "EMAIL_LIST_PRODUCTION": "alex.gavin@candelatech.com,dylan.eskew@candelatech.com,tricia.smiley@candelatech.com,konikofi@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", + "EMAIL_LIST_PRODUCTION": "tricia.smiley@candelatech.com,konikofi@candelatech.com,chuck.rekiere@candelatech.com,rory.little@candelatech.com", "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", "EMAIL_TITLE_TXT": "CT-US-007 192.168.102.197", "EMAIL_TXT": "CT-US-007 192.168.102.197" diff --git a/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json b/py-scripts/tools/archive/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json similarity index 81% rename from py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json index 77ea9eb36..1f86d209b 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json @@ -19,8 +19,8 @@ "ATTENUATOR_1":"1.1.3591", "ATTENUATOR_2":"", "ATTENUATOR_3":"", - "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", - "EMAIL_LIST_PRODUCTION":"tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,konikofi@candelatech.com,alex.gavin@candelatech.com,dylan.eskew@candelatech.com", + "EMAIL_LIST_TEST": "konikofi@candelatech.com,tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", + "EMAIL_LIST_PRODUCTION":"tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,konikofi@candelatech.com", "EMAIL_TITLE_TXT": "192.168.101.137 CT-US-008 AT7 MTK7996e", "EMAIL_TXT": "192.168.101.137 CT-US-008 AT7 MTK7996e" } diff --git a/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json b/py-scripts/tools/archive/ct_rig_json/ct_us_008_rig_TP_BE19000.json similarity index 89% rename from py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_008_rig_TP_BE19000.json index 1f5fc4edc..b7b235c05 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_008_rig_TP_BE19000.json @@ -20,7 +20,7 @@ "ATTENUATOR_2":"", "ATTENUATOR_3":"", "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", - "EMAIL_LIST_PRODUCTION":"tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,konikofi@candelatech.com,alex.gavin@candelatech.com,dylan.eskew@candelatech.com", + "EMAIL_LIST_PRODUCTION":"tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com,konikofi@candelatech.com", "EMAIL_TITLE_TXT": "192.168.101.137 CT-US-008 TP BE19000", "EMAIL_TXT": "192.168.101.137 CT-US-008 TP BE19000" } diff --git a/py-scripts/tools/archive/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json new file mode 100644 index 000000000..aae39f1fe --- /dev/null +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json @@ -0,0 +1,27 @@ + +{ + "ct_us_009ASUS_BE96U_rig.json":{ + "Notes":[ + "This json file describes LANforge system used as input for --dut_json for lf_check.py" + ] + }, + "test_rig_parameters":{ + "TEST_BED": "CT-US-009", + "TEST_RIG": "LANforge", + "TEST_SERVER": "http://http://192.168.100.184//", + "DATABASE_SQLITE": "./tools/LANforge", + "LF_MGR_IP": "192.168.100.221", + "LF_MGR_PORT": "8080", + "LF_MGR_USER": "lanforge", + "LF_MGR_PASS": "lanforge", + "UPSTREAM_PORT":"1.1.eth3", + "TEST_TIMEOUT":"600", + "ATTENUATOR_1":"1.1.3016", + "ATTENUATOR_2":"1.1.3170", + "ATTENUATOR_3":"", + "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", + "EMAIL_LIST_PRODUCTION":"tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", + "EMAIL_TITLE_TXT": "192.168.100.221 CT-US-009 ASUS BE96U", + "EMAIL_TXT": "192.168.100.221 CT-US-009 ASUS BE96U" + } +} diff --git a/py-scripts/tools/archive/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json b/py-scripts/tools/archive/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json new file mode 100644 index 000000000..37a25fbd9 --- /dev/null +++ b/py-scripts/tools/archive/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json @@ -0,0 +1,27 @@ + +{ + "ct_us_009ASUS_BE96U_rig.json":{ + "Notes":[ + "This json file describes LANforge system used as input for --dut_json for lf_check.py" + ] + }, + "test_rig_parameters":{ + "TEST_BED": "CT-US-009", + "TEST_RIG": "LANforge", + "TEST_SERVER": "http://http://192.168.100.184//", + "DATABASE_SQLITE": "./tools/LANforge", + "LF_MGR_IP": "192.168.100.221", + "LF_MGR_PORT": "8080", + "LF_MGR_USER": "lanforge", + "LF_MGR_PASS": "lanforge", + "UPSTREAM_PORT":"1.1.eth2", + "TEST_TIMEOUT":"600", + "ATTENUATOR_1":"1.1.3016", + "ATTENUATOR_2":"1.1.3170", + "ATTENUATOR_3":"", + "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", + "EMAIL_LIST_PRODUCTION":"tricia.smiley@candelatech.com,chuck.rekiere@candelatech.com", + "EMAIL_TITLE_TXT": "192.168.100.221 CT-US-009 TP LINK BE800", + "EMAIL_TXT": "192.168.100.221 CT-US-009 TP LINK BE800" + } +} diff --git a/py-scripts/tools/ct_rig_json/lf_create_rig_json.py b/py-scripts/tools/archive/ct_rig_json/lf_create_rig_json.py similarity index 95% rename from py-scripts/tools/ct_rig_json/lf_create_rig_json.py rename to py-scripts/tools/archive/ct_rig_json/lf_create_rig_json.py index aad228720..8a1f60466 100755 --- a/py-scripts/tools/ct_rig_json/lf_create_rig_json.py +++ b/py-scripts/tools/archive/ct_rig_json/lf_create_rig_json.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: lf_create_rig_json.py @@ -54,7 +53,6 @@ lf_logger_config = importlib.import_module("py-scripts.lf_logger_config") - class lf_create_rig_json(): def __init__(self, _file, @@ -185,7 +183,6 @@ def main(): "--lf_logger_config_json", help="--lf_logger_config_json , json configuration of logger") - args = parser.parse_args() # set up logger @@ -201,22 +198,20 @@ def main(): logger_config.lf_logger_config_json = args.lf_logger_config_json logger_config.load_lf_logger_config() - if args.test_server is None: _test_server = args.lf_mgr else: - _test_server = args.test_server - _file=args.file - _lf_mgr=args.lf_mgr - _lf_mgr_port=args.lf_mgr_port - _lf_user=args.lf_user - _lf_passwd=args.lf_passwd - _test_rig=args.test_rig - _test_bed=args.test_bed - _test_db=args.test_db - _upstream_port=args.upstream_port - _test_timeout=args.test_timeout - + _test_server = args.test_server + _file = args.file + _lf_mgr = args.lf_mgr + _lf_mgr_port = args.lf_mgr_port + _lf_user = args.lf_user + _lf_passwd = args.lf_passwd + _test_rig = args.test_rig + _test_bed = args.test_bed + _test_db = args.test_db + _upstream_port = args.upstream_port + _test_timeout = args.test_timeout rig_json = lf_create_rig_json(_file=_file, _lf_mgr=_lf_mgr, diff --git a/py-scripts/tools/ct_tests_json/ct_9136_tx_power_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_9136_tx_power_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_9136_tx_power_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_9136_tx_power_tests.json index 647ff15df..95da95a06 100644 --- a/py-scripts/tools/ct_tests_json/ct_9136_tx_power_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_9136_tx_power_tests.json @@ -9,7 +9,7 @@ "Batch tx power (optional, can run all passed in on command line) : 1 2 3 4 5 6 7 8 ", "sample command from tools directory:", " ./lf_check.py --json_rig ./ct_rig_json/ct_9136_WLC1_lanforge.json --json_dut ./ct_dut_json/ct_9136_dut.json --json_test ./ct_tests_json/ct_9136_tx_power_tests.json --suite suite_tx_power --path /home/lanforge/html-reports/ct-us-9136" - ] + ] }, "test_suites":{ "suite_tx_power":{ diff --git a/py-scripts/tools/ct_tests_json/ct_9136_wlan.json b/py-scripts/tools/archive/ct_tests_json/ct_9136_wlan.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_9136_wlan.json rename to py-scripts/tools/archive/ct_tests_json/ct_9136_wlan.json index ecb3dac2e..52bda4345 100644 --- a/py-scripts/tools/ct_tests_json/ct_9136_wlan.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_9136_wlan.json @@ -9,7 +9,7 @@ "Batch tx power (optional, can run all passed in on command line) : 1 2 3 4 5 6 7 8 ", "sample command from tools directory:", " ./lf_check.py --json_rig ./ct_rig_json/ct_9136_WLC1_lanforge.json --json_dut ./ct_dut_json/ct_9136_dut.json --json_test ./ct_tests_json/ct_9136_tx_power_tests.json --suite suite_tx_power --path /home/lanforge/html-reports/ct-us-9136" - ] + ] }, "test_suites":{ "suite_tx_power":{ diff --git a/py-scripts/tools/ct_tests_json/ct_9164_tx_power_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_9164_tx_power_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_9164_tx_power_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_9164_tx_power_tests.json index b8516a1d8..7130aef5c 100644 --- a/py-scripts/tools/ct_tests_json/ct_9164_tx_power_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_9164_tx_power_tests.json @@ -9,7 +9,7 @@ "Batch tx power (optional, can run all passed in on command line) : 1 2 3 4 5 6 7 8 ", "sample command from tools directory:", " ./lf_check.py --json_rig ./ct_rig_json/ct_9136_WLC1_lanforge.json --json_dut ./ct_dut_json/ct_9136_dut.json --json_test ./ct_tests_json/ct_9136_tx_power_tests.json --suite suite_tx_power --path /home/lanforge/html-reports/ct-us-9136" - ] + ] }, "test_suites":{ "suite_tx_power":{ diff --git a/py-scripts/tools/ct_tests_json/ct_9166_tx_power_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_9166_tx_power_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_9166_tx_power_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_9166_tx_power_tests.json index 6896266e1..e8cd2fa1a 100644 --- a/py-scripts/tools/ct_tests_json/ct_9166_tx_power_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_9166_tx_power_tests.json @@ -10,7 +10,7 @@ "sample command from tools directory:", " ./lf_check.py --json_rig ./ct_rig_json/ct_9166_lanforge.json --json_dut ./ct_dut_json/ct_9166_dut.json --json_test ./ct_tests_json/ct_9166_tx_power_tests.json --suite suite_tx_power --path /home/user/lanforge/html-reports/ct-us-9166", "24g wlan : 3, 5g wlan : 2, 6g wlan : 1" - ] + ] }, "test_suites":{ "suite_tx_power":{ diff --git a/py-scripts/tools/ct_tests_json/ct_functional_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_functional_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_functional_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_functional_tests.json index 65a6890bd..4a7b99c75 100644 --- a/py-scripts/tools/ct_tests_json/ct_functional_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_functional_tests.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "suite_scripts":{ @@ -17,7 +17,7 @@ "args_list":[ " " ] - }, + }, "lf_cleanup":{ "enabled":"FALSE", "load_db":"skip", @@ -146,7 +146,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'l3_longevity'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -334,7 +334,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ip_variable_time_ipv4_5g_tcp":{ "enabled":"TRUE", "command":"test_ip_variable_time.py", @@ -351,7 +351,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ip_connection_ipv6_udp":{ "enabled":"FALSE", "command":"test_ip_connection.py", @@ -369,8 +369,8 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, - + ]}, + "test_ip_variable_time_ipv6_tcp":{ "enabled":"FALSE", "command":"test_ip_variable_time.py", @@ -409,7 +409,7 @@ "command":"create_l3_stations.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED " ] }, @@ -463,7 +463,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ipv4_ps":{ "enabled":"FALSE", "command":"test_ipv4_ps.py", @@ -479,7 +479,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ipv4_ttls":{ "enabled":"FALSE", "command":"test_ipv4_ttls.py", @@ -495,7 +495,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_l3_powersave_traffic":{ "enabled":"FALSE", "command":"test_l3_powersave_traffic.py", @@ -598,7 +598,7 @@ "command":"create_l4.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", " --debug" ] @@ -870,7 +870,7 @@ "args_list":[ " " ] - }, + }, "lf_report_test":{ "enabled":"TRUE", "load_db":"NONE", diff --git a/py-scripts/tools/ct_tests_json/ct_perf_dp_103_id.json b/py-scripts/tools/archive/ct_tests_json/ct_perf_dp_103_id.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_perf_dp_103_id.json rename to py-scripts/tools/archive/ct_tests_json/ct_perf_dp_103_id.json index c21f6517f..57da55ea0 100644 --- a/py-scripts/tools/ct_tests_json/ct_perf_dp_103_id.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_perf_dp_103_id.json @@ -2,7 +2,7 @@ "ct_tests_003_scripts":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 103 ID" - ] + ] }, "test_suites":{ "dp_perf_5g":{ @@ -253,7 +253,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_perf_dp_104_id.json b/py-scripts/tools/archive/ct_tests_json/ct_perf_dp_104_id.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_perf_dp_104_id.json rename to py-scripts/tools/archive/ct_tests_json/ct_perf_dp_104_id.json index 690c40ae5..e968d0e1e 100644 --- a/py-scripts/tools/ct_tests_json/ct_perf_dp_104_id.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_perf_dp_104_id.json @@ -2,7 +2,7 @@ "ct_tests_003_scripts":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 103 ID" - ] + ] }, "test_suites":{ "dp_perf_5g":{ diff --git a/py-scripts/tools/ct_tests_json/ct_perf_wc_103_id.json b/py-scripts/tools/archive/ct_tests_json/ct_perf_wc_103_id.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_perf_wc_103_id.json rename to py-scripts/tools/archive/ct_tests_json/ct_perf_wc_103_id.json index bf7f42364..9b19f7871 100644 --- a/py-scripts/tools/ct_tests_json/ct_perf_wc_103_id.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_perf_wc_103_id.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "perf_wc_5g_short":{ diff --git a/py-scripts/tools/ct_tests_json/ct_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_tests.json index e3f4f45be..577fccb0a 100644 --- a/py-scripts/tools/ct_tests_json/ct_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_tests.json @@ -2,7 +2,7 @@ "ct_wifi_capacity_test":{ "Notes":[ "This json file describes tests to be run by LANforge system" - ] + ] }, "test_suites":{ "suite_wc":{ diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_functional/Readme_functional_001.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_functional/Readme_functional_001.txt similarity index 93% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_functional/Readme_functional_001.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_functional/Readme_functional_001.txt index c30898316..b0d2ae45d 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_functional/Readme_functional_001.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_functional/Readme_functional_001.txt @@ -1,11 +1,11 @@ -This Readme_func_001.txt is to assist in running the lf_check.py test suites on the various test setups +This Readme_func_001.txt is to assist in running the lf_check.py test suites on the various test setups To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance Quick verification of the script (suite quick) ./lf_check.py --json_rig ./ct_rig_json/ct_us_001_rig.json --json_dut ./ct_dut_json/ct_001_AX88U_dut.json --json_test ./ct_tests_json/ct_us_001/ct_funtional/ct_funtional.json:suite_quick --path /home/lanforge/html-reports/ct_us_001 --log_level debug @@ -16,4 +16,3 @@ TESTBED 001 funct test runs ########################### ./lf_check.py --db_override ./tools/CT_001_FUNCTIONAL.db --json_rig ./ct_rig_json/ct_us_001_rig.json --json_dut ./ct_dut_json/ct_001_AX88U_dut.json --json_test ./ct_tests_json/ct_us_001/ct_functional/ct_functional.json:funct_tests --path /home/lanforge/html-reports/ct_us_001 --log_level debug - diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_functional/ct_functional.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_functional/ct_functional.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_functional/ct_functional.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_functional/ct_functional.json index a7a3d603c..55d1ad947 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_functional/ct_functional.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_functional/ct_functional.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "funct_tests":{ @@ -68,7 +68,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'TEST_L3_LONGEVITY_ENABLE_FLAGS_ATH10K_5G_W1'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -162,7 +162,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'TEST_L3_ENABLE_FLAGS_ATH10K_5G_W1'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -344,7 +344,7 @@ "command":"create_l3_stations.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED " ] }, @@ -486,7 +486,7 @@ "command":"create_l4.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", " --debug" ] @@ -571,6 +571,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/Readme_dp_001.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/Readme_dp_001.txt old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/Readme_dp_001.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/Readme_dp_001.txt index b9f44a56c..b34ba421e --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/Readme_dp_001.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/Readme_dp_001.txt @@ -1,11 +1,11 @@ -This Readme.txt is to assist in running the lf_check.py test suites on the various test setups +This Readme.txt is to assist in running the lf_check.py test suites on the various test setups To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx.json index d61b9d89a..0780bf650 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W4_W5_W7_rx":{ @@ -308,7 +308,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx_short.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx_short.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx_short.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx_short.json index c75e02303..2c6412cb2 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx_short.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx_short.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W4_W5_W7_rx":{ @@ -308,7 +308,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx.json index 2a579be97..210f4dbf9 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W4_W5_W7_tx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx_short.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx_short.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx_short.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx_short.json index 574e42721..8fc1d584a 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx_short.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx_short.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W4_W5_W7_tx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_rx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_rx.json index 5e6373a5d..d6c61c5c6 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_ath10K_9984_W0_rx":{ @@ -350,7 +350,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_tx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_tx.json index 27bbbf17c..fc242a91a --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_ath10K_9984_W0_tx":{ @@ -350,7 +350,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx.json index 4286a1a00..5ec7b9292 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W4_W5_W7_rx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx_short.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx_short.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx_short.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx_short.json index 53a23e377..307a51387 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx_short.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx_short.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W4_W5_W7_rx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json index 594632a4f..e5e1a218e 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W4_W5_W7_tx":{ @@ -308,7 +308,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx_short.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx_short.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx_short.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx_short.json index cd0e26a05..785fb2a41 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx_short.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx_short.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W4_W5_W7_tx":{ @@ -308,7 +308,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_rx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_rx.json index 5810f5fe1..e52ac4ae0 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_ath10K_9984_W1_rx":{ @@ -350,7 +350,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_tx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_tx.json index 5c3cca1ea..d47506bfc --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_ath10K_9984_W1_tx":{ @@ -350,7 +350,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/Readme_wc_001.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/Readme_wc_001.txt similarity index 97% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/Readme_wc_001.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/Readme_wc_001.txt index a074abe4f..5ee299ca8 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/Readme_wc_001.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/Readme_wc_001.txt @@ -1,11 +1,11 @@ -This Readme_wc_001.txt is to assist in running the lf_check.py test suites on the various test setups +This Readme_wc_001.txt is to assist in running the lf_check.py test suites on the various test setups To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance ./lf_check.py --json_rig ./ct_rig_json/ct_us_001_rig.json --json_dut ./ct_dut_json/ct_001_AX88U_dut.json --json_test ./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_mtk7915_W7 --path /home/lanforge/html-reports/ct_us_001 --log_level debug @@ -22,7 +22,7 @@ TESTBED 001 WC test runs ./lf_check.py --json_rig ./ct_rig_json/ct_us_001_rig.json --json_dut ./ct_dut_json/ct_001_AX88U_dut.json --json_test ./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ath10K_9984_W1,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ath9K_W2,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ax200_W4,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ax210_W5,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_mtk7915_W7 --path /home/lanforge/html-reports/ct_us_001 --log_level debug -#ALL Individually +#ALL Individually ./lf_check.py --json_rig ./ct_rig_json/ct_us_001_rig.json --json_dut ./ct_dut_json/ct_001_AX88U_dut.json --json_test ./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ath10K_9984_W1,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ath9K_W2,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ax200_W4,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_ax210_W5,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json:wc_perf_5g_mtk7915_W7,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json:wc_perf_2g_ath10K_9984_W0,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json:wc_perf_2g_ath9K_W2,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json:wc_perf_2g_ax200_W4,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json:wc_perf_2g_ax210_W5,./ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json:wc_perf_2g_mtk7915_W7 --path /home/lanforge/html-reports/ct_us_001 --log_level debug #################### diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json index 2e80257e7..976866460 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_2g_ath10K_9984_W0":{ @@ -333,6 +333,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json index 95b1d81b1..12870dd5d 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_2g_W0_W2_W4_W5_W7":{ @@ -291,6 +291,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json index 8b9c45016..da894b805 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_5g_ath10K_9984_W1":{ @@ -333,6 +333,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json index 35729eea4..48f3c4bcf 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_5g_W1_W2_W4_W5_W7":{ @@ -286,6 +286,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_scale/001_scale_cfg.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_scale/001_scale_cfg.txt similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_scale/001_scale_cfg.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_scale/001_scale_cfg.txt diff --git a/py-scripts/tools/ct_tests_json/ct_us_001/ct_scale/ct_scale_001.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_scale/ct_scale_001.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_001/ct_scale/ct_scale_001.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001/ct_scale/ct_scale_001.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_001_scripts.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001_scripts.json old mode 100755 new mode 100644 similarity index 98% rename from py-scripts/tools/ct_tests_json/ct_us_001_scripts.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001_scripts.json index 6a1802a4b..b71a121c8 --- a/py-scripts/tools/ct_tests_json/ct_us_001_scripts.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001_scripts.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "suite_short":{ @@ -107,7 +107,7 @@ " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE" ] } - }, + }, "suite_l3r":{ "test_l3_longevity":{ "enabled":"TRUE", @@ -135,7 +135,7 @@ "args_list":[ " " ] - }, + }, "lf_report_test":{ "enabled":"TRUE", "load_db":"NONE", @@ -180,7 +180,7 @@ "args_list":[ " " ] - }, + }, "lf_cleanup":{ "enabled":"TRUE", "load_db":"skip", @@ -298,7 +298,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'l3_longevity'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -480,7 +480,7 @@ "command":"test_l3_powersave_traffic.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", " --debug"]}, "test_status_msg":{ @@ -498,7 +498,7 @@ "command":"create_l4.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", " --debug"]}, "create_l3_stations":{ @@ -507,10 +507,10 @@ "command":"create_l3_stations.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED " ] - }, + }, "wlan_capacity_calculator1":{ "enabled":"TRUE", "command":"./wlan_capacity_calculator.py", @@ -534,7 +534,7 @@ "args_list":[" --mgr LF_MGR_IP " ] }, - + "lf_qa":{ "enabled":"TRUE", "timeout":"600", @@ -548,7 +548,3 @@ } } } - - - - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_001_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_us_001_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_001_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_001_tests.json index e542dabd4..fe9f9c90a 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_001_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_001_tests.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "suite_wc_dp_nightly":{ @@ -277,7 +277,7 @@ " --raw_line \"profile_link 1.1 STA-AX 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\" " ] - }, + }, "wifi_capacity_AX210":{ "enabled":"TRUE", "timeout":"600", @@ -316,7 +316,7 @@ " --raw_line \"profile_link 1.1 STA-AX 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\" " ] - }, + }, "dataplane_AX210":{ "enabled":"TRUE", "load_db":"skip", @@ -859,7 +859,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'l3_longevity'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -1190,5 +1190,5 @@ } } - } -} \ No newline at end of file + } +} diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/Readme_dp_002.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/Readme_dp_002.txt old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/Readme_dp_002.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/Readme_dp_002.txt index 46600158d..f1086d1aa --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/Readme_dp_002.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/Readme_dp_002.txt @@ -1,11 +1,11 @@ -This Readme.txt is to assist in running the lf_check.py test suites on the various test setups +This Readme.txt is to assist in running the lf_check.py test suites on the various test setups To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_rx.json index eed81ace5..a6f610064 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_002_rx":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W3_W4_W5_W6_W7_rx":{ @@ -352,7 +352,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_tx.json index 484ffd26c..0fdab2f68 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_002_tx":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W3_W4_W5_W6_W7_tx":{ @@ -352,7 +352,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_rx.json index 70713bb58..62b4d390c 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_002_rx":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W3_W4_W5_W6_W7_rx":{ @@ -352,7 +352,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_tx.json index 3b92b97a1..93ad7a9ec 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_002_tx":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W3_W4_W5_W6_W7_tx":{ @@ -352,7 +352,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_rx.json index ebb69c418..a1ab4c2cc 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_6g_002_rx":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 002, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_6g_W5_W6_rx":{ @@ -127,7 +127,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_tx.json index 416b5a015..45f557d90 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_6g_002_tx":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 002, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_6g_W5_W6_tx":{ @@ -127,7 +127,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/Readme_wc_002.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/Readme_wc_002.txt similarity index 97% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/Readme_wc_002.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/Readme_wc_002.txt index a7f01d5aa..6465a95bb 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/Readme_wc_002.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/Readme_wc_002.txt @@ -1,11 +1,11 @@ -This Readme_wc_002.txt is to assist in running the lf_check.py test suites on the various test setups +This Readme_wc_002.txt is to assist in running the lf_check.py test suites on the various test setups To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance Single run diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002.json index 8177d103c..15ed5916b 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_2g_ath10K_9984_W0":{ @@ -338,6 +338,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json index 27e88d9a1..fd9e5a63c 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_2g_W0_W2_W3_W4_W5_W6_W7":{ @@ -31,7 +31,7 @@ "args_list":[ " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", " --create_scenario WC_ATH10K_9984_2G_W0 ", - " --raw_line \"profile_link 1.1 STA-AUTO 32 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 STA-AUTO 64 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\"" ] }, @@ -115,7 +115,7 @@ "args_list":[ " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", " --create_scenario WC_ATH10K_9984_2G_W0 ", - " --raw_line \"profile_link 1.1 STA-AUTO 32 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 STA-AUTO 64 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\"" ] }, @@ -378,6 +378,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002.json index d806ee2ec..45aadb04f 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_5g_ath10K_9984_W1":{ @@ -336,6 +336,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002_W1_W2_W3_W4_W5_W6_W7.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002_W1_W2_W3_W4_W5_W6_W7.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002_W1_W2_W3_W4_W5_W6_W7.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002_W1_W2_W3_W4_W5_W6_W7.json index 488c3b8cd..2b64641fc 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002_W1_W2_W3_W4_W5_W6_W7.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002_W1_W2_W3_W4_W5_W6_W7.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_5g_W1_W2_W3_W4_W5_W6_W7":{ @@ -378,6 +378,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json index 2033a8b92..6ef969292 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_6g_W5_W6":{ @@ -96,7 +96,7 @@ " --verbosity 11" ] }, - + "lf_qa":{ "enabled":"TRUE", @@ -129,6 +129,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json similarity index 92% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json index ac8f84cc1..94bf31e50 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json @@ -8,7 +8,7 @@ ] }, "test_suites":{ - "cv_tests":{ + "cv_port_reset_test":{ "LOAD_PORT_REST_DB":{ "enabled":"TRUE", "timeout":"600", @@ -33,14 +33,12 @@ " --raw_lines_file ./tools/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt", " --pull_report", " --local_lf_report_dir REPORT_PATH", - " --test_tag 'PORT_RESET'", - " --test_rig TEST_RIG ", " --set DUT_SET_NAME", " --verbosity 11" ] }, "lf_qa":{ - "enabled":"FALSE", + "enabled":"TRUE", "timeout":"600", "load_db":"skip", "command":"./tools/lf_qa.py", @@ -50,7 +48,7 @@ ] }, "lf_inspect":{ - "enabled":"FALSE", + "enabled":"TRUE", "timeout":"600", "load_db":"skip", "command":"./tools/lf_inspect.py", diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt similarity index 96% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt index f1a6c863f..70feaa3bc 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt @@ -44,9 +44,9 @@ rpt_path_make_subdir: 1 bg: 0xE0ECF8 dut_info_override: dut_info_cmd: -test_rig: -test_tag: -rpt_name: +test_rig:CT_US_002 +test_tag:PORT_RESET +rpt_name:PORT_RESET rpt_dir_prefix_textfield: show_scan: 1 auto_helper: 1 diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/002_scale_cfg.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_scale/002_scale_cfg.txt similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/002_scale_cfg.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_scale/002_scale_cfg.txt diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json similarity index 98% rename from py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json index cc8b925a6..f0cf28c1a 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json @@ -8,7 +8,7 @@ ] }, "test_suites":{ - "ct_scale":{ + "cv_scale_test":{ "SCALE_2G_5G":{ "enabled":"TRUE", "timeout":"600", diff --git a/py-scripts/tools/ct_tests_json/ct_us_002_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_us_002_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_002_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_002_tests.json index 6bfb3a7f7..153d06648 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_002_tests.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "suite_wc_dp_nightly":{ @@ -476,7 +476,7 @@ " --set 'Capacity' 1", " --set 'Band-Steering' 0", " --set 'Skip 2.4Ghz Tests' 0", - " --raw_line 'cx_psk_thresh: 500'", + " --raw_line 'cx_psk_thresh: 500'", " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'AP_AUTO'", " --test_rig TEST_RIG", " --set DUT_SET_NAME" @@ -653,7 +653,7 @@ ] } - }, + }, "suite_l3":{ "test_l3_longevity":{ "enabled":"TRUE", @@ -940,7 +940,3 @@ } } } - - - - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_003_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_us_003_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_003_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_003_tests.json index 755df0f9b..343d03a2e 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_003_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_003_tests.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites": { "suite_wc_dp_nightly":{ @@ -134,7 +134,7 @@ " --raw_line \"profile_link 1.1 STA-AX 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\" " ] - }, + }, "wifi_capacity_wiphy3_AX210":{ "enabled":"TRUE", "load_db":"skip", @@ -172,7 +172,7 @@ " --raw_line \"profile_link 1.1 STA-AX 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\" " ] - }, + }, "dataplane_AX210":{ "enabled":"TRUE", "load_db":"skip", @@ -764,7 +764,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'l3_longevity'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -792,11 +792,5 @@ } } - } + } } - - - - - - diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_functional/ct_functional.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_functional/ct_functional.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_functional/ct_functional.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_functional/ct_functional.json index a7a3d603c..55d1ad947 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_functional/ct_functional.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_functional/ct_functional.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "funct_tests":{ @@ -68,7 +68,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'TEST_L3_LONGEVITY_ENABLE_FLAGS_ATH10K_5G_W1'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -162,7 +162,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'TEST_L3_ENABLE_FLAGS_ATH10K_5G_W1'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -344,7 +344,7 @@ "command":"create_l3_stations.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED " ] }, @@ -486,7 +486,7 @@ "command":"create_l4.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", " --debug" ] @@ -571,6 +571,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/Readme_dp_004.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/Readme_dp_004.txt old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/Readme_dp_004.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/Readme_dp_004.txt index 99c45fd93..3b2ba8e1b --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/Readme_dp_004.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/Readme_dp_004.txt @@ -1,11 +1,11 @@ -This Readme.txt is to assist in running the lf_check.py test suites on the various test setups +This Readme.txt is to assist in running the lf_check.py test suites on the various test setups To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_rx.json index 968c923e5..a03a5e1dc 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W4_W5_W6_W7_rx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_tx.json index 7a95f77e0..d4a99ec77 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_W0_W2_W4_W5_W6_W7_tx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_rx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_rx.json index e0e5449d6..931c01820 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_ath10K_9984_W0_rx":{ @@ -417,7 +417,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_tx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_tx.json index 3e0f106ff..9053fc780 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_2g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-1, ssid_idx_1 is for Radio-1" - ] + ] }, "test_suites":{ "dp_perf_2g_ath10K_9984_W0_tx":{ @@ -417,7 +417,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_rx.json index 1658fa425..71d6e7d79 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W4_W5_W6_W7_rx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json index 7b4658a50..4bf654660 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_W1_W2_W4_W5_W6_W7_tx":{ @@ -307,7 +307,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_rx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_rx.json index 4cf55029d..94a9fe4f8 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_rx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_ath10K_9984_W1_rx":{ @@ -417,7 +417,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_tx.json old mode 100755 new mode 100644 similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_tx.json index bda12f579..595b2a7c0 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_tx.json @@ -2,7 +2,7 @@ "ct_perf_dp_5g_001":{ "Notes":[ "This json file describes tests to be run by LANforge system performance 007, note ssid_idx=0 is for Radio-2, ssid_idx_1 is for Radio-2" - ] + ] }, "test_suites":{ "dp_perf_5g_ath10K_9984_W1_tx":{ @@ -417,7 +417,7 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/Readme_wc_004.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/Readme_wc_004.txt similarity index 97% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/Readme_wc_004.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/Readme_wc_004.txt index 3e380e90e..51c5d4c56 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/Readme_wc_004.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/Readme_wc_004.txt @@ -1,11 +1,11 @@ -This Readme_wc_004.txt is to assist in running the lf_check.py test suites on the various test setups +This Readme_wc_004.txt is to assist in running the lf_check.py test suites on the various test setups To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance ######################## diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004.json index bbe8b3537..5d8841400 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_2g_ath10K_9984_W0":{ @@ -396,6 +396,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004_W0_W2_W4_W5_W6_W7.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004_W0_W2_W4_W5_W6_W7.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004_W0_W2_W4_W5_W6_W7.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004_W0_W2_W4_W5_W6_W7.json index 1e1478355..54325b679 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004_W0_W2_W4_W5_W6_W7.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004_W0_W2_W4_W5_W6_W7.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_2g_W0_W2_W4_W5_W6_W7":{ @@ -328,6 +328,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004.json index 9a383556f..284f71fc4 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_5g_ath10K_9984_W1":{ @@ -396,6 +396,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004_W1_W2_W4_W5_W6_W7.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004_W1_W2_W4_W5_W6_W7.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004_W1_W2_W4_W5_W6_W7.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004_W1_W2_W4_W5_W6_W7.json index 2002095d1..d458f4f1a 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004_W1_W2_W4_W5_W6_W7.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004_W1_W2_W4_W5_W6_W7.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "wc_perf_5g_W1_W2_W4_W5_W6_W7":{ @@ -329,6 +329,6 @@ " " ] } - } + } } } diff --git a/py-scripts/tools/ct_tests_json/ct_us_004_tests.json b/py-scripts/tools/archive/ct_tests_json/ct_us_004_tests.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_004_tests.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_004_tests.json index 58a4f0627..81bdca6b3 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_004_tests.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_004_tests.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "suite_wc_dp_nightly":{ @@ -231,7 +231,7 @@ " --raw_line \"profile_link 1.1 STA-AX 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\" " ] - }, + }, "wifi_capacity_AX210":{ "enabled":"TRUE", "timeout":"600", @@ -270,7 +270,7 @@ " --raw_line \"profile_link 1.1 STA-AX 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", " --raw_line \"profile_link 1.1 upstream-dhcp 1 NA NA UPSTREAM_ALIAS,AUTO -1 NA\" " ] - }, + }, "dataplane_AX210":{ "enabled":"TRUE", "load_db":"skip", @@ -1036,5 +1036,5 @@ ] } } - } -} \ No newline at end of file + } +} diff --git a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_basic_cx_005.json b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_basic_cx_005.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_basic_cx_005.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_basic_cx_005.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json similarity index 98% rename from py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json index f1b407eeb..4e2a30cd1 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json @@ -92,6 +92,7 @@ " --raw_line 'reset_duration_min: 5000'", " --raw_line 'reset_duration_max: 10000'", " --raw_line 'minimum_port_up_duration_ms: 5000'", + " --raw_line 'cap_pf_percent_combo: 800000'", " --pull_report", " --local_lf_report_dir REPORT_PATH", " --test_tag 'AP_AUTO_CAPACITY'", diff --git a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json similarity index 96% rename from py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json index 8fd418b34..633b7df67 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json @@ -62,11 +62,9 @@ " --max_stations_5 5", " --max_stations_6 5", " --max_stations_dual 5", - " --radio2 '1.1.4 wiphy0'", - " --radio5 '1.1.5 wiphy1' --radio5 '1.1.7 wiphy3'", - " --radio5 '1.2.4 wiphy0'", + " --radio2 '1.1.4 wiphy0' --radio2 '1.1.6 wiphy2' --radio2 '1.2.7 wiphy3' --radio2 '1.2.8 wiphy4'", + " --radio5 '1.1.5 wiphy1' --radio5 '1.1.7 wiphy3' --radio5 '1.2.4 wiphy0' --radio5 '1.2.9 wiphy5'", " --radio6 '1.1.8 wiphy4' --radio6 '1.1.9 wiphy5' --radio6 '1.1.10 wiphy6' --radio6 '1.1.11 wiphy7'", - " --radio6 '1.2.7 wiphy3', --radio6 '1.2.8 wiphy4' --radio6 '1.2.9 wiphy5'", " --set 'basic_cx' 0", " --set 'band_steering' 0", " --set 'capacity' 0", diff --git a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_mix_stability_005.json b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_mix_stability_005.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_mix_stability_005.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_mix_stability_005.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_band_005.json b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_band_005.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_band_005.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_band_005.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_sta_005.json b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_sta_005.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_sta_005.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_sta_005.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_single_sta_005.json b/py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_single_sta_005.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_single_sta_005.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_single_sta_005.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_rx.json index fcaa94382..ff7b46b2c 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_rx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_2g_W6_W10_TCP_rx":{ - + "CC_DUT_mt7925e_2G_W6_TCP_rx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_tx.json similarity index 98% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_tx.json index c3575d169..ad735cdb2 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_tx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_2g_W6_W10_TCP_tx":{ - + "CC_DUT_mt7925e_2G_W6_TCP_tx":{ "enabled":"TRUE", "load_db":"skip", @@ -106,7 +106,7 @@ " --raw_line 'directions: DUT Transmit' ", " --raw_line 'traffic_types: TCP' ", " --raw_line 'bandw_options: AUTO' ", - " --raw_line 'spatial_streams: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", " --raw_line 'mconn: 10' ", " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W10_TCP_tx'", " ", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_rx.json index 5aa33c33e..9b926e766 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_rx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_2g_W6_W10_UDP_rx":{ - + "CC_DUT_mt7925e_2G_W6_UDP_rx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_tx.json index 3c755a7f7..bde28537a 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_tx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_2g_W6_W10_UDP_tx":{ - + "CC_DUT_mt7925e_2G_W6_UDP_tx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_rx.json index 278fa88ff..e45b09954 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_rx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_5g_W6_W10_TCP_rx":{ - + "CC_DUT_mt7925e_5G_W6_TCP_rx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_tx.json index 7c7a66140..9212a630b 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_tx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_5g_W6_W10_TCP_tx":{ - + "CC_DUT_mt7925e_5G_W6_TCP_tx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_rx.json similarity index 98% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_rx.json index 20e5d7d96..279bdb068 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_rx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_5g_W6_W10_UDP_rx":{ - + "CC_DUT_mt7925e_5G_W6_UDP_rx":{ "enabled":"TRUE", "load_db":"skip", @@ -53,7 +53,7 @@ " --raw_line 'directions: DUT Receive' ", " --raw_line 'traffic_types: UDP' ", " --raw_line 'bandw_options: AUTO' ", - " --raw_line 'spatial_streams: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7925e_5G_W6_UDP_rx'", " ", " ", @@ -140,4 +140,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_tx.json index bcf3258d1..e26e768e3 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_tx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_5g_W6_W10_UDP_tx":{ - + "CC_DUT_mt7925e_5G_W6_UDP_tx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_rx.json index efa53b2db..e682cf9ba 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_rx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_6g_W6_W10_TCP_rx":{ - + "CC_DUT_mt7925e_6G_W6_TCP_rx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_tx.json index f28d5b3e7..029ea2e88 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_tx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_6g_W6_W10_TCP_tx":{ - + "CC_DUT_mt7925e_6G_W6_TCP_tx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_rx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_rx.json index 0a84d0222..08e16dcaa 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_rx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_rx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_6g_W6_W10_UDP_rx":{ - + "CC_DUT_mt7925e_6G_W6_UDP_rx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_tx.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_tx.json index 584eaa9d2..78b7e3779 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_tx.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_tx.json @@ -9,9 +9,9 @@ ] }, "test_suites":{ - + "ct_perf_dp_6g_W6_W10_UDP_tx":{ - + "CC_DUT_mt7925e_6G_W6_UDP_tx":{ "enabled":"TRUE", "load_db":"skip", @@ -141,4 +141,3 @@ } } } - \ No newline at end of file diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/Readme_rvr_007.txt b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/Readme_rvr_007.txt similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/Readme_rvr_007.txt rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/Readme_rvr_007.txt index ce3366339..142628be5 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/Readme_rvr_007.txt +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/Readme_rvr_007.txt @@ -2,10 +2,10 @@ This Readme.txt is to assist in running the lf_check.py test suites on the vario To run lf_check.py change to lanforge-scripts/py-scripts/tools -The format for the command is +The format for the command is ./lf_check.py --json_rig --json_dut --json_tests :,: --path /home/lanforge/html-report/ --log_level debug -For a production run ad --production to email to a wider audiance +For a production run ad --production to email to a wider audiance @@ -91,6 +91,6 @@ rvr_perf_5g_1_ax210_W2_tx issue using DB override ######################################################## -TESTBED 007 RVR test runs Transmit Receive Individually use this one <<<<< New Release Regression Test suite +TESTBED 007 RVR test runs Transmit Receive Individually use this one <<<<< New Release Regression Test suite ######################################################## ./lf_check.py --db_override ./tools/CT_US_007_RVR_PERF.db --json_rig ./ct_rig_json/ct_us_007_rig.json --json_dut ./ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json --json_test ./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json:rvr_perf_2g_mt7915e_W0_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json:rvr_perf_2g_ax210_W2_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json:rvr_perf_2g_mt7921_W6_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json:rvr_perf_2g_mt7922_W7_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json:rvr_perf_5g_1_mt7915e_W0_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json:rvr_perf_5g_1_ax210_W2_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json:rvr_perf_5g_1_mt7921_W6_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json:rvr_perf_5g_1_mt7922_W7_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json:rvr_perf_6g_ax210_W2_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json:rvr_perf_6g_mt7921_W6_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json:rvr_perf_6g_mt7922_W7_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_rx.json:rvr_perf_2g_5g_6g_ax210_W2_W3_W4_rx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json:rvr_perf_2g_mt7915e_W0_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json:rvr_perf_2g_ax210_W2_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json:rvr_perf_2g_mt7921_W6_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json:rvr_perf_2g_mt7922_W7_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json:rvr_perf_5g_1_mt7915e_W0_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json:rvr_perf_5g_1_ax210_W2_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json:rvr_perf_5g_1_mt7921_W6_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json:rvr_perf_5g_1_mt7922_W7_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json:rvr_perf_6g_ax210_W2_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json:rvr_perf_6g_mt7921_W6_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json:rvr_perf_6g_mt7922_W7_tx,./ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx.json:rvr_perf_2g_5g_6g_ax210_W2_W3_W4_tx --path /home/lanforge/html-reports/ct_us_007 --log_level debug diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_tx.json diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json new file mode 100644 index 000000000..9d71a70dc --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json @@ -0,0 +1,166 @@ +{ + "ct_tests_008_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + "ct_test_l3":{ + "TEST_L3_2G_MT7996E_STA_1_W0_TX":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=0 --radio 'radio==1.2.wiphy0,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_MT7996E_W0'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_5G_MT7996E_STA_1_W1_TX":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=1 --radio 'radio==1.2.wiphy1,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps 10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_MT7996E_W1'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_6G_MT7996E_STA_1_W2_TX":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=2 --radio 'radio==1.2.wiphy2,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_MT7996E_W2'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_2G_MT7996E_STA_10_W0_TX":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=0 --radio 'radio==1.2.wiphy0,stations==10,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_MT7996E_W0'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_5G_MT7996E_STA_10_W1_TX":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=1 --radio 'radio==1.2.wiphy1,stations==10,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps 10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_MT7996E_W1'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_6G_MT7996E_STA_10_W2_TX":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=2 --radio 'radio==1.2.wiphy2,stations==10,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_MT7996E_W2'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_2G_MT7996E_STA_34_W0_TX":{ + "enabled":"FALSE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=0 --radio 'radio==1.2.wiphy0,stations==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_MT7996E_W0'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_5G_MT7996E_STA_34_W1_TX":{ + "enabled":"FALSE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=1 --radio 'radio==1.2.wiphy1,stations==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps 10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_MT7996E_W1'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_6G_MT7996E_STA_34_W2_TX":{ + "enabled":"FALSE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=2 --radio 'radio==1.2.wiphy2,stations==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_MT7996E_W2'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_2G_5G_6G_MT7996E_STA_33_W0_W1_W2_TX_RX":{ + "enabled":"FALSE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=0 --radio 'radio==1.2.wiphy0,stations==33,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " use_ssid_idx=1 --radio 'radio==1.2.wiphy1,stations==33,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " use_ssid_idx=2 --radio 'radio==1.2.wiphy2,stations==33,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_5G_6G_MT7996E_STA_33_W0_W1_W2_TX_RX'", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_rx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_tx.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_rx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_rx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_rx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_rx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_tx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_tx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_tx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_tx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_rx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_rx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_rx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_rx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_tx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_tx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_tx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_tx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_rx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_rx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_rx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_rx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_tx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_tx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_tx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_tx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_rx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_rx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_rx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_rx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_tx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_tx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_tx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_tx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_rx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_rx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_rx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_rx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_tx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_tx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_tx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_tx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_rx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_rx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_rx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_rx_vap.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_tx_vap.json b/py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_tx_vap.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_tx_vap.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_tx_vap.json diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json new file mode 100644 index 000000000..6f0d2327d --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx":{ + + "CC_DUT_BE200_2G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W0_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W1_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W2_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W3_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W4_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W5_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W6_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W7_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_2G_W8_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json new file mode 100644 index 000000000..7cedaecaf --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx":{ + + "CC_DUT_BE200_2G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W0_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W1_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W2_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W3_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W4_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W5_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W6_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W7_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_2G_W8_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json new file mode 100644 index 000000000..ad04a4a31 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx":{ + + "CC_DUT_BE200_2G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W0_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W1_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W2_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W3_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W4_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W5_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W6_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W7_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_2G_W8_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json new file mode 100644 index 000000000..3521f173b --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx":{ + + "CC_DUT_BE200_2G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W0_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W1_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W2_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W3_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W4_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W5_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W6_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_2G_W7_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_2G_W8_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json new file mode 100644 index 000000000..e50f3fca7 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx":{ + + "CC_DUT_BE200_5G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W0_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W1_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W2_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W3_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W4_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W5_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W6_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W7_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_5G_W9_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json new file mode 100644 index 000000000..4659ffb8b --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx":{ + + "CC_DUT_BE200_5G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W0_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W1_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W2_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W3_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W4_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W5_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W6_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W7_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_5G_W9_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json new file mode 100644 index 000000000..7a55ab027 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx":{ + + "CC_DUT_BE200_5G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W0_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W1_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W2_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W3_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W4_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W5_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W6_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W7_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_5G_W9_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json new file mode 100644 index 000000000..2dcd796ad --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx":{ + + "CC_DUT_BE200_5G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W0_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W1_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W2_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W3_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W4_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W5_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W6_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_5G_W7_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_5G_W9_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json new file mode 100644 index 000000000..f8d46fdaf --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx":{ + + "CC_DUT_BE200_6G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W0_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W1_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W2_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W3_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W4_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W5_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W6_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W7_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_6G_W10_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json new file mode 100644 index 000000000..9ffe1521f --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx":{ + + "CC_DUT_BE200_6G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W0_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W1_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W2_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W3_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W4_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W5_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W6_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W7_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_6G_W10_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json new file mode 100644 index 000000000..23e167bd8 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx":{ + + "CC_DUT_BE200_6G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W0_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W1_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W2_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W3_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W4_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W5_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W6_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W7_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_6G_W10_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json new file mode 100644 index 000000000..258b3912d --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx":{ + + "CC_DUT_BE200_6G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W0_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W1_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W2_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W3_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W4_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W5_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W6_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_BE200_6G_W7_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "DP_mt7996e_6G_W10_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp_testgroup/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_test_group_W8_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp_testgroup/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_test_group_W8_TCP_rx.json new file mode 100644 index 000000000..88af8ea63 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp_testgroup/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_test_group_W8_TCP_rx.json @@ -0,0 +1,107 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_2g_test_group_TCP_rx":{ + "CC_mt7996e_2G_TESTGROUP_W8_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "TG_MT7996_2G_TESTGROUP_W8_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"testgroup.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT", + " use_ssid_idx=0 --radio 1.1.wiphy8 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", + " --num_stations 34", + " --group_name group1", + " --add_group", + " --upstream_port UPSTREAM_PORT", + " --a_min 60000000", + " --b_min 60000000", + " --log_level debug", + " --no_cleanup" + ] + }, + + "CC_DUT_mt7996e_2G_TESTGROUP_W8_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "DP_mt7996e_2G_TESTGROUP_W8_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_TESTGROUP_W8_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp_testgroup/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_test_group_W8_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp_testgroup/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_test_group_W8_TCP_tx.json new file mode 100644 index 000000000..28992c39a --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_dp_testgroup/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_test_group_W8_TCP_tx.json @@ -0,0 +1,107 @@ + +{ + "ct_dp_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_dp_2g_test_group_TCP_tx":{ + "CC_mt7996e_2G_TESTGROUP_W8_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "TG_MT7996_2G_TESTGROUP_W8_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"testgroup.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT", + " use_ssid_idx=0 --radio 1.1.wiphy8 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", + " --num_stations 34", + " --group_name group1", + " --add_group", + " --upstream_port UPSTREAM_PORT", + " --a_min 60000000", + " --b_min 60000000", + " --log_level debug", + " --no_cleanup" + ] + }, + + "CC_DUT_mt7996e_2G_TESTGROUP_W8_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "DP_mt7996e_2G_TESTGROUP_W8_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_dataplane_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_TESTGROUP_W8_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+500..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json new file mode 100644 index 000000000..c3c5be2be --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json @@ -0,0 +1,179 @@ +{ + "ct_tests_009_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + "ct_test_l3":{ + "TEST_L3_2G_BE200_STA_1_W0":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=0 --radio 'radio==1.1.wiphy0,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_BE200_STA_1_W0'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_5G_BE200_STA_1_W0":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=1 --radio 'radio==1.1.wiphy0,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_BE200_STA_1_W0'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_6G_BE200_STA_1_W0":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=2 --radio 'radio==1.1.wiphy0,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_BE200_STA_1_W0'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_2G_MT7996E_STA_1_W8":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=0 --radio 'radio==1.1.wiphy8,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_MT7996E_STA_1_W8'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_5G_MT7996E_STA_1_W9":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=1 --radio 'radio==1.1.wiphy9,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_MT7996E_STA_1_W9'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_6G_MT7996E_STA_1_W10":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=2 --radio 'radio==1.1.wiphy10,stations==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_MT7996E_STA_1_W10'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + + "TEST_L3_2G_MT7996E_STA_34_W8":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=0 --radio 'radio==1.1.wiphy8,stations==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_MT7996E_STA_34_W8'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_5G_MT7996E_STA_34_W9":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=1 --radio 'radio==1.1.wiphy9,stations==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_MT7996E_STA_34_W9'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "TEST_L3_6G_MT7996E_STA_34_W10":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"test_l3.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 30s --polling_interval 5s --upstream_port UPSTREAM_PORT ", + " use_ssid_idx=2 --radio 'radio==1.1.wiphy10,stations==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=750000000 --side_b_min_bps=750000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_MT7996E_STA_34_W10'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=MTU", + " --side_b_min_pdu=MTU", + " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" + ] + }, + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json new file mode 100644 index 000000000..90e3a010f --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx":{ + + "CC_DUT_BE200_2G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W0_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W1_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W2_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W3_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W4_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W5_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W6_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W7_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_2G_W8_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json new file mode 100644 index 000000000..aa891c997 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx":{ + + "CC_DUT_BE200_2G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W0_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W1_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W2_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W3_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W4_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W5_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W6_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W7_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_2G_W8_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json new file mode 100644 index 000000000..36093fbe3 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx":{ + + "CC_DUT_BE200_2G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W0_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W1_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W2_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W3_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W4_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W5_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W6_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W7_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_2G_W8_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json new file mode 100644 index 000000000..0ed174eb5 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx":{ + + "CC_DUT_BE200_2G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W0_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W1_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W2_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W3_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W4_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W5_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W6_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_2G_W7_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_2G_W8_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan8", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json new file mode 100644 index 000000000..244f5975b --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx":{ + + "CC_DUT_BE200_5G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W0_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W1_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W2_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W3_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W4_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W5_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W6_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W7_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_5G_W9_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json new file mode 100644 index 000000000..a92113cd9 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx":{ + + "CC_DUT_BE200_5G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W0_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W1_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W2_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W3_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W4_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W5_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W6_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W7_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_5G_W9_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json new file mode 100644 index 000000000..a43d74497 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx":{ + + "CC_DUT_BE200_5G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W0_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W1_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W2_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W3_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W4_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W5_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W6_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W7_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_5G_W9_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json new file mode 100644 index 000000000..4e6a5ba45 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx":{ + + "CC_DUT_BE200_5G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W0_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W1_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W2_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W3_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W4_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W5_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W6_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_5G_W7_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_5G_W9_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan9", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json new file mode 100644 index 000000000..ddd018692 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx":{ + + "CC_DUT_BE200_6G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W0_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W1_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W2_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W3_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W4_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W5_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W6_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W7_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_TCP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_TCP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_6G_W10_TCP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_TCP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_TCP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json new file mode 100644 index 000000000..30cc9b203 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx":{ + + "CC_DUT_BE200_6G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W0_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W1_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W2_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W3_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W4_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W5_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W6_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W7_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_TCP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_TCP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_6G_W10_TCP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_TCP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: TCP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_TCP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json new file mode 100644 index 000000000..d25703c6f --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx":{ + + "CC_DUT_BE200_6G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W0_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W1_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W2_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W3_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W4_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W5_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W6_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W7_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_UDP_rx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_UDP_rx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_6G_W10_UDP_rx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_UDP_rx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 1% --upload_speed 100% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Receive' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_UDP_rx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json new file mode 100644 index 000000000..bfb1a41f3 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json @@ -0,0 +1,505 @@ + +{ + "ct_rvr_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx":{ + + "CC_DUT_BE200_6G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W0_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan0", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W1_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan1", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W2_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan2", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W3_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan3", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W4_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan4", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W5_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan5", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W6_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan6", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_BE200_6G_W7_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan7", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_UDP_tx":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_UDP_tx ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "RVR_mt7996e_6G_W10_UDP_tx":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_rvr_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_UDP_tx", + " --config_name test_con --upstream UPSTREAM_PORT --dut USE_DUT_NAME --duration 20000 --station 1.1.wlan10", + " --download_speed 100% --upload_speed 1% --raw_line 'pkts: Custom' ", + " --raw_line 'cust_pkt_sz: 64;172;256;512;768;1024;MTU' ", + " --raw_line 'directions: DUT Transmit' ", + " --raw_line 'traffic_types: UDP' ", + " --raw_line 'bandw_options: AUTO' ", + " --raw_line 'spatial_streams: AUTO' ", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_UDP_tx'", + " --raw_line 'attenuator: ATTENUATOR_2'", + " --raw_line 'attenuations: 0..+100..500'", + " --raw_line 'attenuator_mod: 0xf' ", + " --test_rig TEST_RIG ", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json new file mode 100644 index 000000000..9fdb11f32 --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json @@ -0,0 +1,442 @@ + +{ + "ct_wc_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP":{ + + "CC_DUT_BE200_2G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W0_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W0_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W0_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W1_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W1_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W1_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W2_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W2_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W2_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W3_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W3_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W3_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W4_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W4_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W4_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W5_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W5_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W5_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W6_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W6_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W6_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_2G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_2G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_2G_W7_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_2G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_2G_W7_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_2G_W7_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_2G_W8_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_2G_W8_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_2G_W8_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 34 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_mt7996e_2G_W8_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_2G_W8_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1,16,34 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_2G_W8_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json new file mode 100644 index 000000000..1138410ec --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json @@ -0,0 +1,442 @@ + +{ + "ct_wc_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP":{ + + "CC_DUT_BE200_5G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W0_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W0_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W0_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W1_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W1_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W1_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W2_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W2_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W2_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W3_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W3_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W3_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W4_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W4_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W4_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W5_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W5_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W5_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W6_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W6_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W6_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_5G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_5G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_5G_W7_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_5G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_5G_W7_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_5G_W7_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_5G_W9_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_5G_W9_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_5G_W9_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 34 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_mt7996e_5G_W9_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_5G_W9_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1,16,34 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_5G_W9_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json new file mode 100644 index 000000000..fd4cd4b9b --- /dev/null +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json @@ -0,0 +1,442 @@ + +{ + "ct_wc_tests_scripts":{ + "Notes":[ + "This json file describes tests to be run by LANforge system", + "When doing a create_chamberview.py --create_scenario ", + "has no correlation to the --instance_name , instance name is used ", + "as a unique identifier for tha chamber-view test run" + ] + }, + "test_suites":{ + + "ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP":{ + + "CC_DUT_BE200_6G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W0_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy0,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W0_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W0_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W0_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W1_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy1,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W1_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W1_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W1_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W2_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy2,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W2_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W2_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W2_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W3_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy3,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W3_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W3_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W3_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W4_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy4,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W4_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W4_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W4_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W5_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy5,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W5_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W5_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W5_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W6_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy6,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W6_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W6_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W6_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_BE200_6G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_BE200_6G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario BE200_6G_W7_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy7,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_BE200_6G_W7_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name BE200_6G_W7_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'BE200_6G_W7_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "CC_DUT_mt7996e_6G_W10_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview_dut.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --dut_name USE_DUT_NAME", + " --ssid 'ssid_idx=0 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=1 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --ssid 'ssid_idx=2 ssid=SSID_USED security=SECURITY_USED password=SSID_PW_USED bssid=BSSID_TO_USE'", + " --sw_version DUT_SW --hw_version DUT_HW --serial_num DUT_SERIAL --model_num USE_DUT_NAME", + " --dut_flag DHCPD-LAN" + ] + }, + "CC_mt7996e_6G_W10_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "load_db":"skip", + "command":"create_chamberview.py", + "args":"", + "args_list":[ + " --lfmgr LF_MGR_IP --port LF_MGR_PORT --delete_scenario", + " --create_scenario mt7996e_6G_W10_DL_UL_TCP_UDP ", + " --raw_line \"profile_link 1.1 STA-AUTO 34 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --raw_line \"profile_link 1.1 upstream 1 'DUT: USE_DUT_NAME LAN' NA UPSTREAM_ALIAS,AUTO -1 NA\"" + ] + }, + "WC_mt7996e_6G_W10_DL_UL_TCP_UDP":{ + "enabled":"TRUE", + "timeout":"600", + "iterations":"1", + "load_db":"skip", + "command":"lf_wifi_capacity_test.py", + "args":"", + "args_list":[ + " --mgr LF_MGR_IP --port LF_MGR_PORT --lf_user LF_MGR_USER --lf_password LF_MGR_PASS --instance_name mt7996e_6G_W10_DL_UL_TCP_UDP", + " --upstream UPSTREAM_PORT --batch_size 1,16,34 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --pull_report --local_lf_report_dir REPORT_PATH --test_tag 'mt7996e_6G_W10_DL_UL_TCP_UDP'", + " --test_rig TEST_RIG ", + " --upload_rate '10M'", + " --download_rate '1M'", + " --set DUT_SET_NAME", + " --verbosity 11" + ] + } + , + "lf_qa":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_qa.py", + "args":"", + "args_list":[ + " --server TEST_SERVER --path REPORT_PATH --store --png --database DATABASE_SQLITE --test_suite TEST_SUITE" + ] + }, + "lf_inspect":{ + "enabled":"TRUE", + "timeout":"600", + "load_db":"skip", + "command":"./tools/lf_inspect.py", + "args":"", + "args_list":[ + " --path REPORT_PATH --database DATABASE_SQLITE --test_suite TEST_SUITE --db_index 1,0" + ] + } + } + } +} diff --git a/py-scripts/tools/ct_tests_json/ct_us_generic_scripts.json b/py-scripts/tools/archive/ct_tests_json/ct_us_generic_scripts.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_generic_scripts.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_generic_scripts.json index 83ba33431..b2c5e31f3 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_generic_scripts.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_generic_scripts.json @@ -2,7 +2,7 @@ "ct_generic_test_scripts":{ "Notes":[ "This json file describes tests to be run by LANforge system" - ] + ] }, "test_suites":{ "suite_generic_scripts": { @@ -62,4 +62,4 @@ } } } -} \ No newline at end of file +} diff --git a/py-scripts/tools/ct_tests_json/ct_us_scripts.json b/py-scripts/tools/archive/ct_tests_json/ct_us_scripts.json similarity index 99% rename from py-scripts/tools/ct_tests_json/ct_us_scripts.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_scripts.json index 2e05fedf1..db73df6b8 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_scripts.json +++ b/py-scripts/tools/archive/ct_tests_json/ct_us_scripts.json @@ -5,7 +5,7 @@ "When doing a create_chamberview.py --create_scenario ", "has no correlation to the --instance_name , instance name is used ", "as a unique identifier for tha chamber-view test run" - ] + ] }, "test_suites":{ "suite_scripts":{ @@ -17,7 +17,7 @@ "args_list":[ " " ] - }, + }, "lf_cleanup":{ "enabled":"FALSE", "load_db":"skip", @@ -146,7 +146,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'l3_longevity'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -332,7 +332,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ip_variable_time_ipv4_5g_tcp":{ "enabled":"TRUE", "command":"test_ip_variable_time.py", @@ -349,7 +349,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ip_connection_ipv6_udp":{ "enabled":"FALSE", "command":"test_ip_connection.py", @@ -367,8 +367,8 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, - + ]}, + "test_ip_variable_time_ipv6_tcp":{ "enabled":"FALSE", "command":"test_ip_variable_time.py", @@ -407,7 +407,7 @@ "command":"create_l3_stations.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED " ] }, @@ -461,7 +461,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ipv4_ps":{ "enabled":"FALSE", "command":"test_ipv4_ps.py", @@ -477,7 +477,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_ipv4_ttls":{ "enabled":"FALSE", "command":"test_ipv4_ttls.py", @@ -493,7 +493,7 @@ "args":"", "args_list":[ " --mgr LF_MGR_IP --sanitize --sleep 5" - ]}, + ]}, "test_l3_powersave_traffic":{ "enabled":"FALSE", "command":"test_l3_powersave_traffic.py", @@ -596,7 +596,7 @@ "command":"create_l4.py", "args":"", "args_list":[ - " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", + " --mgr LF_MGR_IP --radio wiphy1 --num_stations 4 --upstream_port UPSTREAM_PORT", " use_ssid_idx=1 --ssid SSID_USED --passwd SSID_PW_USED --security SECURITY_USED", " --debug" ] @@ -692,7 +692,7 @@ "args":"", "args_list":[ " --lfmgr LF_MGR_IP --local_lf_report_dir REPORT_PATH --test_duration 15s --polling_interval 5s --upstream_port UPSTREAM_PORT ", - " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", + " use_ssid_idx=1 --radio 'radio==wiphy1,stations==4,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED wifi_mode==0 wifi_settings==wifi_settings enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)'", " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000", " --test_rig TEST_RIG --test_tag 'l3_longevity'", " --dut_model_num USE_DUT_NAME --dut_sw_version DUT_SW --dut_hw_version DUT_HW --dut_serial_num DUT_SN" @@ -1182,7 +1182,7 @@ "args_list":[ " " ] - }, + }, "lf_report_test":{ "enabled":"TRUE", "load_db":"NONE", diff --git a/py-scripts/tools/ct_us_001_dp.bash b/py-scripts/tools/archive/ct_us_001_dp.bash similarity index 98% rename from py-scripts/tools/ct_us_001_dp.bash rename to py-scripts/tools/archive/ct_us_001_dp.bash index 458f49663..4787eb211 100755 --- a/py-scripts/tools/ct_us_001_dp.bash +++ b/py-scripts/tools/archive/ct_us_001_dp.bash @@ -15,4 +15,4 @@ echo "Running Dataplane Tests" ./ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json:dp_perf_5g_W1_W2_W4_W5_W7_tx \ --path /home/lanforge/html-reports/ct_us_001 \ --log_level debug \ ---production \ No newline at end of file +--production diff --git a/py-scripts/tools/ct_us_001_func.bash b/py-scripts/tools/archive/ct_us_001_func.bash similarity index 97% rename from py-scripts/tools/ct_us_001_func.bash rename to py-scripts/tools/archive/ct_us_001_func.bash index 688a9a8c6..cabf876dc 100755 --- a/py-scripts/tools/ct_us_001_func.bash +++ b/py-scripts/tools/archive/ct_us_001_func.bash @@ -12,4 +12,4 @@ echo "Running Functional Tests" --path /home/lanforge/html-reports/ct_us_001 \ --log_level debug \ --new_test_run \ ---production \ No newline at end of file +--production diff --git a/py-scripts/tools/ct_us_001_func_wc_dp_run.bash b/py-scripts/tools/archive/ct_us_001_func_wc_dp_run.bash similarity index 99% rename from py-scripts/tools/ct_us_001_func_wc_dp_run.bash rename to py-scripts/tools/archive/ct_us_001_func_wc_dp_run.bash index 119be6afc..1fc72793e 100755 --- a/py-scripts/tools/ct_us_001_func_wc_dp_run.bash +++ b/py-scripts/tools/archive/ct_us_001_func_wc_dp_run.bash @@ -11,4 +11,3 @@ echo "Running Wifi Capacity Tests" echo "Running Dataplane Tests" ./ct_us_001_dp.bash - diff --git a/py-scripts/tools/ct_us_001_scale.bash b/py-scripts/tools/archive/ct_us_001_scale.bash similarity index 100% rename from py-scripts/tools/ct_us_001_scale.bash rename to py-scripts/tools/archive/ct_us_001_scale.bash diff --git a/py-scripts/tools/ct_us_001_wc.bash b/py-scripts/tools/archive/ct_us_001_wc.bash similarity index 100% rename from py-scripts/tools/ct_us_001_wc.bash rename to py-scripts/tools/archive/ct_us_001_wc.bash diff --git a/py-scripts/tools/ct_us_002_cv.bash b/py-scripts/tools/archive/ct_us_002_cv.bash similarity index 81% rename from py-scripts/tools/ct_us_002_cv.bash rename to py-scripts/tools/archive/ct_us_002_cv.bash index e3306ed4e..853a8a846 100755 --- a/py-scripts/tools/ct_us_002_cv.bash +++ b/py-scripts/tools/archive/ct_us_002_cv.bash @@ -10,8 +10,8 @@ echo "Running Port Reset" --json_rig ./ct_rig_json/ct_us_002_rig.json \ --json_dut ./ct_dut_json/ct_002_AX16K_dut.json \ --json_test \ -./ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json:cv_tests,\ -./ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json:ct_scale \ +./ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json:cv_port_reset_test,\ +./ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json:cv_scale_test \ --path /home/lanforge/html-reports/ct_us_002 \ --log_level debug \ --new_test_run diff --git a/py-scripts/tools/ct_us_002_dp.bash b/py-scripts/tools/archive/ct_us_002_dp.bash similarity index 100% rename from py-scripts/tools/ct_us_002_dp.bash rename to py-scripts/tools/archive/ct_us_002_dp.bash diff --git a/py-scripts/tools/ct_us_002_func_wc_dp_run.bash b/py-scripts/tools/archive/ct_us_002_func_wc_dp_run.bash similarity index 63% rename from py-scripts/tools/ct_us_002_func_wc_dp_run.bash rename to py-scripts/tools/archive/ct_us_002_func_wc_dp_run.bash index 297277fc5..e3b097c0a 100755 --- a/py-scripts/tools/ct_us_002_func_wc_dp_run.bash +++ b/py-scripts/tools/archive/ct_us_002_func_wc_dp_run.bash @@ -9,4 +9,7 @@ echo "Running Wifi Capacity Tests" ./ct_us_002_wc.bash echo "Running Dataplane Tests" -./ct_us_002_dp.bash \ No newline at end of file +./ct_us_002_dp.bash + +echo "Running ChamberView: Port Reset and Scale Tests" +./ct_us_002_cv.bash diff --git a/py-scripts/tools/ct_us_002_scale.bash b/py-scripts/tools/archive/ct_us_002_scale.bash similarity index 100% rename from py-scripts/tools/ct_us_002_scale.bash rename to py-scripts/tools/archive/ct_us_002_scale.bash diff --git a/py-scripts/tools/ct_us_002_wc.bash b/py-scripts/tools/archive/ct_us_002_wc.bash similarity index 100% rename from py-scripts/tools/ct_us_002_wc.bash rename to py-scripts/tools/archive/ct_us_002_wc.bash diff --git a/py-scripts/tools/ct_us_004_dp.bash b/py-scripts/tools/archive/ct_us_004_dp.bash similarity index 98% rename from py-scripts/tools/ct_us_004_dp.bash rename to py-scripts/tools/archive/ct_us_004_dp.bash index ced6ac40a..2fb472e73 100755 --- a/py-scripts/tools/ct_us_004_dp.bash +++ b/py-scripts/tools/archive/ct_us_004_dp.bash @@ -14,4 +14,4 @@ echo "Running Dataplane Tests" ./ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json:dp_perf_5g_W1_W2_W4_W5_W6_W7_tx \ --path /home/lanforge/html-reports/ct_us_004 \ --log_level debug \ ---production \ No newline at end of file +--production diff --git a/py-scripts/tools/ct_us_004_func.bash b/py-scripts/tools/archive/ct_us_004_func.bash similarity index 97% rename from py-scripts/tools/ct_us_004_func.bash rename to py-scripts/tools/archive/ct_us_004_func.bash index 49f72cfb1..452511286 100755 --- a/py-scripts/tools/ct_us_004_func.bash +++ b/py-scripts/tools/archive/ct_us_004_func.bash @@ -12,4 +12,4 @@ set -x --path /home/lanforge/html-reports/ct_us_004 \ --log_level debug \ --new_test_run \ ---production \ No newline at end of file +--production diff --git a/py-scripts/tools/ct_us_004_func_wc_dp_run.bash b/py-scripts/tools/archive/ct_us_004_func_wc_dp_run.bash similarity index 91% rename from py-scripts/tools/ct_us_004_func_wc_dp_run.bash rename to py-scripts/tools/archive/ct_us_004_func_wc_dp_run.bash index 475891308..29b9e95cf 100755 --- a/py-scripts/tools/ct_us_004_func_wc_dp_run.bash +++ b/py-scripts/tools/archive/ct_us_004_func_wc_dp_run.bash @@ -10,4 +10,4 @@ echo "Running Wifi Capacity Tests" ./ct_us_004_wc.bash echo "Running Dataplane Tests" -./ct_us_004_dp.bash \ No newline at end of file +./ct_us_004_dp.bash diff --git a/py-scripts/tools/ct_us_004_wc.bash b/py-scripts/tools/archive/ct_us_004_wc.bash similarity index 100% rename from py-scripts/tools/ct_us_004_wc.bash rename to py-scripts/tools/archive/ct_us_004_wc.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto.bash b/py-scripts/tools/archive/ct_us_005_ap_auto.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_basic_cx.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_basic_cx.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_basic_cx.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_basic_cx.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_capacity.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_capacity.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_capacity.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_capacity.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_individual.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_individual.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_individual.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_individual.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_long_term.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_long_term.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_long_term.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_long_term.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_mix_stability.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_mix_stability.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_mix_stability.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_mix_stability.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_tput_multi_band.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_tput_multi_band.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_tput_multi_band.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_tput_multi_band.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_tput_multi_sta.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_tput_multi_sta.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_tput_multi_sta.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_tput_multi_sta.bash diff --git a/py-scripts/tools/ct_us_005_ap_auto_tput_single_sta.bash b/py-scripts/tools/archive/ct_us_005_ap_auto_tput_single_sta.bash similarity index 100% rename from py-scripts/tools/ct_us_005_ap_auto_tput_single_sta.bash rename to py-scripts/tools/archive/ct_us_005_ap_auto_tput_single_sta.bash diff --git a/py-scripts/tools/ct_us_007_dp_run.bash b/py-scripts/tools/archive/ct_us_007_dp_run.bash similarity index 99% rename from py-scripts/tools/ct_us_007_dp_run.bash rename to py-scripts/tools/archive/ct_us_007_dp_run.bash index a1d8f7578..67a4a697a 100755 --- a/py-scripts/tools/ct_us_007_dp_run.bash +++ b/py-scripts/tools/archive/ct_us_007_dp_run.bash @@ -21,5 +21,3 @@ echo "Running RVR tests" --path /home/lanforge/html-reports/ct_us_007 \ --log_level debug \ --production - - diff --git a/py-scripts/tools/ct_us_007_rvr_run.bash b/py-scripts/tools/archive/ct_us_007_rvr_run.bash similarity index 100% rename from py-scripts/tools/ct_us_007_rvr_run.bash rename to py-scripts/tools/archive/ct_us_007_rvr_run.bash diff --git a/py-scripts/tools/ct_us_008_dp_BE19000.bash b/py-scripts/tools/archive/ct_us_008_dp_BE19000.bash similarity index 100% rename from py-scripts/tools/ct_us_008_dp_BE19000.bash rename to py-scripts/tools/archive/ct_us_008_dp_BE19000.bash diff --git a/py-scripts/tools/ct_us_008_rvr_BE19000.bash b/py-scripts/tools/archive/ct_us_008_rvr_BE19000.bash similarity index 100% rename from py-scripts/tools/ct_us_008_rvr_BE19000.bash rename to py-scripts/tools/archive/ct_us_008_rvr_BE19000.bash diff --git a/py-scripts/tools/ct_us_008_rvr_VAP_AT7.bash b/py-scripts/tools/archive/ct_us_008_rvr_VAP_AT7.bash similarity index 100% rename from py-scripts/tools/ct_us_008_rvr_VAP_AT7.bash rename to py-scripts/tools/archive/ct_us_008_rvr_VAP_AT7.bash diff --git a/py-scripts/tools/archive/ct_us_009_dp_BE800.bash b/py-scripts/tools/archive/ct_us_009_dp_BE800.bash new file mode 100755 index 000000000..b05c237c1 --- /dev/null +++ b/py-scripts/tools/archive/ct_us_009_dp_BE800.bash @@ -0,0 +1,25 @@ +#!/bin/bash + +# allow commands to be printed to the terminal +set -x + +echo "Running Dataplane tests" +./lf_check.py \ +--db_override ./tools/ct_us_009_DP_PERF_BE19000.db \ +--json_rig ./ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json \ +--json_dut ./ct_dut_json/ct_009_TP_LINK_BE800_dut.json \ +--json_test \ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json:ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json:ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json:ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json:ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json:ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json:ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json:ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json:ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json:ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json:ct_perf_dp_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json:ct_perf_dp_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_dp/TP_LINK_BE800/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json:ct_perf_dp_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx \ +--path /home/lanforge/html-reports/ct_us_009 \ +--log_level debug diff --git a/py-scripts/tools/archive/ct_us_009_func_ASUS_BE96U.bash b/py-scripts/tools/archive/ct_us_009_func_ASUS_BE96U.bash new file mode 100755 index 000000000..10f490474 --- /dev/null +++ b/py-scripts/tools/archive/ct_us_009_func_ASUS_BE96U.bash @@ -0,0 +1,14 @@ +#!/bin/bash + +# allow commands to be printed to the terminal +set -x + +echo "Running Functional tests" +./lf_check.py \ +--db_override ./tools/ct_us_009_FUNC_ASUS_BE96U.db \ +--json_rig ./ct_rig_json/ct_us_009_ASUS_BE96U_rig.json \ +--json_dut ./ct_dut_json/ct_009_ASUS_BE96U_dut.json \ +--json_test \ +./ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json:ct_test_l3 \ +--path /home/lanforge/html-reports/ct_us_009 \ +--log_level debug diff --git a/py-scripts/tools/archive/ct_us_009_rvr_BE800.bash b/py-scripts/tools/archive/ct_us_009_rvr_BE800.bash new file mode 100755 index 000000000..fe68c2f85 --- /dev/null +++ b/py-scripts/tools/archive/ct_us_009_rvr_BE800.bash @@ -0,0 +1,25 @@ +#!/bin/bash + +# allow commands to be printed to the terminal +set -x + +echo "Running Rate vs Range tests" +./lf_check.py \ +--db_override ./tools/ct_us_009_RVR_PERF_BE800.db \ +--json_rig ./ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json \ +--json_dut ./ct_dut_json/ct_009_TP_LINK_BE800_dut.json \ +--json_test \ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json:ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json:ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json:ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json:ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json:ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json:ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json:ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json:ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json:ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json:ct_perf_rvr_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json:ct_perf_rvr_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/TP_LINK_BE800/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json:ct_perf_rvr_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx \ +--path /home/lanforge/html-reports/ct_us_009 \ +--log_level debug diff --git a/py-scripts/tools/archive/ct_us_009_wc_BE800.bash b/py-scripts/tools/archive/ct_us_009_wc_BE800.bash new file mode 100755 index 000000000..6733c2fd0 --- /dev/null +++ b/py-scripts/tools/archive/ct_us_009_wc_BE800.bash @@ -0,0 +1,16 @@ +#!/bin/bash + +# allow commands to be printed to the terminal +set -x + +echo "Running Wifi Capacity tests" +./lf_check.py \ +--db_override ./tools/CT_US_009_WC_PERF_BE800.db \ +--json_rig ./ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json \ +--json_dut ./ct_dut_json/ct_009_TP_LINK_BE800_dut.json \ +--json_test \ +./ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json:ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP,\ +./ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json:ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP,\ +./ct_tests_json/ct_us_009/ct_perf_wc/TP_LINK_BE800/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json:ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP \ +--path /home/lanforge/html-reports/ct_us_009 \ +--log_level debug diff --git a/py-scripts/tools/qa_ping_status.bash b/py-scripts/tools/archive/qa_ping_status.bash similarity index 100% rename from py-scripts/tools/qa_ping_status.bash rename to py-scripts/tools/archive/qa_ping_status.bash diff --git a/py-scripts/tools/lf_check.py b/py-scripts/tools/lf_check.py index 647c48649..d89c30461 100755 --- a/py-scripts/tools/lf_check.py +++ b/py-scripts/tools/lf_check.py @@ -1,5 +1,4 @@ -#!/usr/bin/python3 -# flake8: noqa +#!/usr/bin/env python3 ''' NAME: lf_check.py @@ -131,7 +130,6 @@ import datetime import sys import traceback -from pprint import pformat import copy @@ -181,7 +179,6 @@ def __init__(self, _log_path, _json_test_name): - # get the server information self.hostname = socket.getfqdn() self.server_ip = socket.gethostbyname(self.hostname) @@ -200,10 +197,9 @@ def __init__(self, if _outfile is not None: self.lf_check_outfile = _outfile - self.lf_check_outfile = self.lf_check_outfile.replace('/home/lanforge/','') + self.lf_check_outfile = self.lf_check_outfile.replace('/home/lanforge/', '') self.lf_check_report = "{file}.html".format(file=self.lf_check_outfile) - # test configuration self.json_rig = _json_rig self.json_dut = _json_dut @@ -587,8 +583,6 @@ def no_send_results_email(self, report_file=None): self.lf_check_link = "http://{hostname}/{report}".format( hostname=self.server_ip, report=report_url) - - def send_results_email(self, report_file=None): if (report_file is None): self.logger.info("No report file, not sending email.") @@ -603,7 +597,7 @@ def send_results_email(self, report_file=None): inspect_url = self.inspect_report_html.replace('/home/lanforge', '') if inspect_url.startswith('/'): inspect_url = inspect_url[1:] - allure_report_latest = os.path.join(os.path.dirname(os.path.dirname(report_url)),'allure-report-latest') + allure_report_latest = os.path.join(os.path.dirname(os.path.dirname(report_url)), 'allure-report-latest') # following recommendation # NOTE: https://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-from-nic-in-python @@ -658,7 +652,7 @@ def send_results_email(self, report_file=None): lf_check Test Suite Report: http://{hostname}/{report} -""".format(hostname=self.server_ip, suite=self.test_suite, db=self.database_sqlite, report=report_url,host=self.server_ip, allure=allure_report_latest, +""".format(hostname=self.server_ip, suite=self.test_suite, db=self.database_sqlite, report=report_url, host=self.server_ip, allure=allure_report_latest, dut_model=self.use_dut_name, dut_hw=self.dut_hw, dut_sw=self.dut_sw, dut_sn=self.dut_serial) # For Multiple Suites save the link for multiple lf_check results lf_qa and lf_inspect alread keep the aggragate @@ -672,7 +666,7 @@ def send_results_email(self, report_file=None): QA Report Dashboard: http://{ip_qa}/{qa_url} -NOTE: Diagrams are links in dashboard""".format(ip_qa=self.server_ip, qa_url=qa_url, qa_url_local=qa_url) +NOTE: Diagrams are links in dashboard""".format(ip_qa=self.server_ip, qa_url=qa_url) else: self.message_txt += """ @@ -699,7 +693,7 @@ def send_results_email(self, report_file=None): # get the Fedora platform if (self.email_title_txt != ""): - self.mail_subject = "{iteration} of {total_iterations} Suites [{finished} Tests_Completed] [{fail} Fail] [{partial} Partial Fail] [{timeout} Timeout] DUT: {dut} QA Server IP: {hostname} Rig: {email} Suite: {suite} Duration: {duration} Tests:{tests} DB: {db} Server Ver:{server_ver} Date: {date}".format( + self.mail_subject = "{iteration} of {total_iterations} Suites [Suite: {suite}] [{finished} Tests_Completed] [{fail} Fail] [{partial} Partial Fail] [{timeout} Timeout] DUT: {dut} QA Server IP: {hostname} Rig: {email} Duration: {duration} Tests:{tests} DB: {db} Server Ver:{server_ver} Date: {date}".format( # noqa: E501 iteration=self.iteration, total_iterations=self.total_iterations, hostname=self.server_ip, @@ -716,7 +710,7 @@ def send_results_email(self, report_file=None): db=self.database_sqlite, date=datetime.datetime.now()) else: - self.mail_subject = "[{finished} Tests_Completed] [{fail} Fail] [{partial} Partial Fail] [{timeout} Timeout] DUT: {dut} Suite: {suite} Duration: {duration} Suite: {suite} Tests:{tests} Server IP:{hostname} DB:{db} Server Ver:{server_ver} Date: {date} ".format( + self.mail_subject = "[Suite: {suite}] [{finished} Tests_Completed] [{fail} Fail] [{partial} Partial Fail] [{timeout} Timeout] DUT: {dut} Suite: {suite} Duration: {duration} Tests:{tests} Server IP:{hostname} DB:{db} Server Ver:{server_ver} Date: {date} ".format( # noqa: E501 # email=self.email_title_txt, duration=self.suite_duration, suite=self.test_suite, @@ -777,7 +771,6 @@ def send_results_email(self, report_file=None): start=self.suite_start_time, stop=self.suite_end_time, tests=self.tests_run, - finished=self.tests_success, fail=self.tests_failure, timeout=self.tests_timeout, partial=self.tests_some_failure, @@ -915,9 +908,6 @@ def finish_junit_testsuite(self): """ - def get_junit_results(self): - return self.junit_results - def get_html_results(self): return self.html_results @@ -1492,9 +1482,11 @@ def run_script(self): self.logger.info("Script returned non-zero return code: {return_code} for test: {command}".format( return_code=return_code, command=command_to_run)) - except BaseException as err: + except Exception as x: + traceback.print_exception( + Exception, x, x.__traceback__, chain=True) self.logger.info( - "issue reading return code err:{err}".format(err=err)) + "issue reading return code, test runner will continue") self.logger.info(summary_output) stdout_log.write(summary_output) @@ -1610,12 +1602,10 @@ def run_script(self): lanforge_server_version_full=self.lanforge_server_version_full[0])) meta_data_fd.close() - except ValueError as err: - self.logger.critical("unable to write meta {meta_data_path} : {err})".format( - meta_data_path=meta_data_path, err=err)) - except BaseException as err: - self.logger.critical("BaseException unable to write meta {meta_data_path} : {err}".format( - meta_data_path=meta_data_path, err=err)) + except Exception as x: + traceback.print_exception( + Exception, x, x.__traceback__, chain=True) + self.logger.critical(f"unable to write meta {meta_data_path}") # Code for checking if the script passed or failed much of the # code is checking the output. @@ -1769,10 +1759,9 @@ def run_script(self): # https://github.com/testmoapp/junitxml#structure # command_quotes_removed = command.replace('"', '"') - summary_output_updated = summary_output.replace( - '&', 'and').replace('<', '<').replace('>', '>') + # summary_output_updated = summary_output.replace('&', 'and').replace('<', '<').replace('>', '>') self.junit_results += """ - + """.format(name=self.test, suite=self.test_suite, command=short_cmd, time=self.duration_sec_us) # Start properties @@ -1788,9 +1777,9 @@ def run_script(self): - """.format(lanforge=self.lanforge_system_node_version, ip=self.lf_mgr_ip,server=self.lanforge_server_version, + """.format(lanforge=self.lanforge_system_node_version, ip=self.lf_mgr_ip, server=self.lanforge_server_version, gui_sha=self.lanforge_gui_git_sha, scripts=self.scripts_git_sha, - kernel=self.lanforge_kernel_version, gui=self.lanforge_gui_version, build=self.lanforge_gui_build_date, + kernel=self.lanforge_kernel_version, gui=self.lanforge_gui_version, build=self.lanforge_gui_build_date, ) # put the URL's in the results @@ -1807,8 +1796,7 @@ def run_script(self): - """.format(command=command_quotes_removed, server_ip=self.server_ip, server_ip_1=self.server_ip, log=allure_stdout_log_link, lf_check=self.lf_check_report_url,server_ip_2=self.server_ip, lf_check_report=self.lf_check_report) - + """.format(command=command_quotes_removed, server_ip=self.server_ip, server_ip_1=self.server_ip, log=allure_stdout_log_link, lf_check=self.lf_check_report_url, server_ip_2=self.server_ip, lf_check_report=self.lf_check_report) # noqa: E501 # End properties self.junit_results += """ @@ -1898,12 +1886,13 @@ def run_script_test(self): self.logger.info("Suite Start Time {suite_time}".format( suite_time=self.suite_start_time)) - self.allure_time_stamp = str(datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")) + self.allure_time_stamp = str(datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")) self.start_junit_testsuite() # Configure Tests - for self.test in self.test_dict: + for test in self.test_dict: + self.test = test if ((self.test_dict[self.test]['enabled'] == "TRUE" and self.use_test_list is False) or (self.use_test_list is True and self.test in self.test_list)): @@ -1963,16 +1952,19 @@ def run_script_test(self): # in python an empty list returns false . # If channel_list and bandwidth_list are populated then if self.channel_list and self.nss_list and self.bandwidth_list and self.tx_power_list: - for self.channel in self.channel_list: - for self.nss in self.nss_list: - for self.bandwidth in self.bandwidth_list: + for channel in self.channel_list: + self.channel = channel + for nss in self.nss_list: + self.nss = nss + for bandwidth in self.bandwidth_list: + self.bandwidth = bandwidth # tx_power is passed in as - for self.tx_power in self.tx_power_list: + for tx_power in self.tx_power_list: + self.tx_power = tx_power # log may contain multiple runs - this helps put the meta.txt # in right directory - self.iteration = 0 self.report_index = 0 - for self.iteration in range(self.test_iterations): + for _ in range(self.test_iterations): self.iteration += 1 # Runs the scripts self.run_script() @@ -1983,15 +1975,17 @@ def run_script_test(self): self.bandwidth_list = [] self.tx_power_list = [] elif self.channel_list and self.nss_list and self.bandwidth_list and not self.tx_power_list: - for self.channel in self.channel_list: - for self.nss in self.nss_list: - for self.bandwidth in self.bandwidth_list: + for channel in self.channel_list: + self.channel = channel + for nss in self.nss_list: + self.nss = nss + for bandwidth in self.bandwidth_list: + self.bandwidth = bandwidth # tx_power is passed in so run will contain all tx powers from command line # log may contain multiple runs - this helps put the meta.txt # in right directory - self.iteration = 0 self.report_index = 0 - for self.iteration in range(self.test_iterations): + for _ in range(self.test_iterations): # in batch mode need to set the VARIABLES back into the test self.iteration += 1 # Runs the scripts @@ -2003,15 +1997,16 @@ def run_script_test(self): self.tx_power_list = [] elif self.channel_list and self.nss_list and not self.bandwidth_list and not self.tx_power_list: - for self.channel in self.channel_list: - for self.nss in self.nss_list: + for channel in self.channel_list: + self.channel = channel + for nss in self.nss_list: + self.nss = nss # use bandwidth tx_power is passed in from command line # one run will contain all the bandwiths and tx_power settings # log may contain multiple runs - this helps put the meta.txt # in right directory - self.iteration = 0 self.report_index = 0 - for self.iteration in range(self.test_iterations): + for _ in range(self.test_iterations): self.iteration += 1 # Runs the scripts self.run_script() @@ -2024,9 +2019,8 @@ def run_script_test(self): # log may contain multiple runs - this helps put the meta.txt # in right directory - self.iteration = 0 self.report_index = 0 - for self.iteration in range(self.test_iterations): + for _ in range(self.test_iterations): # Runs the scripts self.iteration += 1 self.run_script() @@ -2157,14 +2151,13 @@ def main(): help="--update_latest copy latest results to top dir", action='store_true') parser.add_argument('--new_test_run', - help="--new_test_run is used to allow for a new set of allure links in results", - action='store_true') - parser.add_argument("--test_window_days",dest='test_window_days', + help="--new_test_run is used to allow for a new set of allure links in results", + action='store_true') + parser.add_argument("--test_window_days", dest='test_window_days', help="""This is the test window in days for reporing results, So older results will not be reported If parameter not set will read TEST_WINDOW_DAYS from rig.json""") - # logging configuration: parser.add_argument('--log_level', default=None, @@ -2173,11 +2166,10 @@ def main(): parser.add_argument("--lf_logger_config_json", help="--lf_logger_config_json , json configuration of logger") - parser.add_argument("--no_exit","--no_exit_if_no_gui",dest='no_exit_if_no_gui', + parser.add_argument("--no_exit", "--no_exit_if_no_gui", dest='no_exit_if_no_gui', help="--no_exit_if_no_gui store true , if gui unavailable do not exit to allow gui restart", action='store_true') - args = parser.parse_args() # set up logger @@ -2192,9 +2184,7 @@ def main(): logger_config.load_lf_logger_config() # TODO Here is where the multiple suite and multiple json may be added - if ((args.json_rig is None) - or (args.json_dut is None) - or (args.json_test is None)): + if ((args.json_rig is None) or (args.json_dut is None) or (args.json_test is None)): logger.error("Must enter json_rig, json_dut, json_tests and suite") exit(1) @@ -2220,7 +2210,7 @@ def main(): json_rig_list = args.json_rig.split(',') json_dut_list = args.json_dut.split(',') - if(len(json_test_list) != len(suite_list)): + if (len(json_test_list) != len(suite_list)): logger.error( "Currently the suite and the test_json need to have the same number of entries in the list, either add suite names or test_json names") @@ -2231,7 +2221,6 @@ def main(): # Validate the the test suites are in the tests json # for test json and suite - test_suite_validation_error = 0 for (json_test_name, suite_name) in zip(json_test_list, suite_list): try: logger.info("Validating suite: {suite_name} json_test: {json_test}".format( @@ -2264,13 +2253,13 @@ def main(): # Determine the number of iterations total_iterations = 0 # for rig json (lanforge) - for json_rig_name in json_rig_list: + for _ in json_rig_list: # for test json and suite - for (json_test_name, suite_name) in zip(json_test_list, suite_list): + for (_, _) in zip(json_test_list, suite_list): # for dut json - for (json_dut_name) in json_dut_list: + for _ in json_dut_list: total_iterations += 1 iteration = 0 @@ -2350,7 +2339,6 @@ def main(): db_override = args.db_override test_window_days = args.test_window_days - if args.production: production = True logger.info("Email to production list") @@ -2374,7 +2362,7 @@ def main(): dir=__dir, current_time=current_time) else: csv_results = "{current_time}-{outfile}-{dir}.csv".format( - dir=__dir, current_time=current_time) + dir=__dir, outfile=args.outfile, current_time=current_time) csv_results = report.file_add_path(csv_results) if args.outfile == '': @@ -2406,8 +2394,6 @@ def main(): logger.info( "use_testlist set True test list : {list}".format(list=test_list)) - - # lf_check() class created check = lf_check(_json_rig=json_rig, _json_dut=json_dut, @@ -2446,9 +2432,10 @@ def main(): try: scripts_git_sha = check.get_scripts_git_sha() logger.info("git_sha {sha}".format(sha=scripts_git_sha)) - except BaseException: - logger.warning( - "WARNING: git_sha read exception unable to read") + except Exception as x: + traceback.print_exception( + Exception, x, x.__traceback__, chain=True) + logger.warning("git_sha read exception unable to read") try: lanforge_system_node_version = check.get_lanforge_system_node_version() @@ -2518,7 +2505,7 @@ def main(): exit(1) # check to see if there was a error - if len(lanforge_gui_version_full) == 0 or lanforge_gui_version == "" or lanforge_gui_build_date == "" or lanforge_gui_git_sha == "": + if len(lanforge_gui_version_full) == 0 or lanforge_gui_version == "" or lanforge_gui_build_date == "" or lanforge_gui_git_sha == "": if not args.no_exit_if_no_gui: logger.error("LANforge GUI Not Running, so exiting") exit(1) @@ -2563,11 +2550,11 @@ def main(): logger.info( "5.4.3 radio fw version not in /radiostatus/all ") firmware_version = "5.4.3 N/A" - #radio_firmware_list = radio_firmware_list.append("NA") + # radio_firmware_list = radio_firmware_list.append("NA") lf_radio_df_new = pd.DataFrame( {'Radio': [lanforge_radio_json[key]['entity id']], - 'Port': [lanforge_radio_json[key]['port']], + 'Port': [lanforge_radio_json[key]['port']], 'WIFI-Radio Driver': [driver], 'Radio Capabilities': [lanforge_radio_json[key]['capabilities']], 'Firmware Version': [firmware_version], @@ -2575,15 +2562,13 @@ def main(): 'max_vap': [lanforge_radio_json[key]['max_vap']], 'max_sta': [lanforge_radio_json[key]['max_vifs']]}) - - lf_radio_df = pd.concat([lf_radio_df,lf_radio_df_new], axis=0) + lf_radio_df = pd.concat([lf_radio_df, lf_radio_df_new], axis=0) logger.info("lf_radio_df:: {lf_radio_df}".format( lf_radio_df=lf_radio_df)) logger.info("radio_fw_dict:: {radio_fw_dict}".format( radio_fw_dict=radio_fw_dict)) - # using set() to remove duplicated entries radio_firmware_list = list(set(radio_firmware_list)) @@ -2692,13 +2677,12 @@ def main(): report.set_table_dataframe(lf_suite_time) report.build_table() - report.set_table_title("LANforge Allure Report ") report.build_table_title() allure_report_latest_url = '../allure-report-latest' - report.build_link("LANforge Allure Report",allure_report_latest_url) + report.build_link("LANforge Allure Report", allure_report_latest_url) if "NA" not in qa_report_html: report.set_table_title("LANforge QA ") @@ -2766,25 +2750,21 @@ def main(): # TODO path in the allure results path allure_results_path = str(report.get_path()) + "/allure-results" - allure_results_latest_path = str(report.get_path()) + "/allure-results-latest" if not os.path.exists(allure_results_path): os.makedirs(allure_results_path) # copy junit_xml from suite to results - shutil.copy2(junit_xml,allure_results_path) + shutil.copy2(junit_xml, allure_results_path) check.set_junit_results(junit_xml) check.set_junit_path_only(junit_path_only) - allure_report_path_latest = str(report.get_path()) + "/allure-report-latest" - # Allure report history # TODO move to generation being at the end of all suites # report.update_allure_results_history(allure_results=allure_results_path) # report.generate_allure_report() - # Send email if args.no_send_email: logger.info("send email not set") @@ -2860,9 +2840,6 @@ def main(): # print out locations of results logger.info("html_report_latest: {latest}".format(latest=html_report_latest)) - - - # This next bit of code will do the following # Record the GUI build information and Kernel information # Update the allure history @@ -2872,7 +2849,6 @@ def main(): # Create the allure executor.json file base off the time stamp # Copy the executor.json into the allure-results - # save the environment _properties allure_latest = "latest_allure={}/allure-report-latest/\n".format(os.path.dirname(os.path.dirname(lf_check_test_suite_list[0]))) kernel_version = "kernel={}\n".format(lanforge_kernel_version) @@ -2880,10 +2856,10 @@ def main(): gui_build_date = "gui_build_date={}\n".format(lanforge_gui_build_date) lanforge_ip = "lanforge_ip={}\n".format(lanforge_system_ip) lanforge = "lanforge={}\n".format(lanforge_system_node_version) - #suites = "suites={}\n".format(lf_check_test_suite_list) + # suites = "suites={}\n".format(lf_check_test_suite_list) allure_environment_properties = "{allure_latest} {kernel_version} {gui_version} {gui_build_date} {lanforge_ip} {lanforge}".format( - allure_latest=allure_latest,kernel_version=kernel_version,gui_version=gui_version,gui_build_date=gui_build_date,lanforge_ip=lanforge_ip,lanforge=lanforge + allure_latest=allure_latest, kernel_version=kernel_version, gui_version=gui_version, gui_build_date=gui_build_date, lanforge_ip=lanforge_ip, lanforge=lanforge ) if lf_check_test_suite_list: @@ -2914,34 +2890,31 @@ def main(): count = 0 for suite in allure_env_links_fd: - suite_string = " URL_{}={}\n".format(count,suite) + suite_string = " URL_{}={}\n".format(count, suite) allure_environment_properties += suite_string count += 1 - report.set_allure_environment_properties(allure_environment_properties=allure_environment_properties) report.write_allure_environment_properties(allure_results_path=allure_results_path) - # Copy the allure report to latest and mv report to time stamp # maybe report should contain this funtionality allure_epoch = str(int(time.time())) - allure_epoch_dir = os.path.join(report.path,allure_epoch) - + allure_epoch_dir = os.path.join(report.path, allure_epoch) # check to see if the directory is present if not os.path.exists(report.allure_report_dir): os.makedirs(report.allure_report_dir) # directory with time stamp - new_allure_epoch_dir = shutil.copytree(report.allure_report_dir,allure_epoch_dir) + new_allure_epoch_dir = shutil.copytree(report.allure_report_dir, allure_epoch_dir) logger.debug("allure report directory with timestamp {allure_report}".format(allure_report=new_allure_epoch_dir)) # Update the executor json after copying the data # save executor.json allure_executor_dictionary = { "reportName": "{report_name}".format(report_name="lf_check"), - "buildName": "{build_name}#{time1}".format(build_name=lanforge_gui_version,time1=allure_epoch), + "buildName": "{build_name}#{time1}".format(build_name=lanforge_gui_version, time1=allure_epoch), "buildOrder": "{time2}".format(time2=allure_epoch), "name": "{name}".format(name="Lanforge Check"), "reportUrl": "../{time3}/index.html".format(time3=allure_epoch), @@ -2953,25 +2926,26 @@ def main(): report.set_allure_executor(allure_executor_json) report.write_allure_executor(allure_results_path=allure_results_path) - # Update allure one time report.update_allure_results_history(allure_results_path=allure_results_path) report.generate_allure_report() - # copy allure report to latest - allure_latest_dir = os.path.join(report.path,"allure-report-latest") + allure_latest_dir = os.path.join(report.path, "allure-report-latest") # check to see if the directory is present if not os.path.exists(allure_latest_dir): os.makedirs(allure_latest_dir) try: - new_allure_latest_dir = shutil.copytree(report.allure_report_dir,allure_latest_dir, dirs_exist_ok=True) - except: - # fedora 27 does no except the directory being present + new_allure_latest_dir = shutil.copytree(report.allure_report_dir, allure_latest_dir, dirs_exist_ok=True) + except Exception as x: + traceback.print_exception( + Exception, x, x.__traceback__, chain=True) + logger.info("Fedora 26 does not expcet the directory being present for allurewill create") shutil.rmtree(allure_latest_dir, ignore_errors=True) - new_allure_latest_dir = shutil.copytree(report.allure_report_dir,allure_latest_dir) + new_allure_latest_dir = shutil.copytree(report.allure_report_dir, allure_latest_dir) + logger.debug("allure report directory copied to {latest}".format(latest=new_allure_latest_dir)) # copy the allure-report-latest into the epoch time stamp @@ -2980,13 +2954,17 @@ def main(): os.makedirs(new_allure_epoch_dir) try: - new_allure_epoch_latest_dir = shutil.copytree(report.allure_report_dir,new_allure_epoch_dir, dirs_exist_ok=True) - except: + new_allure_epoch_latest_dir = shutil.copytree(report.allure_report_dir, new_allure_epoch_dir, dirs_exist_ok=True) + except Exception as x: + traceback.print_exception( + Exception, x, x.__traceback__, chain=True) + logger.info("Fedora 26 does not expcet the directory being present for allurewill create") # fedora 27 does no except the directory being present shutil.rmtree(new_allure_epoch_dir, ignore_errors=True) - new_allure_epoch_latest_dir = shutil.copytree(report.allure_report_dir,new_allure_epoch_dir) + new_allure_epoch_latest_dir = shutil.copytree(report.allure_report_dir, new_allure_epoch_dir) logger.debug("allure report directory copied to {latest}".format(latest=new_allure_epoch_latest_dir)) + if __name__ == '__main__': main() diff --git a/py-scripts/tools/lf_cli_to_launchjson.py b/py-scripts/tools/lf_cli_to_launchjson.py index 61de992a8..ed1dd878f 100755 --- a/py-scripts/tools/lf_cli_to_launchjson.py +++ b/py-scripts/tools/lf_cli_to_launchjson.py @@ -1,22 +1,21 @@ #!/usr/bin/env python3 -# flake8: noqa -""" +""" NAME: lf_cli_to_launchjson.py PURPOSE: To convert cli command into launch.json format - + EXAMPLE: Use './lf_cli_to_launchjson.py --help' to see command line usage and options - ./lf_cli_to_launchjson.py --cli + ./lf_cli_to_launchjson.py --cli SCRIPT_CLASSIFICATION: Tool SCRIPT_CATEGORIES: Creation -NOTES: +NOTES: Enter the cli of the script as an input to the script. --cli "" -Eg: --cli '--lfmgr 192.168.100.116 --local_lf_report_dir /home/lanforge/html-reports/ct-us-001/2023-05-21-03-00-06_lf_check_suite_wc_dp_nightly --test_duration 15s --polling_interval 5s --upstream_port 1.1.eth2 --radio 'radio==wiphy4,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy5,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy6,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy7,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000 --test_rig CT-US-001 --test_tag 'test_l3' --dut_model_num ASUSRT-AX88U --dut_sw_version 3.0.0.4.386_44266 --dut_hw_version 1.0 --dut_serial_num 12345678" ' +Eg: --cli '--lfmgr 192.168.100.116 --local_lf_report_dir /home/lanforge/html-reports/ct-us-001/2023-05-21-03-00-06_lf_check_suite_wc_dp_nightly --test_duration 15s --polling_interval 5s --upstream_port 1.1.eth2 --radio 'radio==wiphy4,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy5,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy6,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy7,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000 --test_rig CT-US-001 --test_tag 'test_l3' --dut_model_num ASUSRT-AX88U --dut_sw_version 3.0.0.4.386_44266 --dut_hw_version 1.0 --dut_serial_num 12345678" ' # noqa: E501 STATUS: Functional @@ -45,69 +44,80 @@ sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) + class clitojson(): def __init__(self, - cli_list=["--mgr 192.168.200.147 --port 8080 --lf_user lanforge --lf_password lanforge --instance_name scenario_wpa2_wc --upstream 1.1.eth1 --batch_size 1,3,5 --loop_iter 1 --protocol TCP-IPv4 --duration 20000 --download_rate 10Mbps --upload_rate 10Mbps --pull_report --delete_old_scenario --local_lf_report_dir /home/lanforge/html-scripts --test_tag WCT_MTK7915_W1_5G_40_UDP_BD_AT --test_rig TEST_RIG --set DUT_SET_NAME"], - list= [], - length_of_cli=[] - + cli_list=None, + list=None, + length_of_cli=None + ): - self.cli_list=cli_list - self.list1=list - self.length_of_cli=length_of_cli + if cli_list is None: + print("cli passed is None, Please pass is cli command, exiting") + exit(1) + + if list is None: + list = [] + + if length_of_cli is None: + length_of_cli = [] + + self.cli_list = cli_list + self.list1 = list + self.length_of_cli = length_of_cli print(self.cli_list) def split_cli(self): - l1=self.cli_list.split(' ') + l1 = self.cli_list.split(' ') self.length_of_cli.append(len(l1)) for i in range(self.length_of_cli[0]): - if i+1 == self.length_of_cli[0]: + if i + 1 == self.length_of_cli[0]: break for j in range(len(l1)): - if ("--" or "," in l1[j]) : - if ("--" or "," in l1[j+1]): + if ("--" or "," in l1[j]): + if ("--" or "," in l1[j + 1]): self.list1.append(l1[j]) else: - self.list1.append(l1[j] +" "+ l1[j+1]) + self.list1.append(l1[j] + " " + l1[j + 1]) self.json_dump() def json_dump(self): - s='args_list' - json_list=json.dumps(self.list1) - print(s,json_list) - dict1={s:self.list1} - out_file=open("test1.json","w") - json.dump(dict1,out_file,indent=4) + s = 'args_list' + json_list = json.dumps(self.list1) + print(s, json_list) + dict1 = {s: self.list1} + out_file = open("test1.json", "w") + json.dump(dict1, out_file, indent=4) out_file.close() - + def main(): parser = argparse.ArgumentParser( prog='lf_cli_to_launchjson.py', formatter_class=argparse.RawTextHelpFormatter, - description= """ + description=""" NAME: lf_cli_to_launchjson.py PURPOSE: To convert cli command into launch.json format - + EXAMPLE: Use './lf_cli_to_launchjson.py --help' to see command line usage and options - ./lf_cli_to_launchjson.py --cli + ./lf_cli_to_launchjson.py --cli SCRIPT_CLASSIFICATION: Tool SCRIPT_CATEGORIES: Creation -NOTES: +NOTES: Enter the cli of the script as an input to the script. --cli "" -Eg: --cli '--lfmgr 192.168.100.116 --local_lf_report_dir /home/lanforge/html-reports/ct-us-001/2023-05-21-03-00-06_lf_check_suite_wc_dp_nightly --test_duration 15s --polling_interval 5s --upstream_port 1.1.eth2 --radio 'radio==wiphy4,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy5,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy6,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy7,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000 --test_rig CT-US-001 --test_tag 'test_l3' --dut_model_num ASUSRT-AX88U --dut_sw_version 3.0.0.4.386_44266 --dut_hw_version 1.0 --dut_serial_num 12345678" ' +Eg: --cli '--lfmgr 192.168.100.116 --local_lf_report_dir /home/lanforge/html-reports/ct-us-001/2023-05-21-03-00-06_lf_check_suite_wc_dp_nightly --test_duration 15s --polling_interval 5s --upstream_port 1.1.eth2 --radio 'radio==wiphy4,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy5,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy6,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --radio 'radio==wiphy7,stations==1,ssid==asus11ax-2,ssid_pw==hello123,security==wpa2,wifi_mode==0,wifi_settings==wifi_settings,enable_flags==(ht160_enable|wpa2_enable|80211u_enable|create_admin_down)' --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=300000000 --test_rig CT-US-001 --test_tag 'test_l3' --dut_model_num ASUSRT-AX88U --dut_sw_version 3.0.0.4.386_44266 --dut_hw_version 1.0 --dut_serial_num 12345678" ' # noqa: E501 STATUS: Functional @@ -125,16 +135,15 @@ def main(): """ ) - parser.add_argument("--cli",type=str, help="enter the csv file path", required=True) - - args = parser.parse_args() + parser.add_argument("--cli", type=str, help="enter the csv file path", required=True) + + args = parser.parse_args() + + conversion = clitojson(cli_list=args.cli + ) - conversion=clitojson(cli_list= args.cli - ) - conversion.split_cli() + if __name__ == "__main__": main() - - diff --git a/py-scripts/tools/lf_help_check.py b/py-scripts/tools/lf_help_check.py index 99c6ca6d2..61af1369b 100755 --- a/py-scripts/tools/lf_help_check.py +++ b/py-scripts/tools/lf_help_check.py @@ -7,6 +7,7 @@ It is not meant to replace proper testing. """ import argparse +import glob import logging import os import subprocess @@ -49,11 +50,12 @@ def configure_logging(debug: bool = False): logger.setLevel(logging.DEBUG) -def main(scripts: list, group_size: int, **kwargs): +def main(help_check_scripts: list, help_summary_scripts: list, group_size: int, **kwargs): """ - Run help parallelized help check on provided scripts + Run help parallelized help checks on provided scripts - :param scripts: List of scripts to run help check + :param help_check_scripts: List of scripts to run help check + :param help_summary_scripts: List of scripts to run help summary check :param group_size: Maximum number of scripts to group together for parallelized help checks :return int, list: Integer representing pass or fail (0 or 1), @@ -62,39 +64,50 @@ def main(scripts: list, group_size: int, **kwargs): scripts that failed help summary check. :rtype tuple: """ + def report_results(result_data: dict): + """Internal helper function to report result data + + :return: Dictionary containing script help check data, where the script + name is the key and the following data are the values: + 'timed_out', 'return_code', 'stdout', 'stderr' + :return int, list: Integer representing pass or fail (0 or 1), + list of failed scripts (if any). + """ + any_failed = False + failed_scripts = [] + + for script, data in result_data.items(): + if data["timed_out"] or data["return_code"] != 0: + any_failed = True + failed_scripts.append(script) + logger.error(f"Script \'{script}\' failed check") + logger.error(f"Script \'{script}\' stdout:\n{data['stdout']}") + logger.error(f"Script \'{script}\' stderr:\n{data['stderr']}") + + return any_failed, failed_scripts + any_failed = False - script_groups = generate_script_groups(scripts, group_size) - check_data = run_checks(script_groups) - - help_data = check_data[0] - help_summary_data = check_data[1] - - failed_help_scripts = [] - for script, data in help_data.items(): - if data["timed_out"] or data["return_code"] != 0: - any_failed = True - failed_help_scripts.append(script) - logger.error(f"Script \'{script}\' failed help check") - logger.error(f"Script \'{script}\' stdout:\n{data['stdout']}") - logger.error(f"Script \'{script}\' stderr:\n{data['stderr']}") - - failed_help_summary_scripts = [] - for script, data in help_summary_data.items(): - if data["timed_out"] or data["return_code"] != 0: - any_failed = True - failed_help_summary_scripts.append(script) - logger.error(f"Script \'{script}\' failed help summary check") - logger.error(f"Script \'{script}\' stdout:\n{data['stdout']}") - logger.error(f"Script \'{script}\' stderr:\n{data['stderr']}") + help_check_script_groups = generate_script_groups(help_check_scripts, group_size) + help_summary_script_groups = generate_script_groups(help_summary_scripts, group_size) + + results = run_checks(help_check_script_groups, help_summary_script_groups) + + # Report help check results + logger.info("Help check results") + any_failed, failed_help_check_scripts = report_results(results[0]) + + # Report help summary check results + logger.info("Help summary check results") + any_failed, failed_help_summary_scripts = report_results(results[1]) if not any_failed: return 0, None else: - return 1, (failed_help_scripts, failed_help_summary_scripts) + return 1, (failed_help_check_scripts, failed_help_summary_scripts) -def desired_script(file): +def desired_script(file, help_summary: bool = False): """ Filtering function to match only desired scripts. @@ -106,16 +119,28 @@ def desired_script(file): :return bool: Keep script if true, otherwise ignore :rtype bool: """ - if not os.path.isfile(file): return False elif not file.endswith(".py"): + # Recursive glob search takes care of this but leave here just in case return False elif file == THIS_SCRIPT_NAME: return False elif file == "__init__.py": return False + # Only consider directory where script is located. Otherwise, may accidentally + # filter out all scripts if these strings are somehow used in the full path + directory_name = os.path.dirname(file) + if 'tools' in directory_name \ + or 'sandbox' in directory_name \ + or 'scripts_deprecated' in directory_name: + return False + + # Don't run help summary check on examples, as many currently do not implement it + if help_summary and 'examples' in file: + return False + return True @@ -148,13 +173,15 @@ def generate_script_groups(scripts: list, return script_groups -def run_checks(script_groups: list) -> dict: +def run_checks(help_check_script_groups: list, help_summary_script_groups: list) -> dict: """ Run help and help summary checks on segmented script groups, returning post-check status after completion. - :param script_groups: List of list of strings where each sub-list - contains a list of scripts to check in parallel + :param help_check_script_groups: List of list of strings where each sub-list + contains a list of scripts to check in parallel + :param help_summary_script_groups: List of list of strings where each sub-list + contains a list of scripts to check in parallel :return: Dictionary containing script help check data, where the script name is the key and the following data are the values: 'timed_out', 'return_code', 'stdout', 'stderr' @@ -165,14 +192,18 @@ def run_checks(script_groups: list) -> dict: all_start_time = time() # Run help check - help_data = {script: None for script in scripts} - for group in script_groups: + help_data = {} + for group in help_check_script_groups: + for script in group: + help_data[script] = None help_group_data = run_group_check(group, ["--help"]) help_data.update(help_group_data) # Run help summary check - help_summary_data = {script: None for script in scripts} - for group in script_groups: + help_summary_data = {} + for group in help_summary_script_groups: + for script in group: + help_summary_data[script] = None help_summary_group_data = run_group_check(group, ["--help_summary"]) help_summary_data.update(help_summary_group_data) @@ -271,14 +302,23 @@ def run_group_check(group: list, script_options: list) -> list: logger.error("This script must be run from the 'py-scripts' directory") exit(2) - # Gather all Python scripts - scripts = [file for file in os.listdir(".") if desired_script(file)] - num_scripts = len(scripts) - logger.info(f"Running LANforge scripts \'py-scripts\' parallelized help and help summary checks on {num_scripts} scripts") - logger.debug(f"Running help and help summary check on the following scripts: {scripts}") + # Gather all Python scripts in all sub-directories + all_scripts = glob.glob("./*.py") + glob.glob("./**/*.py") + + # Gather and report help check scripts + help_check_scripts = [file for file in all_scripts if desired_script(file)] + num_help_check_scripts = len(help_check_scripts) + logger.info(f"Running LANforge scripts \'py-scripts\' parallelized help checks on {num_help_check_scripts} scripts") + logger.debug(f"Running help check on the following scripts: {help_check_scripts}") + + # Gather and report help summary check scripts + help_summary_scripts = [file for file in help_check_scripts if desired_script(file, help_summary=True)] + num_help_summary_scripts = len(help_summary_scripts) + logger.info(f"Running LANforge scripts \'py-scripts\' parallelized help summary checks on {num_help_summary_scripts} scripts") + logger.debug(f"Running help summary check on the following scripts: {help_summary_scripts}") # Run parallelized help checks - ret, failed_scripts = main(scripts=scripts, **vars(args)) + ret, failed_scripts = main(help_check_scripts=help_check_scripts, help_summary_scripts=help_summary_scripts, **vars(args)) # Summarize checks and exit if ret == 0: diff --git a/py-scripts/tools/lf_inspect.py b/py-scripts/tools/lf_inspect.py index ff5c1a75e..d8593eefe 100755 --- a/py-scripts/tools/lf_inspect.py +++ b/py-scripts/tools/lf_inspect.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' lf_inspect.py --database @@ -10,23 +9,19 @@ import sys import os import importlib -import plotly.express as px import pandas as pd import sqlite3 import argparse from pathlib import Path import time import logging -import re import csv import traceback -import math import datetime import shutil import socket - sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../../"))) lf_report = importlib.import_module("py-scripts.lf_report") @@ -42,9 +37,9 @@ class inspect_sql: def __init__(self, _path='.', _dir='', - _database_list=[], - _element_list=[], - _db_index_list=[], + _database_list=None, + _element_list=None, + _db_index_list=None, _csv_results='', _table=None, _outfile='', @@ -55,7 +50,7 @@ def __init__(self, _test_suite='db_compare', _test_window_days='7' ): - + # get the server information self.hostname = socket.getfqdn() self.server_ip = socket.gethostbyname(self.hostname) @@ -64,14 +59,22 @@ def __init__(self, self.lf_inspect_report_url = "" self.report_path = "" + if _database_list is None: + _database_list = [] + + if _element_list is None: + _element_list = [] + + if _db_index_list is None: + _db_index_list = [] + if _outfile is not None: self.report_path = _outfile self.lf_inspect_report_url = self.report_path.replace('/home/lanforge/', '') if self.lf_inspect_report_url.startswith('/'): self.lf_inspect_report_url = self.lf_inspect_report_url[1:] - - self.test_window_days=_test_window_days + self.test_window_days = _test_window_days self.path = _path self.dir = _dir self.table = _table @@ -137,7 +140,7 @@ def __init__(self, # Allure information self.junit_results = "" self.junit_path_only = "" - self.allure_time_stamp = str(datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")) + self.allure_time_stamp = str(datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")) def set_junit_results(self, junit_results): self.junit_results = junit_results @@ -145,50 +148,30 @@ def set_junit_results(self, junit_results): def set_junit_path_only(self, junit_path_only): self.junit_path_only = junit_path_only - def get_html_results(self): - return self.html_results - - # TODO allow for running of multiple test suites - def start_junit_testsuites(self): - self.junit_results += """ - - """ - - def finish_junit_testsuites(self): - self.junit_results += """ - - """ # TODO have the suite name be the DB + def start_junit_testsuite(self): - if(len(self.database_list)) == 1: + if (len(self.database_list)) == 1: # remove file extenstion from db name lf_inspect_database_name = os.path.splitext(str(os.path.basename(self.database_list[0])))[0] # for now assume 2, TODO loop though list else: - lf_inspect_database_name = os.path.splitext(str(os.path.basename(self.database_list[0])))[0]+"_"+os.path.spliter(str(os.path.basename(self.database_list[1])))[0] + lf_inspect_database_name = os.path.splitext(str(os.path.basename(self.database_list[0])))[0] + "_" + os.path.spliter(str(os.path.basename(self.database_list[1])))[0] - #self.junit_results += """ - # - #""".format(suite=lf_inspect_database_name, duration=self.suite_duration,start=self.allure_time_stamp) + # self.junit_results += """ + # + # """.format(suite=lf_inspect_database_name, duration=self.suite_duration,start=self.allure_time_stamp) self.junit_results += """ """.format(suite=lf_inspect_database_name, start=self.allure_time_stamp) - # TODO - #def start_junit_testsuite(self): + # def start_junit_testsuite(self): # self.junit_results += """ # # """.format(suite=self.test_suite, duration=self.suite_duration,start=self.allure_time_stamp) - - - def finish_junit_testsuite(self): - self.junit_results += """ - - """ - def get_junit_results(self): return self.junit_results @@ -215,9 +198,6 @@ def start_csv_results(self): self.csv_results_writer.writerow(self.csv_results_column_headers) self.csv_results_file.flush() - def get_junit_results(self): - return self.junit_results - # TODO allow for running of multiple test suites def start_junit_testsuites(self): self.junit_results += """ @@ -229,7 +209,7 @@ def finish_junit_testsuites(self): """ - #def start_junit_testsuite(self): + # def start_junit_testsuite(self): # self.junit_results += """ # # """.format(suite=self.test_suite) @@ -239,16 +219,12 @@ def finish_junit_testsuite(self): """ - def get_junit_results(self): - return self.junit_results - def get_html_results(self): return self.html_results - - # Helper methods # for the same db + def compare_data(self): if len(self.database_list) == 1: # TODO in future have ability to extract single DUT and compare @@ -266,9 +242,9 @@ def compare_data(self): def compare_multi_db_info(self): logger.info("compare the data in multiple db: {db_list}".format(db_list=self.database_list)) - col_list= [] + col_list = [] attrib_list = [] - #if the element list is empty the compare only on db index + # if the element list is empty the compare only on db index if self.element_list: self.compare_on_element = True for element in self.element_list: @@ -277,8 +253,6 @@ def compare_multi_db_info(self): attrib_list.append(element_tmp[1]) # note this is a list of two elements separated by && sub_attrib_list = attrib_list[0].split('&&') - - # start the html results for the compare self.start_html_results() @@ -304,7 +278,7 @@ def compare_multi_db_info(self): exit(1) if self.element_list: - df_1 = df_1.loc[df_1[col_list[0]] == sub_attrib_list[0]] + df_1 = df_1.loc[df_1[col_list[0]] == sub_attrib_list[0]] self.conn.close() @@ -335,9 +309,9 @@ def compare_multi_db_info(self): for graph_group in df_1['Graph-Group'].unique(): for description in df_1['short-description'].unique(): df_tmp = df_1.loc[ - (df_1['Graph-Group'] == str(graph_group)) - & (df_1['test-tag'] == str(test_tag)) - & (df_1['short-description'] == str(description))] + (df_1['Graph-Group'] == str(graph_group)) & + (df_1['test-tag'] == str(test_tag)) & + (df_1['short-description'] == str(description))] # For comparing two databases there only needs to be a single entry if not df_tmp.empty: @@ -350,16 +324,16 @@ def compare_multi_db_info(self): # if the recent test is over a week old do not include in run # 1 day = 86400000 milli seconds # 1 week = 604800000 milli seconds - time_difference = int(time_now) -int(recent_test_run) - logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( - time_now=time_now,recent_test_run=recent_test_run,test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) + time_difference = int(time_now) - int(recent_test_run) + logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( # noqa: E501 + time_now=time_now, recent_test_run=recent_test_run, test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) if (time_difference) < test_window_epoch: # find the same information in db2 df_tmp_comp = df_2.loc[ - (df_2['Graph-Group'] == str(graph_group)) - & (df_2['test-tag'] == str(test_tag)) - & (df_2['short-description'] == str(description))] + (df_2['Graph-Group'] == str(graph_group)) & + (df_2['test-tag'] == str(test_tag)) & + (df_2['short-description'] == str(description))] if not df_tmp_comp.empty: logger.info("db2 contains: {group} {tag} {desc}".format(group=graph_group, tag=test_tag, desc=description)) @@ -380,8 +354,8 @@ def compare_multi_db_info(self): logger.debug("type: {data} {data2}".format(data=type(df_data_2), data2=df_data_2)) percent_delta = 0 - if((float(df_data_1['numeric-score']) != 0 and df_data_1['numeric-score'] is not None) and df_data_2 is not None): - percent_delta = round(((float(df_data_2['numeric-score'])/float(df_data_1['numeric-score'])) * 100), 2) + if ((float(df_data_1['numeric-score']) != 0 and df_data_1['numeric-score'] is not None) and df_data_2 is not None): + percent_delta = round(((float(df_data_2['numeric-score']) / float(df_data_1['numeric-score'])) * 100), 2) self.performance_total += 1 @@ -398,39 +372,39 @@ def compare_multi_db_info(self): background = self.background_green self.performance_good += 1 logger.info("Basic Client Connectivity {connect_time} < 500 ms so passed".format(connect_time=float(df_data_2['numeric-score']))) - # changing the performce to > 80 7/9/2024 - + # changing the performce to > 80 7/9/2024 - elif percent_delta >= 80: - logger.info("Performance Good {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Good {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Good" background = self.background_green self.performance_good += 1 elif percent_delta >= 70: - logger.info("Performance Fair {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Fair {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Fair" background = self.background_purple self.performance_fair += 1 elif percent_delta >= 50: - logger.info("Performance Poor {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Poor {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Poor" background = self.background_orange self.performance_poor += 1 elif percent_delta == 0: # for UL in test-tag and DL 0 or DL in test-tag and UL 0 this case should not be a failure if 'UL+DL' in df_data_1['short-description'] and 'DL_UL' in df_data_1['test-tag']: - logger.info("For test {test} the {discription} DL not being monitored Not Applicable".format( - test=df_data_1['test-tag'],description=df_data_1['short-description'])) + logger.info("For test {test} the {description} DL not being monitored Not Applicable".format( + test=df_data_1['test-tag'], description=df_data_1['short-description'])) background = self.background_red self.performance_critical += 1 self.test_result = "Critical" elif 'DL' in df_data_1['short-description'] and 'UL' in df_data_1['test-tag']: - logger.info("For test {test} the {discription} DL not being monitored Not Applicable".format( - test=df_data_1['test-tag'],description=df_data_1['short-description'])) + logger.info("For test {test} the {description} DL not being monitored Not Applicable".format( + test=df_data_1['test-tag'], description=df_data_1['short-description'])) background = self.background_green self.performance_good += 1 self.test_result = "Good" elif 'DL' in df_data_1['short-description'] and 'UL' in df_data_1['test-tag']: - logger.info("For test {test} the {discription} DL not being monitored Not Applicable".format( - test=df_data_1['test-tag'],description=df_data_1['short-description'])) + logger.info("For test {test} the {description} DL not being monitored Not Applicable".format( + test=df_data_1['test-tag'], description=df_data_1['short-description'])) background = self.background_green self.performance_good += 1 self.test_result = "Good" @@ -439,40 +413,39 @@ def compare_multi_db_info(self): elif 'Failed' in df_data_1['short-description']: # Only check the lastest run to see if zero # if((float(df_data_1['numeric-score']) != 0.0) or (float(df_data_2['numeric-score']) !=0.0)): - if((float(df_data_2['numeric-score']) !=0.0)): - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + if ((float(df_data_2['numeric-score']) != 0.0)): + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) background = self.background_red self.performance_critical += 1 self.test_result = "Critical" else: - logger.info("Performance Good {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Good {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Good" background = self.background_green self.performance_good += 1 elif 'Max Stations IP' in df_data_1['short-description']: - if((float(df_data_2['numeric-score']) == 0.0)): - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + if ((float(df_data_2['numeric-score']) == 0.0)): + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) background = self.background_red self.performance_critical += 1 self.test_result = "Critical" else: - logger.info("Performance Good {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Good {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Good" background = self.background_green self.performance_good += 1 else: - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Critical" background = self.background_red self.performance_critical += 1 else: - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Critical" background = self.background_red self.performance_critical += 1 - # we can get most anything from the dataframe # TODO use the dataframe export line to CSV? row = [ @@ -545,7 +518,7 @@ def compare_multi_db_info(self): # record the junit results self.junit_results += """ - """.format(name=self.junit_test, suite=self.test_suite, description=description,time="1") + """.format(name=self.junit_test, suite=self.test_suite, description=description, time="1") # remove junit xml characters str_df_data_1 = str(df_data_1).replace('<', '').replace('>', '') @@ -565,13 +538,13 @@ def compare_multi_db_info(self): """.format(server_ip=self.server_ip, lf_inspect=self.lf_inspect_report_url, - test_result=self.test_result, numeric_score_1=df_data_1['numeric-score'], numeric_score_2=df_data_2['numeric-score'], - percent=percent_delta, df_data_1=str_df_data_1, df_data_2=str_df_data_2) - + test_result=self.test_result, numeric_score_1=df_data_1['numeric-score'], numeric_score_2=df_data_2['numeric-score'], + percent=percent_delta, df_data_1=str_df_data_1, df_data_2=str_df_data_2) + # End properties self.junit_results += """ - """ + """ # Anything other then Good is a failure for allure if self.test_result != "Good": self.junit_results += """ @@ -623,9 +596,7 @@ def compare_single_db_info(self): for test_tag in df3['test-tag'].unique(): for graph_group in df3['Graph-Group'].unique(): for description in df3['short-description'].unique(): - df_tmp = df3.loc[(df3['Graph-Group'] == str(graph_group)) - & (df3['test-tag'] == str(test_tag)) - & (df3['short-description'] == str(description))] + df_tmp = df3.loc[(df3['Graph-Group'] == str(graph_group)) & (df3['test-tag'] == str(test_tag)) & (df3['short-description'] == str(description))] # TODO need to be sure that there is at least two entries if not df_tmp.empty and len(df_tmp.index) >= 2: @@ -637,9 +608,9 @@ def compare_single_db_info(self): # if the recent test is over a week old do not include in run # 1 day = 86400000 milli seconds # 1 week = 604800000 milli seconds - time_difference = int(time_now) -int(recent_test_run) - logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( - time_now=time_now,recent_test_run=recent_test_run,test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) + time_difference = int(time_now) - int(recent_test_run) + logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( # noqa: E501 + time_now=time_now, recent_test_run=recent_test_run, test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) if (time_difference) < test_window_epoch: # Note if graph group is score there is sub tests for pass and fail @@ -658,10 +629,10 @@ def compare_single_db_info(self): df_data_2 = df_tmp.iloc[db_index_2] percent_delta = 0 - if((float(df_data_1['numeric-score']) != 0.0 and df_data_1['numeric-score'] is not None) and df_data_2 is not None): - percent_delta = round(((float(df_data_2['numeric-score'])/float(df_data_1['numeric-score'])) * 100), 2) + if ((float(df_data_1['numeric-score']) != 0.0 and df_data_1['numeric-score'] is not None) and df_data_2 is not None): + percent_delta = round(((float(df_data_2['numeric-score']) / float(df_data_1['numeric-score'])) * 100), 2) - self.performance_total += 1 + self.performance_total += 1 # AP auto basic connectivity the failure is if the connection took longer then 500 ms if 'Basic Client Connectivity' in df_data_2['short-description']: @@ -677,21 +648,20 @@ def compare_single_db_info(self): self.performance_good += 1 logger.info("Basic Client Connectivity {connect_time} < 500 ms so passed".format(connect_time=float(df_data_2['numeric-score']))) - elif percent_delta >= 80: - logger.info("Performance Good {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Good {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Good" background = self.background_green self.performance_good += 1 elif percent_delta >= 70: - logger.info("Performance Fair {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Fair {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Fair" background = self.background_purple self.performance_fair += 1 elif percent_delta >= 50: - logger.info("Performance Poor {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Poor {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Poor" background = self.background_orange self.performance_poor += 1 @@ -711,28 +681,27 @@ def compare_single_db_info(self): # negative logic like Stations Failed IP if zero is a goot thing elif 'Failed' in df_data_1['short-description']: - if((float(df_data_1['numeric-score']) != 0.0) or (float(df_data_2['numeric-score']) != 0.0)): - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + if ((float(df_data_1['numeric-score']) != 0.0) or (float(df_data_2['numeric-score']) != 0.0)): + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) background = self.background_red self.performance_critical += 1 self.test_result = "Critical" else: - logger.info("Performance Good {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Good {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Good" background = self.background_green self.performance_good += 1 else: - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Critical" background = self.background_red self.performance_critical += 1 else: - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Critical" background = self.background_red self.performance_critical += 1 - # we can get most anything from the dataframe # TODO use the dataframe export line to CSV? row = [ @@ -818,8 +787,8 @@ def compare_single_db_info(self): self.junit_results += """ """ - # note the order of the data is 1,0 - # the last run (0) is stored in numeric_score_2 + # note the order of the data is 1,0 + # the last run (0) is stored in numeric_score_2 # the previous run (1) is stored in numeric_score 1 self.junit_results += """ @@ -829,12 +798,12 @@ def compare_single_db_info(self): """.format(test_result=self.test_result, numeric_score_1=df_data_1['numeric-score'], numeric_score_2=df_data_2['numeric-score'], - percent=percent_delta, df_data_1=str_df_data_1, df_data_2=str_df_data_2) - + percent=percent_delta, df_data_1=str_df_data_1, df_data_2=str_df_data_2) + # End properties self.junit_results += """ - """ + """ # need to have tests return error messages if self.test_result != "Good": self.junit_results += """ @@ -931,9 +900,9 @@ def compare_element_single_db_info(self): for graph_group in df_1['Graph-Group'].unique(): for description in df_1['short-description'].unique(): df_tmp = df_1.loc[ - (df_1['Graph-Group'] == str(graph_group)) - & (df_1['test-tag'] == str(test_tag)) - & (df_1['short-description'] == str(description))] + (df_1['Graph-Group'] == str(graph_group)) & + (df_1['test-tag'] == str(test_tag)) & + (df_1['short-description'] == str(description))] # For comparing two databases there only needs to be a single entry if not df_tmp.empty: @@ -946,16 +915,13 @@ def compare_element_single_db_info(self): # if the recent test is over a week old do not include in run # 1 day = 86400000 milli seconds # 1 week = 604800000 milli seconds - time_difference = int(time_now) -int(recent_test_run) - logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( - time_now=time_now,recent_test_run=recent_test_run,test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) + time_difference = int(time_now) - int(recent_test_run) + logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( # noqa: E501 + time_now=time_now, recent_test_run=recent_test_run, test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) if (time_difference) < test_window_epoch: # find the same information in db2 - df_tmp_comp = df_2.loc[ - (df_2['Graph-Group'] == str(graph_group)) - & (df_2['test-tag'] == str(test_tag)) - & (df_2['short-description'] == str(description))] + df_tmp_comp = df_2.loc[(df_2['Graph-Group'] == str(graph_group)) & (df_2['test-tag'] == str(test_tag)) & (df_2['short-description'] == str(description))] logger.debug("df_tmp_comp {}".format(df_tmp_comp)) if not df_tmp_comp.empty: logger.info("db2 contains: {group} {tag} {desc}".format(group=graph_group, tag=test_tag, desc=description)) @@ -977,10 +943,10 @@ def compare_element_single_db_info(self): logger.debug("type: {data} {data2}".format(data=type(df_data_2), data2=df_data_2)) percent_delta = 0 - if((float(df_data_1['numeric-score']) != 0.0 and df_data_1['numeric-score'] is not None) and df_data_2 is not None): - percent_delta = round(((float(df_data_2['numeric-score'])/float(df_data_1['numeric-score'])) * 100), 2) + if ((float(df_data_1['numeric-score']) != 0.0 and df_data_1['numeric-score'] is not None) and df_data_2 is not None): + percent_delta = round(((float(df_data_2['numeric-score']) / float(df_data_1['numeric-score'])) * 100), 2) - self.performance_total += 1 + self.performance_total += 1 # AP auto basic connectivity the failure is if the connection took longer then 500 ms if 'Basic Client Connectivity' in df_data_2['short-description']: @@ -996,19 +962,18 @@ def compare_element_single_db_info(self): self.performance_good += 1 logger.info("Basic Client Connectivity {connect_time} < 500 ms so passed".format(connect_time=float(df_data_2['numeric-score']))) - elif percent_delta >= 80: - logger.info("Performance Good {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Good {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Good" background = self.background_green self.performance_good += 1 elif percent_delta >= 70: - logger.info("Performance Fair {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Fair {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Fair" background = self.background_purple self.performance_fair += 1 elif percent_delta >= 50: - logger.info("Performance Poor {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Poor {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Poor" background = self.background_orange self.performance_poor += 1 @@ -1027,23 +992,23 @@ def compare_element_single_db_info(self): # negative logic like Stations Failed IP if zero is a goot thing elif 'Failed' in df_data_1['short-description']: - if((float(df_data_1['numeric-score']) != 0.0) or (float(df_data_2['numeric-score']) !=0.0)): - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + if ((float(df_data_1['numeric-score']) != 0.0) or (float(df_data_2['numeric-score']) != 0.0)): + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) background = self.background_red self.performance_critical += 1 self.test_result = "Critical" else: - logger.info("Performance Good {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Good {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Good" background = self.background_green self.performance_good += 1 - else: - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + else: + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Critical" background = self.background_red self.performance_critical += 1 else: - logger.info("Performance Critical {percent} {description}".format(percent=percent_delta,description=df_data_2['short-description'])) + logger.info("Performance Critical {percent} {description}".format(percent=percent_delta, description=df_data_2['short-description'])) self.test_result = "Critical" background = self.background_red self.performance_critical += 1 @@ -1139,12 +1104,12 @@ def compare_element_single_db_info(self): """.format(test_result=self.test_result, numeric_score_1=df_data_1['numeric-score'], numeric_score_2=df_data_2['numeric-score'], - percent=percent_delta, df_data_1=str_df_data_1, df_data_2=str_df_data_2) - + percent=percent_delta, df_data_1=str_df_data_1, df_data_2=str_df_data_2) + # End properties self.junit_results += """ - """ + """ if self.test_result != "Good": self.junit_results += """ @@ -1249,10 +1214,10 @@ def get_suite_html(self): test_id, test_tag = self.get_test_id_test_tag(kpi_path) suite_html_results += """ - {test_id}{test_tag}html / - pdf / + {test_id}{test_tag}html / + pdf / results_dir - {parent_name} + {parent_name} """.format(test_id=test_id, test_tag=test_tag, html_path=html_path, pdf_path=pdf_path, dir_path=dir_path, parent_name=parent_name) suite_html_results += """ @@ -1296,7 +1261,7 @@ def main(): if db_index is not specified: for single db compare, will compare last run with previous for multiple db compare will compre last run in both db ---db_index 0,1 with a single db will compare last to previous +--db_index 0,1 with a single db will compare last to previous --db_index 0,0 with two db entered will compare: the last run in db one with last run of db 2 --db_index n1,n1 will compare the oldest in both db if 2 db's entered and will be interperated as -1,-1 @@ -1305,8 +1270,8 @@ def main(): ''') parser.add_argument('--element', help=''' - --element dut-model-num==dut1&&dut2 will column element dut-model-num between dut1,dut2 - for single db will look in same db for both, + --element dut-model-num==dut1&&dut2 will column element dut-model-num between dut1,dut2 + for single db will look in same db for both, (not supported) if two db then first dut queried in first db and second dut quired in second db''') parser.add_argument('--table', help='--table qa_table default: qa_table', default='qa_table') parser.add_argument('--dir', help="--dir default lf_qa", default="lf_inspect") @@ -1316,7 +1281,6 @@ def main(): parser.add_argument('--test_suite', help="--test_suite , the test suite is to help identify the tests run for the lf_inspect comparison", default="lf_inspect_compare") parser.add_argument('--test_window_days', help="--test_window, days to look back for test results , used to elimnate older tests being reported default 3 days", default="3") - # logging configuration: parser.add_argument('--log_level', default=None, help='Set logging level: debug | info | warning | error | critical') @@ -1345,8 +1309,8 @@ def main(): __element_list = [] if args.db_index is not None: - db_index = args.db_index.replace('n','-') - __db_index_list =db_index.split(',') + db_index = args.db_index.replace('n', '-') + __db_index_list = db_index.split(',') else: if len(__database_list) > 1: # compare the lastest in both dbs @@ -1398,7 +1362,7 @@ def main(): _report_path=report_path, _log_path=log_path, _lf_inspect_report_path=__lf_inspect_report_path, - _test_suite = __test_suite, + _test_suite=__test_suite, _test_window_days=__test_window_days ) @@ -1420,14 +1384,14 @@ def main(): report.start_content_div2() if len(__database_list) == 1: # comparison was done on specific elements in the database - if __element_list: + if __element_list: # currently there should only be one element for element in __element_list: element_tmp = element.split("==") sub_attrib_list = element_tmp[1].split('&&') objective = '''QA test run comparision between database: {db_1} index: {index_1} and index: {index_2} - '''.format(db_1=__database_list[0],index_1=__db_index_list[0],index_2=__db_index_list[1]) + '''.format(db_1=__database_list[0], index_1=__db_index_list[0], index_2=__db_index_list[1]) report.set_obj_html("Objective", objective) report.build_objective() report.set_text("Column headings with #1 : {attrib_1}".format(attrib_1=sub_attrib_list[0])) @@ -1435,11 +1399,9 @@ def main(): report.set_text("Column headings with #2 : {attrib_2}".format(attrib_2=sub_attrib_list[1])) report.build_text_simple() - - else: objective = '''QA test run comparision in database : {db_1} index: {index_1} and index: {index_2} , - '''.format(db_1=__database_list[0],index_1=__db_index_list[0],index_2=__db_index_list[1]) + '''.format(db_1=__database_list[0], index_1=__db_index_list[0], index_2=__db_index_list[1]) report.set_obj_html("Objective", objective) report.build_objective() report.set_text("Column headings with #1 for first db_index: {attrib_1}".format(attrib_1=__db_index_list[0])) @@ -1451,29 +1413,28 @@ def main(): else: - if __element_list: + if __element_list: # currently there should only be one element for element in __element_list: element_tmp = element.split("==") sub_attrib_list = element_tmp[1].split('&&') - objective = '''QA test run comparision between database: {db_1} index: {index_1} and database: {db_2} index: {index_2} with element attribute: {element} - '''.format(db_1=__database_list[0],index_1=__db_index_list[0],db_2=__database_list[1],index_2=__db_index_list[1],element=element_tmp[0]) + objective = '''QA test run comparision between database: {db_1} index: {index_1} and database: {db_2} index: {index_2} with element attribute: {element} + '''.format(db_1=__database_list[0], index_1=__db_index_list[0], db_2=__database_list[1], index_2=__db_index_list[1], element=element_tmp[0]) report.set_obj_html("Objective", objective) report.build_objective() - report.set_text("Column headings with #1 db {db_1} index {index_1}: {attrib_1}".format(db_1=__database_list[0],index_1=__db_index_list[0],attrib_1=sub_attrib_list[0])) + report.set_text("Column headings with #1 db {db_1} index {index_1}: {attrib_1}".format(db_1=__database_list[0], index_1=__db_index_list[0], attrib_1=sub_attrib_list[0])) report.build_text_simple() - report.set_text("Column headings with #2 db {db_2} index {index_2}: {attrib_2}".format(db_2=__database_list[1],index_2=__db_index_list[1],attrib_2=sub_attrib_list[1])) + report.set_text("Column headings with #2 db {db_2} index {index_2}: {attrib_2}".format(db_2=__database_list[1], index_2=__db_index_list[1], attrib_2=sub_attrib_list[1])) report.build_text_simple() else: - objective = '''QA test run comparision between database: {db_1} index: {index_1} and database: {db_2} index: {index_2} - '''.format(db_1=__database_list[0],index_1=__db_index_list[0],db_2=__database_list[1],index_2=__db_index_list[1]) + objective = '''QA test run comparision between database: {db_1} index: {index_1} and database: {db_2} index: {index_2} + '''.format(db_1=__database_list[0], index_1=__db_index_list[0], db_2=__database_list[1], index_2=__db_index_list[1]) report.set_obj_html("Objective", objective) report.build_objective() report.set_text("Column headings with # 1 first database , Column headings with #2 for second database") - report.set_table_title("Key:") report.build_table_title() @@ -1485,12 +1446,11 @@ def main(): report.set_table_title("LF Inspect Suite Summary Total Tests Run: {tests}".format(tests=inspect_db.performance_total)) report.build_table_title() - - # report.set_text("Total Tests: {total} Good: {good} Fair: {fair} Poor: {poor} Critical: {critical}".format(total=inspect_db.performance_total,good=inspect_db.performance_good,fair=inspect_db.performance_fair,poor=inspect_db.performance_poor,critical=inspect_db.performance_critical)) + # report.set_text("Total Tests: {total} Good: {good} Fair: {fair} Poor: {poor} Critical: {critical}".format(total=inspect_db.performance_total,good=inspect_db.performance_good,fair=inspect_db.performance_fair,poor=inspect_db.performance_poor,critical=inspect_db.performance_critical)) # noqa: E501 # report.build_text_simple() percent_good = 0 - percent_fair = 0 + percent_fair = 0 percent_poor = 0 percent_critical = 0 @@ -1500,29 +1460,27 @@ def main(): performance_critical = inspect_db.performance_critical if inspect_db.performance_good != 0: - percent_good = round(((float(inspect_db.performance_good)/float(inspect_db.performance_total)) * 100), 2) + percent_good = round(((float(inspect_db.performance_good) / float(inspect_db.performance_total)) * 100), 2) if inspect_db.performance_fair != 0: - percent_fair = round(((float(inspect_db.performance_fair)/float(inspect_db.performance_total)) * 100), 2) + percent_fair = round(((float(inspect_db.performance_fair) / float(inspect_db.performance_total)) * 100), 2) if inspect_db.performance_poor != 0: - percent_poor = round(((float(inspect_db.performance_poor)/float(inspect_db.performance_total)) * 100), 2) + percent_poor = round(((float(inspect_db.performance_poor) / float(inspect_db.performance_total)) * 100), 2) if inspect_db.performance_critical != 0: - percent_critical = round(((float(inspect_db.performance_critical)/float(inspect_db.performance_total)) * 100), 2) + percent_critical = round(((float(inspect_db.performance_critical) / float(inspect_db.performance_total)) * 100), 2) # report.set_text("Percent: Good: {good} Fair: {fair} Poor: {poor} Critical: {critical}".format(good=percent_good,fair=percent_fair,poor=percent_poor,critical=percent_critical)) # report.build_text_simple() - dict = {'Heading':['Tests','Percent'], - 'Good':[performance_good,percent_good], - 'Fair':[performance_fair,percent_fair], - 'Poor':[performance_poor,percent_poor], - 'Critical':[performance_critical,percent_critical]} + dict = {'Heading': ['Tests', 'Percent'], + 'Good': [performance_good, percent_good], + 'Fair': [performance_fair, percent_fair], + 'Poor': [performance_poor, percent_poor], + 'Critical': [performance_critical, percent_critical]} lf_inspect_summary_df = pd.DataFrame(dict) report.set_table_dataframe(lf_inspect_summary_df) report.build_table() - - report.set_table_title("Test Compare") report.build_table_title() html_results = inspect_db.get_html_results() @@ -1537,24 +1495,23 @@ def main(): report_parent_path = report.get_parent_path() report_parent_basename = os.path.basename(report_parent_path) report_parent_url = './../../../' + report_parent_basename - report.build_link("All Test-Rig Test Suites Results Directory", report_parent_url) + report.build_link("All Test-Rig Test Suites Results Directory", report_parent_url) # save the juni.xml file - junit_name = args.outfile + # junit_name = args.outfile junit_results = inspect_db.get_junit_results() report.set_junit_results(junit_results) - test_suite = str(__test_suite) + # test_suite = str(__test_suite) # junit_xml, junit_path_only = report.write_junit_results(test_suite=test_suite) # os.path.splitext(str(os.path.basename(self.database_list[0])))[0] - if(len(__database_list)) == 1: + if (len(__database_list)) == 1: lf_inspect_database_name = os.path.splitext(str(os.path.basename(__database_list[0])))[0] # for now assume 2, TODO loop though list else: - lf_inspect_database_name = os.path.splitext(str(os.path.basename(__database_list[0])))[0]+"_"+os.path.splitext(str(os.path.basename(__database_list[1])))[0] + lf_inspect_database_name = os.path.splitext(str(os.path.basename(__database_list[0])))[0] + "_" + os.path.splitext(str(os.path.basename(__database_list[1])))[0] junit_xml, junit_path_only = report.write_junit_results(test_suite=lf_inspect_database_name) - # TODO path in the allure results path # Need to go up one directory allure_results_path = str(os.path.dirname(report.get_path())) + "/allure-results" @@ -1562,15 +1519,14 @@ def main(): if not os.path.isdir(allure_results_path): os.mkdir(allure_results_path) - logger.info("copy junit from {junit} to {allure_junit}".format(junit=junit_xml,allure_junit=allure_results_path)) - - shutil.copy2(junit_xml,allure_results_path) + logger.info("copy junit from {junit} to {allure_junit}".format(junit=junit_xml, allure_junit=allure_results_path)) + shutil.copy2(junit_xml, allure_results_path) inspect_db.set_junit_results(junit_xml) inspect_db.set_junit_path_only(junit_path_only) - junit_info = "junit.xml: allure serve {}".format(junit_xml) + # junit_info = "junit.xml: allure serve {}".format(junit_xml) allure_info = "junit.xml path: allure serve {}".format(junit_path_only) # report.set_text(junit_info) @@ -1578,8 +1534,6 @@ def main(): report.set_text(allure_info) report.build_text_simple() - - report.build_footer() html_report = report.write_html_with_timestamp() @@ -1587,14 +1541,13 @@ def main(): # DO NOT remove the print statement print("html report: {}".format(html_report)) try: - report.write_pdf_with_timestamp(_page_size='A4',_orientation='Landscape') + report.write_pdf_with_timestamp(_page_size='A4', _orientation='Landscape') except Exception as x: traceback.print_exception(Exception, x, x.__traceback__, chain=True) logger.info("exception write_pdf_with_timestamp()") logger.info("lf_inspect_html_report: " + html_report) - # print later so shows up last logger.info("junit.xml: allure serve {}".format(junit_xml)) logger.info("junit.xml path: allure serve {}".format(junit_path_only)) diff --git a/py-scripts/tools/lf_json_convert.py b/py-scripts/tools/lf_json_convert.py index 38e984379..9091f7cd4 100755 --- a/py-scripts/tools/lf_json_convert.py +++ b/py-scripts/tools/lf_json_convert.py @@ -1,19 +1,19 @@ #!/usr/bin/env python3 -# flake8: noqa ''' File: read in .json and convert for cookbook Usage: lf_json_convert.py --file Example: lf_json_convert.py --file ''' # visit http://127.0.0.1:8050/ in your web browser. -import sys -import os -import importlib +# import sys +# import os +# import importlib import argparse + class file_convert(): def __init__(self, - _file = ''): + _file=''): self.file = _file self.file2 = "cookbook_{}".format(_file) @@ -24,9 +24,10 @@ def json_file(self): file2_fd.write('{\n') file2_fd.write('"text": [ "
**{}**\\n",'.format(self.file))
         for line in file_fd:
-            line = line.replace('"','"').replace('\n','')
+            line = line.replace('"', '"').replace('\n', '')
             # to avoid --raw_line \"  issues the \" it creates a \& which the reader does not like
-            line = line.replace('\&','\\\&')
+            # original line:  line = line.replace('\&', '\\\&')  # noqa: W605 W605
+            line = line.replace(r'&', r'\&')
             line = '"' + line + '\\n",'
 
             file2_fd.write('{}\n'.format(line))
@@ -35,6 +36,7 @@ def json_file(self):
         file_fd.close()
         file2_fd.close()
 
+
 # Feature, Sum up the subtests passed/failed from the kpi files for each run, poke those into the database, and generate a kpi graph for them.
 def main():
 
@@ -52,15 +54,15 @@ def main():
 Example: lf_json_convert.py --file 
 
         ''')
-    parser.add_argument('--file', help='--file file.json', required=True) #TODO is this needed
+    parser.add_argument('--file', help='--file file.json', required=True)  # TODO is this needed
 
     args = parser.parse_args()
 
     __file = args.file
 
-    convert = file_convert(_file = __file)
+    convert = file_convert(_file=__file)
     convert.json_file()
 
+
 if __name__ == '__main__':
     main()
-    
diff --git a/py-scripts/tools/lf_qa.py b/py-scripts/tools/lf_qa.py
index bc7b2c3ff..7c940589d 100755
--- a/py-scripts/tools/lf_qa.py
+++ b/py-scripts/tools/lf_qa.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# flake8: noqa
 '''
 File: read kpi.csv place in sql database, create png of historical kpi and present graph on dashboard
 Usage: lf_qa.py --store --png --show --path  --database 
@@ -23,7 +22,6 @@
 import traceback
 
 
-
 sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../../")))
 
 lf_report = importlib.import_module("py-scripts.lf_report")
@@ -51,7 +49,7 @@ def __init__(self,
         logger.debug("lf_qa path: {path}".format(path=self.path))
         logger.debug("lf_qa path_comp: {path}".format(path=self.path_comp))
         logger.debug("lf_qa lf_qa_report_path: {path}".format(path=self.lf_qa_report_path))
-        self.test_window_days=_test_window_days
+        self.test_window_days = _test_window_days
         self.file = _file
         self.database = _database
         self.table = _table
@@ -119,7 +117,7 @@ def get_kernel_version_from_meta(sefl, _kpi_path):
             for line in meta_data_fd:
                 if "lanforge_kernel_version:" in line:
                     kernel_version = line.replace("$ lanforge_kernel_version:", "")
-                    kernel_version = test_run.strip()
+                    kernel_version = kernel_version.strip()
                     logger.info("meta_data_path: {meta_data_path} Kernel Version: {kernel}".format(
                         meta_data_path=meta_data_path, kernel=kernel_version))
                     break
@@ -140,9 +138,9 @@ def get_radio_firmware_from_meta(sefl, _kpi_path):
             for line in meta_data_fd:
                 if "radio_firmware" in line:
                     radio_firmware = line.replace("$ radio_firmware:", "")
-                    radio_firmware = test_run.strip()
+                    radio_firmware = radio_firmware.strip()
                     logger.info("meta_data_path: {meta_data_path} Radio Firmware : {radio_fw}".format(
-                        meta_data_path=meta_data_path, kernel=kernel_version))
+                        meta_data_path=meta_data_path, radio_fw=radio_firmware))
                     break
             meta_data_fd.close()
         except Exception as x:
@@ -152,7 +150,6 @@ def get_radio_firmware_from_meta(sefl, _kpi_path):
                 _kpi_path=_kpi_path))
         return radio_firmware
 
-
     def get_gui_info_from_meta(sefl, _kpi_path):
         gui_version = "NA"
         gui_build_date = "NA"
@@ -176,9 +173,8 @@ def get_gui_info_from_meta(sefl, _kpi_path):
                     if (match is not None):
                         gui_build_date = match.group(1)
 
-
                     logger.info("meta_data_path: {meta_data_path} GUI Version: {gui_version} GUI Build Date {gui_build_date}".format(
-                        meta_data_path=meta_data_path, gui_version=gui_version,gui_build_date=gui_build_date))
+                        meta_data_path=meta_data_path, gui_version=gui_version, gui_build_date=gui_build_date))
 
                     break
             meta_data_fd.close()
@@ -208,10 +204,9 @@ def get_server_info_from_meta(sefl, _kpi_path):
                     pattern = "Compiled on:  (\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+)"
 
                     match = re.search(pattern, line)
-                    if (match  is not None):
+                    if (match is not None):
                         server_build_date = match.group(1)
 
-
                     logger.info("meta_data_path: {meta_data_path} server Version: {server_version}".format(
                         meta_data_path=meta_data_path, server_version=server_version))
                     logger.info("meta_data_path: {meta_data_path} server_build_date: {server_build}".format(
@@ -249,10 +244,8 @@ def get_test_dir_info_from_meta(sefl, _kpi_path):
                 _kpi_path=_kpi_path))
         return test_dir
 
-
-    #def get_server_from_meta(sefl, _kpi_path):
-    #def get_gui_from_meta(sefl, _kpi_path):
-
+    # def get_server_from_meta(sefl, _kpi_path):
+    # def get_gui_from_meta(sefl, _kpi_path):
 
     def get_test_id_test_tag(self, _kpi_path):
         test_id = "NA"
@@ -404,10 +397,10 @@ def get_suite_html(self):
                     index_html_file = parent_path + "/index.html"
                     if os.path.exists(index_html_file):
                         readme_html_file = parent_path + "/readme.html"
-                        os.rename(index_html_file,readme_html_file)
+                        os.rename(index_html_file, readme_html_file)
 
                     dir_path = '../' + parent_name
-                    pdf_path = '../' + parent_name + "/" +  pdf_base_name
+                    pdf_path = '../' + parent_name + "/" + pdf_base_name
                     html_path = "../" + parent_name + "/readme.html"
 
                     kpi_path = os.path.join(parent_path, "kpi.csv")
@@ -487,8 +480,8 @@ def get_kpi_chart_html_relative_compare(self):
                     if test_tag == test_tag_comp and test_id == test_id_comp:
                         kpi_chart_comp_found = True
                         logger.debug("test_tag : {tag} test_tag_comp : {ctag} test_id : {test_id} test_id_comp : {test_id_comp}".format(
-                            tag=test_tag,ctag=test_tag_comp,test_id=test_id,test_id_comp=test_id_comp
-                        ) )
+                            tag=test_tag, ctag=test_tag_comp, test_id=test_id, test_id_comp=test_id_comp
+                        ))
                         # get relative path
                         kpi_chart_comp_relative = os.path.relpath(kpi_chart_comp, self.lf_qa_report_path)
                         logger.debug("kpi_chart_comp_relative: {r_chart}".format(r_chart=kpi_chart_comp_relative))
@@ -506,7 +499,7 @@ def get_kpi_chart_html_relative_compare(self):
                                     
                                 
                             
-                        """.format(test_tag=test_tag_comp, test_id=test_id_comp, dir_path=compare_results_dir,kpi_chart_ref=kpi_chart_comp_relative, kpi_chart_src=kpi_chart_comp_relative, kpi_chart_title=kpi_chart_comp_relative)
+                        """.format(test_tag=test_tag_comp, test_id=test_id_comp, dir_path=compare_results_dir, kpi_chart_ref=kpi_chart_comp_relative, kpi_chart_src=kpi_chart_comp_relative, kpi_chart_title=kpi_chart_comp_relative)  # noqa: E501
                         break
                     if kpi_chart_comp_found:
                         # even if comparison not found increase the index
@@ -525,7 +518,6 @@ def get_kpi_chart_html_relative_compare(self):
         kpi_chart_html += """"""
         return kpi_chart_html
 
-
     def get_kpi_chart_html_relative(self):
         kpi_chart_html = """
             
@@ -572,13 +564,13 @@ def get_kpi_chart_html_relative(self):
         kpi_chart_html += """
""" return kpi_chart_html - # information on sqlite database # https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_sql.html # sqlite browser: # Fedora sudo dnf install sqlitebrowser # Ubuntu sudo apt-get install sqlite3 # + def store(self): logger.info("reading kpi and storing in db {}".format(self.database)) path = Path(self.path) @@ -589,7 +581,6 @@ def store(self): if not self.kpi_list: logger.info("WARNING: used --store , no new kpi.csv found, check input path or remove --store from command line") - rows = [] for kpi in self.kpi_list: # TODO note empty kpi.csv failed test df_kpi_tmp = pd.read_csv(kpi, sep='\t') # only store the path to the kpi.csv file @@ -614,8 +605,7 @@ def store(self): df_kpi_tmp['server_ver'], df_kpi_tmp['server_build_date'] = self.get_server_info_from_meta(_kpi_path) # this next line creats duplicate entries - self.df = pd.concat([self.df,df_kpi_tmp], ignore_index=True) - + self.df = pd.concat([self.df, df_kpi_tmp], ignore_index=True) self.conn = sqlite3.connect(self.database) try: @@ -690,17 +680,14 @@ def store_comp(self): exit(1) self.conn.close() - - def generate_png(self, group, test_id_list, test_tag, test_rig, kpi_path_list, kpi_fig, df_tmp): # save the figure - figures will be over written png # for testing - png_server_img = '' # generate the png files logger.info("generate png and kpi images from kpi kpi_path:{}".format( df_tmp['kpi_path'])) - # LAN-1535 scripting: test_l3.py output masks other output when browsing (index.html) create relative paths in reports + # LAN-1535 scripting: test_l3.py output masks other output when browsing (index.html) create relative paths in reports # generate png img path png_path = os.path.join( kpi_path_list[-1], "{}_{}_{}_kpi.png".format(group, test_tag, test_rig)) @@ -719,9 +706,7 @@ def generate_png(self, group, test_id_list, test_tag, png_present = False # exit(1) except Exception as x: - traceback.print_exception( - Exception, x, x.__traceback__, chain=True) - logger.info("BaseException kpi_fig.write_image{msg}".format(msg=err)) + traceback.print_exception(Exception, x, x.__traceback__, chain=True) png_present = False # exit(1) # generate html image (interactive) @@ -751,12 +736,12 @@ def generate_png(self, group, test_id_list, test_tag, self.html_results += """
""" self.html_results += """
""" - # TODO determin the subtest pass and fail graph # df is sorted by date oldest to newest # get the test_run for last run # query the db for all pass and fail or last run # put in table + def sub_test_information(self): logger.info("generate table and graph from subtest data per run: {}".format( time.time())) @@ -772,8 +757,8 @@ def sub_test_information(self): traceback.print_exception( Exception, x, x.__traceback__, chain=True) logger.info(("Database empty reading subtest: " - "KeyError(key) when sorting by Date for db: {db}," - " check Database name, path to kpi, typo in path, exiting".format(db=self.database))) + "KeyError(key) when sorting by Date for db: {db}," + " check Database name, path to kpi, typo in path, exiting".format(db=self.database))) exit(1) self.conn.close() @@ -912,10 +897,10 @@ def generate_graph_png(self): # if the recent test is over a week old do not include in run # 1 day = 86400000 milli seconds # 1 week = 604800000 milli seconds - time_difference = int(time_now) -int(recent_test_run) - logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( - time_now=time_now,recent_test_run=recent_test_run,test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) - ##if (time_difference) < 604800000: # TODO have window be configurable + time_difference = int(time_now) - int(recent_test_run) + logger.info("time_now: {time_now} recent_test_run: {recent_test_run} difference: {time_difference} test_window_epoch: {test_window_epoch} oldest_test_run: {oldest_test_run}".format( # noqa: E501 + time_now=time_now, recent_test_run=recent_test_run, test_window_epoch=test_window_epoch, time_difference=time_difference, oldest_test_run=oldest_test_run)) + # if (time_difference) < 604800000: # TODO have window be configurable if (time_difference) < test_window_epoch: # TODO have window be configurable units_list = list(df_tmp['Units']) logger.info( @@ -929,11 +914,20 @@ def generate_graph_png(self): x="Date", y="numeric-score", custom_data=[ + 'Date', + 'test_dir', 'numeric-score', - 'Subtest-Pass', - 'Subtest-Fail', - 'kernel' - ], + 'kernel', + 'radio_fw', + 'gui_ver', + 'gui_build_date', + 'server_ver', + 'server_build_date', + 'dut-hw-version', + 'dut-sw-version', + 'dut-model-num', + 'dut-serial-num' + ], color="short-description", hover_name="short-description", size_max=60)).update_traces( @@ -941,10 +935,19 @@ def generate_graph_png(self): kpi_fig.update_traces( hovertemplate="
".join([ - "kernel-version: %{customdata[4]}", - "numeric-score: %{customdata[0]}", - "Subtest-Pass: %{customdata[1]}", - "Subtest-Fail: %{customdata[2]}" + "Date: %{customdata[0]}", + "test_dir: %{customdata[1]}", + "numeric-score: %{customdata[2]}", + "kernel-version: %{customdata[3]}", + "radio-fw: %{customdata[4]}", + "gui-version: %{customdata[5]}", + "gui-build-date: %{customdata[6]}", + "server-version: %{customdata[7]}", + "server-build-date: %{customdata[8]}", + "dut-hw-version: %{customdata[9]}", + "dut-sw-version: %{customdata[10]}", + "dut-model-num: %{customdata[11]}", + "dut-serial-num: %{customdata[12]}", ]) ) @@ -958,12 +961,12 @@ def generate_graph_png(self): kpi_fig.update_layout(autotypenumbers='convert types') self.generate_png(df_tmp=df_tmp, - group=group, - test_id_list=test_id_list, - test_tag=test_tag, - test_rig=test_rig, - kpi_path_list=kpi_path_list, - kpi_fig=kpi_fig) + group=group, + test_id_list=test_id_list, + test_tag=test_tag, + test_rig=test_rig, + kpi_path_list=kpi_path_list, + kpi_fig=kpi_fig) else: kpi_fig = ( @@ -985,7 +988,7 @@ def generate_graph_png(self): 'dut-sw-version', 'dut-model-num', 'dut-serial-num' - ], + ], color="short-description", hover_name="short-description", size_max=60)).update_traces( @@ -1020,12 +1023,12 @@ def generate_graph_png(self): kpi_fig.update_layout(autotypenumbers='convert types') self.generate_png(df_tmp=df_tmp, - group=group, - test_id_list=test_id_list, - test_tag=test_tag, - test_rig=test_rig, - kpi_path_list=kpi_path_list, - kpi_fig=kpi_fig) + group=group, + test_id_list=test_id_list, + test_tag=test_tag, + test_rig=test_rig, + kpi_path_list=kpi_path_list, + kpi_fig=kpi_fig) # Feature, Sum up the subtests passed/failed from the kpi files for each @@ -1096,7 +1099,6 @@ def main(): parser.add_argument('--server', help="--server , server switch is deprecated ", default="") - # logging configuration: parser.add_argument('--log_level', default=None, @@ -1135,7 +1137,6 @@ def main(): __dir = args.dir __test_window_days = args.test_window_days - logger.info("config:\ path:{path} file:{file}\ database:{database} table:{table} \ @@ -1165,8 +1166,8 @@ def main(): csv_dash = csv_sql( _path=__path, - _path_comp = __path_comp, - _lf_qa_report_path = __lf_qa_report_path, + _path_comp=__path_comp, + _lf_qa_report_path=__lf_qa_report_path, _file=__file, _database=__database, _table=__table, @@ -1220,7 +1221,6 @@ def main(): # pdf_parent_path = os.path.dirname(pdf_link_path) # pdf_parent_name = os.path.basename(pdf_parent_path) - pdf_url = './' + pdf_file report.build_pdf_link("PDF_Report", pdf_url) @@ -1234,7 +1234,6 @@ def main(): report_parent_url = './../../../' + report_parent_basename report.build_link("All Test-Rig Test Suites Results Directory", report_parent_url) - # links table for tests report.set_table_title("Test Suite") report.build_table_title() diff --git a/py-scripts/tools/lf_test_gen/lf_create_ap_auto_json.py b/py-scripts/tools/lf_test_gen/lf_create_ap_auto_json.py index 4758f3413..a608a02fd 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_ap_auto_json.py +++ b/py-scripts/tools/lf_test_gen/lf_create_ap_auto_json.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa + ''' NAME: lf_create_ap_auto_json.py @@ -77,15 +77,15 @@ def __init__(self, _lf_radio_5g, _lf_radio_6g, _lf_ap_auto_number_dut_indexes_combobox, - _lf_ap_auto_basic_client_connectivity, # basic_cx - _lf_ap_auto_band_steering, # band_steering - _lf_ap_auto_capacity, # capacity - _lf_ap_auto_channel_switching_test, # channel_switch - _lf_ap_auto_long_term, # long_term - _lf_ap_auto_stability, # mix_stability - _lf_ap_auto_throughput_vs_pkt_size, # tput_single_sta - _lf_ap_auto_multi_station_throughput_vs_pkt_size, # tput_multi_sta - #_lf_ap_auto_band_steering, + _lf_ap_auto_basic_client_connectivity, # basic_cx + _lf_ap_auto_band_steering, # band_steering + _lf_ap_auto_capacity, # capacity + _lf_ap_auto_channel_switching_test, # channel_switch + _lf_ap_auto_long_term, # long_term + _lf_ap_auto_stability, # mix_stability + _lf_ap_auto_throughput_vs_pkt_size, # tput_single_sta + _lf_ap_auto_multi_station_throughput_vs_pkt_size, # tput_multi_sta + # _lf_ap_auto_band_steering, ): self.test_suite_band = "" self.use_radio_dict = _use_radio_dict @@ -104,7 +104,7 @@ def __init__(self, self.lf_ap_auto_channel_switching_test = _lf_ap_auto_channel_switching_test self.lf_ap_auto_throughput_vs_pkt_size = _lf_ap_auto_throughput_vs_pkt_size self.lf_ap_auto_capacity = _lf_ap_auto_capacity - #self.lf_ap_auto_band_steering = _lf_ap_auto_band_steering + # self.lf_ap_auto_band_steering = _lf_ap_auto_band_steering self.lf_ap_auto_long_term = _lf_ap_auto_long_term self.lf_ap_auto_use_qa_var = _lf_ap_auto_use_qa_var @@ -169,7 +169,6 @@ def __init__(self, self.last_2g_radio = 0 - def get_file_2g(self): return self.file_2g @@ -236,8 +235,6 @@ def create_suite(self): """.format(test_suite=self.suite_radios_band) # find the tests to enable - - # find the last radio to include in test count_band_radios = 0 for radio in range(0, self.radio_dict_size): diff --git a/py-scripts/tools/lf_test_gen/lf_create_ap_auto_tab.py b/py-scripts/tools/lf_test_gen/lf_create_ap_auto_tab.py index 6bb019f44..84a51cffb 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_ap_auto_tab.py +++ b/py-scripts/tools/lf_test_gen/lf_create_ap_auto_tab.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 -# flake8: noqa + import tkinter -from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar import importlib import logging @@ -89,14 +87,14 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo self.lf_ap_auto_duration = tkinter.Label(self.lf_ap_auto_frame, text='test duration (ms)') self.lf_ap_auto_duration.grid(row=4, column=0) - self.lf_ap_auto_duration_combobox = ttk.Combobox(self.lf_ap_auto_frame, values=["", "5000 (5 sec)", "10000 (10 sec)", "15000 (15 sec)", "20000 (20 sec)", "30000 (30 sec)", "60000 (1 min)", "300000 (5min)"]) + self.lf_ap_auto_duration_combobox = ttk.Combobox(self.lf_ap_auto_frame, values=["", "5000 (5 sec)", "10000 (10 sec)", "15000 (15 sec)", "20000 (20 sec)", "30000 (30 sec)", "60000 (1 min)", "300000 (5min)"]) # noqa: E501 self.lf_ap_auto_duration_combobox.current(3) self.lf_ap_auto_duration_combobox.grid(row=4, column=1) self.window_tooltip.bind(self.lf_ap_auto_duration_combobox, '''Select the duration of each iteration ''') # Column 0 self.lf_ap_auto_basic_client_connectivity_var = tkinter.StringVar(value="Use") - self.lf_ap_auto_basic_client_connectivity_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Basic Client Connectivity (basic_cx)", variable=self.lf_ap_auto_basic_client_connectivity_var, + self.lf_ap_auto_basic_client_connectivity_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Basic Client Connectivity (basic_cx)", variable=self.lf_ap_auto_basic_client_connectivity_var, # noqa: E501 onvalue="Use", offvalue="Do Not Use") self.lf_ap_auto_basic_client_connectivity_check.grid(row=5, column=0, sticky="news") self.window_tooltip.bind(self.lf_ap_auto_basic_client_connectivity_check, '''Basic Client Connectivity (basic_cx) @@ -107,7 +105,7 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo self.lf_ap_auto_band_steering_var = tkinter.StringVar(value="Do Not Use") self.lf_ap_auto_band_steering_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Band Steering (band_steering)", variable=self.lf_ap_auto_band_steering_var, - onvalue="Use", offvalue="Do Not Use") + onvalue="Use", offvalue="Do Not Use") self.lf_ap_auto_band_steering_check.grid(row=6, column=0, sticky="news") self.window_tooltip.bind(self.lf_ap_auto_band_steering_check, '''Band Steering Test weather AP will direct stations to lesser utilized channel. @@ -127,9 +125,6 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo Estimated duration: 27 minutes. Configuration key: capacity''') - - - self.lf_ap_auto_channel_switching_test_var = tkinter.StringVar(value="Do Not Use") self.lf_ap_auto_channel_switching_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Channel Switching (channel_switch)", variable=self.lf_ap_auto_channel_switching_test_var, onvalue="Use", offvalue="Do Not Use") @@ -137,8 +132,6 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo self.window_tooltip.bind(self.lf_ap_auto_channel_switching_check, '''Channel Switching Configuration key: channel_switch''') - - self.lf_ap_auto_long_term_var = tkinter.StringVar(value="Do Not Use") self.lf_ap_auto_long_term_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Long Term (long_term)", variable=self.lf_ap_auto_long_term_var, onvalue="Use", offvalue="Do Not Use") @@ -160,7 +153,7 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo ''') self.lf_ap_auto_throughput_vs_pkt_size_var = tkinter.StringVar(value="Do Not Use") - self.lf_ap_auto_throughput_vs_pkt_size_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Single STA Throughtput vs Pkt Size (tput_single_sta)", variable=self.lf_ap_auto_throughput_vs_pkt_size_var, + self.lf_ap_auto_throughput_vs_pkt_size_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Single STA Throughtput vs Pkt Size (tput_single_sta)", variable=self.lf_ap_auto_throughput_vs_pkt_size_var, # noqa: E501 onvalue="Use", offvalue="Do Not Use") self.lf_ap_auto_throughput_vs_pkt_size_check.grid(row=6, column=1, sticky="news") self.window_tooltip.bind(self.lf_ap_auto_throughput_vs_pkt_size_check, '''Single STA Throughput vs Pkt Size @@ -170,7 +163,7 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo Configuration key: tput_single_sta''') self.lf_ap_auto_multi_station_throughput_vs_pkt_size_var = tkinter.StringVar(value="Do Not Use") - self.lf_ap_auto_multi_station_throughput_vs_pkt_size_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Multi STA Throughput vs Pkt Size (tput_multi_sta)", variable=self.lf_ap_auto_multi_station_throughput_vs_pkt_size_var, + self.lf_ap_auto_multi_station_throughput_vs_pkt_size_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Multi STA Throughput vs Pkt Size (tput_multi_sta)", variable=self.lf_ap_auto_multi_station_throughput_vs_pkt_size_var, # noqa: E501 onvalue="Use", offvalue="Do Not Use") self.lf_ap_auto_multi_station_throughput_vs_pkt_size_check.grid(row=7, column=1, sticky="news") self.window_tooltip.bind(self.lf_ap_auto_multi_station_throughput_vs_pkt_size_check, '''Multi STA Throughput vs Pkt Size @@ -178,16 +171,14 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo Hunt to find best throughput at different frame sizes and different numbers of stations. Supports multiple loops''') - - # self.lf_ap_auto_band_steering_var = tkinter.StringVar(value="Do Not Use") # self.lf_ap_auto_band_steering_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="Band-Steering", variable=self.lf_ap_auto_band_steering_var, # onvalue="Use", offvalue="Do Not Use") # self.lf_ap_auto_band_steering_check.grid(row=8, column=1) # self.window_tooltip.bind(self.lf_ap_auto_band_steering_check, '''Band-Steering Estimated duration: 10 minutes. -#Test weather AP will direct stations to lesser utilized channel. -#Requires that SSID are same for all DUT radios -#and that BSSIDs are configured properly in the DUT''') +# Test weather AP will direct stations to lesser utilized channel. +# Requires that SSID are same for all DUT radios +# and that BSSIDs are configured properly in the DUT''') # row 11 self.lf_ap_auto_use_qa_var = tkinter.StringVar(value="Use") @@ -206,11 +197,10 @@ def __init__(self, ap_auto_tab, dut_tab, radio_frame, window_tooltip, current_wo self.lf_ap_auto_use_combined_var = tkinter.StringVar(value="Use") self.lf_ap_auto_use_combined_check = tkinter.Checkbutton(self.lf_ap_auto_frame, text="across multiple radios", variable=self.lf_ap_auto_use_inspect_var, - onvalue="Use", offvalue="Do Not Use") + onvalue="Use", offvalue="Do Not Use") self.lf_ap_auto_use_combined_check.grid(row=11, column=2) self.window_tooltip.bind(self.lf_ap_auto_use_combined_check, '''This will create a test cast that uses all the radios selected for AP Auto''') - # row 12 self.lf_ap_auto_save = ttk.Button(self.lf_ap_auto_frame, text='Create AP Auto Test Suite Json', command=self.create_ap_auto_json) self.lf_ap_auto_save.grid(row=12, column=0, sticky="news", padx=20, pady=10) @@ -302,7 +292,7 @@ def create_ap_auto_json(self): _lf_ap_auto_stability=self.lf_ap_auto_stability_var, _lf_ap_auto_throughput_vs_pkt_size=self.lf_ap_auto_throughput_vs_pkt_size_var, _lf_ap_auto_multi_station_throughput_vs_pkt_size=self.lf_ap_auto_multi_station_throughput_vs_pkt_size_var, - #_lf_ap_auto_band_steering=self.lf_ap_auto_band_steering_var, + # _lf_ap_auto_band_steering=self.lf_ap_auto_band_steering_var, ) if self.radio_frame.suite_radios_2g != "": diff --git a/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_json.py b/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_json.py index ca1973c36..6abada568 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_json.py +++ b/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_json.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa + ''' NAME: lf_create_dp_rvr_json.py diff --git a/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_tab.py b/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_tab.py index d99480ed9..30aacca01 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_tab.py +++ b/py-scripts/tools/lf_test_gen/lf_create_dp_rvr_tab.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 -# flake8: noqa + import tkinter -from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar import importlib import logging @@ -201,7 +199,7 @@ def __init__(self, dp_rvr_tab, dut_tab, radio_frame, window_tooltip, current_wor row += 1 self.lf_dp_rvr_duration = tkinter.Label(self.lf_dp_rvr_frame, text='test duration') self.lf_dp_rvr_duration.grid(row=row, column=0) - self.lf_dp_rvr_duration_combobox = ttk.Combobox(self.lf_dp_rvr_frame, values=["", "5000 (5 sec)", "10000 (10 sec)", "15000 (15 sec)", "20000 (20 sec)", "30000 (30 sec)", "60000 (1 min)", "180000 (3 min)", "300000 (5min)"]) + self.lf_dp_rvr_duration_combobox = ttk.Combobox(self.lf_dp_rvr_frame, values=["", "5000 (5 sec)", "10000 (10 sec)", "15000 (15 sec)", "20000 (20 sec)", "30000 (30 sec)", "60000 (1 min)", "180000 (3 min)", "300000 (5min)"]) # noqa: E501 self.lf_dp_rvr_duration_combobox.current(3) self.lf_dp_rvr_duration_combobox.grid(row=row, column=1) self.window_tooltip.bind(self.lf_dp_rvr_duration_combobox, '''Enter the test duration , for custom it is in ms diff --git a/py-scripts/tools/lf_test_gen/lf_create_dut_json.py b/py-scripts/tools/lf_test_gen/lf_create_dut_json.py index 801de0261..c643da41b 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_dut_json.py +++ b/py-scripts/tools/lf_test_gen/lf_create_dut_json.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa + """ NAME: lf_create_dut_json.py @@ -41,7 +41,6 @@ import importlib import os import sys -import traceback if sys.version_info[0] != 3: print("This script requires Python 3") diff --git a/py-scripts/tools/lf_test_gen/lf_create_dut_tab.py b/py-scripts/tools/lf_test_gen/lf_create_dut_tab.py index af9c3ad96..d79fb08f8 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_dut_tab.py +++ b/py-scripts/tools/lf_test_gen/lf_create_dut_tab.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 -# flake8: noqa + import tkinter -from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar import importlib lf_dut_json = importlib.import_module("lf_create_dut_json") diff --git a/py-scripts/tools/lf_test_gen/lf_create_radio_frame.py b/py-scripts/tools/lf_test_gen/lf_create_radio_frame.py index f4ca3f322..d07a6ba27 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_radio_frame.py +++ b/py-scripts/tools/lf_test_gen/lf_create_radio_frame.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 -# flake8: noqa + import tkinter -from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar import importlib import requests import logging @@ -48,7 +46,7 @@ def __init__(self, rig_tab, rig_frame, max_radios, window_tooltip, current_worki # 6. Configure the Canvas and Scrollable Content Frame self.radio_content_frame.bind("", lambda e: - self.radio_canvas.configure(scrollregion=self.radio_canvas.bbox("all"))) + self.radio_canvas.configure(scrollregion=self.radio_canvas.bbox("all"))) # 7. Add Widgets to the Content Frame self.radio_label = tkinter.Label(self.radio_content_frame, text="Use Radio") @@ -61,7 +59,7 @@ def __init__(self, rig_tab, rig_frame, max_radios, window_tooltip, current_worki self.lf_radio_frame.rowconfigure(0, weight=1) # 9: Pack Widgets onto the Winddow - self.radio_canvas.create_window((0,0), window=self.radio_content_frame, anchor="nw") + self.radio_canvas.create_window((0, 0), window=self.radio_content_frame, anchor="nw") self.radio_canvas.grid(row=0, column=0, sticky="nsew") self.radio_scrollbar.grid(row=0, column=1, sticky="ns") @@ -96,7 +94,6 @@ def _on_mousewheel(event): self.radio_6g_label = tkinter.Label(self.radio_content_frame, text="6g") self.radio_6g_label.grid(row=1, column=3) - self.radio_label = tkinter.Label(self.radio_content_frame, text="Radio") self.radio_label.grid(row=1, column=4) @@ -141,8 +138,6 @@ def _on_mousewheel(event): self.suite_test_name_5g_dict = {} self.suite_test_name_6g_dict = {} - - for radio in range(0, self.max_radios): use_radio_var = tkinter.StringVar(value="Do Not Use") @@ -177,7 +172,6 @@ def _on_mousewheel(event): The check box may be selected to allow the band to be included in the test json or deselect to remove from the test json''') - radio_entry_var = tkinter.StringVar() self.radio_dict[radio] = radio_entry_var radio_entry_var.set("") @@ -258,6 +252,11 @@ def get_lanforge_radio_information(self): self.lanforge_radio_json.pop("uri") self.lanforge_radio_json.pop("warnings") self.sorted_lanforge_radio_json = {} + # remove wiphy radios that contain 'c' + letter_to_remove = 'c' + for key in list(self.lanforge_radio_json.keys()): + if letter_to_remove in key: + del self.lanforge_radio_json[key] for key in sorted(self.lanforge_radio_json, key=lambda key: (key.split('y')[0], int(key.split('y')[1]))): self.sorted_lanforge_radio_json[key] = self.lanforge_radio_json[key] self.lanforge_radio_json = self.sorted_lanforge_radio_json @@ -275,7 +274,7 @@ def get_lanforge_radio_information(self): radio_name_tmp = radio_name_tmp.strip() if "mt" in radio_name_tmp: if "7921k" in radio_name_tmp: - radio_name_tmp = radio_name_tmp.replace('mt7921e (','mt').replace(')','') + radio_name_tmp = radio_name_tmp.replace('mt7921e (', 'mt').replace(')', '') else: radio_name_tmp = radio_name_tmp.split(' ', maxsplit=1)[0] elif "ath10" in radio_name_tmp: @@ -310,6 +309,12 @@ def get_lanforge_radio_information(self): self.use_radio_6g_var_dict[radio].set("Do Not Use") elif '7921e' in radio_name_tmp: self.use_radio_6g_var_dict[radio].set("Do Not Use") + elif 'mt7996' in radio_name_tmp: + if '802.11bgn' in radio_type or '802.11an' in radio_type: + self.use_radio_6g_var_dict[radio].set("Do Not Use") + else: + self.use_radio_6g_var_dict[radio].set("Use") + self.suite_test_name_6g_dict[radio] = self.radio_model_dict[radio] else: self.use_radio_6g_var_dict[radio].set("Use") self.suite_test_name_6g_dict[radio] = self.radio_model_dict[radio] diff --git a/py-scripts/tools/lf_test_gen/lf_create_rig_json.py b/py-scripts/tools/lf_test_gen/lf_create_rig_json.py index 1f9ce9b2d..e238ad330 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_rig_json.py +++ b/py-scripts/tools/lf_test_gen/lf_create_rig_json.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa + ''' NAME: lf_create_rig_json.py diff --git a/py-scripts/tools/lf_test_gen/lf_create_rig_tab.py b/py-scripts/tools/lf_test_gen/lf_create_rig_tab.py index 5acaeb1dd..18ae4dd10 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_rig_tab.py +++ b/py-scripts/tools/lf_test_gen/lf_create_rig_tab.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 -# flake8: noqa + import tkinter -from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar import importlib lf_rig_json = importlib.import_module("lf_create_rig_json") diff --git a/py-scripts/tools/lf_test_gen/lf_create_wc_json.py b/py-scripts/tools/lf_test_gen/lf_create_wc_json.py index 56dc6e02c..8caabbb2b 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_wc_json.py +++ b/py-scripts/tools/lf_test_gen/lf_create_wc_json.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa + ''' NAME: lf_create_wc_json.py diff --git a/py-scripts/tools/lf_test_gen/lf_create_wc_tab.py b/py-scripts/tools/lf_test_gen/lf_create_wc_tab.py index 9d7a5bf21..e4763cc9e 100755 --- a/py-scripts/tools/lf_test_gen/lf_create_wc_tab.py +++ b/py-scripts/tools/lf_test_gen/lf_create_wc_tab.py @@ -1,9 +1,7 @@ #!/usr/bin/env python3 -# flake8: noqa + import tkinter -from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar import importlib import logging @@ -84,7 +82,7 @@ def __init__(self, wc_tab, dut_tab, radio_frame, window_tooltip, current_working self.lf_wc_duration = tkinter.Label(self.lf_wc_frame, text='test duration (ms)') self.lf_wc_duration.grid(row=4, column=0) - self.lf_wc_duration_combobox = ttk.Combobox(self.lf_wc_frame, values=["", "5000 (5 sec)", "10000 (10 sec)", "15000 (15 sec)", "20000 (20 sec)", "30000 (30 sec)", "60000 (1 min)", "300000 (5min)"]) + self.lf_wc_duration_combobox = ttk.Combobox(self.lf_wc_frame, values=["", "5000 (5 sec)", "10000 (10 sec)", "15000 (15 sec)", "20000 (20 sec)", "30000 (30 sec)", "60000 (1 min)", "300000 (5min)"]) # noqa: E501 self.lf_wc_duration_combobox.current(3) self.lf_wc_duration_combobox.grid(row=4, column=1) self.window_tooltip.bind(self.lf_wc_duration_combobox, '''Select the duration of each iteration ''') @@ -114,7 +112,8 @@ def __init__(self, wc_tab, dut_tab, radio_frame, window_tooltip, current_working self.lf_wc_dl_rate = tkinter.Label(self.lf_wc_frame, text="dl_rate") self.lf_wc_dl_rate.grid(row=6, column=0) self.lf_wc_dl_rate_combobox = ttk.Combobox(self.lf_wc_frame, values=["custom>", "0", "9.6K", "56K", "128K", "256K", "384K", "768K", "1M", - "1.544M", "2M", "6M", "10M", "30M", "37M", "44.736M", "100M", "152M", "155.52M", "304M", "622.08M", "1G", "2.488G", "4.97664G", + "1.544M", "2M", "6M", "10M", "30M", "37M", "44.736M", "100M", "152M", + "155.52M", "304M", "622.08M", "1G", "2.488G", "4.97664G", "5G", "9.94328G", "10G", "20G", "25G", "40G", "50G", "100G"]) self.lf_wc_dl_rate_combobox.current(8) self.lf_wc_dl_rate_combobox.grid(row=6, column=1) @@ -123,7 +122,8 @@ def __init__(self, wc_tab, dut_tab, radio_frame, window_tooltip, current_working self.lf_wc_ul_rate = tkinter.Label(self.lf_wc_frame, text="ul_rate") self.lf_wc_ul_rate.grid(row=6, column=2) self.lf_wc_ul_rate_combobox = ttk.Combobox(self.lf_wc_frame, values=["custom>", "0", "9.6K", "56K", "128K", "256K", "384K", "768K", "1M", - "1.544M", "2M", "6M", "10M", "30M", "37M", "44.736M", "100M", "152M", "155.52M", "304M", "622.08M", "1G", "2.488G", "4.97664G", + "1.544M", "2M", "6M", "10M", "30M", "37M", "44.736M", "100M", + "152M", "155.52M", "304M", "622.08M", "1G", "2.488G", "4.97664G", "5G", "9.94328G", "10G", "20G", "25G", "40G", "50G", "100G"]) self.lf_wc_ul_rate_combobox.current(8) self.lf_wc_ul_rate_combobox.grid(row=6, column=3) diff --git a/py-scripts/tools/lf_test_gen/lf_logger_config.py b/py-scripts/tools/lf_test_gen/lf_logger_config.py index ff87f2779..9d1b38b1d 100755 --- a/py-scripts/tools/lf_test_gen/lf_logger_config.py +++ b/py-scripts/tools/lf_test_gen/lf_logger_config.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_logger_config.py diff --git a/py-scripts/tools/lf_test_gen/lf_test_gen.py b/py-scripts/tools/lf_test_gen/lf_test_gen.py index 62d84d1c9..459c4e467 100755 --- a/py-scripts/tools/lf_test_gen/lf_test_gen.py +++ b/py-scripts/tools/lf_test_gen/lf_test_gen.py @@ -1,20 +1,21 @@ -#!/usr/bin/python3 -# flake8: noqa +#!/usr/bin/env python3 import tkinter from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar -import requests import importlib import sys import os import logging import argparse +import traceback + try: import Pmw -except BaseException: +except Exception as x: + traceback.print_exception( + Exception, x, x.__traceback__, chain=True) print("Pmw module needed, Please do: pip install Pmw ") exit(1) @@ -81,11 +82,11 @@ def __init__(self, self.tabControl.add(self.wc_tab, text='Wifi Capacity') self.tabControl.add(self.dp_rvr_tab, text='Data Plane , RvR') self.tabControl.add(self.ap_auto_tab, text='AP Auto Beta') - #self.tabControl.add(self.functional_tab, text = 'Functional Tests') - #self.tabControl.add(self.creation_tab, text = 'Creation Tests') - #self.tabControl.add(self.interop_tab, text = 'Interop Tests') + # self.tabControl.add(self.functional_tab, text = 'Functional Tests') + # self.tabControl.add(self.creation_tab, text = 'Creation Tests') + # self.tabControl.add(self.interop_tab, text = 'Interop Tests') - #self.tabControl.add(self.practice_tab, text = 'Pratice Tests') + # self.tabControl.add(self.practice_tab, text = 'Pratice Tests') # self.tabControl.add(self.practice_tab, text = 'Practice') # Please Do not Delete. self.tabControl.pack(expand=1, fill="both") @@ -339,7 +340,7 @@ def create_ap_auto_json(self): if self.suite_radios_2g == "" and self.suite_radios_5g == "" and self.suite_radios_6g == "": tkinter.messagebox.showinfo(title="message", message="Please Read or Select LANforge Radios on LANforge tab") else: - tkinter.messagebox.showinfo(title="success", message="created \n" + self.lf_ap_auto_2g_file_entry_var.get() + "\n" + self.lf_ap_auto_5g_file_entry_var.get() + "\n" + self.lf_ap_auto_6g_file_entry.get()) + tkinter.messagebox.showinfo(title="success", message="created \n" + self.lf_ap_auto_2g_file_entry_var.get() + "\n" + self.lf_ap_auto_5g_file_entry_var.get() + "\n" + self.lf_ap_auto_6g_file_entry.get()) # noqa: E501 def main(): @@ -382,7 +383,6 @@ def main(): parser.add_argument('--radio_count', help='Number of radios to display on GUI', default='16') parser.add_argument('--log_level', help='Set logging level: debug | info | warning | error | critical') - args = parser.parse_args() logger_config = lf_logger_config.lf_logger_config() if args.log_level: @@ -393,7 +393,8 @@ def main(): _radio_count = args.radio_count - my_gui = json_gen_gui(radio_count=int(_radio_count)) + # my_gui = json_gen_gui(radio_count=int(_radio_count)) + json_gen_gui(radio_count=int(_radio_count)) # TODO allow log level to be sets diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py new file mode 100755 index 000000000..c766f63f8 --- /dev/null +++ b/py-scripts/tools/lf_update.py @@ -0,0 +1,832 @@ +#!/usr/bin/python3 + +r""" +NAME: lf_update.py + +PURPOSE: Update a lanforge system via kinstall, reboot, and run check_large_files. + +NOTES: This script is used to help to automate lanforge update + +EXAMPLE: # Updating a LANforge cli + ./lf_update.py \ + --mgr 192.168.50.103 \ + --root_user root \ + --root_password lanforge \ + --user lanforge \ + --user_password lanforge \ + --mgr_ssh_port 22\ + --lfver 5.5.1\ + --kver 6.15.6+\ + --log_level info + + # Updating a LANforge Vscode json + // ./lf_update.py + "args":[ + "--mgr", "192.168.50.103", + "--root_user", "root", + "--root_password", "lanforge", + "--user", "lanforge", + "--user_password", "lanforge", + "--mgr_ssh_port", "22", + "--log_level","info", + "--lfver","5.5.1", + "--kver","6.15.6+" + "--log_level","info" + ] + +SCRIPT_CLASSIFICATION : Tool + +SCRIPT_CATEGORIES: installation + +LICENSE: + Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc + + +INCLUDE_IN_README + +""" +from contextlib import contextmanager + +import scrapli +from scrapli.driver import GenericDriver, Driver +import paramiko +import time + +import argparse +import os +import importlib +import logging +import sys + +sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../"))) +logger = logging.getLogger(__name__) +lf_logger_config = importlib.import_module("lf_logger_config") + + +if sys.version_info[0] != 3: + logger.critical("This script requires Python 3") + exit(1) + + +# from time import sleep + + +if sys.version_info[0] != 3: + print("This script requires Python 3") + exit() + + +def get_jump_function(params: dict): + def jump_through_vrf(conn: Driver): + # ./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113 + + # jump_cmd = f'./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113' + jump_cmd = './vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113' + + # This happens after login completes + conn.channel.send_input(jump_cmd, eager=True, strip_prompt=False) + conn.channel._read_until_explicit_prompt(prompts=["password:"]) + conn.channel.send_inputs_interact( + interact_events=[ + (params['auth_password'], "Password:", True) + ], + interaction_complete_patterns=[ + "#" + ] + ) + # At this point we should be logged into the dut and need to change the prompt pattern + conn.comms_prompt_pattern = params['comms_prompt_pattern'] + + return jump_through_vrf + + +class create_lanforge_object: + def __init__(self, + **kwargs + ): + + if "mgr" in kwargs: + self.mgr = kwargs["mgr"] + + if "user" in kwargs: + self.user = kwargs["user"] + + if "user_password" in kwargs: + self.user_password = kwargs["user_password"] + + if "root_user" in kwargs: + self.root_user = kwargs["root_user"] + + if "root_password" in kwargs: + self.root_password = kwargs["root_password"] + + if "mgr_ssh_port" in kwargs: + self.mgr_ssh_port = kwargs["mgr_ssh_port"] + + if "lfver" in kwargs: + self.lfver = kwargs["lfver"] + + if "kver" in kwargs: + self.kver = kwargs["kver"] + + if "user_timeout" in kwargs: + self.user_timeout = kwargs["user_timeout"] + + if "root_timeout" in kwargs: + self.root_timeout = kwargs["root_timeout"] + + self.gui_resourse = kwargs["gui_resourse"] + + self.lanforge_system_node_version = None + self.lanforge_system_reboot = None + self.timeout = 2 + self.interval = 5 + self.max_iterations = 24 + + def __del__(self) -> None: + self.tear_down_mgmt() + + def tear_down_mgmt(self) -> None: + pass + if getattr(self, "conn", None) is not None: + self.conn.close() + self.conn = None + + # not used left in for reference + def reboot_lf_with_paramiko(self): + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=self.mgr, port=self.mgr_ssh_port, username=self.root_user, password=self.root_password, + allow_agent=False, look_for_keys=False, banner_timeout=600) + stdin, stdout, stderr = ssh.exec_command('reboot') + self.lanforge_system_node_version = stdout.readlines() + self.lanforge_system_node_version = [line.replace( + '\n', '') for line in self.lanforge_system_node_version] + ssh.close() + time.sleep(1) + return self.lanforge_system_reboot + + def get_lanforge_kernel_version(self): + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=self.mgr, port=self.mgr_ssh_port, username=self.user, password=self.user_password, + allow_agent=False, look_for_keys=False, banner_timeout=600) + stdin, stdout, stderr = ssh.exec_command('uname -a') + self.lanforge_kernel_version = stdout.readlines() + self.lanforge_kernel_version = [line.replace( + '\n', '') for line in self.lanforge_kernel_version] + ssh.close() + time.sleep(1) + return self.lanforge_kernel_version + + def get_lanforge_server_version(self): + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=self.mgr, port=self.mgr_ssh_port, username=self.user, password=self.user_password, + allow_agent=False, look_for_keys=False, banner_timeout=600) + stdin, stdout, stderr = ssh.exec_command( + './btserver --version | grep Version') + self.lanforge_server_version_full = stdout.readlines() + self.lanforge_server_version_full = [line.replace( + '\n', '') for line in self.lanforge_server_version_full] + logger.info("lanforge_server_version_full: {lanforge_server_version_full}".format( + lanforge_server_version_full=self.lanforge_server_version_full)) + self.lanforge_server_version = self.lanforge_server_version_full[0].split( + 'Version:', maxsplit=1)[-1].split(maxsplit=1)[0] + self.lanforge_server_version = self.lanforge_server_version.strip() + logger.info("lanforge_server_version: {lanforge_server_version}".format( + lanforge_server_version=self.lanforge_server_version)) + ssh.close() + time.sleep(1) + return self.lanforge_server_version_full + + def get_lanforge_gui_version(self): + if self.gui_resourse: + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=self.mgr, port=self.mgr_ssh_port, username=self.user, password=self.user_password, + allow_agent=False, look_for_keys=False, banner_timeout=600) + stdin, stdout, stderr = ssh.exec_command( + 'curl -H "Accept: application/json" http://{lanforge_ip}:8080 | json_pp | grep -A 7 "VersionInfo"'.format(lanforge_ip=self.mgr)) + self.lanforge_gui_version_full = stdout.readlines() + logger.info("lanforge_gui_version_full pre: {lanforge_gui_version_full}".format(lanforge_gui_version_full=self.lanforge_gui_version_full)) + self.lanforge_gui_version_full = [line.replace( + '\n', '') for line in self.lanforge_gui_version_full] + # logger.info("lanforge_gui_version_full: {lanforge_gui_version_full}".format(lanforge_gui_version_full=self.lanforge_gui_version_full)) + for element in self.lanforge_gui_version_full: + if "BuildVersion" in element: + ver_str = str(element) + self.lanforge_gui_version = ver_str.split( + ':', maxsplit=1)[-1].replace(',', '') + self.lanforge_gui_version = self.lanforge_gui_version.strip().replace('"', '') + logger.info("BuildVersion {}".format( + self.lanforge_gui_version)) + if "BuildDate" in element: + gui_str = str(element) + self.lanforge_gui_build_date = gui_str.split( + ':', maxsplit=1)[-1].replace(',', '') + logger.info("BuildDate {}".format( + self.lanforge_gui_build_date)) + if "GitVersion" in element: + git_sha_str = str(element) + self.lanforge_gui_git_sha = git_sha_str.split( + ':', maxsplit=1)[-1].replace(',', '') + logger.info("GitVersion {}".format( + self.lanforge_gui_git_sha)) + else: + self.lanforge_gui_version = "NA" + self.lanforge_gui_build_data = "NA" + self.lanforge_gui_get_shaw = "NA" + + def check_system_status(self): + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + # Attempt to connect to the server + # try for a minute + interations = 0 + while interations < 10: + try: + ssh.connect(hostname=self.mgr, port=self.mgr_ssh_port, username=self.root_user, password=self.root_password) + print("System is up!") + break + except (paramiko.ssh_exception.NoValidConnectionsError, paramiko.ssh_exception.AuthenticationException): + print("System is down, retrying in 5 seconds...") + time.sleep(5) # Wait before retrying + interations += 1 + + # Execute a command to confirm the system is operational + stdin, stdout, stderr = ssh.exec_command("uptime") + print(stdout.read().decode()) + + ssh.close() + + # TODO move to using scrapli and check for prompt + def check_large_files(self): + command = "'/home/lanforge/scripts/check_large_files.bash -d -t -a'" + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + + print(f"command: {command}: {r.result}") + + def remove_DB_gz(self): + + command = "rm DB*.gz" + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + + print(f"command: {command}: {r.result}") + + def start_gui(self): + # creating shh client object we use this object to connect to router + command = 'nohup /home/lanforge/LANforgeGUI_5.1.1/lfclient.bash -s localhost &' + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + print(f"command: {command}: {r.result}") + + def check_system_up(self): + iterations = 0 + while True: + iterations = iterations + 1 + if iterations > self.max_iterations: + print(f"Connection failed: iterations {iterations} > max_iterations {self.max_iterations}") + break + + try: + # Create a new SSH client + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + # Set the timeout for the connection + ssh.connect(hostname=self.mgr, port=self.mgr_ssh_port, username=self.root_user, password=self.root_password, timeout=self.timeout) + + # client.connect(hostname, port=port, username=username, password=password, timeout=timeout) + print(f"System {self.mgr} is up!") + # Execute a command to confirm the system is operational + stdin, stdout, stderr = ssh.exec_command("uptime") + print(stdout.read().decode()) + + ssh.close() + break # Exit the loop if the connection is successful + except (paramiko.ssh_exception.NoValidConnectionsError, paramiko.ssh_exception.SSHException) as e: + print(f"Connection failed system down: {e}. Retrying in {self.interval} seconds...") + time.sleep(self.interval) # Wait before retrying + except Exception as e: + print(f"An error occurred system down: {e}. Retrying in {self.interval} seconds...") + time.sleep(self.interval) # Wait before retrying + + def cmd_pwd(self): + command = "pwd" + print(f"command: {command}") + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + print(f"result {command}: {r.result}") + + def cmd_uptime(self): + command = "uptime" + print(f"command: {command}") + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + print(f"result {command}: {r.result}") + + def cmd_ls(self): + command = "ls" + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + print(f"command: {command}: {r.result}") + + def killall_lfclient(self): + command = "killall lfclient.bash" + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + print(f"command: {command}: {r.result}") + + def killall_java(self): + command = "killall java" + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + print(f"command: {command}: {r.result}") + + def lf_kinstall(self): + + # send the reboot command + # check for done + # [F30] Command: ./lf_kinstall.pl ./lf_kinstall.pl --lfver 5.5.1 --kver 6.15.6+ --do_noaer 1 --do_upgrade + # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + # Done. + + # command = "curl -o lf_kinstall.pl www.candelatech.com/lf_kinstall.txt" # leave in for testing + # command = "curl -o lf_kinstall.pl www.candelatech.com/lf_kinstall.txt; ./lf_kinstall.pl --lfver 5.5.1 --kver 6.15.6+ --do_noaer 1 --do_upgrade" + command = f"curl -o lf_kinstall.pl www.candelatech.com/lf_kinstall.txt; chmod +x lf_kinstall.pl; ./lf_kinstall.pl --lfver {self.lfver} --kver {self.kver} --do_noaer 1 --do_upgrade" + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + + print(f"{command}: {r.result}") + + def reboot_lanforge(self): + command = "/sbin/reboot -f > /dev/null 2>&1 &" + print(f"command: {command}") + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + + print(f"{command}: {r.result}") + + def update_lanforge(self): + + # this should reconnect + self.check_system_up() + + self.cmd_pwd() + + self.cmd_ls() + + self.killall_lfclient() + + self.killall_java() + + self.lf_kinstall() + + # self.reboot_lanforge() + + self.reboot_lf_with_paramiko() # leave in if paramiko needs to be in reboot + + # take down connection so as to reconnect + self.tear_down_mgmt() + + # this should reconnect + self.check_system_up() + + # check large files + self.check_large_files() + + # LANforge user manager + @contextmanager + def get_mgmt_user(self) -> "Generator[GenericDriver]": # noqa: + if getattr(self, "conn_user", None) == None: # noqa: + + # ./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113 + # jumphost config + # c = { + # "host":self.dest, # noqa: + # "auth_username":self.root_user, # noqa: + # "auth_password":self.root_password, # noqa: + # "ssh_config_file": True, + # "comms_prompt_pattern":"^\S+\s\S+\s[#>$]\s*$", # noqa: 231 + # "timeout_ops": 120, + # "timeout_transport": 240 + # } + + # if not getattr(self, "jump_host", None) == None: + # jump_function = get_jump_function(c) + + # LANforge root config + user = { # noqa + "host": self.mgr, # noqa: + "auth_username": self.user, # noqa: + "auth_password": self.user_password, # noqa: + "auth_strict_key": False, + # "comms_prompt_pattern": "^\\S[a-z]*\\@[a-zA-Z0-9]+[-][a-zA-Z0-9]+[\\s\\S]\\S\\S[\\#\\$\\>]", + "comms_prompt_pattern": r"^(?:\([a-z]+[-][0-9]+\.[0-9]+\)|)(?:\s|\S)(?:\[|)[a-z]*\@[a-zA-Z0-9]+(?:[-][a-zA-Z0-9]+|)[-][a-zA-Z0-9]+[\s\S]\S(?:\:|\s)(?:\S|\S\S)[\\#\\$\\>]", + # "on_open": jump_function, # on logging into LANforge will run the jump_function + # "auth_password_pattern": "Password:", + "timeout_ops": int(self.user_timeout), + "timeout_transport": int(self.user_timeout), + "timeout_socket": int(self.user_timeout), + "ssh_config_file": True, + } + + self.conn_user = GenericDriver(**root) # noqa + try: + self.conn_user.open() + except scrapli.exceptions.ScrapliAuthenticationFailed as e: + raise Exception( + f"Failed to open connection to {self.mgr} ({e.message})" + ) from e + yield self.conn_user + + # LANforge root manager + @contextmanager + def get_mgmt(self) -> "Generator[GenericDriver]": # noqa: + if getattr(self, "conn", None) == None: # noqa: + + # jumphost config left in for reference eventually may need to reboot AP's + # ./vrf_exec.bash eth1 ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.215.113 + # jumphost config + # c = { + # "host":self.dest, # noqa: + # "auth_username":self.root_user, # noqa: + # "auth_password":self.root_password, # noqa: + # "ssh_config_file": True, + # "comms_prompt_pattern":"^\S+\s\S+\s[#>$]\s*$", # noqa: 231 + # "timeout_ops": 120, + # "timeout_transport": 240 + # } + + # if not getattr(self, "jump_host", None) == None: + # jump_function = get_jump_function(c) + + # LANforge root config + root = { + "host": self.mgr, # noqa: + "auth_username": self.root_user, # noqa: + "auth_password": self.root_password, # noqa: + "auth_strict_key": False, + # "comms_prompt_pattern": "^\\S[a-z]*\\@[a-zA-Z0-9]+[-][a-zA-Z0-9]+[\\s\\S]\\S\\S[\\#\\$\\>]", + "comms_prompt_pattern": r"^(?:\([a-z]+[-][0-9]+\.[0-9]+\)|)(?:\s|\S)(?:\[|)[a-z]*\@[a-zA-Z0-9]+(?:[-][a-zA-Z0-9]+|)[-][a-zA-Z0-9]+[\s\S]\S(?:\:|\s)(?:\S|\S\S)[\\#\\$\\>]", + # "on_open": jump_function, # on logging into LANforge will run the jump_function + # "auth_password_pattern": "Password:", + "timeout_ops": int(self.root_timeout), + "timeout_transport": int(self.root_timeout), + "timeout_socket": int(self.root_timeout), + "ssh_config_file": True, + } + + self.conn = GenericDriver(**root) + try: + self.conn.open() + except scrapli.exceptions.ScrapliAuthenticationFailed as e: + raise Exception( + f"Failed to open connection to {self.mgr} ({e.message})" + ) from e + yield self.conn + + def send_lf_command(self, command: "str"): + print(f"command : {command}") + with self.get_mgmt() as console: + + r = console.send_command(command, failed_when_contains=["ERROR: .*"]) + + return r + + def send_lf_command_user(self, command: "str"): + print(f"command : {command}") + with self.get_mgmt_user() as console: + + r = console.send_command(command, failed_when_contains=["ERROR: .*"]) + + return r + + # left in for reference + def send_multiple_lf_commands(self, command: "list"): + print(f"command : {command}") + with self.get_mgmt() as console: + + r = console.send_commands(command, failed_when_contains=["ERROR: .*"]) + + return r + + def send_ap_command(self, command: "str"): + + print(f"command sent: {command}") + with self.get_mgmt() as console: + + r = console.send_command(command, failed_when_contains=["ERROR: .*"]) + + return r + + +def validate_args(args): + """Validate CLI arguments.""" + if args.mgr is None: + logger.error("--mgr required") + exit(1) + + if args.user is None: + logger.error("--user required") + exit(1) + + if args.user_password is None: + logger.error("--user_password required") + exit(1) + + if args.root_user is None: + logger.error("--root_user required") + exit(1) + + if args.root_password is None: + logger.error("--root_password required") + exit(1) + + if args.lfver is None: + logger.error("--lfver required") + exit(1) + + if args.kver is None: + logger.error("--kver required") + exit(1) + + if "+" not in args.kver: + logger.error("kver needs to have a '+'") + + if args.user_timeout is None: + logger.error("--user_timeout required") + exit(1) + + if args.root_timeout is None: + logger.error("--root_timeout required") + exit(1) + + +def parse_args(): + parser = argparse.ArgumentParser( + prog='lf_update.py', + formatter_class=argparse.RawTextHelpFormatter, + epilog='''\ + Update lanforge + ''', + + description=r''' + NAME: lf_update.py + +PURPOSE: Update a lanforge system via kinstall, reboot, and run check_large_files. + +NOTES: This script is used to help to automate lanforge update + +EXAMPLE: # Updating a LANforge cli + ./lf_update.py \ + --mgr 192.168.50.103 \ + --root_user root \ + --root_password lanforge \ + --user lanforge \ + --user_password lanforge \ + --mgr_ssh_port 22\ + --lfver 5.5.1\ + --kver 6.15.6+\ + --log_level info + + # Updating a LANforge Vscode json + // ./lf_update.py + "args":[ + "--mgr", "192.168.50.103", + "--root_user", "root", + "--root_password", "lanforge", + "--user", "lanforge", + "--user_password", "lanforge", + "--mgr_ssh_port", "22", + "--log_level","info", + "--lfver","5.5.1", + "--kver","6.15.6+" + "--log_level","info" + ] + + +SCRIPT_CLASSIFICATION : Tool + +SCRIPT_CATEGORIES: installation + +LICENSE: + Free to distribute and modify. LANforge systems must be licensed. + Copyright 2025 Candela Technologies Inc + + +INCLUDE_IN_README + ''') + + # leave in for possible remote commands to execute + # parser.add_argument( + # '--prog', + # help='Remote command to execute', + # default=prog) + + parser.add_argument( + '--remote_args', + help='Arguments for remote command', + default="") + + parser.add_argument( + '--mgr', '--lf_mgr', + help='IP address of remote system', + dest='mgr') + + parser.add_argument( + '--user', '--lf_user', + help='User-name for remote machine', + dest='user') + + parser.add_argument( + '--user_password', '--lf_user_passwd', + help='User Password for remote machine', + dest='user_password') + + parser.add_argument( + '--root_user', '--lf_root_user', + help='User-name for remote machine', + dest='root_user') + + parser.add_argument( + '--root_password', '--lf_root_passwd', + help='Root Password for remote machine', + dest='root_password') + + parser.add_argument( + '--mgr_ssh_port', '--lf_mgr_ssh_port', '--lf_port', + help='ssh port to use', + dest='mgr_ssh_port') + + parser.add_argument( + '--gui_resourse', + help='The lanforge has the resourse GUI running on it', + action='store_true') + + parser.add_argument( + '--kver', + help='kernel version example: 6.15.6+', + dest='kver') + + parser.add_argument( + '--lfver', + help='lanforge version --lfver 5.5.1', + dest='lfver') + + parser.add_argument( + '--user_timeout', + help=''' lanforge update timeout for user login seconds, suggested time: + 523c = 10 sec + AT7 = 10 sec + Noah2 = 20 sec + APU2 = 25 sec + example: --user_timeout 1320 + ''', + dest='user_timeout') + + parser.add_argument( + '--root_timeout', + help=''' lanforge update timeout for root login seconds, suggested time: + 523c = 300 sec + AT7 = 300 sec + Noah2 = 720 sec + APU2 = 1320 sec + example: --timeout 1320 + ''', + dest='root_timeout') + + parser.add_argument( + '--action', + help='action for remote machine') + + parser.add_argument('--log_level', + default=None, + help='Set logging level: debug | info | warning | error | critical') + + parser.add_argument( + '--help_summary', + action="store_true", + help='Show summary of what this script does') + + parser.add_argument( + '--help_example', + action="store_true", + help='Show simple example for lf_update.py') + + parser.add_argument( + '--help_vscode', + action="store_true", + help='Print out simple vscode example for lf_update.py') + + return parser.parse_args() + + +def help_commands(args): + help_summary = '''\ +This script will perform an update on lanforge GUI version, Kernel version, reboot, run check_large_files.bash +''' + + if args.help_summary: + print(help_summary) + exit(0) + + help_example = r'''\ +This example may be directly modified and executed from the command line + ./lf_update.py \ + --mgr 192.168.50.103 \ + --root_user root \ + --root_password lanforge \ + --user lanforge \ + --user_password lanforge \ + --mgr_ssh_port 22\ + --lfver 5.5.1\ + --kver 6.15.6+\ + --user_timeout 10\ + --root_timeout 300\ + --log_level info +''' + + if args.help_example: + print(help_example) + exit(0) + + help_vscode = r''' + // ./lf_update.py + "args":[ + "--mgr", "192.168.50.103", + "--root_user", "root", + "--root_password", "lanforge", + "--user", "lanforge", + "--user_password", "lanforge", + "--mgr_ssh_port", "22", + "--log_level","info", + "--lfver","5.5.1", + "--kver","6.15.6+", + "--user_timeout","10", + "--root_timeout","300", + "--log_level","info" + ] +''' + + if args.help_vscode: + print(help_vscode) + exit(0) + + +def main(): + + args = parse_args() + + help_commands(args) + + validate_args(args) + + logger_config = lf_logger_config.lf_logger_config() + + if args.log_level: + logger_config.set_level(level=args.log_level) + + lf = create_lanforge_object(**vars(args)) + + lf.check_system_up() + + lf.update_lanforge() + + lf.check_system_up() + + kernel_version = lf.get_lanforge_kernel_version() + logger.info(f"kernel_version = {kernel_version}") + + server_version = lf.get_lanforge_server_version() + logger.info(f"server_version: {server_version}") + + gui_version = lf.get_lanforge_gui_version() + + # Work in progress , the process closes when starting the GUI + # if gui_version is None and gui_version != "NA": + # logger.info(f"gui_version = {gui_version}") + # lf.start_gui() + # time.sleep(10) + # gui_version = lf.get_lanforge_gui_version() + + logger.info(f"gui_version = {gui_version}") + + +if __name__ == '__main__': + main() diff --git a/py-scripts/update_dependencies.py b/py-scripts/update_dependencies.py index 5ac76a266..9826dc333 100755 --- a/py-scripts/update_dependencies.py +++ b/py-scripts/update_dependencies.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import argparse import os import os.path @@ -122,7 +121,7 @@ def remove_venv(self, venv_directory: pathlib.Path = None): :param venv_directory: containing virtual environment :return: False if unable to find directory """ - has_bin_activate = False + # has_bin_activate = False if venv_directory and venv_directory.is_dir(): if os.name == 'nt': if os.path.isfile(f"{venv_directory}\\bin\\activate.bat"): @@ -197,10 +196,10 @@ def install_pkg(self, package: str): print(" ", end="", flush=True) res = call(command, shell=True) if res == 0: - print(f"✔", end=" ", flush=True) + print(f"✔", end=" ", flush=True) # noqa: F541 self.packages_installed.append(package) else: - print(f"✘", end=" ", flush=True) + print(f"✘", end=" ", flush=True) # noqa: F541 self.packages_failed.append(package) def install_packages(self): @@ -261,16 +260,16 @@ def main(): parser.add_argument("--create_venv", "-c", default=False, required=False, action='store_true', help=f"Create a virtual environment named $home/scritps/venv-{version} " - "by default. Will create a symlink $home/scripts/venv to point to " - "this virtual environment in the default case. " - "Symlink will not be created if --venv_path is specified.") + "by default. Will create a symlink $home/scripts/venv to point to " + "this virtual environment in the default case. " + "Symlink will not be created if --venv_path is specified.") parser.add_argument("--venv_path", "--venv", type=str, default=None, required=False, help=f"specify the path of the virtual environment to create. " - f"Default location is $home/scripts/venv-{version}, and symlink to $home/scripts/venv. " - "Specifying relative path will create named virtual environment in $home/scripts " - "but will NOT create the default venv symlink.") + f"Default location is $home/scripts/venv-{version}, and symlink to $home/scripts/venv. " + "Specifying relative path will create named virtual environment in $home/scripts " + "but will NOT create the default venv symlink.") parser.add_argument("--destroy_venv", "--remove_venv", type=str, required=False, const=upgrader.venv_path, nargs='?', @@ -314,7 +313,6 @@ def main(): action="store_true", help='Show summary of what this script does') - args = parser.parse_args() if args.help_summary: print(help_summary) @@ -382,7 +380,7 @@ def main(): upgrader.install_packages() exit(0) else: - print(f"Installing packages to system scope...") + print("Installing packages to system scope...") sysconfig_dir = sysconfig.get_path("stdlib") external_marker = pathlib.Path(f"{sysconfig_dir}/EXTERNALLY-MANAGED") if external_marker.is_file(): diff --git a/py-scripts/webGUI_update_dependencies.py b/py-scripts/webGUI_update_dependencies.py index fbf957b08..3f2cf8b40 100755 --- a/py-scripts/webGUI_update_dependencies.py +++ b/py-scripts/webGUI_update_dependencies.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa import subprocess import argparse @@ -26,14 +25,13 @@ def main(): args = parser.parse_args() - help_summary='''\ + help_summary = '''\ This script installs python3 webGUI package dependencies. ''' if args.help_summary: print(help_summary) exit(0) - print("Installing webGUI Python3 Dependencies") # These don't work on my F36 LANforge system (as root user, my bad) @@ -44,18 +42,18 @@ def main(): packages = ['pandas', 'plotly', 'numpy', 'cryptography', 'paramiko', 'websocket-client', 'xlsxwriter', 'pyshark', 'influxdb', 'influxdb-client', 'matplotlib', 'pdfkit', 'pip-search', - 'pyserial','pexpect-serial', 'scp','scipy','simple-geometry','kaleido','psutil','aiohttp','bs4', - 'django','django-celery-beat','django-enum-choices','django-timezone-field', - 'flower','jsonfield','matplotlib','psycopg2-binary','wheel','pytest','pytest-html','pytest-json', - 'django-celery-results','celery','pytest-json-report','pytest-metadata','python-dateutil', - 'requests','pillow','tabulate','selenium','scapy','redis','djangorestframework'] + 'pyserial', 'pexpect-serial', 'scp', 'scipy', 'simple-geometry', 'kaleido', 'psutil', 'aiohttp', 'bs4', + 'django', 'django-celery-beat', 'django-enum-choices', 'django-timezone-field', + 'flower', 'jsonfield', 'matplotlib', 'psycopg2-binary', 'wheel', 'pytest', 'pytest-html', 'pytest-json', + 'django-celery-results', 'celery', 'pytest-json-report', 'pytest-metadata', 'python-dateutil', + 'requests', 'pillow', 'tabulate', 'selenium', 'scapy', 'redis', 'djangorestframework'] if args.pyjwt: packages.append('pyjwt') else: print('Not installing PyJWT') - #Adding XiaB webGUI dependencies with --xiab flag + # Adding XiaB webGUI dependencies with --xiab flag if args.xiab: - packages.extend(['channels','django-cors-headers','uvicorn[standard]','python-dotenv']) + packages.extend(['channels', 'django-cors-headers', 'uvicorn[standard]', 'python-dotenv']) else: print('Not installing XiaB dependencies') packages_installed = [] diff --git a/py-scripts/wlan_capacity_calculator.py b/py-scripts/wlan_capacity_calculator.py index 56c432818..d8ed0dfd3 100755 --- a/py-scripts/wlan_capacity_calculator.py +++ b/py-scripts/wlan_capacity_calculator.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ Candela Technologies Inc. Info : Standard Script for WLAN Capacity Calculator @@ -29,16 +28,16 @@ def main(): --------------------------------------------------------------------------- Example of command line to run(11ac Station): - ./wlan_capacity_calculator.py - -sta 11ac - -t Voice - -d 9 - -spa 3 + ./wlan_capacity_calculator.py + -sta 11ac + -t Voice + -d 9 + -spa 3 -ch 20 - -gu 800 + -gu 800 -high 1 -e TKIP - -q Yes + -q Yes -ip 3 -mc 0 -b 6 12 24 54 @@ -51,7 +50,7 @@ def main(): try: args = parse.parse_args() - help_summary='''\ + help_summary = '''\ This script calculates the theoretical value of three different stations( 11abg/11n/11ac) ''' diff --git a/tos_plus_auto.py b/tos_plus_auto.py index ac9b8e580..376fefbb7 100755 --- a/tos_plus_auto.py +++ b/tos_plus_auto.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' diff --git a/wifi_ctl_9800_3504.py b/wifi_ctl_9800_3504.py index b5aac1eb1..39a6f70fd 100755 --- a/wifi_ctl_9800_3504.py +++ b/wifi_ctl_9800_3504.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # flake8: noqa ''' LANforge 172.19.27.91