pushing for debugging
This commit is contained in:
@@ -56,6 +56,7 @@ OAI_UE_PROCESS_COULD_NOT_SYNC = -21
|
|||||||
OAI_UE_PROCESS_ASSERTION = -22
|
OAI_UE_PROCESS_ASSERTION = -22
|
||||||
OAI_UE_PROCESS_FAILED = -23
|
OAI_UE_PROCESS_FAILED = -23
|
||||||
OAI_UE_PROCESS_NO_TUNNEL_INTERFACE = -24
|
OAI_UE_PROCESS_NO_TUNNEL_INTERFACE = -24
|
||||||
|
OAI_UE_PROCESS_SEG_FAULT = -25
|
||||||
OAI_UE_PROCESS_OK = +6
|
OAI_UE_PROCESS_OK = +6
|
||||||
|
|
||||||
UE_STATUS_DETACHED = 0
|
UE_STATUS_DETACHED = 0
|
||||||
@@ -68,4 +69,3 @@ X2_HO_REQ_STATE__TARGET_RECEIVES_REQ = 1
|
|||||||
X2_HO_REQ_STATE__TARGET_RRC_RECFG_COMPLETE = 2
|
X2_HO_REQ_STATE__TARGET_RRC_RECFG_COMPLETE = 2
|
||||||
X2_HO_REQ_STATE__TARGET_SENDS_SWITCH_REQ = 3
|
X2_HO_REQ_STATE__TARGET_SENDS_SWITCH_REQ = 3
|
||||||
X2_HO_REQ_STATE__SOURCE_RECEIVES_REQ_ACK = 10
|
X2_HO_REQ_STATE__SOURCE_RECEIVES_REQ_ACK = 10
|
||||||
|
|
||||||
|
|||||||
+9
-6
@@ -6,6 +6,8 @@ import re # reg
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
import signal
|
||||||
|
|
||||||
from multiprocessing import Process, Lock, SimpleQueue
|
from multiprocessing import Process, Lock, SimpleQueue
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -49,23 +51,22 @@ class EPCManagement():
|
|||||||
def GetType(self):
|
def GetType(self):
|
||||||
return self.EPCType
|
return self.EPCType
|
||||||
def Set_PcapFileName(self, pcapfn):
|
def Set_PcapFileName(self, pcapfn):
|
||||||
self.PcapFileName = pcapfn
|
self.EPC_PcapFileName = pcapfn
|
||||||
def Get_PcapFileName(self):
|
def Get_PcapFileName(self):
|
||||||
return self.PcapFileName
|
return self.EPC_PcapFileName
|
||||||
|
|
||||||
def InitializeHSS(self):
|
def InitializeHSS(self):
|
||||||
if self.EPCIPAddress == '' or self.EPCUserName == '' or self.EPCPassword == '' or self.EPCSourceCodePath == '' or self.EPCType == '':
|
if self.EPCIPAddress == '' or self.EPCUserName == '' or self.EPCPassword == '' or self.EPCSourceCodePath == '' or self.EPCType == '':
|
||||||
HELP.GenericHelp(Version)
|
HELP.GenericHelp(Version)
|
||||||
HELP.EPCSrvHelp(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, self.EPCSourceCodePath, self.EPCType)
|
HELP.EPCSrvHelp(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, self.EPCSourceCodePath, self.EPCType)
|
||||||
sys.exit('Insufficient EPC Parameters')
|
sys.exit('Insufficient EPC Parameters')
|
||||||
#mySSH = SSH()
|
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
|
mySSH.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
|
||||||
if re.match('OAI-Rel14-CUPS', self.EPCType, re.IGNORECASE):
|
if re.match('OAI-Rel14-CUPS', self.EPCType, re.IGNORECASE):
|
||||||
logging.debug('Using the OAI EPC Release 14 Cassandra-based HSS')
|
logging.debug('Using the OAI EPC Release 14 Cassandra-based HSS')
|
||||||
mySSH.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
|
||||||
logging.debug('\u001B[1m Launching tshark on all interfaces \u001B[0m')
|
logging.debug('\u001B[1m Launching tshark on all interfaces \u001B[0m')
|
||||||
EPC_PcapFileName = 'epc_' + self.testCase_id + '.pcap'
|
self.EPC_PcapFileName = 'epc_' + self.testCase_id + '.pcap'
|
||||||
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S rm -f ' + self.EPC_PcapFileName, '\$', 5)
|
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S rm -f ' + self.EPC_PcapFileName, '\$', 5)
|
||||||
mySSH.command('echo $USER; nohup sudo tshark -f "tcp port not 22 and port not 53" -i any -w ' + self.EPCSourceCodePath + '/scripts/' + self.EPC_PcapFileName + ' > /tmp/tshark.log 2>&1 &', self.EPCUserName, 5)
|
mySSH.command('echo $USER; nohup sudo tshark -f "tcp port not 22 and port not 53" -i any -w ' + self.EPCSourceCodePath + '/scripts/' + self.EPC_PcapFileName + ' > /tmp/tshark.log 2>&1 &', self.EPCUserName, 5)
|
||||||
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S mkdir -p logs', '\$', 5)
|
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S mkdir -p logs', '\$', 5)
|
||||||
@@ -85,7 +86,8 @@ class EPCManagement():
|
|||||||
mySSH.command('mkdir -p ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('mkdir -p ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
|
||||||
mySSH.command('cd /opt/hss_sim0609', '\$', 5)
|
mySSH.command('cd /opt/hss_sim0609', '\$', 5)
|
||||||
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S rm -f hss.log daemon.log', '\$', 5)
|
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S rm -f hss.log daemon.log', '\$', 5)
|
||||||
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S echo "Starting sudo session" && sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real ', '\$', 5)
|
#mySSH.command('echo ' + self.EPCPassword + ' | sudo -S echo "Starting sudo session" && sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real ', '\$', 5)
|
||||||
|
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S echo "Starting sudo session" && sudo su -c "screen -dm -S simulated_hss ./starthss"', '\$', 5)
|
||||||
else:
|
else:
|
||||||
logging.error('This option should not occur!')
|
logging.error('This option should not occur!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
@@ -248,7 +250,8 @@ class EPCManagement():
|
|||||||
mySSH.command('cd scripts', '\$', 5)
|
mySSH.command('cd scripts', '\$', 5)
|
||||||
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S daemon --name=simulated_hss --stop', '\$', 5)
|
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S daemon --name=simulated_hss --stop', '\$', 5)
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
mySSH.command('echo ' + self.EPCPassword + ' | sudo -S killall --signal SIGKILL hss_sim', '\$', 5)
|
#mySSH.command('echo ' + self.EPCPassword + ' | sudo -S killall --signal SIGKILL hss_sim', '\$', 5)
|
||||||
|
mySSH.command('echo ' + self.EPCPassword + ' | sudo killall hss_sim', '\$', 5)
|
||||||
else:
|
else:
|
||||||
logging.error('This should not happen!')
|
logging.error('This should not happen!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|||||||
@@ -0,0 +1,528 @@
|
|||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import sys # arg
|
||||||
|
import re # reg
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
from multiprocessing import Process, Lock, SimpleQueue
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# OAI Testing modules
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
#import main_enb
|
||||||
|
#MAIN = main_enb.OaiCiTest()
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Class Declaration
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
class HTMLManagement():
|
||||||
|
def __init__(self):
|
||||||
|
# self.FailReportCnt = 0
|
||||||
|
# self.prematureExit = False
|
||||||
|
self.ranRepository = ''
|
||||||
|
self.ranBranch = ''
|
||||||
|
self.ranAllowMerge = False
|
||||||
|
self.ranCommitID = ''
|
||||||
|
self.ranTargetBranch = ''
|
||||||
|
#self.eNBIPAddress = ''
|
||||||
|
#self.eNBUserName = ''
|
||||||
|
#self.eNBPassword = ''
|
||||||
|
#self.eNBSourceCodePath = ''
|
||||||
|
#self.eNB1IPAddress = ''
|
||||||
|
#self.eNB1UserName = ''
|
||||||
|
#self.eNB1Password = ''
|
||||||
|
#self.eNB1SourceCodePath = ''
|
||||||
|
#self.eNB2IPAddress = ''
|
||||||
|
#self.eNB2UserName = ''
|
||||||
|
#self.eNB2Password = ''
|
||||||
|
#self.eNB2SourceCodePath = ''
|
||||||
|
#self.ADBIPAddress = ''
|
||||||
|
#self.ADBUserName = ''
|
||||||
|
#self.ADBPassword = ''
|
||||||
|
#self.ADBCentralized = True
|
||||||
|
#self.testCase_id = ''
|
||||||
|
self.testXMLfiles = []
|
||||||
|
self.nbTestXMLfiles = 0
|
||||||
|
#self.desc = ''
|
||||||
|
#self.Build_eNB_args = ''
|
||||||
|
#self.backgroundBuild = False
|
||||||
|
#self.backgroundBuildTestId = ['', '', '']
|
||||||
|
#self.Build_eNB_forced_workspace_cleanup = False
|
||||||
|
#self.Initialize_eNB_args = ''
|
||||||
|
#self.air_interface = 'lte'
|
||||||
|
#self.eNB_instance = ''
|
||||||
|
#self.eNB_serverId = ''
|
||||||
|
#self.eNBLogFiles = ['', '', '']
|
||||||
|
#self.eNBOptions = ['', '', '']
|
||||||
|
#self.eNBmbmsEnables = [False, False, False]
|
||||||
|
#self.eNBstatuses = [-1, -1, -1]
|
||||||
|
#self.ping_args = ''
|
||||||
|
#self.ping_packetloss_threshold = ''
|
||||||
|
#self.iperf_args = ''
|
||||||
|
#self.iperf_packetloss_threshold = ''
|
||||||
|
#self.iperf_profile = ''
|
||||||
|
#self.iperf_options = ''
|
||||||
|
#self.nbMaxUEtoAttach = -1
|
||||||
|
#self.UEDevices = []
|
||||||
|
#self.UEDevicesStatus = []
|
||||||
|
#self.UEDevicesRemoteServer = []
|
||||||
|
#self.UEDevicesRemoteUser = []
|
||||||
|
#self.UEDevicesOffCmd = []
|
||||||
|
#self.UEDevicesOnCmd = []
|
||||||
|
#self.UEDevicesRebootCmd = []
|
||||||
|
#self.CatMDevices = []
|
||||||
|
#self.UEIPAddresses = []
|
||||||
|
self.htmlFile = ''
|
||||||
|
self.htmlHeaderCreated = False
|
||||||
|
self.htmlFooterCreated = False
|
||||||
|
self.htmlUEConnected = -1
|
||||||
|
self.htmlNb_Smartphones = 0
|
||||||
|
self.htmlNb_CATM_Modules = 0
|
||||||
|
self.htmleNBFailureMsg = ''
|
||||||
|
self.htmlUEFailureMsg = ''
|
||||||
|
#self.picocom_closure = False
|
||||||
|
#self.idle_sleep_time = 0
|
||||||
|
#self.x2_ho_options = 'network'
|
||||||
|
#self.x2NbENBs = 0
|
||||||
|
#self.x2ENBBsIds = []
|
||||||
|
#self.x2ENBConnectedUEs = []
|
||||||
|
self.htmlTabRefs = []
|
||||||
|
self.htmlTabNames = []
|
||||||
|
self.htmlTabIcons = []
|
||||||
|
#self.repeatCounts = []
|
||||||
|
#self.finalStatus = False
|
||||||
|
#self.OsVersion = ''
|
||||||
|
#self.KernelVersion = ''
|
||||||
|
#self.UhdVersion = ''
|
||||||
|
#self.UsrpBoard = ''
|
||||||
|
#self.CpuNb = ''
|
||||||
|
#self.CpuModel = ''
|
||||||
|
#self.CpuMHz = ''
|
||||||
|
#self.UEIPAddress = ''
|
||||||
|
#self.UEUserName = ''
|
||||||
|
#self.UEPassword = ''
|
||||||
|
#self.UE_instance = ''
|
||||||
|
#self.UESourceCodePath = ''
|
||||||
|
#self.UELogFile = ''
|
||||||
|
#self.Build_OAI_UE_args = ''
|
||||||
|
#self.Initialize_OAI_UE_args = ''
|
||||||
|
#self.clean_repository = True
|
||||||
|
#self.flexranCtrlInstalled = False
|
||||||
|
#self.flexranCtrlStarted = False
|
||||||
|
#self.expectedNbOfConnectedUEs = 0
|
||||||
|
#self.startTime = 0
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# HTML Reporting....
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
def Setdesc(self, dsc):
|
||||||
|
self.desc = dsc
|
||||||
|
|
||||||
|
def SetstartTime(self, sttime):
|
||||||
|
self.startTime = sttime
|
||||||
|
|
||||||
|
def SettestCase_id(self, tcid):
|
||||||
|
self.testCase_id = tcid
|
||||||
|
|
||||||
|
|
||||||
|
def SetranRepository(self, repository):
|
||||||
|
self.ranRepository = repository
|
||||||
|
def GetranRepository(self):
|
||||||
|
return self.ranRepository
|
||||||
|
|
||||||
|
def SetranAllowMerge(self, merge):
|
||||||
|
self.ranAllowMerge = merge
|
||||||
|
def GetranAllowMerge(self):
|
||||||
|
return self.ranAllowMerge
|
||||||
|
|
||||||
|
|
||||||
|
def SetranBranch(self, branch):
|
||||||
|
self.ranBranch = branch
|
||||||
|
def GetranBranch(self):
|
||||||
|
return self.ranBranch
|
||||||
|
|
||||||
|
def SetranCommitID(self, commitid):
|
||||||
|
self.ranCommitID = commitid
|
||||||
|
def GetranCommitID(self):
|
||||||
|
return self.ranCommitID
|
||||||
|
|
||||||
|
def SetranTargetBranch(self, tbranch):
|
||||||
|
self.ranTargetBranch = tbranch
|
||||||
|
def GetranTargetBranch(self):
|
||||||
|
return self.ranTargetBranch
|
||||||
|
|
||||||
|
# def SetADBIPAddress(self, adbip):
|
||||||
|
# self.ADBIPAddress = adbip
|
||||||
|
# def GetADBIPAddress(self):
|
||||||
|
# return self.ADBIPAddress
|
||||||
|
|
||||||
|
def SethtmlUEConnected(self, nbUEs):
|
||||||
|
self.htmlUEConnected = nbUEs
|
||||||
|
|
||||||
|
def SethtmlNb_Smartphones(self, nbUEs):
|
||||||
|
self.htmlNb_Smartphones = nbUEs
|
||||||
|
|
||||||
|
def SethtmlNb_CATM_Modules(self, nbUEs):
|
||||||
|
self.htmlNb_CATM_Modules = nbUEs
|
||||||
|
|
||||||
|
def SetnbTestXMLfiles(self, nb):
|
||||||
|
self.nbTestXMLfiles = nb
|
||||||
|
|
||||||
|
def SettestXMLfiles(self, xmlFile):
|
||||||
|
self.testXMLfiles.append(xmlFile)
|
||||||
|
|
||||||
|
def SethtmlTabRefs(self, tabRef):
|
||||||
|
self.htmlTabRefs.append(tabRef)
|
||||||
|
|
||||||
|
def SethtmlTabNames(self, tabName):
|
||||||
|
self.htmlTabNames.append(tabName)
|
||||||
|
|
||||||
|
def SethtmlTabIcons(self, tabIcon):
|
||||||
|
self.htmlTabIcons.append(tabIcon)
|
||||||
|
|
||||||
|
def CreateHtmlHeader(self, ADBIPAddress):
|
||||||
|
if (not self.htmlHeaderCreated):
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
|
logging.debug('\u001B[1m Creating HTML header \u001B[0m')
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
|
self.htmlFile = open('test_results.html', 'w')
|
||||||
|
self.htmlFile.write('<!DOCTYPE html>\n')
|
||||||
|
self.htmlFile.write('<html class="no-js" lang="en-US">\n')
|
||||||
|
self.htmlFile.write('<head>\n')
|
||||||
|
self.htmlFile.write(' <meta name="viewport" content="width=device-width, initial-scale=1">\n')
|
||||||
|
self.htmlFile.write(' <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">\n')
|
||||||
|
self.htmlFile.write(' <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>\n')
|
||||||
|
self.htmlFile.write(' <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>\n')
|
||||||
|
self.htmlFile.write(' <title>Test Results for TEMPLATE_JOB_NAME job build #TEMPLATE_BUILD_ID</title>\n')
|
||||||
|
self.htmlFile.write('</head>\n')
|
||||||
|
self.htmlFile.write('<body><div class="container">\n')
|
||||||
|
self.htmlFile.write(' <br>\n')
|
||||||
|
self.htmlFile.write(' <table style="border-collapse: collapse; border: none;">\n')
|
||||||
|
self.htmlFile.write(' <tr style="border-collapse: collapse; border: none;">\n')
|
||||||
|
self.htmlFile.write(' <td style="border-collapse: collapse; border: none;">\n')
|
||||||
|
self.htmlFile.write(' <a href="http://www.openairinterface.org/">\n')
|
||||||
|
self.htmlFile.write(' <img src="http://www.openairinterface.org/wp-content/uploads/2016/03/cropped-oai_final_logo2.png" alt="" border="none" height=50 width=150>\n')
|
||||||
|
self.htmlFile.write(' </img>\n')
|
||||||
|
self.htmlFile.write(' </a>\n')
|
||||||
|
self.htmlFile.write(' </td>\n')
|
||||||
|
self.htmlFile.write(' <td style="border-collapse: collapse; border: none; vertical-align: center;">\n')
|
||||||
|
self.htmlFile.write(' <b><font size = "6">Job Summary -- Job: TEMPLATE_JOB_NAME -- Build-ID: TEMPLATE_BUILD_ID</font></b>\n')
|
||||||
|
self.htmlFile.write(' </td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' </table>\n')
|
||||||
|
self.htmlFile.write(' <br>\n')
|
||||||
|
self.htmlFile.write(' <div class="alert alert-info"><strong> <span class="glyphicon glyphicon-dashboard"></span> TEMPLATE_STAGE_NAME</strong></div>\n')
|
||||||
|
self.htmlFile.write(' <table border = "1">\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-time"></span> Build Start Time (UTC) </td>\n')
|
||||||
|
self.htmlFile.write(' <td>TEMPLATE_BUILD_TIME</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-cloud-upload"></span> GIT Repository </td>\n')
|
||||||
|
self.htmlFile.write(' <td><a href="' + self.ranRepository + '">' + self.ranRepository + '</a></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-wrench"></span> Job Trigger </td>\n')
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
self.htmlFile.write(' <td>Merge-Request</td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td>Push to Branch</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-log-out"></span> Source Branch </td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tree-deciduous"></span> Branch</td>\n')
|
||||||
|
self.htmlFile.write(' <td>' + self.ranBranch + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Source Commit ID </td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID </td>\n')
|
||||||
|
self.htmlFile.write(' <td>' + self.ranCommitID + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
if self.ranAllowMerge != '':
|
||||||
|
commit_message = subprocess.check_output("git log -n1 --pretty=format:\"%s\" " + self.ranCommitID, shell=True, universal_newlines=True)
|
||||||
|
commit_message = commit_message.strip()
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-comment"></span> Source Commit Message </td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-comment"></span> Commit Message </td>\n')
|
||||||
|
self.htmlFile.write(' <td>' + commit_message + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-log-in"></span> Target Branch </td>\n')
|
||||||
|
if (self.ranTargetBranch == ''):
|
||||||
|
self.htmlFile.write(' <td>develop</td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td>' + self.ranTargetBranch + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' </table>\n')
|
||||||
|
|
||||||
|
if (ADBIPAddress != 'none'):
|
||||||
|
#terminate_ue_flag = True
|
||||||
|
#MAIN.GetAllUEDevices(terminate_ue_flag)
|
||||||
|
#self.GetAllCatMDevices(terminate_ue_flag)
|
||||||
|
#self.htmlUEConnected = len(self.UEDevices)
|
||||||
|
self.htmlFile.write(' <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> ' + str(self.htmlNb_Smartphones) + ' UE(s) is(are) connected to ADB bench server</h2>\n')
|
||||||
|
self.htmlFile.write(' <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> ' + str(self.htmlNb_CATM_Modules) + ' CAT-M UE(s) is(are) connected to bench server</h2>\n')
|
||||||
|
else:
|
||||||
|
#self.UEDevices.append('OAI-UE')
|
||||||
|
#self.htmlUEConnected = len(self.UEDevices)
|
||||||
|
self.htmlUEConnected = 1
|
||||||
|
self.htmlFile.write(' <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> 1 OAI UE(s) is(are) connected to CI bench</h2>\n')
|
||||||
|
self.htmlFile.write(' <br>\n')
|
||||||
|
self.htmlFile.write(' <ul class="nav nav-pills">\n')
|
||||||
|
count = 0
|
||||||
|
while (count < self.nbTestXMLfiles):
|
||||||
|
pillMsg = ' <li><a data-toggle="pill" href="#'
|
||||||
|
pillMsg += self.htmlTabRefs[count]
|
||||||
|
pillMsg += '">'
|
||||||
|
pillMsg += '__STATE_' + self.htmlTabNames[count] + '__'
|
||||||
|
pillMsg += self.htmlTabNames[count]
|
||||||
|
pillMsg += ' <span class="glyphicon glyphicon-'
|
||||||
|
pillMsg += self.htmlTabIcons[count]
|
||||||
|
pillMsg += '"></span></a></li>\n'
|
||||||
|
self.htmlFile.write(pillMsg)
|
||||||
|
count += 1
|
||||||
|
self.htmlFile.write(' </ul>\n')
|
||||||
|
self.htmlFile.write(' <div class="tab-content">\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
|
||||||
|
def CreateHtmlTabHeader(self):
|
||||||
|
if (not self.htmlHeaderCreated):
|
||||||
|
if (not os.path.isfile('test_results.html')):
|
||||||
|
self.CreateHtmlHeader('none')
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
if (self.nbTestXMLfiles == 1):
|
||||||
|
self.htmlFile.write(' <div id="' + self.htmlTabRefs[0] + '" class="tab-pane fade">\n')
|
||||||
|
self.htmlFile.write(' <h3>Test Summary for <span class="glyphicon glyphicon-file"></span> ' + self.testXMLfiles[0] + '</h3>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <div id="build-tab" class="tab-pane fade">\n')
|
||||||
|
self.htmlFile.write(' <table class="table" border = "1">\n')
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
|
||||||
|
self.htmlFile.write(' <th>Relative Time (ms)</th>\n')
|
||||||
|
self.htmlFile.write(' <th>Test Id</th>\n')
|
||||||
|
self.htmlFile.write(' <th>Test Desc</th>\n')
|
||||||
|
self.htmlFile.write(' <th>Test Options</th>\n')
|
||||||
|
self.htmlFile.write(' <th>Test Status</th>\n')
|
||||||
|
#if (self.htmlUEConnected == -1):
|
||||||
|
# terminate_ue_flag = True
|
||||||
|
# if (self.ADBIPAddress != 'none'):
|
||||||
|
# self.GetAllUEDevices(terminate_ue_flag)
|
||||||
|
# self.GetAllCatMDevices(terminate_ue_flag)
|
||||||
|
# else:
|
||||||
|
# self.UEDevices.append('OAI-UE')
|
||||||
|
# self.htmlUEConnected = len(self.UEDevices)
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
while (i < self.htmlUEConnected):
|
||||||
|
self.htmlFile.write(' <th>UE' + str(i) + ' Status</th>\n')
|
||||||
|
i += 1
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
self.htmlHeaderCreated = True
|
||||||
|
|
||||||
|
def CreateHtmlTabFooter(self, passStatus):
|
||||||
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <th bgcolor = "#33CCFF" colspan=3>Final Tab Status</th>\n')
|
||||||
|
if passStatus:
|
||||||
|
self.htmlFile.write(' <th bgcolor = "green" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">PASS <span class="glyphicon glyphicon-ok"></span> </font></th>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <th bgcolor = "red" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' </table>\n')
|
||||||
|
self.htmlFile.write(' </div>\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
time.sleep(1)
|
||||||
|
if passStatus:
|
||||||
|
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__//' test_results.html"
|
||||||
|
subprocess.run(cmd, shell=True)
|
||||||
|
else:
|
||||||
|
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-remove\"><\/span>/' test_results.html"
|
||||||
|
subprocess.run(cmd, shell=True)
|
||||||
|
self.htmlFooterCreated = False
|
||||||
|
|
||||||
|
def CreateHtmlFooter(self, passStatus):
|
||||||
|
if (os.path.isfile('test_results.html')):
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
|
logging.debug('\u001B[1m Creating HTML footer \u001B[0m')
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
|
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
self.htmlFile.write('</div>\n')
|
||||||
|
self.htmlFile.write(' <p></p>\n')
|
||||||
|
self.htmlFile.write(' <table class="table table-condensed">\n')
|
||||||
|
|
||||||
|
machines = [ 'eNB', 'UE' ]
|
||||||
|
for machine in machines:
|
||||||
|
#This needs to move back to main and be called before CreateHtmlFooter
|
||||||
|
res = self.RetrieveSystemVersion(machine)
|
||||||
|
if res == -1:
|
||||||
|
continue
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <th colspan=8>' + str(machine) + ' Server Characteristics</th>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td>OS Version</td>\n')
|
||||||
|
self.htmlFile.write(' <td><span class="label label-default">' + self.OsVersion + '</span></td>\n')
|
||||||
|
self.htmlFile.write(' <td>Kernel Version</td>\n')
|
||||||
|
self.htmlFile.write(' <td><span class="label label-default">' + self.KernelVersion + '</span></td>\n')
|
||||||
|
self.htmlFile.write(' <td>UHD Version</td>\n')
|
||||||
|
self.htmlFile.write(' <td><span class="label label-default">' + self.UhdVersion + '</span></td>\n')
|
||||||
|
self.htmlFile.write(' <td>USRP Board</td>\n')
|
||||||
|
self.htmlFile.write(' <td><span class="label label-default">' + self.UsrpBoard + '</span></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td>Nb CPUs</td>\n')
|
||||||
|
self.htmlFile.write(' <td><span class="label label-default">' + self.CpuNb + '</span></td>\n')
|
||||||
|
self.htmlFile.write(' <td>CPU Model Name</td>\n')
|
||||||
|
self.htmlFile.write(' <td><span class="label label-default">' + self.CpuModel + '</span></td>\n')
|
||||||
|
self.htmlFile.write(' <td>CPU Frequency</td>\n')
|
||||||
|
self.htmlFile.write(' <td><span class="label label-default">' + self.CpuMHz + '</span></td>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <th colspan=5 bgcolor = "#33CCFF">Final Status</th>\n')
|
||||||
|
if passStatus:
|
||||||
|
self.htmlFile.write(' <th colspan=3 bgcolor="green"><font color="white">PASS <span class="glyphicon glyphicon-ok"></span></font></th>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <th colspan=3 bgcolor="red"><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' </table>\n')
|
||||||
|
self.htmlFile.write(' <p></p>\n')
|
||||||
|
self.htmlFile.write(' <div class="well well-lg">End of Test Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2018 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
|
||||||
|
self.htmlFile.write('</div></body>\n')
|
||||||
|
self.htmlFile.write('</html>\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
|
||||||
|
#FailReportCnt should be passed as a parameter of CreateHtmlRetrySeparator method
|
||||||
|
# no need for a setter and be a member of html class
|
||||||
|
def CreateHtmlRetrySeparator(self, cntnumfails):
|
||||||
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(5+self.htmlUEConnected) + '>Try Run #' + str(cntnumfails) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
|
||||||
|
def CreateHtmlTestRow(self, options, status, processesStatus, machine='eNB'):
|
||||||
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
currentTime = int(round(time.time() * 1000)) - self.startTime
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + format(currentTime / 1000, '.1f') + '</td>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCase_id + '</td>\n')
|
||||||
|
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
||||||
|
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
||||||
|
if (str(status) == 'OK'):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n')
|
||||||
|
elif (str(status) == 'KO'):
|
||||||
|
if (processesStatus == 0):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n')
|
||||||
|
elif (processesStatus == ENB_PROCESS_FAILED):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - eNB process not found</td>\n')
|
||||||
|
elif (processesStatus == OAI_UE_PROCESS_FAILED):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - OAI UE process not found</td>\n')
|
||||||
|
elif (processesStatus == ENB_PROCESS_SEG_FAULT) or (processesStatus == OAI_UE_PROCESS_SEG_FAULT):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process ended in Segmentation Fault</td>\n')
|
||||||
|
elif (processesStatus == ENB_PROCESS_ASSERTION) or (processesStatus == OAI_UE_PROCESS_ASSERTION):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process ended in Assertion</td>\n')
|
||||||
|
elif (processesStatus == ENB_PROCESS_REALTIME_ISSUE):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process faced Real Time issue(s)</td>\n')
|
||||||
|
elif (processesStatus == ENB_PROCESS_NOLOGFILE_TO_ANALYZE) or (processesStatus == OAI_UE_PROCESS_NOLOGFILE_TO_ANALYZE):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "orange" >OK?</td>\n')
|
||||||
|
elif (processesStatus == ENB_PROCESS_SLAVE_RRU_NOT_SYNCED):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' Slave RRU could not synch</td>\n')
|
||||||
|
elif (processesStatus == OAI_UE_PROCESS_COULD_NOT_SYNC):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - UE could not sync</td>\n')
|
||||||
|
elif (processesStatus == HSS_PROCESS_FAILED):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - HSS process not found</td>\n')
|
||||||
|
elif (processesStatus == MME_PROCESS_FAILED):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - MME process not found</td>\n')
|
||||||
|
elif (processesStatus == SPGW_PROCESS_FAILED):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - SPGW process not found</td>\n')
|
||||||
|
elif (processesStatus == UE_IP_ADDRESS_ISSUE):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - Could not retrieve UE IP address</td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td bgcolor = "orange" >' + str(status) + '</td>\n')
|
||||||
|
if (len(str(self.htmleNBFailureMsg)) > 2):
|
||||||
|
cellBgColor = 'white'
|
||||||
|
result = re.search('ended with|faced real time issues', self.htmleNBFailureMsg)
|
||||||
|
if result is not None:
|
||||||
|
cellBgColor = 'red'
|
||||||
|
else:
|
||||||
|
result = re.search('showed|Reestablishment|Could not copy eNB logfile', self.htmleNBFailureMsg)
|
||||||
|
if result is not None:
|
||||||
|
cellBgColor = 'orange'
|
||||||
|
self.htmlFile.write(' <td bgcolor = "' + cellBgColor + '" colspan=' + str(self.htmlUEConnected) + '><pre style="background-color:' + cellBgColor + '">' + self.htmleNBFailureMsg + '</pre></td>\n')
|
||||||
|
self.htmleNBFailureMsg = ''
|
||||||
|
elif (len(str(self.htmlUEFailureMsg)) > 2):
|
||||||
|
cellBgColor = 'white'
|
||||||
|
result = re.search('ended with|faced real time issues', self.htmlUEFailureMsg)
|
||||||
|
if result is not None:
|
||||||
|
cellBgColor = 'red'
|
||||||
|
else:
|
||||||
|
result = re.search('showed|Could not copy UE logfile|oaitun_ue1 interface is either NOT mounted or NOT configured', self.htmlUEFailureMsg)
|
||||||
|
if result is not None:
|
||||||
|
cellBgColor = 'orange'
|
||||||
|
self.htmlFile.write(' <td bgcolor = "' + cellBgColor + '" colspan=' + str(self.htmlUEConnected) + '><pre style="background-color:' + cellBgColor + '">' + self.htmlUEFailureMsg + '</pre></td>\n')
|
||||||
|
self.htmlUEFailureMsg = ''
|
||||||
|
else:
|
||||||
|
i = 0
|
||||||
|
while (i < self.htmlUEConnected):
|
||||||
|
self.htmlFile.write(' <td>-</td>\n')
|
||||||
|
i += 1
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
|
||||||
|
def CreateHtmlTestRowQueue(self, options, status, ue_status, ue_queue):
|
||||||
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
currentTime = int(round(time.time() * 1000)) - self.startTime
|
||||||
|
addOrangeBK = False
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + format(currentTime / 1000, '.1f') + '</td>\n')
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCase_id + '</td>\n')
|
||||||
|
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
||||||
|
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
||||||
|
if (str(status) == 'OK'):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n')
|
||||||
|
elif (str(status) == 'KO'):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n')
|
||||||
|
else:
|
||||||
|
addOrangeBK = True
|
||||||
|
self.htmlFile.write(' <td bgcolor = "orange" >' + str(status) + '</td>\n')
|
||||||
|
i = 0
|
||||||
|
while (i < self.htmlUEConnected):
|
||||||
|
if (i < ue_status):
|
||||||
|
if (not ue_queue.empty()):
|
||||||
|
if (addOrangeBK):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "orange" >' + str(ue_queue.get()).replace('white', 'orange') + '</td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td>' + str(ue_queue.get()) + '</td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td>-</td>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <td>-</td>\n')
|
||||||
|
i += 1
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
|
||||||
|
|
||||||
+277
-1305
File diff suppressed because it is too large
Load Diff
+344
-32
@@ -11,11 +11,47 @@ from multiprocessing import Process, Lock, SimpleQueue
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# OAI Testing modules
|
# OAI Testing modules
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
import sshconnection as mySSH
|
import sshconnection as SSH
|
||||||
#from sshconnection import mySSHConnection as mySSH
|
import epc
|
||||||
import helpreadme as HELP
|
import helpreadme as HELP
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
|
import html as HTML
|
||||||
|
|
||||||
|
EPC = epc.EPCManagement()
|
||||||
|
|
||||||
|
ALL_PROCESSES_OK = CONST.ALL_PROCESSES_OK
|
||||||
|
ENB_PROCESS_FAILED = CONST.ENB_PROCESS_FAILED
|
||||||
|
ENB_PROCESS_OK = CONST.ENB_PROCESS_OK
|
||||||
|
ENB_PROCESS_SEG_FAULT = CONST.ENB_PROCESS_SEG_FAULT
|
||||||
|
ENB_PROCESS_ASSERTION = CONST.ENB_PROCESS_ASSERTION
|
||||||
|
ENB_PROCESS_REALTIME_ISSUE = CONST.ENB_PROCESS_REALTIME_ISSUE
|
||||||
|
ENB_PROCESS_NOLOGFILE_TO_ANALYZE = CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE
|
||||||
|
ENB_PROCESS_SLAVE_RRU_NOT_SYNCED = CONST.ENB_PROCESS_SLAVE_RRU_NOT_SYNCED
|
||||||
|
HSS_PROCESS_FAILED = CONST.HSS_PROCESS_FAILED
|
||||||
|
HSS_PROCESS_OK = CONST.HSS_PROCESS_OK
|
||||||
|
MME_PROCESS_FAILED = CONST.MME_PROCESS_FAILED
|
||||||
|
MME_PROCESS_OK = CONST.MME_PROCESS_OK
|
||||||
|
SPGW_PROCESS_FAILED = CONST.SPGW_PROCESS_FAILED
|
||||||
|
SPGW_PROCESS_OK = CONST.SPGW_PROCESS_OK
|
||||||
|
UE_IP_ADDRESS_ISSUE = CONST.UE_IP_ADDRESS_ISSUE
|
||||||
|
OAI_UE_PROCESS_NOLOGFILE_TO_ANALYZE = CONST.OAI_UE_PROCESS_NOLOGFILE_TO_ANALYZE
|
||||||
|
OAI_UE_PROCESS_COULD_NOT_SYNC = CONST.OAI_UE_PROCESS_COULD_NOT_SYNC
|
||||||
|
OAI_UE_PROCESS_ASSERTION = CONST.OAI_UE_PROCESS_ASSERTION
|
||||||
|
OAI_UE_PROCESS_FAILED = CONST.OAI_UE_PROCESS_FAILED
|
||||||
|
OAI_UE_PROCESS_NO_TUNNEL_INTERFACE = CONST.OAI_UE_PROCESS_NO_TUNNEL_INTERFACE
|
||||||
|
OAI_UE_PROCESS_SEG_FAULT = CONST.OAI_UE_PROCESS_SEG_FAULT
|
||||||
|
OAI_UE_PROCESS_OK = CONST.OAI_UE_PROCESS_OK
|
||||||
|
|
||||||
|
UE_STATUS_DETACHED = CONST.UE_STATUS_DETACHED
|
||||||
|
UE_STATUS_DETACHING = CONST.UE_STATUS_DETACHING
|
||||||
|
UE_STATUS_ATTACHING = CONST.UE_STATUS_ATTACHING
|
||||||
|
UE_STATUS_ATTACHED = CONST.UE_STATUS_ATTACHED
|
||||||
|
|
||||||
|
X2_HO_REQ_STATE__IDLE = CONST.X2_HO_REQ_STATE__IDLE
|
||||||
|
X2_HO_REQ_STATE__TARGET_RECEIVES_REQ = CONST.X2_HO_REQ_STATE__TARGET_RECEIVES_REQ
|
||||||
|
X2_HO_REQ_STATE__TARGET_RRC_RECFG_COMPLETE = CONST.X2_HO_REQ_STATE__TARGET_RRC_RECFG_COMPLETE
|
||||||
|
X2_HO_REQ_STATE__TARGET_SENDS_SWITCH_REQ = CONST.X2_HO_REQ_STATE__TARGET_SENDS_SWITCH_REQ
|
||||||
|
X2_HO_REQ_STATE__SOURCE_RECEIVES_REQ_ACK = CONST.X2_HO_REQ_STATE__SOURCE_RECEIVES_REQ_ACK
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Class Declaration
|
# Class Declaration
|
||||||
@@ -45,7 +81,7 @@ class RANManagement():
|
|||||||
#self.ADBUserName = ''
|
#self.ADBUserName = ''
|
||||||
#self.ADBPassword = ''
|
#self.ADBPassword = ''
|
||||||
#self.ADBCentralized = True
|
#self.ADBCentralized = True
|
||||||
#self.testCase_id = ''
|
self.testCase_id = ''
|
||||||
#self.testXMLfiles = []
|
#self.testXMLfiles = []
|
||||||
#self.nbTestXMLfiles = 0
|
#self.nbTestXMLfiles = 0
|
||||||
#self.desc = ''
|
#self.desc = ''
|
||||||
@@ -110,12 +146,19 @@ class RANManagement():
|
|||||||
#self.Build_OAI_UE_args = ''
|
#self.Build_OAI_UE_args = ''
|
||||||
#self.Initialize_OAI_UE_args = ''
|
#self.Initialize_OAI_UE_args = ''
|
||||||
#self.clean_repository = True
|
#self.clean_repository = True
|
||||||
#self.flexranCtrlInstalled = False
|
self.flexranCtrlInstalled = False
|
||||||
#self.flexranCtrlStarted = False
|
self.flexranCtrlStarted = False
|
||||||
#self.expectedNbOfConnectedUEs = 0
|
#self.expectedNbOfConnectedUEs = 0
|
||||||
#self.startTime = 0
|
#self.startTime = 0
|
||||||
|
|
||||||
|
def SettestCase_id(self,tcid):
|
||||||
|
self.testCase_id = tcid
|
||||||
|
def SetflexranCtrlInstalled(self,fxrctin):
|
||||||
|
self.flexranCtrlInstalled = fxrctin
|
||||||
|
def SetflexranCtrlStarted(self,fxrctst):
|
||||||
|
self.flexranCtrlStarted = fxrctst
|
||||||
|
def SetpStatus(self, pSt):
|
||||||
|
self.pStatus = pSt
|
||||||
def SetranRepository(self, repository):
|
def SetranRepository(self, repository):
|
||||||
self.ranRepository = repository
|
self.ranRepository = repository
|
||||||
def GetranRepository(self):
|
def GetranRepository(self):
|
||||||
@@ -241,14 +284,22 @@ class RANManagement():
|
|||||||
def GeteNB2SourceCodePath(self):
|
def GeteNB2SourceCodePath(self):
|
||||||
return self.eNB2SourceCodePath
|
return self.eNB2SourceCodePath
|
||||||
|
|
||||||
|
def SetprematureExit(self, premex):
|
||||||
|
self.prematureExit = premex
|
||||||
|
def GetprematureExit(self):
|
||||||
|
return self.prematureExit
|
||||||
|
|
||||||
|
|
||||||
def BuildeNB(self):
|
def BuildeNB(self):
|
||||||
|
myHTML = HTML.HTMLManagement()
|
||||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
GenericHelp(Version)
|
GenericHelp(Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
if self.eNB_serverId == '0':
|
if self.eNB_serverId == '0':
|
||||||
|
#checkpoint enB_serverId
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
|
print(self.eNBIPAddress + 'self.eNBIPAddress')
|
||||||
|
print(lIpAddr + 'lIpAddr')
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
lPassWord = self.eNBPassword
|
lPassWord = self.eNBPassword
|
||||||
lSourcePath = self.eNBSourceCodePath
|
lSourcePath = self.eNBSourceCodePath
|
||||||
@@ -262,11 +313,12 @@ class RANManagement():
|
|||||||
lUserName = self.eNB2UserName
|
lUserName = self.eNB2UserName
|
||||||
lPassWord = self.eNB2Password
|
lPassWord = self.eNB2Password
|
||||||
lSourcePath = self.eNB2SourceCodePath
|
lSourcePath = self.eNB2SourceCodePath
|
||||||
|
print(lIpAddr + 'just before the error')
|
||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
GenericHelp(Version)
|
GenericHelp(Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
# Check if we build an 5G-NR gNB or an LTE eNB
|
# Check if we build an 5G-NR gNB or an LTE eNB
|
||||||
result = re.search('--gNB', self.Build_eNB_args)
|
result = re.search('--gNB', self.Build_eNB_args)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -316,7 +368,7 @@ class RANManagement():
|
|||||||
mismatch = True
|
mismatch = True
|
||||||
if not mismatch:
|
if not mismatch:
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK)
|
||||||
return
|
return
|
||||||
|
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
||||||
@@ -342,7 +394,7 @@ class RANManagement():
|
|||||||
mySSH.command('chmod 775 ./my-lte-softmodem-build.sh', '\$', 5)
|
mySSH.command('chmod 775 ./my-lte-softmodem-build.sh', '\$', 5)
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S -E daemon --inherit --unsafe --name=build_enb_daemon --chdir=' + lSourcePath + '/cmake_targets -o ' + lSourcePath + '/cmake_targets/compile_oai_enb.log ./my-lte-softmodem-build.sh', '\$', 5)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S -E daemon --inherit --unsafe --name=build_enb_daemon --chdir=' + lSourcePath + '/cmake_targets -o ' + lSourcePath + '/cmake_targets/compile_oai_enb.log ./my-lte-softmodem-build.sh', '\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK)
|
||||||
self.backgroundBuildTestId[int(self.eNB_instance)] = self.testCase_id
|
self.backgroundBuildTestId[int(self.eNB_instance)] = self.testCase_id
|
||||||
return
|
return
|
||||||
mySSH.command('stdbuf -o0 ./build_oai ' + self.Build_eNB_args + ' 2>&1 | stdbuf -o0 tee compile_oai_enb.log', 'Bypassing the Tests|build have failed', 1500)
|
mySSH.command('stdbuf -o0 ./build_oai ' + self.Build_eNB_args + ' 2>&1 | stdbuf -o0 tee compile_oai_enb.log', 'Bypassing the Tests|build have failed', 1500)
|
||||||
@@ -369,7 +421,7 @@ class RANManagement():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
GenericHelp(Version)
|
GenericHelp(Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
count = 40
|
count = 40
|
||||||
buildOAIprocess = True
|
buildOAIprocess = True
|
||||||
@@ -384,8 +436,9 @@ class RANManagement():
|
|||||||
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.backgroundBuildTestId[int(self.eNB_instance)])
|
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.backgroundBuildTestId[int(self.eNB_instance)])
|
||||||
|
|
||||||
def checkBuildeNB(self, lIpAddr, lUserName, lPassWord, lSourcePath, testcaseId):
|
def checkBuildeNB(self, lIpAddr, lUserName, lPassWord, lSourcePath, testcaseId):
|
||||||
|
myHTML = HTML.HTMLManagement()
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 3)
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 3)
|
||||||
mySSH.command('ls ran_build/build', '\$', 3)
|
mySSH.command('ls ran_build/build', '\$', 3)
|
||||||
mySSH.command('ls ran_build/build', '\$', 3)
|
mySSH.command('ls ran_build/build', '\$', 3)
|
||||||
if self.air_interface == 'nr':
|
if self.air_interface == 'nr':
|
||||||
@@ -432,15 +485,16 @@ class RANManagement():
|
|||||||
|
|
||||||
if buildStatus:
|
if buildStatus:
|
||||||
logging.info('\u001B[1m Building OAI ' + nodeB_prefix + 'NB Pass\u001B[0m')
|
logging.info('\u001B[1m Building OAI ' + nodeB_prefix + 'NB Pass\u001B[0m')
|
||||||
self.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK)
|
||||||
else:
|
else:
|
||||||
logging.error('\u001B[1m Building OAI ' + nodeB_prefix + 'NB Failed\u001B[0m')
|
logging.error('\u001B[1m Building OAI ' + nodeB_prefix + 'NB Failed\u001B[0m')
|
||||||
self.CreateHtmlTestRow(self.Build_eNB_args, 'KO', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow(self.Build_eNB_args, 'KO', ALL_PROCESSES_OK)
|
||||||
self.CreateHtmlTabFooter(False)
|
myHTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def InitializeeNB(self):
|
def InitializeeNB(self):
|
||||||
|
myHTML = HTML.HTMLManagement()
|
||||||
if self.eNB_serverId == '0':
|
if self.eNB_serverId == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
@@ -459,13 +513,13 @@ class RANManagement():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
GenericHelp(Version)
|
GenericHelp(Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
check_eNB = False
|
#check_eNB = False
|
||||||
check_OAI_UE = False
|
#check_OAI_UE = False
|
||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE)
|
#pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE)
|
||||||
if (pStatus < 0):
|
if (self.pStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.Initialize_eNB_args, 'KO', pStatus)
|
myHTML.CreateHtmlTestRow(self.Initialize_eNB_args, 'KO', self.pStatus)
|
||||||
self.CreateHtmlTabFooter(False)
|
myHTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||||
@@ -476,7 +530,7 @@ class RANManagement():
|
|||||||
if result is not None:
|
if result is not None:
|
||||||
eth_interface = result.group('eth_interface')
|
eth_interface = result.group('eth_interface')
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
||||||
EPC.Get_PcapFileName() = 'enb_' + self.testCase_id + '_s1log.pcap'
|
EPC.Set_PcapFileName('enb_' + self.testCase_id + '_s1log.pcap')
|
||||||
mySSH.command('echo ' + EPC.GetPassword() + ' | sudo -S rm -f /tmp/' + EPC.Get_PcapFileName() , '\$', 5)
|
mySSH.command('echo ' + EPC.GetPassword() + ' | sudo -S rm -f /tmp/' + EPC.Get_PcapFileName() , '\$', 5)
|
||||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -w /tmp/' + EPC.Get_PcapFileName() + ' > /tmp/tshark.log 2>&1 &', EPC.GetUserName(), 5)
|
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -w /tmp/' + EPC.Get_PcapFileName() + ' > /tmp/tshark.log 2>&1 &', EPC.GetUserName(), 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
@@ -566,7 +620,7 @@ class RANManagement():
|
|||||||
mySSH.close()
|
mySSH.close()
|
||||||
doLoop = False
|
doLoop = False
|
||||||
logging.error('\u001B[1;37;41m eNB logging system did not show got sync! \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)
|
myHTML.CreateHtmlTestRow('-O ' + config_file + extra_options, 'KO', ALL_PROCESSES_OK)
|
||||||
# In case of T tracer recording, we need to kill tshark on EPC side
|
# In case of T tracer recording, we need to kill tshark on EPC side
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -616,7 +670,7 @@ class RANManagement():
|
|||||||
self.eNBstatuses[int(self.eNB_instance)] = int(self.eNB_serverId)
|
self.eNBstatuses[int(self.eNB_instance)] = int(self.eNB_serverId)
|
||||||
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'OK', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow('-O ' + config_file + extra_options, 'OK', ALL_PROCESSES_OK)
|
||||||
logging.debug('\u001B[1m Initialize eNB Completed\u001B[0m')
|
logging.debug('\u001B[1m Initialize eNB Completed\u001B[0m')
|
||||||
|
|
||||||
|
|
||||||
@@ -640,7 +694,7 @@ class RANManagement():
|
|||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
lPassWord = self.eNBPassword
|
lPassWord = self.eNBPassword
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep --color=never ' + self.air_interface + '-softmodem | grep -v grep', '\$', 5)
|
mySSH.command('stdbuf -o0 ps -aux | grep --color=never ' + self.air_interface + '-softmodem | grep -v grep', '\$', 5)
|
||||||
result = re.search(self.air_interface + '-softmodem', mySSH.getBefore())
|
result = re.search(self.air_interface + '-softmodem', mySSH.getBefore())
|
||||||
@@ -656,6 +710,7 @@ class RANManagement():
|
|||||||
|
|
||||||
|
|
||||||
def TerminateeNB(self):
|
def TerminateeNB(self):
|
||||||
|
myHTML = HTML.HTMLManagement()
|
||||||
if self.eNB_serverId == '0':
|
if self.eNB_serverId == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
@@ -674,7 +729,7 @@ class RANManagement():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
GenericHelp(Version)
|
GenericHelp(Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
if self.air_interface == 'lte':
|
if self.air_interface == 'lte':
|
||||||
@@ -721,7 +776,7 @@ class RANManagement():
|
|||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + extracted_log_file, '.')
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + extracted_log_file, '.')
|
||||||
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
||||||
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
|
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
|
||||||
self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
||||||
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
||||||
else:
|
else:
|
||||||
analyzeFile = False
|
analyzeFile = False
|
||||||
@@ -734,7 +789,7 @@ class RANManagement():
|
|||||||
if (copyin_res == -1):
|
if (copyin_res == -1):
|
||||||
logging.debug('\u001B[1;37;41m Could not copy ' + nodeB_prefix + 'NB logfile to analyze it! \u001B[0m')
|
logging.debug('\u001B[1;37;41m Could not copy ' + nodeB_prefix + 'NB logfile to analyze it! \u001B[0m')
|
||||||
self.htmleNBFailureMsg = 'Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
self.htmleNBFailureMsg = 'Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
myHTML.CreateHtmlTestRow('N/A', 'KO', ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
return
|
return
|
||||||
if self.eNB_serverId != '0':
|
if self.eNB_serverId != '0':
|
||||||
@@ -742,20 +797,20 @@ class RANManagement():
|
|||||||
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze)
|
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze)
|
||||||
logStatus = self.AnalyzeLogFile_eNB(fileToAnalyze)
|
logStatus = self.AnalyzeLogFile_eNB(fileToAnalyze)
|
||||||
if (logStatus < 0):
|
if (logStatus < 0):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
myHTML.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
||||||
self.preamtureExit = True
|
self.preamtureExit = True
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
myHTML.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
self.eNBstatuses[int(self.eNB_instance)] = -1
|
self.eNBstatuses[int(self.eNB_instance)] = -1
|
||||||
|
|
||||||
|
|
||||||
def LogCollecteNB(self):
|
def LogCollecteNB(self):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
mySSH.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
||||||
mySSH.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
mySSH.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
||||||
mySSH.command('cd cmake_targets', '\$', 5)
|
mySSH.command('cd cmake_targets', '\$', 5)
|
||||||
@@ -763,3 +818,260 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 60)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 60)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 5)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
|
|
||||||
|
def AnalyzeLogFile_eNB(self, eNBlogFile):
|
||||||
|
if (not os.path.isfile('./' + eNBlogFile)):
|
||||||
|
return -1
|
||||||
|
enb_log_file = open('./' + eNBlogFile, 'r')
|
||||||
|
exitSignalReceived = False
|
||||||
|
foundAssertion = False
|
||||||
|
msgAssertion = ''
|
||||||
|
msgLine = 0
|
||||||
|
foundSegFault = False
|
||||||
|
foundRealTimeIssue = False
|
||||||
|
rrcSetupComplete = 0
|
||||||
|
rrcReleaseRequest = 0
|
||||||
|
rrcReconfigRequest = 0
|
||||||
|
rrcReconfigComplete = 0
|
||||||
|
rrcReestablishRequest = 0
|
||||||
|
rrcReestablishComplete = 0
|
||||||
|
rrcReestablishReject = 0
|
||||||
|
rlcDiscardBuffer = 0
|
||||||
|
rachCanceledProcedure = 0
|
||||||
|
uciStatMsgCount = 0
|
||||||
|
pdcpFailure = 0
|
||||||
|
ulschFailure = 0
|
||||||
|
cdrxActivationMessageCount = 0
|
||||||
|
dropNotEnoughRBs = 0
|
||||||
|
mbmsRequestMsg = 0
|
||||||
|
self.htmleNBFailureMsg = ''
|
||||||
|
isRRU = False
|
||||||
|
isSlave = False
|
||||||
|
slaveReceivesFrameResyncCmd = False
|
||||||
|
X2HO_state = X2_HO_REQ_STATE__IDLE
|
||||||
|
X2HO_inNbProcedures = 0
|
||||||
|
X2HO_outNbProcedures = 0
|
||||||
|
for line in enb_log_file.readlines():
|
||||||
|
if X2HO_state == X2_HO_REQ_STATE__IDLE:
|
||||||
|
result = re.search('target eNB Receives X2 HO Req X2AP_HANDOVER_REQ', str(line))
|
||||||
|
if result is not None:
|
||||||
|
X2HO_state = X2_HO_REQ_STATE__TARGET_RECEIVES_REQ
|
||||||
|
result = re.search('source eNB receives the X2 HO ACK X2AP_HANDOVER_REQ_ACK', str(line))
|
||||||
|
if result is not None:
|
||||||
|
X2HO_state = X2_HO_REQ_STATE__SOURCE_RECEIVES_REQ_ACK
|
||||||
|
if X2HO_state == X2_HO_REQ_STATE__TARGET_RECEIVES_REQ:
|
||||||
|
result = re.search('Received LTE_RRCConnectionReconfigurationComplete from UE', str(line))
|
||||||
|
if result is not None:
|
||||||
|
X2HO_state = X2_HO_REQ_STATE__TARGET_RRC_RECFG_COMPLETE
|
||||||
|
if X2HO_state == X2_HO_REQ_STATE__TARGET_RRC_RECFG_COMPLETE:
|
||||||
|
result = re.search('issue rrc_eNB_send_PATH_SWITCH_REQ', str(line))
|
||||||
|
if result is not None:
|
||||||
|
X2HO_state = X2_HO_REQ_STATE__TARGET_SENDS_SWITCH_REQ
|
||||||
|
if X2HO_state == X2_HO_REQ_STATE__TARGET_SENDS_SWITCH_REQ:
|
||||||
|
result = re.search('received path switch ack S1AP_PATH_SWITCH_REQ_ACK', str(line))
|
||||||
|
if result is not None:
|
||||||
|
X2HO_state = X2_HO_REQ_STATE__IDLE
|
||||||
|
X2HO_inNbProcedures += 1
|
||||||
|
if X2HO_state == X2_HO_REQ_STATE__SOURCE_RECEIVES_REQ_ACK:
|
||||||
|
result = re.search('source eNB receives the X2 UE CONTEXT RELEASE X2AP_UE_CONTEXT_RELEASE', str(line))
|
||||||
|
if result is not None:
|
||||||
|
X2HO_state = X2_HO_REQ_STATE__IDLE
|
||||||
|
X2HO_outNbProcedures += 1
|
||||||
|
|
||||||
|
if self.eNBOptions[int(self.eNB_instance)] != '':
|
||||||
|
res1 = re.search('max_rxgain (?P<requested_option>[0-9]+)', self.eNBOptions[int(self.eNB_instance)])
|
||||||
|
res2 = re.search('max_rxgain (?P<applied_option>[0-9]+)', str(line))
|
||||||
|
if res1 is not None and res2 is not None:
|
||||||
|
requested_option = int(res1.group('requested_option'))
|
||||||
|
applied_option = int(res2.group('applied_option'))
|
||||||
|
if requested_option == applied_option:
|
||||||
|
self.htmleNBFailureMsg += '<span class="glyphicon glyphicon-ok-circle"></span> Command line option(s) correctly applied <span class="glyphicon glyphicon-arrow-right"></span> ' + self.eNBOptions[int(self.eNB_instance)] + '\n\n'
|
||||||
|
else:
|
||||||
|
self.htmleNBFailureMsg += '<span class="glyphicon glyphicon-ban-circle"></span> Command line option(s) NOT applied <span class="glyphicon glyphicon-arrow-right"></span> ' + self.eNBOptions[int(self.eNB_instance)] + '\n\n'
|
||||||
|
result = re.search('Exiting OAI softmodem', str(line))
|
||||||
|
if result is not None:
|
||||||
|
exitSignalReceived = True
|
||||||
|
result = re.search('[Ss]egmentation [Ff]ault', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundSegFault = True
|
||||||
|
result = re.search('[Cc]ore [dD]ump', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundSegFault = True
|
||||||
|
result = re.search('./ran_build/build/lte-softmodem', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundSegFault = True
|
||||||
|
result = re.search('[Aa]ssertion', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundAssertion = True
|
||||||
|
result = re.search('LLL', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundRealTimeIssue = True
|
||||||
|
if foundAssertion and (msgLine < 3):
|
||||||
|
msgLine += 1
|
||||||
|
msgAssertion += str(line)
|
||||||
|
result = re.search('Setting function for RU', str(line))
|
||||||
|
if result is not None:
|
||||||
|
isRRU = True
|
||||||
|
if isRRU:
|
||||||
|
result = re.search('RU 0 is_slave=yes', str(line))
|
||||||
|
if result is not None:
|
||||||
|
isSlave = True
|
||||||
|
if isSlave:
|
||||||
|
result = re.search('Received RRU_frame_resynch command', str(line))
|
||||||
|
if result is not None:
|
||||||
|
slaveReceivesFrameResyncCmd = True
|
||||||
|
result = re.search('LTE_RRCConnectionSetupComplete from UE', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcSetupComplete += 1
|
||||||
|
result = re.search('Generate LTE_RRCConnectionRelease|Generate RRCConnectionRelease', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcReleaseRequest += 1
|
||||||
|
result = re.search('Generate LTE_RRCConnectionReconfiguration', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcReconfigRequest += 1
|
||||||
|
result = re.search('LTE_RRCConnectionReconfigurationComplete from UE rnti', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcReconfigComplete += 1
|
||||||
|
result = re.search('LTE_RRCConnectionReestablishmentRequest', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcReestablishRequest += 1
|
||||||
|
result = re.search('LTE_RRCConnectionReestablishmentComplete', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcReestablishComplete += 1
|
||||||
|
result = re.search('LTE_RRCConnectionReestablishmentReject', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcReestablishReject += 1
|
||||||
|
result = re.search('CDRX configuration activated after RRC Connection', str(line))
|
||||||
|
if result is not None:
|
||||||
|
cdrxActivationMessageCount += 1
|
||||||
|
result = re.search('uci->stat', str(line))
|
||||||
|
if result is not None:
|
||||||
|
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
|
||||||
|
result = re.search('BAD all_segments_received', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rlcDiscardBuffer += 1
|
||||||
|
result = re.search('Canceled RA procedure for UE rnti', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rachCanceledProcedure += 1
|
||||||
|
result = re.search('dropping, not enough RBs', str(line))
|
||||||
|
if result is not None:
|
||||||
|
dropNotEnoughRBs += 1
|
||||||
|
if self.eNBmbmsEnables[int(self.eNB_instance)]:
|
||||||
|
result = re.search('MBMS USER-PLANE.*Requesting.*bytes from RLC', str(line))
|
||||||
|
if result is not None:
|
||||||
|
mbmsRequestMsg += 1
|
||||||
|
enb_log_file.close()
|
||||||
|
logging.debug(' File analysis completed')
|
||||||
|
self.htmleNBFailureMsg = ''
|
||||||
|
if self.air_interface() == 'lte':
|
||||||
|
nodeB_prefix = 'e'
|
||||||
|
else:
|
||||||
|
nodeB_prefix = 'g'
|
||||||
|
if uciStatMsgCount > 0:
|
||||||
|
statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += statMsg + '\n'
|
||||||
|
if pdcpFailure > 0:
|
||||||
|
statMsg = nodeB_prefix + 'NB 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 = nodeB_prefix + 'NB showed ' + str(ulschFailure) + ' "ULSCH in error in round" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += statMsg + '\n'
|
||||||
|
if dropNotEnoughRBs > 0:
|
||||||
|
statMsg = 'eNB showed ' + str(dropNotEnoughRBs) + ' "dropping, not enough RBs" message(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += statMsg + '\n'
|
||||||
|
if rrcSetupComplete > 0:
|
||||||
|
rrcMsg = nodeB_prefix + 'NB completed ' + str(rrcSetupComplete) + ' RRC Connection Setup(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
rrcMsg = ' -- ' + str(rrcSetupComplete) + ' were completed'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if rrcReleaseRequest > 0:
|
||||||
|
rrcMsg = nodeB_prefix + 'NB requested ' + str(rrcReleaseRequest) + ' RRC Connection Release(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if rrcReconfigRequest > 0 or rrcReconfigComplete > 0:
|
||||||
|
rrcMsg = nodeB_prefix + 'NB requested ' + str(rrcReconfigRequest) + ' RRC Connection Reconfiguration(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
rrcMsg = ' -- ' + str(rrcReconfigComplete) + ' were completed'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if rrcReestablishRequest > 0 or rrcReestablishComplete > 0 or rrcReestablishReject > 0:
|
||||||
|
rrcMsg = nodeB_prefix + 'NB requested ' + str(rrcReestablishRequest) + ' RRC Connection Reestablishment(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
rrcMsg = ' -- ' + str(rrcReestablishComplete) + ' were completed'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
rrcMsg = ' -- ' + str(rrcReestablishReject) + ' were rejected'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if self.eNBmbmsEnables[int(self.eNB_instance)]:
|
||||||
|
if mbmsRequestMsg > 0:
|
||||||
|
rrcMsg = 'eNB requested ' + str(mbmsRequestMsg) + ' times the RLC for MBMS USER-PLANE'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if X2HO_inNbProcedures > 0:
|
||||||
|
rrcMsg = 'eNB completed ' + str(X2HO_inNbProcedures) + ' X2 Handover Connection procedure(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if X2HO_outNbProcedures > 0:
|
||||||
|
rrcMsg = 'eNB completed ' + str(X2HO_outNbProcedures) + ' X2 Handover Release procedure(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if self.eNBOptions[int(self.eNB_instance)] != '':
|
||||||
|
res1 = re.search('drx_Config_present prSetup', self.eNBOptions[int(self.eNB_instance)])
|
||||||
|
if res1 is not None:
|
||||||
|
if cdrxActivationMessageCount > 0:
|
||||||
|
rrcMsg = 'eNB activated the CDRX Configuration for ' + str(cdrxActivationMessageCount) + ' time(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
else:
|
||||||
|
rrcMsg = 'eNB did NOT ACTIVATE the CDRX Configuration'
|
||||||
|
logging.debug('\u001B[1;37;43m ' + rrcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rrcMsg + '\n'
|
||||||
|
if rachCanceledProcedure > 0:
|
||||||
|
rachMsg = nodeB_prefix + 'NB cancelled ' + str(rachCanceledProcedure) + ' RA procedure(s)'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rachMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rachMsg + '\n'
|
||||||
|
if isRRU:
|
||||||
|
if isSlave:
|
||||||
|
if slaveReceivesFrameResyncCmd:
|
||||||
|
rruMsg = 'Slave RRU received the RRU_frame_resynch command from RAU'
|
||||||
|
logging.debug('\u001B[1;30;43m ' + rruMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rruMsg + '\n'
|
||||||
|
else:
|
||||||
|
rruMsg = 'Slave RRU DID NOT receive the RRU_frame_resynch command from RAU'
|
||||||
|
logging.debug('\u001B[1;37;41m ' + rruMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rruMsg + '\n'
|
||||||
|
self.prematureExit(True)
|
||||||
|
return ENB_PROCESS_SLAVE_RRU_NOT_SYNCED
|
||||||
|
if foundSegFault:
|
||||||
|
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with a Segmentation Fault! \u001B[0m')
|
||||||
|
return ENB_PROCESS_SEG_FAULT
|
||||||
|
if foundAssertion:
|
||||||
|
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with an assertion! \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += msgAssertion
|
||||||
|
return ENB_PROCESS_ASSERTION
|
||||||
|
if foundRealTimeIssue:
|
||||||
|
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB faced real time issues! \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += nodeB_prefix + 'NB faced real time issues!\n'
|
||||||
|
#return ENB_PROCESS_REALTIME_ISSUE
|
||||||
|
if rlcDiscardBuffer > 0:
|
||||||
|
rlcMsg = nodeB_prefix + 'NB RLC discarded ' + str(rlcDiscardBuffer) + ' buffer(s)'
|
||||||
|
logging.debug('\u001B[1;37;41m ' + rlcMsg + ' \u001B[0m')
|
||||||
|
self.htmleNBFailureMsg += rlcMsg + '\n'
|
||||||
|
return ENB_PROCESS_REALTIME_ISSUE
|
||||||
|
return 0
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
import pexpect # pexpect
|
import pexpect # pexpect
|
||||||
import logging
|
import logging
|
||||||
|
import time # sleep
|
||||||
|
import re
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Class Declaration
|
# Class Declaration
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -69,7 +70,7 @@ class SSHConnection():
|
|||||||
logging.debug('\u001B[1;37;41m Unexpected EOF \u001B[0m')
|
logging.debug('\u001B[1;37;41m Unexpected EOF \u001B[0m')
|
||||||
logging.debug('Expected Line : ' + expectedline)
|
logging.debug('Expected Line : ' + expectedline)
|
||||||
logging.debug(str(self.ssh.before))
|
logging.debug(str(self.ssh.before))
|
||||||
sys.exit(self.sshresponse)
|
sys.exit(self.sshresponse)
|
||||||
elif self.sshresponse == 2:
|
elif self.sshresponse == 2:
|
||||||
logging.debug('\u001B[1;37;41m Unexpected TIMEOUT \u001B[0m')
|
logging.debug('\u001B[1;37;41m Unexpected TIMEOUT \u001B[0m')
|
||||||
logging.debug('Expected Line : ' + expectedline)
|
logging.debug('Expected Line : ' + expectedline)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-lte-m-10-tm1</htmlTabRef>
|
<htmlTabRef>test-lte-m-10-tm1</htmlTabRef>
|
||||||
<htmlTabName>Test-LTE-M-10MHz-TM1</htmlTabName>
|
<htmlTabName>Test-LTE-M-10MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040102
|
040102
|
||||||
|
|||||||
@@ -0,0 +1,189 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
030101 000002 030102 040301 040501 040601 040641 050401 000002 040502 040602 040642 050402 000002 040503 040603 040643 040401 040201 030201 030202
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-x2-ho-05-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-X2-HO-FDD-05MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030201
|
||||||
|
040101
|
||||||
|
030101 040301 040501 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Waiting for 60 seconds</desc>
|
||||||
|
<idle_sleep_time_in_sec>60</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Waiting for 10 seconds</desc>
|
||||||
|
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050102">
|
||||||
|
<class>Initialize_FlexranCtrl</class>
|
||||||
|
<desc>Starting Flexran Controller</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050202">
|
||||||
|
<class>Terminate_FlexranCtrl</class>
|
||||||
|
<desc>Stopping Flexran Controller</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize Master eNB (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band13.tm1.25PRB.usrpb210.conf --eNBs.[0].enable_x2 no</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030102">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize Slave eNB (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.slave.band13.tm1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate Master eNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate Slave eNB</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040502">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040503">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040601">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/8Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 8M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040602">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/8Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 8M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040603">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/8Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 8M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040641">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/5Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 5M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040642">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/5Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 5M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040643">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/5Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 5M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050401">
|
||||||
|
<class>Perform_X2_Handover</class>
|
||||||
|
<desc>Doing a Flexran-Controlled X2 Handover</desc>
|
||||||
|
<x2_ho_options>network</x2_ho_options>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050402">
|
||||||
|
<class>Perform_X2_Handover</class>
|
||||||
|
<desc>Doing a Flexran-Controlled X2 Handover</desc>
|
||||||
|
<x2_ho_options>network</x2_ho_options>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
Reference in New Issue
Block a user