Files
wlan-lanforge-scripts/py-scripts/create_chamberview.py
Ben Greear 7db4c9a329 create-cv: Improve --line and --ssid parser.
Use shlex to parse the tokens for each --line and --ssid content.
This fixes using ssid with spaces, for instance.
Fix parser to error out if user inputs invalid data.

Add TODO items for future work.

Fix regression script:  DUT must be created before Scenario tries to use it,
and fix typos and other mistakes in how the regression script tried to
create dut and chamberview.  This part has not been tested yet, but it is
at least closer than before.

Signed-off-by: Ben Greear <greearb@candelatech.com>
2022-07-12 15:45:45 +05:30

261 lines
9.9 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Note: To Run this script gui should be opened with
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
Note: Scenario names should be different, for each run of this script.
in case of same scenario name scenario will be appended to the same name.
Note: Script for creating a chamberview scenario.
Run this script to set/create a chamber view scenario.
ex. on how to run this script:
create_chamberview.py -m "localhost" -o "8080" -cs "scenario_name"
--line "Resource=1.1 Profile=STA-AC Amount=1 Uses-1=wiphy0 Uses-2=AUTO Freq=-1
DUT=Test DUT_Radio=Radio-1 Traffic=http VLAN="
--line "Resource=1.1 Profile=upstream Amount=1 Uses-1=eth1 Uses-2=AUTO Freq=-1
DUT=Test DUT_Radio=Radio-1 Traffic=http VLAN="
******************************** OR ********************************
create_chamberview.py -m "localhost" -o "8080" -cs "scenario_name"
--raw_line "profile_link 1.1 STA-AC 10 'DUT: temp Radio-1' tcp-dl-6m-vi wiphy0,AUTO -1"
--raw_line "profile_link 1.1 upstream 1 'DUT: temp Radio-1' tcp-dl-6m-vi eth1,AUTO -1"
Output:
You should see build scenario with the given arguments at the end of this script.
To verify this:
open Chamber View -> Manage scenario
"""
import sys
import os
import importlib
import argparse
import time
import re
from pprint import pprint
import shlex
# TODO: Add logging support.
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")
cv = cv_test_manager.cv_test
class CreateChamberview(cv):
def __init__(self,
lfmgr="localhost",
port="8080",
_debug_on=False,
):
super().__init__(
lfclient_host=lfmgr,
lfclient_port=port,
debug_=_debug_on
)
self.lfmgr = lfmgr
self.port = port
def clean_cv_scenario(
self,
cv_type="Network-Connectivity",
scenario_name=None):
self.rm_cv_text_blob(cv_type, scenario_name)
def setup(self,
create_scenario="",
line="",
raw_line=None):
if raw_line:
print("creating %s scenario using raw lines" % create_scenario)
for create_lines in raw_line:
ln = create_lines[0]
#print("ln: %s" % (ln))
self.pass_raw_lines_to_cv(create_scenario, ln)
# check for lines
if line:
scenario_name = create_scenario
line = line
Resource = "1.1"
Profile = "STA-AC"
Amount = "1"
DUT = "DUT"
DUT_Radio = "Radio-1"
Uses1 = "wiphy0"
Uses2 = "AUTO"
Traffic = "http"
Freq = "-1"
VLAN = ""
#print("line: ")
#pprint(line)
for item in line:
#print("item: ")
#pprint(item)
for sub_item in shlex.split(item[0]):
#print("sub-item: ")
#pprint(sub_item)
sub_item = sub_item.split("=")
if sub_item[0] == "Resource" or str(
sub_item[0]) == "Res" or sub_item[0] == "R":
Resource = sub_item[1]
elif sub_item[0] == "Profile" or sub_item[0] == "Prof" or sub_item[0] == "P":
Profile = sub_item[1]
elif sub_item[0] == "Amount" or sub_item[0] == "Sta" or sub_item[0] == "A":
Amount = sub_item[1]
elif sub_item[0] == "Uses-1" or sub_item[0] == "U1" or sub_item[0] == "U-1":
Uses1 = sub_item[1]
elif sub_item[0] == "Uses-2" or sub_item[0] == "U2" or sub_item[0] == "U-2":
Uses2 = sub_item[1]
elif sub_item[0] == "Freq" or sub_item[0] == "Freq" or sub_item[0] == "F":
Freq = sub_item[1]
elif sub_item[0] == "DUT" or sub_item[0] == "dut" or sub_item[0] == "D":
DUT = sub_item[1]
elif sub_item[0] == "DUT_Radio" or sub_item[0] == "dr" or sub_item[0] == "DR":
DUT_Radio = sub_item[1]
elif sub_item[0] == "Traffic" or sub_item[0] == "Traf" or sub_item[0] == "T":
Traffic = sub_item[1]
elif sub_item[0] == "VLAN" or sub_item[0] == "Vlan" or sub_item[0] == "V":
VLAN = sub_item[1]
else:
print("ERROR: Unknown line argument -:%s:-" %(sub_item[0]))
raise ValueError("Un-supported line argument") # Bad user input, terminate script.
continue
self.add_text_blob_line(scenario_name,
Resource,
Profile,
Amount,
DUT,
DUT_Radio,
Uses1,
Uses2,
Traffic,
Freq,
VLAN
) # To manage scenario
if not line and not raw_line:
raise Exception("scenario creation failed")
return True
def build(self, scenario_name):
self.sync_cv() # chamberview sync
time.sleep(2)
self.apply_cv_scenario(scenario_name) # Apply scenario
self.show_text_blob(None, None, False) # Show changes on GUI
self.apply_cv_scenario(scenario_name) # Apply scenario
self.build_cv_scenario() # build scenario
tries = 0
while True:
self.get_popup_info_and_close()
if not self.get_cv_is_built():
# It can take a while to build a large scenario, so wait-time
# is currently max of 5 minutes.
print("Waiting %i/300 for Chamber-View to be built." % tries)
tries += 1
if tries > 300:
break
time.sleep(1)
else:
break
print("completed building %s scenario" % scenario_name)
def main():
parser = argparse.ArgumentParser(
prog='create_chamberview.py',
formatter_class=argparse.RawTextHelpFormatter,
description="""
For Two line scenario use --line twice as shown in example, for multi line scenario
use --line argument to create multiple lines
\n
create_chamberview.py -m "localhost" -o "8080" -cs "scenario_name"
--line "Resource=1.1 Profile=STA-AC Amount=1 Uses-1=wiphy0 Uses-2=AUTO Freq=-1
DUT=Test DUT_Radio=Radio-1 Traffic=http VLAN="
--line "Resource=1.1 Profile=upstream Amount=1 Uses-1=eth1 Uses-2=AUTO Freq=-1
DUT=Test DUT_Radio=Radio-1 Traffic=http VLAN="
******************************** OR ********************************
create_chamberview.py -m "localhost" -o "8080" -cs "scenario_name"
--raw_line "profile_link 1.1 STA-AC 10 'DUT: temp Radio-1' tcp-dl-6m-vi wiphy0,AUTO -1"
--raw_line "profile_link 1.1 upstream 1 'DUT: temp Radio-1' tcp-dl-6m-vi eth1,AUTO -1"
DUT_Radio is really the last part of the 'maps to' component of the scenario,
so it can also be LAN when using and Upstream profile, for instance.
""")
parser.add_argument(
"-m",
"--lfmgr",
type=str,
help="address of the LANforge GUI machine (localhost is default)")
parser.add_argument(
"-o",
"--port",
type=int,
default=8080,
help="IP Port the LANforge GUI is listening on (8080 is default)")
parser.add_argument(
"-cs",
"--create_scenario",
"--create_lf_scenario",
type=str,
help="name of scenario to be created")
parser.add_argument("-l", "--line", action='append', nargs='+',
help="line number", default=[])
parser.add_argument("-rl", "--raw_line", action='append', nargs=1,
help="raw lines", default=[])
parser.add_argument(
"-ds",
"--delete_scenario",
default=False,
action='store_true',
help="delete scenario (by default: False)")
parser.add_argument('--debug',
'-d',
default=False,
action="store_true",
help='Enable debugging')
args = parser.parse_args()
Create_Chamberview = CreateChamberview(lfmgr=args.lfmgr,
_debug_on=args.debug,
port=args.port,
)
if args.delete_scenario:
Create_Chamberview.clean_cv_scenario(
cv_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)
# TODO: Build the scenario (cv click the 'Build Scenario' button, wait until build has completed
# TODO: Find and admin up all wlan* and sta* ports,
# TODO: Verify they admin up and get IP address.
if Create_Chamberview.passes():
Create_Chamberview.exit_success()
else:
Create_Chamberview.exit_fail()
if __name__ == "__main__":
main()