mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-30 18:27:53 +00:00 
			
		
		
		
	Refactored code to fit with PEP8 specifications and work with LFcliBase.
This commit is contained in:
		| @@ -2,428 +2,417 @@ | ||||
| import os | ||||
| import sys | ||||
| import time | ||||
|  | ||||
| sys.path.append('py-json') | ||||
| import json | ||||
| import pprint | ||||
| import datetime | ||||
| from LANforge import LFRequest | ||||
| from LANforge import LFUtils | ||||
| import argparse | ||||
| import re | ||||
| import math | ||||
| import string | ||||
| import emailHelper | ||||
|  | ||||
| debugOn = False | ||||
|  | ||||
| sender = "lanforge@candelatech.com" | ||||
|  | ||||
| def jsonReq(mgrURL, reqURL, data, debug=False): | ||||
| 	lf_r = LFRequest.LFRequest(mgrURL + reqURL) | ||||
| 	lf_r.addPostData(data) | ||||
|  | ||||
| 	if debug: | ||||
|                 json_response = lf_r.jsonPost(debug) | ||||
|                 LFUtils.debug_printer.pprint(json_response) | ||||
|                 sys.exit(1) | ||||
| 	else: | ||||
|              	lf_r.jsonPost(debug) | ||||
|  | ||||
|  | ||||
| def execWrap(cmd): | ||||
|         if os.system(cmd) != 0: | ||||
|                 print("\nError with " + cmd + ",bye\n") | ||||
|                 exit(1) | ||||
|  | ||||
| def getJsonInfo(mgrURL, reqURL): | ||||
| 	lf_r = LFRequest.LFRequest(mgrURL + reqURL) | ||||
| 	json_response = lf_r.getAsJson(debugOn) | ||||
| 	return json_response | ||||
|  | ||||
|  | ||||
| parser = argparse.ArgumentParser(description="Create max stations for each radio") | ||||
| parser.add_argument("--test_duration", type=str, help="Full duration for the test to run. Should be specified by a number followed by a character. d for days, h for hours, m for minutes, s for seconds") | ||||
| parser.add_argument("--test_end_time", type=str, help="Specify a time and date to end the test. Should be formatted as year-month-date_hour:minute. Date should be specified in numbers and time should be 24 hour format. Ex: 2020-5-14_14:30") | ||||
| parser.add_argument("--report_interval", type=str, help="How often a report is made. Should be specified by a number followed by a character. d for days, h for hours, m for minutes, s for seconds") | ||||
| parser.add_argument("--output_dir", type=str, help="Directory to ouptut to") | ||||
| parser.add_argument("--output_prefix", type=str, help="Name of the file. Timestamp and .html will be appended to the end") | ||||
| parser.add_argument("--email", type=str, help="Email address of recipient") | ||||
|  | ||||
|  | ||||
| args = None | ||||
| try: | ||||
| 	args = parser.parse_args() | ||||
| 	if (args.test_duration is not None): | ||||
| 		pattern = re.compile("^(\d+)([dhms]$)") | ||||
| 		td = pattern.match(args.test_duration) | ||||
| 		if td != None: | ||||
| 			durTime = int(td.group(1)) | ||||
| 			durMeasure = str(td.group(2)) | ||||
| 			now = datetime.datetime.now() | ||||
| 			if durMeasure == "d": | ||||
| 				durationTime = datetime.timedelta(days = durTime) | ||||
| 			elif durMeasure == "h": | ||||
| 				durationTime = datetime.timedelta(hours = durTime) | ||||
| 			elif durMeasure == "m": | ||||
| 				durationTime = datetime.timedelta(minutes = durTime) | ||||
| 			else: | ||||
| 				durationTime = datetime.timedelta(seconds = durTime) | ||||
| 		else: | ||||
| 			parser.print_help() | ||||
| 			parser.exit() | ||||
|  | ||||
| 	elif (args.test_end_time is not None): | ||||
| 		now = datetime.datetime.now() | ||||
| 		try: | ||||
| 			endTime = datetime.datetime.strptime(args.test_end_time,"%Y-%m-%d_%H:%M") | ||||
| 			if endTime < now: | ||||
| 				raise ValueError | ||||
| 				parser.print_help() | ||||
| 				parser.exit() | ||||
| 			else: | ||||
| 				curTime = datetime.datetime.now() | ||||
| 				durationTime = endTime - curTime | ||||
|  | ||||
| 		except ValueError as exception: | ||||
| 			print(exception) | ||||
| 			parser.print_help() | ||||
| 			parser.exit() | ||||
|  | ||||
| 	else: | ||||
| 		parser.print_help() | ||||
| 		parser.exit() | ||||
|  | ||||
|  | ||||
| 	if (args.report_interval is not None): | ||||
| 		pattern = re.compile("^(\d+)([dhms])$") | ||||
| 		ri = pattern.match(args.report_interval) | ||||
| 		if ri != None: | ||||
| 			intTime = int(ri.group(1)) | ||||
| 			intMeasure = str(ri.group(2)) | ||||
|  | ||||
| 			if intMeasure == "d": | ||||
|                         	intervalTime = datetime.timedelta(days = intTime) | ||||
| 			elif intMeasure == "h": | ||||
| 				intervalTime = datetime.timedelta(hours = intTime) | ||||
| 			elif intMeasure == "m": | ||||
| 				intervalTime = datetime.timedelta(minutes = intTime) | ||||
| 			else: | ||||
| 				intervalTime = datetime.timedelta(seconds = intTime) | ||||
| 		else: | ||||
| 			parser.print_help() | ||||
| 			parser.exit() | ||||
| 	else: | ||||
| 		parser.print_help() | ||||
| 		parser.exit() | ||||
|  | ||||
| 	if (args.output_dir != None): | ||||
| 		outputDir = args.output_dir | ||||
| 	else: | ||||
| 		parser.print_help() | ||||
| 		parser.exit() | ||||
|  | ||||
| 	if (args.output_prefix != None): | ||||
| 		outputPrefix = args.output_prefix | ||||
| 	else: | ||||
| 		parser.print_help() | ||||
| 		parser.exit() | ||||
| 	if (args.email != None): | ||||
| 		recipient = args.email | ||||
| 	else: | ||||
| 		parser.print_help() | ||||
| 		parser.exit() | ||||
|  | ||||
|  | ||||
| except Exception as e: | ||||
|       logging.exception(e) | ||||
|       usage() | ||||
|       exit(2) | ||||
|  | ||||
|  | ||||
| stations = [] | ||||
| radios = {"wiphy0":200, #max 200 | ||||
| 	  "wiphy1":200, #max 200 | ||||
| 	  "wiphy2":64,  #max 64 | ||||
| 	  "wiphy3":200} #max 200 | ||||
| 			#radioName:numStations | ||||
| radio_ssid_map = {"wiphy0":"jedway-wpa2-x2048-4-1", | ||||
| 		  "wiphy1":"jedway-wpa2-x2048-5-3", | ||||
| 		  "wiphy2":"jedway-wpa2-x2048-5-1", | ||||
| 		  "wiphy3":"jedway-wpa2-x2048-4-4"} | ||||
|  | ||||
| ssid_passphrase_map = {"jedway-wpa2-x2048-4-1":"jedway-wpa2-x2048-4-1", | ||||
| 		       "jedway-wpa2-x2048-5-3":"jedway-wpa2-x2048-5-3", | ||||
| 		       "jedway-wpa2-x2048-5-1":"jedway-wpa2-x2048-5-1", | ||||
| 		       "jedway-wpa2-x2048-4-4":"jedway-wpa2-x2048-4-4"} | ||||
|  | ||||
| paddingNum = 1000 #uses all but the first number to create names for stations | ||||
|  | ||||
| mgrURL = "http://localhost:8080/" | ||||
|  | ||||
| #clean up old stations | ||||
| print("Cleaning up old Stations") | ||||
|  | ||||
| for radio, numStations in radios.items(): | ||||
| 	for i in range(0,numStations): | ||||
| 		staName = "sta" + radio[-1:] + str(paddingNum + i)[1:] | ||||
| 		if getJsonInfo(mgrURL, "port/1/1/"+staName) != None: | ||||
| 			reqURL = "cli-json/rm_vlan" | ||||
|  | ||||
| 			data = { | ||||
| 			"shelf":1, | ||||
| 			"resource":1, | ||||
| 			"port":staName | ||||
| 			} | ||||
|  | ||||
| 			jsonReq(mgrURL, reqURL, data) | ||||
|  | ||||
| 			reqURL = "cli-json/rm_cx" | ||||
|  | ||||
| 			data = { | ||||
| 			"test_mgr":"default_tm", | ||||
| 			"cx_name":staName | ||||
| 			} | ||||
| 			jsonReq(mgrURL, reqURL, data) | ||||
|  | ||||
| 			reqURL = "cli-json/rm_endp" | ||||
|  | ||||
| 			data = { | ||||
| 			"endp_name":staName + "-A" | ||||
| 			} | ||||
|  | ||||
| 			jsonReq(mgrURL, reqURL, data) | ||||
|  | ||||
| 			reqURL = "cli-json/rm_endp" | ||||
| 			data = { | ||||
| 			"endp_name":staName + "-B" | ||||
| 			} | ||||
|  | ||||
| #create new stations | ||||
| print("Creating Stations") | ||||
|  | ||||
| reqURL = "cli-json/add_sta" | ||||
| for radio, numStations in radios.items(): | ||||
| 	for i in range(0,numStations): | ||||
| 		staName = "sta" + radio[-1:] + str(paddingNum + i)[1:] | ||||
| 		stations.append(staName) | ||||
| 		data = { | ||||
| 		"shelf":1, | ||||
| 		"resource":1, | ||||
| 		"radio":radio, | ||||
| 		"sta_name":staName, | ||||
| 		"ssid":radio_ssid_map[radio], | ||||
| 		"key":ssid_passphrase_map[radio_ssid_map[radio]], | ||||
| 		"mode":1, | ||||
| 		"mac":"xx:xx:xx:xx:*:xx", | ||||
| 		"flags":0x400 | ||||
| 		} | ||||
| 		#print("Creating station {}".format(staName)) | ||||
| 		jsonReq(mgrURL, reqURL, data) | ||||
|  | ||||
| 		time.sleep(0.5) | ||||
|  | ||||
| 		#LFUtils.portDhcpUpRequest(1, staName) | ||||
|  | ||||
|  | ||||
| time.sleep(10) | ||||
|  | ||||
| #check eth1 for ip | ||||
| eth1IP = getJsonInfo(mgrURL, "port/1/1/eth1") | ||||
| if eth1IP['interface']['ip'] == "0.0.0.0": | ||||
| 	print("Switching eth1 to dhcp") | ||||
| 	LFUtils.portDownRequest(1,"eth1") | ||||
| 	time.sleep(1) | ||||
| 	reqURL = "cli-json/set_port" | ||||
| 	data = { | ||||
| 	"shelf":1, | ||||
| 	"resource":1, | ||||
| 	"port":"eth1", | ||||
| 	"current_flags":0x80000000, | ||||
| 	"interest":0x4002 | ||||
| 	} | ||||
|  | ||||
| 	jsonReq(mgrURL,reqURL,data) | ||||
| 	#LFUtils.portDhcpUpRequest(1,"eth1") | ||||
| 	time.sleep(5) | ||||
| 	LFUtils.portUpRequest(1,"eth1") | ||||
|  | ||||
|  | ||||
| time.sleep(10) | ||||
|  | ||||
| #create cross connects | ||||
| print("Creating cross connects") | ||||
| for staName in stations: | ||||
| 	cmd = ("./lf_firemod.pl --action create_cx --cx_name " + staName + " --use_ports eth1," + staName + " --use_speeds  2600,2600 --endp_type udp > sst.log") | ||||
| 	execWrap(cmd) | ||||
|  | ||||
| #set stations to dchp up | ||||
| print("Turning on DHCP for stations") | ||||
| for staName in stations: | ||||
| 	#print("Setting {} flags".format(staName)) | ||||
| 	reqURL = "cli-json/set_port" | ||||
| 	data = { | ||||
| 	"shelf":1, | ||||
| 	"resource":1, | ||||
| 	"port":staName, | ||||
| 	"current_flags":0x80000000, | ||||
| 	"interest":0x4002 | ||||
| 	} | ||||
|  | ||||
| 	jsonReq(mgrURL,reqURL,data) | ||||
| 	#LFUtils.portDhcpUpRequest(1,staName) | ||||
|  | ||||
|  | ||||
| time.sleep(15) | ||||
|  | ||||
| #start traffic through cxs | ||||
| print("Starting CX Traffic") | ||||
| for name in stations: | ||||
| 	cmd = ("./lf_firemod.pl --mgr localhost --quiet 0 --action do_cmd --cmd \"set_cx_state default_tm " + name + " RUNNING\" >> sst.log") | ||||
| 	execWrap(cmd) | ||||
|  | ||||
|  | ||||
| #create weblog for monitoring stations | ||||
| curTime = datetime.datetime.now().strftime("%Y-%m-%d_%H%M") | ||||
| webLog = outputDir + outputPrefix + "{}.html".format(curTime) | ||||
|  | ||||
| try: | ||||
| 	f = open(webLog,"w") | ||||
|  | ||||
| except IOError as err: | ||||
| 	print(err) | ||||
| 	print("Please ensure correct permissions have been assigned in target directory") | ||||
| 	sys.exit() | ||||
|  | ||||
|  | ||||
| top = """<html> | ||||
| <head> | ||||
| <title>Test report</title> | ||||
| <style> | ||||
| body, td, p, div, span { font-size: 8pt; } | ||||
| h1, h2, h3 { text-align: center; font-family: "Century Gothic",Arial,Helvetica,sans;} | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <h1>Long test on %s</h1> | ||||
| <p2>Key</p2> | ||||
| <p1 style="background-color:rgb(0,255,0);">All stations associated and with ip</p1> | ||||
| <p1 style="background-color:rgb(255,200,0);">All stations associated and at least one without ip</p1> | ||||
| <p1 style="background-color:rgb(255,150,150);">No stations associated and without ip</p1> | ||||
| <table> | ||||
| """ % datetime.date.today() | ||||
|  | ||||
|  | ||||
| f.write(top) | ||||
| f.close() | ||||
|  | ||||
| f = open(webLog, "a") | ||||
| f.write("<tr>\n") | ||||
|  | ||||
| for name in radios: | ||||
| 	f.write("<th>{}</th>\n".format(name)) | ||||
|  | ||||
| f.write("</tr>\n") | ||||
|  | ||||
|  | ||||
| curTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") | ||||
| subject = "Station Test Begin Report Notification" | ||||
| body = "Report begun at {}\n See {}".format(curTime, webLog) | ||||
| email = emailHelper.writeEmail(body) | ||||
| emailHelper.sendEmail(email, sender, recipient, subject) | ||||
|  | ||||
|  | ||||
| print("Logging Info to {}".format(webLog)) | ||||
|  | ||||
| curTime = datetime.datetime.now() | ||||
| endTime = curTime + durationTime | ||||
|  | ||||
| while curTime <= (endTime): | ||||
| 	f.write("<tr>\n") | ||||
| 	for radio, numStations in radios.items(): | ||||
| 		withoutIP = 0 | ||||
| 		dissociated = 0 | ||||
| 		good = 0 | ||||
|  | ||||
| 		for i in range(0,numStations): | ||||
| 			staName = "sta" + radio[-1:] + str(paddingNum + i)[1:] | ||||
| 			staStatus = getJsonInfo(mgrURL, "port/1/1/" + staName) | ||||
| 			#print(staName) | ||||
| 			if staStatus['interface']['ip'] == "0.0.0.0": | ||||
| 				withoutIP += 1 | ||||
| 				if staStatus['interface']['ap'] == None: | ||||
| 					dissociated += 1 | ||||
| 			else: | ||||
| 				good += 1 | ||||
|  | ||||
| 		if withoutIP and not dissociated: | ||||
| 			f.write("<td style=\"background-color:rgb(255,200,0);\">{}/{}</td>\n".format(good,numStations)) #without IP assigned | ||||
| 		elif dissociated: | ||||
| 			f.write("<td style=\"background-color:rgb(255,150,150);\">{}/{}</td>\n".format(good,numStations)) #dissociated from AP | ||||
| 		else: | ||||
| 			f.write("<td style=\"background-color:rgb(0,255,0);\">{}/{}</td>\n".format(good,numStations)) #with IP and associated | ||||
|  | ||||
| 	f.write("<td>{}</td>\n".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))) | ||||
| 	f.write("</tr>\n") | ||||
|  | ||||
| 	curTime = datetime.datetime.now() | ||||
| 	intTime = curTime + intervalTime | ||||
| 	while curTime <= intTime: | ||||
| 		#print(curTime, intTime) | ||||
| 		time.sleep(1) | ||||
| 		curTime = datetime.datetime.now() | ||||
| 	#sleep(1) | ||||
| 	curTime = datetime.datetime.now() | ||||
|  | ||||
| f.write("</table></body></html>\n") | ||||
| f.close() | ||||
|  | ||||
|  | ||||
| curTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") | ||||
| subject = "Station Test End Report Notification" | ||||
| body = "Report finished at {} see {}".format(curTime, webLog) | ||||
| email = emailHelper.writeEmail(body) | ||||
| emailHelper.sendEmail(email, sender, recipient, subject) | ||||
|  | ||||
|  | ||||
| print("Stopping CX Traffic") | ||||
| for name in stations: | ||||
| 	cmd = ("./lf_firemod.pl --mgr localhost --quiet 0 --action do_cmd --cmd \"set_cx_state default_tm " + name + " STOPPED\" >> sst.log") | ||||
| 	execWrap(cmd) | ||||
|  | ||||
| time.sleep(10) | ||||
|  | ||||
| #remove all created stations and cross connects | ||||
|  | ||||
| print("Cleaning Up...") | ||||
| for staName in stations: | ||||
| 	reqURL = "cli-json/rm_vlan" | ||||
|  | ||||
| 	data = { | ||||
| 	"shelf":1, | ||||
| 	"resource":1, | ||||
| 	"port":staName | ||||
| 	} | ||||
|  | ||||
| 	jsonReq(mgrURL, reqURL, data) | ||||
|  | ||||
| 	reqURL = "cli-json/rm_cx" | ||||
|  | ||||
| 	data = { | ||||
| 	"test_mgr":"default_tm", | ||||
| 	"cx_name":staName | ||||
| 	} | ||||
| 	jsonReq(mgrURL, reqURL, data) | ||||
|  | ||||
| 	reqURL = "cli-json/rm_endp" | ||||
|  | ||||
| 	data = { | ||||
| 	"endp_name":staName + "-A" | ||||
| 	} | ||||
| 	jsonReq(mgrURL, reqURL, data) | ||||
|  | ||||
| 	reqURL = "cli-json/rm_endp" | ||||
| 	data = { | ||||
| 	"endp_name":staName + "-B" | ||||
| 	} | ||||
|  | ||||
| 	jsonReq(mgrURL, reqURL, data) | ||||
| from LANforge.lfcli_base import LFCliBase | ||||
|  | ||||
|  | ||||
| class StressTester(LFCliBase): | ||||
|     def __init__(self, lfhost, lfport, _sender="lanforge@candelatech.com", _debug_on=False): | ||||
|         self.sender = _sender | ||||
|         super().__init__(lfhost, lfport, False) | ||||
|  | ||||
|     def run(self): | ||||
|         parser = argparse.ArgumentParser(description="Create max stations for each radio") | ||||
|         parser.add_argument("--test_duration", type=str, | ||||
|                             help="Full duration for the test to run. Should be specified by a number followed by a " | ||||
|                                  "character. d for days, h for hours, m for minutes, s for seconds") | ||||
|         parser.add_argument("--test_end_time", type=str, | ||||
|                             help="Specify a time and date to end the test. Should be formatted as " | ||||
|                                  "year-month-date_hour:minute. Date should be specified in numbers and time " | ||||
|                                  "should be 24 " | ||||
|                                  "hour format. Ex: 2020-5-14_14:30") | ||||
|         parser.add_argument("--report_interval", type=str, | ||||
|                             help="How often a report is made. Should be specified by a " | ||||
|                                  "number followed by a character. d for days, h for hours, " | ||||
|                                  "m for minutes, s for seconds") | ||||
|         parser.add_argument("--output_dir", type=str, help="Directory to ouptut to") | ||||
|         parser.add_argument("--output_prefix", type=str, | ||||
|                             help="Name of the file. Timestamp and .html will be appended to the end") | ||||
|         parser.add_argument("--email", type=str, help="Email address of recipient") | ||||
|  | ||||
|         args = None | ||||
|         try: | ||||
|             args = parser.parse_args() | ||||
|             if args.test_duration is not None: | ||||
|                 pattern = re.compile("^(\d+)([dhms]$)") | ||||
|                 td = pattern.match(args.test_duration) | ||||
|                 if td is not None: | ||||
|                     dur_time = int(td.group(1)) | ||||
|                     dur_measure = str(td.group(2)) | ||||
|                     now = datetime.datetime.now() | ||||
|                     if dur_measure == "d": | ||||
|                         duration_time = datetime.timedelta(days=dur_time) | ||||
|                     elif dur_measure == "h": | ||||
|                         duration_time = datetime.timedelta(hours=dur_time) | ||||
|                     elif dur_measure == "m": | ||||
|                         duration_time = datetime.timedelta(minutes=dur_time) | ||||
|                     else: | ||||
|                         duration_time = datetime.timedelta(seconds=dur_time) | ||||
|                 else: | ||||
|                     parser.print_help() | ||||
|                     parser.exit() | ||||
|  | ||||
|             elif args.test_end_time is not None: | ||||
|                 now = datetime.datetime.now() | ||||
|                 try: | ||||
|                     end_time = datetime.datetime.strptime(args.test_end_time, "%Y-%m-%d_%H:%M") | ||||
|                     if end_time < now: | ||||
|                         parser.print_help() | ||||
|                         raise ValueError | ||||
|                     else: | ||||
|                         cur_time = datetime.datetime.now() | ||||
|                         duration_time = end_time - cur_time | ||||
|  | ||||
|                 except ValueError as exception: | ||||
|                     print(exception) | ||||
|                     parser.print_help() | ||||
|                     parser.exit() | ||||
|  | ||||
|             else: | ||||
|                 parser.print_help() | ||||
|                 parser.exit() | ||||
|  | ||||
|             if args.report_interval is not None: | ||||
|                 pattern = re.compile("^(\d+)([dhms])$") | ||||
|                 ri = pattern.match(args.report_interval) | ||||
|                 if ri is not None: | ||||
|                     int_time = int(ri.group(1)) | ||||
|                     int_measure = str(ri.group(2)) | ||||
|  | ||||
|                     if int_measure == "d": | ||||
|                         interval_time = datetime.timedelta(days=int_time) | ||||
|                     elif int_measure == "h": | ||||
|                         interval_time = datetime.timedelta(hours=int_time) | ||||
|                     elif int_measure == "m": | ||||
|                         interval_time = datetime.timedelta(minutes=int_time) | ||||
|                     else: | ||||
|                         interval_time = datetime.timedelta(seconds=int_time) | ||||
|                 else: | ||||
|                     parser.print_help() | ||||
|                     parser.exit() | ||||
|             else: | ||||
|                 parser.print_help() | ||||
|                 parser.exit() | ||||
|  | ||||
|             if args.output_dir is not None: | ||||
|                 output_dir = args.output_dir | ||||
|             else: | ||||
|                 parser.print_help() | ||||
|                 parser.exit() | ||||
|  | ||||
|             if args.output_prefix is not None: | ||||
|                 output_prefix = args.output_prefix | ||||
|             else: | ||||
|                 parser.print_help() | ||||
|                 parser.exit() | ||||
|             if args.email is not None: | ||||
|                 recipient = args.email | ||||
|             else: | ||||
|                 parser.print_help() | ||||
|                 parser.exit() | ||||
|  | ||||
|         except Exception as e: | ||||
|             parser.print_help() | ||||
|             exit(2) | ||||
|  | ||||
|         super().check_connect() | ||||
|  | ||||
|         stations = [] | ||||
|         radios = {"wiphy0": 200,  # max 200 | ||||
|                   "wiphy1": 200,  # max 200 | ||||
|                   "wiphy2": 64,  # max 64 | ||||
|                   "wiphy3": 200}  # max 200 | ||||
|         # radioName:numStations | ||||
|         radio_ssid_map = {"wiphy0": "jedway-wpa2-x2048-4-1", | ||||
|                           "wiphy1": "jedway-wpa2-x2048-5-3", | ||||
|                           "wiphy2": "jedway-wpa2-x2048-5-1", | ||||
|                           "wiphy3": "jedway-wpa2-x2048-4-4"} | ||||
|  | ||||
|         ssid_passphrase_map = {"jedway-wpa2-x2048-4-1": "jedway-wpa2-x2048-4-1", | ||||
|                                "jedway-wpa2-x2048-5-3": "jedway-wpa2-x2048-5-3", | ||||
|                                "jedway-wpa2-x2048-5-1": "jedway-wpa2-x2048-5-1", | ||||
|                                "jedway-wpa2-x2048-4-4": "jedway-wpa2-x2048-4-4"} | ||||
|  | ||||
|         padding_num = 1000  # uses all but the first number to create names for stations | ||||
|  | ||||
|         # clean up old stations | ||||
|         print("Cleaning up old Stations") | ||||
|  | ||||
|         for radio, numStations in radios.items(): | ||||
|             for i in range(0, numStations): | ||||
|                 sta_name = "sta" + radio[-1:] + str(padding_num + i)[1:] | ||||
|                 if super().json_get("port/1/1/" + sta_name) is not None: | ||||
|                     req_url = "cli-json/rm_vlan" | ||||
|  | ||||
|                     data = { | ||||
|                         "shelf": 1, | ||||
|                         "resource": 1, | ||||
|                         "port": sta_name | ||||
|                     } | ||||
|  | ||||
|                     super().json_post(req_url, data) | ||||
|  | ||||
|                     req_url = "cli-json/rm_cx" | ||||
|  | ||||
|                     data = { | ||||
|                         "test_mgr": "default_tm", | ||||
|                         "cx_name": sta_name | ||||
|                     } | ||||
|                     super().json_post(req_url, data) | ||||
|  | ||||
|                     req_url = "cli-json/rm_endp" | ||||
|  | ||||
|                     data = { | ||||
|                         "endp_name": sta_name + "-A" | ||||
|                     } | ||||
|                     super().json_post(req_url, data) | ||||
|  | ||||
|                     req_url = "cli-json/rm_endp" | ||||
|                     data = { | ||||
|                         "endp_name": sta_name + "-B" | ||||
|                     } | ||||
|                     super().json_post(req_url, data) | ||||
|  | ||||
|         # create new stations | ||||
|         print("Creating Stations") | ||||
|  | ||||
|         req_url = "cli-json/add_sta" | ||||
|         for radio, numStations in radios.items(): | ||||
|             for i in range(0, numStations): | ||||
|                 sta_name = "sta" + radio[-1:] + str(padding_num + i)[1:] | ||||
|                 stations.append(sta_name) | ||||
|                 data = { | ||||
|                     "shelf": 1, | ||||
|                     "resource": 1, | ||||
|                     "radio": radio, | ||||
|                     "sta_name": sta_name, | ||||
|                     "ssid": radio_ssid_map[radio], | ||||
|                     "key": ssid_passphrase_map[radio_ssid_map[radio]], | ||||
|                     "mode": 1, | ||||
|                     "mac": "xx:xx:xx:xx:*:xx", | ||||
|                     "flags": 0x400 | ||||
|                 } | ||||
|                 # print("Creating station {}".format(sta_name)) | ||||
|                 super().json_post(req_url, data) | ||||
|  | ||||
|                 time.sleep(0.5) | ||||
|  | ||||
|         # LFUtils.portDhcpUpRequest(1, sta_name) | ||||
|  | ||||
|         time.sleep(10) | ||||
|  | ||||
|         # check eth1 for ip | ||||
|         eth1_ip = super().json_get("port/1/1/eth1") | ||||
|         if eth1_ip['interface']['ip'] == "0.0.0.0": | ||||
|             print("Switching eth1 to dhcp") | ||||
|             LFUtils.portDownRequest(1, "eth1") | ||||
|             time.sleep(1) | ||||
|             req_url = "cli-json/set_port" | ||||
|             data = { | ||||
|                 "shelf": 1, | ||||
|                 "resource": 1, | ||||
|                 "port": "eth1", | ||||
|                 "current_flags": 0x80000000, | ||||
|                 "interest": 0x4002 | ||||
|             } | ||||
|  | ||||
|             super().json_post(req_url, data) | ||||
|             # LFUtils.portDhcpUpRequest(1,"eth1") | ||||
|             time.sleep(5) | ||||
|             LFUtils.portUpRequest(1, "eth1") | ||||
|  | ||||
|         time.sleep(10) | ||||
|  | ||||
|         # create cross connects | ||||
|         print("Creating cross connects") | ||||
|         for sta_name in stations: | ||||
|             cmd = ( | ||||
|                     "./lf_firemod.pl --action create_cx --cx_name " + sta_name + " --use_ports eth1," + sta_name + " --use_speeds  2600,2600 --endp_type udp > sst.log") | ||||
|             LFUtils.execWrap(cmd) | ||||
|  | ||||
|         # set stations to dchp up | ||||
|         print("Turning on DHCP for stations") | ||||
|         for sta_name in stations: | ||||
|             # print("Setting {} flags".format(sta_name)) | ||||
|             req_url = "cli-json/set_port" | ||||
|             data = { | ||||
|                 "shelf": 1, | ||||
|                 "resource": 1, | ||||
|                 "port": sta_name, | ||||
|                 "current_flags": 0x80000000, | ||||
|                 "interest": 0x4002 | ||||
|             } | ||||
|  | ||||
|             super().json_post(req_url, data) | ||||
|         # LFUtils.portDhcpUpRequest(1,sta_name) | ||||
|  | ||||
|         time.sleep(15) | ||||
|  | ||||
|         # start traffic through cxs | ||||
|         print("Starting CX Traffic") | ||||
|         for name in stations: | ||||
|             cmd = ( | ||||
|                     "./lf_firemod.pl --mgr localhost --quiet 0 --action do_cmd --cmd \"set_cx_state default_tm " + name + " RUNNING\" >> sst.log") | ||||
|             LFUtils.execWrap(cmd) | ||||
|  | ||||
|         # create weblog for monitoring stations | ||||
|         cur_time = datetime.datetime.now().strftime("%Y-%m-%d_%H%M") | ||||
|         web_log = output_dir + output_prefix + "{}.html".format(cur_time) | ||||
|  | ||||
|         try: | ||||
|             web_log_file = open(web_log, "w") | ||||
|  | ||||
|         except IOError as err: | ||||
|             print(err) | ||||
|             print("Please ensure correct permissions have been assigned in target directory") | ||||
|             sys.exit() | ||||
|  | ||||
|         top = """<html> | ||||
|         <head> | ||||
|         <title>Test report</title> | ||||
|         <style> | ||||
|         body, td, p, div, span { font-size: 8pt; } | ||||
|         h1, h2, h3 { text-align: center; font-family: "Century Gothic",Arial,Helvetica,sans;} | ||||
|         </style> | ||||
|         </head> | ||||
|         <body> | ||||
|         <h1>Long test on %s</h1> | ||||
|         <p2>Key</p2> | ||||
|         <p1 style="background-color:rgb(0,255,0);">All stations associated and with ip</p1> | ||||
|         <p1 style="background-color:rgb(255,200,0);">All stations associated and at least one without ip</p1> | ||||
|         <p1 style="background-color:rgb(255,150,150);">No stations associated and without ip</p1> | ||||
|         <table> | ||||
|         """ % datetime.date.today() | ||||
|  | ||||
|         web_log_file.write(top) | ||||
|         web_log_file.close() | ||||
|  | ||||
|         web_log_file = open(web_log, "a") | ||||
|         web_log_file.write("<tr>\n") | ||||
|  | ||||
|         for name in radios: | ||||
|             web_log_file.write("<th>{}</th>\n".format(name)) | ||||
|  | ||||
|         web_log_file.write("</tr>\n") | ||||
|  | ||||
|         cur_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") | ||||
|         subject = "Station Test Begin Report Notification" | ||||
|         body = "Report begun at {}\n See {}".format(cur_time, web_log) | ||||
|         email = emailHelper.writeEmail(body) | ||||
|         emailHelper.sendEmail(email, self.sender, recipient, subject) | ||||
|  | ||||
|         print("Logging Info to {}".format(web_log)) | ||||
|  | ||||
|         cur_time = datetime.datetime.now() | ||||
|         end_time = cur_time + duration_time | ||||
|  | ||||
|         while cur_time <= end_time: | ||||
|             web_log_file.write("<tr>\n") | ||||
|             for radio, numStations in radios.items(): | ||||
|                 without_ip = 0 | ||||
|                 dissociated = 0 | ||||
|                 good = 0 | ||||
|  | ||||
|                 for i in range(0, numStations): | ||||
|                     sta_name = "sta" + radio[-1:] + str(padding_num + i)[1:] | ||||
|                     sta_status = super().json_get("port/1/1/" + sta_name) | ||||
|                     # print(sta_name) | ||||
|                     if sta_status['interface']['ip'] == "0.0.0.0": | ||||
|                         without_ip += 1 | ||||
|                         if sta_status['interface']['ap'] is None: | ||||
|                             dissociated += 1 | ||||
|                     else: | ||||
|                         good += 1 | ||||
|  | ||||
|                 if without_ip and not dissociated: | ||||
|                     web_log_file.write("<td style=\"background-color:rgb(255,200,0);\">{}/{}</td>\n".format(good, | ||||
|                                                                                                             numStations))  # without IP assigned | ||||
|                 elif dissociated: | ||||
|                     web_log_file.write("<td style=\"background-color:rgb(255,150,150);\">{}/{}</td>\n".format(good, | ||||
|                                                                                                               numStations))  # dissociated from AP | ||||
|                 else: | ||||
|                     web_log_file.write("<td style=\"background-color:rgb(0,255,0);\">{}/{}</td>\n".format(good, | ||||
|                                                                                                           numStations))  # with IP and associated | ||||
|  | ||||
|             web_log_file.write("<td>{}</td>\n".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))) | ||||
|             web_log_file.write("</tr>\n") | ||||
|  | ||||
|             cur_time = datetime.datetime.now() | ||||
|             int_time = cur_time + interval_time | ||||
|             while cur_time <= int_time: | ||||
|                 # print(cur_time, int_time) | ||||
|                 time.sleep(1) | ||||
|                 cur_time = datetime.datetime.now() | ||||
|             # sleep(1) | ||||
|             cur_time = datetime.datetime.now() | ||||
|  | ||||
|         web_log_file.write("</table></body></html>\n") | ||||
|         web_log_file.close() | ||||
|  | ||||
|         cur_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") | ||||
|         subject = "Station Test End Report Notification" | ||||
|         body = "Report finished at {} see {}".format(cur_time, web_log) | ||||
|         email = emailHelper.writeEmail(body) | ||||
|         emailHelper.sendEmail(email, self.sender, recipient, subject) | ||||
|  | ||||
|         print("Stopping CX Traffic") | ||||
|         for sta_name in stations: | ||||
|             cmd = ( | ||||
|                     "./lf_firemod.pl --mgr localhost --quiet 0 --action do_cmd --cmd \"set_cx_state default_tm " + sta_name + " STOPPED\" >> sst.log") | ||||
|             LFUtils.execWrap(cmd) | ||||
|  | ||||
|         time.sleep(10) | ||||
|  | ||||
|         # remove all created stations and cross connects | ||||
|  | ||||
|         print("Cleaning Up...") | ||||
|         for sta_name in stations: | ||||
|             req_url = "cli-json/rm_vlan" | ||||
|  | ||||
|             data = { | ||||
|                 "shelf": 1, | ||||
|                 "resource": 1, | ||||
|                 "port": sta_name | ||||
|             } | ||||
|  | ||||
|             super().json_post(req_url, data) | ||||
|  | ||||
|             req_url = "cli-json/rm_cx" | ||||
|  | ||||
|             data = { | ||||
|                 "test_mgr": "default_tm", | ||||
|                 "cx_name": sta_name | ||||
|             } | ||||
|             super().json_post(req_url, data) | ||||
|  | ||||
|             req_url = "cli-json/rm_endp" | ||||
|  | ||||
|             data = { | ||||
|                 "endp_name": sta_name + "-A" | ||||
|             } | ||||
|             super().json_post(req_url, data) | ||||
|  | ||||
|             req_url = "cli-json/rm_endp" | ||||
|             data = { | ||||
|                 "endp_name": sta_name + "-B" | ||||
|             } | ||||
|  | ||||
|             super().json_post(req_url, data) | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     lfjson_host = "localhost" | ||||
|     lfjson_port = 8080 | ||||
|     test = StressTester(lfjson_host, lfjson_port) | ||||
|     test.run() | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Logan Lipke
					Logan Lipke