lf_csv - creates csv for graph data

This commit is contained in:
anil-tegala
2021-07-01 18:14:42 +05:30
parent 22ce8723b7
commit 67930578d2
2 changed files with 260 additions and 62 deletions

View File

@@ -0,0 +1,49 @@
#!/usr/bin/env python3
'''
NAME: lf_csv.py
PURPOSE:
Common Library for generating csv for LANforge output
SETUP:
/lanforge/html-reports directory needs to be present or output generated in local file
EXAMPLE:
see: /py-scritps/lf_csv_test.py for example
COPYWRITE
Copyright 2021 Candela Technologies Inc
License: Free to distribute and modify. LANforge systems must be licensed.
INCLUDE_IN_README
'''
import numpy as np
import pandas as pd
class LfCSV:
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
self.filename = _filename
def generate_csv(self):
df = {}
for i in range(len(self.columns)):
df[self.columns[i]] = self.rows[i]
csv_df = pd.DataFrame(df)
print(csv_df)
csv_df.to_csv(self.filename, encoding='utf-8', na_rep='NA', float_format='%.2f')
if __name__ == "__main__":
test = LfCSV()
test.generate_csv()

View File

@@ -6,7 +6,7 @@ NAME: throughput_qos.py
PURPOSE: throughput_qos.py will create stations and endpoints which evaluates l3 traffic for a particular type of service. PURPOSE: throughput_qos.py will create stations and endpoints which evaluates l3 traffic for a particular type of service.
EXAMPLE: EXAMPLE:
python3 throughput_qos.py --mgr 192.168.200.240 --mgr_port 8080 -u eth1 --num_stations 1 python3 throughput_qos.py --mgr 192.168.200.37 --mgr_port 8080 -u eth1 --num_stations 1
--radio wiphy1 --ssid TestAP5-71 --passwd lanforge --security wpa2 --mode 11 --a_min 1000000 --b_min 1000000 --traffic_type lf_udp --radio wiphy1 --ssid TestAP5-71 --passwd lanforge --security wpa2 --mode 11 --a_min 1000000 --b_min 1000000 --traffic_type lf_udp
python3 throughput_qos.py --num_stations 1 --radio wiphy1 --ssid ct523c-vap --passwd ct523c-vap --security wpa2 --mode 11 --a_min 1000000 --b_min 1000000 --traffic_type lf_udp python3 throughput_qos.py --num_stations 1 --radio wiphy1 --ssid ct523c-vap --passwd ct523c-vap --security wpa2 --mode 11 --a_min 1000000 --b_min 1000000 --traffic_type lf_udp
@@ -62,6 +62,7 @@ class ThroughputQOS(Realm):
port=8080, port=8080,
mode=0, mode=0,
ap=None, ap=None,
ap_name="",
traffic_type=None, traffic_type=None,
side_a_min_rate=56, side_a_max_rate=0, side_a_min_rate=56, side_a_max_rate=0,
side_b_min_rate=56, side_b_max_rate=0, side_b_min_rate=56, side_b_max_rate=0,
@@ -93,6 +94,7 @@ class ThroughputQOS(Realm):
self.create_sta = create_sta self.create_sta = create_sta
self.mode = mode self.mode = mode
self.ap = ap self.ap = ap
self.ap_name = ap_name
self.traffic_type = traffic_type self.traffic_type = traffic_type
self.tos = tos.split(",") self.tos = tos.split(",")
self.bands = bands.split(",") self.bands = bands.split(",")
@@ -275,8 +277,8 @@ class ThroughputQOS(Realm):
if int(self.cx_profile.side_b_min_bps) != 0: if int(self.cx_profile.side_b_min_bps) != 0:
tos_download['bk'].append(float( tos_download['bk'].append(float(
f"{list((self.json_get('/cx/%s?fields=bps+rx+a' % sta)).values())[2]['bps rx a'] / 1000000:.2f}")) f"{list((self.json_get('/cx/%s?fields=bps+rx+a' % sta)).values())[2]['bps rx a'] / 1000000:.2f}"))
tx_b['bk'].append(int(f"{tx_endps['%s-B' %sta]['tx pkts ll']}")) tx_b['bk'].append(int(f"{tx_endps['%s-B' % sta]['tx pkts ll']}"))
rx_a['bk'].append(int(f"{rx_endps['%s-A' %sta]['rx pkts ll']}")) rx_a['bk'].append(int(f"{rx_endps['%s-A' % sta]['rx pkts ll']}"))
else: else:
tos_download['bk'].append(float(0)) tos_download['bk'].append(float(0))
tx_b['bk'].append(int(0)) tx_b['bk'].append(int(0))
@@ -316,18 +318,23 @@ class ThroughputQOS(Realm):
tos_download.update({"videoQOS": float(f"{sum(tos_download['video']):.2f}")}) tos_download.update({"videoQOS": float(f"{sum(tos_download['video']):.2f}")})
tos_download.update({"voiceQOS": float(f"{sum(tos_download['voice']):.2f}")}) tos_download.update({"voiceQOS": float(f"{sum(tos_download['voice']):.2f}")})
if sum(tx_b['bk']) != 0 or sum(tx_b['be']) != 0 or sum(tx_b['video']) != 0 or sum(tx_b['voice']) != 0: if sum(tx_b['bk']) != 0 or sum(tx_b['be']) != 0 or sum(tx_b['video']) != 0 or sum(tx_b['voice']) != 0:
pkt_loss.update({"bkLOSS": float(f"{((sum(tx_b['bk']) - sum(rx_a['bk']))/sum(tx_b['bk']))*100:.2f}")}) tos_download.update(
pkt_loss.update({"beLOSS": float(f"{((sum(tx_b['be']) - sum(rx_a['be']))/sum(tx_b['be']))*100:.2f}")}) {"bkLOSS": float(f"{((sum(tx_b['bk']) - sum(rx_a['bk'])) / sum(tx_b['bk'])) * 100:.2f}")})
pkt_loss.update({"videoLOSS": float(f"{((sum(tx_b['video']) - sum(rx_a['video']))/sum(tx_b['video']))*100:.2f}")}) tos_download.update(
pkt_loss.update({"voiceLOSS": float(f"{((sum(tx_b['voice']) - sum(rx_a['voice']))/sum(tx_b['voice']))*100:.2f}")}) {"beLOSS": float(f"{((sum(tx_b['be']) - sum(rx_a['be'])) / sum(tx_b['be'])) * 100:.2f}")})
tos_download.update({"videoLOSS": float(
f"{((sum(tx_b['video']) - sum(rx_a['video'])) / sum(tx_b['video'])) * 100:.2f}")})
tos_download.update({"voiceLOSS": float(
f"{((sum(tx_b['voice']) - sum(rx_a['voice'])) / sum(tx_b['voice'])) * 100:.2f}")})
tos_download.update({'tx_b': tx_b})
tos_download.update({'rx_a': rx_a})
else: else:
print("no RX values available to evaluate QOS") print("no RX values available to evaluate QOS")
key = case + " " + "Mbps" key = case + " " + "Mbps"
print(tos_download) print(tos_download)
print(pkt_loss) return {key: tos_download}
return {key: tos_download}, pkt_loss
def generate_report(self, data): def generate_report(self, data, test_setup_info, input_setup_info):
print(data) print(data)
res = {} res = {}
if data is not None: if data is not None:
@@ -336,7 +343,7 @@ class ThroughputQOS(Realm):
else: else:
print("No Data found to generate report!") print("No Data found to generate report!")
exit(1) exit(1)
report = lf_report() report = lf_report(_output_pdf="throughput_qos.pdf", _output_html="throughput_qos.html")
report_path = report.get_path() report_path = report.get_path()
report_path_date_time = report.get_path_date_time() report_path_date_time = report.get_path_date_time()
print("path: {}".format(report_path)) print("path: {}".format(report_path))
@@ -348,18 +355,15 @@ class ThroughputQOS(Realm):
_obj="Through this test we can evaluate the throughput for given number of clients which" _obj="Through this test we can evaluate the throughput for given number of clients which"
" runs the traffic with a particular Type of Service i.e BK,BE,VI,VO") " runs the traffic with a particular Type of Service i.e BK,BE,VI,VO")
report.build_objective() report.build_objective()
report.set_custom_html(_custom_html=self.test_setup_information(test_setup_data=test_setup_info,
colmn="Device Under Test"))
report.build_custom()
report.set_table_title( report.set_table_title(
"Overall download Throughput for all TOS i.e BK | BE | Video (VI) | Voice (VO) in 2.4Ghz") "Overall download Throughput for all TOS i.e BK | BE | Video (VI) | Voice (VO) in 2.4Ghz")
report.build_table_title() report.build_table_title()
t_1mb = [] table_df = [[], [], [], [], []]
t_2mb = [] pkt_loss = [[], [], [], [], []]
t_3mb = []
t_4mb = []
t_5mb = []
table_df = [t_1mb, t_2mb, t_3mb, t_4mb, t_5mb]
for key in res: for key in res:
if key == '1 Mbps': if key == '1 Mbps':
@@ -367,26 +371,46 @@ class ThroughputQOS(Realm):
table_df[0].append(res[key]['beQOS']) table_df[0].append(res[key]['beQOS'])
table_df[0].append(res[key]['videoQOS']) table_df[0].append(res[key]['videoQOS'])
table_df[0].append(res[key]['voiceQOS']) table_df[0].append(res[key]['voiceQOS'])
pkt_loss[0].append(res[key]['bkLOSS'])
pkt_loss[0].append(res[key]['beLOSS'])
pkt_loss[0].append(res[key]['videoLOSS'])
pkt_loss[0].append(res[key]['voiceLOSS'])
if key == '2 Mbps': if key == '2 Mbps':
table_df[1].append(res[key]['bkQOS']) table_df[1].append(res[key]['bkQOS'])
table_df[1].append(res[key]['beQOS']) table_df[1].append(res[key]['beQOS'])
table_df[1].append(res[key]['videoQOS']) table_df[1].append(res[key]['videoQOS'])
table_df[1].append(res[key]['voiceQOS']) table_df[1].append(res[key]['voiceQOS'])
pkt_loss[1].append(res[key]['bkLOSS'])
pkt_loss[1].append(res[key]['beLOSS'])
pkt_loss[1].append(res[key]['videoLOSS'])
pkt_loss[1].append(res[key]['voiceLOSS'])
if key == '3 Mbps': if key == '3 Mbps':
table_df[2].append(res[key]['bkQOS']) table_df[2].append(res[key]['bkQOS'])
table_df[2].append(res[key]['beQOS']) table_df[2].append(res[key]['beQOS'])
table_df[2].append(res[key]['videoQOS']) table_df[2].append(res[key]['videoQOS'])
table_df[2].append(res[key]['voiceQOS']) table_df[2].append(res[key]['voiceQOS'])
pkt_loss[2].append(res[key]['bkLOSS'])
pkt_loss[2].append(res[key]['beLOSS'])
pkt_loss[2].append(res[key]['videoLOSS'])
pkt_loss[2].append(res[key]['voiceLOSS'])
if key == '4 Mbps': if key == '4 Mbps':
table_df[3].append(res[key]['bkQOS']) table_df[3].append(res[key]['bkQOS'])
table_df[3].append(res[key]['beQOS']) table_df[3].append(res[key]['beQOS'])
table_df[3].append(res[key]['videoQOS']) table_df[3].append(res[key]['videoQOS'])
table_df[3].append(res[key]['voiceQOS']) table_df[3].append(res[key]['voiceQOS'])
pkt_loss[3].append(res[key]['bkLOSS'])
pkt_loss[3].append(res[key]['beLOSS'])
pkt_loss[3].append(res[key]['videoLOSS'])
pkt_loss[3].append(res[key]['voiceLOSS'])
if key == '5 Mbps': if key == '5 Mbps':
table_df[4].append(res[key]['bkQOS']) table_df[4].append(res[key]['bkQOS'])
table_df[4].append(res[key]['beQOS']) table_df[4].append(res[key]['beQOS'])
table_df[4].append(res[key]['videoQOS']) table_df[4].append(res[key]['videoQOS'])
table_df[4].append(res[key]['voiceQOS']) table_df[4].append(res[key]['voiceQOS'])
pkt_loss[4].append(res[key]['bkLOSS'])
pkt_loss[4].append(res[key]['beLOSS'])
pkt_loss[4].append(res[key]['videoLOSS'])
pkt_loss[4].append(res[key]['voiceLOSS'])
table_df2 = [] table_df2 = []
for i in range(len(table_df)): for i in range(len(table_df)):
table_df2.append( table_df2.append(
@@ -402,55 +426,102 @@ class ThroughputQOS(Realm):
}) })
report.set_table_dataframe(df_throughput) report.set_table_dataframe(df_throughput)
report.build_table() report.build_table()
graph_df = [[], [], [], []]
report.set_graph_title("Overall download Throughput for all 2.4G clients with different TOS.") pkt_loss_df = [[], [], [], []]
report.set_obj_html(_obj_title="", _obj="This graph represents the download throughput for Bk, BE, Video, Voice"
" services when stations are running the traffic with load 1 Mbps, "
"2 Mbps, 3 Mbps, 4 Mbps")
report.build_graph_title()
report.build_objective()
y_bk = []
y_be = []
y_vi = []
y_vo = []
graph_df = [y_bk, y_be, y_vi, y_vo]
for key in res: for key in res:
if key == '1 Mbps': if key == '1 Mbps':
graph_df[0].append(res[key]['bkQOS']) graph_df[0].append(res[key]['bkQOS'])
graph_df[1].append(res[key]['beQOS']) graph_df[1].append(res[key]['beQOS'])
graph_df[2].append(res[key]['videoQOS']) graph_df[2].append(res[key]['videoQOS'])
graph_df[3].append(res[key]['voiceQOS']) graph_df[3].append(res[key]['voiceQOS'])
pkt_loss_df[0].append(res[key]['bkLOSS'])
pkt_loss_df[1].append(res[key]['beLOSS'])
pkt_loss_df[2].append(res[key]['videoLOSS'])
pkt_loss_df[3].append(res[key]['voiceLOSS'])
if key == '2 Mbps': if key == '2 Mbps':
graph_df[0].append(res[key]['bkQOS']) graph_df[0].append(res[key]['bkQOS'])
graph_df[1].append(res[key]['beQOS']) graph_df[1].append(res[key]['beQOS'])
graph_df[2].append(res[key]['videoQOS']) graph_df[2].append(res[key]['videoQOS'])
graph_df[3].append(res[key]['voiceQOS']) graph_df[3].append(res[key]['voiceQOS'])
pkt_loss_df[0].append(res[key]['bkLOSS'])
pkt_loss_df[1].append(res[key]['beLOSS'])
pkt_loss_df[2].append(res[key]['videoLOSS'])
pkt_loss_df[3].append(res[key]['voiceLOSS'])
if key == '3 Mbps': if key == '3 Mbps':
graph_df[0].append(res[key]['bkQOS']) graph_df[0].append(res[key]['bkQOS'])
graph_df[1].append(res[key]['beQOS']) graph_df[1].append(res[key]['beQOS'])
graph_df[2].append(res[key]['videoQOS']) graph_df[2].append(res[key]['videoQOS'])
graph_df[3].append(res[key]['voiceQOS']) graph_df[3].append(res[key]['voiceQOS'])
pkt_loss_df[0].append(res[key]['bkLOSS'])
pkt_loss_df[1].append(res[key]['beLOSS'])
pkt_loss_df[2].append(res[key]['videoLOSS'])
pkt_loss_df[3].append(res[key]['voiceLOSS'])
if key == '4 Mbps': if key == '4 Mbps':
graph_df[0].append(res[key]['bkQOS']) graph_df[0].append(res[key]['bkQOS'])
graph_df[1].append(res[key]['beQOS']) graph_df[1].append(res[key]['beQOS'])
graph_df[2].append(res[key]['videoQOS']) graph_df[2].append(res[key]['videoQOS'])
graph_df[3].append(res[key]['voiceQOS']) graph_df[3].append(res[key]['voiceQOS'])
pkt_loss_df[0].append(res[key]['bkLOSS'])
pkt_loss_df[1].append(res[key]['beLOSS'])
pkt_loss_df[2].append(res[key]['videoLOSS'])
pkt_loss_df[3].append(res[key]['voiceLOSS'])
if key == '5 Mbps': if key == '5 Mbps':
graph_df[0].append(res[key]['bkQOS']) graph_df[0].append(res[key]['bkQOS'])
graph_df[1].append(res[key]['beQOS']) graph_df[1].append(res[key]['beQOS'])
graph_df[2].append(res[key]['videoQOS']) graph_df[2].append(res[key]['videoQOS'])
graph_df[3].append(res[key]['voiceQOS']) graph_df[3].append(res[key]['voiceQOS'])
pkt_loss_df[0].append(res[key]['bkLOSS'])
pkt_loss_df[1].append(res[key]['beLOSS'])
pkt_loss_df[2].append(res[key]['videoLOSS'])
pkt_loss_df[3].append(res[key]['voiceLOSS'])
report.set_graph_title(f"Overall Download throughput for all {self.bands[0]} clients with different TOS.")
report.set_obj_html(_obj_title="", _obj="The below graph represents overall download throughput for all "
"connected stations running BK, BE, VO, VI traffic with different "
"intended loads per station 1 Mbps, 2 Mbps, 3 Mbps, 4 Mbps, 5 Mbps.")
report.build_graph_title()
report.build_objective()
graph = lf_bar_graph(_data_set=graph_df, graph = lf_bar_graph(_data_set=graph_df,
_xaxis_name="Load per Type of Service", _xaxis_name="Load per Type of Service",
_yaxis_name="Throughput (Mbps)", _yaxis_name="Throughput (Mbps)",
_xaxis_categories=[1, 2, 3, 4, 5, 6], _xaxis_categories=[1, 2, 3, 4, 5, 6],
_xaxis_label=['1 Mbps', '2 Mbps', '3 Mbps', '4 Mbps', '5 Mbps'], _xaxis_label=['1 Mbps', '2 Mbps', '3 Mbps', '4 Mbps', '5 Mbps'],
_graph_image_name="tos_download_2.4GHz", _graph_image_name=f"tos_download_{self.bands[0]}Hz",
_label=["BE", "BK", "VI", "VO"], _label=["BK", "BE", "VI", "VO"],
_step_size=1, _step_size=1,
_graph_title="Overall download throughput BK,BE,VO,VI traffic streams",
_title_size=16,
_color=['orangered', 'greenyellow', 'steelblue', 'blueviolet'],
_color_edge='black',
_bar_width=0.15,
_dpi=96,
_color_name=['orangered', 'greenyellow', 'steelblue', 'blueviolet'])
graph_png = graph.build_bar_graph()
print("graph name {}".format(graph_png))
report.set_graph_image(graph_png)
# need to move the graph image to the results
report.move_graph_image()
report.build_graph()
report.set_graph_title(f"Overall Packet loss for all {self.bands[0]} clients with different TOS.")
report.set_obj_html(_obj_title="", _obj="This graph shows the overall packet loss for the connected stations "
"for BK,BE,VO,VI traffic with intended load per station 1 Mbps, "
"2 Mbps, 3 Mbps, 4 Mbps, 5 Mbps")
report.build_graph_title()
report.build_objective()
graph = lf_bar_graph(_data_set=pkt_loss_df,
_xaxis_name="Load per Type of Service",
_yaxis_name="Packet Loss (%)",
_xaxis_categories=[1, 2, 3, 4, 5, 6],
_xaxis_label=['1 Mbps', '2 Mbps', '3 Mbps', '4 Mbps', '5 Mbps'],
_graph_image_name=f"pkt_loss_{self.bands[0]}Hz",
_label=["BK", "BE", "VI", "VO"],
_step_size=1,
_graph_title="Load vs Packet Loss",
_title_size=16,
_color=['orangered', 'greenyellow', 'steelblue', 'blueviolet'], _color=['orangered', 'greenyellow', 'steelblue', 'blueviolet'],
_color_edge='black', _color_edge='black',
_bar_width=0.15, _bar_width=0.15,
@@ -465,6 +536,8 @@ class ThroughputQOS(Realm):
report.move_graph_image() report.move_graph_image()
report.build_graph() report.build_graph()
self.generate_individual_graph(data, report) self.generate_individual_graph(data, report)
report.set_custom_html(_custom_html=self.test_setup_information(test_setup_data=input_setup_info, colmn="Information"))
report.build_custom()
report.write_html() report.write_html()
report.write_pdf() report.write_pdf()
@@ -476,18 +549,23 @@ class ThroughputQOS(Realm):
if len(res.keys()) > 0: if len(res.keys()) > 0:
count = 1 count = 1
for key in res: for key in res:
report.set_graph_title(_graph_title="Individual stations Download Throughput for the service Bk(WIFI) of load {}.".format(key)) report.set_graph_title(
_graph_title=f"Individual download throughput with intended load {key}/station for traffic BK(WiFi).")
report.set_obj_html(_obj_title="", report.set_obj_html(_obj_title="",
_obj="This is the individual throughput for {} number of clients running service BK".format( _obj=f"The below graph represents individual throughput for {len(self.sta_list)} clients running BK "
len(self.sta_list))) f"(WiFi) traffic. X- axis shows “number of clients” and Y-axis shows “"
f"Throughput in Mbps”.")
report.build_graph_title() report.build_graph_title()
report.build_objective() report.build_objective()
graph = lf_bar_graph(_data_set=[res[key]['bk']], _xaxis_name="Clients running - BK", graph = lf_bar_graph(_data_set=[res[key]['bk']], _xaxis_name="Clients running - BK",
_yaxis_name="Throughput in Mbps", _yaxis_name="Throughput in Mbps",
_xaxis_categories=[i for i in range(len(self.sta_list))], _xaxis_categories=[i+1 for i in range(len(self.sta_list))],
_xaxis_label=[i for i in range(len(self.sta_list))], _xaxis_label=[i+1 for i in range(len(self.sta_list))],
_label=["BK"], _label=["BK"],
_step_size=1, _step_size=1,
_xticks_font=8,
_graph_title="Individual download throughput for BK(WIFI) traffic - {} clients".format(self.bands[0]),
_title_size=16,
_bar_width=0.15, _color_name=['orangered'], _bar_width=0.15, _color_name=['orangered'],
_graph_image_name="{}_bk_{}".format(self.bands[0], count), _color_edge=['black'], _graph_image_name="{}_bk_{}".format(self.bands[0], count), _color_edge=['black'],
_color=['orangered']) _color=['orangered'])
@@ -497,18 +575,23 @@ class ThroughputQOS(Realm):
# need to move the graph image to the results # need to move the graph image to the results
report.move_graph_image() report.move_graph_image()
report.build_graph() report.build_graph()
report.set_graph_title(_graph_title="Individual stations Download Throughput for the service BE(WIFI) of load {}.".format(key)) report.set_graph_title(
_graph_title=f"Individual download throughput with intended load {key}/station for traffic BE(WiFi).")
report.set_obj_html(_obj_title="", report.set_obj_html(_obj_title="",
_obj="This is the individual throughput for {} number of clients running service BE".format( _obj=f"The below graph represents individual throughput for {len(self.sta_list)} clients running BE "
len(self.sta_list))) f"(WiFi) traffic. X- axis shows “number of clients” and Y-axis shows "
f"“Throughput in Mbps”.")
report.build_graph_title() report.build_graph_title()
report.build_objective() report.build_objective()
graph = lf_bar_graph(_data_set=[res[key]['be']], _xaxis_name="Clients running - BE", graph = lf_bar_graph(_data_set=[res[key]['be']], _xaxis_name="Clients running - BE",
_yaxis_name="Throughput in Mbps", _yaxis_name="Throughput in Mbps",
_xaxis_categories=[i for i in range(len(self.sta_list))], _xaxis_categories=[i+1 for i in range(len(self.sta_list))],
_xaxis_label=[i for i in range(len(self.sta_list))], _xaxis_label=[i+1 for i in range(len(self.sta_list))],
_label=["BE"], _label=["BE"],
_step_size=1, _step_size=1,
_xticks_font=8,
_graph_title="Individual download throughput for BE(WIFI) traffic - {} clients".format(self.bands[0]),
_title_size=16,
_bar_width=0.15, _color_name=['greenyellow'], _bar_width=0.15, _color_name=['greenyellow'],
_graph_image_name="{}_be_{}".format(self.bands[0], count), _color_edge=['black'], _graph_image_name="{}_be_{}".format(self.bands[0], count), _color_edge=['black'],
_color=['greenyellow']) _color=['greenyellow'])
@@ -518,20 +601,26 @@ class ThroughputQOS(Realm):
# need to move the graph image to the results # need to move the graph image to the results
report.move_graph_image() report.move_graph_image()
report.build_graph() report.build_graph()
report.set_graph_title(_graph_title="Individual stations Download Throughput for the service VI(WIFI) of load {}.".format(key)) report.set_graph_title(
_graph_title=f"Individual download throughput with intended load {key}/station for traffic VI(WiFi).")
report.set_obj_html(_obj_title="", report.set_obj_html(_obj_title="",
_obj="This is the individual throughput for {} number of clients running service VI".format( _obj=f"The below graph represents individual throughput for {len(self.sta_list)} clients running VI "
len(self.sta_list))) f"(WiFi) traffic. X- axis shows “number of clients” and Y-axis shows "
f"“Throughput in Mbps”.")
report.build_graph_title() report.build_graph_title()
report.build_objective() report.build_objective()
graph = lf_bar_graph(_data_set=[res[key]['video']], _xaxis_name="Clients running - VI", graph = lf_bar_graph(_data_set=[res[key]['video']], _xaxis_name="Clients running - VI",
_yaxis_name="Throughput in Mbps", _yaxis_name="Throughput in Mbps",
_xaxis_categories=[i for i in range(len(self.sta_list))], _xaxis_categories=[i+1 for i in range(len(self.sta_list))],
_xaxis_label=[i for i in range(len(self.sta_list))], _xaxis_label=[i+1 for i in range(len(self.sta_list))],
_label=["Video"], _label=["Video"],
_step_size=1, _step_size=1,
_xticks_font=8,
_graph_title="Individual download throughput for VI(WIFI) traffic - {} clients".format(self.bands[0]),
_title_size=16,
_bar_width=0.15, _color_name=['steelblue'], _bar_width=0.15, _color_name=['steelblue'],
_graph_image_name="{}_video_{}".format(self.bands[0], count), _color_edge=['black'], _graph_image_name="{}_video_{}".format(self.bands[0], count),
_color_edge=['black'],
_color=['steelblue']) _color=['steelblue'])
graph_png = graph.build_bar_graph() graph_png = graph.build_bar_graph()
print("graph name {}".format(graph_png)) print("graph name {}".format(graph_png))
@@ -539,20 +628,26 @@ class ThroughputQOS(Realm):
# need to move the graph image to the results # need to move the graph image to the results
report.move_graph_image() report.move_graph_image()
report.build_graph() report.build_graph()
report.set_graph_title(_graph_title="Individual stations Download Throughput for the service VO(WIFI) of load {}.".format(key)) report.set_graph_title(
_graph_title=f"Individual download throughput with intended load {key}/station for traffic VO(WiFi).")
report.set_obj_html(_obj_title="", report.set_obj_html(_obj_title="",
_obj="This is the individual throughput for {} number of clients running service VO".format( _obj=f"The below graph represents individual throughput for {len(self.sta_list)} clients running VO "
len(self.sta_list))) f"(WiFi) traffic. X- axis shows “number of clients” and Y-axis shows "
f"“Throughput in Mbps”.")
report.build_graph_title() report.build_graph_title()
report.build_objective() report.build_objective()
graph = lf_bar_graph(_data_set=[res[key]['voice']], _xaxis_name="Clients running - VO", graph = lf_bar_graph(_data_set=[res[key]['voice']], _xaxis_name="Clients running - VO",
_yaxis_name="Throughput in Mbps", _yaxis_name="Throughput in Mbps",
_xaxis_categories=[i for i in range(len(self.sta_list))], _xaxis_categories=[i+1 for i in range(len(self.sta_list))],
_xaxis_label=[i for i in range(len(self.sta_list))], _xaxis_label=[i+1 for i in range(len(self.sta_list))],
_label=['Voice'], _label=['Voice'],
_step_size=1, _step_size=1,
_xticks_font=8,
_graph_title="Individual download throughput for VO(WIFI) traffic - {} clients".format(self.bands[0]),
_title_size=16,
_bar_width=0.15, _color_name=['blueviolet'], _bar_width=0.15, _color_name=['blueviolet'],
_graph_image_name="{}_voice_{}".format(self.bands[0], count), _color_edge=['black'], _graph_image_name="{}_voice_{}".format(self.bands[0], count),
_color_edge=['black'],
_color=['blueviolet']) _color=['blueviolet'])
graph_png = graph.build_bar_graph() graph_png = graph.build_bar_graph()
print("graph name {}".format(graph_png)) print("graph name {}".format(graph_png))
@@ -564,6 +659,34 @@ class ThroughputQOS(Realm):
else: else:
print("No individual graph to generate.") print("No individual graph to generate.")
def test_setup_information(self, test_setup_data=None, colmn="Setup Information"):
# custom table for test-setup/input-setup information
if test_setup_data is None:
return None
else:
var = ""
for i in test_setup_data:
var = var + "<tr><td>" + i + "</td><td colspan='3'>" + str(test_setup_data[i]) + "</td></tr>"
setup_information = """
<!-- Test Setup Information -->
<br><br>
<table width='700px' border='1' cellpadding='2' cellspacing='0' style='border-top-color: gray; border-top-style: solid; border-top-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px'>
<tr>
<th colspan='2'> Test Setup Information </th>
</tr>
<tr>
<td>""" + colmn + """</td>
<td>
<table width='100%' border='0' cellpadding='2' cellspacing='0' style='border-top-color: gray; border-top-style: solid; border-top-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px'>
""" + str(var) + """
</table>
</td>
</tr>
</table>
<br><br>
"""
return str(setup_information)
def main(): def main():
parser = Realm.create_basic_argparse( parser = Realm.create_basic_argparse(
@@ -605,6 +728,7 @@ python3 ./throughput_QOS.py
--b_min 1000 --b_min 1000
--ap "00:0e:8e:78:e1:76" --ap "00:0e:8e:78:e1:76"
--debug --debug
--ap_name Netgear RC6700
--upstream_port eth1 (upstream Port) --upstream_port eth1 (upstream Port)
--traffic_type lf_udp (traffic type, lf_udp | lf_tcp) --traffic_type lf_udp (traffic type, lf_udp | lf_tcp)
--test_duration 5m (duration to run traffic 5m --> 5 Minutes) --test_duration 5m (duration to run traffic 5m --> 5 Minutes)
@@ -622,6 +746,7 @@ python3 ./throughput_QOS.py
parser.add_argument('--sta_names', help='Used to force a connection to a particular AP', default="sta0000") parser.add_argument('--sta_names', help='Used to force a connection to a particular AP', default="sta0000")
parser.add_argument('--tos', help='used to provide different ToS settings: BK | BE | VI | VO | numeric', parser.add_argument('--tos', help='used to provide different ToS settings: BK | BE | VI | VO | numeric',
default="Best Effort") default="Best Effort")
parser.add_argument('--ap_name', help="AP Model Name", default="Test-AP")
parser.add_argument('--bands', help='used to run on multiple radio bands,can be used with multiple stations', parser.add_argument('--bands', help='used to run on multiple radio bands,can be used with multiple stations',
default="2,4G, 5G, BOTH", required=True) default="2,4G, 5G, BOTH", required=True)
parser.add_argument('--ssid_2g', help="ssid for 2.4Ghz band") parser.add_argument('--ssid_2g', help="ssid for 2.4Ghz band")
@@ -640,6 +765,7 @@ python3 ./throughput_QOS.py
bands = [] bands = []
radios = [] radios = []
station_list = [] station_list = []
if (args.a_min is not None) and (args.b_min is not None): if (args.a_min is not None) and (args.b_min is not None):
if (type(args.a_min) is not int) and (type(args.b_min) is not int): if (type(args.a_min) is not int) and (type(args.b_min) is not int):
args.a_min = args.a_min.split(',') args.a_min = args.a_min.split(',')
@@ -661,6 +787,9 @@ python3 ./throughput_QOS.py
if args.test_duration is not None: if args.test_duration is not None:
args.test_duration = args.test_duration.strip('m') args.test_duration = args.test_duration.strip('m')
test_start_time = datetime.datetime.now().strftime("%b %d %H:%M:%S")
print("Test started at: ", test_start_time)
for i in range(len(bands)): for i in range(len(bands)):
if bands[i] == "2.4G" or bands[i] == "2.4g": if bands[i] == "2.4G" or bands[i] == "2.4g":
args.bands = bands[i] args.bands = bands[i]
@@ -722,6 +851,7 @@ python3 ./throughput_QOS.py
throughput_qos = ThroughputQOS(host=args.mgr, throughput_qos = ThroughputQOS(host=args.mgr,
port=args.mgr_port, port=args.mgr_port,
number_template="0000", number_template="0000",
ap_name=args.ap_name,
sta_list=station_list, sta_list=station_list,
create_sta=args.create_sta, create_sta=args.create_sta,
name_prefix="TOS-", name_prefix="TOS-",
@@ -754,10 +884,10 @@ python3 ./throughput_QOS.py
if not throughput_qos.passes(): if not throughput_qos.passes():
print(throughput_qos.get_fail_message()) print(throughput_qos.get_fail_message())
throughput_qos.exit_fail() throughput_qos.exit_fail()
# try: try:
# layer3connections = ','.join([[*x.keys()][0] for x in throughput_qos.json_get('endp')['endpoint']]) layer3connections = ','.join([[*x.keys()][0] for x in throughput_qos.json_get('endp')['endpoint']])
# except: except:
# raise ValueError('Try setting the upstream port flag if your device does not have an eth1 port') raise ValueError('Try setting the upstream port flag if your device does not have an eth1 port')
throughput_qos.start(False, False) throughput_qos.start(False, False)
time.sleep(int(args.test_duration) * 60) time.sleep(int(args.test_duration) * 60)
@@ -772,8 +902,27 @@ python3 ./throughput_QOS.py
throughput_qos.success() throughput_qos.success()
throughput_qos.cleanup() throughput_qos.cleanup()
test_end_time = datetime.datetime.now().strftime("%b %d %H:%M:%S")
print("Test ended at: ", test_end_time)
test_setup_info = {
"AP Model": throughput_qos.ap_name,
"SSID": throughput_qos.ssid,
"SSID - 2.4 Ghz": throughput_qos.ssid_2g,
"SSID - 5 Ghz": throughput_qos.ssid_5g,
"Test Duration": datetime.datetime.strptime(test_end_time, "%b %d %H:%M:%S") - datetime.datetime.strptime(test_start_time, "%b %d %H:%M:%S")
}
if throughput_qos.ssid is None:
test_setup_info.pop("SSID")
else:
if throughput_qos.ssid_2g is None:
test_setup_info.pop("SSID - 2.4 Ghz")
if throughput_qos.ssid_5g is None:
test_setup_info.pop("SSID - 5 Ghz")
input_setup_info = {
"contact": "support@candelatech.com"
}
data = test_results data = test_results
#throughput_qos.generate_report(data=data) throughput_qos.generate_report(data=data, test_setup_info=test_setup_info, input_setup_info=input_setup_info)
if __name__ == "__main__": if __name__ == "__main__":