CI: fixes and enhancements
-- fix for IF4p5 TDD scenario (missing build test-case)
-- added automatic UE/eNB termination in main.py when iperf/ping fails
It allows to have a eNB log analysis for HTML reporting
-- added statistics on PDCP out-of-resource messages
-- added statistics on ULSCH error messages
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
This commit is contained in:
@@ -13,7 +13,7 @@ RUs = (
|
|||||||
nb_rx = 1;
|
nb_rx = 1;
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 115;
|
max_rxgain = 115;
|
||||||
bands = [7];
|
bands = [40];
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
+48
-12
@@ -384,7 +384,7 @@ class SSHConnection():
|
|||||||
loopCounter = loopCounter - 1
|
loopCounter = loopCounter - 1
|
||||||
if (loopCounter == 0):
|
if (loopCounter == 0):
|
||||||
doLoop = False
|
doLoop = False
|
||||||
logging.error('\u001B[1;37;41m eNB logging system did not show got sync! See with attach later \u001B[0m')
|
logging.error('\u001B[1;37;41m eNB logging system did not show got sync! \u001B[0m')
|
||||||
self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'KO', ALL_PROCESSES_OK)
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
self.close()
|
self.close()
|
||||||
@@ -489,6 +489,7 @@ class SSHConnection():
|
|||||||
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
@@ -505,6 +506,7 @@ class SSHConnection():
|
|||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow('N/A', 'KO', ALL_PROCESSES_OK)
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
attach_status = True
|
attach_status = True
|
||||||
@@ -524,6 +526,7 @@ class SSHConnection():
|
|||||||
self.CreateHtmlTestRowQueue('N/A', 'OK', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue('N/A', 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
@@ -544,6 +547,7 @@ class SSHConnection():
|
|||||||
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
@@ -765,6 +769,7 @@ class SSHConnection():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
self.CreateHtmlTestRow(self.ping_args, 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow(self.ping_args, 'KO', ALL_PROCESSES_OK)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
@@ -783,6 +788,7 @@ class SSHConnection():
|
|||||||
self.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
@@ -1217,11 +1223,13 @@ class SSHConnection():
|
|||||||
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
self.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
if (ueIpStatus < 0):
|
if (ueIpStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.iperf_args, 'KO', UE_IP_ADDRESS_ISSUE)
|
self.CreateHtmlTestRow(self.iperf_args, 'KO', UE_IP_ADDRESS_ISSUE)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
@@ -1241,6 +1249,7 @@ class SSHConnection():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
self.CreateHtmlTestRow(self.iperf_args, 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow(self.iperf_args, 'KO', ALL_PROCESSES_OK)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
@@ -1264,6 +1273,7 @@ class SSHConnection():
|
|||||||
self.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter()
|
self.CreateHtmlFooter()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
@@ -1391,6 +1401,8 @@ class SSHConnection():
|
|||||||
rrcReestablishComplete = 0
|
rrcReestablishComplete = 0
|
||||||
rrcReestablishReject = 0
|
rrcReestablishReject = 0
|
||||||
uciStatMsgCount = 0
|
uciStatMsgCount = 0
|
||||||
|
pdcpFailure = 0
|
||||||
|
ulschFailure = 0
|
||||||
for line in enb_log_file.readlines():
|
for line in enb_log_file.readlines():
|
||||||
result = re.search('[Ss]egmentation [Ff]ault', str(line))
|
result = re.search('[Ss]egmentation [Ff]ault', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -1434,12 +1446,25 @@ class SSHConnection():
|
|||||||
result = re.search('uci->stat', str(line))
|
result = re.search('uci->stat', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
uciStatMsgCount += 1
|
uciStatMsgCount += 1
|
||||||
|
result = re.search('PDCP.*Out of Resources.*reason', str(line))
|
||||||
|
if result is not None:
|
||||||
|
pdcpFailure += 1
|
||||||
|
result = re.search('ULSCH in error in round', str(line))
|
||||||
|
if result is not None:
|
||||||
|
ulschFailure += 1
|
||||||
enb_log_file.close()
|
enb_log_file.close()
|
||||||
self.htmleNBFailureMsg = ''
|
self.htmleNBFailureMsg = ''
|
||||||
if uciStatMsgCount > 0:
|
if uciStatMsgCount > 0:
|
||||||
statMsg = 'eNB showed ' + str(uciStatMsgCount) + ' uci->stat message(s)'
|
statMsg = 'eNB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
self.htmleNBFailureMsg += statMsg + '\n'
|
self.htmleNBFailureMsg += statMsg + '\n'
|
||||||
|
if pdcpFailure > 0:
|
||||||
|
statMsg = 'eNB showed ' + str(pdcpFailure) + ' "PDCP Out of Resources" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += statMsg + '\n'
|
||||||
|
if ulschFailure > 0:
|
||||||
|
statMsg = 'eNB showed ' + str(ulschFailure) + ' "ULSCH in error in round" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
if rrcSetupRequest > 0 or rrcSetupComplete > 0:
|
if rrcSetupRequest > 0 or rrcSetupComplete > 0:
|
||||||
rrcMsg = 'eNB requested ' + str(rrcSetupRequest) + ' RRC Connection Setup(s)'
|
rrcMsg = 'eNB requested ' + str(rrcSetupRequest) + ' RRC Connection Setup(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
@@ -1586,6 +1611,17 @@ class SSHConnection():
|
|||||||
job.join()
|
job.join()
|
||||||
self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
def AutoTerminateUEandeNB(self):
|
||||||
|
self.testCase_id = 'AUTO-KILL-UE'
|
||||||
|
self.desc = 'Automatic Termination of UE'
|
||||||
|
self.ShowTestID()
|
||||||
|
self.TerminateUE()
|
||||||
|
self.testCase_id = 'AUTO-KILL-eNB'
|
||||||
|
self.desc = 'Automatic Termination of eNB'
|
||||||
|
self.ShowTestID()
|
||||||
|
self.eNB_instance = '0'
|
||||||
|
self.TerminateeNB()
|
||||||
|
|
||||||
def LogCollectBuild(self):
|
def LogCollectBuild(self):
|
||||||
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
||||||
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
||||||
@@ -1822,6 +1858,15 @@ class SSHConnection():
|
|||||||
i += 1
|
i += 1
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# ShowTestID()
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
def ShowTestID(self):
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
|
logging.debug('\u001B[1mTest ID:' + self.testCase_id + '\u001B[0m')
|
||||||
|
logging.debug('\u001B[1m' + self.desc + '\u001B[0m')
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Usage()
|
# Usage()
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -1853,15 +1898,6 @@ def Usage():
|
|||||||
print(' --XMLTestFile=[XML Test File to be run]')
|
print(' --XMLTestFile=[XML Test File to be run]')
|
||||||
print('------------------------------------------------------------')
|
print('------------------------------------------------------------')
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
|
||||||
# ShowTestID()
|
|
||||||
#-----------------------------------------------------------
|
|
||||||
def ShowTestID():
|
|
||||||
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
|
||||||
logging.debug('\u001B[1mTest ID:' + SSH.testCase_id + '\u001B[0m')
|
|
||||||
logging.debug('\u001B[1m' + SSH.desc + '\u001B[0m')
|
|
||||||
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
|
||||||
|
|
||||||
def CheckClassValidity(action,id):
|
def CheckClassValidity(action,id):
|
||||||
if action != 'Build_eNB' and action != 'Initialize_eNB' and action != 'Terminate_eNB' and action != 'Initialize_UE' and action != 'Terminate_UE' and action != 'Attach_UE' and action != 'Detach_UE' and action != 'Ping' and action != 'Iperf' and action != 'Reboot_UE' and action != 'Initialize_HSS' and action != 'Terminate_HSS' and action != 'Initialize_MME' and action != 'Terminate_MME' and action != 'Initialize_SPGW' and action != 'Terminate_SPGW':
|
if action != 'Build_eNB' and action != 'Initialize_eNB' and action != 'Terminate_eNB' and action != 'Initialize_UE' and action != 'Terminate_UE' and action != 'Attach_UE' and action != 'Detach_UE' and action != 'Ping' and action != 'Iperf' and action != 'Reboot_UE' and action != 'Initialize_HSS' and action != 'Terminate_HSS' and action != 'Initialize_MME' and action != 'Terminate_MME' and action != 'Initialize_SPGW' and action != 'Terminate_SPGW':
|
||||||
logging.debug('ERROR: test-case ' + id + ' has wrong class ' + action)
|
logging.debug('ERROR: test-case ' + id + ' has wrong class ' + action)
|
||||||
@@ -2118,7 +2154,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE):
|
|||||||
action = test.findtext('class')
|
action = test.findtext('class')
|
||||||
if (CheckClassValidity(action, id) == False):
|
if (CheckClassValidity(action, id) == False):
|
||||||
continue
|
continue
|
||||||
ShowTestID()
|
SSH.ShowTestID()
|
||||||
GetParametersFromXML(action)
|
GetParametersFromXML(action)
|
||||||
if action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Ping' or action == 'Iperf' or action == 'Reboot_UE':
|
if action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Ping' or action == 'Iperf' or action == 'Reboot_UE':
|
||||||
terminate_ue_flag = False
|
terminate_ue_flag = False
|
||||||
|
|||||||
@@ -22,14 +22,14 @@
|
|||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<!-- Only 5MHz is tested since neither 10MHz nor 20MHz work in this configuration -->
|
<!-- Only 5MHz is tested since neither 10MHz nor 20MHz work in this configuration -->
|
||||||
<!-- Also no UL iperf in 5MHz -->
|
<!-- Also no UL iperf in 5MHz (040642) -->
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010101
|
||||||
050101 060101 070101 040101
|
050101 060101 070101 040101
|
||||||
030104 030105 040301 040501 040602 040401 040201 030201 030202
|
030104 030105 040301 040501 040602 040401 040201 030201 030202
|
||||||
050201 060201 070201
|
050201 060201 070201
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<!--
|
<!--
|
||||||
010101
|
|
||||||
030104 030105 040301 040501 040602 040642 040401 040201 030201 030202
|
030104 030105 040301 040501 040602 040642 040401 040201 030201 030202
|
||||||
030114 030115 040301 040511 040612 040652 040401 040201 030201 030202
|
030114 030115 040301 040511 040612 040652 040401 040201 030201 030202
|
||||||
030124 030125 040301 040521 040622 040662 040401 040201 030201 030202
|
030124 030125 040301 040521 040622 040662 040401 040201 030201 030202
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
<testCase id="010101">
|
<testCase id="010101">
|
||||||
<class>Build_eNB</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Build eNB (USRP)</desc>
|
<desc>Build eNB (USRP -- Ethernet Fronthaul)</desc>
|
||||||
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
<testCase id="010101">
|
<testCase id="010101">
|
||||||
<class>Build_eNB</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Build eNB (USRP)</desc>
|
<desc>Build eNB (USRP -- Ethernet Fronthaul)</desc>
|
||||||
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user