mirror of
https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
synced 2025-11-01 19:28:00 +00:00
Create port_probe.py and update l3_cxprofile and test_ip_variable_time so that they can use port_probe.py
Signed-off-by: Matthew Stidham <stidmatt@gmail.com>
This commit is contained in:
@@ -13,7 +13,8 @@ sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../")))
|
|||||||
lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base")
|
lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base")
|
||||||
LFCliBase = lfcli_base.LFCliBase
|
LFCliBase = lfcli_base.LFCliBase
|
||||||
pandas_extensions = importlib.import_module("py-json.LANforge.pandas_extensions")
|
pandas_extensions = importlib.import_module("py-json.LANforge.pandas_extensions")
|
||||||
|
port_probe = importlib.import_module("py-json.port_probe")
|
||||||
|
ProbePort = port_probe.ProbePort
|
||||||
|
|
||||||
class L3CXProfile(LFCliBase):
|
class L3CXProfile(LFCliBase):
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
@@ -120,7 +121,6 @@ class L3CXProfile(LFCliBase):
|
|||||||
layer3_cols=None,
|
layer3_cols=None,
|
||||||
port_mgr_cols=None,
|
port_mgr_cols=None,
|
||||||
created_cx=None,
|
created_cx=None,
|
||||||
monitor=True,
|
|
||||||
report_file=None,
|
report_file=None,
|
||||||
systeminfopath=None,
|
systeminfopath=None,
|
||||||
output_format=None,
|
output_format=None,
|
||||||
@@ -221,18 +221,8 @@ class L3CXProfile(LFCliBase):
|
|||||||
passes += 1
|
passes += 1
|
||||||
else:
|
else:
|
||||||
self.fail("FAIL: Not all stations increased traffic")
|
self.fail("FAIL: Not all stations increased traffic")
|
||||||
self.exit_fail()
|
|
||||||
|
|
||||||
if port_mgr_cols is not None:
|
result = dict() # create dataframe from layer 3 results
|
||||||
result = dict()
|
|
||||||
for dictionary in port_mgr_response['interfaces']:
|
|
||||||
if debug:
|
|
||||||
print('port mgr data: %s' % dictionary)
|
|
||||||
result.update(dictionary)
|
|
||||||
portdata_df = pd.DataFrame(result.values())
|
|
||||||
portdata_df['EID'] = result.keys()
|
|
||||||
|
|
||||||
result = dict()
|
|
||||||
if type(layer_3_response) is dict:
|
if type(layer_3_response) is dict:
|
||||||
for dictionary in layer_3_response['endpoint']:
|
for dictionary in layer_3_response['endpoint']:
|
||||||
if debug:
|
if debug:
|
||||||
@@ -241,12 +231,51 @@ class L3CXProfile(LFCliBase):
|
|||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
layer3 = pd.DataFrame(result.values())
|
layer3 = pd.DataFrame(result.values())
|
||||||
layer3['EID'] = result.keys()
|
layer3.columns = ['l3-'+x for x in layer3.columns]
|
||||||
|
|
||||||
if port_mgr_cols is not None:
|
if port_mgr_cols is not None: # create dataframe from port mgr results
|
||||||
timestamp_df = pd.concat([layer3, portdata_df])
|
if 'alias' not in port_mgr_cols:
|
||||||
|
port_mgr_cols.append('alias')
|
||||||
|
result = dict()
|
||||||
|
if type(port_mgr_response) is dict:
|
||||||
|
for dictionary in port_mgr_response['interfaces']:
|
||||||
|
if debug:
|
||||||
|
print('port mgr data: %s' % dictionary)
|
||||||
|
result.update(dictionary)
|
||||||
|
portdata_df = pd.DataFrame(result.values())
|
||||||
|
portdata_df.columns = ['port-'+x for x in portdata_df.columns]
|
||||||
|
portdata_df['alias'] = portdata_df['port-alias']
|
||||||
|
|
||||||
|
layer3_alias = list() # Add alias to layer 3 dataframe
|
||||||
|
for cross_connect in layer3['l3-name']:
|
||||||
|
for port in portdata_df['port-alias']:
|
||||||
|
if port in cross_connect:
|
||||||
|
layer3_alias.append(port)
|
||||||
|
layer3['alias'] = layer3_alias
|
||||||
|
|
||||||
|
timestamp_df = pd.merge(layer3, portdata_df, on='alias')
|
||||||
else:
|
else:
|
||||||
timestamp_df = layer3
|
timestamp_df = layer3
|
||||||
|
probe_port_df_list = list()
|
||||||
|
for station in sta_list:
|
||||||
|
probe_port = ProbePort(lfhost=self.lfclient_host,
|
||||||
|
lfport=self.lfclient_port,
|
||||||
|
eid_str=station,
|
||||||
|
debug=self.debug)
|
||||||
|
probe_results = dict()
|
||||||
|
probe_port.refreshProbe()
|
||||||
|
probe_results['Signal Avg Combined'] = probe_port.getSignalAvgCombined()
|
||||||
|
probe_results['Signal Avg per Chain'] = probe_port.getSignalAvgPerChain()
|
||||||
|
probe_results['Signal Combined'] = probe_port.getSignalCombined()
|
||||||
|
probe_results['Signal per Chain'] = probe_port.getSignalPerChain()
|
||||||
|
probe_results['Beacon Avg Signal'] = probe_port.getBeaconSignalAvg()
|
||||||
|
probe_df_initial = pd.DataFrame(probe_results.values()).transpose()
|
||||||
|
probe_df_initial.columns = probe_results.keys()
|
||||||
|
probe_df_initial.columns = ['probe '+x for x in probe_df_initial.columns]
|
||||||
|
probe_df_initial['alias'] = station.split('.')[-1]
|
||||||
|
probe_port_df_list.append(probe_df_initial)
|
||||||
|
probe_port_df = pd.concat(probe_port_df_list)
|
||||||
|
timestamp_df = pd.merge(timestamp_df, probe_port_df, on='alias')
|
||||||
timestamp_df['Timestamp'] = timestamp
|
timestamp_df['Timestamp'] = timestamp
|
||||||
timestamp_df['Timestamp milliseconds epoch'] = t_to_millisec_epoch
|
timestamp_df['Timestamp milliseconds epoch'] = t_to_millisec_epoch
|
||||||
timestamp_df['Timestamp seconds epoch'] = t_to_sec_epoch
|
timestamp_df['Timestamp seconds epoch'] = t_to_sec_epoch
|
||||||
@@ -254,6 +283,7 @@ class L3CXProfile(LFCliBase):
|
|||||||
timestamp_data.append(timestamp_df)
|
timestamp_data.append(timestamp_df)
|
||||||
time.sleep(monitor_interval_ms)
|
time.sleep(monitor_interval_ms)
|
||||||
df = pd.concat(timestamp_data)
|
df = pd.concat(timestamp_data)
|
||||||
|
df = df.drop('alias', 1)
|
||||||
df.to_csv(str(report_file), index=False)
|
df.to_csv(str(report_file), index=False)
|
||||||
|
|
||||||
# comparison to last report / report inputted
|
# comparison to last report / report inputted
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
from LANforge.lfcli_base import LFCliBase
|
import importlib
|
||||||
|
from time import sleep
|
||||||
|
lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base")
|
||||||
|
LFCliBase = lfcli_base.LFCliBase
|
||||||
|
# Probe data can change frequently. It is recommended to update
|
||||||
|
|
||||||
class ProbePort(LFCliBase):
|
class ProbePort(LFCliBase):
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
@@ -19,8 +22,12 @@ class ProbePort(LFCliBase):
|
|||||||
|
|
||||||
def refreshProbe(self):
|
def refreshProbe(self):
|
||||||
self.json_post(self.probepath, {})
|
self.json_post(self.probepath, {})
|
||||||
|
sleep(0.2)
|
||||||
response = self.json_get(self.probepath)
|
response = self.json_get(self.probepath)
|
||||||
self.response = response
|
self.response = response
|
||||||
|
if self.debug:
|
||||||
|
print(self.probepath)
|
||||||
|
print(response)
|
||||||
text = self.response['probe-results'][0][self.eid_str]['probe results'].split('\n')
|
text = self.response['probe-results'][0][self.eid_str]['probe results'].split('\n')
|
||||||
signals = [x.strip('\t').split('\t') for x in text if 'signal' in x]
|
signals = [x.strip('\t').split('\t') for x in text if 'signal' in x]
|
||||||
keys = [x[0].strip(' ').strip(':') for x in signals]
|
keys = [x[0].strip(' ').strip(':') for x in signals]
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../")))
|
|||||||
LFUtils = importlib.import_module("py-json.LANforge.LFUtils")
|
LFUtils = importlib.import_module("py-json.LANforge.LFUtils")
|
||||||
realm = importlib.import_module("py-json.realm")
|
realm = importlib.import_module("py-json.realm")
|
||||||
Realm = realm.Realm
|
Realm = realm.Realm
|
||||||
|
sys.path.append("../py-dashboard")
|
||||||
|
from InfluxRequest import RecordInflux
|
||||||
|
port_probe = importlib.import_module("py-json.port_probe")
|
||||||
|
|
||||||
|
|
||||||
class IPVariableTime(Realm):
|
class IPVariableTime(Realm):
|
||||||
@@ -63,6 +66,7 @@ class IPVariableTime(Realm):
|
|||||||
report_file=None,
|
report_file=None,
|
||||||
output_format=None,
|
output_format=None,
|
||||||
layer3_cols=None,
|
layer3_cols=None,
|
||||||
|
port_mgr_cols=None,
|
||||||
monitor_interval='10s',
|
monitor_interval='10s',
|
||||||
influx_host=None,
|
influx_host=None,
|
||||||
influx_port=None,
|
influx_port=None,
|
||||||
@@ -125,6 +129,7 @@ class IPVariableTime(Realm):
|
|||||||
self.report_file = report_file
|
self.report_file = report_file
|
||||||
self.output_format = output_format
|
self.output_format = output_format
|
||||||
self.layer3_cols = layer3_cols
|
self.layer3_cols = layer3_cols
|
||||||
|
self.port_mgr_cols = port_mgr_cols
|
||||||
self.monitor_interval = monitor_interval
|
self.monitor_interval = monitor_interval
|
||||||
self.influx_host = influx_host
|
self.influx_host = influx_host
|
||||||
self.influx_port = influx_port
|
self.influx_port = influx_port
|
||||||
@@ -234,22 +239,22 @@ class IPVariableTime(Realm):
|
|||||||
else:
|
else:
|
||||||
layer3_cols = self.layer3_cols
|
layer3_cols = self.layer3_cols
|
||||||
# send col names here to file to reformat
|
# send col names here to file to reformat
|
||||||
#if type(self.port_mgr_cols) is not list:
|
if type(self.port_mgr_cols) is not list:
|
||||||
#port_mgr_cols = list(self.port_mgr_cols.split(","))
|
port_mgr_cols = list(self.port_mgr_cols.split(","))
|
||||||
# send col names here to file to reformat
|
# send col names here to file to reformat
|
||||||
#else:
|
else:
|
||||||
#port_mgr_cols = self.port_mgr_cols
|
port_mgr_cols = self.port_mgr_cols
|
||||||
# send col names here to file to reformat
|
# send col names here to file to reformat
|
||||||
if self.debug:
|
if self.debug:
|
||||||
print("Layer 3 Endp column names are...")
|
print("Layer 3 Endp column names are...")
|
||||||
print(layer3_cols)
|
print(layer3_cols)
|
||||||
print("Port Manager column names are...")
|
print("Port Manager column names are...")
|
||||||
#print(port_mgr_cols)
|
print(port_mgr_cols)
|
||||||
|
|
||||||
print("Layer 3 Endp column names are...")
|
print("Layer 3 Endp column names are...")
|
||||||
print(layer3_cols)
|
print(layer3_cols)
|
||||||
print("Port Manager column names are...")
|
print("Port Manager column names are...")
|
||||||
#print(port_mgr_cols)
|
print(port_mgr_cols)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
monitor_interval = Realm.parse_time(self.monitor_interval).total_seconds()
|
monitor_interval = Realm.parse_time(self.monitor_interval).total_seconds()
|
||||||
@@ -266,13 +271,12 @@ class IPVariableTime(Realm):
|
|||||||
# manager = self.influx_mgr
|
# manager = self.influx_mgr
|
||||||
|
|
||||||
if self.influx_org is not None:
|
if self.influx_org is not None:
|
||||||
from InfluxRequest import RecordInflux
|
|
||||||
grapher = RecordInflux(_influx_host=self.influx_host,
|
grapher = RecordInflux(_influx_host=self.influx_host,
|
||||||
_influx_port=self.influx_port,
|
_influx_port=self.influx_port,
|
||||||
_influx_org=self.influx_org,
|
_influx_org=self.influx_org,
|
||||||
_influx_token=self.influx_token,
|
_influx_token=self.influx_token,
|
||||||
_influx_bucket=self.influx_bucket)
|
_influx_bucket=self.influx_bucket)
|
||||||
devices = [station.split('.')[-1] for station in station_list]
|
devices = [station.split('.')[-1] for station in self.sta_list]
|
||||||
tags = dict()
|
tags = dict()
|
||||||
tags['script'] = 'test_ip_variable_time'
|
tags['script'] = 'test_ip_variable_time'
|
||||||
try:
|
try:
|
||||||
@@ -285,7 +289,6 @@ class IPVariableTime(Realm):
|
|||||||
monitor_interval=Realm.parse_time(self.monitor_interval).total_seconds(),
|
monitor_interval=Realm.parse_time(self.monitor_interval).total_seconds(),
|
||||||
tags=tags)
|
tags=tags)
|
||||||
|
|
||||||
|
|
||||||
# Retrieve last data file
|
# Retrieve last data file
|
||||||
compared_rept = None
|
compared_rept = None
|
||||||
if self.compared_report:
|
if self.compared_report:
|
||||||
@@ -299,7 +302,7 @@ class IPVariableTime(Realm):
|
|||||||
|
|
||||||
self.cx_profile.monitor(layer3_cols=layer3_cols,
|
self.cx_profile.monitor(layer3_cols=layer3_cols,
|
||||||
sta_list=self.sta_list,
|
sta_list=self.sta_list,
|
||||||
# port_mgr_cols=port_mgr_cols,
|
port_mgr_cols=port_mgr_cols,
|
||||||
report_file=report_f,
|
report_file=report_f,
|
||||||
systeminfopath=systeminfopath,
|
systeminfopath=systeminfopath,
|
||||||
duration_sec=Realm.parse_time(self.test_duration).total_seconds(),
|
duration_sec=Realm.parse_time(self.test_duration).total_seconds(),
|
||||||
@@ -443,13 +446,91 @@ python3 ./test_ip_variable_time.py
|
|||||||
Elapsed | 'elapsed'
|
Elapsed | 'elapsed'
|
||||||
Destination Addr | 'destination addr'
|
Destination Addr | 'destination addr'
|
||||||
Source Addr | 'source addr'
|
Source Addr | 'source addr'
|
||||||
|
|
||||||
|
Using the port_mgr_cols flag:
|
||||||
|
'4way time (us)'
|
||||||
|
'activity'
|
||||||
|
'alias'
|
||||||
|
'anqp time (us)'
|
||||||
|
'ap'
|
||||||
|
'beacon'
|
||||||
|
'bps rx'
|
||||||
|
'bps rx ll'
|
||||||
|
'bps tx'
|
||||||
|
'bps tx ll'
|
||||||
|
'bytes rx ll'
|
||||||
|
'bytes tx ll'
|
||||||
|
'channel'
|
||||||
|
'collisions'
|
||||||
|
'connections'
|
||||||
|
'crypt'
|
||||||
|
'cx ago'
|
||||||
|
'cx time (us)'
|
||||||
|
'device'
|
||||||
|
'dhcp (ms)'
|
||||||
|
'down'
|
||||||
|
'entity id'
|
||||||
|
'gateway ip'
|
||||||
|
'ip'
|
||||||
|
'ipv6 address'
|
||||||
|
'ipv6 gateway'
|
||||||
|
'key/phrase'
|
||||||
|
'login-fail'
|
||||||
|
'login-ok'
|
||||||
|
'logout-fail'
|
||||||
|
'logout-ok'
|
||||||
|
'mac'
|
||||||
|
'mask'
|
||||||
|
'misc'
|
||||||
|
'mode'
|
||||||
|
'mtu'
|
||||||
|
'no cx (us)'
|
||||||
|
'noise'
|
||||||
|
'parent dev'
|
||||||
|
'phantom'
|
||||||
|
'port'
|
||||||
|
'port type'
|
||||||
|
'pps rx'
|
||||||
|
'pps tx'
|
||||||
|
'qlen'
|
||||||
|
'reset'
|
||||||
|
'retry failed'
|
||||||
|
'rx bytes'
|
||||||
|
'rx crc'
|
||||||
|
'rx drop'
|
||||||
|
'rx errors'
|
||||||
|
'rx fifo'
|
||||||
|
'rx frame'
|
||||||
|
'rx length'
|
||||||
|
'rx miss'
|
||||||
|
'rx over'
|
||||||
|
'rx pkts'
|
||||||
|
'rx-rate'
|
||||||
|
'sec'
|
||||||
|
'signal'
|
||||||
|
'ssid'
|
||||||
|
'status'
|
||||||
|
'time-stamp'
|
||||||
|
'tx abort'
|
||||||
|
'tx bytes'
|
||||||
|
'tx crr'
|
||||||
|
'tx errors'
|
||||||
|
'tx fifo'
|
||||||
|
'tx hb'
|
||||||
|
'tx pkts'
|
||||||
|
'tx wind'
|
||||||
|
'tx-failed %'
|
||||||
|
'tx-rate'
|
||||||
|
'wifi retries'
|
||||||
|
|
||||||
|
Can't decide what columns to use? You can just use 'all' to select all available columns from both tables.
|
||||||
''')
|
''')
|
||||||
|
|
||||||
parser.add_argument('--mode', help='Used to force mode of stations')
|
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('--ap', help='Used to force a connection to a particular AP')
|
||||||
parser.add_argument('--traffic_type', help='Select the Traffic Type [lf_udp, lf_tcp, udp, tcp], type will be '
|
parser.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',
|
||||||
, required=True)
|
required=True)
|
||||||
parser.add_argument('--output_format', help='choose either csv or xlsx')
|
parser.add_argument('--output_format', help='choose either csv or xlsx')
|
||||||
parser.add_argument('--report_file', help='where you want to store results', default=None)
|
parser.add_argument('--report_file', help='where you want to store results', default=None)
|
||||||
parser.add_argument('--a_min', help='--a_min bps rate minimum for side_a', default=256000)
|
parser.add_argument('--a_min', help='--a_min bps rate minimum for side_a', default=256000)
|
||||||
@@ -458,7 +539,7 @@ python3 ./test_ip_variable_time.py
|
|||||||
parser.add_argument('--layer3_cols', help='Columns wished to be monitored from layer 3 endpoint tab',
|
parser.add_argument('--layer3_cols', help='Columns wished to be monitored from layer 3 endpoint tab',
|
||||||
default=['name', 'tx bytes', 'rx bytes', 'tx rate', 'rx rate'])
|
default=['name', 'tx bytes', 'rx bytes', 'tx rate', 'rx rate'])
|
||||||
parser.add_argument('--port_mgr_cols', help='Columns wished to be monitored from port manager tab',
|
parser.add_argument('--port_mgr_cols', help='Columns wished to be monitored from port manager tab',
|
||||||
default=['ap', 'ip', 'parent dev'])
|
default=['alias', 'ap', 'ip', 'parent dev', 'rx-rate', 'beacon'])
|
||||||
parser.add_argument('--compared_report', help='report path and file which is wished to be compared with new report',
|
parser.add_argument('--compared_report', help='report path and file which is wished to be compared with new report',
|
||||||
default=None)
|
default=None)
|
||||||
parser.add_argument('--monitor_interval',
|
parser.add_argument('--monitor_interval',
|
||||||
@@ -487,8 +568,8 @@ python3 ./test_ip_variable_time.py
|
|||||||
num_sta = int(args.num_stations)
|
num_sta = int(args.num_stations)
|
||||||
if args.create_sta:
|
if args.create_sta:
|
||||||
station_list = LFUtils.portNameSeries(prefix_="sta", start_id_=0, end_id_=num_sta - 1,
|
station_list = LFUtils.portNameSeries(prefix_="sta", start_id_=0, end_id_=num_sta - 1,
|
||||||
padding_number_=10000,
|
padding_number_=10000,
|
||||||
radio=args.radio)
|
radio=args.radio)
|
||||||
else:
|
else:
|
||||||
station_list = args.sta_names.split(",")
|
station_list = args.sta_names.split(",")
|
||||||
# Create directory
|
# Create directory
|
||||||
@@ -534,6 +615,7 @@ python3 ./test_ip_variable_time.py
|
|||||||
report_file=args.report_file,
|
report_file=args.report_file,
|
||||||
output_format=args.output_format,
|
output_format=args.output_format,
|
||||||
layer3_cols=args.layer3_cols,
|
layer3_cols=args.layer3_cols,
|
||||||
|
port_mgr_cols=args.port_mgr_cols,
|
||||||
monitor_interval=args.monitor_interval,
|
monitor_interval=args.monitor_interval,
|
||||||
influx_host=args.influx_host,
|
influx_host=args.influx_host,
|
||||||
influx_port=args.influx_port,
|
influx_port=args.influx_port,
|
||||||
|
|||||||
Reference in New Issue
Block a user