From d3abc464763997ecde99a0a8b17f64673efeff0f Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 11 Jun 2025 15:16:31 -0600 Subject: [PATCH 001/376] py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json enable lf_qa and lf_inspect As port reset now produces kpi.csv Signed-off-by: Chuck SmileyRekiere --- .../ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json index ac8f84cc1..26e3679fd 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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json @@ -40,7 +40,7 @@ ] }, "lf_qa":{ - "enabled":"FALSE", + "enabled":"TRUE", "timeout":"600", "load_db":"skip", "command":"./tools/lf_qa.py", @@ -50,7 +50,7 @@ ] }, "lf_inspect":{ - "enabled":"FALSE", + "enabled":"TRUE", "timeout":"600", "load_db":"skip", "command":"./tools/lf_inspect.py", From 61a4305b68deef5b736c58939cc0115dc14c029b Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 11 Jun 2025 15:20:10 -0600 Subject: [PATCH 002/376] py-scripts/tools/ct_us_002_func_wc_dp_run.bash added ./ct_us_002_cv.bash to test run Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_002_func_wc_dp_run.bash | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_us_002_func_wc_dp_run.bash b/py-scripts/tools/ct_us_002_func_wc_dp_run.bash index 297277fc5..c569470fb 100755 --- a/py-scripts/tools/ct_us_002_func_wc_dp_run.bash +++ b/py-scripts/tools/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.bashj + +echo "Running ChamberView: Port Reset and Scale Tests" +./ct_us_002_cv.bash From 8c7355fe519416658be9172f7fd7198b4c9d77a2 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 13 Jun 2025 13:13:10 -0600 Subject: [PATCH 003/376] py-scripts/tools/ct_us_002_func_wc_dp_run.bash Fixed typo: Verification: automation Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_002_func_wc_dp_run.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_us_002_func_wc_dp_run.bash b/py-scripts/tools/ct_us_002_func_wc_dp_run.bash index c569470fb..e3b097c0a 100755 --- a/py-scripts/tools/ct_us_002_func_wc_dp_run.bash +++ b/py-scripts/tools/ct_us_002_func_wc_dp_run.bash @@ -9,7 +9,7 @@ echo "Running Wifi Capacity Tests" ./ct_us_002_wc.bash echo "Running Dataplane Tests" -./ct_us_002_dp.bashj +./ct_us_002_dp.bash echo "Running ChamberView: Port Reset and Scale Tests" ./ct_us_002_cv.bash From b3770d9ed9c538cf7eb4d562bab418e449709288 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 14 Jun 2025 18:57:57 -0600 Subject: [PATCH 004/376] py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json cv_tests suite name changed to cv_port_reset_test to differenciate emails Verification: Automation Signed-off-by: Chuck SmileyRekiere --- .../ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json index 26e3679fd..9e562f8a3 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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json @@ -7,8 +7,8 @@ "as a unique identifier for tha chamber-view test run" ] }, - "test_suites":{ - "cv_tests":{ + "test_cv_port_reset_test_suites":{ + "cv_port_reset_test":{ "LOAD_PORT_REST_DB":{ "enabled":"TRUE", "timeout":"600", From d7c3eda0b9af355e1f6d502627ac7d1cfe783157 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 14 Jun 2025 18:59:16 -0600 Subject: [PATCH 005/376] py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json updated test suite name from ct_scale to cv_scale_test to differenciate chamberview results Verified: automation Signed-off-by: Chuck SmileyRekiere --- .../tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json b/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json index cc8b925a6..22b0056d6 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json +++ b/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json @@ -7,8 +7,8 @@ "as a unique identifier for tha chamber-view test run" ] }, - "test_suites":{ - "ct_scale":{ + "test_cv_scale_test_suites":{ + "cv_scale_test":{ "SCALE_2G_5G":{ "enabled":"TRUE", "timeout":"600", From 9914bdb4549125775f2b61ccf3cb41ebc188fad4 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 14 Jun 2025 19:00:06 -0600 Subject: [PATCH 006/376] py-scripts/tools/ct_us_002_cv.bash updated bash to accomidate the test suite name cv_port_reset_test and cv_scale_test Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_002_cv.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/tools/ct_us_002_cv.bash b/py-scripts/tools/ct_us_002_cv.bash index e3306ed4e..853a8a846 100755 --- a/py-scripts/tools/ct_us_002_cv.bash +++ b/py-scripts/tools/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 From c2eeeace0e8522d3074e45d3fe0784fb3a30fe10 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 14 Jun 2025 20:02:24 -0600 Subject: [PATCH 007/376] py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json added raw_line cap_pf_percent-combo: 800000 , this will allow 80% traffic threshold to constitute a pass Verification: Automation Signed-off-by: Chuck SmileyRekiere --- .../ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json | 1 + 1 file changed, 1 insertion(+) 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/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/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'", From ed5a6c923c1ca6080fa57efdb11ce609821a1fcc Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 16 Jun 2025 13:51:02 -0600 Subject: [PATCH 008/376] py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json test suites name update Verification: automation Signed-off-by: Chuck SmileyRekiere --- .../ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json index 9e562f8a3..1b161935f 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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json @@ -7,7 +7,7 @@ "as a unique identifier for tha chamber-view test run" ] }, - "test_cv_port_reset_test_suites":{ + "test_suites":{ "cv_port_reset_test":{ "LOAD_PORT_REST_DB":{ "enabled":"TRUE", From a764f8154c7626ec88a814f76eb12d6b221694f1 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 16 Jun 2025 13:51:35 -0600 Subject: [PATCH 009/376] py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json test_suites name update Verification: Automation Signed-off-by: Chuck SmileyRekiere --- .../tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json b/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json index 22b0056d6..f0cf28c1a 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json +++ b/py-scripts/tools/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json @@ -7,7 +7,7 @@ "as a unique identifier for tha chamber-view test run" ] }, - "test_cv_scale_test_suites":{ + "test_suites":{ "cv_scale_test":{ "SCALE_2G_5G":{ "enabled":"TRUE", From 2bfbd99df3e3cbf986d733955365a886c108a7aa Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 17 Jun 2025 09:07:52 -0600 Subject: [PATCH 010/376] py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json Temporary removed setting test_tag and test_rig from the ct_port_reset json Verified: Automation Signed-off-by: Chuck SmileyRekiere --- .../ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json | 2 -- 1 file changed, 2 deletions(-) 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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json index 1b161935f..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/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json @@ -33,8 +33,6 @@ " --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" ] From 1d57483d3de20855800e2dabf4809804f2d44c6e Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 17 Jun 2025 09:08:58 -0600 Subject: [PATCH 011/376] py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt Temporary added configuration of the test_rig:CT_US_002 test_tag:PORT_RESET rpt_name:PORT_RESET Signed-off-by: Chuck SmileyRekiere --- .../ct_us_002/ct_port_reset/port_reset_002.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/py-scripts/tools/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt b/py-scripts/tools/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/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 From 67485da2a481b53b46909b5456f6432503a0f48b Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 18 Jun 2025 16:44:27 -0600 Subject: [PATCH 012/376] py-scripts/tools/lf_test_gen/lf_create_radio_frame.py fix for mt7996e to differenciate between 2g, 5g and 6g radios Verification: ./lfc-test_gen.py --radio_count 18 --log_level debug Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_radio_frame.py | 6 ++++++ 1 file changed, 6 insertions(+) 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..92cd574ef 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 @@ -310,6 +310,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] From eaa20afc9aefccebb8c93db473e81d2a112c4c9e Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 19 Jun 2025 14:50:34 -0600 Subject: [PATCH 013/376] py-scripts/tools/ct_dut_json/ct_008_TP_BE19000_dut.json white space cleanup Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_dut_json/ct_008_TP_BE19000_dut.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/py-scripts/tools/ct_dut_json/ct_008_TP_BE19000_dut.json b/py-scripts/tools/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/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"} - } } } From ddf8b68ce8b2f5c4d234f3921bfabdfc2aa8f02c Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 19 Jun 2025 14:50:56 -0600 Subject: [PATCH 014/376] py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json white space cleanup Signed-off-by: Chuck SmileyRekiere --- .../tools/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/py-scripts/tools/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json b/py-scripts/tools/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/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"} - } } } From d7c2e155e21ead9b0478aa79e009204c4766addd Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 19 Jun 2025 14:51:30 -0600 Subject: [PATCH 015/376] py-scripts/tools/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json adjusted radio assignments for AP auto longterm tests Verification: Automation Signed-off-by: Chuck SmileyRekiere --- .../ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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/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/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", From fc6562848d1363f9391f943b1aaab07db925fce1 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 15 May 2025 17:06:54 +0530 Subject: [PATCH 016/376] lf_ftp.py: Renamed graph image name for mixed traffic test support. Signed-off-by: Sidartha-CT --- py-scripts/lf_ftp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index f37a4ed6a..0296ae682 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -1861,7 +1861,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 +1894,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() From 3658e50cb6a7eaeebb6b196510c7a4e3da3a92e7 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 15 May 2025 17:11:32 +0530 Subject: [PATCH 017/376] lf_ftp.py: For real devices added monitor_cx to wait for CX creation. - Waits up to 20 retries for all CXs (connections) to be created. - Devices will be excluded from the test if their cross-connections are not created. Verified CLI: python3 lf_ftp.py --file_sizes 1MB --mgr 192.168.204.74 --traffic_duration 1m --directions Download --clients_type Real --bands 5G --upstream_port eth1 --device_list 1.15,1.16,1.95 Signed-off-by: Sidartha-CT --- py-scripts/lf_ftp.py | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 0296ae682..27c1169be 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -2311,6 +2311,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: + 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.""" @@ -2743,6 +2804,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) From 69e62b71e02c978fae8f86e970f10bc6fa6d4033 Mon Sep 17 00:00:00 2001 From: Nikhita Date: Thu, 15 May 2025 17:56:38 +0530 Subject: [PATCH 018/376] lf_interop_qos.py: Add monitor_cx to wait for CX creation - Waits up to 20 retries for all CXs (connections) to be created - Devices will be excluded from the test if their cross-connections are not created. Signed-off-by: Nikhita --- py-scripts/lf_interop_qos.py | 70 ++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index 744663ac6..5939da8fa 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 @@ -568,6 +569,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 @@ -925,9 +986,10 @@ 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]) + counter=0 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]) + 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: @@ -935,6 +997,7 @@ def evaluate_qos(self, connections_download, connections_upload, drop_a_per, dro 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+=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 +1019,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 +1030,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}")}) @@ -2349,6 +2414,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() From ac40624179a2508d544715e8ad2aed1b6bcf09c0 Mon Sep 17 00:00:00 2001 From: Nikhita Date: Thu, 15 May 2025 18:06:06 +0530 Subject: [PATCH 019/376] lf_interop_qos.py: Add autopep8 and flake8 changes Signed-off-by: Nikhita --- py-scripts/lf_interop_qos.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index 5939da8fa..37a0cae97 100755 --- a/py-scripts/lf_interop_qos.py +++ b/py-scripts/lf_interop_qos.py @@ -582,7 +582,7 @@ def monitor_cx(self): 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()) + 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: @@ -599,34 +599,34 @@ def monitor_cx(self): current_retry += 1 cxs_to_remove = [] - # Collect all CXs related to the failed device (from `not_running_cx`), + # 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 + # 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] + 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.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): @@ -986,7 +986,7 @@ 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]) - counter=0 + counter = 0 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]) @@ -997,7 +997,7 @@ def evaluate_qos(self, connections_download, connections_upload, drop_a_per, dro 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+=1 + 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}")}) @@ -1019,7 +1019,7 @@ 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 + 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[counter]) @@ -1030,7 +1030,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 + 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}")}) From a24c6eb2ac6a828ea8607c3c95a8250d1f138d0f Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Wed, 25 Jun 2025 19:39:30 +0530 Subject: [PATCH 020/376] lf_mixed_traffic.py: In http for real devices updated key. -updated key from 'rx_rate' to 'rx rate (1m)' to match HTTP test. Signed-off-by: Sidartha-CT --- py-scripts/lf_mixed_traffic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/lf_mixed_traffic.py b/py-scripts/lf_mixed_traffic.py index 17437a332..6d61a6424 100755 --- a/py-scripts/lf_mixed_traffic.py +++ b/py-scripts/lf_mixed_traffic.py @@ -1368,7 +1368,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') From 6bf5eb61e04fadef59cd35a9018ca6cf0540bb94 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 26 Jun 2025 14:17:20 -0600 Subject: [PATCH 021/376] py-scripts/lf_interop_pdu_automation.py LAN-3257 fails lf_check_help.bash on F27 added exception for ModuleNotFound to work around the --help Verified: ./lf_interop_pdu_automation.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_interop_pdu_automation.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/py-scripts/lf_interop_pdu_automation.py b/py-scripts/lf_interop_pdu_automation.py index 2140cadd8..e09a5b738 100755 --- a/py-scripts/lf_interop_pdu_automation.py +++ b/py-scripts/lf_interop_pdu_automation.py @@ -23,6 +23,12 @@ 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: def __init__(self, hostname, user, password): From b65279f238b50a444f9b02efb00c1e785b481c8b Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 26 Jun 2025 15:58:33 -0600 Subject: [PATCH 022/376] py-scripts/lf_interop_pdu_automation.py removed duplicate import that was introduced with rebase Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_interop_pdu_automation.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/py-scripts/lf_interop_pdu_automation.py b/py-scripts/lf_interop_pdu_automation.py index e09a5b738..ca82e1da9 100755 --- a/py-scripts/lf_interop_pdu_automation.py +++ b/py-scripts/lf_interop_pdu_automation.py @@ -21,8 +21,6 @@ from typing import Sequence from typing import Optional -import dlipower - try: import dlipower except ModuleNotFoundError: From 1b833a5cde2cc14e3a3d4383989072d97086ae81 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 26 Jun 2025 16:58:46 -0600 Subject: [PATCH 023/376] py-scripts/lf_interop_pdu_automation.py removed flake8: noqa, flake8 updates Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_interop_pdu_automation.py | 26 +++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/py-scripts/lf_interop_pdu_automation.py b/py-scripts/lf_interop_pdu_automation.py index ca82e1da9..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,6 +22,7 @@ import argparse from typing import Sequence from typing import Optional +import traceback try: import dlipower @@ -41,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) @@ -77,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: @@ -90,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: From 71418ef958d5237f0fba58baa5a47d716803bc98 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Mon, 16 Jun 2025 14:49:40 -0700 Subject: [PATCH 024/376] test_group_profile.py: identifies spot where single items will break a script --- py-json/test_group_profile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/py-json/test_group_profile.py b/py-json/test_group_profile.py index a79f54a79..4cbbe37c5 100644 --- a/py-json/test_group_profile.py +++ b/py-json/test_group_profile.py @@ -56,6 +56,7 @@ 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"] for group in test_groups: From 3e8e3500e3d809ea8a64534c695489295bc8f9d3 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 12:12:13 -0600 Subject: [PATCH 025/376] py-scripts/test_l3_longevity.py LAN-3597 flake8 complient Verification Automation Signed-off-by: Chuck SmileyRekiere --- py-scripts/test_l3_longevity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/test_l3_longevity.py b/py-scripts/test_l3_longevity.py index 269376940..cf2a6ff4b 100755 --- a/py-scripts/test_l3_longevity.py +++ b/py-scripts/test_l3_longevity.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa +# flake8: noqa: E501 """ ## NAME: test_l3_longevity.py From fa47d97e40745e39f12daa5b5c6b15b4bb878db5 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 12:28:44 -0600 Subject: [PATCH 026/376] py-json/test_group_profile.py modified flake8: noqa to flake8: noqa: E501 this will ignore the extra long lines yet will allow for white space checks. Verification: ./testgroup.py\ --mgr 192.168.50.103\ --num_stations 2\ --ssid ax88u_5g\ --passwd lf_ax88u_5g\ --security wpa2\ --radio wiphy1\ --add_group\ --group_name group1\ --start_group group1 Signed-off-by: Chuck SmileyRekiere --- py-json/test_group_profile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-json/test_group_profile.py b/py-json/test_group_profile.py index 4cbbe37c5..5e193274d 100644 --- a/py-json/test_group_profile.py +++ b/py-json/test_group_profile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# flake8: noqa +# flake8: noqa: E501 import sys import os import importlib From fb41ba52bd54722a262a490ca2701a7931e208eb Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 12:53:32 -0600 Subject: [PATCH 027/376] py-json/test_group_profile.py flake8 compliant, originally tried to change per file. Verification: Verification: ./testgroup.py\ --mgr 192.168.50.103\ --num_stations 2\ --ssid ax88u_5g\ --passwd lf_ax88u_5g\ --security wpa2\ --radio wiphy1\ --add_group\ --group_name group1\ --start_group group1 Signed-off-by: Chuck SmileyRekiere --- py-json/test_group_profile.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/py-json/test_group_profile.py b/py-json/test_group_profile.py index 5e193274d..69c572d11 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: E501 import sys import os import importlib @@ -12,7 +11,7 @@ class TestGroupProfile(LFCliBase): - def __init__(self, lfclient_host, lfclient_port, local_realm, test_group_name=None, debug_=False): + def __init__(self, lfclient_host, lfclient_port, local_realm, test_group_name=None, debug_=False): # noqa: 501 super().__init__(lfclient_host, lfclient_port, debug_) self.local_realm = local_realm self.group_name = test_group_name @@ -20,43 +19,44 @@ 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}) # noqa: 501 + self.local_realm.json_post("/cli-json/start_group", {"name": self.group_name}) # noqa: 501 else: raise ValueError("test_group name must be set.") def quiesce_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/quiesce_group", {"name": self.group_name}) + self.local_realm.json_post("/cli-json/quiesce_group", {"name": self.group_name}) # noqa: 501 else: raise ValueError("test_group name must be set.") def stop_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/stop_group", {"name": self.group_name}) + self.local_realm.json_post("/cli-json/stop_group", {"name": self.group_name}) # noqa: 501 else: raise ValueError("test_group name must be set.") def create_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/add_group", {"name": self.group_name}) + self.local_realm.json_post("/cli-json/add_group", {"name": self.group_name}) # noqa: 501 else: raise ValueError("test_group name must be set.") def rm_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/rm_group", {"name": self.group_name}) + self.local_realm.json_post("/cli-json/rm_group", {"name": self.group_name}) # noqa: 501 else: raise ValueError("test_group name must be set.") def add_cx(self, cx_name): - self.local_realm.json_post("/cli-json/add_tgcx", {"tgname": self.group_name, "cxname": cx_name}) + self.local_realm.json_post("/cli-json/add_tgcx", {"tgname": self.group_name, "cxname": cx_name}) # noqa: 501 def rm_cx(self, cx_name): - self.local_realm.json_post("/cli-json/rm_tgcx", {"tgname": self.group_name, "cxname": cx_name}) + self.local_realm.json_post("/cli-json/rm_tgcx", {"tgname": self.group_name, "cxname": cx_name}) # noqa: 501 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 + # This breaks on only one existing group, this expects an array not a single object # noqa: 501 if test_groups is not None and "groups" in test_groups: test_groups = test_groups["groups"] for group in test_groups: From 85d3d3b4aabd6120ddc3afa936f0b2099013cc3a Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 12:59:27 -0600 Subject: [PATCH 028/376] py-scripts/test_l3_longevity.py flake8 complience Verification: Automation Signed-off-by: Chuck SmileyRekiere --- py-scripts/test_l3_longevity.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/py-scripts/test_l3_longevity.py b/py-scripts/test_l3_longevity.py index cf2a6ff4b..505e447e5 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: E501 """ ## NAME: test_l3_longevity.py @@ -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" From 3d61f707e3e9799ffbacba5e8bd4b4c1d3b22840 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 13:02:34 -0600 Subject: [PATCH 029/376] py-json/test_group_profile.py flake8 compliance without individual line exceptions. Verification: ./testgroup.py\ --mgr 192.168.50.103\ --num_stations 2\ --ssid ax88u_5g\ --passwd lf_ax88u_5g\ --security wpa2\ --radio wiphy1\ --add_group\ --group_name group1\ --start_group group1 Signed-off-by: Chuck SmileyRekiere --- py-json/test_group_profile.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/py-json/test_group_profile.py b/py-json/test_group_profile.py index 69c572d11..7086c9d5e 100644 --- a/py-json/test_group_profile.py +++ b/py-json/test_group_profile.py @@ -11,7 +11,7 @@ class TestGroupProfile(LFCliBase): - def __init__(self, lfclient_host, lfclient_port, local_realm, test_group_name=None, debug_=False): # noqa: 501 + def __init__(self, lfclient_host, lfclient_port, local_realm, test_group_name=None, debug_=False): super().__init__(lfclient_host, lfclient_port, debug_) self.local_realm = local_realm self.group_name = test_group_name @@ -19,44 +19,44 @@ 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}) # noqa: 501 - self.local_realm.json_post("/cli-json/start_group", {"name": self.group_name}) # noqa: 501 + 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.") def quiesce_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/quiesce_group", {"name": self.group_name}) # noqa: 501 + self.local_realm.json_post("/cli-json/quiesce_group", {"name": self.group_name}) else: raise ValueError("test_group name must be set.") def stop_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/stop_group", {"name": self.group_name}) # noqa: 501 + self.local_realm.json_post("/cli-json/stop_group", {"name": self.group_name}) else: raise ValueError("test_group name must be set.") def create_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/add_group", {"name": self.group_name}) # noqa: 501 + self.local_realm.json_post("/cli-json/add_group", {"name": self.group_name}) else: raise ValueError("test_group name must be set.") def rm_group(self): if self.group_name is not None: - self.local_realm.json_post("/cli-json/rm_group", {"name": self.group_name}) # noqa: 501 + self.local_realm.json_post("/cli-json/rm_group", {"name": self.group_name}) else: raise ValueError("test_group name must be set.") def add_cx(self, cx_name): - self.local_realm.json_post("/cli-json/add_tgcx", {"tgname": self.group_name, "cxname": cx_name}) # noqa: 501 + self.local_realm.json_post("/cli-json/add_tgcx", {"tgname": self.group_name, "cxname": cx_name}) def rm_cx(self, cx_name): - self.local_realm.json_post("/cli-json/rm_tgcx", {"tgname": self.group_name, "cxname": cx_name}) # noqa: 501 + self.local_realm.json_post("/cli-json/rm_tgcx", {"tgname": self.group_name, "cxname": 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 # noqa: 501 + # 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"] for group in test_groups: From 971ac103f792f9262d882c459e3cc9f76636fdcd Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 17:02:04 -0600 Subject: [PATCH 030/376] py-scripts/lf_kpi_csv.py flake8 complient Verification: ./lf_kpi_csv.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_kpi_csv.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 From cb1813e27ce009bb0ac29d7ad0d32f08f117a0f9 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 17:37:24 -0600 Subject: [PATCH 031/376] py-scripts/tools/lf_qa.py flake8 compliance Verified: ./lf_qa.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_qa.py | 99 ++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 59 deletions(-) diff --git a/py-scripts/tools/lf_qa.py b/py-scripts/tools/lf_qa.py index bc7b2c3ff..a67721f62 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( @@ -933,7 +918,7 @@ def generate_graph_png(self): 'Subtest-Pass', 'Subtest-Fail', 'kernel' - ], + ], color="short-description", hover_name="short-description", size_max=60)).update_traces( @@ -958,12 +943,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 +970,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 +1005,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 +1081,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 +1119,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 +1148,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 +1203,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 +1216,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() From 64f04c9a2359e2a2ff997e14abad258b4a20367a Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 18:12:23 -0600 Subject: [PATCH 032/376] py-scripts/tools/lf_check.py flake8 compliance Validation: ./lf_check.py --help Automation Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_check.py | 113 ++++++++++++----------------------- 1 file changed, 39 insertions(+), 74 deletions(-) diff --git a/py-scripts/tools/lf_check.py b/py-scripts/tools/lf_check.py index 647c48649..d0588f4c1 100755 --- a/py-scripts/tools/lf_check.py +++ b/py-scripts/tools/lf_check.py @@ -1,5 +1,4 @@ #!/usr/bin/python3 -# flake8: noqa ''' 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 [{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( # 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 = "[{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( # 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 @@ -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,7 +1886,7 @@ 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() @@ -2157,14 +2145,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 +2160,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 +2178,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 +2204,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 +2215,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( @@ -2350,7 +2333,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 +2356,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 +2388,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, @@ -2518,7 +2498,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 +2543,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 +2555,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 +2670,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 +2743,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 +2833,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 +2842,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 +2849,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 +2883,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 +2919,23 @@ 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: + new_allure_latest_dir = shutil.copytree(report.allure_report_dir, allure_latest_dir, dirs_exist_ok=True) + except BaseException: # fedora 27 does no except the directory being present 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 +2944,14 @@ 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 BaseException: # 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() From c0aa7a9707a8821e8cd4770000e9cc9b2c208732 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 18:59:17 -0600 Subject: [PATCH 033/376] py-scripts/tools/lf_inspect.py flake8 compliance Verification: Automation ./lf_inspect.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_inspect.py | 321 +++++++++++++-------------------- 1 file changed, 130 insertions(+), 191 deletions(-) diff --git a/py-scripts/tools/lf_inspect.py b/py-scripts/tools/lf_inspect.py index ff5c1a75e..94d982689 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") @@ -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) @@ -70,8 +65,7 @@ def __init__(self, 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 +131,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 +139,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,21 +189,13 @@ 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 += """ """ - def finish_junit_testsuites(self): - self.junit_results += """ - - """ - - #def start_junit_testsuite(self): + # def start_junit_testsuite(self): # self.junit_results += """ # # """.format(suite=self.test_suite) @@ -239,16 +205,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 +228,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 +239,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 +264,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 +295,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 +310,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 +340,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 +358,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 +399,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 +504,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 +524,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 +582,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 +594,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 +615,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 +634,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 +667,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 +773,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 +784,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 +886,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 +901,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 +929,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 +948,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 +978,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 +1090,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 +1200,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 +1247,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 +1256,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 +1267,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 +1295,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 +1348,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 +1370,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 +1385,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 +1399,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 +1432,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 +1446,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 +1481,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 +1505,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 +1520,6 @@ def main(): report.set_text(allure_info) report.build_text_simple() - - report.build_footer() html_report = report.write_html_with_timestamp() @@ -1587,14 +1527,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)) From 15cc39347b74bfbcdd3201e5bb3edb21e43b9096 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 19:04:57 -0600 Subject: [PATCH 034/376] py-scripts/create_l3.py flake8 compliance Verification: ./create_l3.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/create_l3.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) 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. ''' From 7ac25e679e2d78dddfd9ebb341750b3a0f53128a Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 19:10:57 -0600 Subject: [PATCH 035/376] py-scripts/create_l4.py removed # flake8: noqa line Verification: ./create_l4.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/create_l4.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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() From 7c3e7b1bb2d7322f2ed191fcb19f5b60b41c7222 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 19:15:40 -0600 Subject: [PATCH 036/376] py-scripts/create_vr.py flake8 compliance Verification: ./create_vr.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/create_vr.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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') From 6490157fbe263fba823d34a23501a672c818c507 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 19:32:29 -0600 Subject: [PATCH 037/376] py-scripts/create_vap.py flake8 compliance Verification: ./create_vap.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/create_vap.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) 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() From 8445a9abcb45b587e97ef6564c197774ec79226c Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 28 Jun 2025 20:00:13 -0600 Subject: [PATCH 038/376] py-scripts/lf_interop_rvr_test.py flake8 compliance Note the example in the script is incorrect. Verification: ./lf_interop_rvr_test.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_interop_rvr_test.py | 220 +++++++++++++++--------------- 1 file changed, 107 insertions(+), 113 deletions(-) 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() From 1ca342f4bd622513c7658143206c8c04fdd8ed88 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 07:41:50 -0600 Subject: [PATCH 039/376] py-scripts/tools/lf_inspect.py added back in finish_junit_testsuites(self): which was accidently removed. testing: Verification Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_inspect.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/py-scripts/tools/lf_inspect.py b/py-scripts/tools/lf_inspect.py index 94d982689..4378e3732 100755 --- a/py-scripts/tools/lf_inspect.py +++ b/py-scripts/tools/lf_inspect.py @@ -195,6 +195,11 @@ def start_junit_testsuites(self): """ + def finish_junit_testsuites(self): + self.junit_results += """ + + """ + # def start_junit_testsuite(self): # self.junit_results += """ # From 656852928fc7d852ec3c0196e973475d51fa39ef Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:08:02 -0600 Subject: [PATCH 040/376] py-scripts/tools/lf_test_gen/lf_test_gen.py flake8 compliance Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_test_gen.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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..7690f465b 100755 --- a/py-scripts/tools/lf_test_gen/lf_test_gen.py +++ b/py-scripts/tools/lf_test_gen/lf_test_gen.py @@ -1,11 +1,8 @@ #!/usr/bin/python3 -# flake8: noqa import tkinter from tkinter import messagebox from tkinter import ttk -from tkinter import StringVar -import requests import importlib import sys import os @@ -81,11 +78,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 +336,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 +379,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 +389,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 From 93ae1034a4c1998c1c5159c938af2b5fad38d6ab Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:11:08 -0600 Subject: [PATCH 041/376] py-scripts/tools/lf_test_gen/lf_logger_config.py removed flake8: noqa Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_logger_config.py | 1 - 1 file changed, 1 deletion(-) 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 From 9da93114047507155b6a186d699544903cb8e063 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:15:13 -0600 Subject: [PATCH 042/376] py-scripts/tools/lf_test_gen/lf_create_wc_tab.py flake8 compliance Verification: ./lf_test_gen.py --radio_count 20 and used the WC tab Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_wc_tab.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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) From 91e1ed78e73649fa2cdf5eb22d78e131b4a1a2bc Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:16:46 -0600 Subject: [PATCH 043/376] py-scripts/tools/lf_test_gen/lf_create_wc_json.py removed the flake8: noqa line Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_wc_json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 972f94217d00b1ce015a39d5c8b9042ac583e07e Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:18:21 -0600 Subject: [PATCH 044/376] py-scripts/tools/lf_test_gen/lf_create_rig_tab.py flake8 compliance Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_rig_tab.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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") From e15a540e66b889c5cddb121c4d9ed26c7487ac74 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:19:35 -0600 Subject: [PATCH 045/376] py-scripts/tools/lf_test_gen/lf_create_rig_json.py removed flake8: noqa Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_rig_json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 16b9b398f2079ea6c9f70f3ec8351c05ae1dbbc3 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:24:12 -0600 Subject: [PATCH 046/376] py-scripts/tools/lf_test_gen/lf_create_radio_frame.py flake8 compliance Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- .../tools/lf_test_gen/lf_create_radio_frame.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) 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 92cd574ef..b1a539229 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("") @@ -275,7 +269,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: From e8df39543d6e598b27d8c1a588a6fe45e9cd2a61 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:25:57 -0600 Subject: [PATCH 047/376] py-scripts/tools/lf_test_gen/lf_create_dut_tab.py flake8 compliance Verificaiton: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_dut_tab.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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") From 3b49f1da44d8464edbf94dbed43d7fd1cbaa5bbb Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:27:37 -0600 Subject: [PATCH 048/376] py-scripts/tools/lf_test_gen/lf_create_dut_json.py flake8 compliance Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_dut_json.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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") From 28f0ea32a07481e2657c1825b756d7ef6f2f2698 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:29:45 -0600 Subject: [PATCH 049/376] py-scripts/tools/lf_test_gen/lf_create_dp_rvr_tab.py flake8 complient Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_dp_rvr_tab.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 From c92f7c5e5e8a4b411fcc21c26a84c7540e01328a Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:35:10 -0600 Subject: [PATCH 050/376] py-scripts/tools/lf_test_gen/lf_create_dp_rvr_json.py removed flake8: noqa Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_dp_rvr_json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From cdd406b932c4463322f58efb728e3fb2b0cbfa6f Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:40:21 -0600 Subject: [PATCH 051/376] py-scripts/tools/lf_test_gen/lf_create_ap_auto_tab.py flake8 compliance Verified: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- .../lf_test_gen/lf_create_ap_auto_tab.py | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) 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 != "": From 95b3b11888a1608d087f16861e4586c3e4dcfbe4 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 08:42:45 -0600 Subject: [PATCH 052/376] py-scripts/tools/lf_test_gen/lf_create_ap_auto_json.py flake8 compliance Verification: ./lf_test_gen.py --radio_count 20 Signed-off-by: Chuck SmileyRekiere --- .../lf_test_gen/lf_create_ap_auto_json.py | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) 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): From 826ee53bc69c53111ad9c0cff91c24bab49afd5f Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 17:24:41 -0600 Subject: [PATCH 053/376] py-scripts/lf_json_util.py flake8 compliance Verification: ./lf_json_util.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_json_util.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/py-scripts/lf_json_util.py b/py-scripts/lf_json_util.py index 91257e9bb..f478a70ad 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. @@ -15,17 +14,18 @@ def standardize_json_results(results): f'''{help_summary} TODO: Add functionality to handle other plural vs singular data representations ''' - if 'endpoints' not in results: + 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(): parser = argparse.ArgumentParser( @@ -34,7 +34,7 @@ def main(): 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 +42,3 @@ def main(): if __name__ == "__main__": main() - From fd4a6f9a154c5f611a07dc1f4020f88c393e13f1 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 17:28:04 -0600 Subject: [PATCH 054/376] py-scripts/measure_station_time_up.py flake8 compliance Verification: ./measure_station_time_up.py --ehlp Signed-off-by: Chuck SmileyRekiere --- py-scripts/measure_station_time_up.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) 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() From c607cf943cd9194c0a1b05801e954daad2bb4b72 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 17:30:15 -0600 Subject: [PATCH 055/376] py-scripts/test_l3_WAN_LAN.py flake8 compliance Verification: ./test_l3_WAN_LAN.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/test_l3_WAN_LAN.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/py-scripts/test_l3_WAN_LAN.py b/py-scripts/test_l3_WAN_LAN.py index 9c0677e1d..35db68b71 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 @@ -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) From f2d061f66de3362284bed891e353a04968b2c6c8 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 21:08:41 -0600 Subject: [PATCH 056/376] py-scripts/lf_interop_real_browser_test.py flake8 compliance Verification: on CT-US-008 the --url is the upstream port with html enabled. ./lf_interop_real_browser_test.py\ --mgr 192.168.101.137\ --url 1.2.eth1\ --duration 1m --debug selected all for the interop devices Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_interop_real_browser_test.py | 445 ++++++++++----------- 1 file changed, 213 insertions(+), 232 deletions(-) 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() From 77c598091da580035174d3bf9cfd1e873a30a38e Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 29 Jun 2025 21:27:41 -0600 Subject: [PATCH 057/376] py-scripts/lf_graph.py flake8 compliance Verification: ./lf_graph.py --mgr 192.168.100.116 Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_graph.py | 119 ++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 61 deletions(-) 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() From cf2674416b9ab9c267afb2e79a21d77791ab9985 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 30 Jun 2025 09:47:18 -0600 Subject: [PATCH 058/376] py-scripts/create_l3_stations.py flake8 compliance Verification: ./create_l3_stations.py\ --mgr 192.168.50.103\ --num_stations 5\ --radio 1.1.wiphy1\ --ssid ax88u_5g\ --password lf_ax88u_5g\ --security wpa2\ --no_cleanup Signed-off-by: Chuck SmileyRekiere --- py-scripts/create_l3_stations.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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() From 00487e165a7ff292879d9d5f05b003c60c2c36d6 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 30 Jun 2025 09:55:21 -0600 Subject: [PATCH 059/376] py-scripts/lf_report_test.py flake8 compliance Verification: ./lf_report_test.py (this will create a sample report in /home/lanforge) Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_report_test.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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() From 272d8139e72be9f464a25ff854262bdfca31bb07 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 30 Jun 2025 10:28:50 -0600 Subject: [PATCH 060/376] py-scripts/test_l4.py flake8 compliance Verification: ./test_l4.py\ --mgr 192.168.50.103\ --upstream_port 1.1.eth2\ --radio 1.1.wiphy1\ --num_stations 3\ --security wpa2\ --ssid ax88u_5g\ --passwd lf_ax88u_5g\ --test_duration 1m\ --url "ul http://upstream_port_ip /dev/null"\ --requests_per_ten 600\ --test_type bytes-wr\ --debug Signed-off-by: Chuck SmileyRekiere --- py-scripts/test_l4.py | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/py-scripts/test_l4.py b/py-scripts/test_l4.py index 8b2ad4858..b82a75839 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 @@ -114,8 +113,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 @@ -193,7 +192,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 @@ -252,9 +250,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 +352,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: @@ -444,7 +440,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']] != "": @@ -734,7 +730,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 +885,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)) @@ -948,7 +944,6 @@ def main(): 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 +957,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 +991,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() From 6cf960bdd501fdd0fc13e3492985224ce24e4bb6 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 30 Jun 2025 10:51:47 -0600 Subject: [PATCH 061/376] py-scripts/lf_rf_char.py fixed parameter checks Verification: ./lf_rf_char.py\ --lf_mgr 192.168.50.104\ --vap_port 1.1.vap0000\ --vap_radio 1.1.wiphy1\ --vap_channel 36\ --vap_antenna 4x4\ --duration 10s\ --polling_interval 1s\ --frame 1400\ --frame_interval .01 Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_rf_char.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/py-scripts/lf_rf_char.py b/py-scripts/lf_rf_char.py index 8e73a040c..e3c6d1b53 100755 --- a/py-scripts/lf_rf_char.py +++ b/py-scripts/lf_rf_char.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 # flake8: noqa - """ NAME: lf_rf_test.py @@ -1194,7 +1193,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 +1208,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."): @@ -1457,10 +1459,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), @@ -2547,7 +2549,7 @@ def main(): ''' 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) From f8cabc83bbd33563a7cad4d92ae53073005a39de Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 30 Jun 2025 11:25:32 -0600 Subject: [PATCH 062/376] py-scripts/lf_rf_char.py flake8 compliance ./lf_rf_char.py\ --lf_mgr 192.168.50.104\ --vap_port 1.1.vap0000\ --vap_radio 1.1.wiphy1\ --vap_channel 36\ --vap_antenna 4x4\ --duration 10s\ --polling_interval 1s\ --frame 1400\ --frame_interval .01 Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_rf_char.py | 129 ++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 68 deletions(-) diff --git a/py-scripts/lf_rf_char.py b/py-scripts/lf_rf_char.py index e3c6d1b53..2a1c45f70 100755 --- a/py-scripts/lf_rf_char.py +++ b/py-scripts/lf_rf_char.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa """ NAME: lf_rf_test.py @@ -36,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 @@ -47,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") @@ -127,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 @@ -139,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, @@ -197,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 @@ -235,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. @@ -262,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") @@ -284,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]] = [] @@ -344,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 @@ -393,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) @@ -407,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 @@ -527,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, @@ -545,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. @@ -568,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: @@ -603,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 @@ -627,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": @@ -652,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)) @@ -675,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()): @@ -686,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: @@ -706,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, @@ -720,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. @@ -729,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 @@ -748,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) @@ -759,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. @@ -769,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, @@ -856,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) @@ -909,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'] @@ -919,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]] @@ -971,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) @@ -984,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 @@ -1014,6 +1006,7 @@ def num_sort(strn): return int(computed_num[0]) return -1 + def length_sort(strn): return len(strn[0]) @@ -1259,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) @@ -1328,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, @@ -1345,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 @@ -1478,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, '')) @@ -1520,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) @@ -2544,7 +2537,7 @@ 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: From 4ec7d41cd329e0e08b2b2f184153bc1a5e233ab5 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 30 Jun 2025 15:53:44 -0600 Subject: [PATCH 063/376] py-scripts/lf_logger_config.py flake8 compliance Verification: ./lf_logger_config.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_logger_config.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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() From e568421824c5edef12b5bc440366fa56f852f543 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 3 Jul 2025 11:10:36 -0600 Subject: [PATCH 064/376] py-scripts/test_l3_unicast_traffic_gen.py flake8 compliant This script should be moved to Scripts deprecated, test_l3.py has the unicast functionality. Verification: ./test_l3_unicast_traffic_gen.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/test_l3_unicast_traffic_gen.py | 200 ++++++++++------------ 1 file changed, 95 insertions(+), 105 deletions(-) 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() From cb751649d20e0f420252544543e1ebd16b6089d9 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 3 Jul 2025 16:08:49 -0600 Subject: [PATCH 065/376] 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 fixed the batch size ath10k supports 64 stations Verification: Automation Signed-off-by: Chuck SmileyRekiere --- .../ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json index 27e88d9a1..277358ed2 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/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":{ @@ -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 @@ " " ] } - } + } } } From 62ee068ed78f848fd785e5cee14fc6b4d1639c8d Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 11:17:43 -0600 Subject: [PATCH 066/376] py-scripts/lf_test_generic.py flake8 compliance Note: tried examples in script will use as a separate task to work out station creation issues. Verification: ./lf_test_generic.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_test_generic.py | 653 +++++++++++++++++----------------- 1 file changed, 324 insertions(+), 329 deletions(-) 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() From 65d52ed927c155d553c2b39b4b0cd17b2e3f5276 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 13:47:47 -0600 Subject: [PATCH 067/376] py-scripts/lf_mixed_traffic.py flake8 complience Verification: ./lf_mixed_traffic.py\ --mgr 192.168.50.100\ --twog_ssid ax1800_2g\ --twog_passwd lf_ax1800_2g\ --twog_security wpa2\ --twog_radio wiphy0\ --twog_num_stations 5\ --fiveg_ssid ax1800_5g\ --fiveg_passwd lf_ax1800_5g\ --fiveg_security wpa2\ --fiveg_radio wiphy2\ --fiveg_num_stations 5\ --band 2.4G,5G\ --tests 1\ --target 192.168.50.102\ --ping_interval 5\ --upstream_port 1.1.eth2\ --side_b_min_bps 3000000\ --side_a_min 1000000\ --side_b_min 1000000\ --traffic_type lf_tcp\ --tos "VI"\ --ftp_file_sizes 10MB\ --http_file_size 5MB\ --direction Download\ --mc_tos "BE"\ --virtual\ --qos_serial\ --mixed_traffic_loop 1\ --ping_test_duration 1m\ --qos_test_duration 30s\ --ftp_test_duration 30s\ --http_test_duration 30s\ --multicast_test_duration 30s\ --pre_cleanup Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_mixed_traffic.py | 62 +++++++++++++++++----------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/py-scripts/lf_mixed_traffic.py b/py-scripts/lf_mixed_traffic.py index 6d61a6424..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): @@ -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(): From a72fae4f3f22f01a3679b2e590f2906b99fb0710 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 15:43:08 -0600 Subject: [PATCH 068/376] py-scripts/testgroup.py flake8 compliance Verification: ./testgroup.py\ --mgr 192.168.50.100\ --num_stations 2\ --ssid ax1800_5g\ --passwd lf_ax1800_5g\ --security wpa2\ --radio wiphy1\ --add_group\ --group_name group1\ --start_group group1 Signed-off-by: Chuck SmileyRekiere --- py-scripts/testgroup.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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.") From 8416811cca4c73ca8b0190e34369d089dbe7f8cb Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 16:15:03 -0600 Subject: [PATCH 069/376] py-scripts/lf_ftp.py flake8 compliance Note: the --result_dir does not work, the graphs are a fixed size, do not grow with the amount of data For the most part the example worked Verification: lf_ftp.py 5g ./lf_ftp.py\ --ssid ax1800_5g\ --passwd lf_ax1800_5g\ --file_sizes 10MB\ --mgr 192.168.50.100\ --traffic_duration 1m\ --security wpa2\ --fiveg_radio wiphy2\ --directions Upload\ --clients_type Virtual\ --ap_name ASUS\ --bands 5G\ --num_stations 19\ --upstream_port eth2\ --result_dir "/home/lanforge/html-reports/ct_mc_100/" Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_ftp.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 27c1169be..2ea60c3c3 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 @@ -2665,7 +2664,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 @@ -2837,7 +2836,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] From 0bfe876ac4cbd17fd9d909c710e7c17fa977bb81 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 16:21:14 -0600 Subject: [PATCH 070/376] py-scripts/update_dependencies.py flake8 compliance Verification: ./update_dependencies.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/update_dependencies.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) 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(): From 13c4fe9e0fb5b16b9718cdb3484bffd9af94f758 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 16:27:14 -0600 Subject: [PATCH 071/376] py-scripts/lf_csv.py flake8 compliance Note: commented out the from pandas import * , it appears that the pandas read_csv was the method used , so did pd.read_csv . Verification: ./lf_csv.py (note this will exeserize the methods in the file) Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_csv.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/py-scripts/lf_csv.py b/py-scripts/lf_csv.py index 5f4ee656e..fb89827e4 100755 --- a/py-scripts/lf_csv.py +++ b/py-scripts/lf_csv.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# flake8: noqa ''' NAME: lf_csv.py @@ -21,7 +20,7 @@ ''' import pandas as pd -from pandas import * +# from pandas import * from csv import reader import csv import argparse @@ -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,15 +92,15 @@ def main(): epilog='''\ The lf_csv is used to generate csv report of the lanforge test results ''', - description=''' + 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 + This file should should be imported by the file running the test and data can be passed while creating the object EXAMPLE: - # CLI To run the lf_csv to generate the csv file + # CLI To run the lf_csv to generate the csv file python3 lf_csv.py ''') parser.add_argument('--help_summary', help='Show summary of what this script does', default=None, From 125e12383c699375f29e28d0629d7fc50b362118 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 16:33:47 -0600 Subject: [PATCH 072/376] py-scripts/tools/ct_dut_json/lf_create_dut_json.py flake8 compliance Verification: ./lf_create_dut_json.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_dut_json/lf_create_dut_json.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/py-scripts/tools/ct_dut_json/lf_create_dut_json.py b/py-scripts/tools/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/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( From 5b36a08b9e4d7a113e309495f3193b8d186c8a59 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 16:38:35 -0600 Subject: [PATCH 073/376] py-scripts/tools/ct_rig_json/lf_create_rig_json.py flake8 compliance Verification: ./lf_create_rig_json.py --help Signed-off-by: Chuck SmileyRekiere --- .../tools/ct_rig_json/lf_create_rig_json.py | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/py-scripts/tools/ct_rig_json/lf_create_rig_json.py b/py-scripts/tools/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/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, From 3819269e54ee0e9dd9f7bb2d506aafc163eab5b5 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 16:56:31 -0600 Subject: [PATCH 074/376] py-scripts/tools/lf_cli_to_launchjson.py flake8 compliance Verification: ./lf_cli_to_launchjson.py --cli Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_cli_to_launchjson.py | 75 ++++++++++++------------ 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/py-scripts/tools/lf_cli_to_launchjson.py b/py-scripts/tools/lf_cli_to_launchjson.py index 61de992a8..6e1507046 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,70 @@ 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=["--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"], # noqa: E501 + list=[], + length_of_cli=[] + ): - self.cli_list=cli_list - self.list1=list - self.length_of_cli=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 +125,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() - - From 03e17413be79a3bd9d3136aceb7858e67944866b Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 4 Jul 2025 17:08:54 -0600 Subject: [PATCH 075/376] py-scripts/tools/lf_json_convert.py flake8 compliance Note: one line needed to change left original line line = line.replace('\&', '\\\&') This was for converting from json files for lf_check to be able to be placed into cookbooks Verified: ./lf_json_convert.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_json_convert.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) 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()
-    

From c2404f57848a4773e33d0ba95697f07e787740f2 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Fri, 4 Jul 2025 17:12:13 -0600
Subject: [PATCH 076/376] py-scripts/csv_processor.py flake8 compliance

Verified:
./csv_processor.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/csv_processor.py | 41 +++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 22 deletions(-)

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()

From 43ee2e93643d9a45eccd95b67ba1301acc69846b Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 16:49:39 -0600
Subject: [PATCH 077/376] py-scripts/lf_sniff_radio.py added traceback to
 remove the bare exception

Verified:
./lf_sniff_radio.py\
 --mgr 192.168.50.100\
 --mgr_port 8080\
 --radio wiphy2\
 --security wpa2\
 --ssid ax1800_5g\
 --password lf_ax1800_5g\
 --outfile /home/lanforge/test_sniff.pcap\
 --duration 20\
 --channel 52\
 --radio_mode AUTO\
 --monitor_name moni0a

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_sniff_radio.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py
index a785e5337..af5106c39 100755
--- a/py-scripts/lf_sniff_radio.py
+++ b/py-scripts/lf_sniff_radio.py
@@ -50,6 +50,7 @@
 import time
 import paramiko
 import logging
+import traceback
 
 
 logger = logging.getLogger(__name__)
@@ -460,7 +461,8 @@ def main():
                 sniff_snaplen_choice = bytesize
             else:
                 raise ValueError("bad sniff_bytes")
-        except:
+        except Exception as x:
+            traceback.print_exception(Exception, x, x.__traceback__, chain=True)
             print(f"Strange sniff length [{args.sniff_bytes}], please choose a positive value")
             exit(1)
 
@@ -491,4 +493,4 @@ def main():
 
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()

From 098096458a0ef5a5078a445afd64655feff5f03e Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 16:53:20 -0600
Subject: [PATCH 078/376] py-scripts/lf_sniff_radio.py flake8 compliance

Verified:

lf_sniff_radio.py

./lf_sniff_radio.py\
 --mgr 192.168.50.100\
 --mgr_port 8080\
 --radio wiphy2\
 --security wpa2\
 --ssid ax1800_5g\
 --password lf_ax1800_5g\
 --outfile /home/lanforge/test_sniff.pcap\
 --duration 20\
 --channel 52\
 --radio_mode AUTO\
 --monitor_name moni0a

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_sniff_radio.py | 37 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py
index af5106c39..f17c243c0 100755
--- a/py-scripts/lf_sniff_radio.py
+++ b/py-scripts/lf_sniff_radio.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# flake8: noqa
 """
     NAME:       lf_sniff_radio.py
     PURPOSE:    This script will sniff a Radio after changing the Radio settings.
@@ -100,8 +99,8 @@ 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
+        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:
@@ -375,7 +374,7 @@ 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()
 
@@ -402,20 +401,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()
 
@@ -431,7 +430,7 @@ def do_6ghz_workaround(args):
 def main():
     args = parse_args()
 
-    help_summary='''\
+    help_summary = '''\
      This script is intended to sniff the radio specified by the user on a particular channel for a specified duration.
     '''
     if args.help_summary:

From a5748f24facf41bd45676fa4c2a5ad0d288d0a58 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 18:04:31 -0600
Subject: [PATCH 079/376] py-scripts/lf_rssi_check.py flake8 compliance

Note: with the verification there is some possible limitations with the
script.  This would require some debug. So allowed the script to run
as long as necessary.  There will need to be separate debug.

Verification:

 ./lf_rssi_check.py  ct_us_008
 --radio "radio==1.2.wiphy0 stations==2 ssid==at7_2g ssid_pw==hello123 security==wpa3"
 ########################
./lf_rssi_check.py\
 --lfmgr 192.168.101.137\
 --test_duration 30s\
 --endp_type "lf_tcp,lf_udp"\
 --tos "BK VI"\
 --upstream_port 1.2.eth1\
 --radio "radio==1.2.wiphy1 stations==2 ssid==at7_5g ssid_pw==hello123 security==wpa3"\
 --test_duration 30s\
 --polling_interval 5s\
 --side_a_min_bps 256000\
 --side_b_min_bps 102400000\
 --channels '100'\
 --attenuators 1.1.3591\
 --atten_start 200\
 --atten_stop 301\
 --atten_step 100\
 --antennas 0\
 --vap 1.3.vap0001

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_rssi_check.py | 295 ++++++++++++++++--------------------
 1 file changed, 131 insertions(+), 164 deletions(-)

diff --git a/py-scripts/lf_rssi_check.py b/py-scripts/lf_rssi_check.py
index 9a9891304..77e4831ac 100755
--- a/py-scripts/lf_rssi_check.py
+++ b/py-scripts/lf_rssi_check.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# flake8: noqa
 """
 NAME: lf_rssi_check.py
 
@@ -16,9 +15,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 +36,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 +147,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 +176,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 +232,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 +260,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 +276,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 +320,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 +449,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 +493,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 +574,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 +647,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 +894,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 +903,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 +1007,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 +1020,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 +1041,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 +1062,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 +1081,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 +1142,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 +1208,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 +1216,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 +1230,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 +1277,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 +1301,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 +1325,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 +1334,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 +1351,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 +1370,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 +1433,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 +1449,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 +1475,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 +1485,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 +1548,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 +1557,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 +1574,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 +1599,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 +1692,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 +1703,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 +1837,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 +2037,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 +2377,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 +2464,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 +2550,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 +2565,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 +2574,7 @@ def main():
                                     8: 'ABCD (4x4)'
                                 }
                                 default is 0
-                        ''', default= 0)
+                        ''', default=0)
 
     parser.add_argument(
         '--attenuators',
@@ -2617,7 +2590,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 +2657,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 +2666,6 @@ def main():
         print(help_summary)
         exit(0)
 
-
     # initialize pass / fail
     test_passed = False
 
@@ -2759,7 +2730,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 +2878,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 +2934,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 +3011,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 +3027,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 +3070,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 +3186,3 @@ def main():
 
 if __name__ == "__main__":
     main()
-
-

From 9715900c6d732e8a2a778c6d8cbec51aff398a03 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 22:26:05 -0600
Subject: [PATCH 080/376] py-scripts/lf_atten_mod_test.py flake8 compliance

Verification:

./lf_atten_mod_test.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_atten_mod_test.py | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

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:

From e5fef5a1883c030fb126f07f53c1691c8e2ec569 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 22:28:12 -0600
Subject: [PATCH 081/376] py-scripts/create_bond.py flake8 compliance

Verification:

./create_bond.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/create_bond.py | 1 -
 1 file changed, 1 deletion(-)

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
 

From 071b29b7972d82f9d9fb3bcd967416cdc8a82626 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 22:49:49 -0600
Subject: [PATCH 082/376] py-scripts/lf_interop_throughput.py flake8 compliance

Version:
./lf_interop_throughtput.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_interop_throughput.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py
index aa4d83a8a..f67d4ce0f 100755
--- a/py-scripts/lf_interop_throughput.py
+++ b/py-scripts/lf_interop_throughput.py
@@ -170,7 +170,7 @@
 
 from datetime import datetime, timedelta
 
-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")
 
 

From c243bcbc3999c7f47cb31f7fd1a10ee87072d0b3 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 23:10:10 -0600
Subject: [PATCH 083/376] py-scripts/lf_interop_throughput.py  flake8
 compliance

./lf_interop_throughput.py may be enhanced to support virtual clients

Verification:
./lf_interop_throughput.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_interop_throughput.py | 65 ++++++++++++++---------------
 1 file changed, 32 insertions(+), 33 deletions(-)

diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py
index f67d4ce0f..6f6edcecf 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
@@ -144,7 +143,6 @@
 import importlib
 import logging
 import json
-import pandas as pd
 import shutil
 import asyncio
 import csv
@@ -159,16 +157,16 @@
 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")
 lf_logger_config = importlib.import_module("py-scripts.lf_logger_config")
@@ -451,7 +449,7 @@ def phantom_check(self):
                     for (a, 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)
@@ -514,7 +512,7 @@ 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(',')
         # If self.device_list is provided, check availability against devices_available
@@ -533,7 +531,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 +565,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
@@ -745,7 +743,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()
 
@@ -870,7 +868,7 @@ def get_layer3_endp_data(self):
     def monitor(self, iteration, individual_df, device_names, incremental_capacity_list, overall_start_time, overall_end_time):
         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 = [], [], [], [], [], []  # 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")
@@ -938,7 +936,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
@@ -1221,7 +1219,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 = []
@@ -1415,14 +1413,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 +1431,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, 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",
@@ -1989,12 +1987,12 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca
 
             # 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 = []
@@ -2690,7 +2688,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.')
@@ -2741,7 +2739,8 @@ 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()
 
     loads = {}
     iterations_before_test_stopped_by_user = []
@@ -2869,16 +2868,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
 
@@ -2927,7 +2926,7 @@ def main():
             all_dataframes, test_stopped_by_user = throughput.monitor(i, individual_df, device_names, incremental_capacity_list, overall_start_time, overall_end_time)
 
             # 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)

From f0f0168f559aebe6d7efd5284b8ab2d0e1a91225 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 5 Jul 2025 23:13:42 -0600
Subject: [PATCH 084/376] py-scripts/rvr_scenario.py flake8 compliance

not many white space changes so --help sufficient

Verification:
./rvr_scenario.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/rvr_scenario.py | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

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)

From c454e30b4f676bd24dd4243cd861b68fdc4fd63f Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 09:36:44 -0600
Subject: [PATCH 085/376] py-scripts/bandsteering.py  flake8 compliance

This script appears to be a work in progress. Possibly move to
scripts deprecated.
Verification was attempted

Verified:

./bandsteering.py - may be broken

./bandsteering.py\
 --lfmgr 192.168.50.100\
 --radio wiphy0\
 --radio_2g wiphy1\
 --radio_5g wiphy2\
 --num_stations 3\
 --security open\
 --ssid ax1800_2g\
 --passwd BLANK

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/bandsteering.py | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/py-scripts/bandsteering.py b/py-scripts/bandsteering.py
index 4e5e9c272..ce691017e 100755
--- a/py-scripts/bandsteering.py
+++ b/py-scripts/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:
@@ -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()

From 6556cfa8cc5c816ac0f8b9e2142cf6a8d26ddd78 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 09:44:50 -0600
Subject: [PATCH 086/376] py-scripts/bandsteering.py updated bs_obj.py ->
 ./bandsteering.py

target to move to scripts deprecated

Verification:
./bandsteering.py\
 --lfmgr 192.168.50.100\
 --radio wiphy0\
 --num_stations 3\
 --security wpa2\
 --ssid ax1800_2g\
 --passwd lf_ax1800_2g

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/bandsteering.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/py-scripts/bandsteering.py b/py-scripts/bandsteering.py
index ce691017e..d7867b005 100755
--- a/py-scripts/bandsteering.py
+++ b/py-scripts/bandsteering.py
@@ -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

From 13598e8d608a4a6866781a62c8cccfa197213c62 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 10:05:27 -0600
Subject: [PATCH 087/376] py-scripts/run_cv_scenario.py flake8 compliance

Printed out the logging on the verification. This script worked pretty
much the first time. It would be helpful to investigate this script
a bit more

Verified:
[lf@fedora py-scripts]$ ./run_cv_scenario.py\
 --lfmgr 192.168.50.100\
 --port 8080\
 --lanforge_db DFLT\
 --cv_scenario ap_auto\
 --cv_test 'AP-Auto'\
 --test_profile DEFAULT
1751817690.838740 INFO     *  [cv sync]         run_cv_scenario.py 297
1751817690.863180 INFO     -  sleeping 4...     run_cv_scenario.py 279
1751817694.863842 INFO     *  [cv apply 'ap_auto']         run_cv_scenario.py 297
1751817695.791003 INFO     -  sleeping 4...     run_cv_scenario.py 279
1751817699.791433 INFO     *  [cv build]         run_cv_scenario.py 297
1751817699.956182 INFO     -  sleeping 4...     run_cv_scenario.py 279
1751817703.956777 INFO     Waiting for scenario to build...     run_cv_scenario.py 274
1751817703.982679 INFO     *  [cv sync]         run_cv_scenario.py 297
1751817704.011477 INFO     -  waiting to sync         run_cv_scenario.py 272
1751817704.011597 INFO     -  sleeping 4...     run_cv_scenario.py 279
1751817708.037048 INFO     *  [cv create 'AP-Auto' 'test_ref' 'true']         run_cv_scenario.py 297
1751817711.964311 INFO     -  sleeping 5...     run_cv_scenario.py 279
1751817716.964627 INFO     -  sleeping 2...     run_cv_scenario.py 279
1751817718.964969 INFO     - - - Clicking Start - - -         run_cv_scenario.py 272
1751817718.965145 INFO     *  [cv click test_ref Start]         run_cv_scenario.py 297
1751817721.203427 INFO     -  sleeping 5...     run_cv_scenario.py 279
1751817726.204045 INFO     -  sleeping 60...     run_cv_scenario.py 279
1751817786.204866 INFO     *  [cv get test_ref 'Report Location:']         run_cv_scenario.py 297
1751817786.237188 INFO     -  sleeping 5...     run_cv_scenario.py 279
1751817791.237497 INFO     *  [cv click test_ref 'Close']         run_cv_scenario.py 297
1751817791.402669 INFO     -  sleeping 1...     run_cv_scenario.py 279
1751817792.402956 INFO     *  [cv click test_ref Cancel]         run_cv_scenario.py 297
1751817792.631740 INFO     -  sleeping 1...     run_cv_scenario.py 279
1751817793.631997 INFO     exiting automation         run_cv_scenario.py 272
1751817793.632137 INFO     *  [exit]         run_cv_scenario.py 297
PASSED: report finished
1751817793.656531 INFO     PASSED: report finished lfcli_base.py 597

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/run_cv_scenario.py | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/py-scripts/run_cv_scenario.py b/py-scripts/run_cv_scenario.py
index 79ff28c15..5f00699c8 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 = []
@@ -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

From 33f5b19a9a8952652010919cc7932a06d66a230b Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 10:38:22 -0600
Subject: [PATCH 088/376] py-scripts/lf_add_profile.py  flake8 compliance

The frequency default may need to be -1 as compared to 0 .  Zero will
set the frequency to zero for the profile

Verification:
./lf_add_profile.py\
 --mgr 192.168.50.100\
 --mgr_port 8080\
 --lf_user lanforge\
 --lf_passwd lanforge\
 --antenna 4\
 --freq -1\
 --instance_count 1\
 --profile_flags 4105\
 --name Routed-AP-QA14\
 --profile_type routed_ap\
 --ssid vap\
 --passwd hello123\
 --dut Routed-AP-13\
 --text "Making a Routed-AP-13"\
 --log_level debug\
 --debug

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_add_profile.py | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/py-scripts/lf_add_profile.py b/py-scripts/lf_add_profile.py
index d73c9a01c..c78206325 100755
--- a/py-scripts/lf_add_profile.py
+++ b/py-scripts/lf_add_profile.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# flake8: noqa
 """
 NAME: lf_add_profile.py
 
@@ -62,16 +61,16 @@
 
 import importlib
 import argparse
-from pprint import pformat
+# 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")
@@ -194,7 +193,7 @@ def add_profile_notes(self,
 
 
 def main():
-    help_summary='''\
+    help_summary = '''\
      This script is helpful to create profiles on the lanforge device
     '''
     parser = argparse.ArgumentParser(
@@ -350,7 +349,7 @@ 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:
@@ -412,4 +411,4 @@ def main():
 
 
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()

From 6df78913410a6bfa2da941779d7e756a6367798b Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 10:41:41 -0600
Subject: [PATCH 089/376] py-scripts/lf_add_profile.py updated help for --freq
 for -1 is auto

Verification:
./lf_add_profile.py --help

 --freq FREQ           (add profile)WiFi frequency to be used, -1 means AUTO.

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_add_profile.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/lf_add_profile.py b/py-scripts/lf_add_profile.py
index c78206325..800d6a3b0 100755
--- a/py-scripts/lf_add_profile.py
+++ b/py-scripts/lf_add_profile.py
@@ -245,7 +245,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] ")

From 1fa5a35b52ba19e7b00d2a526b3a68ebf28ce651 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 10:54:53 -0600
Subject: [PATCH 090/376] py-scripts/lf_multipsk.py flake8 compliance

There are no examples in the scripts and the script states the
script is very specific for TIP.  See if the script exists in TIP
repo.  Or move to an examples type directory.

Verification:
./lf_multipsk.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_multipsk.py | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

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()
-

From 645c0f5417e538d615433938c908e8bb63cb8e52 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 11:25:18 -0600
Subject: [PATCH 091/376] py-scripts/lf_rssi_process.py  flake8 compliance

This script is a tool for processing rssi data. Possibly should live in
the tools directory

Verification:
./lf_rssi_process.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_rssi_process.py | 164 ++++++++++++++++------------------
 1 file changed, 77 insertions(+), 87 deletions(-)

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()

From 334a2ca3d1fa16b3876835259f654356f6b47e87 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 11:34:04 -0600
Subject: [PATCH 092/376] py-scripts/lf_chamberview_tools.py flake8 compliance

Verification:
./lf_chamberview_tools.py --mgr 192.168.50.100

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_chamberview_tools.py | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

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()

From cb71099154a5165989546e84e2a2c5170395ba1b Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 11:50:29 -0600
Subject: [PATCH 093/376] py-scripts/lf_interop_port_reset_test.py flake8
 compliance

left in the following with a comment
import datetime
from datetime import datetime

This script supports only real clients the flake8 was light touch.
Note the functionality is also present in test_l3.py for both virtual
and real clients

Verification:
./lf_interop_port_reset_test.py

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_interop_port_reset_test.py | 42 ++++++++++++------------
 1 file changed, 21 insertions(+), 21 deletions(-)

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()

From f3ab68a22c02389e8d6d7e026bdfe0fabcf66ebe Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 12:40:42 -0600
Subject: [PATCH 094/376] py-scripts/lf_macvlan.py flake8 compliance

Noted: creates a quantity of 1 regardless of the qty input. Could
be user error

Verification:
./lf_macvlan.py\
 --mgr 192.168.50.100\
 --parent_port 1.1.eth2\
 --new_macvlan\
 --mac_pattern xx:xx:xx:*:*:xx\
 --qty 2\
 --ip 'DHCP'\
 --state up

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_macvlan.py | 34 +++++++++++++++-------------------
 1 file changed, 15 insertions(+), 19 deletions(-)

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,

From 62d8a49e94b62e089fe33142fd7ec5b4a2bccd79 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 13:54:09 -0600
Subject: [PATCH 095/376] py-scripts/modify_vap.py flake8 compliance

This script needs to move the sandbox / deprecated,
this script is non-functional
Another version of this script would be to use the lanforge client

Verified: (script completes yet does not work)

./modify_vap.py

./modify_vap.py\
 --mgr 192.168.50.100\
 --radio wiphy1\
 --vap 1.1.vap0000\
 --security wpa2\
 --ssid vap_ssid\
 --passwd hello123\
 --enable_flag wpa2_enable\
 --disable_flag ht160_enable\
 --log_level debug

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/modify_vap.py | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/py-scripts/modify_vap.py b/py-scripts/modify_vap.py
index 56856305d..4309641e6 100755
--- a/py-scripts/modify_vap.py
+++ b/py-scripts/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 ")
 
 

From 1bdf48154708cd9e5f342898b8b28952cfda5b6f Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 14:00:51 -0600
Subject: [PATCH 096/376] py-scripts/sandbox/modify_vap.py LAN moved
 ./modify_vap.py to /sandbox/modify_vap.py

LAN-4197 LANforge API : create script to modify VAP

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/modify_vap.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/modify_vap.py (100%)

diff --git a/py-scripts/modify_vap.py b/py-scripts/sandbox/modify_vap.py
similarity index 100%
rename from py-scripts/modify_vap.py
rename to py-scripts/sandbox/modify_vap.py

From 55e4153cd8a6c018e0194e8b3bb1a85fd5bc6a58 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 14:12:29 -0600
Subject: [PATCH 097/376] Revert "py-scripts/sandbox/modify_vap.py LAN moved
 ./modify_vap.py to /sandbox/modify_vap.py"

This reverts commit 1bdf48154708cd9e5f342898b8b28952cfda5b6f.
---
 py-scripts/{sandbox => }/modify_vap.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{sandbox => }/modify_vap.py (100%)

diff --git a/py-scripts/sandbox/modify_vap.py b/py-scripts/modify_vap.py
similarity index 100%
rename from py-scripts/sandbox/modify_vap.py
rename to py-scripts/modify_vap.py

From b6c631077a3f0276bb7012f62d97196cd78b217c Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 14:15:56 -0600
Subject: [PATCH 098/376] Reapply "py-scripts/sandbox/modify_vap.py LAN moved
 ./modify_vap.py to /sandbox/modify_vap.py"

This reverts commit 55e4153cd8a6c018e0194e8b3bb1a85fd5bc6a58.
---
 py-scripts/{ => sandbox}/modify_vap.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/modify_vap.py (100%)

diff --git a/py-scripts/modify_vap.py b/py-scripts/sandbox/modify_vap.py
similarity index 100%
rename from py-scripts/modify_vap.py
rename to py-scripts/sandbox/modify_vap.py

From 282e40be820690366de22074d26b10f4dd8365cf Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 14:20:58 -0600
Subject: [PATCH 099/376] py-scripts/modify_station.py flake8 compliance only
 one line changed

Working file

Verified:

./modify_station.py  works

./modify_station.py\
 --mgr 192.168.50.100\
 --radio wiphy0\
 --station 1.1.sta0000\
 --set_state up\
 --security wpa2\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --enable_flag wpa2_enable

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/modify_station.py | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/py-scripts/modify_station.py b/py-scripts/modify_station.py
index 6687e88c6..88f3099d7 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.
 """
@@ -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',

From df61e30a518bab2a84426a8e66322dd7ef823849 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 14:33:36 -0600
Subject: [PATCH 100/376] py-scripts/sta_connect.py  flake8 compliance

Verified:

./sta_connect.py

./sta_connect.py\
 --mgr 192.168.50.100\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --security wpa2\
 --radio 1.1.wiphy0\
 --upstream_port 1.1.eth2

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/sta_connect.py | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

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()

From 06b81335e4f35134006f12130de58cfc88b39ff8 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 15:16:02 -0600
Subject: [PATCH 101/376] py-scripts/sta_connect2.py  flake8 compliance

Verified:

./sta_connect2.py

./sta_connect2.py\
 --mgr 192.168.50.100\
 --radio 1.1.wiphy0\
 --dut_ssid ax1800_5g\
 --dut_passwd lf_ax1800_5g\
 --dut_security wpa2\
 --upstream_port 1.1.eth2\
 --csv_outfile sta_connect2.csv\
 --test_rig LF-Lab-McCall\
 --test_tag L3\
 --dut_hw_version Linux\
 --dut_model_num 1\
 --dut_sw_version 5.4.5\
 --dut_serial_num 1234

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/sta_connect2.py | 65 ++++++++++++++++++--------------------
 1 file changed, 30 insertions(+), 35 deletions(-)

diff --git a/py-scripts/sta_connect2.py b/py-scripts/sta_connect2.py
index 2c8f84606..4a04606f4 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
@@ -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)

From 6a1ef0415bcbd3ba697f592ca73cd92c621f8229 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 15:44:30 -0600
Subject: [PATCH 102/376] py-scripts/lf_snp_test.py flake8 compliance

Cisco specific test for modifying AP settings.  It is an example
of modifying the configuraiton of the AP.

Verification:
./lf_snp_test.py --help

Note: only did help as testbed would need to be setup
---
 py-scripts/lf_snp_test.py | 220 +++++++++++++++++++-------------------
 1 file changed, 112 insertions(+), 108 deletions(-)

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()

From 41e14ee43aeb5d582bfc640367f6a131e03e9ca4 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 16:37:59 -0600
Subject: [PATCH 103/376] py-scripts/lf_json_api.py  flake8 complience

Verified:

./lf_json_api.py

./lf_json_api.py\
 --lf_mgr 192.168.50.100\
 --lf_user lanforge\
 --lf_passwd lanforge\
 --get_requests radio

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_json_api.py | 50 +++++++++++++++++++--------------------
 1 file changed, 24 insertions(+), 26 deletions(-)

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

From 27bf598d77a3fdf521298a65da05a636ca0a47a2 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 16:45:01 -0600
Subject: [PATCH 104/376] py-scripts/stations_connected.py  flake8 complience

Note: moving this file to examples, this is an example

Verification:
./stations_connected.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/stations_connected.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/py-scripts/stations_connected.py b/py-scripts/stations_connected.py
index 3a37eb23e..253316746 100755
--- a/py-scripts/stations_connected.py
+++ b/py-scripts/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
@@ -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()

From 2c4e3edb57e7f540660c68c2239a9aac9e58e72b Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 16:46:04 -0600
Subject: [PATCH 105/376] py-scripts/stations_connected.py ->
 py-scripts/examples/stations_connected.py

./stations_connected.py is an example of quering stations using realm

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => examples}/stations_connected.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => examples}/stations_connected.py (100%)

diff --git a/py-scripts/stations_connected.py b/py-scripts/examples/stations_connected.py
similarity index 100%
rename from py-scripts/stations_connected.py
rename to py-scripts/examples/stations_connected.py

From 2f7e2c847a8febb74c6a582b407be724551cc475 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 17:02:34 -0600
Subject: [PATCH 106/376] py-scripts/sta_connect_bssid_mac.py  flake8
 compliance ,

./sta_connect_bssid_mac.py does not set the --security correctly

Verification:

./sta_connect_bssid_mac.py

./sta_connect_bssid_mac.py\
 --mgr 192.168.50.100\
 --mgr_port 8080\
 --ssid ax1800_5g\
 --radio 1.1.wiphy0\
 --security wpa2\
 --passwd lf_ax1800_5g\
 --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

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/sta_connect_bssid_mac.py | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/py-scripts/sta_connect_bssid_mac.py b/py-scripts/sta_connect_bssid_mac.py
index f4a3c0bab..af2dd62c3 100755
--- a/py-scripts/sta_connect_bssid_mac.py
+++ b/py-scripts/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.
 '''

From d6249600894e886f4f1abd6a04620b21bff1c3d0 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 17:04:39 -0600
Subject: [PATCH 107/376] py-scripts/sta_connect_bssid_mac.py ->
 py-scripts/sandbox/sta_connect_bssid_mac.py

./sta_connect_bssid_mac.py is a work in progress, moved to sandbox.
The script appears to not work as intended. There are some interesting
behaviors.

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/sta_connect_bssid_mac.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/sta_connect_bssid_mac.py (100%)

diff --git a/py-scripts/sta_connect_bssid_mac.py b/py-scripts/sandbox/sta_connect_bssid_mac.py
similarity index 100%
rename from py-scripts/sta_connect_bssid_mac.py
rename to py-scripts/sandbox/sta_connect_bssid_mac.py

From 401d7a5f64704aea850e3baa8765e07e4b5919bd Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 17:14:50 -0600
Subject: [PATCH 108/376] py-scripts/ssh_remote.py flake8 complience

A good script for executing a command on a remote system / AP

Verification:

./ssh_remote.py

 ./ssh_remote.py\
 --ip 192.168.50.100\
 --username lanforge\
 --password lanforge\
 --prog "ls -lrt"

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/ssh_remote.py | 41 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 21 deletions(-)

diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py
index d66d42e65..b31bbe135 100755
--- a/py-scripts/ssh_remote.py
+++ b/py-scripts/ssh_remote.py
@@ -1,5 +1,4 @@
 #!/usr/bin/python3
-# flake8: noqa
 
 ##################################################################################
 # Run command on remote system over ssh
@@ -19,10 +18,10 @@
 ##################################################################################
 
 import paramiko
-from paramiko import SSHClient
+# from paramiko import SSHClient
 import socket
 import argparse
-import logging
+# import logging
 
 global ip
 global ssh_port
@@ -31,28 +30,28 @@
 global timeout
 global prog
 
-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 = ""
 
 
 def get_info(cmd):
     try:
-        #logging.getLogger("paramiko").setLevel(logging.DEBUG)
+        # logging.getLogger("paramiko").setLevel(logging.DEBUG)
         client = paramiko.SSHClient()
         client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
-        #print("Connecting to Remote System...")
+        # print("Connecting to Remote System...")
         client.connect(ip, username=username, password=password, port=ssh_port, timeout=timeout, allow_agent=False, look_for_keys=False)
-        #print("Running cmd: %s" %(cmd))
+        # print("Running cmd: %s" %(cmd))
         stdin, stdout, stderr = client.exec_command(cmd)
-       
+
         output = str(stdout.read(), 'utf-8')
 
-        #print("Output:\n")
+        # print("Output:\n")
         print(output)
 
     except paramiko.ssh_exception.AuthenticationException as e:
@@ -76,16 +75,16 @@ def main():
     global username
     global password
     global remote_args
-    
+
     parser = argparse.ArgumentParser(
         prog='ssh_remote.py',
         formatter_class=argparse.RawTextHelpFormatter,
         epilog='''\
- Run command against remoate machine over ssh
+ Run command against remote machine over ssh
             ''',
 
         description='''
- Run command against remoate machine over ssh
+ Run command against remote machine over ssh
         ''')
 
     parser.add_argument(
@@ -120,7 +119,7 @@ def main():
 
     args = parser.parse_args()
 
-    help_summary='''\
+    help_summary = '''\
 This script is an example do_ap script on remote system.
 '''
     if args.help_summary:
@@ -130,7 +129,7 @@ def main():
     ip = args.ip
     username = args.username
     password = args.password
-    prog = args.prog;
+    prog = args.prog
 
     cmd = args.prog
     ra = args.remote_args.split()
@@ -140,6 +139,6 @@ def main():
 
     get_info(cmd)
 
+
 if __name__ == '__main__':
     main()
-

From ebab00d28f336630ec9dc28b2ba879025a772b91 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:02:31 -0600
Subject: [PATCH 109/376] py-scripts/webGUI_update_dependencies.py flake8
 compliance

Verification:
./webGUI_update_dependencies.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/webGUI_update_dependencies.py | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

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 = []

From 54b6ab7778c4a4d0b5055ddb783040ffa5d88397 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:07:09 -0600
Subject: [PATCH 110/376] py-scripts/sta_connect_multi_example.py flake8
 compliance

./sta_connect_multi_example.py to be moved to example

Verification:
./sta_connect_multi_example.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/sta_connect_multi_example.py | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/py-scripts/sta_connect_multi_example.py b/py-scripts/sta_connect_multi_example.py
index aa5fab490..b39ff201d 100755
--- a/py-scripts/sta_connect_multi_example.py
+++ b/py-scripts/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
@@ -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)
 

From de659bb5ce0c07d0d63db81c2c1240838e16ad69 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:08:30 -0600
Subject: [PATCH 111/376] py-scripts/sta_connect_multi_example.py ->
 py-scripts/examples/sta_connect_multi_example.py

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => examples}/sta_connect_multi_example.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => examples}/sta_connect_multi_example.py (100%)

diff --git a/py-scripts/sta_connect_multi_example.py b/py-scripts/examples/sta_connect_multi_example.py
similarity index 100%
rename from py-scripts/sta_connect_multi_example.py
rename to py-scripts/examples/sta_connect_multi_example.py

From 112246d45c02ad6aa1c89e0a420728859271986c Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:31:05 -0600
Subject: [PATCH 112/376] py-scripts/test_client_admission.py flake8 compliance

Note: in verification the number of clients were not connected

Verification:

./test_client_admission.py

./test_client_admission.py\
 --host 192.168.50.100\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --security wpa2\
 --radio 1.1.wiphy0\
 --num_sta 19

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_client_admission.py | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/py-scripts/test_client_admission.py b/py-scripts/test_client_admission.py
index 5c6c9c15d..819d3cb9a 100755
--- a/py-scripts/test_client_admission.py
+++ b/py-scripts/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()

From e381a2886f03786245f364dda6635fd7f3c806e0 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:32:08 -0600
Subject: [PATCH 113/376] py-scripts/test_client_admission.py ->
 py-scripts/sandbox/test_client_admission

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/test_client_admission.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/test_client_admission.py (100%)

diff --git a/py-scripts/test_client_admission.py b/py-scripts/sandbox/test_client_admission.py
similarity index 100%
rename from py-scripts/test_client_admission.py
rename to py-scripts/sandbox/test_client_admission.py

From ad16196b86c0458783b69a3524c78b1af89abf88 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:42:52 -0600
Subject: [PATCH 114/376] py-scripts/csv_convert.py flake8 compliance

probably needs to move to tools

Verification:
./csv_convert.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/csv_convert.py | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

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)

From bfb9504066b6fa3e42f7d6241a5b8f8c6fa760e5 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:52:07 -0600
Subject: [PATCH 115/376] py-scripts/scenario.py flake8 compliance

Verification:
./scenario.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/scenario.py | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/py-scripts/scenario.py b/py-scripts/scenario.py
index 6322c10d1..55956d90b 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
     ''')
 
@@ -165,14 +164,13 @@ def main():
     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,

From 79922c412eb60becafcacd9192f8c8206c0e58d4 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 21:53:17 -0600
Subject: [PATCH 116/376] py-scripts/scenario.py ->
 py-scripts/sandbox/scenario.py

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/scenario.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/scenario.py (100%)

diff --git a/py-scripts/scenario.py b/py-scripts/sandbox/scenario.py
similarity index 100%
rename from py-scripts/scenario.py
rename to py-scripts/sandbox/scenario.py

From 0fbba7311e50ca7c96e564c981633e64194e36c6 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 22:08:47 -0600
Subject: [PATCH 117/376] py-scripts/lf_test_max_association.py flake8
 compliance Note: will move to sandbox on next commit, as script is not
 functional

Verification:
./lf_test_max_association.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_test_max_association.py | 47 +++++++++++++--------------
 1 file changed, 23 insertions(+), 24 deletions(-)

diff --git a/py-scripts/lf_test_max_association.py b/py-scripts/lf_test_max_association.py
index 2bc9703d2..71d6c3b9c 100755
--- a/py-scripts/lf_test_max_association.py
+++ b/py-scripts/lf_test_max_association.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# flake8: noqa
 """
 NAME: lf_test_max_association.py
 
@@ -376,13 +375,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 +599,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 +683,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 +888,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 +909,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'

From a9629f71a46c2ec49347b31696b2d867e37e30ba Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sun, 6 Jul 2025 22:10:47 -0600
Subject: [PATCH 118/376] py-scripts/lf_test_max_association.py ->
 py-scripts/sandbox/lf_test_max_association.py

moving the ./lf_test_max_association.py to the sandbox

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/lf_test_max_association.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/lf_test_max_association.py (100%)

diff --git a/py-scripts/lf_test_max_association.py b/py-scripts/sandbox/lf_test_max_association.py
similarity index 100%
rename from py-scripts/lf_test_max_association.py
rename to py-scripts/sandbox/lf_test_max_association.py

From fb0e8e35b475e817c6ef3ff2f24e67aeeb575d36 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Mon, 7 Jul 2025 10:04:51 -0600
Subject: [PATCH 119/376] py-scripts/attenuator_serial.py flake8 compliance

This is a Tool used by Tip

Verification:
./attenuator_serial.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/attenuator_serial.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

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:

From ef5eb7f90d0825c503edbd899eebcae815ad019a Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Mon, 7 Jul 2025 16:41:09 -0600
Subject: [PATCH 120/376] py-scripts/lf_pcap.py  flake8 compliance Note: tried
 to run the example with passing in an example file, there are some hard coded
 values so there may need to be some updates

There were no errors in passing in the pcap file

Verification:
./lf_pcap.py --pcap_file /home/lf/git/x64_btbits/3plibs/libpcap/tests/pcap-invalid-version-1.pcap

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_pcap.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

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()

From a418f8c2f0670051d240c13c16cc61a611a77b5f Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Mon, 7 Jul 2025 18:40:30 -0600
Subject: [PATCH 121/376] py-scripts/test_wanlink.py flake8 compliance

./test_wanlink.py will be moved to the sandbox on the next commit
via  LAN-4200 [WANLINK] test_wanlink.py - debug and update

Verification:
./test_wanlink.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_wanlink.py | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/py-scripts/test_wanlink.py b/py-scripts/test_wanlink.py
index 1ac829eb5..193b18f84 100755
--- a/py-scripts/test_wanlink.py
+++ b/py-scripts/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()
 

From d1a41ca2af142408034ee42e86aed99b6c4a91b9 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Mon, 7 Jul 2025 18:42:17 -0600
Subject: [PATCH 122/376] py-scripts/test_wanlink.py ->
 py-scripts/sandbox/test_wanlink.py LAN-4200 [WANLINK] test_wanlink.py - debug
 and update

the test_wanlink.py needs to be updated and debugged.

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/test_wanlink.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/test_wanlink.py (100%)

diff --git a/py-scripts/test_wanlink.py b/py-scripts/sandbox/test_wanlink.py
similarity index 100%
rename from py-scripts/test_wanlink.py
rename to py-scripts/sandbox/test_wanlink.py

From 004ce89e0202e5e8481388c7de0802de040b5250 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Mon, 7 Jul 2025 18:51:44 -0600
Subject: [PATCH 123/376] py-scripts/test_ip_variable_time.py  flake8
 compliance

With the next commit this file will be moved to the sandbox to allow
for debug LAN-4201 test_ip_variable_time.py : moving to sandbox to allow for debugging

Verified:
./test_ip_variable_time.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_ip_variable_time.py | 149 ++++++++++++++--------------
 1 file changed, 77 insertions(+), 72 deletions(-)

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 = {

From 22d1e26d8d9317af5a18d36f0fcdebde09a2cd3c Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Mon, 7 Jul 2025 18:53:51 -0600
Subject: [PATCH 124/376] ./py-scripts/test_ip_variable_time.py ->
 py-scripts/sandbox/test_ip_variable_time.py

test_ip_variable_time.py will be move to the sanbox to be debugged
LAN4201

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/test_ip_variable_time.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/test_ip_variable_time.py (100%)

diff --git a/py-scripts/test_ip_variable_time.py b/py-scripts/sandbox/test_ip_variable_time.py
similarity index 100%
rename from py-scripts/test_ip_variable_time.py
rename to py-scripts/sandbox/test_ip_variable_time.py

From cecf5740513073d712a2067c3740edaa66ec3c5a Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 14:44:57 -0600
Subject: [PATCH 125/376] py-scripts/test_l3.py removed import of modify_vap

Verification:
automation

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_l3.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/py-scripts/test_l3.py b/py-scripts/test_l3.py
index 7f8fa668d..e05bb2e12 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

From 71f74abbe9c2b5673f870a57aff525e485743286 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 14:46:23 -0600
Subject: [PATCH 126/376] py-scripts/test_l3_longevity.py commented out
 modify_vap (will be used for future development)

Verification:
Automation

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_l3_longevity.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/test_l3_longevity.py b/py-scripts/test_l3_longevity.py
index 505e447e5..21705be5e 100755
--- a/py-scripts/test_l3_longevity.py
+++ b/py-scripts/test_l3_longevity.py
@@ -102,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

From 3315df3c57a55b8654fc321e0c9693009b182406 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 15:00:18 -0600
Subject: [PATCH 127/376] py-scripts/lf_rssi_check.py ->
 py-scripts/sandbox/lf_rssi_check.py

lf_rssi_check.py is not fully funcitonal and dependent on modify_vap.py
which is broken.

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/lf_rssi_check.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/lf_rssi_check.py (100%)

diff --git a/py-scripts/lf_rssi_check.py b/py-scripts/sandbox/lf_rssi_check.py
similarity index 100%
rename from py-scripts/lf_rssi_check.py
rename to py-scripts/sandbox/lf_rssi_check.py

From f1fdc9cadda449a7b6c602ca136c50ef1dab7fad Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 17:08:56 -0600
Subject: [PATCH 128/376] py-scripts/test_ip_connection.py flake8 compliance

Note: some of the configuations do not work,  created Jira,
LAN-4204 test_ip_connection,  logging not setup,
also setting the mode does not work, help not properly formatted

Verified:
./test_ip_connection.py\
 --mgr 192.168.50.100\
 --upstream_port eth2\
 --radio wiphy0\
 --num_stations 3\
 --proxy\
 --security wpa2\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --mode   1\
 --timeout 120\
 --debug

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_ip_connection.py | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

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")
 

From 7a06480f7aa8fcd89e964652f0c8cd0b2c6fa5ed Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 20:28:53 -0600
Subject: [PATCH 129/376] py-scripts/test_generic.py flake8 compliance:

Verification:
./test_generic.py
 --mgr 192.168.50.100\
 --upstream_port 1.1.eth2\
 --radio wiphy0\
 --num_stations 3\
 --security wpa2\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --type lfping\
 --dest 192.168.50.102\
 --test_duration 1m\
 --interval 5s\
 --debug

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_generic.py | 67 ++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 35 deletions(-)

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()

From b52cd18fa3bda7c1ad8a84d4db38affed4502822 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 22:28:54 -0600
Subject: [PATCH 130/376] py-scripts/chamber_ctl.py one line change for flake8
 compliance

Verification:
./chamber_ctl.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/chamber_ctl.py | 2 --
 1 file changed, 2 deletions(-)

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

From fa9561639e6faf462bbb7d3d1c1ebe918f9774eb Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 22:35:03 -0600
Subject: [PATCH 131/376] py-scripts/sta_connect_example.py flake8 compliance

Verification:
./sta_connect_example.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/sta_connect_example.py | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/py-scripts/sta_connect_example.py b/py-scripts/sta_connect_example.py
index 7f585d2aa..d01dbd22b 100755
--- a/py-scripts/sta_connect_example.py
+++ b/py-scripts/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"

From e39a23e51cd5f1bd076f231cd5d5d6867bbf89ac Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 22:36:37 -0600
Subject: [PATCH 132/376] ./py-scripts/sta_connect_example.py ->
 ./sandbox/sta_connect_example.py

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/sta_connect_example.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => sandbox}/sta_connect_example.py (100%)

diff --git a/py-scripts/sta_connect_example.py b/py-scripts/sandbox/sta_connect_example.py
similarity index 100%
rename from py-scripts/sta_connect_example.py
rename to py-scripts/sandbox/sta_connect_example.py

From 1a866a4012ae392ef09f8709e6ac6792f1817b6e Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 22:39:40 -0600
Subject: [PATCH 133/376] ./lf_w_can_scan.py moved to scripts deprecated

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => scripts_deprecated}/lf_we_can_scan.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename py-scripts/{ => scripts_deprecated}/lf_we_can_scan.py (99%)

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:

From 151df59c6ff47d427be9fc59a2dfde3c9fcd752c Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 22:42:48 -0600
Subject: [PATCH 134/376] ./lf_setup_radius_server.py
 ->/sandbox/lf_setup_radius_server.py

This script is a development script

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => sandbox}/lf_setup_radius_server.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename py-scripts/{ => sandbox}/lf_setup_radius_server.py (99%)

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. ''')
 

From 6e0e6ad59268246095ec5994f49b70afbb0fba1f Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Tue, 8 Jul 2025 23:28:45 -0600
Subject: [PATCH 135/376] py-scripts/wlan_capacity_calculator.py

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/wlan_capacity_calculator.py | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

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)
 '''
 

From ea07130aa517705f5adc33275655fdc58493929c Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 10:19:00 -0600
Subject: [PATCH 136/376] py-scripts/test_ipv4_ps.py ->
 py-scripts/scripts_deprecated/testipv4_ps.py

This script is a work in progress, does not function.  The help references
./test_ipv4_veriable_time.py

moving to scripts deprecated

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => scripts_deprecated}/test_ipv4_ps.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => scripts_deprecated}/test_ipv4_ps.py (100%)

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

From 9bb86c3e2bd9b28a1cfaf93400fae02d4fd324cb Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 10:33:10 -0600
Subject: [PATCH 137/376] py-scripts/lf_create_vap_cv.py removed unused import
 test_ip_variable_time

Verified:
./lf_create_vap_cv.py\
 --mgr 192.168.50.100\
 --port 8080\
 --lf_user lanforge\
 --lf_password lanforge\
 --vap_radio 1.1.wiphy2\
 --vap_freq 5180\
 --vap_ssid test_vap\
 --vap_passwd password\
 --vap_security wpa2\
 --vap_upstream_port 1.1.eth2\
 --log_level debug

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_create_vap_cv.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/py-scripts/lf_create_vap_cv.py b/py-scripts/lf_create_vap_cv.py
index b26dc970e..c4223f1c6 100755
--- a/py-scripts/lf_create_vap_cv.py
+++ b/py-scripts/lf_create_vap_cv.py
@@ -154,8 +154,8 @@
 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
+# ipvt = importlib.import_module("py-scripts.test_ip_variable_time")
+# IPVariableTime = ipvt.IPVariableTime
 
 radio_modify = importlib.import_module("py-scripts.lf_modify_radio")
 

From 8a34974a4d02806f33b381925666879652079c9e Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 10:41:37 -0600
Subject: [PATCH 138/376] py-scripts/test_ipv4_ttls.py ->
 ./py-scripts/scripts_deprecated/test_ipv4_ttls.py

The script is non-funcational moving to scripts deprecated.

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{ => scripts_deprecated}/test_ipv4_ttls.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename py-scripts/{ => scripts_deprecated}/test_ipv4_ttls.py (99%)

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

From 20e9d59e47bb0da06819294e41de1b475b9b71cc Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 10:44:34 -0600
Subject: [PATCH 139/376] py-scripts/sta_connect2.py naming for csv reflects
 the name of the script

Verification:
/sta_connect2.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/sta_connect2.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/sta_connect2.py b/py-scripts/sta_connect2.py
index 4a04606f4..c5976240b 100755
--- a/py-scripts/sta_connect2.py
+++ b/py-scripts/sta_connect2.py
@@ -981,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))

From 8a19b24a75a1fefd7c33c7e9fb335a579aa19a71 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 10:46:45 -0600
Subject: [PATCH 140/376] py-scripts/lf_create_vap_cv.py removed commented out
 imports for py-scripts.test_ip_variable_time

Verified:

./lf_create_vap_cv.py\
 --mgr 192.168.50.100\
 --port 8080\
 --lf_user lanforge\
 --lf_password lanforge\
 --vap_radio 1.1.wiphy2\
 --vap_freq 5180\
 --vap_ssid test_vap\
 --vap_passwd password\
 --vap_security wpa2\
 --vap_upstream_port 1.1.eth2\
 --log_level debug

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_create_vap_cv.py | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/py-scripts/lf_create_vap_cv.py b/py-scripts/lf_create_vap_cv.py
index c4223f1c6..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__)

From 44205975e48f6902cb85d9206dc96f57a87d5fa7 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 10:49:05 -0600
Subject: [PATCH 141/376] py-scripts_test_ip_variable_time.py is used by
 lf_interference.py,

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/{sandbox => }/test_ip_variable_time.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{sandbox => }/test_ip_variable_time.py (100%)

diff --git a/py-scripts/sandbox/test_ip_variable_time.py b/py-scripts/test_ip_variable_time.py
similarity index 100%
rename from py-scripts/sandbox/test_ip_variable_time.py
rename to py-scripts/test_ip_variable_time.py

From 5ae6f5189561eeb4bee0dd27195cec2130de420b Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 11:38:49 -0600
Subject: [PATCH 142/376] py-scripts/sta_scan_test.py flake8 compliance

This script worked first time

Verification:
./sta_scan_test.py\
 --mgr 192.168.50.11\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --security wpa2\
 --radio wiphy0

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/sta_scan_test.py | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

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,

From 0876c0638756abb96b105bf90ad9e71a86f2f98b Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 11:49:15 -0600
Subject: [PATCH 143/376] py-scripts/test_status_msg.py flake8 compliance

Verification:

./test_status_msg.py

./test_status_msg.py\
 --mgr 192.168.50.11\
 --action run_test

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_status_msg.py | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

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,

From c8dc89c4485f4bbb86f08b68408d2096ac57ee44 Mon Sep 17 00:00:00 2001
From: Liam Reynolds 
Date: Tue, 24 Jun 2025 17:09:48 -0700
Subject: [PATCH 144/376] test_group_profile.py: fix to test profiles with only
 one group. Expands fixes from d69f0e6 to the list_cxs method. Verification:
 ./test_fileio.py --macvlan_parent eth1 --num_ports 2 --use_macvlans
 --first_mvlan_ip 192.168.48.15 --netmask 255.255.255.0 --gateway
 192.168.45.24 --test_duration 1m --use_test_groups --write_only_test_group
 cgio-0000 --read_only_test_group cgio-0000 ./test_fileio.py --macvlan_parent
 eth1 --num_ports 2 --use_macvlans --first_mvlan_ip 192.168.48.15 --netmask
 255.255.255.0 --gateway 192.168.45.24 --test_duration 1m --use_test_groups
 --write_only_test_group cgio-0000 --read_only_test_group cgio-0001
 Signed-off-by: Liam Reynolds 

---
 py-json/test_group_profile.py | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/py-json/test_group_profile.py b/py-json/test_group_profile.py
index 7086c9d5e..010cf1f35 100644
--- a/py-json/test_group_profile.py
+++ b/py-json/test_group_profile.py
@@ -59,8 +59,13 @@ def check_group_exists(self):
         # 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:
@@ -87,6 +92,10 @@ 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():
                     if v['name'] == self.group_name:

From 701521adf3ed15d486be7a383301886edb3d2ad0 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 15:44:34 -0600
Subject: [PATCH 145/376] py-scripts/tip_station_powersave.py  flake8
 compliance

This file is a library or module so used by other TIP files

Verification:
./tip_station_powersave.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/tip_station_powersave.py | 85 +++++++++++++----------------
 1 file changed, 39 insertions(+), 46 deletions(-)

diff --git a/py-scripts/tip_station_powersave.py b/py-scripts/tip_station_powersave.py
index 89b127821..f80fdadb8 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()
-

From 94ec52f463ddbcecee2d6b78f75b5f03dd13fd88 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 15:49:54 -0600
Subject: [PATCH 146/376] py-scripts/test_l3_scenario_throughput.py ->
 py-scripts/scripts_deprecated/test_l3_scenario_throughput.py

This script was initially created in 2020, there are hard coded values and
the script has not been maintained.  Moving to scripts deprecated

Signed-off-by: Chuck SmileyRekiere 
---
 .../{ => scripts_deprecated}/test_l3_scenario_throughput.py       | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename py-scripts/{ => scripts_deprecated}/test_l3_scenario_throughput.py (100%)

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

From 7bb6e72db5b6eefe91961765edba4020cbaec149 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Wed, 9 Jul 2025 23:05:52 -0600
Subject: [PATCH 147/376] py-scripts/test_fileio.py  flake8 complience

Verification:
./test_fileio.py\
 --mgr 192.168.50.100\
 --radio 1.wiphy0\
 --test_duration 1m\
 --macvlan_parent eth2\
 --num_ports 3\
 --use_macvlans\
 --use_ports eth2#0,eth2#1,eth2#2\
 --connections_per_port 2\
 --mode both

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_fileio.py | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/py-scripts/test_fileio.py b/py-scripts/test_fileio.py
index d169754bd..a7de314d0 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,10 +18,10 @@
 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
 
 TODO: Create external document
@@ -565,22 +564,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
 
 ''')
@@ -669,7 +668,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 +684,6 @@ def main():
         print(help_summary)
         exit(0)
 
-
     parent = LFUtils.name_to_eid(args.macvlan_parent)
     shelf = parent[0]
     resource = parent[1]
@@ -847,7 +845,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 +865,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():

From be7eb0737f3421bd5c38f1f8139ca6d4cc176b55 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Thu, 10 Jul 2025 13:46:06 -0600
Subject: [PATCH 148/376] py-scripts/lf_ping_sweep.py flake8 compliance

The history on this script indicates is was specific for a customer.
Possibly need to move to customer specific repo

Signed-off-by: Chuck SmileyRekiere y-scripts/lf_ping_sweep.py flake8 compliance

The history on this script indicates is was specific for a customer.
The script needs to be run on lanforge

Verification:

./lf_ping_sweep.py

./lf_ping_sweep.py\
 --ethernet_interface eth2\
 --target_ip 192.168.50.1/24\
 --data_lengths 1024\
 --duration 1m\
 --csv_name ping_sweep_2\
 --reporting_down_time_percent 40%

 ./lf_ping_sweep.py\
 -e eth2\
 -ip 192.168.50.1/24\
 --duration 20s\
 --csv_name ping_sweep_1\
 --reporting_down_time_percentage 30%

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_ping_sweep.py | 533 +++++++++++++++++-------------------
 1 file changed, 254 insertions(+), 279 deletions(-)

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()

From 46f838cb43a3b00222cfe9c48d8c661483aad128 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Thu, 10 Jul 2025 19:23:16 -0600
Subject: [PATCH 149/376] py-scripts/lf_interop_modify.py  flake8 compliance

Verification:
./lf_interop_modify.py --help

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_interop_modify.py | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

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,

From c0f73a8a805799f8142db09b51a4c97596830873 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Thu, 10 Jul 2025 19:43:10 -0600
Subject: [PATCH 150/376] py-scripts/bssid_to_dut.py commented out hard coded
 part of script and added a comment on the usefulness of the example

Verification:
./bssid_to_dut.py\
 --mgr 192.168.50.100\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --security wpa2\
 --radio wiphy2\
 --dut_name AX1800

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/bssid_to_dut.py | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/py-scripts/bssid_to_dut.py b/py-scripts/bssid_to_dut.py
index 3f99a0778..71cfc88c7 100755
--- a/py-scripts/bssid_to_dut.py
+++ b/py-scripts/bssid_to_dut.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
         ''')
@@ -101,18 +101,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 + "'"
+    # 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()

From 21c268a07054bf79246383f4ad8f329fb678e0f5 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Fri, 11 Jul 2025 10:15:38 -0600
Subject: [PATCH 151/376] py-scripts/bssid_to_dut.py  flake8 compliance

Verification:
./bssid_to_dut.py\
 --mgr 192.168.50.100\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --security wpa2\
 --radio wiphy2\
 --dut_name AX1800

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/bssid_to_dut.py | 39 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/py-scripts/bssid_to_dut.py b/py-scripts/bssid_to_dut.py
index 71cfc88c7..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',
@@ -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:
@@ -107,7 +106,7 @@ def main():
 
     # 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 + "'"
+    # 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)

From 714cea1f21245a00ee86a5208375d622f58fbf71 Mon Sep 17 00:00:00 2001
From: Sidartha-CT 
Date: Wed, 9 Jul 2025 17:44:43 +0530
Subject: [PATCH 152/376] =?UTF-8?q?lf=5Finterop=5Fthroughput.py:=20WC-1355?=
 =?UTF-8?q?=20=E2=80=93=20Trimmed=20redundant=20columns=20in=20CSV=20to=20?=
 =?UTF-8?q?align=20with=20the=20report?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- Removed redundant DataFrame columns at the monitor level.
- Updated generate_report logic to calculate averages using all columns present in the CSV.

Verfied CLI: 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 --device_list 1.11,1.12,1.360,1.400

Signed-off-by: Sidartha-CT 
---
 py-scripts/lf_interop_throughput.py | 82 ++++++++++++++++-------------
 1 file changed, 44 insertions(+), 38 deletions(-)

diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py
index 6f6edcecf..563581b74 100755
--- a/py-scripts/lf_interop_throughput.py
+++ b/py-scripts/lf_interop_throughput.py
@@ -1084,6 +1084,8 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l
             if not self.background_run and self.background_run is not None:
                 break
 
+        individual_df = individual_df[1:-1]
+        individual_df_for_webui = individual_df_for_webui[1:-1]
         for index, key in enumerate(throughput):
             for i in range(len(throughput[key])):
                 upload[i], download[i], drop_a[i], drop_b[i] = [], [], [], []
@@ -1574,17 +1576,21 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca
                     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 "Rx % Drop B" in col][0]].values.tolist()
+                    download_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" 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))
                             # 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")
@@ -1597,20 +1603,19 @@ 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")
                             # 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:
@@ -1623,15 +1628,14 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca
                             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")
 
-                            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))
 
                             if self.cx_profile.side_a_min_pdu == -1:
                                 packet_size_in_table.append('AUTO')
@@ -1643,14 +1647,13 @@ 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))
 
                             # 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")
@@ -1664,17 +1667,16 @@ 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, 2)) + "Mbps")
                             download_list.append(str(round(int(self.cx_profile.side_b_min_bps) / 1000000, 2)) + "Mbps")
                             # 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:
@@ -1685,13 +1687,12 @@ 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))
 
                             # 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)
@@ -2010,15 +2011,20 @@ 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 "Rx % Drop B" in col][0]].values.tolist()
+                    download_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()
+                    rssi_col = filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()
+                    # 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
                     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)
 
@@ -2030,13 +2036,13 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca
                     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))
 
                         # 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")
@@ -2050,10 +2056,10 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca
                         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)
-                        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 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)

From b89453f48583b06c144b8566c0dc8186472f3d16 Mon Sep 17 00:00:00 2001
From: Sidartha-CT 
Date: Fri, 11 Jul 2025 15:34:54 +0530
Subject: [PATCH 153/376] lf_interop_throughput.py: Performed flake8 and
 removed commented code.

Signed-off-by: Sidartha-CT 
---
 py-scripts/lf_interop_throughput.py | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py
index 563581b74..9f846b48f 100755
--- a/py-scripts/lf_interop_throughput.py
+++ b/py-scripts/lf_interop_throughput.py
@@ -232,7 +232,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 = []
@@ -347,7 +347,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')
@@ -446,7 +446,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 (_, b) in element.items():
 
                         # Check if the resource is not phantom
                         if b['phantom'] is False:
@@ -727,12 +727,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:
@@ -1025,7 +1025,7 @@ 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] = [], [], [], []
                         if throughput[key][i][4] != 'Run':
@@ -1086,7 +1086,7 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l
 
         individual_df = individual_df[1:-1]
         individual_df_for_webui = individual_df_for_webui[1:-1]
-        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] = [], [], [], []
                 if throughput[key][i][4] != 'Run':
@@ -1574,8 +1574,6 @@ 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 "Rx % Drop B" in col][0]].values.tolist()
@@ -2016,8 +2014,6 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca
                     upload_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop B" in col][0]].values.tolist()
                     download_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" in col][0]].values.tolist()
                     rssi_col = filtered_df[[col for col in filtered_df.columns if "RSSI" in col][0]].values.tolist()
-                    # 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
                     if self.direction == "Bi-direction":
 
                         # Append download and upload data from filtered dataframe
@@ -2473,7 +2469,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':
@@ -2518,7 +2514,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:
@@ -2757,13 +2753,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"]
 

From 88b1713587c2d03242c3503632bfa6b2b468e3e4 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Fri, 11 Jul 2025 11:57:06 -0600
Subject: [PATCH 154/376] py-scripts/lf_rx_sensitivity_test.py flake8
 compliance

Verified:
./lf_rx_sensitivity_test.py\
 --mgr 192.168.50.100\
 --port 8080\
 --lf_user lanforge\
 --lf_password lanforge\
 --instance_name rx-sensitivity-instance\
 --config_name test_con\
 --upstream 1.1.eth2\
 --dut asus_ax1800\
 --duration 15s\
 --station 1.1.sta0000\
 --download_speed 85%\
 --upload_speed 10%\
 --raw_line 'txo_preamble:  VHT    (/AC)'\
 --raw_line 'txo_mcs: 7 OFDM, HT+'\
 --raw_line 'spatial_streams: 2'\
 --raw_line 'bandw_options: 80'\
 --raw_line 'txo_sgi: OFF'\
 --raw_line 'txo_retries: No Retry'\
 --raw_line 'txo_txpower: 17'\
 --raw_line 'traffic_types: UDP'\
 --test_rig Testbed-01\
 --pull_report

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_rx_sensitivity_test.py | 110 +++++++++++++--------------
 1 file changed, 54 insertions(+), 56 deletions(-)

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()
 

From 1f0aef5eefe95134b6f9a763a89ddfeb8fb32bdf Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:17:57 -0700
Subject: [PATCH 155/376] tools/lf_help_check.py: Run help check on selected
 sub-directories

Signed-off-by: Alex Gavin 
---
 py-scripts/tools/lf_help_check.py | 124 ++++++++++++++++++++----------
 1 file changed, 82 insertions(+), 42 deletions(-)

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:

From 0212be492048f5c686973e7b1d01e031bddde6d6 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:22:04 -0700
Subject: [PATCH 156/376] CI: Rename help check to help and help summary check

---
 .github/workflows/ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 800ea2a5d..31d378b7a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,7 +30,7 @@ jobs:
     # 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

From 17c88e3ae638c5988164a0cab784e6dc1169c225 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 09:51:31 -0700
Subject: [PATCH 157/376] lf_rssi_check.py: Remove incomplete script from
 linting checks

Signed-off-by: Alex Gavin 
---
 py-scripts/sandbox/lf_rssi_check.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/py-scripts/sandbox/lf_rssi_check.py b/py-scripts/sandbox/lf_rssi_check.py
index 77e4831ac..92931a3e3 100755
--- a/py-scripts/sandbox/lf_rssi_check.py
+++ b/py-scripts/sandbox/lf_rssi_check.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python3
+# flake8: noqa
 """
 NAME: lf_rssi_check.py
 

From e59ca629a991c7aab856bac87ac92881988c09f7 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 09:52:03 -0700
Subject: [PATCH 158/376] lf_test_max_association.py: Remove incomplete script
 from linting checks

Signed-off-by: Alex Gavin 
---
 py-scripts/sandbox/lf_test_max_association.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/py-scripts/sandbox/lf_test_max_association.py b/py-scripts/sandbox/lf_test_max_association.py
index 71d6c3b9c..cc8834f7d 100755
--- a/py-scripts/sandbox/lf_test_max_association.py
+++ b/py-scripts/sandbox/lf_test_max_association.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python3
+# flake8: noqa
 """
 NAME: lf_test_max_association.py
 

From 1bc7b7dbf5421a53dcd845be35af04c794eef5f2 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:14:38 -0700
Subject: [PATCH 159/376] stations_connect_multi_example.py: Fix import issue

Signed-off-by: Alex Gavin 
---
 py-scripts/examples/sta_connect_multi_example.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/examples/sta_connect_multi_example.py b/py-scripts/examples/sta_connect_multi_example.py
index b39ff201d..56e8e3194 100755
--- a/py-scripts/examples/sta_connect_multi_example.py
+++ b/py-scripts/examples/sta_connect_multi_example.py
@@ -9,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")

From 77d06d61d6036c784d7e60e5739c9a6762605887 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 09:54:23 -0700
Subject: [PATCH 160/376] stations_connected.py: Fix import issue

Signed-off-by: Alex Gavin 
---
 py-scripts/examples/stations_connected.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/examples/stations_connected.py b/py-scripts/examples/stations_connected.py
index 253316746..576031221 100755
--- a/py-scripts/examples/stations_connected.py
+++ b/py-scripts/examples/stations_connected.py
@@ -9,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

From 4b76f75d6665b6b2666efdf3f72a1a4875224834 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 09:53:27 -0700
Subject: [PATCH 161/376] stations_connected.py: Fix linting error

Signed-off-by: Alex Gavin 
---
 py-scripts/examples/stations_connected.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/examples/stations_connected.py b/py-scripts/examples/stations_connected.py
index 576031221..c406b26bc 100755
--- a/py-scripts/examples/stations_connected.py
+++ b/py-scripts/examples/stations_connected.py
@@ -36,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)

From 7e155f287b72c6feaae4ced458cf1e8acef68cc3 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 09:46:20 -0700
Subject: [PATCH 162/376] throughput_qos.py: linting fixes

Signed-off-by: Alex Gavin 
---
 py-scripts/throughput_qos.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

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())

From 767e1babe22739bbc2e0ee2a140b63f2424a6233 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:24:41 -0700
Subject: [PATCH 163/376] run_cv_scenario.py: Fix linting error

Signed-off-by: Alex Gavin 
---
 py-scripts/run_cv_scenario.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/run_cv_scenario.py b/py-scripts/run_cv_scenario.py
index 5f00699c8..cf0cd36b5 100755
--- a/py-scripts/run_cv_scenario.py
+++ b/py-scripts/run_cv_scenario.py
@@ -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"]:

From b802a71df23243d0662343154b161c7bf5977f90 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:25:32 -0700
Subject: [PATCH 164/376] modify_station.py: Fix linting error

Signed-off-by: Alex Gavin 
---
 py-scripts/modify_station.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/modify_station.py b/py-scripts/modify_station.py
index 88f3099d7..a5b809011 100755
--- a/py-scripts/modify_station.py
+++ b/py-scripts/modify_station.py
@@ -180,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"]):

From 7b29df50cd37d890441e198f58171ff419d9dba2 Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:26:14 -0700
Subject: [PATCH 165/376] tip_station_powersave.py: Fix linting error

Signed-off-by: Alex Gavin 
---
 py-scripts/tip_station_powersave.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/py-scripts/tip_station_powersave.py b/py-scripts/tip_station_powersave.py
index f80fdadb8..bc309854c 100755
--- a/py-scripts/tip_station_powersave.py
+++ b/py-scripts/tip_station_powersave.py
@@ -325,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 = {}
@@ -344,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

From 1cbb7cecaa6a02d443406c0c54b450a3caef54db Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:27:38 -0700
Subject: [PATCH 166/376] test_l3_WAN_LAN.py: Fix linting error

Signed-off-by: Alex Gavin 
---
 py-scripts/test_l3_WAN_LAN.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/test_l3_WAN_LAN.py b/py-scripts/test_l3_WAN_LAN.py
index 35db68b71..83b82ac2b 100755
--- a/py-scripts/test_l3_WAN_LAN.py
+++ b/py-scripts/test_l3_WAN_LAN.py
@@ -93,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

From 3e0fdfa9152a27b59b0b6473db118aef3e04941f Mon Sep 17 00:00:00 2001
From: Alex Gavin 
Date: Fri, 11 Jul 2025 11:27:51 -0700
Subject: [PATCH 167/376] test_fileio.py: Fix linting error

Signed-off-by: Alex Gavin 
---
 py-scripts/test_fileio.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/test_fileio.py b/py-scripts/test_fileio.py
index a7de314d0..ce7b45526 100755
--- a/py-scripts/test_fileio.py
+++ b/py-scripts/test_fileio.py
@@ -837,7 +837,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']
 

From c4d3516ecba6e9f8c141049b25bab2d591f0db7a Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 12 Jul 2025 08:03:47 -0600
Subject: [PATCH 168/376] py-scripts/test_l3_powersave_traffic.py flake8
 compliance

Verification:
./test_l3_powersave_traffic.py\
 --mgr 192.168.50.100\
 --port 8080\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --security wpa2\
 --radio wiphy2\
 --upstream_port 1.1.eth2

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_l3_powersave_traffic.py | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/py-scripts/test_l3_powersave_traffic.py b/py-scripts/test_l3_powersave_traffic.py
index e06d892f1..3846fdaf3 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='''\
+    help_summary = '''\
 Script not functional or no longer supported: 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)

From 76eb4c17380e93221f56151c02df311e870a7bec Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 12 Jul 2025 08:07:35 -0600
Subject: [PATCH 169/376] py-scripts/test_l3_powersave_traffic.py updated
 comments the script is functional.

Verification:
./test_l3_powersave_traffic.py\
 --mgr 192.168.50.100\
 --port 8080\
 --ssid ax1800_5g\
 --passwd lf_ax1800_5g\
 --security wpa2\
 --radio wiphy2\
 --upstream_port 1.1.eth2

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/test_l3_powersave_traffic.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py-scripts/test_l3_powersave_traffic.py b/py-scripts/test_l3_powersave_traffic.py
index 3846fdaf3..604db38fe 100755
--- a/py-scripts/test_l3_powersave_traffic.py
+++ b/py-scripts/test_l3_powersave_traffic.py
@@ -188,7 +188,7 @@ def main():
     args = parser.parse_args()
 
     help_summary = '''\
-Script not functional or no longer supported: see script py-scripts/test_l3.py as replacement
+Script shows example of creating L3 connections: see script py-scripts/test_l3.py as replacement
 '''
     if args.help_summary:
         print(help_summary)

From b6bdb85ea45aec66c9684fc703aca1674725b5f3 Mon Sep 17 00:00:00 2001
From: Chuck SmileyRekiere 
Date: Sat, 12 Jul 2025 09:24:29 -0600
Subject: [PATCH 170/376] py-scripts/lf_roam_test.py  flake8 compliance

This test requires specific setup with an attenuator and two APs
that support FT-PSK (11r).  Verified to the best of ability

Verification:

./lf_roam_test.py  for hard roam remove --soft_roam TRUE

./lf_roam_test.py\
 --mgr 192.168.50.11\
 --ap1_bssid "04:f0:21:f2:ea:79"\
 --ap2_bssid "04:f0:21:f2:ea:79"\
 --fiveg_radios "1.1.wiphy1"\
 --band "fiveg"\
 --sniff_radio "wiphy0"\
 --num_sta 1\
 --ssid_name "routed-AP"\
 --security "open"\
 --security_key "BLANK"\
 --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

Signed-off-by: Chuck SmileyRekiere 
---
 py-scripts/lf_roam_test.py | 63 +++++++++++++++++++-------------------
 1 file changed, 31 insertions(+), 32 deletions(-)

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() From 1e25b9a625341f415eab998943258f332b5cf63f Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 15 Jul 2025 10:42:59 -0600 Subject: [PATCH 171/376] py-scripts/run_voip_cx.py flake8 compliance Verification: ./run_voip_cs.py --help Signed-off-by: Chuck SmileyRekiere --- py-scripts/run_voip_cx.py | 52 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 27 deletions(-) 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() From c99cd73f5fd0fc5693637c388cd4b5c8af70f35a Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 18 Jul 2025 13:24:58 -0600 Subject: [PATCH 172/376] py-scripts/tools/lf_qa.py https://candelatech.atlassian.net/browse/LAN-4243 Added details to AP auto tests Verification: ./lf_check.py\ --json_rig ./ct_rig_json/ct_us_005_rig.json\ --json_dut ./ct_dut_json/ct_005_AXE11000_dut.json\ --json_test ./ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json:ct_ap_auto_capacity_005\ --db_override ./tools/test_005_delete_7_18_25.db\ --path '/home/lanforge/html-reports/ct_us_005 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_qa.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/py-scripts/tools/lf_qa.py b/py-scripts/tools/lf_qa.py index a67721f62..7c940589d 100755 --- a/py-scripts/tools/lf_qa.py +++ b/py-scripts/tools/lf_qa.py @@ -914,10 +914,19 @@ 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", @@ -926,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]}", ]) ) From 3ecab2db510457d1fa8827bc3def5db2622dc9f6 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 18 Jul 2025 17:45:44 -0600 Subject: [PATCH 173/376] py-scripts/lf_report.py if the allure history is not present then create the directory Verified: vscode //// lf_check.py 008 ct_us_008 "args": [ "--json_rig","./ct_rig_json/ct_us_008_rig_TP_BE19000.json", "--json_dut","./ct_dut_json/ct_008_TP_BE19000_dut.json", "--json_test","./ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json:ct_test_l3", "--db_override","./tools/test_008_delete_7_18_25.db", "--path","/home/lanforge/html-reports/ct_us_008" ] Signed-off-by: Chuck SmileyRekiere --- py-scripts/lf_report.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) 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 From 056a2dfeb74a089d0f3721794fb1ed699cc0c0af Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 21 Jul 2025 16:45:35 -0600 Subject: [PATCH 174/376] [tools] py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json Initial commit Verificed: //// lf_check.py 008 ct_us_008 "args": [ "--json_rig","./ct_rig_json/ct_us_008_rig_TP_BE19000.json", "--json_dut","./ct_dut_json/ct_008_TP_BE19000_dut.json", "--json_test","./ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json:ct_test_l3", "--db_override","./tools/test_008_delete_7_18_25.db", "--path","/home/lanforge/html-reports/ct_us_008" ] Signed-off-by: Chuck SmileyRekiere --- .../ct_perf_functional/ct_test_l3.json | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json b/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json new file mode 100644 index 000000000..57bc55cff --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json @@ -0,0 +1,113 @@ +{ + "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":"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==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=600000000", + " --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":"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==1,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps 6933000000", + " --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=20000 --side_b_min_bps=96000000", + " --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":"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==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps=600000000", + " --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":"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==34,ssid==SSID_USED,ssid_pw==SSID_PW_USED,security==SECURITY_USED' ", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=20000 --side_b_min_bps 6933000000", + " --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=20000 --side_b_min_bps=96000000", + " --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" + ] + }, + + "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" + ] + } + } + } +} From 0ad2b24c44db889bc3ffe6a26d1c6d452f37c034 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 22 Jul 2025 10:15:54 -0700 Subject: [PATCH 175/376] py-json: multicast_profile.py: Fix linting error Signed-off-by: Alex Gavin --- py-json/multicast_profile.py | 1 - 1 file changed, 1 deletion(-) 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, From dfdd4ebc44534a0240472dd323330ed35eb8ecbe Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 22 Jul 2025 10:28:15 -0700 Subject: [PATCH 176/376] py-json: test_group_profile.py: Fix linting error Verified: ./testgroup.py --list_groups Signed-off-by: Alex Gavin --- py-json/test_group_profile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-json/test_group_profile.py b/py-json/test_group_profile.py index 010cf1f35..ae01ee835 100644 --- a/py-json/test_group_profile.py +++ b/py-json/test_group_profile.py @@ -84,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 @@ -97,7 +97,7 @@ def list_cxs(self): 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'] From 9d805a0e0bb73cc293c05c147bfd7de7f2401e8b Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 22 Jul 2025 10:43:21 -0700 Subject: [PATCH 177/376] py-json: cv_test_manager.py: Fix linting error, add to linting checks Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 4af294384..af61ea463 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -1,4 +1,3 @@ -# flake8: noqa """ Note: This script is working as library for chamberview tests. It holds different commands to automate test. @@ -9,9 +8,7 @@ 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") @@ -151,7 +148,7 @@ 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) @@ -459,7 +456,6 @@ 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. if not self.get_is_running(instance_name): logger.info("Detected test is not running %s / 5." % (not_running)) @@ -497,9 +493,9 @@ 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 From 90f1786f457cb83458378040fe2566e541074178 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 22 Jul 2025 16:15:23 -0700 Subject: [PATCH 178/376] py-json: cv_test_manager.py: Add type hints to function definitions Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 105 ++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index af61ea463..ac6a7daea 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -126,21 +126,19 @@ def cv_add_base_parser(parser): class cv_test(Realm): 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): 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): + def create_test_config(self, config_name: str, blob_test_name: str, text: str): req_url = "/cli-json/add_text_blob" data = { "type": "Plugin-Settings", @@ -153,32 +151,32 @@ def create_test_config(self, config_name, blob_test_name, text): 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): + def create_test(self, test_name: str, instance: str, load_old_cfg: int): 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): + def load_test_scenario(self, instance: str, scenario: str): 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): + def load_test_config(self, test_config: str, instance: str): cmd = "cv load '{0}' '{1}'".format(instance, test_config) self.run_cv_cmd(cmd) # start the test - def start_test(self, instance): + def start_test(self, instance: str): cmd = "cv click '%s' Start" % instance return self.run_cv_cmd(cmd) # close test - def close_test(self, instance): + def close_test(self, instance: str): cmd = "cv click '%s' 'Close'" % instance self.run_cv_cmd(cmd) # Cancel - def cancel_test(self, instance): + def cancel_test(self, instance: str): cmd = "cv click '%s' Cancel" % instance self.run_cv_cmd(cmd) @@ -186,36 +184,36 @@ def cancel_test(self, instance): # 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): + def auto_save_report(self, instance: str): 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): + def set_auto_save_report(self, instance: str, onoff: int): 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 get_report_location(self, instance: str): 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): + def get_is_running(self, instance: str): cmd = "cv get '%s' 'StartStop'" % instance val = self.run_cv_cmd(cmd) # pprint(val) return val[0]["LAST"]["response"] == 'StartStop::Stop' # To save to html - def save_html(self, instance): + def save_html(self, instance: str): cmd = "cv click %s 'Save HTML'" % instance self.run_cv_cmd(cmd) # Check if test instance exists - def get_exists(self, instance): + def get_exists(self, instance: str): cmd = "cv exists %s" % instance val = self.run_cv_cmd(cmd) # pprint(val) @@ -231,7 +229,7 @@ def get_cv_is_built(self): return rv # delete the test instance - def delete_instance(self, instance): + def delete_instance(self, instance: str): cmd = "cv delete '%s'" % instance self.run_cv_cmd(cmd) @@ -260,11 +258,11 @@ def delete_instance(self, instance): break # Get port listing - def get_ports(self, url="/ports/"): + def get_ports(self, url: str = "/ports/"): 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): req_url = "/cli-json/show_text_blob" response_json = [] data = {"type": "Plugin-Settings"} @@ -277,7 +275,7 @@ 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): req_url = "/cli-json/rm_text_blob" data = { "type": "Plugin-Settings", @@ -285,7 +283,7 @@ 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): + def rm_cv_text_blob(self, cv_type: str = "Network-Connectivity", name: str = None): req_url = "/cli-json/rm_text_blob" data = { "type": cv_type, @@ -294,7 +292,7 @@ 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): # Read in calibration data and whatever else. if raw_lines_file != "": @@ -319,7 +317,7 @@ 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): for value in cfg_options: self.create_test_config(config_name, blob_test, value) @@ -345,9 +343,20 @@ def build_cfg(self, config_name, blob_test, cfg_options): # 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): load_old = "false" if load_old_cfg: load_old = "true" @@ -478,7 +487,7 @@ def create_and_run_test(self, load_old_cfg, test_name, instance_name, config_nam else: break - def kpi_results_present(self): + def kpi_results_present(self) -> bool: kpi_csv_data_present = False kpi_csv = '' @@ -502,17 +511,17 @@ def kpi_results_present(self): # ************************** chamber view ************************** 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 = ""): req_url = "/cli-json/add_text_blob" text_blob = "profile_link" + " " + Resources + " " + Profile + " " + Amount + " " + "\'DUT:" + " " + DUT \ @@ -530,8 +539,8 @@ 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 = ""): req_url = "/cli-json/add_text_blob" data = { "type": "Network-Connectivity", @@ -542,12 +551,12 @@ def pass_raw_lines_to_cv(self, # This is for chamber view buttons - def apply_cv_scenario(self, cv_scenario): + def apply_cv_scenario(self, cv_scenario: str): 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): # build chamber view scenario + def build_cv_scenario(self): cmd = "cv build" self.run_cv_cmd(cmd) logger.info("Building scenario") @@ -561,7 +570,7 @@ def sync_cv(self): # sync cmd = "cv sync" logger.info(self.run_cv_cmd(cmd)) - def run_cv_cmd(self, command): # Send chamber view commands + def run_cv_cmd(self, command: str): # Send chamber view commands response_json = [] req_url = "/gui-json/cmd" data = {"cmd": command} @@ -569,7 +578,7 @@ def run_cv_cmd(self, command): # Send chamber view commands return response_json @staticmethod - def get_response_string(response): + def get_response_string(response: list): return response[0]["LAST"]["response"] def get_popup_info_and_close(self): From ff9a39ff808a62bdb07841e74c27510b21c93cad Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 22 Jul 2025 16:18:58 -0700 Subject: [PATCH 179/376] py-json: cv_test_manager.py: Add/update function docstrings Verified: ./lf_wifi_capacity_test.py \ --duration 60000 \ --protocol UDP \ --upstream 1.2.AP-ROOT-LAN \ --stations 1.1.sta0000 \ --batch_size 1 Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 187 ++++++++++++++++++++++++++++++------- 1 file changed, 153 insertions(+), 34 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index ac6a7daea..7269e8d92 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -1,8 +1,4 @@ -""" -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 @@ -26,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]) @@ -35,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, @@ -125,20 +123,29 @@ def cv_add_base_parser(parser): class cv_test(Realm): + """Utilities for configuring LANforge Chamber View tests and Scenarios.""" def __init__(self, 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_) 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. + # ~~~ 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", @@ -150,77 +157,105 @@ def create_test_config(self, config_name: str, blob_test_name: str, text: str): self.json_post(req_url, data) - # Tell LANforge GUI Chamber View to launch a test 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. + """ 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: 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. + """ 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: 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. + """ cmd = "cv load '{0}' '{1}'".format(instance, test_config) self.run_cv_cmd(cmd) - # start the test 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.""" cmd = "cv click '%s' Start" % instance return self.run_cv_cmd(cmd) - # close test def close_test(self, instance: str): + """Close the Chamber View test window for specified test instance.""" # TODO: Assume it also stops the test? cmd = "cv click '%s' 'Close'" % instance self.run_cv_cmd(cmd) - # Cancel def cancel_test(self, instance: str): + """Cancel the Chamber View test for specified test 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: 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. + """ 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: 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. + """ 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: 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: str): + """Query test status of the specified Chamber View test instance.""" cmd = "cv get '%s' 'StartStop'" % instance val = self.run_cv_cmd(cmd) # pprint(val) return val[0]["LAST"]["response"] == 'StartStop::Stop' - # To save to html def save_html(self, instance: str): + """Save the test results for the specified Chamber View test instance. + + This assumes that the test has completed. + """ cmd = "cv click %s 'Save HTML'" % instance self.run_cv_cmd(cmd) - # Check if test instance exists def get_exists(self, instance: str): + """Query existence of specified Chamber View test instance.""" cmd = "cv exists %s" % instance val = self.run_cv_cmd(cmd) # pprint(val) return val[0]["LAST"]["response"] == 'YES' - # Check if chamberview is built def get_cv_is_built(self): + """Query status of specified Chamber View Scenario (built or not).""" cmd = "cv is_built" val = self.run_cv_cmd(cmd) # pprint(val) @@ -228,8 +263,8 @@ def get_cv_is_built(self): logger.info("is-built: {rv} ".format(rv=rv)) return rv - # delete the test instance def delete_instance(self, instance: str): + """Delete specified Chamber View test instance.""" cmd = "cv delete '%s'" % instance self.run_cv_cmd(cmd) @@ -257,12 +292,17 @@ def delete_instance(self, instance: str): else: break - # Get port listing 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: 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"} @@ -276,6 +316,11 @@ def show_text_blob(self, config_name: str, blob_test_name: str, brief: bool): return response_json 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", @@ -283,7 +328,13 @@ def rm_text_blob(self, config_name: str, blob_test_name: str): } self.json_post(req_url, data) + # 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, @@ -293,7 +344,7 @@ def rm_cv_text_blob(self, cv_type: str = "Network-Connectivity", name: str = Non @staticmethod 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 @@ -318,6 +369,10 @@ def apply_cfg_options(cfg_options: list, enables: list, disables: list, raw_line cfg_options.append(r[0]) 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) @@ -357,6 +412,23 @@ def create_and_run_test(self, local_lf_report_dir: str = None, ssh_port: int = 22, graph_groups_file: str = None): + """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" @@ -488,6 +560,7 @@ def create_and_run_test(self, break 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 = '' @@ -509,7 +582,7 @@ def kpi_results_present(self) -> bool: return kpi_csv_data_present - # ************************** chamber view ************************** + # ~~~ Chamber View Scenario functions ~~~ def add_text_blob_line(self, scenario_name: str = "Automation", Resources: str = "1.1", @@ -522,6 +595,10 @@ def add_text_blob_line(self, 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 \ @@ -541,6 +618,15 @@ def add_text_blob_line(self, def pass_raw_lines_to_cv(self, 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", @@ -549,28 +635,59 @@ 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): - cmd = "cv apply '%s'" % cv_scenario # To apply scenario + """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. + """ + cmd = "cv apply '%s'" % cv_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. + + Assumes scenario exists and is already staged (see `apply_cv_scenario()`). + Status of scenario can be queried with `get_cv_build_status()`. + + While Chamber View tests may rely on existing Chamber View Scenarios, + they are unique and rely on separate configuration for use in LANforge. + """ cmd = "cv build" self.run_cv_cmd(cmd) logger.info("Building scenario") - def get_cv_build_status(self): # check if scenario is 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. + """ cmd = "cv is_built" response = self.run_cv_cmd(cmd) return self.check_reponse(response) - def sync_cv(self): # sync + def sync_cv(self): + """Request GUI update Chamber View with configuration active in system. + + 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. + """ cmd = "cv sync" logger.info(self.run_cv_cmd(cmd)) - def run_cv_cmd(self, command: str): # Send chamber view commands + 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. + """ response_json = [] req_url = "/gui-json/cmd" data = {"cmd": command} @@ -579,9 +696,11 @@ def run_cv_cmd(self, command: str): # Send chamber view commands @staticmethod def get_response_string(response: list): + """Extract response string from specified message.""" return response[0]["LAST"]["response"] def get_popup_info_and_close(self): + """Grab info from and close any pop-up dialog box in Chamber View.""" cmd = "cv get_and_close_dialog" dialog = self.run_cv_cmd(cmd) if dialog[0]["LAST"]["response"] != "NO-DIALOG": From d15f9aba39a40488ee0018f7b8783a4cd1552b42 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 9 Jan 2025 14:09:17 -0800 Subject: [PATCH 180/376] lf_wifi_capacity_test.py: Update docstring Verified: ./lf_wifi_capacity_test.py \ --duration 60000 \ --protocol UDP \ --upstream 1.2.AP-ROOT-LAN \ --stations 1.1.sta0000 \ --batch_size 1 Signed-off-by: Alex Gavin --- py-scripts/lf_wifi_capacity_test.py | 498 ++++++---------------------- 1 file changed, 95 insertions(+), 403 deletions(-) diff --git a/py-scripts/lf_wifi_capacity_test.py b/py-scripts/lf_wifi_capacity_test.py index 8d098c1b7..ffe1c917e 100755 --- a/py-scripts/lf_wifi_capacity_test.py +++ b/py-scripts/lf_wifi_capacity_test.py @@ -1,340 +1,52 @@ #!/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 \ + --config_name wifi_config \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000 \ + --protocol UDP \ + --duration 6000 + + # 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 \ + --config_name wifi_config \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000,1.1.sta0001 \ + --protocol TCP \ + --duration 30000 \ + --batch_size 2 + +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 @@ -564,74 +276,54 @@ 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 \ + --config_name wifi_config \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000 \ + --protocol UDP \ + --duration 6000 + + # 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 \ + --config_name wifi_config \ + --upstream 1.1.eth1 \ + --stations 1.1.sta0000,1.1.sta0001 \ + --protocol TCP \ + --duration 30000 \ + --batch_size 2 + +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 From 44f6c263a81edbd914816bd348a7a70ff13c127f Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Wed, 23 Jul 2025 17:22:10 -0700 Subject: [PATCH 181/376] l4_cxprofile: LAN-4247 - proper json handling when only a single endpoint is given The check_request_rate and check_errors methods were crashing when the user was only using a single station. They now check if they have received a list of endpoints or a single endpoint. Verification ./test_l4.py --mgr localhost --upstream_port eth1 --radio wiphy0 --num_stations 1 --security open --ssid 102-tplinkB-5g --test_duration 30s --url "dl http://192.168.0.103/ /dev/null" --requests_per_ten 600 --test_type 'urls' --test_rig Test-Lab --dut_hw_version Linux --test_id "L4 data" Signed-off-by: Liam Reynolds --- py-json/l4_cxprofile.py | 54 +++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 18 deletions(-) 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: From a4d02ced9e91dec5a99db84f9cafc8ed7204f6cf Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 17 Jul 2025 12:29:52 +0530 Subject: [PATCH 182/376] lf_webpage.py: Renamed graph image name for mixed traffic test support. Signed-off-by: Sidartha-CT --- py-scripts/lf_webpage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index 433c08b6b..0f25f60ba 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -991,7 +991,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 +1023,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() From b8c7b2a117c8ac1cd6a7dfd89cdb5a143b6679a4 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 17 Jul 2025 12:33:43 +0530 Subject: [PATCH 183/376] lf_webpage.py: For real devices added monitor_cx to wait for CX creation. - Waits up to 20 retries for all CXs (connections) to be created. - Devices will be excluded from the test if their cross-connections are not created. - Moved the device categorization code in main below the monitor_cx call to ensure it uses the updated values. Signed-off-by: Sidartha-CT --- py-scripts/lf_webpage.py | 124 ++++++++++++++++++++++++++++----------- 1 file changed, 90 insertions(+), 34 deletions(-) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index 0f25f60ba..8fba78dd5 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -1521,6 +1521,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 BaseException: + 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: @@ -1886,38 +1939,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 +1949,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") @@ -2081,6 +2105,38 @@ def main(): duration = str(duration / 3600) + "h" 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 +2145,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 +2155,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 } From 31ee273c02c4b969360733cc5cb9d678091364d4 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 17 Jul 2025 12:40:04 +0530 Subject: [PATCH 184/376] lf_webpage.py: Added total_errors column in csv and report Signed-off-by: Sidartha-CT --- py-scripts/lf_webpage.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index 8fba78dd5..8fb1af2c4 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -667,6 +667,11 @@ def monitor_for_runtime_csv(self, duration): url_times = self.my_monitor('total-urls') rx_rate = self.my_monitor('rx rate (1m)') bytes_rd = self.my_monitor('bytes-rd') + total_err = self.my_monitor('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 @@ -706,6 +711,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 +720,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 @@ -1289,7 +1296,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 From 9fae2efb07f44a9fe159badbb2e163dd2321db0e Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 17 Jul 2025 12:44:51 +0530 Subject: [PATCH 185/376] lf_webpage.py: Added a function to save all L4 data in csv. Signed-off-by: Sidartha-CT --- py-scripts/lf_webpage.py | 53 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index 8fb1af2c4..0bc6e2328 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -752,6 +752,55 @@ def monitor_for_runtime_csv(self, duration): 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 + 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: + 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 @@ -1065,6 +1114,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: + 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) From 5e35c0ae0285a605f94454c68a696796b0da0464 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 17 Jul 2025 13:02:32 +0530 Subject: [PATCH 186/376] lf_webpage.py: moved dowebgui code above to generate_report. -For the purpose of testhouse ,moved dewebgui code to above the generate_report. Signed-off-by: Sidartha-CT --- py-scripts/lf_webpage.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index 0bc6e2328..a762ddfaa 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -2032,7 +2032,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') @@ -2275,6 +2275,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, @@ -2288,13 +2298,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() From fdc91d4723ff2029805524c132d28712a59a8bb9 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 17 Jul 2025 13:13:37 +0530 Subject: [PATCH 187/376] lf_webpage.py: Added testhouse live_view specific args and save images. -Images generated from testhouse live_view are being stored in result directory, then added to report via add_live_view_images_to_report_function. Signed-off-by: Sidartha-CT --- py-scripts/lf_webpage.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index a762ddfaa..d4744e23a 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -119,7 +119,7 @@ def __init__(self, lfclient_host, lfclient_port, upstream, num_sta, security, ss 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, 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 = [] @@ -195,6 +195,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): @@ -1097,6 +1099,25 @@ 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, @@ -1156,6 +1177,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 " + @@ -1849,6 +1872,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 @@ -1976,7 +2001,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): From c075ad81e0b6b8e24a1b1e65afbc4d89fb5dee91 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Thu, 17 Jul 2025 15:09:32 +0530 Subject: [PATCH 188/376] lf_webpage.py:fixed linting errors using flake8/autopep8. Verified CLI(Real Clients) :python3 lf_webpage.py --ap_name "Cisco" --mgr 192.168.204.75 --ssid Cisco-5g --security wpa2 --passwd sharedsecret --upstream_port eth1 --duration 1m --bands 5G --client_type Real --file_size 2MB --device_list 1.95 Verified CLI(Virtual Clients) : python3 lf_webpage.py --ap_name "Netgear" --mgr 192.168.204.75 --twog_ssid NETGEAR_2G_wpa2 --twog_security wpa2 --twog_passwd Password@123 --twog_radio wiphy0 --upstream_port eth1 --duration 1m --bands 2.4G --client_type Virtual --file_size 2MB --num_stations 3 Signed-off-by: Sidartha-CT --- py-scripts/lf_webpage.py | 68 ++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index d4744e23a..fbbf0bfe3 100755 --- a/py-scripts/lf_webpage.py +++ b/py-scripts/lf_webpage.py @@ -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,get_live_view=False,total_floors=0,): + 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 = [] @@ -282,7 +282,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']: @@ -672,7 +672,7 @@ def monitor_for_runtime_csv(self, duration): total_err = self.my_monitor('total-err') urls_downloaded = [] for i in range(len(total_err)): - urls_downloaded.append(url_times[i]-total_err[i]) + 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 @@ -758,15 +758,14 @@ def monitor_for_runtime_csv(self, duration): all_l4_data = self.get_all_l4_data() df = pd.DataFrame(all_l4_data) df.to_csv("all_l4_data.csv", index=False) - except: + 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. + 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", @@ -868,7 +867,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 = [] @@ -918,7 +917,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 = [] @@ -1099,25 +1098,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 + 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): - report.set_custom_html('
') - report.build_custom() - report.set_custom_html(f'') - report.build_custom() + 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, @@ -1137,7 +1137,7 @@ def generate_report(self, date, num_stations, duration, test_setup_info, dataset shutil.move('http_datavalues.csv', report_path_date_time) try: shutil.move('all_l4_data.csv', report_path_date_time) - except: + 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: @@ -1177,7 +1177,7 @@ 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): + 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 " @@ -1510,7 +1510,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: @@ -1630,7 +1630,7 @@ def monitor_cx(self): try: _ = self.local_realm.json_get("layer4/%s/list?fields=%s" % (created_cxs, 'status'))['endpoint']['status'] - except BaseException: + 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]) @@ -2002,8 +2002,8 @@ def main(): device_csv_name=args.device_csv_name, wait_time=args.wait_time, config=args.config, - get_live_view= args.get_live_view, - total_floors = args.total_floors + get_live_view=args.get_live_view, + total_floors=args.total_floors ) if args.client_type == "Real": if not isinstance(args.device_list, list): From f7e68c434672e339f5230da99c9e8051624bc56f Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Fri, 18 Jul 2025 11:19:09 +0530 Subject: [PATCH 189/376] lf_interop_qos.py: Added exception handling for while monitoring endp data. -Some CXs were occasionally disappearing during L3 endpoint monitoring, affecting the whole test. Added exception handling to continue with remaining devices. Signed-off-by: Sidartha-CT --- py-scripts/lf_interop_qos.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index 37a0cae97..f4318cb3a 100755 --- a/py-scripts/lf_interop_qos.py +++ b/py-scripts/lf_interop_qos.py @@ -987,16 +987,21 @@ def evaluate_qos(self, connections_download, connections_upload, drop_a_per, dro current_tos = temp[0].split('_')[-1] # slicing TOS from CX name temp = int(temp[1]) counter = 0 - 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)) + # 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: + 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}")}) @@ -1999,8 +2004,13 @@ 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: + 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 = [] From d2f985a99252a990b977c1b25e3edf73a8179871 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Fri, 18 Jul 2025 11:33:20 +0530 Subject: [PATCH 190/376] lf_interop_qos.py: Add support for saving individual CSVs for real devices Signed-off-by: Sidartha-CT --- py-scripts/lf_interop_qos.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index f4318cb3a..eff4c8ef7 100755 --- a/py-scripts/lf_interop_qos.py +++ b/py-scripts/lf_interop_qos.py @@ -702,6 +702,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() @@ -859,6 +864,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) From 5a27686c0b71a50235cfac5ee93ff73b2535198b Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Fri, 18 Jul 2025 11:46:55 +0530 Subject: [PATCH 191/376] lf_interop_qos.py: moved dowebgui code above to generate_report. -For the purpose of testhouse ,moved dewebgui code to above the generate_report. Signed-off-by: Sidartha-CT --- py-scripts/lf_interop_qos.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index eff4c8ef7..1b30d35be 100755 --- a/py-scripts/lf_interop_qos.py +++ b/py-scripts/lf_interop_qos.py @@ -2451,6 +2451,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, @@ -2472,17 +2485,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() From 843128b705cb5ebdfd4e4b817ba318be5d647537 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Fri, 18 Jul 2025 12:15:13 +0530 Subject: [PATCH 192/376] lf_interop_qos.py: Added testhouse live_view specific args and save images. -Images generated from testhouse live_view are being stored in result directory, then added to report. Signed-off-by: Sidartha-CT --- py-scripts/lf_interop_qos.py | 103 +++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 4 deletions(-) diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index 1b30d35be..bbd14f07c 100755 --- a/py-scripts/lf_interop_qos.py +++ b/py-scripts/lf_interop_qos.py @@ -171,7 +171,9 @@ 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), self.ssid_list = [] @@ -256,6 +258,8 @@ 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") @@ -1296,7 +1300,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() @@ -1397,13 +1400,70 @@ 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!=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': [], @@ -1569,6 +1629,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)): @@ -1692,6 +1758,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)): @@ -1813,6 +1885,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)): @@ -1934,6 +2012,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)): @@ -2004,6 +2088,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 @@ -2301,6 +2392,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 @@ -2395,7 +2488,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() From 9ca7845c3635a51f381f238bd7870af6e6220f37 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Fri, 18 Jul 2025 13:12:15 +0530 Subject: [PATCH 193/376] lf_interop_qos.py:fixed linting errors using flake8/autopep8. Verified CLI : python3 lf_interop_qos.py --ap_name Cisco --mgr 192.168.204.75 --mgr_port 8080 --ssid Cisco --passwd cisco@123 --security wpa2 --upstream eth1 --test_duration 1m --download 1000000 --upload 0 --traffic_type lf_udp --tos "VO,VI,BE,BK" Signed-off-by: Sidartha-CT --- py-scripts/lf_interop_qos.py | 126 +++++++++++++++++++---------------- 1 file changed, 69 insertions(+), 57 deletions(-) diff --git a/py-scripts/lf_interop_qos.py b/py-scripts/lf_interop_qos.py index bbd14f07c..784798297 100755 --- a/py-scripts/lf_interop_qos.py +++ b/py-scripts/lf_interop_qos.py @@ -132,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, @@ -147,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, @@ -175,13 +190,13 @@ def __init__(self, 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 @@ -211,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 @@ -266,7 +281,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 _a, b in element.items(): if "Apple" in b['hw version']: if b['kernel'] == '': self.hw_list.append('iOS') @@ -354,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']: @@ -500,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: @@ -548,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)) @@ -762,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([]) @@ -868,8 +883,8 @@ 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]] + 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) @@ -917,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]) @@ -1013,7 +1028,7 @@ def evaluate_qos(self, connections_download, connections_upload, drop_a_per, dro 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: + except Exception: logger.info(f'{sta}-A/B : CX Not Found') logger.info(f"Endpoint data : {endps}") counter += 1 @@ -1263,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", @@ -1406,10 +1421,10 @@ def get_live_view_images(self, multicast_exists=False): 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, + 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": [...], ... } @@ -1419,10 +1434,10 @@ def get_live_view_images(self, multicast_exists=False): 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") + 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") + rssi_image_path = os.path.join(self.result_dir, "live_view_images", f"{self.test_name}_rssi_{floor + 1}.png") start_time = time.time() @@ -1434,7 +1449,7 @@ def get_live_view_images(self, multicast_exists=False): break if time.time() - start_time > timeout: - print(f"Timeout: Images for TOS '{tos}' on Floor {floor+1} not found within 60 seconds.") + print(f"Timeout: Images for TOS '{tos}' on Floor {floor + 1} not found within 60 seconds.") break time.sleep(1) @@ -1447,11 +1462,9 @@ def get_live_view_images(self, multicast_exists=False): 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): + 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!=None: + if totalfloors is not None: self.total_floors = totalfloors load = "" upload_list, download_list, individual_upload_list, individual_download_list = [], [], [], [] @@ -1461,7 +1474,7 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne data_set = {} try: if (self.dowebgui and self.get_live_view) or multicast_exists: - tos_images,rssi_images = self.get_live_view_images() + 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 @@ -1499,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(): @@ -1512,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(): @@ -1530,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()) @@ -2089,7 +2102,7 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne 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(): + for _floor, rssi_image_path in rssi_images.items(): if os.path.exists(rssi_image_path): report.set_custom_html('
') report.build_custom() @@ -2108,10 +2121,9 @@ def generate_individual_graph(self, res, report, connections_download_avg, conne 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: + 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 = [] @@ -2416,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: From f23ac6864b441165a7f5076a3c13d08af168fab1 Mon Sep 17 00:00:00 2001 From: Nikhita Date: Thu, 24 Jul 2025 13:28:46 +0530 Subject: [PATCH 194/376] lf_interop_ping_plotter: Handle connectivity for WebGUI tests - Added logic to handle connectivity checks when tests are triggered from the WebGUI Verified CLI: python3 lf_interop_ping_plotter.py --mgr 192.168.244.97 --real --target 8.8.8.8 --ping_interval 1 --ping_duration 1m --ssid xiab_2G_WPA2 --security wpa2 --passwd lanforge --server_ip 192.168.1.14 --wait_time 30 Signed-off-by: Nikhita --- py-scripts/lf_interop_ping_plotter.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/py-scripts/lf_interop_ping_plotter.py b/py-scripts/lf_interop_ping_plotter.py index d5abd8939..7ffd52127 100755 --- a/py-scripts/lf_interop_ping_plotter.py +++ b/py-scripts/lf_interop_ping_plotter.py @@ -1697,15 +1697,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: From d15585a754984ec33350a2da8941abdc6451d492 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 15:42:17 -0700 Subject: [PATCH 195/376] py-json: cv_test_manager.py: Commenting test create/run function Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 49 ++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 7269e8d92..248e80795 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -384,20 +384,6 @@ def build_cfg(self, config_name: str, blob_test: str, cfg_options: list): # 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: bool, test_name: str, @@ -433,16 +419,16 @@ def create_and_run_test(self, 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}") @@ -465,6 +451,7 @@ def create_and_run_test(self, exit(1) time.sleep(1) + # 2. Configure test self.load_test_config(config_name, instance_name) self.set_auto_save_report(instance_name, "true") @@ -477,21 +464,24 @@ def create_and_run_test(self, 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: + # Report and close any dialogs 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"]) + # Query test status if ok_status: cmd = "cv get_status '%s'" % (instance_name) status = self.run_cv_cmd(cmd) @@ -503,6 +493,8 @@ def create_and_run_test(self, 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:::\"': @@ -537,7 +529,9 @@ def create_and_run_test(self, 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 @@ -545,11 +539,14 @@ def create_and_run_test(self, 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) From 9158c6605642717e68b1645e1b6b1c8d6d1cdb46 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 16:09:59 -0700 Subject: [PATCH 196/376] py-json: cv_test_manager.py: Tune down logging Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 248e80795..aa85e71ba 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -430,7 +430,6 @@ def create_and_run_test(self, start_try = 0 while True: 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: @@ -447,7 +446,7 @@ def create_and_run_test(self, 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) @@ -457,11 +456,9 @@ def create_and_run_test(self, 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 @@ -478,8 +475,7 @@ def create_and_run_test(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"]) + logger.warning(f"Popup Dialog: {dialog[0]["LAST"]["response"]}") # Query test status if ok_status: @@ -685,10 +681,15 @@ def run_cv_cmd(self, command: str): Aside from special cases, this is generally not to be used directly. """ + logger.debug(f"Running CV command: {command}") + response_json = [] - req_url = "/gui-json/cmd" - data = {"cmd": command} - self.json_post(req_url, data, debug_=False, response_json_list_=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 @staticmethod From f8f47ed6bcff85fa5c4568a1f8306feb90c3cf37 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 16:13:29 -0700 Subject: [PATCH 197/376] py-json: cv_test_manager.py: Group helper functions Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index aa85e71ba..b85cc8785 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -676,6 +676,12 @@ def sync_cv(self): cmd = "cv sync" logger.info(self.run_cv_cmd(cmd)) + # ~~~ Chamber View command helpers ~~~ + @staticmethod + 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. @@ -692,11 +698,6 @@ def run_cv_cmd(self, command: str): logger.debug(f"CV command response: {command}") return response_json - @staticmethod - def get_response_string(response: list): - """Extract response string from specified message.""" - return response[0]["LAST"]["response"] - def get_popup_info_and_close(self): """Grab info from and close any pop-up dialog box in Chamber View.""" cmd = "cv get_and_close_dialog" From adb9a1bc10c10ffcca11dcd99d2e2655e3864bd4 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 16:19:59 -0700 Subject: [PATCH 198/376] py-json: cv_test_manager.py: Simplify CV command wrappers Verified: ./lf_wifi_capacity_test.py \ --protocol UDP \ --upstream 1.1.eth1 \ --stations 1.1.sta0000 \ --batch_size 1 ./run_cv_scenario.py \ --lfmgr 192.168.1.101 \ --lanforge_db BaseState \ --cv_scenario BaseScenario \ --cv_test 'WiFi Capacity' Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 58 +++++++++++++------------------------- 1 file changed, 19 insertions(+), 39 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index b85cc8785..2c1446348 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -164,8 +164,7 @@ def create_test(self, test_name: str, instance: str, load_old_cfg: int): new test automation, as it manages process of configuring, invoking, and running a Chamber View test. """ - cmd = "cv create '{0}' '{1}' '{2}'".format(test_name, instance, load_old_cfg) - return self.run_cv_cmd(str(cmd)) + 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). @@ -177,8 +176,7 @@ def load_test_scenario(self, instance: str, scenario: str): new test automation, as it manages process of configuring, invoking, and running a Chamber View test. """ - cmd = "cv load '{0}' '{1}'".format(instance, scenario) - self.run_cv_cmd(cmd) + 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. @@ -187,8 +185,7 @@ def load_test_config(self, test_config: str, instance: str): new test automation, as it manages process of configuring, invoking, and running a Chamber View test. """ - cmd = "cv load '{0}' '{1}'".format(instance, test_config) - self.run_cv_cmd(cmd) + 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). @@ -196,18 +193,15 @@ def start_test(self, instance: str): 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.""" - cmd = "cv click '%s' Start" % instance - return self.run_cv_cmd(cmd) + 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? - cmd = "cv click '%s' 'Close'" % instance - self.run_cv_cmd(cmd) + self.run_cv_cmd(f"cv click '{instance}' 'Close'") def cancel_test(self, instance: str): """Cancel the Chamber View test for specified test instance.""" - cmd = "cv click '%s' Cancel" % instance - self.run_cv_cmd(cmd) + 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. @@ -215,16 +209,14 @@ def auto_save_report(self, instance: str): 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. """ - cmd = "cv click '%s' 'Auto Save Report'" % instance - self.run_cv_cmd(cmd) + 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. """ - cmd = "cv set '%s' 'Auto Save Report' %s" % (instance, onoff) - self.run_cv_cmd(cmd) + 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.""" @@ -234,9 +226,7 @@ def get_report_location(self, instance: str): def get_is_running(self, instance: str): """Query test status of the specified Chamber View test instance.""" - cmd = "cv get '%s' 'StartStop'" % instance - val = self.run_cv_cmd(cmd) - # pprint(val) + val = self.run_cv_cmd(f"cv get '{instance}' 'StartStop'") return val[0]["LAST"]["response"] == 'StartStop::Stop' def save_html(self, instance: str): @@ -244,29 +234,23 @@ def save_html(self, instance: str): This assumes that the test has completed. """ - cmd = "cv click %s 'Save HTML'" % instance - self.run_cv_cmd(cmd) + self.run_cv_cmd(f"cv click {instance} 'Save HTML'") def get_exists(self, instance: str): """Query existence of specified Chamber View test instance.""" - cmd = "cv exists %s" % instance - val = self.run_cv_cmd(cmd) - # pprint(val) + val = self.run_cv_cmd(f"cv exists {instance}") return val[0]["LAST"]["response"] == 'YES' def get_cv_is_built(self): """Query status of specified Chamber View Scenario (built or not).""" - cmd = "cv is_built" - val = self.run_cv_cmd(cmd) - # pprint(val) + val = self.run_cv_cmd("cv is_built") rv = val[0]["LAST"]["response"] == 'YES' logger.info("is-built: {rv} ".format(rv=rv)) return rv def delete_instance(self, instance: str): """Delete specified Chamber View test instance.""" - cmd = "cv delete '%s'" % instance - self.run_cv_cmd(cmd) + 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 @@ -638,8 +622,7 @@ def apply_cv_scenario(self, cv_scenario: str): While Chamber View tests may rely on existing Chamber View Scenarios, they are unique and rely on separate configuration for use in LANforge. """ - cmd = "cv apply '%s'" % cv_scenario - self.run_cv_cmd(cmd) + self.run_cv_cmd(f"cv apply '{cv_scenario}'") logger.info("Applying %s scenario" % cv_scenario) def build_cv_scenario(self): @@ -651,8 +634,7 @@ def build_cv_scenario(self): While Chamber View tests may rely on existing Chamber View Scenarios, they are unique and rely on separate configuration for use in LANforge. """ - cmd = "cv build" - self.run_cv_cmd(cmd) + self.run_cv_cmd("cv build") logger.info("Building scenario") def get_cv_build_status(self): @@ -661,8 +643,7 @@ def get_cv_build_status(self): While Chamber View tests may rely on existing Chamber View Scenarios, they are unique and rely on separate configuration for use in LANforge. """ - cmd = "cv is_built" - response = self.run_cv_cmd(cmd) + response = self.run_cv_cmd("cv is_built") return self.check_reponse(response) def sync_cv(self): @@ -673,8 +654,7 @@ def sync_cv(self): While Chamber View tests may rely on existing Chamber View Scenarios, they are unique and rely on separate configuration for use in LANforge. """ - cmd = "cv sync" - logger.info(self.run_cv_cmd(cmd)) + logger.info(self.run_cv_cmd("cv sync")) # ~~~ Chamber View command helpers ~~~ @staticmethod @@ -700,8 +680,8 @@ def run_cv_cmd(self, command: str): def get_popup_info_and_close(self): """Grab info from and close any pop-up dialog box in Chamber View.""" - cmd = "cv get_and_close_dialog" - dialog = self.run_cv_cmd(cmd) + dialog = self.run_cv_cmd("cv get_and_close_dialog") + if dialog[0]["LAST"]["response"] != "NO-DIALOG": logger.info("Popup Dialog:\n") logger.info(dialog[0]["LAST"]["response"]) From 656bf2dc64c8ffa567ccc03925807a44b0b58ec8 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 16:43:21 -0700 Subject: [PATCH 199/376] py-json: cv_test_manager.py: Refactor get and close dialog use Verified: ./lf_wifi_capacity_test.py \ --protocol UDP \ --upstream 1.1.eth1 \ --stations 1.1.sta0000 \ --batch_size 1 Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 2c1446348..83fe1d563 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -456,10 +456,7 @@ def create_and_run_test(self, ok_status = 1 while True: # Report and close any dialogs - cmd = "cv get_and_close_dialog" - dialog = self.run_cv_cmd(cmd) - if dialog[0]["LAST"]["response"] != "NO-DIALOG": - logger.warning(f"Popup Dialog: {dialog[0]["LAST"]["response"]}") + self.get_popup_info_and_close() # Query test status if ok_status: @@ -528,12 +525,9 @@ def create_and_run_test(self, # 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) -> bool: @@ -680,8 +674,11 @@ def run_cv_cmd(self, command: str): def get_popup_info_and_close(self): """Grab info from and close any pop-up dialog box in Chamber View.""" - dialog = self.run_cv_cmd("cv get_and_close_dialog") + 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}") - if dialog[0]["LAST"]["response"] != "NO-DIALOG": - logger.info("Popup Dialog:\n") - logger.info(dialog[0]["LAST"]["response"]) + return response From db1b81a9dc2845874e2c86523d1fa13bddb401d7 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 16:50:18 -0700 Subject: [PATCH 200/376] py-json: cv_test_manager.py: Add option to force test instance creation Add the '**kwargs' to support more simple invocation by CV test scripts. Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 83fe1d563..137f44ae4 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -121,6 +121,16 @@ 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.""" @@ -381,7 +391,9 @@ def create_and_run_test(self, cv_cmds: list, local_lf_report_dir: str = None, ssh_port: int = 22, - graph_groups_file: str = None): + graph_groups_file: str = None, + force: bool = False, + **kwargs): """Create and run Chamber View test with specified configuration. load_old_config is boolean @@ -428,6 +440,9 @@ def create_and_run_test(self, # 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.critical("Could not start within 60 tries, aborting.") From fccd0341d9f38cf1a1b9812341d15b55fdc098a6 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 17:14:34 -0700 Subject: [PATCH 201/376] py-json: cv_test_manager.py: Improve wrapper function logging Logging response results in garbage-looking output. Don't personally love logging w/in a library (personally feel that is application's job), but if we're going to do it, it's best that we log *before* we perform the operation. Signed-off-by: Alex Gavin --- py-json/cv_test_manager.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 137f44ae4..b0977fe30 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -631,8 +631,8 @@ def apply_cv_scenario(self, cv_scenario: str): 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}'") - logger.info("Applying %s scenario" % cv_scenario) def build_cv_scenario(self): """Make staged Chamber View Scenario active in testbed. @@ -643,8 +643,8 @@ def build_cv_scenario(self): 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") - logger.info("Building scenario") def get_cv_build_status(self): """Query whether Chamber View Scenario is active (built) in testbed. @@ -663,7 +663,8 @@ def sync_cv(self): 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(self.run_cv_cmd("cv sync")) + logger.info("Syncing Chamber View") + self.run_cv_cmd("cv sync") # ~~~ Chamber View command helpers ~~~ @staticmethod From f876244bf9ef61ed6f824e688b42e04dcbca4c40 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 17:07:24 -0700 Subject: [PATCH 202/376] lf_wifi_capacity_test.py: Refactor long function call/class invocation Signed-off-by: Alex Gavin --- py-scripts/lf_wifi_capacity_test.py | 36 ++++------------------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/py-scripts/lf_wifi_capacity_test.py b/py-scripts/lf_wifi_capacity_test.py index ffe1c917e..b3949656b 100755 --- a/py-scripts/lf_wifi_capacity_test.py +++ b/py-scripts/lf_wifi_capacity_test.py @@ -110,7 +110,7 @@ def __init__(self, local_lf_report_dir="", sta_list="", verbosity="5", - ): + **kwargs): super().__init__(lfclient_host=lfclient_host, lfclient_port=lf_port) if enables is None: @@ -250,10 +250,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 @@ -410,37 +409,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() From b3f0affa6cd7493f445e41cff13a633710945aec Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 17:09:39 -0700 Subject: [PATCH 203/376] lf_wifi_capacity_test.py: Add support for '--force' argument Verified: ./lf_wifi_capacity_test.py \ --protocol UDP \ --upstream 1.1.eth1 \ --stations 1.1.sta0000 \ --batch_size 1 Signed-off-by: Alex Gavin --- py-scripts/lf_wifi_capacity_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/py-scripts/lf_wifi_capacity_test.py b/py-scripts/lf_wifi_capacity_test.py index b3949656b..044f3e9ef 100755 --- a/py-scripts/lf_wifi_capacity_test.py +++ b/py-scripts/lf_wifi_capacity_test.py @@ -110,6 +110,7 @@ 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) @@ -158,6 +159,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 != "": From a723b28e7ed8e3cba23e00b5f7139d661895cd2c Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 23 Jul 2025 17:25:50 -0700 Subject: [PATCH 204/376] lf_wifi_capacity_test.py: Add config example in docstring Signed-off-by: Alex Gavin --- py-scripts/lf_wifi_capacity_test.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/py-scripts/lf_wifi_capacity_test.py b/py-scripts/lf_wifi_capacity_test.py index 044f3e9ef..a5d39e4e3 100755 --- a/py-scripts/lf_wifi_capacity_test.py +++ b/py-scripts/lf_wifi_capacity_test.py @@ -16,24 +16,29 @@ ./lf_wifi_capacity_test.py \ --mgr 192.168.1.101 \ --pull_report \ - --config_name wifi_config \ --upstream 1.1.eth1 \ --stations 1.1.sta0000 \ --protocol UDP \ - --duration 6000 + --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 \ - --config_name wifi_config \ --upstream 1.1.eth1 \ --stations 1.1.sta0000,1.1.sta0001 \ --protocol TCP \ - --duration 30000 \ + --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 @@ -294,24 +299,29 @@ def main(): ./lf_wifi_capacity_test.py \ --mgr 192.168.1.101 \ --pull_report \ - --config_name wifi_config \ --upstream 1.1.eth1 \ --stations 1.1.sta0000 \ --protocol UDP \ - --duration 6000 + --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 \ - --config_name wifi_config \ --upstream 1.1.eth1 \ --stations 1.1.sta0000,1.1.sta0001 \ --protocol TCP \ - --duration 30000 \ + --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 From e5b1d4d1b75481e76bfd9c661291677bcc072a84 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 25 Jul 2025 23:21:11 -0600 Subject: [PATCH 205/376] py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json test_l3.py tests Signed-off-by: Chuck SmileyRekiere --- .../ct_perf_functional/ct_test_l3.json | 75 ++++++++++++++++--- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json b/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json index 57bc55cff..9d71a70dc 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json +++ b/py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json @@ -10,27 +10,27 @@ "test_suites":{ "ct_test_l3":{ "TEST_L3_2G_MT7996E_STA_1_W0_TX":{ - "enabled":"FALSE", + "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=20000 --side_b_min_bps=600000000", + " --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":"FALSE", + "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=20000 --side_b_min_bps 6933000000", + " --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" ] @@ -43,33 +43,72 @@ "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=20000 --side_b_min_bps=96000000", + " --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":{ + "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=20000 --side_b_min_bps=600000000", + " --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":"TRUE", + "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=20000 --side_b_min_bps 6933000000", + " --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" ] @@ -82,12 +121,26 @@ "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=20000 --side_b_min_bps=96000000", + " --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", From 67ea3272a25257b7f971e41e5f1bc5a7b369e410 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 27 Jul 2025 09:26:22 -0600 Subject: [PATCH 206/376] [LANforge QA] py-scripts/tools/ct_rig_json/ct_us_001_rig.json updated email list Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_001_rig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_001_rig.json b/py-scripts/tools/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/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)" From d987869794c71e9564d14522d5e9db137e26d4aa Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 27 Jul 2025 09:26:56 -0600 Subject: [PATCH 207/376] [LANforge_QA]py-scripts/tools/ct_rig_json/ct_us_002_rig.json updated emails Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_002_rig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_002_rig.json b/py-scripts/tools/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/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" From 9d4d24a105958393a53d560632a7873927495658 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 27 Jul 2025 09:28:12 -0600 Subject: [PATCH 208/376] [LANforge_QA]py-scripts/tools/ct_rig_json/ct_us_003_rig.json updated emails Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_003_rig.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_003_rig.json b/py-scripts/tools/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/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 From 96eb8de80cb80881c8480d1d260dd01c441d7436 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 27 Jul 2025 09:28:34 -0600 Subject: [PATCH 209/376] py-scripts/tools/ct_rig_json/ct_us_004_rig.json updated email .ist Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_004_rig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_004_rig.json b/py-scripts/tools/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/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)" From 834388f8febd2e5d19eab2f7f8159f13c9a0ebef Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 27 Jul 2025 09:28:53 -0600 Subject: [PATCH 210/376] py-scripts/tools/ct_rig_json/ct_us_007_rig.json updated email list Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_007_rig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_007_rig.json b/py-scripts/tools/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/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" From 3e334a6907e8a6c4ac179974e433f103975bdb51 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 27 Jul 2025 09:29:28 -0600 Subject: [PATCH 211/376] [LANforge_QA]py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json updated email list Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json b/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json index 77ea9eb36..4a47c3296 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json +++ b/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json @@ -19,7 +19,7 @@ "ATTENUATOR_1":"1.1.3591", "ATTENUATOR_2":"", "ATTENUATOR_3":"", - "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@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,alex.gavin@candelatech.com,dylan.eskew@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" From 4cc232736a7b6432685b24ef60c57026b0359674 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 27 Jul 2025 09:29:56 -0600 Subject: [PATCH 212/376] [LANforge_QA] py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json updated email list Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json b/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json index 1f5fc4edc..f621a4cbe 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json +++ b/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json @@ -19,7 +19,7 @@ "ATTENUATOR_1":"1.1.3591", "ATTENUATOR_2":"", "ATTENUATOR_3":"", - "EMAIL_LIST_TEST": "tricia.smiley@candelatech.com,chuck.rekiere@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,alex.gavin@candelatech.com,dylan.eskew@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" From 5887c78d29a1febe2115afce5616afe40ba5e2f5 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 29 Jul 2025 06:54:15 -0600 Subject: [PATCH 213/376] py-scripts/create_station.py Added example that for enabling 320 need to also enable 160 Verified: ./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 Signed-off-by: Chuck SmileyRekiere --- py-scripts/create_station.py | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 From e965a1309b9327e5d8b04fffdd6841aa65fac67c Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 29 Jul 2025 10:14:57 -0600 Subject: [PATCH 214/376] py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json initial commit Signed-off-by: Chuck SmileyRekiere --- .../tools/ct_dut_json/ct_009_ASUS_BE96U.json | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json diff --git a/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json b/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json new file mode 100644 index 000000000..c598657f9 --- /dev/null +++ b/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json @@ -0,0 +1,26 @@ +"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":"'QNC9224_2g_QNC9274_5g_6g'", + "DUT_SW":"'1.2.3 Build 20250314 rel.45415(5553)'", + "DUT_MODEL":"'QNC9224_2g_QNC9274_5g_6g'", + "DUT_SERIAL":"serial_1.1", + "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"} + } + } +} From c022743091cfae8afba31f6f8136a6fd138a7d6e Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Tue, 29 Jul 2025 18:01:43 +0530 Subject: [PATCH 215/376] lf_interop_ping_plotter.py: Add support for per-floor Ping Packet Images(Sent Vs Recv Vs Lost) images - Introduced new CLI arguments: --floors: to specify the number of floors in the house --get_live_view: To add Ping Packet Images in the Report - Implemented 'add_ping_packet_images()' which is reponsbile for adding Ping Packet Images(Sent Vs Recv Vs Lost) in the report Signed-off-by: Narayana-CT --- py-scripts/lf_interop_ping_plotter.py | 65 +++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/py-scripts/lf_interop_ping_plotter.py b/py-scripts/lf_interop_ping_plotter.py index 7ffd52127..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: @@ -2210,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) @@ -2221,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: From bda5d111eb3f34a54c7e727dbe49d99777fee681 Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Tue, 29 Jul 2025 15:00:01 +0530 Subject: [PATCH 216/376] lf_interop_video_streaming.py: add no of buffers and wait time images in the report - Added 'add_buffer_and_wait_time_images' method to include No of buffers and wait time images into the report. - Introduced two new arguments: '--get_live_view' and '--floors' to support multi-floor images rendering. Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 47 +++++++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index f54e71d7e..b2fe83047 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -125,7 +125,9 @@ 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): super().__init__(lfclient_host=host, lfclient_port=8080) self.adb_device_list = None self.host = host @@ -183,6 +185,8 @@ 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 @property def run(self): @@ -1435,6 +1439,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 +1612,33 @@ 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 main(): help_summary = '''\ @@ -1762,6 +1794,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,7 +1867,9 @@ 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.validate_args() From bc997a8105819bc3d8cebff3c0daeb09171acec1 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Mon, 28 Jul 2025 15:13:42 +0530 Subject: [PATCH 217/376] lf_interop_throughput.py : Fix for redundant column when running test with incremental capacity. - Previously, the CSV was trimmed using slicing. Now, by manipulating time, the last records are skipped directly in the monitoring loop for the purpose of webui. Verified CLI: python3 lf_interop_throughput.py --mgr 192.168.244.97 --mgr_port 8080 --upstream_port eth1 --test_duration 1m --download 1000000 --traffic_type lf_udp --do_interopability --device_list 1.13,1.16,1.116 Signed-off-by: Sidartha-CT --- py-scripts/lf_interop_throughput.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 9f846b48f..db9da6ef8 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -903,6 +903,13 @@ 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 = [] @@ -1083,9 +1090,6 @@ 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 - - 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] = [], [], [], [] From 4831d60162fdad77295e1618ace542741fbb2ca7 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 29 Jul 2025 12:41:52 -0600 Subject: [PATCH 218/376] py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json fixed syntax Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json b/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json index c598657f9..9fc7969b3 100644 --- a/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json +++ b/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json @@ -1,4 +1,5 @@ -"ct_009_ASUS_BE96U_dut":{ +{ + "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" From 03b52fd9d3653841a72164d9fece600fd0cd41f6 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 29 Jul 2025 17:40:18 -0600 Subject: [PATCH 219/376] py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800.json Initial checkin Signed-off-by: Chuck SmileyRekiere --- .../ct_dut_json/ct_009_TP_LINK_BE800.json | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800.json diff --git a/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800.json b/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800.json new file mode 100644 index 000000000..cb5c9cbcf --- /dev/null +++ b/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800.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":"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"} + } + } +} From 5927712cb52c11877790862a8311112a8318051f Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 29 Jul 2025 17:40:42 -0600 Subject: [PATCH 220/376] py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json updated with correct DUT information Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json b/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json index 9fc7969b3..4160278b3 100644 --- a/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json +++ b/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json @@ -8,10 +8,10 @@ "test_dut":{ "DUT_SET_NAME": "DUT_NAME ASUS_BE96U", "USE_DUT_NAME": "ASUS_BE96U", - "DUT_HW":"'QNC9224_2g_QNC9274_5g_6g'", - "DUT_SW":"'1.2.3 Build 20250314 rel.45415(5553)'", - "DUT_MODEL":"'QNC9224_2g_QNC9274_5g_6g'", - "DUT_SERIAL":"serial_1.1", + "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", From 2912584db80792237cca7073447c93e3eead922c Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 29 Jul 2025 18:43:42 -0600 Subject: [PATCH 221/376] py-scripts/tools/lf_test_gen/lf_create_radio_frame.py remove the wiphy radios that contain the letter 'c' Verified ./lf_test_gen.py Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_create_radio_frame.py | 5 +++++ 1 file changed, 5 insertions(+) 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 b1a539229..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 @@ -252,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 From 72e782470f056f118cd1a1d1c8c415af4a747323 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 30 Jul 2025 00:17:03 -0600 Subject: [PATCH 222/376] py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json updated email lists Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json b/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json index 4a47c3296..1f86d209b 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json +++ b/py-scripts/tools/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json @@ -20,7 +20,7 @@ "ATTENUATOR_2":"", "ATTENUATOR_3":"", "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,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 AT7 MTK7996e", "EMAIL_TXT": "192.168.101.137 CT-US-008 AT7 MTK7996e" } From 98ba533f7674b66a7b450f438415daef78c426e8 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 30 Jul 2025 00:17:24 -0600 Subject: [PATCH 223/376] py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json updated email lists Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json b/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json index f621a4cbe..b7b235c05 100644 --- a/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json +++ b/py-scripts/tools/ct_rig_json/ct_us_008_rig_TP_BE19000.json @@ -19,8 +19,8 @@ "ATTENUATOR_1":"1.1.3591", "ATTENUATOR_2":"", "ATTENUATOR_3":"", - "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,alex.gavin@candelatech.com,dylan.eskew@candelatech.com", + "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", "EMAIL_TITLE_TXT": "192.168.101.137 CT-US-008 TP BE19000", "EMAIL_TXT": "192.168.101.137 CT-US-008 TP BE19000" } From da174dfed15e80fa9fc66b3a596aa8c0420d7251 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 30 Jul 2025 09:51:53 -0600 Subject: [PATCH 224/376] py-scripts/tools/ct_rig_json/ct_009_ASUS_BE96U_rig.json intial commit for testbed 009 Signed-off-by: Chuck SmileyRekiere --- .../ct_rig_json/ct_009_ASUS_BE96U_rig.json | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 py-scripts/tools/ct_rig_json/ct_009_ASUS_BE96U_rig.json diff --git a/py-scripts/tools/ct_rig_json/ct_009_ASUS_BE96U_rig.json b/py-scripts/tools/ct_rig_json/ct_009_ASUS_BE96U_rig.json new file mode 100644 index 000000000..aae39f1fe --- /dev/null +++ b/py-scripts/tools/ct_rig_json/ct_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" + } +} From 996f29259a3efaea011eb2d39a99fb76f10cb460 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 30 Jul 2025 10:00:06 -0600 Subject: [PATCH 225/376] py-scripts/tools/ct_rig_json/ct_009_TP_LINK_BE800_rig.json Signed-off-by: Chuck SmileyRekiere --- .../ct_rig_json/ct_009_TP_LINK_BE800_rig.json | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 py-scripts/tools/ct_rig_json/ct_009_TP_LINK_BE800_rig.json diff --git a/py-scripts/tools/ct_rig_json/ct_009_TP_LINK_BE800_rig.json b/py-scripts/tools/ct_rig_json/ct_009_TP_LINK_BE800_rig.json new file mode 100644 index 000000000..37a25fbd9 --- /dev/null +++ b/py-scripts/tools/ct_rig_json/ct_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" + } +} From b6c43f4d23e739a0fe57089d0471beccb6bbe961 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:12:23 -0700 Subject: [PATCH 226/376] flake8: Ignore sandbox/scripts_deprecated directories Signed-off-by: Alex Gavin --- .flake8 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.flake8 b/.flake8 index 2c4d9db07..2c0d8dbb5 100644 --- a/.flake8 +++ b/.flake8 @@ -9,4 +9,6 @@ exclude = .venv venv .virtualenv - virtualenv \ No newline at end of file + virtualenv + py-scripts/sandbox + py-scripts/scripts_deprecated From 4a9b85429507712db7c5ec62073b0abdbcf2b6d1 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:00:21 -0700 Subject: [PATCH 227/376] lf_csv.py: bugbear linting fix Verified: ./lf_csv.py Signed-off-by: Alex Gavin --- py-scripts/lf_csv.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/py-scripts/lf_csv.py b/py-scripts/lf_csv.py index fb89827e4..4aaa86d76 100755 --- a/py-scripts/lf_csv.py +++ b/py-scripts/lf_csv.py @@ -28,15 +28,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): From 8d7c82f073e786a88ef0090dbb218d3e44f8c693 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:02:52 -0700 Subject: [PATCH 228/376] lf_csv.py: Update docstring Remove commented out import Signed-off-by: Alex Gavin --- py-scripts/lf_csv.py | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/py-scripts/lf_csv.py b/py-scripts/lf_csv.py index 4aaa86d76..a9b9876b0 100755 --- a/py-scripts/lf_csv.py +++ b/py-scripts/lf_csv.py @@ -1,26 +1,21 @@ #!/usr/bin/env python3 ''' -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 @@ -98,15 +93,19 @@ def main(): The lf_csv is used to generate csv report of the lanforge test results ''', description=''' -NAME: lf_csv.py +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") From 5734b92fceb726f5b9ea238f8db054ecc07d240c Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:14:50 -0700 Subject: [PATCH 229/376] bandsteering.py: Move non-functional script to sandbox Signed-off-by: Alex Gavin --- py-scripts/{ => sandbox}/bandsteering.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename py-scripts/{ => sandbox}/bandsteering.py (100%) diff --git a/py-scripts/bandsteering.py b/py-scripts/sandbox/bandsteering.py similarity index 100% rename from py-scripts/bandsteering.py rename to py-scripts/sandbox/bandsteering.py From b61a22f4207ba6c3caaaa6b18a4c3855daa0ca3e Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:42:30 -0700 Subject: [PATCH 230/376] lf_add_profile.py: Update docstring Signed-off-by: Alex Gavin --- py-scripts/lf_add_profile.py | 188 +++++++++++++++++++---------------- 1 file changed, 101 insertions(+), 87 deletions(-) diff --git a/py-scripts/lf_add_profile.py b/py-scripts/lf_add_profile.py index 800d6a3b0..fbc476df9 100755 --- a/py-scripts/lf_add_profile.py +++ b/py-scripts/lf_add_profile.py @@ -1,56 +1,54 @@ #!/usr/bin/env python3 """ -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 sys @@ -193,45 +191,61 @@ def add_profile_notes(self, 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') From 70fcbc02ad650b3c9ba9dc6a5e16e799b7d262fc Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:43:14 -0700 Subject: [PATCH 231/376] lf_add_profile.py: Clean up imports Signed-off-by: Alex Gavin --- py-scripts/lf_add_profile.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/py-scripts/lf_add_profile.py b/py-scripts/lf_add_profile.py index fbc476df9..f7e68dc1a 100755 --- a/py-scripts/lf_add_profile.py +++ b/py-scripts/lf_add_profile.py @@ -51,18 +51,16 @@ 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") @@ -70,14 +68,9 @@ 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, From 78df771c9571ae22d310d806a40128edcb771a45 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:45:53 -0700 Subject: [PATCH 232/376] lf_add_profile.py: Whitespace cleanup, logging Signed-off-by: Alex Gavin --- py-scripts/lf_add_profile.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/py-scripts/lf_add_profile.py b/py-scripts/lf_add_profile.py index f7e68dc1a..54655471b 100755 --- a/py-scripts/lf_add_profile.py +++ b/py-scripts/lf_add_profile.py @@ -160,7 +160,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] @@ -178,11 +177,6 @@ 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" @@ -363,16 +357,14 @@ def main(): 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() @@ -388,10 +380,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. @@ -415,6 +405,7 @@ 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__": From 332386d857fadb91ff923f4822cd8bb7766dd8e1 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:47:28 -0700 Subject: [PATCH 233/376] lf_add_profile.py: Fix bugbear linting error Verified: ./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 Signed-off-by: Alex Gavin --- py-scripts/lf_add_profile.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/py-scripts/lf_add_profile.py b/py-scripts/lf_add_profile.py index 54655471b..69daa23eb 100755 --- a/py-scripts/lf_add_profile.py +++ b/py-scripts/lf_add_profile.py @@ -113,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). @@ -121,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: From 9061d6e97a333ed9780aaf72359c6f786858c6ca Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 12:51:45 -0700 Subject: [PATCH 234/376] lf_ftp.py: Fix bugbear linting errors Signed-off-by: Alex Gavin --- py-scripts/lf_ftp.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 2ea60c3c3..9d83290d7 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -146,7 +146,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, @@ -169,6 +169,10 @@ def __init__(self, lfclient_host="localhost", lfclient_port=8080, sta_prefix="st 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 @@ -334,7 +338,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: @@ -351,7 +355,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']: @@ -522,7 +526,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: @@ -776,7 +780,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") @@ -2340,7 +2344,7 @@ def monitor_cx(self): try: _ = self.local_realm.json_get("layer4/%s/list?fields=%s" % (created_cxs, 'status'))['endpoint']['status'] - except BaseException: + 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]) From 949f8b12fb94efb54226ba25744b7aa0538aaeb1 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 15:25:11 -0700 Subject: [PATCH 235/376] lf_ftp.py: Remove redundant printout CLI below ran the test but did not make any endpoints. Not sure what's wrong, but this script clearly is not well tested with virtual clients. Verified: ./lf_ftp.py \ --upstream_port 1.2.eth1 \ --fiveg_radio 1.1.wiphy0 \ --band 5G \ --ssid 204-mesh-ap \ --security wpa2 \ --passwd lanforge \ --file_sizes 10MB \ --traffic_duration 1m \ --directions Download Signed-off-by: Alex Gavin --- py-scripts/lf_ftp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 9d83290d7..c888fa401 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -698,7 +698,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": From 5df19207ecc9ead0ab175f2604d6ab2232f998a8 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 30 Jul 2025 17:09:51 -0700 Subject: [PATCH 236/376] lf_json_util.py: Fix bugbear linting errors Verified: ./lf_json_util.py Signed-off-by: Alex Gavin --- py-scripts/lf_json_util.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/py-scripts/lf_json_util.py b/py-scripts/lf_json_util.py index f478a70ad..908ab3bb2 100755 --- a/py-scripts/lf_json_util.py +++ b/py-scripts/lf_json_util.py @@ -11,9 +11,7 @@ def standardize_json_results(results): - f'''{help_summary} - TODO: Add functionality to handle other plural vs singular data representations - ''' + # TODO: Add functionality to handle other plural vs singular data representations if 'endpoints' not in results: tmp_results = {} print(results) @@ -26,10 +24,10 @@ def standardize_json_results(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') From e9db6f76e5a9b4593180cadabe531e8d52fab2e2 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 31 Jul 2025 15:25:12 -0700 Subject: [PATCH 237/376] flake8: Ignore errors in specific files Temporarily ignore linting errors in specific files. This permits usage of flake8-bugbear plugin while in current linting while we work to address failures in mentioned scripts. To fix bugbear-highlighted linting errors, simply remove the script from the 'per-file-ignores' item of the '.flake8' file. Signed-off-by: Alex Gavin --- .flake8 | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/.flake8 b/.flake8 index 2c0d8dbb5..1d066969f 100644 --- a/.flake8 +++ b/.flake8 @@ -12,3 +12,44 @@ exclude = 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 From 63ed1ce42c7310de91e3b111e148bcfdbfddabbb Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 7 May 2025 13:27:33 -0700 Subject: [PATCH 238/376] Add bugbear plugin to linting checks Signed-off-by: Alex Gavin --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31d378b7a..c25971116 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,8 +23,8 @@ jobs: - name: flake8 Lint uses: py-actions/flake8@v2 - #with: - # plugins: "flake8-bugbear" + with: + plugins: "flake8-bugbear" help-check: # Tie runner to Ubuntu 22.04 LTS, as it still supports Python 3.7 From 2f4fb06322aa3754b4e80a9e7e375c260f0b7fe9 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 7 May 2025 14:14:00 -0700 Subject: [PATCH 239/376] Add bugbear linting to pre-commit config Signed-off-by: Alex Gavin --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 83237faef..ad39db18a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,8 +11,8 @@ repos: rev: 7.0.0 hooks: - id: flake8 - #additional_dependencies: - # - "flake8-bugbear" + additional_dependencies: + - "flake8-bugbear" #- repo: https://github.com/shellcheck-py/shellcheck-py # rev: v0.9.0.5 From bf97c378b446423866cbc44292136409336268d0 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 2 Aug 2025 12:20:47 -0600 Subject: [PATCH 240/376] cc_module_uci.py initial commit this module is used to lf_tx_power.py There will be a subsequent commit of lf_tx_power.py that will use this script Verification in vscode" // lf_tx_power.py // lanforge: 192.168.214.93 // ap: 192.168.215.213 "args":[ "--scheme","ssh", "--dest", "192.168.214.93", "--port", "22", "--user", "root", "--passwd", "hfcl!@ion", "--prompt", "root@HFCL:~#", "--series", "NA", "--band", "5g", "--module", "cc_module_uci", "--timeout", "3", "--ap", "HFCL", "--ap_band_slot_5g", "NA", "--wlan", "NA", "--wlan_id", "NA", "--wlan_ssid", "hfcl_5g", "--tag_policy", "NA", "--policy_profile", "NA", "--pathloss", "59", "--antenna_gain", "6", "--lfmgr", "192.168.214.93", "--upstream_port", "eth1", "--lfresource", "1", "--radio", "wiphy0", "--station", "sta0000", "--ssid", "hfcl_5g", "--ssidpw", "12345678", "--security", "wpa2", "--bssid", "DEFAULT", "--no_cleanup_station", "--channel", "40", "--bandwidth", "160", "--vht160", "--nss", "2", "--txpower", "4.25", "--duration", "25", "--outfile", "test001", "--no_cleanup", "--test_rig", "HFCl", "--series", "HFCL", "--html_report", "--pf_dbm", "8" ] Signed-off-by: Chuck SmileyRekiere --- cc_module_uci.py | 433 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 433 insertions(+) create mode 100644 cc_module_uci.py diff --git a/cc_module_uci.py b/cc_module_uci.py new file mode 100644 index 000000000..210d5f0d4 --- /dev/null +++ b/cc_module_uci.py @@ -0,0 +1,433 @@ +# 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 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.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 + + +def is_cac_done(channel, list): + good_things = ['{"state": "cac_completed"}', '{"state":"allowed"}'] + for status in list: + if status[0] == channel and status[1] in good_things: + 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 + ): + + 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._show_ap_dot11_summary() + # if is_cac_done(self.channel, r["channels"][1]) == True: + # return + # 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 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 + c = { + "host":'192.168.215.213', # noqa: + "auth_username":'root', # noqa: + "auth_password":'hfcl!@ion', # noqa: + "ssh_config_file": True, + "comms_prompt_pattern":"^root@HFCL:~\\#", # noqa: 231 + "timeout_ops": 120, + "timeout_transport": 240 + } + + # if not getattr(self, "jump_host", None) == None: + jump_function = get_jump_function(c) + c = { + "host": '192.168.214.93', + "auth_username": 'lanforge', + "auth_password": 'lanforge', + "auth_strict_key": False, + "comms_prompt_pattern": "^[\\S\\7\\x1b]*\\[.*\\]\\$", + "on_open": 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.message})" + ) from 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" From 7cdcd1d4f41720274240dc4bcf0fe6c2d5c1affe Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 2 Aug 2025 12:21:53 -0600 Subject: [PATCH 241/376] lf_tx_power.py updates for the generic module Verification using VScode: // lf_tx_power.py // lanforge: 192.168.214.93 // ap: 192.168.215.213 "args":[ "--scheme","ssh", "--dest", "192.168.214.93", "--port", "22", "--user", "root", "--passwd", "hfcl!@ion", "--prompt", "root@HFCL:~#", "--series", "NA", "--band", "5g", "--module", "cc_module_uci", "--timeout", "3", "--ap", "HFCL", "--ap_band_slot_5g", "NA", "--wlan", "NA", "--wlan_id", "NA", "--wlan_ssid", "hfcl_5g", "--tag_policy", "NA", "--policy_profile", "NA", "--pathloss", "59", "--antenna_gain", "6", "--lfmgr", "192.168.214.93", "--upstream_port", "eth1", "--lfresource", "1", "--radio", "wiphy0", "--station", "sta0000", "--ssid", "hfcl_5g", "--ssidpw", "12345678", "--security", "wpa2", "--bssid", "DEFAULT", "--no_cleanup_station", "--channel", "40", "--bandwidth", "160", "--vht160", "--nss", "2", "--txpower", "4.25", "--duration", "25", "--outfile", "test001", "--no_cleanup", "--test_rig", "HFCl", "--series", "HFCL", "--html_report", "--pf_dbm", "8" ] Signed-off-by: Chuck SmileyRekiere --- lf_tx_power.py | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/lf_tx_power.py b/lf_tx_power.py index e3a41d34f..e14fc9acf 100755 --- a/lf_tx_power.py +++ b/lf_tx_power.py @@ -639,7 +639,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 +652,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 +1733,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 +1867,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 +1921,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 +1966,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 +2020,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 +2971,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) From 82f8f449125a919b0a912e5551f60f58345dffd2 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 4 Aug 2025 08:53:40 -0600 Subject: [PATCH 242/376] cc_module_uci.py added comments to show loging into LANforge then calling the jump function Signed-off-by: Chuck SmileyRekiere --- cc_module_uci.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cc_module_uci.py b/cc_module_uci.py index 210d5f0d4..be404982f 100644 --- a/cc_module_uci.py +++ b/cc_module_uci.py @@ -375,6 +375,7 @@ def show_ap_bssid_24ghz(self) -> str: 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.213', # noqa: "auth_username":'root', # noqa: @@ -387,13 +388,14 @@ def get_mgmt(self) -> "Generator[GenericDriver]": # noqa: # if not getattr(self, "jump_host", None) == None: jump_function = get_jump_function(c) + # LANforge config c = { "host": '192.168.214.93', "auth_username": 'lanforge', "auth_password": 'lanforge', "auth_strict_key": False, "comms_prompt_pattern": "^[\\S\\7\\x1b]*\\[.*\\]\\$", - "on_open": jump_function, + "on_open": jump_function, # on logging into LANforge will run the jump_function "timeout_ops": 40, "timeout_transport": 40, "ssh_config_file": True, From 322475646b132e259653d24e2037cfb843cc5d1c Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Mon, 4 Aug 2025 16:20:10 -0700 Subject: [PATCH 243/376] test_l4.py: LAN-4213 - allow user to specify ports to use, including MACVLANS (#144) This lets the user use ports of types other than wifi stations using the new --use_ports argument, but requires the ports to already exist. These ports will be deleted once the test is complete unless the --no_cleanup flag is set Verification ./test_l4.py --mgr localhost --upstream_port eth1 --use_ports eth1#0 --security open --ssid 102-tplinkB-5g --test_duration 30s --url "dl http://192.168.0.103/ /dev/null" --requests_per_ten 600 --test_type 'urls' --test_rig Test-Lab --dut_hw_version Linux --test_id "L4 data" --no_cleanup Verification (original functionality): ./test_l4.py --mgr localhost --upstream_port eth1 --radio wiphy0 --num_stations 5 --security open --ssid 102-tplinkB-5g --test_duration 30s --url "dl https://192.168.0.103/ /dev/null" --requests_per_ten 600 --test_type 'urls' --test_rig Test-Lab --dut_hw_version Linux --test_id "L4 data" Signed-off-by: Liam Reynolds --- py-scripts/test_l4.py | 78 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 16 deletions(-) diff --git a/py-scripts/test_l4.py b/py-scripts/test_l4.py index b82a75839..be19940c4 100755 --- a/py-scripts/test_l4.py +++ b/py-scripts/test_l4.py @@ -82,6 +82,16 @@ --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 --radio wiphy0 --use_ports "sta000 sta0001" + --security {open|web|wpa|wpa2|wpa3} --ssid --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 --security {open|web|wpa|wpa2|wpa3} + --ssid --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: @@ -155,7 +165,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 @@ -204,6 +215,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 @@ -366,7 +378,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") @@ -397,21 +415,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) @@ -431,7 +462,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: @@ -457,8 +491,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( @@ -688,6 +721,9 @@ 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) # kpi_csv arguments test_l4_parser.add_argument( @@ -913,8 +949,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, @@ -940,8 +984,10 @@ 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() layer4traffic_list = [] From 668f0898791033c29b62198fa518611f5ce6c6ec Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Mon, 4 Aug 2025 18:17:11 -0700 Subject: [PATCH 244/376] test_l4.py: LAN-4213 no longer delete inputted ports unless --force_port_cleanup is specified Verification (does not delete ports): ./test_l4.py --mgr localhost --upstream_port eth1 --use_ports eth1#0 --test_duration 30s --url "dl https://192.168.0.103/ /dev/null" --requests_per_ten 600 --test_type 'urls' --test_rig Test-Lab --dut_hw_version Linux --test_id "L4 data" Verification (does delete ports): ./test_l4.py --mgr localhost --upstream_port eth1 --use_ports eth1#0 --test_duration 30s --url "dl https://192.168.0.103/ /dev/null" --requests_per_ten 600 --test_type 'urls' --test_rig Test-Lab --dut_hw_version Linux --test_id "L4 data" --force_port_cleanup Signed-off-by: Liam Reynolds --- py-scripts/test_l4.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/py-scripts/test_l4.py b/py-scripts/test_l4.py index be19940c4..de7b85a88 100755 --- a/py-scripts/test_l4.py +++ b/py-scripts/test_l4.py @@ -83,14 +83,15 @@ --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 --radio wiphy0 --use_ports "sta000 sta0001" - --security {open|web|wpa|wpa2|wpa3} --ssid --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" + ./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 --security {open|web|wpa|wpa2|wpa3} - --ssid --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" + ./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 @@ -724,6 +725,8 @@ def main(): 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( @@ -1094,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()) From 7fe7befe40214cbeebeb12b8bdc33c59a9af83ae Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Thu, 7 Aug 2025 12:41:52 +0530 Subject: [PATCH 245/376] teams_automation: add teams_automation folder for automated Microsoft Teams call testing Includes lf_interop_teams.py script to: - Select and manage test devices - Launch Teams calls with audio/video options - Collect and log per-device call metrics - Generate reports - Support running the test through CLI or web UI Signed-off-by: Narayana-CT --- .../teams_automation/lf_interop_teams.py | 990 ++++++++++++++++++ 1 file changed, 990 insertions(+) create mode 100644 py-scripts/real_application_tests/teams_automation/lf_interop_teams.py 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() From acff24ffbcb40007c571f06edd87db51a2c5dfed Mon Sep 17 00:00:00 2001 From: litincandela Date: Fri, 18 Jul 2025 11:31:01 +0530 Subject: [PATCH 246/376] DeviceConfig.py: Fix Interop tab issue with single device and remove redundant URL formatting in Clear Wi-Fi Profiles API call Signed-off-by: litincandela --- py-scripts/DeviceConfig.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/py-scripts/DeviceConfig.py b/py-scripts/DeviceConfig.py index 5f0774f9d..002ea06f4 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"] From e48f83fddfa8f455f6226d7b472630ab057a4246 Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 23 Jul 2025 11:20:15 +0530 Subject: [PATCH 247/376] DeviceConfig.py: Fix linting errors using flake8/autopep8 Signed-off-by: litincandela --- py-scripts/DeviceConfig.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/DeviceConfig.py b/py-scripts/DeviceConfig.py index 002ea06f4..3a9627fa6 100755 --- a/py-scripts/DeviceConfig.py +++ b/py-scripts/DeviceConfig.py @@ -1567,7 +1567,7 @@ def get_device_data(port_key, resource_key, port_data, resource_data): 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']}] + 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"] From 4f78d763b78fc67aeacc23e72694e67bca49545c Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 16 Jul 2025 12:06:41 +0530 Subject: [PATCH 248/376] lf_interop_throughput.py: Added usernames for iOS devices in the overall CSV data. VERIFIED CLI: python3 lf_interop_throughput.py --mgr 192.168.204.75 \ --mgr_port 8080 \ --upstream_port eth1 \ --test_duration 1m \ --download 10000000 \ --traffic_type lf_udp Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index db9da6ef8..0d81b1a0f 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -376,6 +376,7 @@ def phantom_check(self): """ 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 = {} @@ -467,7 +468,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']) From 1c36da961b3e86ecec690e72d56a27fe6821ec48 Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 16 Jul 2025 13:21:24 +0530 Subject: [PATCH 249/376] lf_interop_throughput.py: Average RTT has been added to both the CSV and the report. VERIFIED CLI: python3 lf_interop_throughput.py --mgr 192.168.204.75\ --mgr_port 8080\ --upstream_port eth1\ --test_duration 1m\ --download 10000000\ --traffic_type lf_udp - Took Average RTT data from Layer 3 Tab. Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 60 +++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 0d81b1a0f..fe0dfbc7b 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -843,13 +843,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) @@ -860,7 +863,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' @@ -873,13 +876,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): 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 = [], [], [], [], [], [] # noqa: F841 + 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") @@ -900,7 +909,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: @@ -924,7 +933,7 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l 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 @@ -937,12 +946,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] @@ -963,9 +973,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], 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), @@ -1045,19 +1055,19 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l 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] @@ -1075,9 +1085,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), @@ -1103,17 +1113,19 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l break 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] @@ -1123,9 +1135,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 @@ -1573,6 +1585,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)) @@ -1604,6 +1617,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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") @@ -1626,6 +1640,7 @@ 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) / 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") + 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(download_drop_col) / len(download_drop_col), 2)) @@ -1649,6 +1664,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca download_data.append(0) # Append average upload drop data from filtered dataframe 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') @@ -1667,6 +1683,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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(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") @@ -1684,6 +1701,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca # Append 0 for upload data upload_data.append(0) 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") @@ -1701,6 +1719,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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(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(upload_col) / len(upload_col), 2)) @@ -1841,6 +1860,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])]], @@ -1862,6 +1882,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])]], @@ -1893,6 +1914,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca " 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])]], # " 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": @@ -2014,6 +2036,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 = [] # Fetch devices_on_running from real_client_list devices_on_running.append(self.real_client_list[data1[i][-1] - 1].split(" ")[-1]) @@ -2038,7 +2061,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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") @@ -2054,6 +2077,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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(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") @@ -2068,6 +2092,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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)) + 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(upload_col) / len(upload_col), 2)) @@ -2221,6 +2246,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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[" Average RTT (ms) "] = avg_rtt_data[-1] bk_dataframe[" RSSI "] = ['' if rssi_data[-1] == 0 else '-' + str(rssi_data[-1]) + " dbm"] if self.direction == "Bi-direction": @@ -2909,7 +2935,7 @@ def main(): # 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]} ']) + 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]} ', f'Rx-Rate {clients_to_run[i]} ']) individual_dataframe_column.extend(['Overall Download', 'Overall Upload', 'Overall Rx % Drop A', 'Overall Rx % Drop B', 'Iteration', 'TIMESTAMP', 'Start_time', 'End_time', 'Remaining_Time', 'Incremental_list', 'status']) From 975754df72d82d1e4138b41790af2e32c70934ba Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 16 Jul 2025 16:48:19 +0530 Subject: [PATCH 250/376] lf_interop_throughput.py: Modified CSV data interval from 5 seconds to 1 second for WebGUI. VERIFIED CLI: 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 \ --device_list 1.15,1.400 \ --download 10000000 \ --do_webgui Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index fe0dfbc7b..c6c1af01e 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -936,7 +936,7 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l 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 @@ -995,9 +995,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 @@ -1177,7 +1177,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) From 5616bc6284a198003b97cab09f8934b56b474599 Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 16 Jul 2025 17:30:01 +0530 Subject: [PATCH 251/376] lf_interop_throughput.py: Added indiviudal device configuration in interoperability test. VERIFIED CLI: python3 lf_interop_throughput.py --mgr 192.168.204.75\ --mgr_port 8080\ --upstream_port eth0\ --test_duration 1m\ --traffic_type lf_udp\ --ssid NETGEAR_2G_wpa2\ --passwd Password@123\ --security wpa2\ --do_interopability\ --download 10000000\ --interopability_config - Added table for pass/fail to check whether device connected to the specific SSID. - Skipping the devices failed to connect to the specific SSID to run the cx. Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 141 ++++++++++++++++++++++++++-- 1 file changed, 133 insertions(+), 8 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index c6c1af01e..36a9d6cde 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -107,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 @@ -147,6 +152,7 @@ import asyncio import csv import matplotlib.pyplot as plt +import re logger = logging.getLogger(__name__) @@ -204,6 +210,7 @@ def __init__(self, dowebgui=False, precleanup=False, do_interopability=False, + interopability_config = False, ip="localhost", csv_direction='', device_csv_name=None, @@ -333,6 +340,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): """ @@ -370,6 +380,70 @@ 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=[]): + """ + 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 len(devices_to_disconnect) == 0: + 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. @@ -380,7 +454,7 @@ def phantom_check(self): 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, @@ -421,7 +495,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() @@ -434,7 +508,7 @@ def phantom_check(self): logger.info("AVAILABLE RESOURCES", device_list) self.device_list = input("Enter 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") @@ -885,7 +959,7 @@ def get_layer3_endp_data(self): 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, avg_rtt = [], [], [], [], [], [], [] # noqa: F841 @@ -1111,6 +1185,12 @@ 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 + + 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], avg_rtt[i] = [], [], [], [], [] @@ -1428,6 +1508,15 @@ def build_line_graph(self, data_set, xaxis_name, yaxis_name, xaxis_categories, l logger.debug("{}.csv".format(graph_image_name)) 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): @@ -2021,6 +2110,17 @@ 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 = [] @@ -2040,6 +2140,9 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca # 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=[] @@ -2683,6 +2786,10 @@ 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 @@ -2768,6 +2875,7 @@ 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") parser.add_argument('--help_summary', help='Show summary of what this script does', action="store_true") args = parser.parse_args() @@ -2902,7 +3010,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: @@ -2945,6 +3054,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 @@ -2960,14 +3074,25 @@ def main(): 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 is False: From 5e3ae24f03d5faa7db0497e65a86029214225764 Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 16 Jul 2025 18:04:32 +0530 Subject: [PATCH 252/376] lf_interop_throughput.py: Included Testhouse live view images in the report. VERIFIED CLI: python3 lf_interop_throughput.py --mgr 192.168.204.75\ --mgr_port 8080\ --upstream_port eth1\ --test_duration 1m\ --download 10000000\ --traffic_type lf_udp\ --dowebgui\ --get_live_view\ --total_floors Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 36a9d6cde..798ab4ea1 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -210,6 +210,8 @@ def __init__(self, dowebgui=False, precleanup=False, do_interopability=False, + get_live_view=False, + total_floors=0, interopability_config = False, ip="localhost", csv_direction='', @@ -307,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 @@ -1923,6 +1927,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 ", @@ -2372,6 +2380,9 @@ 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() @@ -2666,6 +2677,38 @@ 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): @@ -2851,6 +2894,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.") @@ -2986,6 +3031,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, From 55f3a79f9a9d43eee1d03de9a8f28ae819520b9a Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 16 Jul 2025 18:28:53 +0530 Subject: [PATCH 253/376] lf_interop_throughput.py: Interpret rated download and upload values as Mbps instead of bytes VERIFIED CLI: python3 lf_interop_throughput.py --mgr 192.168.204.75 \ --mgr_port 8080 \ --upstream_port eth1 \ --test_duration 1m \ --download 10000000 \ --traffic_type lf_udp \ --tput_mbps Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 798ab4ea1..0f2611fd1 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -2921,6 +2921,7 @@ 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("--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() @@ -2938,6 +2939,14 @@ def main(): # 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 From 9eae4e3c7f55ac8d981078326863cfa662bf8676 Mon Sep 17 00:00:00 2001 From: litincandela Date: Thu, 17 Jul 2025 10:53:22 +0530 Subject: [PATCH 254/376] lf_interop_throughput.py: Renamed RX%A and RX%B to TX% and RX% in the CSV and the report. VERIFIED CLI: python3 lf_interop_throughput.py --mgr 192.168.204.75 \ --mgr_port 8080 \ --upstream_port eth0 \ --test_duration 1m \ --traffic_type lf_udp \ --ssid NETGEAR_2G_wpa2 \ --passwd Password@123 \ --security wpa2 \ --download 10000000 - Made some reporting changes in the report. Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 99 ++++++++++++++--------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 0f2611fd1..1107a6184 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -510,7 +510,7 @@ def phantom_check(self): 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(',') + 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=self.config_dict)) @@ -603,7 +603,7 @@ def phantom_check(self): configure_list = [] 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 @@ -1554,7 +1554,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 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, 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 + " 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" # 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 @@ -1697,8 +1697,8 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca filtered_df = data_iter[columns_with_substring] 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 "Rx % Drop B" in col][0]].values.tolist() - download_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" 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": @@ -1712,8 +1712,8 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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: @@ -1731,8 +1731,8 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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 @@ -1746,8 +1746,8 @@ 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(rssi_col) / len(rssi_col), 2) * -1)) @@ -1779,8 +1779,8 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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') @@ -1797,8 +1797,8 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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(download_drop_col) / len(download_drop_col), 2)) if self.cx_profile.side_a_min_pdu == -1: @@ -2005,27 +2005,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 @@ -2053,7 +2053,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" @@ -2160,8 +2160,8 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca filtered_df = data_iter[columns_with_substring] 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 "Rx % Drop B" in col][0]].values.tolist() - download_drop_col = filtered_df[[col for col in filtered_df.columns if "Rx % Drop A" 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": @@ -2174,8 +2174,8 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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': @@ -2191,15 +2191,15 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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(upload_drop_col) / len(upload_drop_col), 2)) @@ -2353,22 +2353,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[" 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 "] = ['' if rssi_data[-1] == 0 else '-' + str(rssi_data[-1]) + " dbm"] - + 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 @@ -3099,10 +3098,10 @@ 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]} ', 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) From b5b5ef4dfa0cfff7ad73ee3f8ed9741458340799 Mon Sep 17 00:00:00 2001 From: litincandela Date: Wed, 23 Jul 2025 15:44:00 +0530 Subject: [PATCH 255/376] lf_interop_throughput.py: fixed linting errors using flake8/autopep8. VERIFIED CLI: python3 lf_interop_throughput.py --mgr 192.168.204.75\ --mgr_port 8080 \ --upstream_port eth0 \ --test_duration 1m \ --traffic_type lf_udp \ --ssid NETGEAR_2G_wpa2 \ --passwd Password@123 \ --security wpa2 \ --download 10000000 Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 89 +++++++++++++++-------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 1107a6184..08602edd8 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -109,7 +109,7 @@ 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 + 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 @@ -212,7 +212,7 @@ def __init__(self, do_interopability=False, get_live_view=False, total_floors=0, - interopability_config = False, + interopability_config=False, ip="localhost", csv_direction='', device_csv_name=None, @@ -384,7 +384,7 @@ 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=[]): + def disconnect_all_devices(self, devices_to_disconnect=None): """ Disconnects either all devices or a specific list of devices from Wi-Fi networks. """ @@ -396,37 +396,37 @@ def disconnect_all_devices(self,devices_to_disconnect=[]): async def do_disconnect(): all_devices = obj.get_all_devices() # TO DISCONNECT ALL DEVICES - if len(devices_to_disconnect) == 0: + 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): + 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') - + 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): + 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): + if (len(android_resources) > 0): # To disable wifi for androids - adb_obj.set_wifi_state(port_list=android_resources, state = 'disable') + adb_obj.set_wifi_state(port_list=android_resources, state='disable') asyncio.run(do_disconnect()) - - def configure_specific(self,device_to_configure_list): + + 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] + 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: @@ -441,7 +441,7 @@ def configure_specific(self,device_to_configure_list): self.configured_devices_check[laptop_resources[0]['hostname']] = False return False - def extract_digits_until_alpha(self,s): + def extract_digits_until_alpha(self, s): """ Extracts digits (including decimals) from the start of a string until the first alphabet. """ @@ -546,10 +546,10 @@ def phantom_check(self): if b['kernel'] == '': self.eid_list.append(b['eid']) self.mac_list.append(b['hw version']) - if "devices" in interop_response.keys(): + 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): + 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: @@ -941,7 +941,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",0] + throughput[i] = [0, 0, 0, 0, "Stopped", 0] for j in l3_endp_data: key, value = next(iter(j.items())) endp_a = cx + '-A' @@ -956,7 +956,7 @@ def get_layer3_endp_data(self): 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"): + if (j == "handler" or j == "uri"): continue if cx == l3_cx_data[j]['name']: throughput[i][5] = l3_cx_data[j]['avg rtt'] @@ -966,7 +966,7 @@ def get_layer3_endp_data(self): 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, avg_rtt = [], [], [], [], [], [], [] # noqa: F841 + 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") @@ -1053,7 +1053,8 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l remaining_minutes_instrf = str(overall_time_difference).split(".")[0] # 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], temp_avg_rtt[i][0], 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), @@ -1512,8 +1513,8 @@ def build_line_graph(self, data_set, xaxis_name, yaxis_name, xaxis_categories, l logger.debug("{}.csv".format(graph_image_name)) return f"{graph_image_name}.png" - - def convert_to_table(self,configured_devices_check): + + def convert_to_table(self, configured_devices_check): """ Returns usernames and their config status ('Pass' or 'Fail') as a dictionary. """ @@ -1927,10 +1928,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): + 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 ", @@ -2006,12 +2007,12 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca " Mode": self.mode_list[0:int(incremental_capacity_list[i])], # " Direction":direction_in_table[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])]], + " 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])]], + " 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])], + " 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": @@ -2118,7 +2119,7 @@ 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): + 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.") @@ -2379,9 +2380,9 @@ 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): + 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() @@ -2676,16 +2677,16 @@ def change_port_to_ip(self, upstream_port): return upstream_port - def add_live_view_images_to_report(self,report): + 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") + 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() @@ -2710,6 +2711,8 @@ def add_live_view_images_to_report(self,report): report.build_custom() # To validate the input args + + def validate_args(args): if args.group_name: selected_groups = args.group_name.split(',') @@ -2831,7 +2834,8 @@ def main(): 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 +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 @@ -3039,8 +3043,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, + 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, @@ -3066,7 +3070,7 @@ def main(): pac_file=args.pac_file, wait_time=args.wait_time, config=args.config, - interopability_config = args.interopability_config + interopability_config=args.interopability_config ) if gave_incremental: @@ -3099,7 +3103,8 @@ def main(): # 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 {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]} ']) + 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 ', 'Overall Tx % Drop', 'Iteration', 'TIMESTAMP', 'Start_time', 'End_time', 'Remaining_Time', 'Incremental_list', 'status']) @@ -3131,7 +3136,7 @@ def main(): time.sleep(5) if args.interopability_config: if (args.do_interopability and i == 0): - # To disconnect all the selected devices at the starting selected + # 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])) From 213fa1f184590be1ced8f4c35bcc94ddb96543cd Mon Sep 17 00:00:00 2001 From: litincandela Date: Tue, 5 Aug 2025 11:13:10 +0530 Subject: [PATCH 256/376] lf_interop_throughput.py: Removed additional parentheses in conditional loops VERIFIED CLI: lf_interop_throughput.py python3 lf_interop_throughput.py --mgr 192.168.204.75\ --mgr_port 8080\ --upstream_port eth0\ --test_duration 1m\ --traffic_type lf_udp\ --ssid NETGEAR_2G_wpa2\ --passwd Password@123\ --security wpa2\ --download 10000000 Signed-off-by: litincandela --- py-scripts/lf_interop_throughput.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 08602edd8..79c419e09 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -398,22 +398,22 @@ async def do_disconnect(): # 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): + 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): + 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): + 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): + if len(android_resources) > 0: # To disable wifi for androids adb_obj.set_wifi_state(port_list=android_resources, state='disable') @@ -549,7 +549,7 @@ def phantom_check(self): 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): + 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: @@ -1345,7 +1345,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(",")) @@ -1407,7 +1407,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(",")) @@ -1928,7 +1928,7 @@ 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): + 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) @@ -2119,7 +2119,7 @@ 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): + 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.") @@ -2380,7 +2380,7 @@ 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): + if self.dowebgui and self.get_live_view and self.do_interopability: self.add_live_view_images_to_report(report) # report.build_custom() @@ -2942,7 +2942,7 @@ def main(): # logger_config = lf_logger_config.lf_logger_config() lf_logger_config.lf_logger_config() - if(args.tput_mbps): + 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) @@ -3131,11 +3131,11 @@ 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) if args.interopability_config: - if (args.do_interopability and i == 0): + 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]: From ed146aad37de9c6590849df8379b1b68d64da32e Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Thu, 7 Aug 2025 13:56:49 -0700 Subject: [PATCH 257/376] heatmon.bash: upgrades jq query This more complex query can select nested temperature values now, and composes better area descriptions Signed-off-by: Jed Reynolds --- heatmon.bash | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) mode change 100644 => 100755 heatmon.bash diff --git a/heatmon.bash b/heatmon.bash old mode 100644 new mode 100755 index 3ec8023ab..e442380b8 --- a/heatmon.bash +++ b/heatmon.bash @@ -12,7 +12,29 @@ if [[ ! -x /usr/bin/sensors ]]; then echo "Unable to find sensors" exit 1 fi +# 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 + jq -c "$JQ_FORMULA" < "$1" +fi /usr/bin/sensors -u -j \ - | jq -c '[.| to_entries |.[] | {A: .key, T: .value.temp1.temp1_input}]' + | jq -c "$JQ_FORMULA" # \ No newline at end of file From 62091528e807e42f68ad5322464cf659c87fcb55 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Thu, 7 Aug 2025 14:10:37 -0700 Subject: [PATCH 258/376] heatmon.bash: filters out stderr messages Signed-off-by: Jed Reynolds --- heatmon.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/heatmon.bash b/heatmon.bash index e442380b8..9a5fa3fa3 100755 --- a/heatmon.bash +++ b/heatmon.bash @@ -32,9 +32,9 @@ JQ_FORMULA=$( cat <<- 'EOF' EOF ) if [[ -n "${1:-}" ]] && [[ -r "$1" ]]; then - jq -c "$JQ_FORMULA" < "$1" + grep -v ERROR < "$1" | jq -c "$JQ_FORMULA" fi -/usr/bin/sensors -u -j \ +/usr/bin/sensors -u -j 2>/dev/null \ | jq -c "$JQ_FORMULA" # \ No newline at end of file From 9422558617b58c3b253ac8303145e9249fd7a31b Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Wed, 16 Jul 2025 15:21:33 +0530 Subject: [PATCH 259/376] lf_ftp.py: Added total_errors column in csv and report Signed-off-by: Sidartha-CT --- py-scripts/lf_ftp.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index c888fa401..5b5236af8 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -235,6 +235,7 @@ def __init__(self, lfclient_host="localhost", lfclient_port=8080, sta_prefix="st self.url_data = [] self.bytes_rd = [] self.rx_rate = [] + self.total_err = [] self.channel_list = [] self.mode_list = [] self.cx_list = [] @@ -929,6 +930,7 @@ 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['total_err'] = self.total_err rx_rate_val.append(list(self.rx_rate)) for i, port in enumerate(self.input_devices_list): @@ -1018,6 +1020,7 @@ def monitor_for_runtime_csv(self): 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 @@ -1028,6 +1031,7 @@ def get_device_details(self): 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)") + total_err = self.json_get("layer4/list?fields=total-err") if 'endpoint' in uc_avg_data.keys(): # list of layer 4 connections name if type(uc_avg_data['endpoint']) is dict: @@ -1035,6 +1039,7 @@ def get_device_details(self): 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)']) + self.total_err.append(total_err['endpoint']['total-err']) # reading uc-avg data in json format self.url_data.append(total_url_data['endpoint']['total-urls']) dataset.append(bytes_rd['endpoint']['bytes-rd']) @@ -1070,7 +1075,18 @@ def get_device_details(self): if created_cx in cx: self.rx_rate.append(cx[created_cx]['rx rate (1m)']) break + for cx in total_err['endpoint']: + if created_cx in cx: + self.total_err.append(cx[created_cx]['total-err']) + break self.bytes_rd = [float(f"{(i / 1000000): .4f}") for i in dataset] + + # calculating the number of successfully downloaded url's by subtracting the number of failed url's + 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) + # for cx in uc_avg_data['endpoint']: # for CX in cx: # for created_cx in self.cx_list: @@ -1286,7 +1302,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") @@ -1951,7 +1968,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 From ff56ba0e94c2fa0003deeb2288bc6cf35dea0de6 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Wed, 16 Jul 2025 15:30:15 +0530 Subject: [PATCH 260/376] lf_ftp.py: Added a function to save all L4 data in csv. Signed-off-by: Sidartha-CT --- py-scripts/lf_ftp.py | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 5b5236af8..96884bdab 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -891,6 +891,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): @@ -1014,6 +1058,12 @@ 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: + 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 @@ -1786,6 +1836,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: + 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") From dec06e8ddbee0b4fc0d2ca9f70f3bded2ba0df8b Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Wed, 16 Jul 2025 15:37:07 +0530 Subject: [PATCH 261/376] lf_ftp.py: Added client_id in csv for the purpose of testhouse. -To prevent data mismatches, we are using `client_id` as the key for the Testhouse live view. Signed-off-by: Sidartha-CT --- py-scripts/lf_ftp.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 96884bdab..cb969786e 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -952,9 +952,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 @@ -974,6 +978,7 @@ 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)) @@ -1343,8 +1348,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, From 5f341452a20a9aea6efb05eb87b929d979f830f4 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Wed, 16 Jul 2025 15:41:46 +0530 Subject: [PATCH 262/376] lf_ftp.py: moved dowebgui code above to generate_report. -For the purpose of testhouse ,moved dewebgui code to above the generate_report. Signed-off-by: Sidartha-CT --- py-scripts/lf_ftp.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index cb969786e..9334f47ba 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -2942,6 +2942,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, @@ -2956,13 +2962,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() From 6f3c9dc1a3ba23312e85fa92e8cb55148465b12f Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Wed, 16 Jul 2025 15:48:39 +0530 Subject: [PATCH 263/376] lf_ftp.py: Added testhouse live_view specific args and save images. -Images generated from testhouse live_view are being stored in result directory, then added to report via add_live_view_images_to_report_function. --- py-scripts/lf_ftp.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 9334f47ba..f4c51d98f 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -166,6 +166,8 @@ 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) @@ -268,6 +270,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") @@ -1780,6 +1784,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=""): @@ -1989,6 +2019,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() @@ -2724,6 +2756,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", @@ -2852,7 +2886,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 From 19e0af67f085fc9c38d651301933281c9f262277 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Wed, 16 Jul 2025 17:01:16 +0530 Subject: [PATCH 264/376] lf_ftp.py: fixed linting errors using flake8/autopep8. Verified CLI(Real Clients) : python3 lf_ftp.py --ssid Netgear-5g --passwd sharedsecret --file_sizes 10MB --mgr 192.168.244.97 --traffic_duration 1m --security wpa2 --directions Download --clients_type Real --ap_name Netgear --bands 5G --upstream_port eth1 --device_list 1.13,1.146 Verified CLI(Virtual Clients) :python3 lf_ftp.py --ssid NETGEAR_2G_wpa2 --passwd Password@123 --file_sizes 10MB --mgr 192.168.204.75 --traffic_duration 1m --security wpa2 --twog_radio wiphy0 --directions Upload --clients_type Virtual --ap_name Netgear --bands 2.4G --num_stations 2 --upstream_port eth1 Signed-off-by: Sidartha-CT --- py-scripts/lf_ftp.py | 114 +++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index f4c51d98f..3d8a93bc3 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -1071,7 +1071,7 @@ def monitor_for_runtime_csv(self): all_l4_data = self.get_all_l4_data() df = pd.DataFrame(all_l4_data) df.to_csv("all_l4_data.csv", index=False) - except: + 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 @@ -1143,40 +1143,40 @@ def get_device_details(self): # calculating the number of successfully downloaded url's by subtracting the number of failed url's urls_downloaded = [] for i in range(len(self.total_err)): - urls_downloaded.append(self.url_data[i]-self.total_err[i]) + urls_downloaded.append(self.url_data[i] - self.total_err[i]) self.url_data = list(urls_downloaded) - # 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']) + # 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") @@ -1359,7 +1359,7 @@ def my_monitor_for_real_devices(self): self.data_for_webui = { "client": self.cx_list, "client_id": client_id_list, - "Rx Rate(1m)":self.rx_rate, + "Rx Rate(1m)": self.rx_rate, "url_data": self.url_data, "bytes rd": self.bytes_rd, "uc_min": self.uc_min, @@ -1368,7 +1368,7 @@ def my_monitor_for_real_devices(self): "start_time": self.data["start_time"], "end_time": self.data["end_time"], "remaining_time": [0] * len(self.cx_list), - "total_err" : self.total_err + "total_err": self.total_err } logger.info("Monitoring complete") @@ -1791,24 +1791,24 @@ def add_live_view_images_to_report(self): 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 + 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): - self.report.set_custom_html('
') - self.report.build_custom() - self.report.set_custom_html(f'') - self.report.build_custom() + 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, @@ -1878,8 +1878,8 @@ def generate_report(self, ftp_data, date, input_setup_info, test_rig, test_tag, 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: + 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) @@ -2019,7 +2019,7 @@ 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): + 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") @@ -2887,8 +2887,8 @@ def pass_fail_duration(band, file_size): csv_name=args.device_csv_name, wait_time=args.wait_time, config=args.config, - get_live_view= args.get_live_view, - total_floors = args.total_floors + get_live_view=args.get_live_view, + total_floors=args.total_floors ) interation_num = interation_num + 1 From ed21d52f325a93f98534335fbdab00856a90e662 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 07:20:37 -0600 Subject: [PATCH 265/376] py-scripts/tools/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json updated naming convention Signed-off-by: Chuck SmileyRekiere --- .../{ct_009_ASUS_BE96U_rig.json => ct_us_009_ASUS_BE96U_rig.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename py-scripts/tools/ct_rig_json/{ct_009_ASUS_BE96U_rig.json => ct_us_009_ASUS_BE96U_rig.json} (100%) diff --git a/py-scripts/tools/ct_rig_json/ct_009_ASUS_BE96U_rig.json b/py-scripts/tools/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json similarity index 100% rename from py-scripts/tools/ct_rig_json/ct_009_ASUS_BE96U_rig.json rename to py-scripts/tools/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json From d7a4cab7a28e47391126f6f4198f92872c3ed395 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 07:21:24 -0600 Subject: [PATCH 266/376] py-scripts/tools/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json updated naming convention Signed-off-by: Chuck SmileyRekiere --- ...09_TP_LINK_BE800_rig.json => ct_us_009_TP_LINK_BE800_rig.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename py-scripts/tools/ct_rig_json/{ct_009_TP_LINK_BE800_rig.json => ct_us_009_TP_LINK_BE800_rig.json} (100%) diff --git a/py-scripts/tools/ct_rig_json/ct_009_TP_LINK_BE800_rig.json b/py-scripts/tools/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json similarity index 100% rename from py-scripts/tools/ct_rig_json/ct_009_TP_LINK_BE800_rig.json rename to py-scripts/tools/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json From 273d7ceb02940da205b34d1a875b278a9f2d3749 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 07:24:02 -0600 Subject: [PATCH 267/376] ct_perf_wc test json for testbed 009 Signed-off-by: Chuck SmileyRekiere --- ...W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json | 442 ++++++++++++++++++ ...W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json | 442 ++++++++++++++++++ ...1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json | 442 ++++++++++++++++++ 3 files changed, 1326 insertions(+) create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json new file mode 100644 index 000000000..8f5a2a980 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/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 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\"" + ] + }, + "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 --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/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json new file mode 100644 index 000000000..230aa4c54 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/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 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\"" + ] + }, + "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 --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/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json new file mode 100644 index 000000000..e9c12b89f --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/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 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\"" + ] + }, + "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 --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" + ] + } + } + } +} From 620cb586633c4de1ba3cab9e0ffd7c6518be5e77 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 08:00:46 -0600 Subject: [PATCH 268/376] ct_us_009 DP test suite TP link Signed-off-by: Chuck SmileyRekiere --- ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json | 505 ++++++++++++++++++ ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json | 505 ++++++++++++++++++ ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json | 505 ++++++++++++++++++ ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json | 505 ++++++++++++++++++ ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json | 505 ++++++++++++++++++ ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json | 505 ++++++++++++++++++ ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json | 505 ++++++++++++++++++ ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json | 505 ++++++++++++++++++ ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json | 505 ++++++++++++++++++ ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json | 505 ++++++++++++++++++ ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json | 505 ++++++++++++++++++ ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json | 505 ++++++++++++++++++ 12 files changed, 6060 insertions(+) create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json new file mode 100644 index 000000000..f6691988a --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json new file mode 100644 index 000000000..77761201b --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json new file mode 100644 index 000000000..93c8777c6 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json new file mode 100644 index 000000000..cf32b215e --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json new file mode 100644 index 000000000..64d1870cb --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json new file mode 100644 index 000000000..3c03c6177 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json new file mode 100644 index 000000000..55cd23def --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json new file mode 100644 index 000000000..b61f096ca --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json new file mode 100644 index 000000000..2cf9951c6 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json new file mode 100644 index 000000000..0dcf4d610 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json new file mode 100644 index 000000000..f4b872585 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json new file mode 100644 index 000000000..714137ea4 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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\"" + ] + }, + "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..+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" + ] + } + } + } +} From 86ab0e5ad75a1c636af2a6fca7db8b6d0ee9c359 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 08:08:29 -0600 Subject: [PATCH 269/376] ct_us_009 rvr TP_link tests Signed-off-by: Chuck SmileyRekiere --- ..._2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json | 505 ++++++++++++++++++ ..._2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json | 505 ++++++++++++++++++ ..._2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json | 505 ++++++++++++++++++ ..._2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json | 505 ++++++++++++++++++ ..._5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json | 505 ++++++++++++++++++ ..._5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json | 505 ++++++++++++++++++ ..._5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json | 505 ++++++++++++++++++ ..._5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json | 505 ++++++++++++++++++ ...6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json | 505 ++++++++++++++++++ ...6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json | 505 ++++++++++++++++++ ...6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json | 505 ++++++++++++++++++ ...6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json | 505 ++++++++++++++++++ 12 files changed, 6060 insertions(+) create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_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" + ] + } + } + } +} From c51751062c77f34541ce8288e305c1181e51bdc6 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 08:14:20 -0600 Subject: [PATCH 270/376] ct_009 updated dut name Signed-off-by: Chuck SmileyRekiere --- .../{ct_009_ASUS_BE96U.json => ct_009_ASUS_BE96U_dut.json} | 0 .../{ct_009_TP_LINK_BE800.json => ct_009_TP_LINK_BE800_dut.json} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename py-scripts/tools/ct_dut_json/{ct_009_ASUS_BE96U.json => ct_009_ASUS_BE96U_dut.json} (100%) rename py-scripts/tools/ct_dut_json/{ct_009_TP_LINK_BE800.json => ct_009_TP_LINK_BE800_dut.json} (100%) diff --git a/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json b/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U_dut.json similarity index 100% rename from py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U.json rename to py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U_dut.json diff --git a/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800.json b/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json similarity index 100% rename from py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800.json rename to py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json From 22844fec661a8e94b55e04af3445b81826e4b433 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 08:29:13 -0600 Subject: [PATCH 271/376] py-scripts/tools/ct_us_009_wc_BE800.bash initial commit of wifi capacity tests for ct_us_009 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_wc_BE800.bash | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 py-scripts/tools/ct_us_009_wc_BE800.bash diff --git a/py-scripts/tools/ct_us_009_wc_BE800.bash b/py-scripts/tools/ct_us_009_wc_BE800.bash new file mode 100644 index 000000000..290435dbf --- /dev/null +++ b/py-scripts/tools/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/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/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_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/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 From 40bb18b21d768e727146cbc4c6fc5e26d6fe393a Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 08:31:20 -0600 Subject: [PATCH 272/376] py-scripts/tools/ct_us_009_wc_BE800.bash updated privileges for execution Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_wc_BE800.bash | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 py-scripts/tools/ct_us_009_wc_BE800.bash diff --git a/py-scripts/tools/ct_us_009_wc_BE800.bash b/py-scripts/tools/ct_us_009_wc_BE800.bash old mode 100644 new mode 100755 From 1c8a56c476b84a43aa49927d1a3b5645f7710fb1 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 08:46:34 -0600 Subject: [PATCH 273/376] py-scripts/tools/ct_us_009_dp_BE800.bash initial commit of dataplane tests for testbed 009 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_dp_BE800.bash | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 py-scripts/tools/ct_us_009_dp_BE800.bash diff --git a/py-scripts/tools/ct_us_009_dp_BE800.bash b/py-scripts/tools/ct_us_009_dp_BE800.bash new file mode 100755 index 000000000..371614b8c --- /dev/null +++ b/py-scripts/tools/ct_us_009_dp_BE800.bash @@ -0,0 +1,25 @@ +#!/bin/bash + +# allow commands to be printed to the terminal +set -x + +echo "Running RVR tests" +./lf_check.py \ +--db_override ./tools/ct_us_009_DP_PERF_BE19000.db \ +--json_rig ./ct_rig_json/ct_us_009_rig_TP_BE19000.json \ +--json_dut ./ct_dut_json/ct_008_TP_BE19000_dut.json \ +--json_test \ +./ct_tests_json/ct_us_009/ct_perf_dp/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/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/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/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/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/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/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/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/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/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/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/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 From 7e69a2a95400066d3c436d7edf20031933d53821 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 08:59:26 -0600 Subject: [PATCH 274/376] py-scripts/tools/ct_us_009_rvr_BE800.bash initial commit for ct_us_009 rvr BE800.bash Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_rvr_BE800.bash | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 py-scripts/tools/ct_us_009_rvr_BE800.bash diff --git a/py-scripts/tools/ct_us_009_rvr_BE800.bash b/py-scripts/tools/ct_us_009_rvr_BE800.bash new file mode 100755 index 000000000..7c8329c93 --- /dev/null +++ b/py-scripts/tools/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_BE19000.db \ +--json_rig ./ct_rig_json/ct_us_009_rig_TP_BE19000.json \ +--json_dut ./ct_dut_json/ct_008_TP_BE19000_dut.json \ +--json_test \ +./ct_tests_json/ct_us_009/ct_perf_rvr/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/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/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/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/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/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/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/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/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/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/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/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 From b83e3a005a01f749f3eefcbf7feb62e10cfaeb56 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 09:00:06 -0600 Subject: [PATCH 275/376] py-scripts/tools/ct_us_009_dp_BE800.bash updated naming for Dataplane tests Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_dp_BE800.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_us_009_dp_BE800.bash b/py-scripts/tools/ct_us_009_dp_BE800.bash index 371614b8c..0fe5bc3f7 100755 --- a/py-scripts/tools/ct_us_009_dp_BE800.bash +++ b/py-scripts/tools/ct_us_009_dp_BE800.bash @@ -3,7 +3,7 @@ # allow commands to be printed to the terminal set -x -echo "Running RVR tests" +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_rig_TP_BE19000.json \ From fad69d56f261f6f2735221a86f76810622d8ace0 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 09:05:02 -0600 Subject: [PATCH 276/376] py-scripts/tools/ct_us_009_dp_BE800.bash corrected naming Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_dp_BE800.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/tools/ct_us_009_dp_BE800.bash b/py-scripts/tools/ct_us_009_dp_BE800.bash index 0fe5bc3f7..68246869c 100755 --- a/py-scripts/tools/ct_us_009_dp_BE800.bash +++ b/py-scripts/tools/ct_us_009_dp_BE800.bash @@ -6,8 +6,8 @@ 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_rig_TP_BE19000.json \ ---json_dut ./ct_dut_json/ct_008_TP_BE19000_dut.json \ +--json_rig ./ct_rig_json/ct_us_009_TP_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/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/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,\ From 146ff516e13ece035c205dec89c203dda6c56775 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 09:05:25 -0600 Subject: [PATCH 277/376] py-scripts/tools/ct_us_009_rvr_BE800.bash corrected naming Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_rvr_BE800.bash | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/py-scripts/tools/ct_us_009_rvr_BE800.bash b/py-scripts/tools/ct_us_009_rvr_BE800.bash index 7c8329c93..2987864e4 100755 --- a/py-scripts/tools/ct_us_009_rvr_BE800.bash +++ b/py-scripts/tools/ct_us_009_rvr_BE800.bash @@ -5,9 +5,9 @@ set -x echo "Running Rate vs Range tests" ./lf_check.py \ ---db_override ./tools/ct_us_009_RVR_PERF_BE19000.db \ ---json_rig ./ct_rig_json/ct_us_009_rig_TP_BE19000.json \ ---json_dut ./ct_dut_json/ct_008_TP_BE19000_dut.json \ +--db_override ./tools/ct_us_009_RVR_PERF_BE800.db \ +--json_rig ./ct_rig_json/ct_us_009_TP_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/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/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,\ From d5c90c79fa16c55ae505cd577ab0a6e2a031c16d Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 09:13:19 -0600 Subject: [PATCH 278/376] py-scripts/tools/ct_us_009_dp_BE800.bash script updates comma fix Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_dp_BE800.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_us_009_dp_BE800.bash b/py-scripts/tools/ct_us_009_dp_BE800.bash index 68246869c..fb541bfe7 100755 --- a/py-scripts/tools/ct_us_009_dp_BE800.bash +++ b/py-scripts/tools/ct_us_009_dp_BE800.bash @@ -20,6 +20,6 @@ echo "Running Dataplane tests" ./ct_tests_json/ct_us_009/ct_perf_dp/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/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/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/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,\ +./ct_tests_json/ct_us_009/ct_perf_dp/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 From a41f2cd15002d225fb65431e96ae1760f3c7be10 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 09:13:46 -0600 Subject: [PATCH 279/376] py-scripts/tools/ct_us_009_rvr_BE800.bash script update comma fix Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_rvr_BE800.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_us_009_rvr_BE800.bash b/py-scripts/tools/ct_us_009_rvr_BE800.bash index 2987864e4..713cd0e4b 100755 --- a/py-scripts/tools/ct_us_009_rvr_BE800.bash +++ b/py-scripts/tools/ct_us_009_rvr_BE800.bash @@ -20,6 +20,6 @@ echo "Running Rate vs Range tests" ./ct_tests_json/ct_us_009/ct_perf_rvr/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/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/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/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,\ +./ct_tests_json/ct_us_009/ct_perf_rvr/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 From c2a672cd97e1df34017bdf795ca8acabd4837be1 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 09:14:22 -0600 Subject: [PATCH 280/376] py-scripts/tools/ct_us_009_wc_BE800.bash script update comma fix Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_wc_BE800.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_us_009_wc_BE800.bash b/py-scripts/tools/ct_us_009_wc_BE800.bash index 290435dbf..2d1e7dd3b 100755 --- a/py-scripts/tools/ct_us_009_wc_BE800.bash +++ b/py-scripts/tools/ct_us_009_wc_BE800.bash @@ -11,6 +11,6 @@ echo "Running Wifi Capacity tests" --json_test \ ./ct_tests_json/ct_us_009/ct_perf_wc/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/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_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/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,\ +./ct_tests_json/ct_us_009/ct_perf_wc/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 From 73d77ddc116c80b92c2d139ffdf31a7965823ebb Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 09:25:07 -0600 Subject: [PATCH 281/376] ct_us_009 bash script updates Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_dp_BE800.bash | 2 +- py-scripts/tools/ct_us_009_rvr_BE800.bash | 2 +- py-scripts/tools/ct_us_009_wc_BE800.bash | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/py-scripts/tools/ct_us_009_dp_BE800.bash b/py-scripts/tools/ct_us_009_dp_BE800.bash index fb541bfe7..8660921b7 100755 --- a/py-scripts/tools/ct_us_009_dp_BE800.bash +++ b/py-scripts/tools/ct_us_009_dp_BE800.bash @@ -20,6 +20,6 @@ echo "Running Dataplane tests" ./ct_tests_json/ct_us_009/ct_perf_dp/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/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/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/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\ +./ct_tests_json/ct_us_009/ct_perf_dp/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/ct_us_009_rvr_BE800.bash b/py-scripts/tools/ct_us_009_rvr_BE800.bash index 713cd0e4b..53b2911e6 100755 --- a/py-scripts/tools/ct_us_009_rvr_BE800.bash +++ b/py-scripts/tools/ct_us_009_rvr_BE800.bash @@ -20,6 +20,6 @@ echo "Running Rate vs Range tests" ./ct_tests_json/ct_us_009/ct_perf_rvr/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/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/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/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\ +./ct_tests_json/ct_us_009/ct_perf_rvr/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/ct_us_009_wc_BE800.bash b/py-scripts/tools/ct_us_009_wc_BE800.bash index 2d1e7dd3b..7e1252fcd 100755 --- a/py-scripts/tools/ct_us_009_wc_BE800.bash +++ b/py-scripts/tools/ct_us_009_wc_BE800.bash @@ -11,6 +11,6 @@ echo "Running Wifi Capacity tests" --json_test \ ./ct_tests_json/ct_us_009/ct_perf_wc/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/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_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/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\ +./ct_tests_json/ct_us_009/ct_perf_wc/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 From 7ee22864c9df1b24064383f4d3c169ce3a42abe9 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 10:13:39 -0600 Subject: [PATCH 282/376] ct_us_009 rvr renames Signed-off-by: Chuck SmileyRekiere --- ...ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json} | 0 ...ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json} | 0 ...ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json} | 0 ...ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json} | 0 ...ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json} | 0 ...ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json} | 0 ...ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json} | 0 ...ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json} | 0 ...t_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json} | 0 ...t_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json} | 0 ...t_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json} | 0 ...t_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json} | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json => ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json => ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json => ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json => ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json => ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json => ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json => ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json => ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json => ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json => ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json => ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json} (100%) rename py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/{ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json => ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json} (100%) diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_TP_LINK_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json rename to py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json From 7062870740ee5a4a068f57e7f92418505aa2c523 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 10:14:05 -0600 Subject: [PATCH 283/376] ct_us_009 bash script updates Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_dp_BE800.bash | 2 +- py-scripts/tools/ct_us_009_rvr_BE800.bash | 2 +- py-scripts/tools/ct_us_009_wc_BE800.bash | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/py-scripts/tools/ct_us_009_dp_BE800.bash b/py-scripts/tools/ct_us_009_dp_BE800.bash index 8660921b7..7c214ea77 100755 --- a/py-scripts/tools/ct_us_009_dp_BE800.bash +++ b/py-scripts/tools/ct_us_009_dp_BE800.bash @@ -6,7 +6,7 @@ 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_BE800_rig.json \ +--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/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,\ diff --git a/py-scripts/tools/ct_us_009_rvr_BE800.bash b/py-scripts/tools/ct_us_009_rvr_BE800.bash index 53b2911e6..52a8a6aed 100755 --- a/py-scripts/tools/ct_us_009_rvr_BE800.bash +++ b/py-scripts/tools/ct_us_009_rvr_BE800.bash @@ -6,7 +6,7 @@ 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_BE800_rig.json \ +--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/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,\ diff --git a/py-scripts/tools/ct_us_009_wc_BE800.bash b/py-scripts/tools/ct_us_009_wc_BE800.bash index 7e1252fcd..a404f17fa 100755 --- a/py-scripts/tools/ct_us_009_wc_BE800.bash +++ b/py-scripts/tools/ct_us_009_wc_BE800.bash @@ -10,7 +10,7 @@ echo "Running Wifi Capacity tests" --json_dut ./ct_dut_json/ct_009_TP_LINK_BE800_dut.json \ --json_test \ ./ct_tests_json/ct_us_009/ct_perf_wc/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/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_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/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/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 From 11bbd79f3749011a273696966b7ce84560aa8194 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 10:19:14 -0600 Subject: [PATCH 284/376] ct_us_009 moved tests to TP_LINK_BE800 subdirectory Signed-off-by: Chuck SmileyRekiere --- .../ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json | 0 .../ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json | 0 .../ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json | 0 .../ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json | 0 .../ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json | 0 .../ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json | 0 .../ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json | 0 .../ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json | 0 .../ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json | 0 .../ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json | 0 .../ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json | 0 .../ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json | 0 .../ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json | 0 .../ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json | 0 .../ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json | 0 .../ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json | 0 .../ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json | 0 .../ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json | 0 .../ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json | 0 .../ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json | 0 ...ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json | 0 ...ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json | 0 ...ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json | 0 ...ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json | 0 .../ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json | 0 .../ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json | 0 .../ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json | 0 27 files changed, 0 insertions(+), 0 deletions(-) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) rename py-scripts/tools/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 (100%) diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_dp/ct_perf_dp_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_2g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_5g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_rvr/ct_perf_rvr_6g_TP_LINK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json rename to py-scripts/tools/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 diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json b/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_wc/ct_perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json rename to py-scripts/tools/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 From b52ebb118947eb32ed15571950f9829e5e6898b3 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 10:19:36 -0600 Subject: [PATCH 285/376] ct_us_009 updated to use new sub directory Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_dp_BE800.bash | 24 +++++++++++------------ py-scripts/tools/ct_us_009_rvr_BE800.bash | 24 +++++++++++------------ py-scripts/tools/ct_us_009_wc_BE800.bash | 6 +++--- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/py-scripts/tools/ct_us_009_dp_BE800.bash b/py-scripts/tools/ct_us_009_dp_BE800.bash index 7c214ea77..b05c237c1 100755 --- a/py-scripts/tools/ct_us_009_dp_BE800.bash +++ b/py-scripts/tools/ct_us_009_dp_BE800.bash @@ -9,17 +9,17 @@ echo "Running Dataplane tests" --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/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/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/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/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/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/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/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/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/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/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/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/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 \ +./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/ct_us_009_rvr_BE800.bash b/py-scripts/tools/ct_us_009_rvr_BE800.bash index 52a8a6aed..fe68c2f85 100755 --- a/py-scripts/tools/ct_us_009_rvr_BE800.bash +++ b/py-scripts/tools/ct_us_009_rvr_BE800.bash @@ -9,17 +9,17 @@ echo "Running Rate vs Range tests" --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/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/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/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/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/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/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/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/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/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/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/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/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 \ +./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/ct_us_009_wc_BE800.bash b/py-scripts/tools/ct_us_009_wc_BE800.bash index a404f17fa..6733c2fd0 100755 --- a/py-scripts/tools/ct_us_009_wc_BE800.bash +++ b/py-scripts/tools/ct_us_009_wc_BE800.bash @@ -9,8 +9,8 @@ echo "Running Wifi Capacity tests" --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/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/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/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 \ +./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 From c3e808ab3e132b8d288b63f57994298eea3eeb5e Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 17:49:30 -0600 Subject: [PATCH 286/376] py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json updated for the TP-Link Signed-off-by: Chuck SmileyRekiere --- .../tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json b/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json index cb5c9cbcf..13944c63f 100644 --- a/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json +++ b/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json @@ -16,12 +16,12 @@ "UPSTREAM_ALIAS":"eth2", "DATABASE_SQLITE":"ct_009_TP_Link_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"} + "ssid_idx=0":{"ssid_idx":"0", "SSID_USED":"TP-Link_3C7E","SSID_PW_USED":"25520545","BSSID_TO_USE":"92: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":"92: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":"92: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":"92: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":"92: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":"92:90:2d:0d:3c:84","SECURITY_USED":"wpa3"} } } } From f453acf8c1134561fa5c2daa0b24691730414efa Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 18:44:28 -0600 Subject: [PATCH 287/376] Dataplane for CT-US-009 modified to do two extremes of attenuation as compared to RvR which will do steps Signed-off-by: Chuck SmileyRekiere --- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json | 18 +++++++++--------- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json | 18 +++++++++--------- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json | 18 +++++++++--------- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json | 18 +++++++++--------- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json | 18 +++++++++--------- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json | 18 +++++++++--------- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json | 18 +++++++++--------- ...LINK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json | 18 +++++++++--------- ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json | 18 +++++++++--------- ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json | 18 +++++++++--------- ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json | 18 +++++++++--------- ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json | 18 +++++++++--------- 12 files changed, 108 insertions(+), 108 deletions(-) diff --git a/py-scripts/tools/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/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 index f6691988a..6f0d2327d 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 77761201b..7cedaecaf 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 93c8777c6..ad04a4a31 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index cf32b215e..3521f173b 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 64d1870cb..e50f3fca7 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 3c03c6177..4659ffb8b 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 55cd23def..7a55ab027 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index b61f096ca..2dcd796ad 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 2cf9951c6..f8d46fdaf 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 0dcf4d610..9ffe1521f 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index f4b872585..23e167bd8 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", diff --git a/py-scripts/tools/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/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 index 714137ea4..258b3912d 100644 --- a/py-scripts/tools/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/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 @@ -56,7 +56,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -108,7 +108,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -160,7 +160,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -212,7 +212,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -264,7 +264,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -316,7 +316,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -368,7 +368,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -420,7 +420,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", @@ -472,7 +472,7 @@ " --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 'attenuations: 0..+500..500'", " --raw_line 'attenuator_mod: 0xf' ", " --test_rig TEST_RIG ", " --set DUT_SET_NAME", From 9f249d5538755420d2b152bda9354fe51689d33d Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 18:47:56 -0600 Subject: [PATCH 288/376] 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 test bug fix the station total needed to be 64 Signed-off-by: Chuck SmileyRekiere --- .../ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json index 277358ed2..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/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json @@ -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\"" ] }, From 48b6f77ed09fb62d3a06a6e499a247b7e60ea7cd Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 9 Aug 2025 18:54:36 -0600 Subject: [PATCH 289/376] CT-US-009 mt7996e updated to use max 34 station Signed-off-by: Chuck SmileyRekiere --- ...t_perf_wc_2g_W0_W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json | 4 ++-- ...t_perf_wc_5g_W0_W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json | 4 ++-- ..._perf_wc_6g_W0_W1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/py-scripts/tools/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/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 index 8f5a2a980..9fdb11f32 100644 --- a/py-scripts/tools/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/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 @@ -394,7 +394,7 @@ "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 1 'DUT: USE_DUT_NAME Radio-1' NA wiphy8,AUTO -1 NA\" ", + " --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\"" ] }, @@ -407,7 +407,7 @@ "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 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --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'", diff --git a/py-scripts/tools/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/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 index 230aa4c54..1138410ec 100644 --- a/py-scripts/tools/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/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 @@ -394,7 +394,7 @@ "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 1 'DUT: USE_DUT_NAME Radio-2' NA wiphy9,AUTO -1 NA\" ", + " --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\"" ] }, @@ -407,7 +407,7 @@ "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 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --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'", diff --git a/py-scripts/tools/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/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 index e9c12b89f..fd4cd4b9b 100644 --- a/py-scripts/tools/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/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 @@ -394,7 +394,7 @@ "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 1 'DUT: USE_DUT_NAME Radio-3' NA wiphy10,AUTO -1 NA\" ", + " --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\"" ] }, @@ -407,7 +407,7 @@ "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 --loop_iter 1 --protocol 'TCP and UDP' --duration 20000", + " --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'", From a694857e6b6b97200fe2d7d2dada5b928661ec77 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 12 Aug 2025 06:16:06 -0600 Subject: [PATCH 290/376] py-scripts/test_l3.py The station_names_list was moved from start to build, since test l3 can do a rebuild due to being able to run multiple iteration thus the station list would grow there is a need to build to remove duplicates Signed-off-by: Chuck SmileyRekiere --- py-scripts/test_l3.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/py-scripts/test_l3.py b/py-scripts/test_l3.py index e05bb2e12..0a812a0fb 100755 --- a/py-scripts/test_l3.py +++ b/py-scripts/test_l3.py @@ -2022,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." % From b4937f16e1f7e2b02bbc11ca3e3cea2885b492b9 Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Wed, 13 Aug 2025 14:32:17 -0700 Subject: [PATCH 291/376] Added temperature graphing script temp_graph.py creates visual reports of the temperatures recorded with journalctl -t heatmon. --- py-scripts/temp_graph.py | 196 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 py-scripts/temp_graph.py diff --git a/py-scripts/temp_graph.py b/py-scripts/temp_graph.py new file mode 100644 index 000000000..62a70abe4 --- /dev/null +++ b/py-scripts/temp_graph.py @@ -0,0 +1,196 @@ +#!/bin/env python3 +""" +Small program that parses temperature data from an input file, +then saves the data in a clean csv file and presents a graph of it. +""" +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(): + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--inputfile", help="The path to the input file", + default=None) + parser.add_argument("-g", "--graph", help="display a graph of the data", + default=False, action="store_true") + 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 an index.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") + # TODO: ADD A --HELP ARGUMENT + args = parser.parse_args() + + # 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.graph: + plt.show() + + if args.report: + # write an index.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() From c6bc7e995b66836b2add8fa3e1cb454131763a1d Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Wed, 13 Aug 2025 15:48:22 -0700 Subject: [PATCH 292/376] added license and docstring info --- py-scripts/temp_graph.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/py-scripts/temp_graph.py b/py-scripts/temp_graph.py index 62a70abe4..31fdaaaf4 100644 --- a/py-scripts/temp_graph.py +++ b/py-scripts/temp_graph.py @@ -1,7 +1,28 @@ #!/bin/env python3 """ -Small program that parses temperature data from an input file, -then saves the data in a clean csv file and presents a graph of it. +NAME: temp_graph.py + +PURPOSE: +temp_graph.py will take heatmon temperature logs and create parsed CSVs +and optional graphical reports. + +EXAMPLE (only creating CSVs): + ./temp_graph.py -i heat_log.txt + +EXAMPLE (rendering an interactive graph of the data): + ./temp_graph.py -i heat_log.txt -g + +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 + +STATUS: UNDER DEVELOPMENT + +COPYRIGHT: + Copyright 2025 Candela Technologies Inc + License: Free to distribute and modify. LANforge systems must be licensed. """ import argparse import re From 320978899d2fc6f7e23605d284073ad4704ac4fb Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Thu, 14 Aug 2025 12:06:17 -0700 Subject: [PATCH 293/376] updated header and added help_summary --- py-scripts/temp_graph.py | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/py-scripts/temp_graph.py b/py-scripts/temp_graph.py index 31fdaaaf4..c39c5b51a 100644 --- a/py-scripts/temp_graph.py +++ b/py-scripts/temp_graph.py @@ -18,7 +18,13 @@ EXAMPLE (reporting with a band chart): ./temp_graph.py -i heat_log.txt -r -m band -STATUS: UNDER DEVELOPMENT +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 @@ -70,6 +76,16 @@ def _get_graph_title(df, num, rig): 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' + +This file is then parsed into a series of CSVs and optionally: +-an interactive graph (-g) +-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) @@ -81,13 +97,18 @@ def main(): help="saves the output graphs as PNGs", default=False, action="store_true") parser.add_argument("-r", "--report", - help="create an index.html page with the graph(s)", + 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") - # TODO: ADD A --HELP ARGUMENT + 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") @@ -102,7 +123,7 @@ def main(): print("Error creating output directory") exit(1) """ - TODO: update this documentation to explain the multi-charting process + 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)})*?] @@ -198,7 +219,7 @@ def main(): plt.show() if args.report: - # write an index.html page with the graphs we made + # 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)): @@ -207,9 +228,9 @@ def main(): '\" alt=\"graph 1\">') f.write('') f.write('') - f.write(f'') - f.write(f'') - f.write(f'') + 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']}{table_stats[file_num]["min"]}{table_stats[file_num]["max"]}{table_stats[file_num]["avg"]}
') f.write("
\n ") From 03e772073068e18a2e8fce6aecc440055a1cf945 Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Thu, 14 Aug 2025 12:08:34 -0700 Subject: [PATCH 294/376] Removed the --graph option for now due to matplotlib backend stability issues. This feature did not seem to be especially useful and was not worth maintaining without demand. It should be possible to get working if this feature becomes desirable in the future. --- py-scripts/temp_graph.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/py-scripts/temp_graph.py b/py-scripts/temp_graph.py index c39c5b51a..a5865fd93 100644 --- a/py-scripts/temp_graph.py +++ b/py-scripts/temp_graph.py @@ -9,9 +9,6 @@ EXAMPLE (only creating CSVs): ./temp_graph.py -i heat_log.txt -EXAMPLE (rendering an interactive graph of the data): - ./temp_graph.py -i heat_log.txt -g - EXAMPLE (creating an html report page): ./temp_graph.py -i heat_log.txt -r @@ -82,15 +79,12 @@ def main(): using the shell command 'journalctl -t heatmon' This file is then parsed into a series of CSVs and optionally: --an interactive graph (-g) -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("-g", "--graph", help="display a graph of the data", - default=False, action="store_true") parser.add_argument("-m", "--mode", help="change style of graph created", default="all") parser.add_argument("-s", "--save_output", @@ -215,8 +209,6 @@ def main(): plt.gca().get_legend().remove() if args.save_output or args.report: plt.savefig(_out_dir + _tstamp + "/" + _next_png_name(file_num)) - if args.graph: - plt.show() if args.report: # write a report.html page with the graphs we made From 8e7ae27d7547a091c7c1911a97a2a4e707193be1 Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Thu, 14 Aug 2025 13:53:21 -0700 Subject: [PATCH 295/376] updated docs to include information on acquiring heatmon logs --- py-scripts/temp_graph.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/py-scripts/temp_graph.py b/py-scripts/temp_graph.py index a5865fd93..224befe9f 100644 --- a/py-scripts/temp_graph.py +++ b/py-scripts/temp_graph.py @@ -5,6 +5,7 @@ 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 @@ -76,7 +77,7 @@ 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' +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) From 28c5030d7f92e7007bac003d681a82fc3f8d3af7 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 16 Aug 2025 18:15:33 -0600 Subject: [PATCH 296/376] py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json updated BSSID's Verification: automation Signed-off-by: Chuck SmileyRekiere --- .../tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json b/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json index 13944c63f..507e88037 100644 --- a/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json +++ b/py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json @@ -16,12 +16,12 @@ "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":"92: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":"92: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":"92: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":"92: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":"92: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":"92:90:2d:0d:3c:84","SECURITY_USED":"wpa3"} + "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"} } } } From ead5bf5baad97f1975f1fc5f3bba4a864d8bc903 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 17 Aug 2025 10:27:14 -0600 Subject: [PATCH 297/376] py-scripts/tools/ct_us_009_func_ASUS.bash initial commit Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_func_ASUS.bash | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 py-scripts/tools/ct_us_009_func_ASUS.bash diff --git a/py-scripts/tools/ct_us_009_func_ASUS.bash b/py-scripts/tools/ct_us_009_func_ASUS.bash new file mode 100755 index 000000000..f798f9432 --- /dev/null +++ b/py-scripts/tools/ct_us_009_func_ASUS.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 From 1fd3c1d22b9abb9bf5e96fbe791fd80c320f3bc5 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sun, 17 Aug 2025 10:43:45 -0600 Subject: [PATCH 298/376] py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json Initial commit test_l3 suite Signed-off-by: Chuck SmileyRekiere --- .../ASUS_BE96U/ct_test_l3.json | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json new file mode 100644 index 000000000..69e7d1a97 --- /dev/null +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json @@ -0,0 +1,115 @@ +{ + "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,lf_tcp --rates_are_totals --side_a_min_bps=1000000,500000 --side_b_min_bps=300000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_BE200_STA_1_W0'", + " --tos BK,BE,VI,VO", + " --side_a_min_pdu=1024,MTU", + " --side_b_min_pdu=1024,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=10000000 --side_b_min_bps 10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_BE200_STA_1_W0'", + " --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=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_BE200_STA_1_W0'", + " --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=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_MT7996E_STA_1_W8'", + " --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=10000000 --side_b_min_bps 10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_MT7996E_STA_1_W9'", + " --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=10000000 --side_b_min_bps=10000000", + " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_MT7996E_STA_1_W10'", + " --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" + ] + } + } + } +} From ab2594e6081e6502dfc1f337b01533e46f4251a1 Mon Sep 17 00:00:00 2001 From: Dipti Dhond Date: Tue, 19 Aug 2025 01:38:33 -0700 Subject: [PATCH 299/376] lf_sniff_radio.py: pass in full monitor eid in wait_until_ports_appear, instead of just monitor name, so that code is looking for the port on the correct resource. Signed-off-by: Dipti Dhond --- py-scripts/lf_sniff_radio.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index f17c243c0..c0df2ffdd 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -147,7 +147,9 @@ def setup(self, ht40_value, ht80_value, ht160_value): def start(self): self.monitor.admin_up() - LFUtils.wait_until_ports_appear(self.lfclient_url, self.monitor_name, debug=self.debug) + monitor_eid = "1." + str(self.monitor.resource) + "." + self.monitor_name + #print("Monitor name: " + self.monitor_name + ", monitor_eid: " + monitor_eid) + LFUtils.wait_until_ports_appear(self.lfclient_url, monitor_eid, 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) From 9bf3238eea6dbdf62c1eda5280a24e2e7c5ecb39 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 21 Aug 2025 09:41:58 -0600 Subject: [PATCH 300/376] py-scripts/tools/ct_us_009_func_ASUS.bash added test_l3 test Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/ct_us_009_func_ASUS.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/ct_us_009_func_ASUS.bash b/py-scripts/tools/ct_us_009_func_ASUS.bash index f798f9432..10f490474 100755 --- a/py-scripts/tools/ct_us_009_func_ASUS.bash +++ b/py-scripts/tools/ct_us_009_func_ASUS.bash @@ -9,6 +9,6 @@ echo "Running Functional tests" --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 +./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 From 0d4513627abba7fa6012d6df80e0ca4e34b589d0 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 02:57:14 -0700 Subject: [PATCH 301/376] lf_sniff_radio.py: Fix linting error Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index c0df2ffdd..0ce219ca4 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -148,7 +148,7 @@ def setup(self, ht40_value, ht80_value, ht160_value): def start(self): self.monitor.admin_up() monitor_eid = "1." + str(self.monitor.resource) + "." + self.monitor_name - #print("Monitor name: " + self.monitor_name + ", monitor_eid: " + monitor_eid) + logger.debug("Monitor name: " + self.monitor_name + ", monitor_eid: " + monitor_eid) LFUtils.wait_until_ports_appear(self.lfclient_url, monitor_eid, debug=self.debug) # TODO: Use LFUtils.wait_until_ports_admin_up instead of sleep, check return code. # time.sleep(5) From 66e24141ff58496ccc2ae6214392533547e5546a Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 03:09:41 -0700 Subject: [PATCH 302/376] lf_sniff_radio.py: Header docstring Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 186 +++++++++++++---------------------- 1 file changed, 67 insertions(+), 119 deletions(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index 0ce219ca4..524c1fc14 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -1,46 +1,38 @@ #!/usr/bin/env python3 +# 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 @@ -212,84 +204,40 @@ 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') + 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") From 615696a1f9c4e1af87bf514609b42c837615037b Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 03:25:21 -0700 Subject: [PATCH 303/376] lf_sniff_radio.py: Help summary update, whitespace/commenting Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index 524c1fc14..ba07a8c55 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -378,11 +378,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) @@ -423,23 +424,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() From cf093979e86b251e8abf7af078ca53689a5506c2 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 03:39:55 -0700 Subject: [PATCH 304/376] lf_sniff_radio.py: cleanup channel calculation logic Verified: ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --duration 20 \ --channel 1 ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --duration 20 \ --channel 14 ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --duration 20 \ --channel 36 ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --duration 20 \ --channel 1e ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --duration 20 \ --channel 37e ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --channel_bw 40 \ --channel_freq 2412 \ --center_freq 2422 ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --channel_bw 80 \ --channel_freq 5955 \ --center_freq 5985 Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 69 ++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index ba07a8c55..2967d0b52 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -77,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 @@ -94,41 +92,44 @@ def __init__(self, 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 + # 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 + + 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. From 8d48e49bc4013670b640b266e0848d181f6e9895 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 03:46:11 -0700 Subject: [PATCH 305/376] lf_sniff_radio.py: argument definition readability Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 111 +++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 32 deletions(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index 2967d0b52..e812bb476 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -240,81 +240,126 @@ def parse_args(): commands like 'iw moni0 info' may be useful to verify configuration. """) - parser.add_argument('--mgr', type=str, help='IP Address of LANforge', + 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' @@ -325,7 +370,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() From 78bee9aa15bd7f07a20eff0fcf3b3d6a08cc07c5 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 16:21:13 -0700 Subject: [PATCH 306/376] lf_sniff_radio.py: convert prints to logger, 'set_freq()' readability Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 42 ++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index e812bb476..a94659152 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -95,7 +95,7 @@ def __init__(self, # 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)) + logger.debug(f"User input frequency: {self.channel_freq}") elif self.channel and self.channel != "AUTO": if 'e' in self.channel: @@ -155,40 +155,49 @@ def start(self): 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 - - # 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): + """Configure existing WiFi monitor interface via SSH.""" + 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") + logger.info(f"Set channel/frequency output: {stdout}") + + # Query channel/frequency stdout = ssh.exec_command(cmd1) stdout = (stdout[1].readlines()) - print(stdout, "----- channel frequency info") + logger.info(f"Query channel/frequency output: {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() @@ -458,10 +467,11 @@ def main(): if bytesize > -1: sniff_snaplen_choice = bytesize else: - raise ValueError("bad sniff_bytes") + raise ValueError("bad '--sniff_bytes'") + except Exception as x: traceback.print_exception(Exception, x, x.__traceback__, chain=True) - print(f"Strange sniff length [{args.sniff_bytes}], please choose a positive value") + 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 From 1c0e0c38420936ebf557200a92cf6db418442827 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 16:37:10 -0700 Subject: [PATCH 307/376] lf_sniff_radio.py: improve 'start()' readability/logging Verified: ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --channel_bw 40 \ --channel_freq 2412 \ --center_freq 2422 \ --duration 5 Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index a94659152..6c6cc1af7 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -139,23 +139,38 @@ 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): - self.monitor.admin_up() + """Run packet capture.""" monitor_eid = "1." + str(self.monitor.resource) + "." + self.monitor_name - logger.debug("Monitor name: " + self.monitor_name + ", monitor_eid: " + monitor_eid) + + # Configure monitor to active state + logger.info(f"Configuring packet capture interface '{monitor_eid}'") + self.monitor.admin_up() + + # 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) - # 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) + + # 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) - def set_freq(self, ssh_root, ssh_passwd, freq=0): + def _set_freq(self, ssh_root, ssh_passwd, freq=0): """Configure existing WiFi monitor interface via SSH.""" if self.channel_bw == '20': From 0fdb7ab2a4919af271d41519a99e82fe56667fd6 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 16:44:42 -0700 Subject: [PATCH 308/376] lf_sniff_radio.py: set debug to off by default Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index 6c6cc1af7..c2f1daa5e 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -68,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, From b8e2d8e13fcc70782f336c4273c4d4fed9349ef5 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 16:49:58 -0700 Subject: [PATCH 309/376] lf_sniff_radio.py: improve '_set_freq()' stdout logging slightly Verified: ./lf_sniff_radio.py \ --radio 1.1.wiphy0 \ --channel_bw 40 \ --channel_freq 2412 \ --center_freq 2422 \ --duration 5 Signed-off-by: Alex Gavin --- py-scripts/lf_sniff_radio.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/py-scripts/lf_sniff_radio.py b/py-scripts/lf_sniff_radio.py index c2f1daa5e..fea1607fe 100755 --- a/py-scripts/lf_sniff_radio.py +++ b/py-scripts/lf_sniff_radio.py @@ -199,13 +199,13 @@ def _set_freq(self, ssh_root, ssh_passwd, freq=0): stdout[0].write(f"{ssh_passwd}\n") stdout[0].flush() - stdout = (stdout[1].readlines()) - logger.info(f"Set channel/frequency output: {stdout}") + 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()) - logger.info(f"Query channel/frequency output: {stdout}") + stdout = ''.join(stdout[1].readlines()) + logger.info(f"Query channel/frequency output:\n{stdout}") except paramiko.ssh_exception.NoValidConnectionsError as e: logger.error(f"Failed to connect over SSH to system '{ssh_root}': {e}") From 3a2787065e24cc62486988640f2fbe2e4a9f2c8a Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Mon, 25 Aug 2025 16:45:41 -0700 Subject: [PATCH 310/376] py-json: wifi_monitor_profile.py: guard verbose printouts by debug check Signed-off-by: Alex Gavin --- py-json/wifi_monitor_profile.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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") From 7d17c8d304d25b42eb0707d69c8fe932ffa6a111 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 26 Aug 2025 06:20:02 -0700 Subject: [PATCH 311/376] README: Update py-scripts with links Signed-off-by: Alex Gavin --- README.md | 90 +++++++++++++++++++++++++------------------------------ 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index eea0dd02e..4e6156040 100644 --- a/README.md +++ b/README.md @@ -107,56 +107,46 @@ Existing offerings largely include test and helper scripts in addition to import 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 | +| Name | Purpose | +| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [`create_bond.py`](./py-scripts/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`](./py-scripts/create_chamberview_dut.py) | Creates a single LANforge DUT object, primarily useful in Chamber View | +| [`create_chamberview.py`](./py-scripts/create_chamberview.py) | Creates a single LANforge Chamber View Scenario | +| [`create_l3.py`](./py-scripts/create_l3.py) | Creates and configures a variable number of LANforge L3 CX traffic pairs using existing ports | +| [`create_l4.py`](./py-scripts/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`](./py-scripts/create_vap.py) | Creates and configures a variable number of WiFi virtual APs (vAPs) using a single parent radio | +| [`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_ap_auto_test.py`](./py-scripts/lf_ap_auto_test.py) | This script is used to automate running AP-Auto tests | +| [`lf_dataplane_test.py`](./py-scripts/lf_dataplane_test.py) | This script is used to automate running Dataplane tests | +| [`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_graph.py`](./py-scripts/lf_graph.py) | Classes for creating images from graphs using data sets | +| [`lf_mesh_test.py`](./py-scripts/lf_mesh_test.py) | This script is used to automate running Mesh tests | +| [`lf_report.py`](./py-scripts/lf_report.py) | This program is a helper class for reporting results for a lanforge python script | +| [`lf_report_test.py`](./py-scripts/lf_report_test.py) | Python script to test reporting | +| [`lf_rvr_test.py`](./py-scripts/lf_rvr_test.py) | This script is used to automate running Rate-vs-Range tests | +| [`lf_snp_test.py`](./py-scripts/lf_snp_test.py) | Test scaling and performance (snp) run various configurations and measures data rates | +| [`lf_tr398_test.py`](./py-scripts/lf_tr398v4_test.py) | This script is used to automate running TR398 issue 4 tests | +| [`lf_wifi_capacity_test.py`](./py-scripts/lf_wifi_capacity_test.py) | This is a test file which will run a wifi capacity test | +| [`run_cv_scenario.py`](./py-scripts/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`](./py-scripts/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 | +| [`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 | +| [`test_status_msg.py`](./py-scripts/test_status_msg.py) | Test the status message passing functions of /status-msg | +| [`testgroup.py`](./py-scripts/testgroup.py) | Python script to test creation and control of test groups | +| [`tip_station_powersave.py`](./py-scripts/tip_station_powersave.py) | Generate and test for powersave packets within traffic run over multiple stations | +| [`update_dependencies.py`](./py-scripts/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`](./py-scripts/wlan_capacity_calculator.py) | Standard Script for WLAN Capacity Calculator | ## Perl and Shell Scripts From 9169b29b4328368f9f25ce24f1f43ad8ee320b9b Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 26 Aug 2025 08:08:39 -0700 Subject: [PATCH 312/376] README: Overhaul structure to simplify/categorize better Signed-off-by: Alex Gavin --- README.md | 279 +++++++++++++++++++++++++++++------------------------- 1 file changed, 150 insertions(+), 129 deletions(-) diff --git a/README.md b/README.md index 4e6156040..eb264e691 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,50 @@ Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if yo These scripts span a variety of use cases, including automating Chamber View tests, configuring LANforge ports and traffic pairs, and much more. -**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.) +Scripts will be kept backwards and forwards compatible with LANforge releases as much as possible. + +## Contents + +- [Overview](#overview) +- [Contents](#contents) +- [Setup and Installation](#setup-and-installation) + - [Perl Scripts](#perl-scripts) +- [Advanced Usage/Library-style Code](#advanced-usage-library-style-code) +- [Quick Tips](#quick-tips) + - [Documentation Links](#documentation-links) + - [Basic Terminology](#basic-terminology) + - [Exploring LANforge JSON API/Crafting CLI Commands](#exploring-lanforge-json-apicrafting-cli-commands) +- [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) +- [License](#license) + +## Setup and Installation + +**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) for tagged versions of scripts/automation). 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). +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. + +### Perl Scripts + +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 | + +## Advanced Usage, Library-style Code + For more advanced users wanting to develop their own automation, we offer the following: - Auto-generated Python library in [`lanforge_client/`](./lanforge_client/) @@ -23,52 +63,25 @@ For more advanced users wanting to develop their own automation, we offer the fo If you would like to contribute to LANforge scripts, please read the [`CONTRIBUTING.md`](./CONTRIBUTING.md) document for more information. -## 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) - ## Quick Tips -**NOTE:** In LANforge documentation, the term 'port' is used interchangable for network interface. - ### Documentation Links +- [Python Automation Setup](./py-scripts/README.md) (requires Python 3.7+, which is backwards compatible to Fedora 27 systems) - [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. - -In particular, these scripts are more modern and may be a good place to start: - -| 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 | - -The `lf_wifi_rest_example.pl` script shows how one might call the other scripts from -within a script. +| 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 | Now unused identifier for a set of LANforge resources. Generally can be omitted for automation purposes (e.g. '1.1.wlan0' same as '1.wlan0') | +| 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 that case. | +| STA, Station, Client | Interchangable terms used to refer to a WiFi device (emulated or real) | ### Exploring LANforge JSON API/Crafting CLI Commands @@ -97,58 +110,105 @@ To access this tool, perform the following steps: 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`](./py-scripts/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`](./py-scripts/create_chamberview_dut.py) | Creates a single LANforge DUT object, primarily useful in Chamber View | -| [`create_chamberview.py`](./py-scripts/create_chamberview.py) | Creates a single LANforge Chamber View Scenario | -| [`create_l3.py`](./py-scripts/create_l3.py) | Creates and configures a variable number of LANforge L3 CX traffic pairs using existing ports | -| [`create_l4.py`](./py-scripts/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`](./py-scripts/create_vap.py) | Creates and configures a variable number of WiFi virtual APs (vAPs) using a single parent radio | -| [`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_ap_auto_test.py`](./py-scripts/lf_ap_auto_test.py) | This script is used to automate running AP-Auto tests | -| [`lf_dataplane_test.py`](./py-scripts/lf_dataplane_test.py) | This script is used to automate running Dataplane tests | -| [`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_graph.py`](./py-scripts/lf_graph.py) | Classes for creating images from graphs using data sets | -| [`lf_mesh_test.py`](./py-scripts/lf_mesh_test.py) | This script is used to automate running Mesh tests | -| [`lf_report.py`](./py-scripts/lf_report.py) | This program is a helper class for reporting results for a lanforge python script | -| [`lf_report_test.py`](./py-scripts/lf_report_test.py) | Python script to test reporting | -| [`lf_rvr_test.py`](./py-scripts/lf_rvr_test.py) | This script is used to automate running Rate-vs-Range tests | -| [`lf_snp_test.py`](./py-scripts/lf_snp_test.py) | Test scaling and performance (snp) run various configurations and measures data rates | -| [`lf_tr398_test.py`](./py-scripts/lf_tr398v4_test.py) | This script is used to automate running TR398 issue 4 tests | -| [`lf_wifi_capacity_test.py`](./py-scripts/lf_wifi_capacity_test.py) | This is a test file which will run a wifi capacity test | -| [`run_cv_scenario.py`](./py-scripts/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`](./py-scripts/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 | -| [`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 | -| [`test_status_msg.py`](./py-scripts/test_status_msg.py) | Test the status message passing functions of /status-msg | -| [`testgroup.py`](./py-scripts/testgroup.py) | Python script to test creation and control of test groups | -| [`tip_station_powersave.py`](./py-scripts/tip_station_powersave.py) | Generate and test for powersave packets within traffic run over multiple stations | -| [`update_dependencies.py`](./py-scripts/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`](./py-scripts/wlan_capacity_calculator.py) | Standard Script for WLAN Capacity Calculator | - -## Perl and Shell Scripts +## 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. + +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 | | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -158,27 +218,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. | @@ -192,43 +244,12 @@ 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 - -Scripts will be kept backwards and forwards compatible with LANforge -releases as much as possible. - -## Setup and Installation - -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. - -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. - -### Python Scripts - -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. - -### Perl Scripts - -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 | - ## License Code in this repository is released under the BSD license (see [license.txt](./license.txt)). From 22e7421b6b0180d5c344ed81b7e72c68e318f351 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Tue, 26 Aug 2025 08:47:26 -0700 Subject: [PATCH 313/376] README: Update HTTP API section Signed-off-by: Alex Gavin --- README.md | 76 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index eb264e691..ac468433b 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ Scripts will be kept backwards and forwards compatible with LANforge releases as - [Quick Tips](#quick-tips) - [Documentation Links](#documentation-links) - [Basic Terminology](#basic-terminology) - - [Exploring LANforge JSON API/Crafting CLI Commands](#exploring-lanforge-json-apicrafting-cli-commands) - [Scripts/Automation by Type](#scriptsautomation-by-type) - [Creation/Configuration Scripts](#creationconfiguration-scripts) - [Chamber View Scripts](#chamber-view-scripts) @@ -28,6 +27,7 @@ Scripts will be kept backwards and forwards compatible with LANforge releases as - [Utility Scripts](#utility-scripts) - [Library Code Scripts](#library-code-scripts) (Not suggested) - [Unsorted or Older Scripts](#unsorted-or-older-scripts) +- [Exploring LANforge HTTP API/Crafting CLI Commands](#exploring-lanforge-http-apicrafting-cli-commands) - [License](#license) ## Setup and Installation @@ -83,33 +83,6 @@ If you would like to contribute to LANforge scripts, please read the [`CONTRIBUT | 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 that case. | | STA, Station, Client | Interchangable terms used to refer to a WiFi device (emulated or real) | -### Exploring LANforge JSON API/Crafting CLI Commands - -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. - -To access this tool, perform the following steps: - -1. Navigate to the Help page (either from the LANforge or remotely) - - - 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` - -2. Click on the link for your desired command, e.g. `add_sta` - - - Each CLI command will display two links. The link _on the left side_ takes you to the Command Composer tool - -3. Set the desired fields for the command - -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`). - ## 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. @@ -250,6 +223,53 @@ Unsorted and generally older scripts. These are generally not regularly used and | `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 | +## Exploring LANforge HTTP API/Crafting CLI Commands + +**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. + +### HTTP API/CLI Commands Overview + +When the LANforge GUI is running, a user can query and configure their LANforge system using the LANforge HTTP API. This service runs on port 8080 *wherever the LANforge GUI runs* +and exposes HTTP API endpoints for various uses. Additionally, the manager exposes the direct CLI via a telnet-like interface on port 4001. However, for all but the most advanced +users, we recommend the HTTP API. + +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 matches the data +available in the respective GUI tab (in the table). By default, though, 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`. + +### System Configuration with Command Composer + +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. Navigate to the 'Help' page (either from the LANforge or remotely) + + - Note that the IP or hostname should be the system where the *GUI* is running + - From the LANforge system (e.g. through VNC): `http://localhost:8080/help` + - Remotely: + - 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. Click on the link on the _left_ for your desired command, e.g. `add_sta` + + - 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 + +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/` and `/cli-form/` LANforge HTTP API endpoints + ## License Code in this repository is released under the BSD license (see [license.txt](./license.txt)). From 6a9c6e26db77dc07f8a120bdea6fd39d4a3a8112 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 26 Aug 2025 13:00:54 -0600 Subject: [PATCH 314/376] py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json updates to the test_l3.py configuration Signed-off-by: Chuck SmileyRekiere --- .../ASUS_BE96U/ct_test_l3.json | 86 ++++++++++++++++--- 1 file changed, 75 insertions(+), 11 deletions(-) diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json index 69e7d1a97..5d6c22cea 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json @@ -17,11 +17,11 @@ "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,lf_tcp --rates_are_totals --side_a_min_bps=1000000,500000 --side_b_min_bps=300000", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=400000000 --side_b_min_bps=1147000000", " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_BE200_STA_1_W0'", " --tos BK,BE,VI,VO", - " --side_a_min_pdu=1024,MTU", - " --side_b_min_pdu=1024,MTU", + " --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" ] }, @@ -33,8 +33,11 @@ "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=10000000 --side_b_min_bps 10000000", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=4803800000 --side_b_min_bps=4804000000", " --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" ] }, @@ -46,11 +49,63 @@ "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=10000000 --side_b_min_bps=10000000", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=4803800000 --side_b_min_bps=4804000000", " --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=826000000 --side_b_min_bps=1147000000", + " --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=3843100000 --side_b_min_bps=4804000000", + " --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=9607700000 --side_b_min_bps=9608000000", + " --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", @@ -59,8 +114,11 @@ "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=10000000 --side_b_min_bps=10000000", - " --test_rig TEST_RIG --test_tag 'TEST_L3_2G_MT7996E_STA_1_W8'", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=826000000 --side_b_min_bps=1147000000", + " --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" ] }, @@ -72,8 +130,11 @@ "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=10000000 --side_b_min_bps 10000000", - " --test_rig TEST_RIG --test_tag 'TEST_L3_5G_MT7996E_STA_1_W9'", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=3843100000 --side_b_min_bps=4804000000", + " --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" ] }, @@ -85,8 +146,11 @@ "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=10000000 --side_b_min_bps=10000000", - " --test_rig TEST_RIG --test_tag 'TEST_L3_6G_MT7996E_STA_1_W10'", + " --endp_type lf_udp --rates_are_totals --side_a_min_bps=9607700000 --side_b_min_bps=9608000000", + " --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" ] }, From 76635400b67dc8754ee826d5ec261b15586f8360 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 26 Aug 2025 16:27:53 -0600 Subject: [PATCH 315/376] py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json Set consistant upload and download as cannot achieve max Signed-off-by: Chuck SmileyRekiere --- .../ASUS_BE96U/ct_test_l3.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json index 5d6c22cea..c3c5be2be 100644 --- a/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json +++ b/py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json @@ -17,7 +17,7 @@ "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=400000000 --side_b_min_bps=1147000000", + " --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", @@ -33,7 +33,7 @@ "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=4803800000 --side_b_min_bps=4804000000", + " --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", @@ -49,7 +49,7 @@ "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=4803800000 --side_b_min_bps=4804000000", + " --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", @@ -65,7 +65,7 @@ "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=826000000 --side_b_min_bps=1147000000", + " --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", @@ -81,7 +81,7 @@ "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=3843100000 --side_b_min_bps=4804000000", + " --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", @@ -97,7 +97,7 @@ "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=9607700000 --side_b_min_bps=9608000000", + " --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", @@ -114,7 +114,7 @@ "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=826000000 --side_b_min_bps=1147000000", + " --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", @@ -130,7 +130,7 @@ "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=3843100000 --side_b_min_bps=4804000000", + " --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", @@ -146,7 +146,7 @@ "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=9607700000 --side_b_min_bps=9608000000", + " --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", From b393b19f9b9a4d76ff3b5cb6e93b3a3b0966a64e Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 26 Aug 2025 18:50:17 -0600 Subject: [PATCH 316/376] py-scripts/tools/ct_us_009_func_ASUS_BE96U.bash name update Signed-off-by: Chuck SmileyRekiere --- .../{ct_us_009_func_ASUS.bash => ct_us_009_func_ASUS_BE96U.bash} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename py-scripts/tools/{ct_us_009_func_ASUS.bash => ct_us_009_func_ASUS_BE96U.bash} (100%) diff --git a/py-scripts/tools/ct_us_009_func_ASUS.bash b/py-scripts/tools/ct_us_009_func_ASUS_BE96U.bash similarity index 100% rename from py-scripts/tools/ct_us_009_func_ASUS.bash rename to py-scripts/tools/ct_us_009_func_ASUS_BE96U.bash From e0fce54b2e3fd1e287ee8cb3494053b43cc6f8b1 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 05:47:54 -0700 Subject: [PATCH 317/376] py-scripts/README.md: Update to link to main README where possible Signed-off-by: Alex Gavin --- py-scripts/README.md | 48 +++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/py-scripts/README.md b/py-scripts/README.md index b2486ff36..854da8def 100644 --- a/py-scripts/README.md +++ b/py-scripts/README.md @@ -2,10 +2,8 @@ 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. - -- [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 @@ -19,26 +17,34 @@ There are two primary methods to access LANforge scripts (either for use or deve ### 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. +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. +**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. -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). +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)): +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). +**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). + +This section details how to setup LANforge scripts/automation using a specific tagged version (e.g. 5.5.1). 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 system LANforge +version already installed. 1. Open a shell and clone LANforge scripts @@ -89,26 +95,14 @@ Once you have successfully completed these steps, you can now use the LANforge P ## 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. +There are many scripts available within not just the LANforge Python scripts but the entire LANforge scripts repository. See [this section](../README.md#scriptsautomation-by-type) +for information on scripts/automation based on use case (e.g. run a test, create a station/bridge, monitor system state). -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. +For Python scripts in `py-scripts/`, run the script with the `--help_summary` option to list a summary of script functionality and purpose. +Additionally, Python 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`). From decf638b81fd1173ee2fc8b51177f81c2cc08326 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 05:50:02 -0700 Subject: [PATCH 318/376] READMEs: Move serial access section to main README Signed-off-by: Alex Gavin --- README.md | 22 +++++++++++++++++++++- py-scripts/README.md | 16 ---------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index ac468433b..3ba401353 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Scripts will be kept backwards and forwards compatible with LANforge releases as - [Library Code Scripts](#library-code-scripts) (Not suggested) - [Unsorted or Older Scripts](#unsorted-or-older-scripts) - [Exploring LANforge HTTP API/Crafting CLI Commands](#exploring-lanforge-http-apicrafting-cli-commands) +- [Configure Non-Root Serial Access](#configure-non-root-serial-access) - [License](#license) ## Setup and Installation @@ -158,7 +159,7 @@ Scripts/automation to perform small tasks on the system but not run tests or con | [`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_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 | @@ -270,6 +271,25 @@ To access and use this tool, perform the following steps: - CLI command for use in the telnet interface - Commands to manually send data to the `/cli-json/` and `/cli-form/` LANforge HTTP API endpoints +## 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 Code in this repository is released under the BSD license (see [license.txt](./license.txt)). diff --git a/py-scripts/README.md b/py-scripts/README.md index 854da8def..fe2875786 100644 --- a/py-scripts/README.md +++ b/py-scripts/README.md @@ -102,19 +102,3 @@ For Python scripts in `py-scripts/`, run the script with the `--help_summary` op Additionally, Python 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. - -## 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) From f6fe548742c8965ed630ba08d25ed2b6889eb373 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 06:37:55 -0700 Subject: [PATCH 319/376] READMEs: Consolidate setup instructions in main README Add notes to py-scripts/README.md to point to the main README to avoid potential dead links. Signed-off-by: Alex Gavin --- README.md | 132 +++++++++++++++++++++++++++++++++++++++---- py-scripts/README.md | 99 ++------------------------------ 2 files changed, 124 insertions(+), 107 deletions(-) diff --git a/README.md b/README.md index 3ba401353..53a574542 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,29 @@ # LANforge Perl, Python, and Shell Scripts +## Overview + **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. +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. -## Overview +**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). -These scripts span a variety of use cases, including automating Chamber View tests, configuring LANforge ports and traffic pairs, and much more. +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. -Scripts will be kept backwards and forwards compatible with LANforge releases as much as possible. +Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if you have any questions or encounter issues. ## Contents - [Overview](#overview) - [Contents](#contents) - [Setup and Installation](#setup-and-installation) - - [Perl Scripts](#perl-scripts) + - [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) - [Advanced Usage/Library-style Code](#advanced-usage-library-style-code) - [Quick Tips](#quick-tips) - [Documentation Links](#documentation-links) @@ -33,13 +41,110 @@ Scripts will be kept backwards and forwards compatible with LANforge releases as ## Setup and Installation -**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) for tagged versions of scripts/automation). +There are two primary methods to use LANforge scripts: + +1. Using the version available on your pre-installed LANforge system (**no setup required**) + + 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. + + Pre-installed scripts in `/home/lanforge/scripts/py-scripts/` match the LANforge software version already installed on the system. + +2. By installing from the Git repository (repository [here](https://github.com/greearb/lanforge-scripts)) + + 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. + + Instructions for this are detailed in [this section](#installing-from-source). -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). +### Installing from Source -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. +#### Installing from Source Prerequisites -### Perl Scripts +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. + +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. @@ -88,6 +193,9 @@ If you would like to contribute to LANforge scripts, please read the [`CONTRIBUT 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 @@ -231,7 +339,7 @@ to the HTTP version unless indicated otherwise. ### HTTP API/CLI Commands Overview -When the LANforge GUI is running, a user can query and configure their LANforge system using the LANforge HTTP API. This service runs on port 8080 *wherever the LANforge GUI runs* +When the LANforge GUI is running, a user can query and configure their LANforge system using the LANforge HTTP API. This service runs on port 8080 _wherever the LANforge GUI runs_ and exposes HTTP API endpoints for various uses. Additionally, the manager exposes the direct CLI via a telnet-like interface on port 4001. However, for all but the most advanced users, we recommend the HTTP API. @@ -245,14 +353,14 @@ API help page `http://GUI_SYSTEM_IP_HERE:8080/help`. ### System Configuration with Command Composer -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 +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. Navigate to the 'Help' page (either from the LANforge or remotely) - - Note that the IP or hostname should be the system where the *GUI* is running + - Note that the IP or hostname should be the system where the _GUI_ is running - From the LANforge system (e.g. through VNC): `http://localhost:8080/help` - Remotely: - Directly by IP address: `http://192.168.1.101:8080/help` diff --git a/py-scripts/README.md b/py-scripts/README.md index fe2875786..9e5c48a40 100644 --- a/py-scripts/README.md +++ b/py-scripts/README.md @@ -2,103 +2,12 @@ This directory contains Python scripts to configure and test devices with LANforge traffic generation and network impairment systems. +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. + 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). - -This section details how to setup LANforge scripts/automation using a specific tagged version (e.g. 5.5.1). 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 system LANforge -version already installed. - -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. See [this section](../README.md#scriptsautomation-by-type) -for information on scripts/automation based on use case (e.g. run a test, create a station/bridge, monitor system state). - -For Python scripts in `py-scripts/`, run the script with the `--help_summary` option to list a summary of script functionality and purpose. -Additionally, Python 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. +Setup instructions have been moved to [this document](../README.md#installing-from-source). From 1152977d6e1bed94fc8e94305b3d4726dc87f9ff Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 06:49:14 -0700 Subject: [PATCH 320/376] README.md: Re-order for better readability Signed-off-by: Alex Gavin --- README.md | 105 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 53a574542..d08d2bbf2 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,13 @@ Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if yo - [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) -- [Advanced Usage/Library-style Code](#advanced-usage-library-style-code) -- [Quick Tips](#quick-tips) - - [Documentation Links](#documentation-links) - - [Basic Terminology](#basic-terminology) - [Scripts/Automation by Type](#scriptsautomation-by-type) - [Creation/Configuration Scripts](#creationconfiguration-scripts) - [Chamber View Scripts](#chamber-view-scripts) @@ -35,10 +34,34 @@ Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if yo - [Utility Scripts](#utility-scripts) - [Library Code Scripts](#library-code-scripts) (Not suggested) - [Unsorted or Older Scripts](#unsorted-or-older-scripts) -- [Exploring LANforge HTTP API/Crafting CLI Commands](#exploring-lanforge-http-apicrafting-cli-commands) -- [Configure Non-Root Serial Access](#configure-non-root-serial-access) +- [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) + - [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 + +### 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) + +### Basic Terminology + +| 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 that case. | +| STA, Station, Client | Interchangable terms used to refer to a WiFi device (emulated or real) | + ## Setup and Installation There are two primary methods to use LANforge scripts: @@ -81,7 +104,7 @@ Please ensure the following criteria are met before installing LANforge scripts 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. + (e.g. new feature or bug fix). While not recommended, it is possible to use the latest version as well. #### Installing from Source Setup @@ -156,39 +179,6 @@ To use LANforge Perl automation, the system which will run the scripts must have | Pexpect | python3-pexpect | Yes | | XlsxWriter | python3-xlsxwriter | Yes, for Xlsx output | -## Advanced Usage, Library-style Code - -For more advanced users wanting to develop their own automation, we offer the following: - -- 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. - -## Quick Tips - -### Documentation Links - -- [Python Automation Setup](./py-scripts/README.md) (requires Python 3.7+, which is backwards compatible to Fedora 27 systems) -- [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) - -### Basic Terminology - -| 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 | Now unused identifier for a set of LANforge resources. Generally can be omitted for automation purposes (e.g. '1.1.wlan0' same as '1.wlan0') | -| 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 that case. | -| STA, Station, Client | Interchangable terms used to refer to a WiFi device (emulated or real) | - ## 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. @@ -332,16 +322,35 @@ Unsorted and generally older scripts. These are generally not regularly used and | `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 | -## Exploring LANforge HTTP API/Crafting CLI Commands +## Advanced Usage, Library-style Code + +For more advanced users wanting to looking their own automation, we offer the following: + +- 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. + +### LANforge HTTP API and Telnet CLI **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. -### HTTP API/CLI Commands Overview +#### LANforge HTTP API and Telnet CLI Commands Overview -When the LANforge GUI is running, a user can query and configure their LANforge system using the LANforge HTTP API. This service runs on port 8080 _wherever the LANforge GUI runs_ -and exposes HTTP API endpoints for various uses. Additionally, the manager exposes the direct CLI via a telnet-like interface on port 4001. However, for all but the most advanced -users, we recommend the HTTP API. +When the LANforge GUI is running, a user can query and configure their LANforge system using the LANforge HTTP API and/or the telnet CLI. + +The HTTP API (recommended) 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. However, 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 matches the data available in the respective GUI tab (in the table). By default, though, only a limited set of data is returned for each endpoint. However, more specific fields may be queried as needed. @@ -351,7 +360,7 @@ Information on available HTTP API endpoints is available at the main/root HTTP e 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`. -### System Configuration with Command Composer +#### 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). @@ -379,7 +388,9 @@ To access and use this tool, perform the following steps: - CLI command for use in the telnet interface - Commands to manually send data to the `/cli-json/` and `/cli-form/` LANforge HTTP API endpoints -## Configure Non-Root Serial Access +## 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 From 319985c01cde30378f2dcc494e5a48138a233293 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 07:13:57 -0700 Subject: [PATCH 321/376] lanforge_client: Update README Signed-off-by: Alex Gavin --- lanforge_client/README.md | 53 +++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 22 deletions(-) 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: From 475ce2bf2b53a9ea031839caa84ef7f8e290983c Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 07:14:12 -0700 Subject: [PATCH 322/376] lanforge_client: Update query_metrics example README Signed-off-by: Alex Gavin --- .../examples/query_metrics/README.md | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) 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 + ``` From 7a8496c8e7e8d4207ad38c16712184ade959f778 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 07:21:01 -0700 Subject: [PATCH 323/376] py-scripts READMEs: Update sub-directory READMEs Signed-off-by: Alex Gavin --- py-scripts/examples/README.md | 8 ++++++-- py-scripts/sandbox/README.md | 1 + py-scripts/scripts_deprecated/README.md | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) 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/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/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. From 63bbfc3841555a49822e98bc6cb2781f4d35117a Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Wed, 27 Aug 2025 08:16:18 -0700 Subject: [PATCH 324/376] README.md: Add query walkthrough to HTTP API section, other HTTP API updates Signed-off-by: Alex Gavin --- README.md | 131 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 113 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d08d2bbf2..3784cf9af 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if yo - [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) @@ -59,8 +60,10 @@ Please contact [`support@candelatech.com`](mailto:support@candelatech.com) if yo | 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 that case. | +| 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. | ## Setup and Installation @@ -342,24 +345,92 @@ If you would like to contribute to LANforge scripts, please read the [`CONTRIBUT ### LANforge HTTP API and Telnet CLI **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. +to the HTTP version unless indicated otherwise. Please see [this section](#basic-terminology) for more commonly-used LANforge terminology. #### LANforge HTTP API and Telnet CLI Commands Overview -When the LANforge GUI is running, a user can query and configure their LANforge system using the LANforge HTTP API and/or the telnet CLI. +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 (recommended) 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. However, we recommend -the HTTP API for most use cases. +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 matches the data -available in the respective GUI tab (in the table). By default, though, 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. +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 @@ -367,26 +438,50 @@ dynamically generate CLI commands, either for use via the HTTP API via the `/cli To access and use this tool, perform the following steps: -1. Navigate to the 'Help' page (either from the LANforge or remotely) +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 - - From the LANforge system (e.g. through VNC): `http://localhost:8080/help` - - Remotely: - - Directly by IP address: `http://192.168.1.101:8080/help` - - Via DNS resolution, if supported by your network: `http://ct523c-cafe:8080/help` + - 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): -2. Click on the link on the _left_ for your desired command, e.g. `add_sta` + - 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 CLI output for the fields you configured at the top of the webpage + + - This generates multiple outputs at the top of the webpage, all of which perform the same operation - Generated output includes: - - CLI command for use in the telnet interface - - Commands to manually send data to the `/cli-json/` and `/cli-form/` LANforge HTTP API endpoints + - 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 From 06ba94acfabd1b5cb01777c83d73d8315c0a7858 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Tue, 22 Jul 2025 18:22:15 -0700 Subject: [PATCH 325/376] check_large_files.bash: adds comments --- check_large_files.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/check_large_files.bash b/check_large_files.bash index 72cc9851e..0c3800aba 100755 --- a/check_large_files.bash +++ b/check_large_files.bash @@ -289,6 +289,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]}" @@ -694,6 +695,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]" From 3fee28d63aa5f1e353e4d6b09e47cf7cf0050370 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 28 Aug 2025 14:46:53 -0600 Subject: [PATCH 326/376] py-scripts/tools/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 initial commit Verified: Automation Signed-off-by: Chuck SmileyRekiere --- ...rf_dp_2g_TP_LINK_test_group_W8_TCP_rx.json | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 py-scripts/tools/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 diff --git a/py-scripts/tools/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/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/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" + ] + } + } + } +} From d1b842f574d0fb0973a20c96e45f0e8660624ad3 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 28 Aug 2025 14:50:49 -0600 Subject: [PATCH 327/376] py-scripts/tools/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 initial commit Verification: Automation Signed-off-by: Chuck SmileyRekiere --- ...rf_dp_2g_TP_LINK_test_group_W8_TCP_tx.json | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 py-scripts/tools/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 diff --git a/py-scripts/tools/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/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/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" + ] + } + } + } +} From 69c95dbaa02cb180a9f18960bebf521ff6145a90 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 29 Aug 2025 11:35:28 -0600 Subject: [PATCH 328/376] moving files to archive for now then will move to deprecated Signed-off-by: Chuck SmileyRekiere --- .../ct_dut_json/ct_001_AX88U_dut.json | 3 +- .../ct_dut_json/ct_001_AXE16000_dut.json | 3 +- .../ct_dut_json/ct_002_AX12_dut.json | 3 +- .../ct_dut_json/ct_002_AX16K_dut.json | 3 +- .../ct_dut_json/ct_003_AX88U_dut.json | 5 ++-- .../ct_dut_json/ct_004_AX88U_dut.json | 6 +--- .../ct_dut_json/ct_005_AXE11000_dut.json | 0 .../ct_dut_json/ct_005_R7000_dut.json | 0 .../ct_dut_json/ct_008_TP_BE19000_dut.json | 0 .../ct_008_VAP_AT7_mtk7996e_dut.json | 0 .../ct_dut_json/ct_009_ASUS_BE96U_dut.json | 0 .../ct_dut_json/ct_009_TP_LINK_BE800_dut.json | 0 .../ct_dut_json/ct_9136_dut.json | 3 +- .../ct_dut_json/ct_9164_dut.json | 3 +- .../ct_dut_json/ct_9166_dut.json | 3 +- .../ct_ASUS_AXE16000_10_Gbps_eth3.json | 4 +-- .../ct_ASUS_AXE16000_2_5_Gbps_eth1.json | 4 +-- .../ct_dut_json/ct_AX88U_dut.json | 3 +- .../ct_TPLINK_AXE16000_10_Gbps_eth3.json | 2 -- .../ct_TPLINK_AXE16000_2_5_Gbps_eth1.json | 2 -- .../ct_TPLINK_CE22_10_Gbps_eth2.json | 2 -- .../ct_TPLINK_CE22_10_Gbps_eth3.json | 2 -- .../ct_dut_json/ct_id_AX88U_dut.json | 4 +-- .../ct_dut_json/ct_id_AXE11000_dut.json | 4 +-- .../ct_rig_json/ct_9136_WLC1_lanforge.json | 4 +-- .../ct_rig_json/ct_test_rig.json | 4 +-- .../ct_rig_json/ct_us_001_rig.json | 0 .../ct_rig_json/ct_us_002_rig.json | 0 .../ct_rig_json/ct_us_003_rig.json | 0 .../ct_rig_json/ct_us_004_rig.json | 0 .../ct_rig_json/ct_us_005_rig_AXE11000.json | 0 .../ct_rig_json/ct_us_005_rig_R7000.json | 0 .../ct_rig_json/ct_us_007_rig.json | 0 .../ct_us_008_rig_AT7_MTK7996e.json | 0 .../ct_rig_json/ct_us_008_rig_TP_BE19000.json | 0 .../ct_rig_json/ct_us_009_ASUS_BE96U_rig.json | 0 .../ct_us_009_TP_LINK_BE800_rig.json | 0 .../ct_tests_json/ct_9136_tx_power_tests.json | 2 +- .../ct_tests_json/ct_9136_wlan.json | 2 +- .../ct_tests_json/ct_9164_tx_power_tests.json | 2 +- .../ct_tests_json/ct_9166_tx_power_tests.json | 2 +- .../ct_tests_json/ct_functional_tests.json | 26 ++++++++--------- .../ct_tests_json/ct_perf_dp_103_id.json | 4 +-- .../ct_tests_json/ct_perf_dp_104_id.json | 2 +- .../ct_tests_json/ct_perf_wc_103_id.json | 2 +- .../{ => archive}/ct_tests_json/ct_tests.json | 2 +- .../ct_functional/Readme_functional_001.txt | 7 ++--- .../ct_functional/ct_functional.json | 12 ++++---- .../ct_us_001/ct_perf_dp/Readme_dp_001.txt | 6 ++-- .../ct_perf_dp_2g_001_W0_W2_W4_W5_W7_rx.json | 4 +-- ...erf_dp_2g_001_W0_W2_W4_W5_W7_rx_short.json | 4 +-- .../ct_perf_dp_2g_001_W0_W2_W4_W5_W7_tx.json | 4 +-- ...erf_dp_2g_001_W0_W2_W4_W5_W7_tx_short.json | 4 +-- .../ct_perf_dp/ct_perf_dp_2g_001_rx.json | 4 +-- .../ct_perf_dp/ct_perf_dp_2g_001_tx.json | 4 +-- .../ct_perf_dp_5g_001_W1_W2_W4_W5_W7_rx.json | 4 +-- ...erf_dp_5g_001_W1_W2_W4_W5_W7_rx_short.json | 4 +-- .../ct_perf_dp_5g_001_W1_W2_W4_W5_W7_tx.json | 4 +-- ...erf_dp_5g_001_W1_W2_W4_W5_W7_tx_short.json | 4 +-- .../ct_perf_dp/ct_perf_dp_5g_001_rx.json | 4 +-- .../ct_perf_dp/ct_perf_dp_5g_001_tx.json | 4 +-- .../ct_us_001/ct_perf_wc/Readme_wc_001.txt | 8 +++--- .../ct_perf_wc/ct_perf_wc_2g_001.json | 4 +-- .../ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json | 4 +-- .../ct_perf_wc/ct_perf_wc_5g_001.json | 4 +-- .../ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json | 4 +-- .../ct_us_001/ct_scale/001_scale_cfg.txt | 0 .../ct_us_001/ct_scale/ct_scale_001.json | 0 .../ct_tests_json/ct_us_001_scripts.json | 24 +++++++--------- .../ct_tests_json/ct_us_001_tests.json | 12 ++++---- .../ct_us_002/ct_perf_dp/Readme_dp_002.txt | 6 ++-- ...erf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_rx.json | 4 +-- ...erf_dp_2g_002_W0_W2_W3_W4_W5_W6_W7_tx.json | 4 +-- ...erf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_rx.json | 4 +-- ...erf_dp_5g_002_W1_W2_W3_W4_W5_W6_W7_tx.json | 4 +-- .../ct_perf_dp_6g_002_W5_W6_rx.json | 4 +-- .../ct_perf_dp_6g_002_W5_W6_tx.json | 4 +-- .../ct_us_002/ct_perf_wc/Readme_wc_002.txt | 6 ++-- .../ct_perf_wc/ct_perf_wc_2g_002.json | 4 +-- ...t_perf_wc_2g_002_W0_W2_W3_W4_W5_W6_W7.json | 0 .../ct_perf_wc/ct_perf_wc_5g_002.json | 4 +-- ...t_perf_wc_5g_002_W1_W2_W3_W4_W5_W6_W7.json | 4 +-- .../ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json | 6 ++-- .../ct_port_reset_2g_5g_6g_002.json | 0 .../ct_port_reset/port_reset_002.txt | 0 .../ct_us_002/ct_scale/002_scale_cfg.txt | 0 .../ct_us_002/ct_scale/ct_scale_002.json | 0 .../ct_tests_json/ct_us_002_tests.json | 10 ++----- .../ct_tests_json/ct_us_003_tests.json | 16 ++++------- .../ct_functional/ct_functional.json | 12 ++++---- .../ct_us_004/ct_perf_dp/Readme_dp_004.txt | 6 ++-- ...t_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_rx.json | 4 +-- ...t_perf_dp_2g_004_W0_W2_W4_W5_W6_W7_tx.json | 4 +-- .../ct_perf_dp/ct_perf_dp_2g_004_rx.json | 4 +-- .../ct_perf_dp/ct_perf_dp_2g_004_tx.json | 4 +-- ...t_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_rx.json | 4 +-- ...t_perf_dp_5g_004_W1_W2_W4_W5_W6_W7_tx.json | 4 +-- .../ct_perf_dp/ct_perf_dp_5g_004_rx.json | 4 +-- .../ct_perf_dp/ct_perf_dp_5g_004_tx.json | 4 +-- .../ct_us_004/ct_perf_wc/Readme_wc_004.txt | 6 ++-- .../ct_perf_wc/ct_perf_wc_2g_004.json | 4 +-- .../ct_perf_wc_2g_004_W0_W2_W4_W5_W6_W7.json | 4 +-- .../ct_perf_wc/ct_perf_wc_5g_004.json | 4 +-- .../ct_perf_wc_5g_004_W1_W2_W4_W5_W6_W7.json | 4 +-- .../ct_tests_json/ct_us_004_tests.json | 10 +++---- .../ct_ap_auto/ct_ap_auto_basic_cx_005.json | 0 .../ct_ap_auto/ct_ap_auto_capacity_005.json | 0 .../ct_ap_auto/ct_ap_auto_long_term_005.json | 0 .../ct_ap_auto_mix_stability_005.json | 0 .../ct_ap_auto_tput_multi_band_005.json | 0 .../ct_ap_auto_tput_multi_sta_005.json | 0 .../ct_ap_auto_tput_single_sta_005.json | 0 .../ct_perf_dp_2g_W6_W10_TCP_rx.json | 5 ++-- .../ct_perf_dp_2g_W6_W10_TCP_tx.json | 7 ++--- .../ct_perf_dp_2g_W6_W10_UDP_rx.json | 5 ++-- .../ct_perf_dp_2g_W6_W10_UDP_tx.json | 5 ++-- .../ct_perf_dp_5g_W6_W10_TCP_rx.json | 5 ++-- .../ct_perf_dp_5g_W6_W10_TCP_tx.json | 5 ++-- .../ct_perf_dp_5g_W6_W10_UDP_rx.json | 7 ++--- .../ct_perf_dp_5g_W6_W10_UDP_tx.json | 5 ++-- .../ct_perf_dp_6g_W6_W10_TCP_rx.json | 5 ++-- .../ct_perf_dp_6g_W6_W10_TCP_tx.json | 5 ++-- .../ct_perf_dp_6g_W6_W10_UDP_rx.json | 5 ++-- .../ct_perf_dp_6g_W6_W10_UDP_tx.json | 5 ++-- .../ct_us_007/ct_perf_rvr/Readme_rvr_007.txt | 6 ++-- .../ct_perf_rvr/ct_perf_rvr_2g_007_rx.json | 0 .../ct_perf_rvr/ct_perf_rvr_2g_007_tx.json | 0 .../ct_perf_rvr/ct_perf_rvr_2g_007_tx_rx.json | 0 .../ct_perf_rvr_2g_5g_6g_007_rx.json | 0 .../ct_perf_rvr_2g_5g_6g_007_tx.json | 0 .../ct_perf_rvr_2g_5g_6g_007_tx_rx.json | 0 .../ct_perf_rvr/ct_perf_rvr_5g_007_rx.json | 0 .../ct_perf_rvr/ct_perf_rvr_5g_007_tx.json | 0 .../ct_perf_rvr/ct_perf_rvr_5g_007_tx_rx.json | 0 .../ct_perf_rvr/ct_perf_rvr_6g_007_rx.json | 0 .../ct_perf_rvr/ct_perf_rvr_6g_007_tx.json | 0 .../ct_perf_rvr/ct_perf_rvr_6g_007_tx_rx.json | 0 .../real_dut/ct_perf_dp_2g_W0_TCP_rx.json | 0 .../real_dut/ct_perf_dp_2g_W0_TCP_tx.json | 0 .../real_dut/ct_perf_dp_2g_W0_UDP_rx.json | 0 .../real_dut/ct_perf_dp_2g_W0_UDP_tx.json | 0 .../real_dut/ct_perf_dp_5g_W1_TCP_rx.json | 0 .../real_dut/ct_perf_dp_5g_W1_TCP_tx.json | 0 .../real_dut/ct_perf_dp_5g_W1_UDP_rx.json | 0 .../real_dut/ct_perf_dp_5g_W1_UDP_tx.json | 0 .../real_dut/ct_perf_dp_6g_W2_TCP_rx.json | 0 .../real_dut/ct_perf_dp_6g_W2_TCP_tx.json | 0 .../real_dut/ct_perf_dp_6g_W2_UDP_rx.json | 0 .../real_dut/ct_perf_dp_6g_W2_UDP_tx.json | 0 .../ct_perf_functional/ct_test_l3.json | 0 .../real_dut/ct_perf_rvr_2g_W0_TCP_rx.json | 0 .../real_dut/ct_perf_rvr_2g_W0_TCP_tx.json | 0 .../real_dut/ct_perf_rvr_2g_W0_UDP_rx.json | 0 .../real_dut/ct_perf_rvr_2g_W0_UDP_tx.json | 0 .../real_dut/ct_perf_rvr_5g_W1_TCP_rx.json | 0 .../real_dut/ct_perf_rvr_5g_W1_TCP_tx.json | 0 .../real_dut/ct_perf_rvr_5g_W1_UDP_rx.json | 0 .../real_dut/ct_perf_rvr_5g_W1_UDP_tx.json | 0 .../real_dut/ct_perf_rvr_6g_W2_TCP_rx.json | 0 .../real_dut/ct_perf_rvr_6g_W2_TCP_tx.json | 0 .../real_dut/ct_perf_rvr_6g_W2_UDP_rx.json | 0 .../real_dut/ct_perf_rvr_6g_W2_UDP_tx.json | 0 .../vap_dut/ct_perf_rvr_2g_W0_TCP_rx_vap.json | 0 .../vap_dut/ct_perf_rvr_2g_W0_TCP_tx_vap.json | 0 .../vap_dut/ct_perf_rvr_2g_W0_UDP_rx_vap.json | 0 .../vap_dut/ct_perf_rvr_2g_W0_UDP_tx_vap.json | 0 .../vap_dut/ct_perf_rvr_5g_W1_TCP_rx_vap.json | 0 .../vap_dut/ct_perf_rvr_5g_W1_TCP_tx_vap.json | 0 .../vap_dut/ct_perf_rvr_5g_W1_UDP_rx_vap.json | 0 .../vap_dut/ct_perf_rvr_5g_W1_UDP_tx_vap.json | 0 .../vap_dut/ct_perf_rvr_6g_W2_TCP_rx_vap.json | 0 .../vap_dut/ct_perf_rvr_6g_W2_TCP_tx_vap.json | 0 .../vap_dut/ct_perf_rvr_6g_W2_UDP_rx_vap.json | 0 .../vap_dut/ct_perf_rvr_6g_W2_UDP_tx_vap.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json | 0 ...rf_dp_2g_TP_LINK_test_group_W8_TCP_rx.json | 0 ...rf_dp_2g_TP_LINK_test_group_W8_TCP_tx.json | 0 .../ASUS_BE96U/ct_test_l3.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_TCP_tx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W8_UDP_tx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_TCP_tx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_rx.json | 0 ...INK_W0_W1_W2_W3_W4_W5_W6_W7_W9_UDP_tx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_rx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_TCP_tx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_rx.json | 0 ...NK_W0_W1_W2_W3_W4_W5_W6_W7_W10_UDP_tx.json | 0 ...W1_W2_W3_W4_W5_W6_W7_W8_DL_UL_TCP_UDP.json | 0 ...W1_W2_W3_W4_W5_W6_W7_W9_DL_UL_TCP_UDP.json | 0 ...1_W2_W3_W4_W5_W6_W7_W10_DL_UL_TCP_UDP.json | 0 .../ct_tests_json/ct_us_generic_scripts.json | 4 +-- .../ct_tests_json/ct_us_scripts.json | 28 +++++++++---------- .../tools/{ => archive}/ct_us_001_dp.bash | 2 +- .../tools/{ => archive}/ct_us_001_func.bash | 2 +- .../ct_us_001_func_wc_dp_run.bash | 1 - .../tools/{ => archive}/ct_us_001_scale.bash | 0 .../tools/{ => archive}/ct_us_001_wc.bash | 0 .../tools/{ => archive}/ct_us_002_cv.bash | 0 .../tools/{ => archive}/ct_us_002_dp.bash | 0 .../ct_us_002_func_wc_dp_run.bash | 0 .../tools/{ => archive}/ct_us_002_scale.bash | 0 .../tools/{ => archive}/ct_us_002_wc.bash | 0 .../tools/{ => archive}/ct_us_004_dp.bash | 2 +- .../tools/{ => archive}/ct_us_004_func.bash | 2 +- .../ct_us_004_func_wc_dp_run.bash | 2 +- .../tools/{ => archive}/ct_us_004_wc.bash | 0 .../{ => archive}/ct_us_005_ap_auto.bash | 0 .../ct_us_005_ap_auto_basic_cx.bash | 0 .../ct_us_005_ap_auto_capacity.bash | 0 .../ct_us_005_ap_auto_individual.bash | 0 .../ct_us_005_ap_auto_long_term.bash | 0 .../ct_us_005_ap_auto_mix_stability.bash | 0 .../ct_us_005_ap_auto_tput_multi_band.bash | 0 .../ct_us_005_ap_auto_tput_multi_sta.bash | 0 .../ct_us_005_ap_auto_tput_single_sta.bash | 0 .../tools/{ => archive}/ct_us_007_dp_run.bash | 2 -- .../{ => archive}/ct_us_007_rvr_run.bash | 0 .../{ => archive}/ct_us_008_dp_BE19000.bash | 0 .../{ => archive}/ct_us_008_rvr_BE19000.bash | 0 .../{ => archive}/ct_us_008_rvr_VAP_AT7.bash | 0 .../{ => archive}/ct_us_009_dp_BE800.bash | 0 .../ct_us_009_func_ASUS_BE96U.bash | 0 .../{ => archive}/ct_us_009_rvr_BE800.bash | 0 .../{ => archive}/ct_us_009_wc_BE800.bash | 0 .../tools/{ => archive}/qa_ping_status.bash | 0 .../{ct_dut_json => }/lf_create_dut_json.py | 0 .../{ct_rig_json => }/lf_create_rig_json.py | 0 241 files changed, 233 insertions(+), 288 deletions(-) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_001_AX88U_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_001_AXE16000_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_002_AX12_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_002_AX16K_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_003_AX88U_dut.json (96%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_004_AX88U_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_005_AXE11000_dut.json (100%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_005_R7000_dut.json (100%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_008_TP_BE19000_dut.json (100%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_008_VAP_AT7_mtk7996e_dut.json (100%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_009_ASUS_BE96U_dut.json (100%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_009_TP_LINK_BE800_dut.json (100%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_9136_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_9164_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_9166_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_ASUS_AXE16000_10_Gbps_eth3.json (99%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_ASUS_AXE16000_2_5_Gbps_eth1.json (99%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_AX88U_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_TPLINK_AXE16000_10_Gbps_eth3.json (99%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_TPLINK_AXE16000_2_5_Gbps_eth1.json (99%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth2.json (99%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_TPLINK_CE22_10_Gbps_eth3.json (99%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_id_AX88U_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_dut_json/ct_id_AXE11000_dut.json (98%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_9136_WLC1_lanforge.json (98%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_test_rig.json (98%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_001_rig.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_002_rig.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_003_rig.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_004_rig.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_005_rig_AXE11000.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_005_rig_R7000.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_007_rig.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_008_rig_AT7_MTK7996e.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_008_rig_TP_BE19000.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json (100%) rename py-scripts/tools/{ => archive}/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_9136_tx_power_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_9136_wlan.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_9164_tx_power_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_9166_tx_power_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_functional_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_perf_dp_103_id.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_perf_dp_104_id.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_perf_wc_103_id.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_functional/Readme_functional_001.txt (93%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_functional/ct_functional.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_dp/Readme_dp_001.txt (99%) mode change 100755 => 100644 rename 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 (99%) rename 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 (99%) rename 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 (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_rx.json (99%) mode change 100755 => 100644 rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_2g_001_tx.json (99%) mode change 100755 => 100644 rename 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 (99%) rename 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 (99%) rename 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 (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_rx.json (99%) mode change 100755 => 100644 rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_dp/ct_perf_dp_5g_001_tx.json (99%) mode change 100755 => 100644 rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_wc/Readme_wc_001.txt (97%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_2g_001_W0_W2_W4_W5_W7.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_perf_wc/ct_perf_wc_5g_001_W1_W2_W4_W5_W7.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_scale/001_scale_cfg.txt (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001/ct_scale/ct_scale_001.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001_scripts.json (98%) mode change 100755 => 100644 rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_001_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_perf_dp/Readme_dp_002.txt (99%) mode change 100755 => 100644 rename 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 (99%) rename 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 (99%) rename 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 (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_rx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_perf_dp/ct_perf_dp_6g_002_W5_W6_tx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_perf_wc/Readme_wc_002.txt (97%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_2g_002.json (99%) rename 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 (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_5g_002.json (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_perf_wc/ct_perf_wc_6g_002_W5_W6.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_port_reset/ct_port_reset_2g_5g_6g_002.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_port_reset/port_reset_002.txt (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_scale/002_scale_cfg.txt (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002/ct_scale/ct_scale_002.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_002_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_003_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_functional/ct_functional.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_dp/Readme_dp_004.txt (99%) mode change 100755 => 100644 rename 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 (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_rx.json (99%) mode change 100755 => 100644 rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_2g_004_tx.json (99%) mode change 100755 => 100644 rename 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 (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_rx.json (99%) mode change 100755 => 100644 rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_dp/ct_perf_dp_5g_004_tx.json (99%) mode change 100755 => 100644 rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_wc/Readme_wc_004.txt (97%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_2g_004.json (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004/ct_perf_wc/ct_perf_wc_5g_004.json (99%) rename 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 (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_004_tests.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_basic_cx_005.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_capacity_005.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_long_term_005.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_mix_stability_005.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_band_005.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_multi_sta_005.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_005/ct_ap_auto/ct_ap_auto_tput_single_sta_005.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_rx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_TCP_tx.json (98%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_rx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_2g_W6_W10_UDP_tx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_rx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_TCP_tx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_rx.json (98%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_5g_W6_W10_UDP_tx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_rx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_TCP_tx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_rx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_dp/ct_perf_dp_6g_W6_W10_UDP_tx.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/Readme_rvr_007.txt (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_007_tx_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_2g_5g_6g_007_tx_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_5g_007_tx_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_007/ct_perf_rvr/ct_perf_rvr_6g_007_tx_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_TCP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_2g_W0_UDP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_TCP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_5g_W1_UDP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_TCP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_dp/real_dut/ct_perf_dp_6g_W2_UDP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_TCP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_2g_W0_UDP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_TCP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_5g_W1_UDP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_TCP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_rx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/real_dut/ct_perf_rvr_6g_W2_UDP_tx.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_rx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_TCP_tx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_rx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_2g_W0_UDP_tx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_rx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_TCP_tx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_rx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_5g_W1_UDP_tx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_rx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_TCP_tx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_rx_vap.json (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_008/ct_perf_rvr/vap_dut/ct_perf_rvr_6g_W2_UDP_tx_vap.json (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename 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 (100%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_generic_scripts.json (99%) rename py-scripts/tools/{ => archive}/ct_tests_json/ct_us_scripts.json (99%) rename py-scripts/tools/{ => archive}/ct_us_001_dp.bash (98%) rename py-scripts/tools/{ => archive}/ct_us_001_func.bash (97%) rename py-scripts/tools/{ => archive}/ct_us_001_func_wc_dp_run.bash (99%) rename py-scripts/tools/{ => archive}/ct_us_001_scale.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_001_wc.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_002_cv.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_002_dp.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_002_func_wc_dp_run.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_002_scale.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_002_wc.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_004_dp.bash (98%) rename py-scripts/tools/{ => archive}/ct_us_004_func.bash (97%) rename py-scripts/tools/{ => archive}/ct_us_004_func_wc_dp_run.bash (91%) rename py-scripts/tools/{ => archive}/ct_us_004_wc.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_basic_cx.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_capacity.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_individual.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_long_term.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_mix_stability.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_tput_multi_band.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_tput_multi_sta.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_005_ap_auto_tput_single_sta.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_007_dp_run.bash (99%) rename py-scripts/tools/{ => archive}/ct_us_007_rvr_run.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_008_dp_BE19000.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_008_rvr_BE19000.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_008_rvr_VAP_AT7.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_009_dp_BE800.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_009_func_ASUS_BE96U.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_009_rvr_BE800.bash (100%) rename py-scripts/tools/{ => archive}/ct_us_009_wc_BE800.bash (100%) rename py-scripts/tools/{ => archive}/qa_ping_status.bash (100%) rename py-scripts/tools/{ct_dut_json => }/lf_create_dut_json.py (100%) rename py-scripts/tools/{ct_rig_json => }/lf_create_rig_json.py (100%) 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 100% 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 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 100% 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 diff --git a/py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U_dut.json b/py-scripts/tools/archive/ct_dut_json/ct_009_ASUS_BE96U_dut.json similarity index 100% rename from py-scripts/tools/ct_dut_json/ct_009_ASUS_BE96U_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_009_ASUS_BE96U_dut.json diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_dut_json/ct_009_TP_LINK_BE800_dut.json rename to py-scripts/tools/archive/ct_dut_json/ct_009_TP_LINK_BE800_dut.json 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_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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_009_ASUS_BE96U_rig.json diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json rename to py-scripts/tools/archive/ct_rig_json/ct_us_009_TP_LINK_BE800_rig.json 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_008/ct_perf_functional/ct_test_l3.json 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/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json rename to py-scripts/tools/archive/ct_tests_json/ct_us_009/ct_perf_functional/ASUS_BE96U/ct_test_l3.json diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 diff --git a/py-scripts/tools/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 similarity index 100% rename from py-scripts/tools/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 rename to 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 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 100% rename from py-scripts/tools/ct_us_002_cv.bash rename to py-scripts/tools/archive/ct_us_002_cv.bash 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 100% 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 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/ct_us_009_dp_BE800.bash b/py-scripts/tools/archive/ct_us_009_dp_BE800.bash similarity index 100% rename from py-scripts/tools/ct_us_009_dp_BE800.bash rename to py-scripts/tools/archive/ct_us_009_dp_BE800.bash diff --git a/py-scripts/tools/ct_us_009_func_ASUS_BE96U.bash b/py-scripts/tools/archive/ct_us_009_func_ASUS_BE96U.bash similarity index 100% rename from py-scripts/tools/ct_us_009_func_ASUS_BE96U.bash rename to py-scripts/tools/archive/ct_us_009_func_ASUS_BE96U.bash diff --git a/py-scripts/tools/ct_us_009_rvr_BE800.bash b/py-scripts/tools/archive/ct_us_009_rvr_BE800.bash similarity index 100% rename from py-scripts/tools/ct_us_009_rvr_BE800.bash rename to py-scripts/tools/archive/ct_us_009_rvr_BE800.bash diff --git a/py-scripts/tools/ct_us_009_wc_BE800.bash b/py-scripts/tools/archive/ct_us_009_wc_BE800.bash similarity index 100% rename from py-scripts/tools/ct_us_009_wc_BE800.bash rename to py-scripts/tools/archive/ct_us_009_wc_BE800.bash 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/ct_dut_json/lf_create_dut_json.py b/py-scripts/tools/lf_create_dut_json.py similarity index 100% rename from py-scripts/tools/ct_dut_json/lf_create_dut_json.py rename to py-scripts/tools/lf_create_dut_json.py diff --git a/py-scripts/tools/ct_rig_json/lf_create_rig_json.py b/py-scripts/tools/lf_create_rig_json.py similarity index 100% rename from py-scripts/tools/ct_rig_json/lf_create_rig_json.py rename to py-scripts/tools/lf_create_rig_json.py From e684fdb07ba9fcbbae9e3611cccb2cd252f02f32 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Fri, 29 Aug 2025 11:38:11 -0600 Subject: [PATCH 329/376] moved the older lf_create_dut_json.py and lf-create_rig_json.py to the archieve Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/{ => archive/ct_dut_json}/lf_create_dut_json.py | 0 py-scripts/tools/{ => archive/ct_rig_json}/lf_create_rig_json.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename py-scripts/tools/{ => archive/ct_dut_json}/lf_create_dut_json.py (100%) rename py-scripts/tools/{ => archive/ct_rig_json}/lf_create_rig_json.py (100%) diff --git a/py-scripts/tools/lf_create_dut_json.py b/py-scripts/tools/archive/ct_dut_json/lf_create_dut_json.py similarity index 100% rename from py-scripts/tools/lf_create_dut_json.py rename to py-scripts/tools/archive/ct_dut_json/lf_create_dut_json.py diff --git a/py-scripts/tools/lf_create_rig_json.py b/py-scripts/tools/archive/ct_rig_json/lf_create_rig_json.py similarity index 100% rename from py-scripts/tools/lf_create_rig_json.py rename to py-scripts/tools/archive/ct_rig_json/lf_create_rig_json.py From bb777f8d6b4fd1717714ade0b058f0366148226c Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Fri, 29 Aug 2025 12:54:16 +0530 Subject: [PATCH 330/376] lf_interop_video_streaming.py: Clean up the video-streaming code by moving group/profile setup into one place - Add new ctor params: upstream_port, device_list, webgui_incremental - Add new method handle_groups_profiles_config() which is useful to handle Device groups and ssid profiles Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 74 ++++++++++++++---------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index b2fe83047..8ae346718 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -127,7 +127,10 @@ def __init__(self, host, ssid, passwd, encryp, media_source, media_quality, supo 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, floors=None, - get_live_view=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 @@ -187,6 +190,10 @@ def __init__(self, host, ssid, passwd, encryp, media_source, media_quality, supo 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): @@ -1639,6 +1646,35 @@ def add_buffer_and_wait_time_images(self, report): 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(id for id in eid_list) + return device_list + def main(): help_summary = '''\ @@ -1872,10 +1908,11 @@ def main(): 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) 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() @@ -1883,34 +1920,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)) - - 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) + args.device_list = obj.handle_groups_profiles_config() + args.device_list = args.device_list.split(',') + else: # When group/profile are not provided config_dict = { From 73fcef2a974b207cdfefd1c4de07d6c52737e754 Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Fri, 29 Aug 2025 13:10:54 +0530 Subject: [PATCH 331/376] lf_interop_video_streaming.py: extract SSID-based config flow; simplify main -Add handle_ssid_based_device_config(config_dict) which is useful to handle ssid based device configuration Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 82 ++++++++---------------- 1 file changed, 28 insertions(+), 54 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index 8ae346718..f6661ee09 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -1674,6 +1674,30 @@ def handle_groups_profiles_config(self): eid_list.append(all_res[j]) device_list = ",".join(id for id in 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 self.device_list def main(): @@ -1922,8 +1946,8 @@ def main(): if args.group_name and args.file_name and args.profile_name: args.device_list = obj.handle_groups_profiles_config() args.device_list = args.device_list.split(',') - - else: + + elif args.config: # When group/profile are not provided config_dict = { 'ssid': args.ssid, @@ -1948,59 +1972,9 @@ 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.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) + args.device_list = obj.handle_ssid_based_device_config(config_dict) + if args.dowebgui: resource_ids_sm = args.device_list.split(',') From 60562f1d9e9f69c6a848f3cbe2a2113b03921a37 Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Fri, 29 Aug 2025 14:15:46 +0530 Subject: [PATCH 332/376] lf_interop_video_streaming.py: normalize device_list handling - Simplifies main() and reduces fragile string handling. Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 53 ++++++++++++++++++++---- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index f6661ee09..21b71b5a4 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -1976,19 +1976,26 @@ def main(): args.device_list = obj.handle_ssid_based_device_config(config_dict) + # process devices when test is run through webui if args.dowebgui: - resource_ids_sm = args.device_list.split(',') - resource_set = set(resource_ids_sm) + resource_set = set(args.device_list) resource_list = sorted(resource_set) - resource_ids_generated = ','.join(resource_list) + 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(',')] + + 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) + + 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: - device_list = args.device_list.split(',') + device_list = args.device_list # Extract resource IDs (after the dot), remove duplicates, and sort them resource_ids = sorted(set(int(item.split('.')[1]) for item in device_list if '.' in item)) resource_list_sorted = resource_ids @@ -2003,6 +2010,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) From 6fbab26a343483bebc68c1b58b852327e5e03449 Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Fri, 29 Aug 2025 15:01:38 +0530 Subject: [PATCH 333/376] lf_interop_video_streaming.py: extract incremental-capacity logic Replace the large inline block in main() with a single call to obj.process_incremental_capacity(incremental_capacity_list_values, available_resources, gave_incremental). Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 72 +++++++++++++----------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index 21b71b5a4..94a960a85 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -1674,7 +1674,7 @@ def handle_groups_profiles_config(self): eid_list.append(all_res[j]) device_list = ",".join(id for id in eid_list) return device_list - + def handle_ssid_based_device_config(self, config_dict): # When group/profile are not provided @@ -1698,6 +1698,40 @@ def handle_ssid_based_device_config(self, config_dict): 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 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 main(): @@ -1974,7 +2008,7 @@ def main(): } args.device_list = obj.handle_ssid_based_device_config(config_dict) - + # process devices when test is run through webui if args.dowebgui: @@ -2129,37 +2163,7 @@ 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() @@ -2201,7 +2205,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) From e533a456d8aab540c68675ddd6b310da0dfe081b Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Fri, 29 Aug 2025 15:18:58 +0530 Subject: [PATCH 334/376] lf_interop_video_streaming.py: extract test-setup-info builder - Add create_test_setup_info() method - Reduce the no of lines of code in main() function Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 75 ++++++++++++------------ 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index 94a960a85..51da04d61 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -1732,6 +1732,41 @@ def process_incremental_capacity(self, incremental_capacity_list_values, availab 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): + 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": self.media_source.upper(), + "Media Quality": self.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 main(): @@ -2164,10 +2199,9 @@ def main(): incremental_capacity_list_values = obj.get_incremental_capacity_list() 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() # Calculate and manage cx_order_list ( list of cross connections to run ) based on incremental values if obj.resource_ids: @@ -2241,42 +2275,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: From ceb2b217884382f957d4cd5a0245d37a9ef71866 Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Fri, 29 Aug 2025 15:30:37 +0530 Subject: [PATCH 335/376] lf_interop_video_streaming.py: update WebUI running.json with configured devices - Add updating_webui_running_json(): Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index 51da04d61..a32508591 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -1698,7 +1698,7 @@ def handle_ssid_based_device_config(self, config_dict): 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 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): @@ -1732,7 +1732,7 @@ def process_incremental_capacity(self, incremental_capacity_list_values, availab 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): if self.resource_ids: @@ -1767,6 +1767,24 @@ def create_test_setup_info(self): 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(): @@ -2202,6 +2220,8 @@ def main(): actual_start_time = datetime.now() iterations_before_test_stopped_by_user = [] test_setup_info = obj.create_test_setup_info() + 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: From c57515324b73e02d861ec4e5cb11c8f12128a306 Mon Sep 17 00:00:00 2001 From: Narayana-CT Date: Fri, 29 Aug 2025 15:55:13 +0530 Subject: [PATCH 336/376] lf_interop_video_streaming.py: fix media source and quality in test setup info - pass media params into create_test_setup_info Signed-off-by: Narayana-CT --- py-scripts/lf_interop_video_streaming.py | 28 +++++++++++------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/py-scripts/lf_interop_video_streaming.py b/py-scripts/lf_interop_video_streaming.py index a32508591..768a24f49 100755 --- a/py-scripts/lf_interop_video_streaming.py +++ b/py-scripts/lf_interop_video_streaming.py @@ -136,6 +136,7 @@ def __init__(self, host, ssid, passwd, encryp, media_source, media_quality, supo 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 @@ -1224,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: @@ -1672,10 +1673,9 @@ def handle_groups_profiles_config(self): eid_list.append(group_devices[j]) elif j in all_res.keys(): eid_list.append(all_res[j]) - device_list = ",".join(id for id in eid_list) + 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: @@ -1697,8 +1697,7 @@ def handle_ssid_based_device_config(self, config_dict): 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 self.device_list - + 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): @@ -1733,8 +1732,7 @@ def process_incremental_capacity(self, incremental_capacity_list_values, availab self.test_setup_info_incremental_values = "No Incremental Value provided" self.total_duration = test_setup_info_total_duration - - def create_test_setup_info(self): + def create_test_setup_info(self, media_source, media_quality): if self.resource_ids: username = [] @@ -1761,13 +1759,12 @@ def create_test_setup_info(self): "No of Devices": "Total" + "( " + str(len(username)) + " ): Android(" + str(len(username)) + ")", "Incremental Values": "", "URL": self.url, - "Media Source": self.media_source.upper(), - "Media Quality": self.media_quality + "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 = {} @@ -2021,7 +2018,7 @@ def main(): args.upstream_port = obj.change_port_to_ip(args.upstream_port) obj.upstream_port = args.upstream_port obj.validate_args() - obj.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: obj.config_obj.device_csv_file(csv_name="device.csv") @@ -2032,7 +2029,6 @@ def main(): if args.group_name and args.file_name and args.profile_name: args.device_list = obj.handle_groups_profiles_config() - args.device_list = args.device_list.split(',') elif args.config: # When group/profile are not provided @@ -2059,21 +2055,23 @@ def main(): 'pac_file': args.pac_file, 'server_ip': args.upstream_port } + obj.device_list = args.device_list args.device_list = obj.handle_ssid_based_device_config(config_dict) - # 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) 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(',') obj.resource_ids = ",".join(id.split(".")[1] for id in args.device_list) @@ -2082,7 +2080,7 @@ def main(): else: obj.android_devices = obj.devices.get_devices(only_androids=True) if args.device_list: - device_list = args.device_list + device_list = args.device_list.split(',') # Extract resource IDs (after the dot), remove duplicates, and sort them resource_ids = sorted(set(int(item.split('.')[1]) for item in device_list if '.' in item)) resource_list_sorted = resource_ids @@ -2219,7 +2217,7 @@ def main(): 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() + test_setup_info = obj.create_test_setup_info(media_source=media_source, media_quality=media_quality) if args.dowebgui: obj.updating_webui_running_json() From a14a5d916fe3c7bd4973d9c76e3530e7ac4174e1 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 1 Sep 2025 12:19:35 -0600 Subject: [PATCH 337/376] py-scripts/tools/lf_check.py flake8-bugbear compliance Verification: Automation Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_check.py | 83 +++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/py-scripts/tools/lf_check.py b/py-scripts/tools/lf_check.py index d0588f4c1..c9bc5e9ee 100755 --- a/py-scripts/tools/lf_check.py +++ b/py-scripts/tools/lf_check.py @@ -1482,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) @@ -1600,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. @@ -1891,7 +1891,8 @@ def run_script_test(self): 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)): @@ -1951,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() @@ -1971,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 @@ -1991,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() @@ -2012,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() @@ -2247,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 @@ -2426,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() @@ -2932,10 +2939,13 @@ def main(): try: new_allure_latest_dir = shutil.copytree(report.allure_report_dir, allure_latest_dir, dirs_exist_ok=True) - except BaseException: - # fedora 27 does no except the directory being present + 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) + logger.debug("allure report directory copied to {latest}".format(latest=new_allure_latest_dir)) # copy the allure-report-latest into the epoch time stamp @@ -2945,7 +2955,10 @@ def main(): try: new_allure_epoch_latest_dir = shutil.copytree(report.allure_report_dir, new_allure_epoch_dir, dirs_exist_ok=True) - except BaseException: + 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) From 9d1232a147579cf9318b8ff6bb7edc0735d8acc0 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 1 Sep 2025 13:25:14 -0600 Subject: [PATCH 338/376] py-scripts/tools/lf_inspect.py flake8-bugbear Verified: Automation Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_inspect.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/py-scripts/tools/lf_inspect.py b/py-scripts/tools/lf_inspect.py index 4378e3732..d8593eefe 100755 --- a/py-scripts/tools/lf_inspect.py +++ b/py-scripts/tools/lf_inspect.py @@ -37,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='', @@ -59,6 +59,15 @@ 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/', '') From 3f07e0c32ca6ee15c1ef6b0fcff2b1cb2cd56ca1 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 1 Sep 2025 13:40:01 -0600 Subject: [PATCH 339/376] py-scripts/tools/lf_cli_to_launchjson.py flake8-bugbear Verified: ./lf_cli_to_launchjson.py\ --cli "./create_l3.py --mgr 192.168.100.116 --endp_a 1.1.wlan30 --endp_b 1.1.wlan50 --min_rate_a 1000000 --min_rate_b 1000000 " Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_cli_to_launchjson.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/py-scripts/tools/lf_cli_to_launchjson.py b/py-scripts/tools/lf_cli_to_launchjson.py index 6e1507046..ed1dd878f 100755 --- a/py-scripts/tools/lf_cli_to_launchjson.py +++ b/py-scripts/tools/lf_cli_to_launchjson.py @@ -48,12 +48,22 @@ 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"], # noqa: E501 - list=[], - length_of_cli=[] + cli_list=None, + list=None, + length_of_cli=None ): + 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 From 5d5670e9e67aa127ba16151f46fb4422e6ee111d Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 08:07:48 -0700 Subject: [PATCH 340/376] ssh_remote.py: Update header Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 47 +++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index b31bbe135..a1610f743 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -1,21 +1,34 @@ #!/usr/bin/python3 - -################################################################################## -# 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. -################################################################################## +""" +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 paramiko # from paramiko import SSHClient From 57ffa6fa504f1e9d72b6cc64320bc45f0417886e Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 08:14:13 -0700 Subject: [PATCH 341/376] ssh_remote.py: Move arg parsing to helper Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index a1610f743..befe5efbe 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -82,13 +82,7 @@ def get_info(cmd): return -def main(): - global ip - global prog - global username - global password - global remote_args - +def parse_args(): parser = argparse.ArgumentParser( prog='ssh_remote.py', formatter_class=argparse.RawTextHelpFormatter, @@ -130,7 +124,16 @@ def main(): action="store_true", help='Show summary of what this script does') - args = parser.parse_args() + return parser.parse_args() + + +def main(): + global ip + global prog + global username + global password + + args = parse_args() help_summary = '''\ This script is an example do_ap script on remote system. From 211dc916b9871205de14bd6da6da3d9d80f0fc88 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 08:17:59 -0700 Subject: [PATCH 342/376] ssh_remote.py: Move help summary definition to top of file Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index befe5efbe..cdea249fd 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -36,6 +36,9 @@ import argparse # import logging +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 @@ -134,12 +137,8 @@ def main(): global password args = parse_args() - - help_summary = '''\ -This script is an example do_ap script on remote system. -''' if args.help_summary: - print(help_summary) + print(HELP_SUMMARY) exit(0) ip = args.ip From 5b35b5d53157e4a07043e7b2d440c557f8719cdf Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 08:22:04 -0700 Subject: [PATCH 343/376] ssh_remote.py: Fix shebang Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index cdea249fd..46e6e40de 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 """ NAME: ssh_remote.py From 88819b83496fc358e7db0dada80beee5272b7596 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 08:31:47 -0700 Subject: [PATCH 344/376] ssh_remote.py: Add SSH port and timeout options Additionally, cleanup 'get_info()' function execution, removing the unneeded global variables, one of which caused a linting error in flake8-bugbear checks. Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index 46e6e40de..c2dc7fff7 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -31,7 +31,6 @@ """ import paramiko -# from paramiko import SSHClient import socket import argparse # import logging @@ -39,13 +38,7 @@ 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" @@ -55,7 +48,7 @@ remote_args = "" -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() @@ -112,6 +105,11 @@ def parse_args(): help='IP address of remote system', default=ip) + parser.add_argument('--port', '--ssh_port', + dest='ssh_port', + help='SSH port for remote system', + default=ssh_port) + parser.add_argument( '--username', help='User-name for remote machine', @@ -122,6 +120,10 @@ def parse_args(): 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", @@ -131,28 +133,20 @@ def parse_args(): def main(): - global ip - global prog - global username - global password - args = parse_args() if args.help_summary: print(HELP_SUMMARY) exit(0) - ip = args.ip - username = args.username - password = args.password - prog = args.prog - cmd = args.prog ra = args.remote_args.split() for a in ra: 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__': From 650a2db008bf5ad0392ec7f5ed798436cbca89a3 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 08:36:54 -0700 Subject: [PATCH 345/376] ssh_remote.py: Clean up arg parsing init Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 76 +++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 44 deletions(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index c2dc7fff7..658816eee 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -80,54 +80,42 @@ def get_info(cmd: str, ip: str, ssh_port: int, username: str, password: str, tim def parse_args(): parser = argparse.ArgumentParser( - prog='ssh_remote.py', + prog="ssh_remote.py", formatter_class=argparse.RawTextHelpFormatter, - epilog='''\ - Run command against remote machine over ssh - ''', - - description=''' - Run command against remote 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('--port', '--ssh_port', - dest='ssh_port', - help='SSH port for 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( - '--username', - help='User-name for remote machine', - default=username) - - parser.add_argument( - '--password', - help='Password for remote machine', - default=password) - - parser.add_argument('--timeout', - help='SSH timeout for connection failures', + 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("--help_summary", + action="store_true", + help="Show summary of what this script does") return parser.parse_args() From caa390a59d423cd397c48b7a5c042da50a9f1b75 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 09:20:14 -0700 Subject: [PATCH 346/376] ssh_remote.py: Rework logging to permit dynamic debug usage Since the output of this script is parsed by automation, ensure that non-debug output does not break automation Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 66 +++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index 658816eee..23c2588a8 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -29,11 +29,10 @@ --password egrofnal \ --prog ls """ - +import argparse +import logging import paramiko import socket -import argparse -# import logging HELP_SUMMARY = "Runs a command on a remote system over SSH. Useful for DUT automation " \ "in LANforge Chamber View tests" @@ -47,33 +46,39 @@ timeout = 5 remote_args = "" +# Grab logger for this module for easy usage +logger = logging.getLogger(__name__) + 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) + # Print output from command (both in debug and non-debug mode. This is grabbed by automation) output = str(stdout.read(), 'utf-8') - - # print("Output:\n") - print(output) + logger.debug("Command output:\n") + logger.info(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 @@ -116,16 +121,47 @@ def parse_args(): 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) exit(0) + configure_logging(args.debug) + cmd = args.prog ra = args.remote_args.split() for a in ra: From 39022d02ae0c6a345b9778a6423bac5f8f8198b3 Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 10:19:14 -0700 Subject: [PATCH 347/376] ssh_remote.py: Fix timeout for large command outputs Verified: ./ssh_remote.py \ --ip 192.168.1.101 \ --remote_args r2g post_test ./ssh_remote.py \ --ip 192.168.1.101 \ --prog ls Signed-off-by: Alex Gavin --- py-scripts/ssh_remote.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/ssh_remote.py b/py-scripts/ssh_remote.py index 23c2588a8..b81c6514e 100755 --- a/py-scripts/ssh_remote.py +++ b/py-scripts/ssh_remote.py @@ -66,7 +66,7 @@ def get_info(cmd: str, ip: str, ssh_port: int, username: str, password: str, tim # 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") - logger.info(output) + print(output) # Using 'logger.info()' here will result in timeout for large command output except paramiko.ssh_exception.AuthenticationException as e: logger.error(e) From 11504e78221f12cf45b6241fd4c3988070bb8ea1 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Thu, 4 Sep 2025 11:16:21 -0700 Subject: [PATCH 348/376] Moves scenario.py up to py-scripts --- py-scripts/{sandbox => }/scenario.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename py-scripts/{sandbox => }/scenario.py (100%) diff --git a/py-scripts/sandbox/scenario.py b/py-scripts/scenario.py similarity index 100% rename from py-scripts/sandbox/scenario.py rename to py-scripts/scenario.py From 163995f08a0f95275389ec2ff19f01029b5d1237 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Thu, 4 Sep 2025 11:52:44 -0700 Subject: [PATCH 349/376] lfcli_base.py: fixes broken regex --- py-json/LANforge/lfcli_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 5c89bd7f8e238612bfc33a41798c73222e4d6338 Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Mon, 8 Sep 2025 15:22:25 -0700 Subject: [PATCH 350/376] Scenario.py: no longer times out when running an operation without --load. Check_if_complete now only runs when a scenario has been loaded to prevent timing out. The --timeout argument now correctly reads input as an int. Verification: ./scenario.py --start TG ./scenario.py --load FACTORY_DLFT --timeout 30 Signed-off-by: Liam Reynolds --- py-scripts/scenario.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/scenario.py b/py-scripts/scenario.py index 55956d90b..b53965466 100755 --- a/py-scripts/scenario.py +++ b/py-scripts/scenario.py @@ -159,7 +159,7 @@ 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() @@ -201,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() From dbc2440fde97eca8ffa00ded330b86c8058678d8 Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Mon, 8 Sep 2025 15:28:23 -0700 Subject: [PATCH 351/376] LAN-4178: test_fileio.py can save test scenarios without running them Using the --save_config argument alongside --use_test_groups will cause the script to finish after the build step, before starting. This will result in a read-only and/or a write-only CX group which can be run using scenario.py at a later time. Verification: ./test_fileio.py --use_macvlans --macvlan_parent eth1 --num_ports 2 --first_mvlan_ip 192.168.0.34 --netmask 255.255.255.0 --gateway 192.168.0.105 --use_test_groups --write_only_test_group WOTG --read_only_test_group ROTG --save_config Signed-off-by: Liam Reynolds --- py-scripts/test_fileio.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/py-scripts/test_fileio.py b/py-scripts/test_fileio.py index ce7b45526..153ae6502 100755 --- a/py-scripts/test_fileio.py +++ b/py-scripts/test_fileio.py @@ -24,6 +24,17 @@ ./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 @@ -623,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", @@ -806,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", From 87a337bea352161035063a3080706caf3b832713 Mon Sep 17 00:00:00 2001 From: Liam Reynolds Date: Mon, 8 Sep 2025 15:39:17 -0700 Subject: [PATCH 352/376] test_fileio.py: flake8 compliance --- py-scripts/test_fileio.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/py-scripts/test_fileio.py b/py-scripts/test_fileio.py index 153ae6502..6bbf3e70d 100755 --- a/py-scripts/test_fileio.py +++ b/py-scripts/test_fileio.py @@ -26,14 +26,14 @@ 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 + --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 + --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 @@ -635,7 +635,7 @@ def main(): 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') + default=False, action='store_true') # kpi_csv arguments parser.add_argument( "--test_rig", @@ -829,7 +829,7 @@ def main(): 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", From 95cd595fb367d525cf7ecbc56563239fd3dc1e80 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Mon, 8 Sep 2025 16:14:36 -0700 Subject: [PATCH 353/376] adds -u option to remove backed up DB archives Chuck was encountering a hundreds of backup files because QA automation does do_upgrade every day. Signed-off-by: Jed Reynolds --- check_large_files.bash | 52 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/check_large_files.bash b/check_large_files.bash index 0c3800aba..6a96ce8c5 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" ) @@ -628,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 @@ -1133,6 +1159,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 # ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- # @@ -1266,6 +1311,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 @@ -1315,6 +1361,10 @@ while [[ $choice != q ]]; do clean_var_tmp refresh=1 ;; + u ) + clean_db_files + refresh=1 + ;; z ) clean_compressed_files refresh=1 From 8770db6c447940c76ad49c789f4859cd982c1831 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 2 Sep 2025 10:19:14 -0600 Subject: [PATCH 354/376] py-scripts/tools/lf_test_gen/lf_test_gen.py bugbear compliance Verified: ./lf_test_gen.py (then connected to 192.168.100.116) Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_test_gen/lf_test_gen.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 7690f465b..768fcfde3 100755 --- a/py-scripts/tools/lf_test_gen/lf_test_gen.py +++ b/py-scripts/tools/lf_test_gen/lf_test_gen.py @@ -8,10 +8,14 @@ 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) From 780ee74961d1975052eb7c12ee51f589d2a86953 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 9 Sep 2025 10:16:05 -0600 Subject: [PATCH 355/376] py-scripts/tools/lf_check.py moved the suite towards the frount of the title on the email. Verified: Automation Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_check.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/tools/lf_check.py b/py-scripts/tools/lf_check.py index c9bc5e9ee..cdf2a7008 100755 --- a/py-scripts/tools/lf_check.py +++ b/py-scripts/tools/lf_check.py @@ -693,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( # noqa: E501 + 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, @@ -710,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( # noqa: E501 + 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, From ac60cdc39180322904174749b8f4eae6dc93a5b4 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Tue, 9 Sep 2025 14:42:23 -0700 Subject: [PATCH 356/376] check_large_files.bash: corrects scanning for kernels on AT7 There are no kernel files on AT7, so check the array size before running du -hc. Corrects spelling. --- check_large_files.bash | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/check_large_files.bash b/check_large_files.bash index 6a96ce8c5..e1a0cf789 100755 --- a/check_large_files.bash +++ b/check_large_files.bash @@ -743,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" @@ -779,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" From 2f4a706f45e07bebc177bc97376f6814510294f9 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Tue, 9 Sep 2025 14:44:01 -0700 Subject: [PATCH 357/376] check_large_files.bash: adds vnc logs to survey Some vnc logs can fill with errors very rapidly. Adds .vnc/*:1.log files. --- check_large_files.bash | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/check_large_files.bash b/check_large_files.bash index e1a0cf789..c93c28a33 100755 --- a/check_large_files.bash +++ b/check_large_files.bash @@ -1084,11 +1084,11 @@ 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 @@ -1112,6 +1112,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[@]}" From 5e40d944e375e9716dace324a102d18c9c0743bd Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Tue, 9 Sep 2025 14:44:54 -0700 Subject: [PATCH 358/376] check_large_files.bash: fixes incorrect apache log directory reference On Debian systems (eg AT7), the Apache log directory is /var/log/apache2, not /var/log/httpd. --- check_large_files.bash | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/check_large_files.bash b/check_large_files.bash index c93c28a33..6f44f1284 100755 --- a/check_large_files.bash +++ b/check_large_files.bash @@ -1092,6 +1092,11 @@ survey_lflogs() { 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' \ From 3e202762ff7cd328f94ce8eb3854bde4df464f2a Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Tue, 9 Sep 2025 16:24:11 -0700 Subject: [PATCH 359/376] lanforge_api.py: adds multiple LANforge CLI features * class AddAdbFlags * additional parameters for post_add_adb() * adds support for climate control enabled chambers in post_add_chamber() * class AddMldLinkFlags * post_add_mld_link() adds support for MLD * adds OWE support for AddProfileProfileFlags * adds mld_sub_vap support to AddVapFlags * adds pmkid support for post_set_wifi_corruptions * adds post_show_mld_link() --- lanforge_client/lanforge_api.py | 508 ++++++++++++++++++++++++-------- 1 file changed, 380 insertions(+), 128 deletions(-) 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, From ef9a6e623ba6ad878222ac1632731c218927e1dd Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 10 Sep 2025 11:34:23 -0600 Subject: [PATCH 360/376] py-scripts/tools/lf_update.py : initial commit Note: this script uses scrapli which is not part of LANforge Scripts dependencies. Help Summary: This script will perform an update on lanforge of: GUI version, Kernel version, then reboot, run check_large_files.bash Verified: ./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 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 780 ++++++++++++++++++++++++++++++++++ 1 file changed, 780 insertions(+) create mode 100755 py-scripts/tools/lf_update.py diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py new file mode 100755 index 000000000..abc03dab5 --- /dev/null +++ b/py-scripts/tools/lf_update.py @@ -0,0 +1,780 @@ +#!/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"] + + 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_ls(self): + command = "ls" + r = self.send_lf_command(command) + if r.failed: + raise Exception(r.result) + print(f"command: {command}: {r.result}") + + def cmd_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; ./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): + + self.cmd_pwd() + + self.cmd_ls() + + self.cmd_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[\\#\\$\\>]", + # "on_open": jump_function, # on logging into LANforge will run the jump_function + # "auth_password_pattern": "Password:", + "timeout_ops": 840, + "timeout_transport": 840, + "timeout_socket": 840, + "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[\\#\\$\\>]", + # "on_open": jump_function, # on logging into LANforge will run the jump_function + # "auth_password_pattern": "Password:", + "timeout_ops": 840, + "timeout_transport": 840, + "timeout_socket": 840, + "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 '+'") + + +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( + '--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+\ + --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+" + "--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() From 8c74e03f42db2fe9e44e26d4bad51f53dfc17206 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 10 Sep 2025 13:17:47 -0600 Subject: [PATCH 361/376] py-scripts/tools/lf_update.py : initial commit Note: this script uses scrapli which is not part of LANforge Scripts dependencies. Help Summary: This script will perform an update on lanforge of: GUI version, Kernel version, then reboot, run check_large_files.bash Verified: ./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 Signed-off-by: Chuck SmileyRekiere Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py index abc03dab5..df6924d10 100755 --- a/py-scripts/tools/lf_update.py +++ b/py-scripts/tools/lf_update.py @@ -353,7 +353,7 @@ def lf_kinstall(self): # 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; ./lf_kinstall.pl --lfver {self.lfver} --kver {self.kver} --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) From 178bd78a06d740c2fb0cef8cec5701dd0bb992b0 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Wed, 10 Sep 2025 16:52:05 -0600 Subject: [PATCH 362/376] py-scripts/tools/lf_update.py minor update to naming of methods Verified: ./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 Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py index df6924d10..dbddf62b3 100755 --- a/py-scripts/tools/lf_update.py +++ b/py-scripts/tools/lf_update.py @@ -329,7 +329,7 @@ def cmd_ls(self): raise Exception(r.result) print(f"command: {command}: {r.result}") - def cmd_killall_lfclient(self): + def killall_lfclient(self): command = "killall lfclient.bash" r = self.send_lf_command(command) if r.failed: @@ -375,7 +375,7 @@ def update_lanforge(self): self.cmd_ls() - self.cmd_killall_lfclient() + self.killall_lfclient() self.killall_java() @@ -423,9 +423,9 @@ def get_mgmt_user(self) -> "Generator[GenericDriver]": # noqa: "comms_prompt_pattern": "^\\S[a-z]*\\@[a-zA-Z0-9]+[-][a-zA-Z0-9]+[\\s\\S]\\S\\S[\\#\\$\\>]", # "on_open": jump_function, # on logging into LANforge will run the jump_function # "auth_password_pattern": "Password:", - "timeout_ops": 840, - "timeout_transport": 840, - "timeout_socket": 840, + "timeout_ops": 10, + "timeout_transport": 10, + "timeout_socket": 10, "ssh_config_file": True, } From 4f563f51136782aa286be40f76e800c79ed1c10f Mon Sep 17 00:00:00 2001 From: Alex Gavin Date: Thu, 4 Sep 2025 10:30:46 -0700 Subject: [PATCH 363/376] Make Python shebangs more generic Signed-off-by: Alex Gavin --- ap_ctl.py | 2 +- archive/rssi_validation/src/parser2.py | 2 +- lf_sniff.py | 2 +- lf_tos_plus_test.py | 2 +- lf_tos_test.py | 2 +- lf_tx_power.py | 2 +- lf_tx_power_tool.py | 2 +- mux_client.py | 2 +- openwrt_ctl.py | 2 +- py-json/create_wanlink.py | 2 +- py-json/ws-sta-monitor.py | 2 +- py-scripts/sandbox/cmr_ap_asus_mod.py | 2 +- py-scripts/sandbox/lf_check_ap.py | 2 +- py-scripts/sandbox/lf_check_igg.py | 2 +- py-scripts/sandbox/lf_json_autogen_test.py | 2 +- py-scripts/sandbox/logger_example.py | 2 +- py-scripts/sandbox/logger_example_1.py | 2 +- py-scripts/scripts_deprecated/event_break_flood.py | 2 +- py-scripts/scripts_deprecated/lf_mail.py | 2 +- py-scripts/scripts_deprecated/tip-cicd-sanity/Nightly_Sanity.py | 2 +- py-scripts/scripts_deprecated/tip-cicd-sanity/cloudsdk.py | 2 +- py-scripts/scripts_deprecated/tip-cicd-sanity/lab_ap_info.py | 2 +- py-scripts/tools/lf_check.py | 2 +- py-scripts/tools/lf_test_gen/lf_test_gen.py | 2 +- tos_plus_auto.py | 2 +- wifi_ctl_9800_3504.py | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) 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/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 e14fc9acf..a144ed4b9 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 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/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/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/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/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/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/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/tools/lf_check.py b/py-scripts/tools/lf_check.py index cdf2a7008..d89c30461 100755 --- a/py-scripts/tools/lf_check.py +++ b/py-scripts/tools/lf_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ''' NAME: lf_check.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 768fcfde3..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,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 import tkinter from tkinter import messagebox 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 From 39e6051436b6aeff292d1425a09032c060368912 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 13 Sep 2025 11:23:20 -0600 Subject: [PATCH 364/376] cc_module_uci.py updated to use the parameters passed in Verified: with lf_tx_power.py "args":[ "--scheme","ssh", "--dest", "192.168.215.198", "--port", "22", "--user", "root", "--passwd", "hfcl!@ion", "--prompt", "root@HFCL:~#", "--series", "NA", "--band", "5g", "--module", "cc_module_uci", "--module_scrapli", "--timeout", "3", "--ap", "HFCL", "--ap_band_slot_5g", "NA", "--wlan", "NA", "--wlan_id", "NA", "--wlan_ssid", "ion_5g", "--tag_policy", "NA", "--policy_profile", "NA", "--pathloss", "59", "--antenna_gain", "6", "--lfmgr", "192.168.212.55", "--upstream_port", "eth1", "--lfresource", "1", "--radio", "wiphy0", "--station", "sta0000", "--ssid", "ion_5g", "--ssidpw", "12345678", "--security", "wpa2", "--bssid", "DEFAULT", "--no_cleanup_station", "--channel", "40", "--bandwidth", "160", "--vht160", "--nss", "2", "--txpower", "4.25", "--duration", "25", "--outfile", "test001", "--no_cleanup", "--test_rig", "HFCl", "--series", "HFCL", "--html_report", "--pf_dbm", "8" ] Signed-off-by: Chuck SmileyRekiere --- cc_module_uci.py | 50 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/cc_module_uci.py b/cc_module_uci.py index be404982f..ff1efee8b 100644 --- a/cc_module_uci.py +++ b/cc_module_uci.py @@ -12,6 +12,7 @@ import scrapli from scrapli.driver import GenericDriver, Driver + # from scrapli.response import Response # from typing import Generator, Optional, Union @@ -22,7 +23,7 @@ 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' + 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) @@ -75,9 +76,34 @@ def __init__(self, ap_dual_band_slot_6g=2, port=22, timeout=3, - pwd=None + 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 @@ -377,22 +403,25 @@ def get_mgmt(self) -> "Generator[GenericDriver]": # 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.213', # noqa: - "auth_username":'root', # noqa: - "auth_password":'hfcl!@ion', # noqa: + # "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 + "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.214.93', - "auth_username": 'lanforge', - "auth_password": 'lanforge', + # "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 @@ -406,8 +435,7 @@ def get_mgmt(self) -> "Generator[GenericDriver]": # noqa: self.conn.open() except scrapli.exceptions.ScrapliAuthenticationFailed as e: raise Exception( - f"Failed to open connection to {self.dest} ({e.message})" - ) from e + f"Failed to open connection to {self.dest} ({e})") yield self.conn def send_ap_command(self, command: "str"): From 1290a0a05a6b2508363c98c9190fa2d7c8a5f84e Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 13 Sep 2025 11:25:47 -0600 Subject: [PATCH 365/376] lf_tx_power.py - updated for --module_scrapli which needed additional parameters Verified: "args":[ "--scheme","ssh", "--dest", "192.168.215.198", "--port", "22", "--user", "root", "--passwd", "hfcl!@ion", "--prompt", "root@HFCL:~#", "--series", "NA", "--band", "5g", "--module", "cc_module_uci", "--module_scrapli", "--timeout", "3", "--ap", "HFCL", "--ap_band_slot_5g", "NA", "--wlan", "NA", "--wlan_id", "NA", "--wlan_ssid", "ion_5g", "--tag_policy", "NA", "--policy_profile", "NA", "--pathloss", "59", "--antenna_gain", "6", "--lfmgr", "192.168.212.55", "--upstream_port", "eth1", "--lfresource", "1", "--radio", "wiphy0", "--station", "sta0000", "--ssid", "ion_5g", "--ssidpw", "12345678", "--security", "wpa2", "--bssid", "DEFAULT", "--no_cleanup_station", "--channel", "40", "--bandwidth", "160", "--vht160", "--nss", "2", "--txpower", "4.25", "--duration", "25", "--outfile", "test001", "--no_cleanup", "--test_rig", "HFCl", "--series", "HFCL", "--html_report", "--pf_dbm", "8" ] Signed-off-by: Chuck SmileyRekiere --- lf_tx_power.py | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/lf_tx_power.py b/lf_tx_power.py index a144ed4b9..e7fd5a7e8 100755 --- a/lf_tx_power.py +++ b/lf_tx_power.py @@ -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 From 89642930dd5806cdc6463e7a626deb366e084dac Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Sat, 13 Sep 2025 11:52:55 -0600 Subject: [PATCH 366/376] cc_module_uci.py Updated flake8 issue, modified quotes Signed-off-by: Chuck SmileyRekiere --- cc_module_uci.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cc_module_uci.py b/cc_module_uci.py index ff1efee8b..4a25b4210 100644 --- a/cc_module_uci.py +++ b/cc_module_uci.py @@ -22,8 +22,9 @@ 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']}' + 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) From 57ab835c5a520f584da8b01ac82499d38784206a Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 15 Sep 2025 08:56:05 -0600 Subject: [PATCH 367/376] py-scripts/tools/lf_update.py updated to use pramiko to do the LANforge reset as proved to be reliable Verified: // ./lf_update.py "args":[ "--mgr", "192.168.50.104", "--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+" ] Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py index dbddf62b3..1dfa7346a 100755 --- a/py-scripts/tools/lf_update.py +++ b/py-scripts/tools/lf_update.py @@ -322,6 +322,14 @@ def cmd_pwd(self): 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) @@ -381,9 +389,9 @@ def update_lanforge(self): self.lf_kinstall() - self.reboot_lanforge() + # self.reboot_lanforge() - # self.reboot_lf_with_paramiko() # leave in if paramiko needs to be in reboot + 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() @@ -727,7 +735,7 @@ def help_commands(args): "--mgr_ssh_port", "22", "--log_level","info", "--lfver","5.5.1", - "--kver","6.15.6+" + "--kver","6.15.6+", "--log_level","info" ] ''' From 7edd2374fccea7ac9cde79fa93d19435492ea266 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 15 Sep 2025 21:33:01 -0600 Subject: [PATCH 368/376] cc_module_uci.py added cac timer Verified: vscode "args":[ "--scheme","ssh", "--dest", "192.168.215.167", "--port", "22", "--user", "root", "--passwd", "hfcl!@ion", "--prompt", "root@HFCL:~#", "--series", "NA", "--band", "5g", "--module", "cc_module_uci", "--module_scrapli", "--timeout", "3", "--ap", "HFCL", "--ap_band_slot_5g", "NA", "--wlan", "NA", "--wlan_id", "NA", "--wlan_ssid", "ion_5g", //"--wlan_ssid", "hfcl_5g", "--tag_policy", "NA", "--policy_profile", "NA", "--pathloss", "59", "--antenna_gain", "6", "--lfmgr", "192.168.212.55", "--upstream_port", "eth1", "--lfresource", "1", "--radio", "wiphy0", "--station", "sta0000", "--ssid", "ion_5g", //"--ssid", "hfcl_5g", "--ssidpw", "12345678", "--security", "wpa2", "--bssid", "DEFAULT", "--no_cleanup_station", "--channel", "100", "--bandwidth", "160", "--vht160", "--nss", "2", "--txpower", "4.25", "--duration", "25", "--outfile", "test001", "--no_cleanup", "--test_rig", "HFCl", "--series", "HFCL", "--html_report", "--pf_dbm", "8" ] Signed-off-by: Chuck SmileyRekiere --- cc_module_uci.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/cc_module_uci.py b/cc_module_uci.py index 4a25b4210..f71c871bc 100644 --- a/cc_module_uci.py +++ b/cc_module_uci.py @@ -9,6 +9,7 @@ # from time import sleep from contextlib import contextmanager import json +import time import scrapli from scrapli.driver import GenericDriver, Driver @@ -43,11 +44,10 @@ def jump_through_vrf(conn: Driver): return jump_through_vrf -def is_cac_done(channel, list): - good_things = ['{"state": "cac_completed"}', '{"state":"allowed"}'] - for status in list: - if status[0] == channel and status[1] in good_things: - return True +def is_cac_done(result): + good_things = "get_cac_state:0" + if good_things in result: + return True else: return False @@ -349,13 +349,13 @@ def _config_dot11_channel(self, radio: str, ap: str): print(f"Channel set {r.result}") # need to wait for cac to be done - # for _ in range(120): - # r = self._show_ap_dot11_summary() - # if is_cac_done(self.channel, r["channels"][1]) == True: - # return - # sleep(1) - # else: - # raise Exception("CAC is not okay") + 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) @@ -384,6 +384,16 @@ def _show_ap_dot11_summary(self) -> "dict[str]": 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() From 625e534749dac845c8e1771aee9dc49c4b4407fe Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Mon, 15 Sep 2025 21:53:16 -0600 Subject: [PATCH 369/376] py-scripts/tools/lf_update.py updated to pass in the timeouts and suggested timeouts based on the lANforge type Verified: // ./lf_update.py 523c "args":[ "--mgr", "192.168.50.104", "--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" ] Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 52 +++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py index 1dfa7346a..a7248e509 100755 --- a/py-scripts/tools/lf_update.py +++ b/py-scripts/tools/lf_update.py @@ -130,6 +130,12 @@ def __init__(self, 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 @@ -431,9 +437,9 @@ def get_mgmt_user(self) -> "Generator[GenericDriver]": # noqa: "comms_prompt_pattern": "^\\S[a-z]*\\@[a-zA-Z0-9]+[-][a-zA-Z0-9]+[\\s\\S]\\S\\S[\\#\\$\\>]", # "on_open": jump_function, # on logging into LANforge will run the jump_function # "auth_password_pattern": "Password:", - "timeout_ops": 10, - "timeout_transport": 10, - "timeout_socket": 10, + "timeout_ops": int(self.user_timeout), + "timeout_transport": int(self.user_timeout), + "timeout_socket": int(self.user_timeout), "ssh_config_file": True, } @@ -476,9 +482,9 @@ def get_mgmt(self) -> "Generator[GenericDriver]": # noqa: "comms_prompt_pattern": "^\\S[a-z]*\\@[a-zA-Z0-9]+[-][a-zA-Z0-9]+[\\s\\S]\\S\\S[\\#\\$\\>]", # "on_open": jump_function, # on logging into LANforge will run the jump_function # "auth_password_pattern": "Password:", - "timeout_ops": 840, - "timeout_transport": 840, - "timeout_socket": 840, + "timeout_ops": int(self.root_timeout), + "timeout_transport": int(self.root_timeout), + "timeout_socket": int(self.root_timeout), "ssh_config_file": True, } @@ -559,6 +565,14 @@ def validate_args(args): 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( @@ -671,6 +685,28 @@ def parse_args(): 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') @@ -717,6 +753,8 @@ def help_commands(args): --mgr_ssh_port 22\ --lfver 5.5.1\ --kver 6.15.6+\ + --user_timeout 10\ + --root_timeout 300\ --log_level info ''' @@ -736,6 +774,8 @@ def help_commands(args): "--log_level","info", "--lfver","5.5.1", "--kver","6.15.6+", + "--user_timeout","10", + "--root_timeout","300", "--log_level","info" ] ''' From f7865663545c0008ce8bea10950d609ffb94cf06 Mon Sep 17 00:00:00 2001 From: Nikhita Date: Mon, 15 Sep 2025 17:28:11 +0530 Subject: [PATCH 370/376] lf_ftp.py: Added get_layer4_data() to fetch Layer 4 stats - Implemented get_layer4_data() to fetch uc-avg, uc-min, uc-max, total URLs, rx rate, bytes read, and error counts for all CXs VERIFIED CLI: python3 lf_ftp.py --file_sizes 10MB --mgr 192.168.242.2 --traffic_duration 1m --directions Download --clients_type Real --ap_name Netgear --bands 2.4G --upstream_port eth1 Signed-off-by: Nikhita --- py-scripts/lf_ftp.py | 188 ++++++++++++++++++++----------------------- 1 file changed, 87 insertions(+), 101 deletions(-) diff --git a/py-scripts/lf_ftp.py b/py-scripts/lf_ftp.py index 3d8a93bc3..191b2ad1d 100755 --- a/py-scripts/lf_ftp.py +++ b/py-scripts/lf_ftp.py @@ -117,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") @@ -232,6 +233,8 @@ 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 = [] @@ -987,8 +990,14 @@ def monitor_for_runtime_csv(self): 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 @@ -1040,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': @@ -1074,7 +1090,60 @@ def monitor_for_runtime_csv(self): 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 = [] @@ -1084,103 +1153,19 @@ def get_device_details(self): 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)") - total_err = self.json_get("layer4/list?fields=total-err") - 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)']) - self.total_err.append(total_err['endpoint']['total-err']) - # 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 - for cx in total_err['endpoint']: - if created_cx in cx: - self.total_err.append(cx[created_cx]['total-err']) - break - self.bytes_rd = [float(f"{(i / 1000000): .4f}") for i in dataset] - - # calculating the number of successfully downloaded url's by subtracting the number of failed url's - 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) - - # 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): """ @@ -1903,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, From c4e171e0513ff803e655d5f26635ec898a08701b Mon Sep 17 00:00:00 2001 From: Nikhita Date: Mon, 15 Sep 2025 20:19:51 +0530 Subject: [PATCH 371/376] lf_webpage.py: Added get_layer4_data() to fetch Layer 4 stats - Implemented get_layer4_data() to fetch uc-avg, uc-min, uc-max, total URLs, rx rate, bytes read, and error counts for all CXs VERIFIED CLI: python3 lf_webpage.py --ap_name Cisco --mgr 192.168.242.2 --upstream_port eth2 --duration 1m --bands 5G --client_type Real --file_size 2MB Signed-off-by: Nikhita --- py-scripts/lf_webpage.py | 125 +++++++++++++++++++++++++++++++++++---- 1 file changed, 113 insertions(+), 12 deletions(-) diff --git a/py-scripts/lf_webpage.py b/py-scripts/lf_webpage.py index fbbf0bfe3..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 @@ -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 @@ -632,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() @@ -663,13 +718,14 @@ 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') - total_err = self.my_monitor('total-err') + 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]) @@ -682,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)): @@ -731,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': @@ -753,7 +820,7 @@ 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) @@ -2192,6 +2259,38 @@ 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 = [] @@ -2272,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: From 5d2783977ddf032268e19a2b88c271b3478ab122 Mon Sep 17 00:00:00 2001 From: Renusree-ct Date: Mon, 15 Sep 2025 17:10:47 +0530 Subject: [PATCH 372/376] lf_interop_throughput.py : Updated incremental capacity and add RTT in report - Modified incremental_capacity list based on MAC ID configured devices - Included RTT metrics in the generated report VERIFIED CLI : python3 lf_interop_throughput.py --mgr 192.168.242.2 --mgr_port 8080 --upstream_port eth2 --test_duration 1m --download 1000000 --traffic_type lf_udp --ssid OpenWifi_psk2 --passwd OpenWifi --security wpa2 --config --device_list 1.113,1.115,1.21,1.17,1.14 --incremental_capacity 1,3,5 Signed-off-by: Renusree-ct --- py-scripts/lf_interop_throughput.py | 39 ++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/py-scripts/lf_interop_throughput.py b/py-scripts/lf_interop_throughput.py index 79c419e09..6b06bac6b 100755 --- a/py-scripts/lf_interop_throughput.py +++ b/py-scripts/lf_interop_throughput.py @@ -509,7 +509,7 @@ 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) + 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=self.config_dict)) @@ -579,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: @@ -686,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 = { @@ -694,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, @@ -704,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 @@ -1194,8 +1205,8 @@ def monitor(self, iteration, individual_df, device_names, incremental_capacity_l if not is_device_configured and self.interopability_config: break - individual_df = individual_df[1:-1] - individual_df_for_webui = individual_df_for_webui[1:-1] + # 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], avg_rtt[i] = [], [], [], [], [] @@ -2389,7 +2400,7 @@ def generate_report(self, iterations_before_test_stopped_by_user, incremental_ca 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. @@ -2417,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: @@ -2434,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: @@ -2460,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]) @@ -2488,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": @@ -2523,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 From 8498d81eff048a47a34ed8b6ebcd1806189dfeea Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 18 Sep 2025 19:01:17 -0600 Subject: [PATCH 373/376] py-scripts/tools/lf_update.py added sefl.check_system_up at the beginning of the update Verification: // ./lf_update.py 523c "args":[ "--mgr", "192.168.50.104", // "--mgr", "192.168.101.137", "--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" ] Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py index a7248e509..97964b511 100755 --- a/py-scripts/tools/lf_update.py +++ b/py-scripts/tools/lf_update.py @@ -282,7 +282,6 @@ def remove_DB_gz(self): 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: @@ -385,6 +384,9 @@ def reboot_lanforge(self): def update_lanforge(self): + # this should reconnect + self.check_system_up() + self.cmd_pwd() self.cmd_ls() From 5a646443adca7b40c34a727d09ac568e20d212b4 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 18 Sep 2025 19:15:20 -0600 Subject: [PATCH 374/376] py-scripts/tools/lf_update.py Updated the search to include the AT7 with different prompt Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py index 97964b511..295b6a1e0 100755 --- a/py-scripts/tools/lf_update.py +++ b/py-scripts/tools/lf_update.py @@ -436,7 +436,8 @@ def get_mgmt_user(self) -> "Generator[GenericDriver]": # 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": "^\\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[\\#\\$\\>]", # "on_open": jump_function, # on logging into LANforge will run the jump_function # "auth_password_pattern": "Password:", "timeout_ops": int(self.user_timeout), @@ -481,7 +482,8 @@ def get_mgmt(self) -> "Generator[GenericDriver]": # 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": "^\\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[\\#\\$\\>]", # "on_open": jump_function, # on logging into LANforge will run the jump_function # "auth_password_pattern": "Password:", "timeout_ops": int(self.root_timeout), From e932971f208180987967310322831ed33e5991d6 Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Thu, 18 Sep 2025 19:28:49 -0600 Subject: [PATCH 375/376] py-scripts/tools/lf_update.py updated the parcing of the comms_prompt_pattern Verified: "args":[ "--mgr", "192.168.101.137", "--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" ] Signed-off-by: Chuck SmileyRekiere --- py-scripts/tools/lf_update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/py-scripts/tools/lf_update.py b/py-scripts/tools/lf_update.py index 295b6a1e0..c766f63f8 100755 --- a/py-scripts/tools/lf_update.py +++ b/py-scripts/tools/lf_update.py @@ -437,7 +437,7 @@ def get_mgmt_user(self) -> "Generator[GenericDriver]": # 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[\\#\\$\\>]", + "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), @@ -483,7 +483,7 @@ def get_mgmt(self) -> "Generator[GenericDriver]": # 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[\\#\\$\\>]", + "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), From bb0a16527a0ce7c56979b7f332d199c7e9097306 Mon Sep 17 00:00:00 2001 From: Sidartha-CT Date: Fri, 19 Sep 2025 11:34:04 +0530 Subject: [PATCH 376/376] Add flake8-unused-arguments to linting and pre-commit Signed-off-by: Sidartha-CT --- .github/workflows/ci.yml | 2 +- .pre-commit-config.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c25971116..a4a5c08d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - name: flake8 Lint uses: py-actions/flake8@v2 with: - plugins: "flake8-bugbear" + plugins: "flake8-bugbear flake8-unused-arguments" help-check: # Tie runner to Ubuntu 22.04 LTS, as it still supports Python 3.7 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ad39db18a..6c6a1df27 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,6 +13,7 @@ repos: - id: flake8 additional_dependencies: - "flake8-bugbear" + - "flake8-unused-arguments" #- repo: https://github.com/shellcheck-py/shellcheck-py # rev: v0.9.0.5