diff --git a/py-json/cv_test_manager.py b/py-json/cv_test_manager.py index 08e6eed4..884b8c43 100644 --- a/py-json/cv_test_manager.py +++ b/py-json/cv_test_manager.py @@ -363,7 +363,7 @@ class cv_test(Realm): print("Detected test is not running.") not_running += 1 if not_running > 5: - break; + break time.sleep(1) diff --git a/py-scripts/create_chamberview.py b/py-scripts/create_chamberview.py index 2ba79b97..fe43a3ad 100755 --- a/py-scripts/create_chamberview.py +++ b/py-scripts/create_chamberview.py @@ -142,7 +142,7 @@ class CreateChamberview(cv): VLAN ); # To manage scenario if not line and not raw_line: - raise Exception("scenario sceation failed") + raise Exception("scenario creation failed") return False return True @@ -210,9 +210,9 @@ def main(): if args.delete_scenario: Create_Chamberview.clean_cv_scenario(type="Network-Connectivity", scenario_name=args.create_scenario) - Create_Chamberview.setup( create_scenario=args.create_scenario, - line=args.line, - raw_line=args.raw_line) + Create_Chamberview.setup(create_scenario=args.create_scenario, + line=args.line, + raw_line=args.raw_line) Create_Chamberview.build(args.create_scenario) diff --git a/py-scripts/cv_to_grafana.py b/py-scripts/cv_to_grafana.py new file mode 100755 index 00000000..1ea05777 --- /dev/null +++ b/py-scripts/cv_to_grafana.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python3 +''' +This script loads and builds a Chamber View Scenario, runs WiFi Capacity Test, runs Dataplane Test, +and posts the results to Influx. +There are optional arguments which will create a Grafana dashboard which will import the data posted to +Influx from this script. +./cv_to_grafana.py +--mgr 192.168.1.4 +--influx_host 192.168.100.201 +--influx_token TOKEN +--influx_tag testbed Stidmatt-01 +--influx_bucket stidmatt +--influx_org Candela +--pull_report +--ssid_dut "ssid_idx=0 ssid=lanforge security=WPA2 password=password bssid=04:f0:21:2c:41:84" +--line "Resource=1.1 Profile=default Amount=4 Uses-1=wiphy1 DUT=DUT_TO_GRAFANA_DUT Traffic=wiphy1 Freq=-1" +--line "Resource=1.1 Profile=upstream Amount=1 Uses-1=eth1 DUT=DUT_TO_GRAFANA_DUT Traffic=eth1 Freq=-1" +--dut DUT_TO_GRAFANA +--test_rig Stidmatt-01 +--create_scenario DUT_TO_GRAFANA_SCENARIO +--station 1.1.sta00002 +--duration 15s +--upstream 1.1.eth1 + +OPTIONAL GRAFANA ARGUMENTS +--grafana_token TOKEN +--grafana_host 192.168.100.201 +--title "Grafana Dashboard" + +The Grafana arguments are only required once. After the Grafana dashboard is built it will automatically update +as more data is added to the Influx database. Running the Grafana arguments to create a dashboard will do nothing. + +The pull_report flag is to be used when running this on a computer which is different from the LANforge Manager. +It downloads the reports to the device which is running the script. + +Each line argument adds a line to the Chamber View Scenario which you create in the script. + +DUT flag gives the name of the DUT which is created by this script. It can be found in the DUT tab in LANforge Manager. + +The station flag tells Dataplane test which station to test with. +''' +import sys +import os +import argparse +import time + +if sys.version_info[0] != 3: + print("This script requires Python 3") + exit(1) + +if 'py-json' not in sys.path: + sys.path.append(os.path.join(os.path.abspath('..'), 'py-json')) + sys.path.append(os.path.join(os.path.abspath('..'), 'py-dashboard')) + +from lf_wifi_capacity_test import WiFiCapacityTest +from cv_test_manager import * +from create_chamberview_dut import DUT +from create_chamberview import CreateChamberview +from lf_dataplane_test import DataplaneTest +from grafana_profile import UseGrafana + +def main(): + parser = argparse.ArgumentParser( + prog='cv_to_grafana.py', + formatter_class=argparse.RawTextHelpFormatter, + epilog='''Run Wifi Capacity and Dataplane Test and record results to Grafana''', + description='''\ + cv_to_grafana.py + ------------------ + ./cv_to_grafana.py + --mgr + --influx_host + --influx_token + --influx_tag testbed + --influx_bucket + --influx_org + --pull_report + --ssid_dut + --line + --line + --dut + --test_rig + --create_scenario + --station + --influx_tag + --duration + --upstream + ''' + ) + + cv_add_base_parser(parser) # see cv_test_manager.py + + parser.add_argument("-b", "--batch_size", type=str, default="", + help="station increment ex. 1,2,3") + parser.add_argument("-l", "--loop_iter", type=str, default="", + help="Loop iteration ex. 1") + parser.add_argument("-p", "--protocol", type=str, default="", + help="Protocol ex.TCP-IPv4") + parser.add_argument("-d", "--duration", type=str, default="", + help="duration in ms. ex. 5000") + parser.add_argument("--download_rate", type=str, default="1Gbps", + help="Select requested download rate. Kbps, Mbps, Gbps units supported. Default is 1Gbps") + parser.add_argument("--upload_rate", type=str, default="10Mbps", + help="Select requested upload rate. Kbps, Mbps, Gbps units supported. Default is 10Mbps") + parser.add_argument("--sort", type=str, default="interleave", + help="Select station sorting behaviour: none | interleave | linear Default is interleave.") + parser.add_argument('--number_template', help='Start the station numbering with a particular number. Default is 0000', + default=0000) + parser.add_argument('--mode', help='Used to force mode of stations') + parser.add_argument('--ap', help='Used to force a connection to a particular AP') + parser.add_argument("--num_stations", default=2) + parser.add_argument("--mgr_port", default=8080) + parser.add_argument("--upstream_port", default="1.1.eth1") + parser.add_argument("--scenario", help="", default=None) + parser.add_argument("--line", action='append', nargs='+', + help="line number", default=[]) + parser.add_argument("-ds", "--delete_scenario", default=False, action='store_true', + help="delete scenario (by default: False)") + + parser.add_argument("--create_scenario", "--create_lf_scenario", type=str, + help="name of scenario to be created") + parser.add_argument("-u", "--upstream", type=str, default="", + help="Upstream port for wifi capacity test ex. 1.1.eth2") + parser.add_argument("--station", type=str, default="", + help="Station to be used in this test, example: 1.1.sta01500") + + parser.add_argument("--dut", default="", + help="Specify DUT used by this test, example: linksys-8450") + parser.add_argument("--download_speed", default="", + help="Specify requested download speed. Percentage of theoretical is also supported. Default: 85%") + parser.add_argument("--upload_speed", default="", + help="Specify requested upload speed. Percentage of theoretical is also supported. Default: 0") + parser.add_argument("--graph_groups", help="File to save graph_groups to", default=None) + parser.add_argument("--ssid_dut", action='append', nargs=1, help="SSID", default=[]) + + + parser.add_argument("--sw_version", default="NA", help="DUT Software version.") + parser.add_argument("--hw_version", default="NA", help="DUT Hardware version.") + parser.add_argument("--serial_num", default="NA", help="DUT Serial number.") + parser.add_argument("--model_num", default="NA", help="DUT Model Number.") + parser.add_argument("--report_dir", default="") + parser.add_argument('--grafana_token', help='token to access your Grafana database') + parser.add_argument('--grafana_port', help='Grafana port if different from 3000', default=3000) + parser.add_argument('--grafana_host', help='Grafana host', default='localhost') + + args = parser.parse_args() + + cv_base_adjust_parser(args) + + # Create/update new DUT + print("Make new DUT") + new_dut = DUT(lfmgr=args.mgr, + port=args.port, + dut_name=args.dut, + ssid=args.ssid_dut, + sw_version=args.sw_version, + hw_version=args.hw_version, + serial_num=args.serial_num, + model_num=args.model_num, + ) + new_dut.setup() + new_dut.add_ssids() + new_dut.cv_test.show_text_blob(None, None, True) # Show changes on GUI + new_dut.cv_test.sync_cv() + time.sleep(2) + new_dut.cv_test.sync_cv() + + print("Build Chamber View Scenario") + Create_Chamberview = CreateChamberview(lfmgr=args.mgr, + port=args.port, + ) + if args.delete_scenario: + Create_Chamberview.clean_cv_scenario(type="Network-Connectivity", scenario_name=args.create_scenario) + + Create_Chamberview.setup(create_scenario=args.create_scenario, + line=args.line, + raw_line=args.raw_line) + Create_Chamberview.build(args.create_scenario) + + print("Run WiFi Capacity Test") + wifi_capacity = WiFiCapacityTest(lfclient_host=args.mgr, + lf_port=args.mgr_port, + lf_user=args.lf_user, + lf_password=args.lf_password, + instance_name='testing', + config_name=args.config_name, + upstream=args.upstream_port, + 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, + enables=args.enable, + disables=args.disable, + raw_lines=args.raw_line, + raw_lines_file=args.raw_lines_file, + sets=args.set) + wifi_capacity.apply_cv_scenario(args.scenario) + wifi_capacity.build_cv_scenario() + wifi_capacity.setup() + wifi_capacity.run() + wifi_capacity.check_influx_kpi(args) + + print("Run Dataplane test") + + CV_Test = DataplaneTest(lf_host=args.mgr, + lf_port=args.port, + lf_user=args.lf_user, + lf_password=args.lf_password, + instance_name='dataplane-instance', + 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() + + CV_Test.check_influx_kpi(args) + + if args.grafana_token: + print("Create Grafana dashboard") + Grafana = UseGrafana(args.grafana_token, + args.grafana_port, + args.grafana_host + ) + Grafana.create_custom_dashboard(scripts=args.scripts, + title=args.title, + bucket=args.influx_bucket, + graph_groups=args.graph_groups, + graph_groups_file=args.graph_groups_file, + testbed=args.testbed, + datasource=args.datasource, + from_date=args.from_date, + graph_height=args.graph_height, + graph__width=args.graph_width) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/py-scripts/lf_dataplane_test.py b/py-scripts/lf_dataplane_test.py index e0f721be..88d790a3 100755 --- a/py-scripts/lf_dataplane_test.py +++ b/py-scripts/lf_dataplane_test.py @@ -110,10 +110,11 @@ if sys.version_info[0] != 3: if 'py-json' not in sys.path: sys.path.append(os.path.join(os.path.abspath('..'), 'py-json')) -from cv_test_manager import cv_test as cvtest +from cv_test_manager import cv_test from cv_test_manager import * -class DataplaneTest(cvtest): + +class DataplaneTest(cv_test): def __init__(self, lf_host="localhost", lf_port=8080, @@ -134,14 +135,15 @@ class DataplaneTest(cvtest): raw_lines=[], raw_lines_file="", sets=[], - graph_groups=None + graph_groups=None, + report_dir="" ): super().__init__(lfclient_host=lf_host, lfclient_port=lf_port) self.lf_host = lf_host self.lf_port = lf_port self.lf_user = lf_user - self.lf_password =lf_password + self.lf_password = lf_password self.instance_name = instance_name self.config_name = config_name self.dut = dut @@ -159,12 +161,12 @@ class DataplaneTest(cvtest): self.raw_lines_file = raw_lines_file self.sets = sets self.graph_groups = graph_groups + self.report_dir = report_dir def setup(self): # Nothing to do at this time. return - def run(self): self.sync_cv() time.sleep(2) @@ -208,7 +210,6 @@ class DataplaneTest(cvtest): def main(): - parser = argparse.ArgumentParser(""" Open this file in an editor and read the top notes for more details. @@ -247,6 +248,7 @@ def main(): parser.add_argument("--duration", default="", help="Specify duration of each traffic run") parser.add_argument("--graph_groups", help="File to save graph_groups to", default=None) + parser.add_argument("--report_dir", default="") args = parser.parse_args() @@ -278,5 +280,6 @@ def main(): CV_Test.check_influx_kpi(args) + if __name__ == "__main__": main() diff --git a/py-scripts/lf_wifi_capacity_test.py b/py-scripts/lf_wifi_capacity_test.py index 08552135..ce668cf7 100755 --- a/py-scripts/lf_wifi_capacity_test.py +++ b/py-scripts/lf_wifi_capacity_test.py @@ -17,7 +17,8 @@ Note: This is a test file which will run a wifi capacity test. --test_rig Testbed-01 \ --influx_host c7-graphana --influx_port 8086 --influx_org Candela \ --influx_token=-u_Wd-L8o992701QF0c5UmqEp7w7Z7YOMaWLxOMgmHfATJGnQbbmYyNxHBR9PgD6taM_tcxqJl6U8DjU1xINFQ== \ - --influx_bucket ben --influx_tag testbed Ferndale-01 + --influx_bucket ben \ + --influx_tag testbed Ferndale-01 ex. on how to run this script (to create new stations): ./lf_wifi_capacity_test.py --mgr localhost --port 8080 --lf_user lanforge --lf_password lanforge \ diff --git a/py-scripts/wifi_cap_to_grafana.py b/py-scripts/wifi_cap_to_grafana.py deleted file mode 100755 index f710f698..00000000 --- a/py-scripts/wifi_cap_to_grafana.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 -''' -This script loads and builds a Chamber View Scenario, runs WiFi Capacity Test, and posts the results to Grafana -''' -import sys -import os -import argparse - -if sys.version_info[0] != 3: - print("This script requires Python 3") - exit(1) - -if 'py-json' not in sys.path: - sys.path.append(os.path.join(os.path.abspath('..'), 'py-json')) - sys.path.append(os.path.join(os.path.abspath('..'), 'py-dashboard')) - - -from lf_wifi_capacity_test import WiFiCapacityTest -from cv_test_manager import * - -def main(): - parser = argparse.ArgumentParser( - prog='wifi_cap_to_grafana.py', - formatter_class=argparse.RawTextHelpFormatter, - epilog='''Run Wifi Capacity and record results to Grafana''', - description='''\ - wifi_cap_to_grafana.py - ------------------ - ./wifi_cap_to_grafana.py - --num_stations - --grafana_token - --influx_host - --influx_org - --influx_token - --influx_bucket - --target_csv - --panel_name - --dut_name''' - ) - - cv_add_base_parser(parser) # see cv_test_manager.py - - parser.add_argument("-b", "--batch_size", type=str, default="", - help="station increment ex. 1,2,3") - parser.add_argument("-l", "--loop_iter", type=str, default="", - help="Loop iteration ex. 1") - parser.add_argument("-p", "--protocol", type=str, default="", - help="Protocol ex.TCP-IPv4") - parser.add_argument("-d", "--duration", type=str, default="", - help="duration in ms. ex. 5000") - parser.add_argument("--download_rate", type=str, default="1Gbps", - help="Select requested download rate. Kbps, Mbps, Gbps units supported. Default is 1Gbps") - parser.add_argument("--upload_rate", type=str, default="10Mbps", - help="Select requested upload rate. Kbps, Mbps, Gbps units supported. Default is 10Mbps") - parser.add_argument("--sort", type=str, default="interleave", - help="Select station sorting behaviour: none | interleave | linear Default is interleave.") - parser.add_argument('--number_template', help='Start the station numbering with a particular number. Default is 0000', - default=0000) - parser.add_argument('--mode', help='Used to force mode of stations') - parser.add_argument('--ap', help='Used to force a connection to a particular AP') - parser.add_argument("--num_stations", default=2) - parser.add_argument("--mgr_port", default=8080) - parser.add_argument("--upstream_port", default="1.1.eth1") - parser.add_argument("--scenario", help="", default=None) - args = parser.parse_args() - - - cv_base_adjust_parser(args) - - # Run WiFi Capacity Test - wifi_capacity = WiFiCapacityTest(lfclient_host=args.mgr, - lf_port=args.mgr_port, - lf_user=args.lf_user, - lf_password=args.lf_password, - instance_name=args.instance_name, - config_name=args.config_name, - upstream=args.upstream_port, - 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, - enables=args.enable, - disables=args.disable, - raw_lines=args.raw_line, - raw_lines_file=args.raw_lines_file, - sets=args.set) - wifi_capacity.apply_cv_scenario(args.scenario) - wifi_capacity.build_cv_scenario() - wifi_capacity.setup() - wifi_capacity.run() - wifi_capacity.check_influx_kpi(args) - -if __name__ == "__main__": - main() \ No newline at end of file