Files
wlan-lanforge-scripts/py-scripts/measure_station_time_up.py
2022-07-12 15:45:49 +05:30

213 lines
7.9 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Script for creating a variable number of stations.
Measures the time it took to admin them up and get IP addresses.
"""
import sys
import os
import importlib
import argparse
import datetime
import pandas as pd
import time
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")
LFCliBase = lfcli_base.LFCliBase
LFUtils = importlib.import_module("py-json.LANforge.LFUtils")
realm = importlib.import_module("py-json.realm")
Realm = realm.Realm
class MeasureTimeUp(Realm):
def __init__(self,
_ssid=None,
_security=None,
_password=None,
_host=None,
_port=None,
_num_sta=None,
_number_template="00000",
_radio=None,
_proxy_str=None,
_debug_on=False,
_up=True,
_exit_on_error=False,
_exit_on_fail=False,
_load=None,
_action="overwrite",
_clean_chambers="store_true",
_start=None,
_quiesce=None,
_stop=None,
_clean_dut="no"):
super().__init__(_host,
_port)
if _radio is None:
_radio = ["wiphy0", "wiphy1"]
self.host = _host
self.port = _port
self.ssid = _ssid
self.security = _security
self.password = _password
self.num_sta = _num_sta
self.radio = _radio
# self.timeout = 120
self.number_template = _number_template
self.debug = _debug_on
self.up = _up
self.station_profile = self.new_station_profile()
self.station_profile.lfclient_url = self.lfclient_url
self.station_profile.ssid = self.ssid
self.station_profile.ssid_pass = self.password,
self.station_profile.security = self.security
self.station_profile.number_template_ = self.number_template
self.station_profile.mode = 0
self.load = _load
self.action = _action
self.clean_chambers = _clean_chambers
self.start = _start
self.quiesce = _quiesce
self.stop = _stop
self.clean_dut = _clean_dut
def build(self):
# Build stations
self.station_profile.use_security(self.security, self.ssid, self.password)
self.station_profile.set_number_template(self.number_template)
print("Creating stations")
start_num = 0
sta_names = []
for item in self.radio:
self.station_profile.set_command_flag("add_sta", "create_admin_down", 1)
self.station_profile.set_command_param("set_port", "report_timer", 1500)
self.station_profile.set_command_flag("set_port", "rpt_timer", 1)
sta_list = LFUtils.port_name_series(prefix="sta",
start_id=start_num,
end_id=self.num_sta + start_num,
padding_number=10000,
radio=item)
start_num = self.num_sta + start_num + 1
sta_names.extend(sta_list)
# TODO: Add checks for return code
self.station_profile.create(radio=item, sta_names_=sta_list, debug=self.debug)
def station_up(self):
if self.up:
self.station_profile.admin_up()
# TODO: Add checks for whethere it actually got IP or not
self.wait_for_ip(station_list=self.station_profile.station_names)
self._pass("PASS: Station build finished")
def scenario(self):
if self.load:
data = {
"name": self.load,
"action": self.action,
"clean_dut": "no",
"clean_chambers": "no"
}
if self.clean_dut:
data['clean_dut'] = "yes"
if self.clean_chambers:
data['clean_chambers'] = "yes"
print("Loading database %s" % self.load)
self.json_post("/cli-json/load", data)
elif self.start:
print("Starting test group %s..." % self.start)
self.json_post("/cli-json/start_group", {"name": self.start})
elif self.stop:
print("Stopping test group %s..." % self.stop)
self.json_post("/cli-json/stop_group", {"name": self.stop})
elif self.quiesce:
print("Quiescing test group %s..." % self.quiesce)
self.json_post("/cli-json/quiesce_group", {"name": self.quiesce})
def main():
parser = LFCliBase.create_basic_argparse(
prog='measure_station_time_up.py',
formatter_class=argparse.RawTextHelpFormatter,
epilog='''\
Measure how long it takes to up stations
''',
description='''\
measure_station_time_up.py
--------------------
Command example:
./measure_station_time_up.py
--radio wiphy0
--num_stations 3
--security open
--ssid netgear
--passwd BLANK
--debug
--outfile
''')
required = parser.add_argument_group('required arguments')
required.add_argument('--report_file', help='where you want to store results', required=True)
parser.add_argument('--database', help='Which database to load', default='FACTORY_DFLT')
parser.add_argument('--radio2', help='second radio to create stations on', default='wiphy7')
args = parser.parse_args()
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')
dictionary = dict()
for num_sta in list(filter(lambda x: (x % 2 == 0), [*range(0, args.num_stations)])):
print(num_sta)
create_station = MeasureTimeUp(_host=args.mgr,
_port=args.mgr_port,
_ssid=args.ssid,
_password=args.passwd,
_security=args.security,
_num_sta=num_sta,
_radio=[args.radio, args.radio2],
_proxy_str=args.proxy,
_debug_on=args.debug,
_load=args.database)
create_station.scenario()
# Remove sleep, instead use the wait_for logic in LFUtils
# or some other way to wait inteligently.
time.sleep(5.0 + num_sta / 10)
start = datetime.datetime.now()
create_station.build()
built = datetime.datetime.now()
create_station.station_up()
stationsup = datetime.datetime.now()
dictionary[num_sta] = [start, built, stationsup]
# TODO: Check return code of the method below.
create_station.wait_until_ports_disappear()
# TODO: Remove this sleep or add comment as to why it is needed.
time.sleep(5.0 + num_sta / 20)
df = pd.DataFrame.from_dict(dictionary).transpose()
df.columns = ['Start', 'Built', 'Stations Up']
df['built duration'] = df['Built'] - df['Start']
df['Up Stations'] = df['Stations Up'] - df['Built']
df['duration'] = df['Stations Up'] - df['Start']
for variable in ['built duration', 'duration']:
df[variable] = [x.total_seconds() for x in df[variable]]
if 'pkl' in args.report_file:
df.to_pickle(args.report_file)
if 'csv' in args.report_file:
df.to_csv(args.report_file)
if 'xlsx' in args.report_file:
df.to_excel(args.report_file)
# TODO: Check pass/fail and exit accordingly
# 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()