Commit d0edbd7b authored by Robert Schmidt's avatar Robert Schmidt

Merge remote-tracking branch 'origin/ci-ran-sa-tests' into integration_2022_wk46

parents 39cf6006 59c4bb86
...@@ -773,22 +773,19 @@ class Containerize(): ...@@ -773,22 +773,19 @@ class Containerize():
mySSH.command(f'sed -i -e "s#image: {image}:latest#image: {imageToUse}#" ci-docker-compose.yml', '\$', 2) mySSH.command(f'sed -i -e "s#image: {image}:latest#image: {imageToUse}#" ci-docker-compose.yml', '\$', 2)
localMmeIpAddr = EPC.MmeIPAddress localMmeIpAddr = EPC.MmeIPAddress
mySSH.command('sed -i -e "s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/" ci-docker-compose.yml', '\$', 2) mySSH.command('sed -i -e "s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/" ci-docker-compose.yml', '\$', 2)
# if self.flexranCtrlDeployed:
# mySSH.command('sed -i -e "s/FLEXRAN_ENABLED:.*/FLEXRAN_ENABLED: \'yes\'/" ci-docker-compose.yml', '\$', 2)
# mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/' + self.flexranCtrlIpAddress + '/" ci-docker-compose.yml', '\$', 2)
# else:
# mySSH.command('sed -i -e "s/FLEXRAN_ENABLED:.*$/FLEXRAN_ENABLED: \'no\'/" ci-docker-compose.yml', '\$', 2)
# mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/127.0.0.1/" ci-docker-compose.yml', '\$', 2)
# Currently support only one # Currently support only one
mySSH.command('echo ' + lPassWord + ' | sudo -S b2xx_fx3_utils --reset-device', '\$', 15) mySSH.command('echo ' + lPassWord + ' | sudo -S b2xx_fx3_utils --reset-device', '\$', 15)
mySSH.command('docker-compose --file ci-docker-compose.yml config --services | sed -e "s@^@service=@" 2>&1', '\$', 10) svcName = self.services[self.eNB_instance]
result = re.search('service=(?P<svc_name>[a-zA-Z0-9\_]+)', mySSH.getBefore()) if svcName == '':
if result is not None: logging.warning('no service name given: starting all services in ci-docker-compose.yml!')
svcName = result.group('svc_name')
mySSH.command('docker-compose --file ci-docker-compose.yml up -d ' + svcName, '\$', 15) mySSH.command(f'docker-compose --file ci-docker-compose.yml up -d -- {svcName}', '\$', 30)
# Checking Status # Checking Status
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5) grep = ''
if svcName != '': grep = f' | grep -A3 {svcName}'
mySSH.command(f'docker-compose --file ci-docker-compose.yml config {grep}', '\$', 5)
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore()) result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
unhealthyNb = 0 unhealthyNb = 0
healthyNb = 0 healthyNb = 0
...@@ -848,8 +845,8 @@ class Containerize(): ...@@ -848,8 +845,8 @@ class Containerize():
else: else:
# containers are unhealthy, so we won't start. However, logs are stored at the end # containers are unhealthy, so we won't start. However, logs are stored at the end
# in UndeployObject so we here store the logs of the unhealthy container to report it # in UndeployObject so we here store the logs of the unhealthy container to report it
logfilename = f'{lSourcePath}/cmake_targets/{self.eNB_logFile[self.eNB_instance]}' logfilename = f'{lSourcePath}/cmake_targets/log/{self.eNB_logFile[self.eNB_instance]}'
mySSH.command('docker logs {containerName} > {logfilename}', '\$', 30) mySSH.command(f'docker logs {containerName} > {logfilename}', '\$', 30)
mySSH.copyin(lIpAddr, lUserName, lPassWord, logfilename, '.') mySSH.copyin(lIpAddr, lUserName, lPassWord, logfilename, '.')
mySSH.close() mySSH.close()
...@@ -896,58 +893,67 @@ class Containerize(): ...@@ -896,58 +893,67 @@ class Containerize():
mySSH = SSH.SSHConnection() mySSH = SSH.SSHConnection()
mySSH.open(lIpAddr, lUserName, lPassWord) mySSH.open(lIpAddr, lUserName, lPassWord)
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5) mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
# Currently support only one
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5) svcName = self.services[self.eNB_instance]
containerName = '' forceDown = False
containerToKill = False if svcName != '':
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore()) logging.warning(f'service name given, but will stop all services in ci-docker-compose.yml!')
if self.eNB_logFile[self.eNB_instance] == '': svcName = ''
self.eNB_logFile[self.eNB_instance] = 'enb_' + HTML.testCase_id + '.log'
if result is not None: mySSH.command(f'docker-compose -f ci-docker-compose.yml config --services', '\$', 5)
containerName = result.group('container_name') # first line has command, last line has next command prompt
containerToKill = True allServices = mySSH.getBefore().split('\r\n')[1:-1]
if containerToKill: services = []
mySSH.command('docker inspect ' + containerName, '\$', 30) for s in allServices:
result = re.search('Error: No such object: ' + containerName, mySSH.getBefore()) mySSH.command(f'docker-compose -f ci-docker-compose.yml ps --all -- {s}', '\$', 5, silent=False)
if result is not None: running = mySSH.getBefore().split('\r\n')[3:-1]
containerToKill = False #logging.debug(f'running services: {running}')
if containerToKill: if len(running) > 0: # something is running for that service
mySSH.command('docker kill --signal INT ' + containerName, '\$', 30) services.append(s)
time.sleep(5) logging.info(f'stopping services {services}')
mySSH.command('docker kill --signal KILL ' + containerName, '\$', 30)
time.sleep(5) mySSH.command(f'docker-compose -f ci-docker-compose.yml stop', '\$', 30)
mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30) time.sleep(5) # give some time to running containers to stop
mySSH.command('docker rm -f ' + containerName, '\$', 30) for svcName in services:
# Forcing the down now to remove the networks and any artifacts # head -n -1 suppresses the final "X exited with status code Y"
mySSH.command('docker-compose --file ci-docker-compose.yml down', '\$', 5) filename = f'{svcName}-{HTML.testCase_id}.log'
#mySSH.command(f'docker-compose -f ci-docker-compose.yml logs --no-log-prefix -- {svcName} | head -n -1 &> {lSourcePath}/cmake_targets/log/{filename}', '\$', 30)
mySSH.command(f'docker-compose -f ci-docker-compose.yml logs --no-log-prefix -- {svcName} &> {lSourcePath}/cmake_targets/log/{filename}', '\$', 30)
mySSH.command('docker-compose -f ci-docker-compose.yml down', '\$', 5)
# Cleaning any created tmp volume # Cleaning any created tmp volume
mySSH.command('docker volume prune --force || true', '\$', 20) mySSH.command('docker volume prune --force', '\$', 20)
mySSH.close() mySSH.close()
# Analyzing log file! # Analyzing log file!
if containerToKill: files = ','.join([f'{s}-{HTML.testCase_id}' for s in services])
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '.') if len(services) > 1:
else: files = '{' + files + '}'
copyin_res = 0 copyin_res = 0
nodeB_prefix = 'e' if len(services) > 0:
if (copyin_res == -1): copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, f'{lSourcePath}/cmake_targets/log/{files}.log', '.')
HTML.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!' if copyin_res == -1:
HTML.htmleNBFailureMsg='Could not copy logfile to analyze it!'
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE) HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
self.exitStatus = 1
else: else:
if containerToKill: for svcName in services:
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + self.eNB_logFile[self.eNB_instance]) filename = f'{svcName}-{HTML.testCase_id}.log'
logStatus = RAN.AnalyzeLogFile_eNB(self.eNB_logFile[self.eNB_instance], HTML, self.ran_checkers) logging.debug(f'\u001B[1m Analyzing logfile {filename}\u001B[0m')
else: logStatus = RAN.AnalyzeLogFile_eNB(filename, HTML, self.ran_checkers)
logStatus = 0
if (logStatus < 0): if (logStatus < 0):
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus) HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
self.exitStatus = 1
else: else:
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK) HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
# all the xNB run logs shall be on the server 0 for logCollecting # all the xNB run logs shall be on the server 0 for logCollecting
if containerToKill and self.eNB_serverId[self.eNB_instance] != '0': if self.eNB_serverId[self.eNB_instance] != '0':
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + self.eNB_logFile[self.eNB_instance], self.eNBSourceCodePath + '/cmake_targets/') mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, f'./{files}.log', f'{self.eNBSourceCodePath}/cmake_targets/')
if self.exitStatus == 0:
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m') logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
else:
logging.error('\u001B[1m Undeploying OAI Object Failed\u001B[0m')
def DeployGenObject(self, HTML, RAN, UE): def DeployGenObject(self, HTML, RAN, UE):
self.exitStatus = 0 self.exitStatus = 0
......
...@@ -19,6 +19,7 @@ gNBs = ...@@ -19,6 +19,7 @@ gNBs =
nr_cellid = 12345678L; nr_cellid = 12345678L;
force_256qam_off = 1;
tr_s_preference = "f1"; tr_s_preference = "f1";
......
...@@ -22,6 +22,7 @@ gNBs = ...@@ -22,6 +22,7 @@ gNBs =
////////// Physical parameters: ////////// Physical parameters:
min_rxtxtime = 6; min_rxtxtime = 6;
force_256qam_off = 1;
pdcch_ConfigSIB1 = ( pdcch_ConfigSIB1 = (
{ {
...@@ -57,7 +58,7 @@ gNBs = ...@@ -57,7 +58,7 @@ gNBs =
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1; initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon #pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11; initialDLBWPcontrolResourceSetZero = 12;
initialDLBWPsearchSpaceZero = 0; initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon #uplinkConfigCommon
...@@ -181,7 +182,8 @@ MACRLCs = ( ...@@ -181,7 +182,8 @@ MACRLCs = (
local_n_portd = 2152; local_n_portd = 2152;
remote_n_portc = 501; remote_n_portc = 501;
remote_n_portd = 2152; remote_n_portd = 2152;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
} }
); );
......
...@@ -17,9 +17,8 @@ gNBs = ...@@ -17,9 +17,8 @@ gNBs =
////////// Physical parameters: ////////// Physical parameters:
min_rxtxtime = 2; do_CSIRS = 0;
do_CSIRS = 1; do_SRS = 0;
do_SRS = 1;
pdcch_ConfigSIB1 = ( pdcch_ConfigSIB1 = (
{ {
...@@ -36,21 +35,21 @@ gNBs = ...@@ -36,21 +35,21 @@ gNBs =
# downlinkConfigCommon # downlinkConfigCommon
#frequencyInfoDL #frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) # this is 3300.30 MHz + (19 PRBs + 10 SCs)@30kHz SCS (GSCN: 7715)
absoluteFrequencySSB = 641280; absoluteFrequencySSB = 620736;
dl_frequencyBand = 78; dl_frequencyBand = 78;
# this is 3600 MHz # this is 3300.30 MHz
dl_absoluteFrequencyPointA = 640008; dl_absoluteFrequencyPointA = 620020;
#scs-SpecificCarrierList #scs-SpecificCarrierList
dl_offstToCarrier = 0; dl_offstToCarrier = 0;
# subcarrierSpacing # subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1; dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106; dl_carrierBandwidth = 51;
#initialDownlinkBWP #initialDownlinkBWP
#genericParameters #genericParameters
# this is RBstart=27,L=48 (275*(L-1))+RBstart # this is RBstart=27,L=48 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 initialDLBWPlocationAndBandwidth = 13750;
# subcarrierSpacing # subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1; initialDLBWPsubcarrierSpacing = 1;
...@@ -66,11 +65,11 @@ gNBs = ...@@ -66,11 +65,11 @@ gNBs =
# subcarrierSpacing # subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1; ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106; ul_carrierBandwidth = 51;
pMax = 20; pMax = 20;
#initialUplinkBWP #initialUplinkBWP
#genericParameters #genericParameters
initialULBWPlocationAndBandwidth = 28875; initialULBWPlocationAndBandwidth = 13750;
# subcarrierSpacing # subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1; initialULBWPsubcarrierSpacing = 1;
...@@ -156,65 +155,6 @@ gNBs = ...@@ -156,65 +155,6 @@ gNBs =
); );
# Dedicated Serving Cell Configuration
servingCellConfigDedicated = ({
# BWP-Downlink
# BWP 1 Configuration
dl_bwp-Id_1 = 1;
dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_bwp1_subcarrierSpacing = 1;
# BWP 2 Configuration
dl_bwp-Id_2 = 2;
dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_bwp2_subcarrierSpacing = 1;
# BWP 3 Configuration
dl_bwp-Id_3 = 3;
dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_bwp3_subcarrierSpacing = 1;
firstActiveDownlinkBWP-Id = 1; #BWP-Id
defaultDownlinkBWP-Id = 1; #BWP-Id
# bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
# ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
# ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
# spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
# UplinkConfig
# BWP-Uplink
# BWP 1 Configuration
ul_bwp-Id_1 = 1;
ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_bwp1_subcarrierSpacing = 1;
# BWP 2 Configuration
ul_bwp-Id_2 = 2;
ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_bwp2_subcarrierSpacing = 1;
# BWP 3 Configuration
ul_bwp-Id_3 = 3;
ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_bwp3_subcarrierSpacing = 1;
firstActiveUplinkBWP-Id = 1; #BWP-Id
}
);
# ------- SCTP definitions # ------- SCTP definitions
SCTP : SCTP :
{ {
...@@ -252,6 +192,7 @@ MACRLCs = ( ...@@ -252,6 +192,7 @@ MACRLCs = (
tr_n_preference = "local_RRC"; tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 200; pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200; pucch_TargetSNRx10 = 200;
ul_prbblack_SNR_threshold = 10;
ulsch_max_frame_inactivity = 0; ulsch_max_frame_inactivity = 0;
} }
); );
...@@ -271,8 +212,8 @@ RUs = ( ...@@ -271,8 +212,8 @@ RUs = (
local_rf = "yes" local_rf = "yes"
nb_tx = 1 nb_tx = 1
nb_rx = 1 nb_rx = 1
att_tx = 10; att_tx = 14;
att_rx = 10; att_rx = 14;
bands = [78]; bands = [78];
max_pdschReferenceSignalPower = -27; max_pdschReferenceSignalPower = -27;
max_rxgain = 114; max_rxgain = 114;
......
...@@ -423,6 +423,9 @@ def GetParametersFromXML(action): ...@@ -423,6 +423,9 @@ def GetParametersFromXML(action):
string_field=test.findtext('u_retx_th') string_field=test.findtext('u_retx_th')
if (string_field is not None): if (string_field is not None):
CONTAINERS.ran_checkers['u_retx_th'] = [float(x) for x in string_field.split(',')] CONTAINERS.ran_checkers['u_retx_th'] = [float(x) for x in string_field.split(',')]
string_field = test.findtext('services')
if string_field is not None:
CONTAINERS.services[CONTAINERS.eNB_instance] = string_field
elif action == 'DeployGenObject' or action == 'UndeployGenObject' or action == 'StatsFromGenObject': elif action == 'DeployGenObject' or action == 'UndeployGenObject' or action == 'StatsFromGenObject':
string_field=test.findtext('yaml_path') string_field=test.findtext('yaml_path')
...@@ -986,6 +989,9 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re ...@@ -986,6 +989,9 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
RAN.prematureExit = True RAN.prematureExit = True
elif action == 'Undeploy_Object': elif action == 'Undeploy_Object':
CONTAINERS.UndeployObject(HTML, RAN) CONTAINERS.UndeployObject(HTML, RAN)
if CONTAINERS.exitStatus == 1:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
RAN.prematureExit = True
elif action == 'Cppcheck_Analysis': elif action == 'Cppcheck_Analysis':
SCA.CppCheckAnalysis(HTML) SCA.CppCheckAnalysis(HTML)
elif action == 'LicenceAndFormattingCheck': elif action == 'LicenceAndFormattingCheck':
......
...@@ -748,7 +748,7 @@ class RANManagement(): ...@@ -748,7 +748,7 @@ class RANManagement():
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20) mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20) mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5) mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log* iperf*.log log/*/*.log log/*/*.pcap', '\$', 60) mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip *.log enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log* iperf*.log log/*/*.log log/*/*.pcap', '\$', 60)
result = re.search('core.\d+', mySSH.getBefore()) result = re.search('core.\d+', mySSH.getBefore())
if result is not None: if result is not None:
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip core* ran_build/build/{lte,nr}-softmodem', '\$', 60) # add core and executable to zip mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip core* ran_build/build/{lte,nr}-softmodem', '\$', 60) # add core and executable to zip
...@@ -771,13 +771,13 @@ class RANManagement(): ...@@ -771,13 +771,13 @@ class RANManagement():
#case where numerator > denumerator with denum ==0 is disregarded, cannot hapen in principle, will lead to 0% #case where numerator > denumerator with denum ==0 is disregarded, cannot hapen in principle, will lead to 0%
perc[i] = 0 if (retx_data[i] == 0) else 100 * retx_data[i + 1] / retx_data[i] perc[i] = 0 if (retx_data[i] == 0) else 100 * retx_data[i + 1] / retx_data[i]
#treating % > 100 , % > requirement #treating % > 100 , % > requirement
stats[i] = perc[i] < 100 and perc[i] <= checkers[i] stats[i] = perc[i] <= 100 and perc[i] <= checkers[i]
return stats return stats
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML, checkers={}): def AnalyzeLogFile_eNB(self, eNBlogFile, HTML, checkers={}):
if (not os.path.isfile('./' + eNBlogFile)): if (not os.path.isfile(eNBlogFile)):
return -1 return -1
enb_log_file = open('./' + eNBlogFile, 'r') enb_log_file = open(eNBlogFile, 'r')
exitSignalReceived = False exitSignalReceived = False
foundAssertion = False foundAssertion = False
msgAssertion = '' msgAssertion = ''
...@@ -1048,10 +1048,7 @@ class RANManagement(): ...@@ -1048,10 +1048,7 @@ class RANManagement():
gnb_markers[k].append(line_cnt) gnb_markers[k].append(line_cnt)
# check whether e/gNB log finishes with "Bye." message # check whether e/gNB log finishes with "Bye." message
# Note that it is "=" not "|=" so not only is the regex showedByeMsg |= re.search(r'^Bye.\n', str(line), re.MULTILINE) is not None
# asking for EOF (\Z) but we also only retain the last
# line's result
showedByeMsg = re.search(r'^Bye.\n\Z', str(line), re.MULTILINE) is not None
enb_log_file.close() enb_log_file.close()
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
--> -->
<testCaseList> <testCaseList>
<htmlTabRef>TEST-SA-FR1-B200</htmlTabRef> <htmlTabRef>TEST-SA-FR1-B200</htmlTabRef>
<htmlTabName>SA SanityCheck with QUECTEL</htmlTabName> <htmlTabName>40 MHz TDD SA</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon> <htmlTabIcon>tasks</htmlTabIcon>
<repeatCount>1</repeatCount> <repeatCount>1</repeatCount>
<TestCaseRequestedList> <TestCaseRequestedList>
...@@ -34,13 +34,13 @@ ...@@ -34,13 +34,13 @@
000001 000001
050000 050000
050001 050001
070001
070000
010002 010002
000001 000001
030201 030201
</TestCaseRequestedList> </TestCaseRequestedList>
<!-- <!--
070001
070000
070002 070002
050002 050002
050003 050003
...@@ -126,8 +126,8 @@ ...@@ -126,8 +126,8 @@
<testCase id="070000"> <testCase id="070000">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc> <desc>iperf (DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args> <iperf_args>-u -b 30M -t 30 -i 1 -fm -l1400</iperf_args>
<direction>DL</direction> <direction>DL</direction>
<id>idefix</id> <id>idefix</id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold> <iperf_packetloss_threshold>25</iperf_packetloss_threshold>
...@@ -137,8 +137,8 @@ ...@@ -137,8 +137,8 @@
<testCase id="070001"> <testCase id="070001">
<class>Iperf</class> <class>Iperf</class>
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc> <desc>iperf (UL/8Mbps/UDP)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 8M -t 60 -i 1 -fm</iperf_args> <iperf_args>-u -b 8M -t 30 -i 1 -fm -l1400</iperf_args>
<direction>UL</direction> <direction>UL</direction>
<id>idefix</id> <id>idefix</id>
<iperf_packetloss_threshold>1</iperf_packetloss_threshold> <iperf_packetloss_threshold>1</iperf_packetloss_threshold>
......
...@@ -22,12 +22,11 @@ ...@@ -22,12 +22,11 @@
--> -->
<testCaseList> <testCaseList>
<htmlTabRef>TEST-SA-FR1-B200-terminate</htmlTabRef> <htmlTabRef>TEST-SA-FR1-B200-terminate</htmlTabRef>
<htmlTabName>SA tear-down in case of problem</htmlTabName> <htmlTabName>Tear-down</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon> <htmlTabIcon>tasks</htmlTabIcon>
<repeatCount>1</repeatCount> <repeatCount>1</repeatCount>
<TestCaseRequestedList> <TestCaseRequestedList>
030201 030201
222222
</TestCaseRequestedList> </TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList> <TestCaseExclusionList></TestCaseExclusionList>
...@@ -35,15 +34,8 @@ ...@@ -35,15 +34,8 @@
<class>Undeploy_Object</class> <class>Undeploy_Object</class>
<desc>Undeploy gNB</desc> <desc>Undeploy gNB</desc>
<yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path> <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
<eNB_instance>1</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>1</eNB_serverId> <eNB_serverId>0</eNB_serverId>
<image_tag>sa-test</image_tag>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<desc>Clean Test Images on Test Server</desc>
<test_svr_id>0</test_svr_id>
</testCase> </testCase>
</testCaseList> </testCaseList>
<!--
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
-->
<testCaseList>
<htmlTabRef>TEST-SA-FR1-F1-B200</htmlTabRef>
<htmlTabName>40 MHz TDD F1 SA</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<repeatCount>1</repeatCount>
<TestCaseRequestedList>
110002
130101
130102
100001
110000
100001
150000
150001
110002
100001
130201
</TestCaseRequestedList>
<!--
070001
070000
070002
050002
050003
-->
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="110000">
<class>Initialize_UE</class>
<desc>Initialize Quectel</desc>
<id>idefix</id>
</testCase>
<testCase id="110002">
<class>Terminate_UE</class>
<desc>Terminate Quectel</desc>
<id>idefix</id>
</testCase>
<testCase id="130101">
<class>Deploy_Object</class>
<desc>Deploy gNB-CU in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_f1_b200_gnb</yaml_path>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<services>gnb_cu</services>
</testCase>
<testCase id="130102">
<class>Deploy_Object</class>
<desc>Deploy gNB-DU (TDD/Band78/40MHz/B200) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_f1_b200_gnb</yaml_path>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<services>gnb_du_tdd</services>
</testCase>
<testCase id="100001">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase id="100002">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
</testCase>
<testCase id="150000">
<class>Ping</class>
<desc>Ping: 20pings in 20sec</desc>
<id>idefix</id>
<ping_args>-c 20</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>25</ping_rttavg_threshold>
</testCase>
<testCase id="150001">
<class>Ping</class>
<desc>Ping: 100pings in 20sec</desc>
<id>idefix</id>
<ping_args>-c 100 -i 0.2</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>110</ping_rttavg_threshold>
</testCase>
<testCase id="150002">
<class>Ping</class>
<desc>Ping: 20pings in 20sec</desc>
<id>idefix</id>
<ping_args>-c 20</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>110</ping_rttavg_threshold>
</testCase>
<testCase id="150003">
<class>Ping</class>
<desc>Ping: 100pings in 20sec</desc>
<id>idefix</id>
<ping_args>-c 100 -i 0.2</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>110</ping_rttavg_threshold>
</testCase>
<testCase id="170000">
<class>Iperf</class>
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
<direction>DL</direction>
<id>idefix</id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="170001">
<class>Iperf</class>
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
<iperf_args>-u -b 8M -t 60 -i 1 -fm</iperf_args>
<direction>UL</direction>
<id>idefix</id>
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="170002">
<class>Iperf</class>
<desc>iperf (BIDIR TCP)(10 sec)(single-ue profile)</desc>
<iperf_args>-t 10 --bidir</iperf_args>
<direction>BIDIR</direction>
<id>idefix</id>
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="130201">
<class>Undeploy_Object</class>
<desc>Undeploy CU-DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_f1_b200_gnb</yaml_path>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<d_retx_th>1,100,100,100</d_retx_th>
<u_retx_th>1,100,100,100</u_retx_th>
</testCase>
</testCaseList>
<!--
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
-->
<testCaseList>
<htmlTabRef>TEST-SA-FR1-F1-B200-terminate</htmlTabRef>
<htmlTabName>Tear-down</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<repeatCount>1</repeatCount>
<TestCaseRequestedList>
230201
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="230201">
<class>Undeploy_Object</class>
<desc>Undeploy CU-DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_f1_b200_gnb</yaml_path>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<desc>Clean Test Images on Test Server</desc>
<test_svr_id>0</test_svr_id>
</testCase>
</testCaseList>
...@@ -270,7 +270,7 @@ services: ...@@ -270,7 +270,7 @@ services:
container_name: rfsim5g-oai-du container_name: rfsim5g-oai-du
environment: environment:
RFSIMULATOR: server RFSIMULATOR: server
USE_SA_TDD_CU: 'yes' USE_SA_TDD_DU: 'yes'
GNB_NAME: du-rfsim GNB_NAME: du-rfsim
TAC: 1 TAC: 1
MCC: '208' MCC: '208'
......
...@@ -20,7 +20,7 @@ services: ...@@ -20,7 +20,7 @@ services:
GNB_NGA_IP_ADDRESS: 192.168.68.194 GNB_NGA_IP_ADDRESS: 192.168.68.194
GNB_NGU_IF_NAME: eth0 GNB_NGU_IF_NAME: eth0
GNB_NGU_IP_ADDRESS: 192.168.68.194 GNB_NGU_IP_ADDRESS: 192.168.68.194
USE_ADDITIONAL_OPTIONS: --sa -E -q --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function
volumes: volumes:
- /dev:/dev - /dev:/dev
networks: networks:
......
version: '3.8'
services:
gnb_cu:
image: oai-gnb:latest
privileged: true
container_name: sa-cu-gnb
environment:
USE_SA_CU: 'yes'
USE_B2XX: 'yes'
GNB_NAME: gNB-CU-in-docker
MCC: '222'
MNC: '01'
MNC_LENGTH: 2
TAC: 1
NSSAI_SST: 1
NSSAI_SD0: 1
NSSAI_SD1: 2
AMF_IP_ADDRESS: 172.21.16.136
GNB_NGA_IF_NAME: eth0
GNB_NGA_IP_ADDRESS: 192.168.68.194
GNB_NGU_IF_NAME: eth0
GNB_NGU_IP_ADDRESS: 192.168.68.194
F1_IF_NAME: eth0
F1_CU_IP_ADDRESS: 192.168.68.194
F1_DU_IP_ADDRESS: 192.168.68.195
F1_CU_D_PORT: 2153
F1_DU_D_PORT: 2153
USE_ADDITIONAL_OPTIONS: --sa --log_config.global_log_options level,nocolor,time,line_num,function
volumes:
- /dev:/dev
networks:
public_net:
ipv4_address: 192.168.68.194
#entrypoint: /bin/bash -c "sleep infinity"
healthcheck:
# pgrep does NOT work
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
interval: 10s
timeout: 5s
retries: 5
gnb_du_tdd:
image: oai-gnb:latest
privileged: true
container_name: sa-du-b200-gnb
environment:
USE_SA_TDD_DU: 'yes'
USE_B2XX: 'yes'
GNB_NAME: gNB-DU-in-docker
MCC: '222'
MNC: '01'
MNC_LENGTH: 2
TAC: 1
NSSAI_SST: 1
NSSAI_SD0: 1
NSSAI_SD1: 2
AMF_IP_ADDRESS: 172.21.16.136
GNB_NGA_IF_NAME: eth0
GNB_NGA_IP_ADDRESS: 192.168.68.194
GNB_NGU_IF_NAME: eth0
GNB_NGU_IP_ADDRESS: 192.168.68.194
F1_IF_NAME: eth0
F1_CU_IP_ADDRESS: 192.168.68.194
F1_DU_IP_ADDRESS: 192.168.68.195
F1_CU_D_PORT: 2153
F1_DU_D_PORT: 2153
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 14 --RUs.[0].att_tx 14
volumes:
- /dev:/dev
networks:
public_net:
ipv4_address: 192.168.68.195
#entrypoint: /bin/bash -c "sleep infinity"
healthcheck:
# pgrep does NOT work
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
interval: 10s
timeout: 5s
retries: 5
networks:
public_net:
name: sa-b200-gnb-net
ipam:
config:
- subnet: 192.168.68.192/26
driver_opts:
com.docker.network.bridge.name: "sa-gnb-net"
...@@ -60,7 +60,7 @@ def main(): ...@@ -60,7 +60,7 @@ def main():
"rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
"gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
"gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
"gnb.sa.band78.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.sa.band78.fr1.51PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
"gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
"gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
"gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
......
...@@ -13,7 +13,7 @@ if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb ...@@ -13,7 +13,7 @@ if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb
if [[ -v USE_SA_TDD_MONO_B2XX ]]; then cp $PREFIX/etc/gnb.sa.tdd.b2xx.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_MONO_B2XX ]]; then cp $PREFIX/etc/gnb.sa.tdd.b2xx.conf $PREFIX/etc/gnb.conf; fi
if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi
if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_DU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi
if [[ -v USE_SA_NFAPI_VNF ]]; then cp $PREFIX/etc/gnb.sa.nfapi.vnf.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_NFAPI_VNF ]]; then cp $PREFIX/etc/gnb.sa.nfapi.vnf.conf $PREFIX/etc/gnb.conf; fi
# Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself. # Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself.
if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/gnb.conf; fi
......
...@@ -109,7 +109,7 @@ ...@@ -109,7 +109,7 @@
- key: parallel_config - key: parallel_config
env: "@THREAD_PARALLEL_CONFIG@" env: "@THREAD_PARALLEL_CONFIG@"
- filePrefix: gnb.sa.band78.fr1.106PRB.usrpb210.conf - filePrefix: gnb.sa.band78.fr1.51PRB.usrpb210.conf
outputfilename: "gnb.sa.tdd.b2xx.conf" outputfilename: "gnb.sa.tdd.b2xx.conf"
config: config:
- key: gNB_ID - key: gNB_ID
......
...@@ -18,6 +18,7 @@ gNBs = ...@@ -18,6 +18,7 @@ gNBs =
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) }); plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
nr_cellid = 12345678L; nr_cellid = 12345678L;
force_256qam_off = 1;
tr_s_preference = "f1"; tr_s_preference = "f1";
......
...@@ -21,6 +21,7 @@ gNBs = ...@@ -21,6 +21,7 @@ gNBs =
////////// Physical parameters: ////////// Physical parameters:
min_rxtxtime = 6; min_rxtxtime = 6;
force_256qam_off = 1;
pdcch_ConfigSIB1 = ( pdcch_ConfigSIB1 = (
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment