Remove unused iperf test and analysis functions
- Remove IperfFromContainer - Remove unused functions IperfExit and PingExit - Remove unused function for iperf analysis
This commit is contained in:
@@ -169,97 +169,6 @@ def AnalyzeBuildLogs(buildRoot, images, globalStatus):
|
||||
collectInfo[image] = files
|
||||
return collectInfo
|
||||
|
||||
def AnalyzeIperf(cliOptions, clientReport, serverReport):
|
||||
req_bw = 1.0 # default iperf throughput, in Mbps
|
||||
result = re.search('-b *(?P<iperf_bandwidth>[0-9\.]+)(?P<magnitude>[kKMG])', cliOptions)
|
||||
if result is not None:
|
||||
req_bw = float(result.group('iperf_bandwidth'))
|
||||
magn = result.group('magnitude')
|
||||
if magn == "k" or magn == "K":
|
||||
req_bw /= 1000
|
||||
elif magn == "G":
|
||||
req_bw *= 1000
|
||||
req_dur = 10 # default iperf send duration
|
||||
result = re.search('-t *(?P<duration>[0-9]+)', cliOptions)
|
||||
if result is not None:
|
||||
req_dur = int(result.group('duration'))
|
||||
|
||||
reportLine = None
|
||||
# find server report in client status
|
||||
clientReportLines = clientReport.split('\n')
|
||||
for l in range(len(clientReportLines)):
|
||||
res = re.search('read failed: Connection refused', clientReportLines[l])
|
||||
if res is not None:
|
||||
message = 'iperf connection refused by server!'
|
||||
logging.error(f'\u001B[1;37;41mIperf Test FAIL: {message}\u001B[0m')
|
||||
return (False, message)
|
||||
res = re.search('Server Report:', clientReportLines[l])
|
||||
if res is not None and l + 1 < len(clientReportLines):
|
||||
reportLine = clientReportLines[l+1]
|
||||
logging.debug(f'found server report: "{reportLine}"')
|
||||
|
||||
statusTemplate = '(?:|\[ *\d+\].*) +0\.0-\s*(?P<duration>[0-9\.]+) +sec +[0-9\.]+ [kKMG]Bytes +(?P<bitrate>[0-9\.]+) (?P<magnitude>[kKMG])bits\/sec +(?P<jitter>[0-9\.]+) ms +(\d+\/ *\d+) +(\((?P<packetloss>[0-9\.]+)%\))'
|
||||
# if we do not find a server report in the client logs, check the server logs
|
||||
# and use the last line which is typically close/identical to server report
|
||||
if reportLine is None:
|
||||
for l in serverReport.split('\n'):
|
||||
res = re.search(statusTemplate, l)
|
||||
if res is not None:
|
||||
reportLine = l
|
||||
if reportLine is None:
|
||||
logging.warning('no report in server status found!')
|
||||
return (False, 'could not parse iperf logs')
|
||||
logging.debug(f'found client status: {reportLine}')
|
||||
|
||||
result = re.search(statusTemplate, reportLine)
|
||||
if result is None:
|
||||
logging.error('could not analyze report from statusTemplate')
|
||||
return (False, 'could not parse iperf logs')
|
||||
|
||||
duration = float(result.group('duration'))
|
||||
bitrate = float(result.group('bitrate'))
|
||||
magn = result.group('magnitude')
|
||||
if magn == "k" or magn == "K":
|
||||
bitrate /= 1000
|
||||
elif magn == "G": # we assume bitrate in Mbps, therefore it must be G now
|
||||
bitrate *= 1000
|
||||
jitter = float(result.group('jitter'))
|
||||
packetloss = float(result.group('packetloss'))
|
||||
|
||||
logging.debug('\u001B[1;37;44m iperf result \u001B[0m')
|
||||
msg = f'Req Bitrate: {req_bw}'
|
||||
logging.debug(f'\u001B[1;34m{msg}\u001B[0m')
|
||||
|
||||
br_loss = bitrate/req_bw
|
||||
bmsg = f'Bitrate : {bitrate} (perf {br_loss})'
|
||||
logging.debug(f'\u001B[1;34m{bmsg}\u001B[0m')
|
||||
msg += '\n' + bmsg
|
||||
if br_loss < 0.9:
|
||||
msg += '\nBitrate performance too low (<90%)'
|
||||
logging.debug(f'\u001B[1;37;41mBitrate performance too low (<90%)\u001B[0m')
|
||||
return (False, msg)
|
||||
|
||||
plmsg = f'Packet Loss: {packetloss}%'
|
||||
logging.debug(f'\u001B[1;34m{plmsg}\u001B[0m')
|
||||
msg += '\n' + plmsg
|
||||
if packetloss > 5.0:
|
||||
msg += '\nPacket Loss too high!'
|
||||
logging.debug(f'\u001B[1;37;41mPacket Loss too high \u001B[0m')
|
||||
return (False, msg)
|
||||
|
||||
dmsg = f'Duration : {duration} (req {req_dur})'
|
||||
logging.debug(f'\u001B[1;34m{dmsg}\u001B[0m')
|
||||
msg += '\n' + dmsg
|
||||
if duration < float(req_dur):
|
||||
msg += '\nDuration of iperf too short!'
|
||||
logging.debug(f'\u001B[1;37;41mDuration of iperf too short\u001B[0m')
|
||||
return (False, msg)
|
||||
|
||||
jmsg = f'Jitter : {jitter}'
|
||||
logging.debug(f'\u001B[1;34m{jmsg}\u001B[0m')
|
||||
msg += '\n' + jmsg
|
||||
return (True, msg)
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# Class Declaration
|
||||
#-----------------------------------------------------------
|
||||
@@ -1466,76 +1375,6 @@ class Containerize():
|
||||
|
||||
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', [message])
|
||||
|
||||
def PingExit(self, HTML, RAN, UE, status, message):
|
||||
if status:
|
||||
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', [message])
|
||||
else:
|
||||
logging.error('\u001B[1;37;41m ping test FAIL -- ' + message + ' \u001B[0m')
|
||||
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'KO', [message])
|
||||
# Automatic undeployment
|
||||
logging.warning('----------------------------------------')
|
||||
logging.warning('\u001B[1m Starting Automatic undeployment \u001B[0m')
|
||||
logging.warning('----------------------------------------')
|
||||
HTML.testCase_id = 'AUTO-UNDEPLOY'
|
||||
HTML.desc = 'Automatic Un-Deployment'
|
||||
self.UndeployGenObject(HTML, RAN, UE)
|
||||
self.exitStatus = 1
|
||||
|
||||
def IperfFromContainer(self, HTML, RAN, UE):
|
||||
myCmd = cls_cmd.LocalCmd()
|
||||
self.exitStatus = 0
|
||||
|
||||
ymlPath = self.yamlPath[0].split('/')
|
||||
logPath = '../cmake_targets/log/' + ymlPath[1]
|
||||
cmd = f'mkdir -p {logPath}'
|
||||
myCmd.run(cmd, silent=True)
|
||||
|
||||
# Start the server process
|
||||
cmd = f'docker exec -d {self.svrContName} /bin/bash -c "nohup iperf {self.svrOptions} > /tmp/iperf_server.log 2>&1"'
|
||||
myCmd.run(cmd)
|
||||
time.sleep(3)
|
||||
|
||||
# Start the client process
|
||||
cmd = f'docker exec {self.cliContName} /bin/bash -c "iperf {self.cliOptions}" 2>&1 | tee {logPath}/iperf_client_{HTML.testCase_id}.log'
|
||||
clientStatus = myCmd.run(cmd, timeout=100)
|
||||
|
||||
# Stop the server process
|
||||
cmd = f'docker exec {self.svrContName} /bin/bash -c "pkill iperf"'
|
||||
myCmd.run(cmd)
|
||||
time.sleep(3)
|
||||
serverStatusFilename = f'{logPath}/iperf_server_{HTML.testCase_id}.log'
|
||||
cmd = f'docker cp {self.svrContName}:/tmp/iperf_server.log {serverStatusFilename}'
|
||||
myCmd.run(cmd, timeout=60)
|
||||
myCmd.close()
|
||||
|
||||
# clientStatus was retrieved above. The serverStatus was
|
||||
# written in the background, then copied to the local machine
|
||||
with open(serverStatusFilename, 'r') as f:
|
||||
serverStatus = f.read()
|
||||
(iperfStatus, msg) = AnalyzeIperf(self.cliOptions, clientStatus.stdout, serverStatus)
|
||||
if iperfStatus:
|
||||
logging.info('\u001B[1m Iperf Test PASS\u001B[0m')
|
||||
else:
|
||||
logging.error('\u001B[1;37;41m Iperf Test FAIL\u001B[0m')
|
||||
self.IperfExit(HTML, RAN, UE, iperfStatus, msg)
|
||||
|
||||
def IperfExit(self, HTML, RAN, UE, status, message):
|
||||
html_cell = f'UE\n{message}'
|
||||
if status:
|
||||
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'OK', [html_cell])
|
||||
else:
|
||||
logging.error('\u001B[1m Iperf Test FAIL -- ' + message + ' \u001B[0m')
|
||||
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'KO', [html_cell])
|
||||
# Automatic undeployment
|
||||
logging.warning('----------------------------------------')
|
||||
logging.warning('\u001B[1m Starting Automatic undeployment \u001B[0m')
|
||||
logging.warning('----------------------------------------')
|
||||
HTML.testCase_id = 'AUTO-UNDEPLOY'
|
||||
HTML.desc = 'Automatic Un-Deployment'
|
||||
self.UndeployGenObject(HTML, RAN, UE)
|
||||
self.exitStatus = 1
|
||||
|
||||
|
||||
def CheckAndAddRoute(self, svrName, ipAddr, userName, password):
|
||||
logging.debug('Checking IP routing on ' + svrName)
|
||||
mySSH = SSH.SSHConnection()
|
||||
|
||||
Reference in New Issue
Block a user