Commit 4080cfd8 authored by Raphael Defosseux's avatar Raphael Defosseux

CI: adding UL iperf support

Signed-off-by: default avatarRaphael Defosseux <raphael.defosseux@eurecom.fr>
parent 9db654d6
...@@ -277,7 +277,7 @@ class SSHConnection(): ...@@ -277,7 +277,7 @@ class SSHConnection():
self.CreateHtmlTestRow(config_file, 'eNB not showing got sync!', 0) self.CreateHtmlTestRow(config_file, 'eNB not showing got sync!', 0)
# Not getting got sync is bypassed for the moment # Not getting got sync is bypassed for the moment
#sys.exit(1) #sys.exit(1)
self.command('stdbuf -o0 cat enb_' + SSH.testCase_id + '.log', '\$', 10) self.command('stdbuf -o0 cat enb_' + SSH.testCase_id + '.log | grep -i sync', '\$', 10)
result = re.search('got sync', str(self.ssh.before)) result = re.search('got sync', str(self.ssh.before))
if result is None: if result is None:
time.sleep(6) time.sleep(6)
...@@ -540,48 +540,19 @@ class SSHConnection(): ...@@ -540,48 +540,19 @@ class SSHConnection():
job.join() job.join()
self.CreateHtmlTestRow(self.ping_args, 'OK', 0) self.CreateHtmlTestRow(self.ping_args, 'OK', 0)
def Iperf_common(self, lock, UE_IPAddress, device_id, ue_num): def Iperf_ComputeTime(self):
try:
useIperf3 = False
self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
# if by chance ADB server and EPC are on the same remote host, at least log collection will take of it
self.command('if [ ! -d ' + self.EPCSourceCodePath + '/scripts ]; then mkdir -p ' + self.EPCSourceCodePath + '/scripts ; fi', '\$', 5)
self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
# Checking if iperf / iperf3 are installed
self.command('adb -s ' + device_id + ' shell "ls /data/local/tmp"', '\$', 5)
result = re.search('iperf3', str(self.ssh.before))
if result is None:
result = re.search('iperf', str(self.ssh.before))
if result is None:
logging.debug('\u001B[1;37;41m Neither iperf nor iperf3 installed on UE! \u001B[0m')
sys.exit(1)
else:
useIperf3 = True
if (useIperf3):
self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/iperf3 -s &', '\$', 5)
else:
self.command('rm -f /tmp/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -u -s -i 1" > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5)
time.sleep(0.5)
self.close()
self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
self.command('cd scripts', '\$', 5)
result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args)) result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args))
if result is None: if result is None:
logging.debug('\u001B[1;37;41m Iperf time Not Found! \u001B[0m') logging.debug('\u001B[1;37;41m Iperf time Not Found! \u001B[0m')
sys.exit(1) sys.exit(1)
iperf_time = result.group('iperf_time') return result.group('iperf_time')
time.sleep(0.5)
def Iperf_ComputeModifiedBW(self, ue_num):
result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(self.iperf_args)) result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(self.iperf_args))
if result is None: if result is None:
logging.debug('\u001B[1;37;41m Iperf bandwidth Not Found! \u001B[0m') logging.debug('\u001B[1;37;41m Iperf bandwidth Not Found! \u001B[0m')
sys.exit(1) sys.exit(1)
iperf_bandwidth = result.group('iperf_bandwidth') iperf_bandwidth = result.group('iperf_bandwidth')
time.sleep(0.5)
iperf_bandwidth_new = float(iperf_bandwidth)/ue_num iperf_bandwidth_new = float(iperf_bandwidth)/ue_num
iperf_bandwidth_str = '-b ' + iperf_bandwidth iperf_bandwidth_str = '-b ' + iperf_bandwidth
iperf_bandwidth_str_new = '-b ' + str(iperf_bandwidth_new) iperf_bandwidth_str_new = '-b ' + str(iperf_bandwidth_new)
...@@ -589,23 +560,25 @@ class SSHConnection(): ...@@ -589,23 +560,25 @@ class SSHConnection():
if result is None: if result is None:
logging.debug('\u001B[1;37;41m Calculate Iperf bandwidth Failed! \u001B[0m') logging.debug('\u001B[1;37;41m Calculate Iperf bandwidth Failed! \u001B[0m')
sys.exit(1) sys.exit(1)
return result
self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5) def Iperf_analyzeV2Output(self, lock, UE_IPAddress):
if (useIperf3): result = re.search('Server Report:', str(self.ssh.before))
self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + result + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\\\\r\\\\n(?:|\[ *\d+\] Sent \d+ datagrams)\\\\r\\\\niperf Done\.', str(self.ssh.before))
if result is None: if result is None:
result = re.search('(?P<error>iperf: error - [a-zA-Z0-9 :]+)', str(self.ssh.before)) result = re.search('read failed: Connection refused', str(self.ssh.before))
if result is not None: if result is not None:
logging.debug('\u001B[1;37;41m ' + result.group('error') + ' \u001B[0m') logging.debug('\u001B[1;37;41m Could not connect to iperf server! \u001B[0m')
else: else:
logging.debug('\u001B[1;37;41m Bitrate and/or Packet Loss Not Found! \u001B[0m') logging.debug('\u001B[1;37;41m Server Report and Connection refused Not Found! \u001B[0m')
sys.exit(1) sys.exit(1)
result = re.search('Server Report:\\\\r\\\\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/.\d+) (\((?P<packetloss>[0-9\.]+)%\))', str(self.ssh.before))
if result is not None:
bitrate = result.group('bitrate') bitrate = result.group('bitrate')
packetloss = result.group('packetloss') packetloss = result.group('packetloss')
jitter = result.group('jitter')
lock.acquire() lock.acquire()
logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m')
if bitrate is not None:
logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m')
if packetloss is not None: if packetloss is not None:
logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m')
...@@ -613,26 +586,23 @@ class SSHConnection(): ...@@ -613,26 +586,23 @@ class SSHConnection():
logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m')
lock.release() lock.release()
sys.exit(1) sys.exit(1)
if jitter is not None:
logging.debug('\u001B[1;34m Jitter : ' + jitter + '\u001B[0m')
lock.release() lock.release()
else:
self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + result + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
result = re.search('Server Report:', str(self.ssh.before)) def Iperf_analyzeV3Output(self, lock, UE_IPAddress):
result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\\\\r\\\\n(?:|\[ *\d+\] Sent \d+ datagrams)\\\\r\\\\niperf Done\.', str(self.ssh.before))
if result is None: if result is None:
result = re.search('read failed: Connection refused', str(self.ssh.before)) result = re.search('(?P<error>iperf: error - [a-zA-Z0-9 :]+)', str(self.ssh.before))
if result is not None: if result is not None:
logging.debug('\u001B[1;37;41m Could not connect to iperf server! \u001B[0m') logging.debug('\u001B[1;37;41m ' + result.group('error') + ' \u001B[0m')
else: else:
logging.debug('\u001B[1;37;41m Server Report and Connection refused Not Found! \u001B[0m') logging.debug('\u001B[1;37;41m Bitrate and/or Packet Loss Not Found! \u001B[0m')
sys.exit(1) sys.exit(1)
result = re.search('Server Report:\\\\r\\\\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/.\d+) (\((?P<packetloss>[0-9\.]+)%\))', str(self.ssh.before))
if result is not None:
bitrate = result.group('bitrate') bitrate = result.group('bitrate')
packetloss = result.group('packetloss') packetloss = result.group('packetloss')
jitter = result.group('jitter')
lock.acquire() lock.acquire()
logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m')
if bitrate is not None:
logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m')
if packetloss is not None: if packetloss is not None:
logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m')
...@@ -640,9 +610,91 @@ class SSHConnection(): ...@@ -640,9 +610,91 @@ class SSHConnection():
logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m')
lock.release() lock.release()
sys.exit(1) sys.exit(1)
if jitter is not None:
logging.debug('\u001B[1;34m Jitter : ' + jitter + '\u001B[0m')
lock.release() lock.release()
def Iperf_UL_common(self, lock, UE_IPAddress, device_id, idx, ue_num):
ipnumbers = UE_IPAddress.split('.')
if (len(ipnumbers) == 4):
ipnumbers[3] = '1'
EPC_Iperf_UE_IPAddress = ipnumbers[0] + '.' + ipnumbers[1] + '.' + ipnumbers[2] + '.' + ipnumbers[3]
# Launch iperf server on EPC side
self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
self.command('rm -f iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
port = 5001 + idx
self.command('echo $USER; nohup iperf -u -s -i 1 -p ' + str(port) + ' > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.EPCUserName, 5)
time.sleep(0.5)
self.close()
# Launch iperf client on UE
self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
iperf_time = self.Iperf_ComputeTime()
time.sleep(0.5)
modified_options = self.Iperf_ComputeModifiedBW(ue_num)
time.sleep(0.5)
self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
self.command('stdbuf -o0 adb -s ' + device_id + ' shell "/data/local/tmp/iperf -c ' + EPC_Iperf_UE_IPAddress + ' ' + modified_options + ' -p ' + str(port) + '" 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
self.Iperf_analyzeV2Output(lock, UE_IPAddress)
# Launch iperf server on EPC side
self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
self.command('killall --signal SIGKILL iperf', self.EPCUserName, 5)
self.close()
def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num):
try:
useIperf3 = False
self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
# if by chance ADB server and EPC are on the same remote host, at least log collection will take of it
self.command('if [ ! -d ' + self.EPCSourceCodePath + '/scripts ]; then mkdir -p ' + self.EPCSourceCodePath + '/scripts ; fi', '\$', 5)
self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
# Checking if iperf / iperf3 are installed
self.command('adb -s ' + device_id + ' shell "ls /data/local/tmp"', '\$', 5)
result = re.search('iperf3', str(self.ssh.before))
if result is None:
result = re.search('iperf', str(self.ssh.before))
if result is None:
logging.debug('\u001B[1;37;41m Neither iperf nor iperf3 installed on UE! \u001B[0m')
sys.exit(1)
else:
useIperf3 = True
# in case of iperf, UL has its own function
if (not useIperf3):
result = re.search('-R', str(self.iperf_args))
if result is not None:
self.close()
self.Iperf_UL_common(lock, UE_IPAddress, device_id, idx, ue_num)
return
if (useIperf3):
self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/iperf3 -s &', '\$', 5)
else:
self.command('rm -f iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -u -s -i 1" > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5)
time.sleep(0.5)
self.close()
self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
iperf_time = self.Iperf_ComputeTime()
time.sleep(0.5)
modified_options = self.Iperf_ComputeModifiedBW(ue_num)
time.sleep(0.5)
self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
if (useIperf3):
self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
self.Iperf_analyzeV3Output(lock, UE_IPAddress)
else:
self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
self.Iperf_analyzeV2Output(lock, UE_IPAddress)
self.close() self.close()
self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
...@@ -668,7 +720,7 @@ class SSHConnection(): ...@@ -668,7 +720,7 @@ class SSHConnection():
lock = Lock() lock = Lock()
for UE_IPAddress in self.UEIPAddresses: for UE_IPAddress in self.UEIPAddresses:
device_id = self.UEDevices[i] device_id = self.UEDevices[i]
p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,ue_num,)) p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,i,ue_num,))
p.daemon = True p.daemon = True
p.start() p.start()
multi_jobs.append(p) multi_jobs.append(p)
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
--> -->
<testCaseList> <testCaseList>
<TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040401 040201 030201 030111 040301 040511 040611 040612 040613 040401 040201 030201 030112 040301 040512 040621 040622 040623 040401 040201 030201 </TestCaseRequestedList> <TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040641 040401 040201 030201 030111 040301 040511 040611 040612 040613 040651 040401 040201 030201 030121 040301 040521 040621 040622 040623 040661 040401 040201 030201 </TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList> <TestCaseExclusionList></TestCaseExclusionList>
<testCase id="010101"> <testCase id="010101">
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args>
</testCase> </testCase>
<testCase id="030112"> <testCase id="030121">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize eNB (FDD/Band7/20MHz)</desc> <desc>Initialize eNB (FDD/Band7/20MHz)</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf</Initialize_eNB_args>
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
<ping_packetloss_threshold>5</ping_packetloss_threshold> <ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase> </testCase>
<testCase id="040512"> <testCase id="040521">
<class>Ping</class> <class>Ping</class>
<desc>ping (20MHz - 20 sec)</desc> <desc>ping (20MHz - 20 sec)</desc>
<ping_args>-c 20</ping_args> <ping_args>-c 20</ping_args>
...@@ -115,6 +115,13 @@ ...@@ -115,6 +115,13 @@
<iperf_packetloss_threshold>50</iperf_packetloss_threshold> <iperf_packetloss_threshold>50</iperf_packetloss_threshold>
</testCase> </testCase>
<testCase id="040641">
<class>Iperf</class>
<desc>iperf (5MHz - UL/9Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 9M -t 60 -i 1 -R</iperf_args>
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
</testCase>
<testCase id="040611"> <testCase id="040611">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (10MHz - DL/10Mbps/UDP)(60 sec)</desc> <desc>iperf (10MHz - DL/10Mbps/UDP)(60 sec)</desc>
...@@ -136,6 +143,13 @@ ...@@ -136,6 +143,13 @@
<iperf_packetloss_threshold>50</iperf_packetloss_threshold> <iperf_packetloss_threshold>50</iperf_packetloss_threshold>
</testCase> </testCase>
<testCase id="040651">
<class>Iperf</class>
<desc>iperf (10MHz - UL/20Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args>
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
</testCase>
<testCase id="040621"> <testCase id="040621">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (20MHz - DL/20Mbps/UDP)(60 sec)</desc> <desc>iperf (20MHz - DL/20Mbps/UDP)(60 sec)</desc>
...@@ -157,6 +171,13 @@ ...@@ -157,6 +171,13 @@
<iperf_packetloss_threshold>50</iperf_packetloss_threshold> <iperf_packetloss_threshold>50</iperf_packetloss_threshold>
</testCase> </testCase>
<testCase id="040661">
<class>Iperf</class>
<desc>iperf (20MHz - UL/20Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args>
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
</testCase>
<testCase id="050101"> <testCase id="050101">
<class>Initialize_HSS</class> <class>Initialize_HSS</class>
<desc>Initialize HSS</desc> <desc>Initialize HSS</desc>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment