diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index d933c1e143932217fca90f97497419867e4049fb..184bb7bdb336090364260c2560238dd832b9733e 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -773,22 +773,19 @@ class Containerize(): mySSH.command(f'sed -i -e "s#image: {image}:latest#image: {imageToUse}#" ci-docker-compose.yml', '\$', 2) localMmeIpAddr = EPC.MmeIPAddress 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 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) - result = re.search('service=(?P<svc_name>[a-zA-Z0-9\_]+)', mySSH.getBefore()) - if result is not None: - svcName = result.group('svc_name') - mySSH.command('docker-compose --file ci-docker-compose.yml up -d ' + svcName, '\$', 15) + svcName = self.services[self.eNB_instance] + if svcName == '': + logging.warning('no service name given: starting all services in ci-docker-compose.yml!') + + mySSH.command(f'docker-compose --file ci-docker-compose.yml up -d -- {svcName}', '\$', 30) # 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()) unhealthyNb = 0 healthyNb = 0 @@ -848,8 +845,8 @@ class Containerize(): else: # 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 - logfilename = f'{lSourcePath}/cmake_targets/{self.eNB_logFile[self.eNB_instance]}' - mySSH.command('docker logs {containerName} > {logfilename}', '\$', 30) + logfilename = f'{lSourcePath}/cmake_targets/log/{self.eNB_logFile[self.eNB_instance]}' + mySSH.command(f'docker logs {containerName} > {logfilename}', '\$', 30) mySSH.copyin(lIpAddr, lUserName, lPassWord, logfilename, '.') mySSH.close() @@ -896,58 +893,67 @@ class Containerize(): mySSH = SSH.SSHConnection() mySSH.open(lIpAddr, lUserName, lPassWord) 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) - containerName = '' - containerToKill = False - result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore()) - if self.eNB_logFile[self.eNB_instance] == '': - self.eNB_logFile[self.eNB_instance] = 'enb_' + HTML.testCase_id + '.log' - if result is not None: - containerName = result.group('container_name') - containerToKill = True - if containerToKill: - mySSH.command('docker inspect ' + containerName, '\$', 30) - result = re.search('Error: No such object: ' + containerName, mySSH.getBefore()) - if result is not None: - containerToKill = False - if containerToKill: - mySSH.command('docker kill --signal INT ' + containerName, '\$', 30) - time.sleep(5) - mySSH.command('docker kill --signal KILL ' + containerName, '\$', 30) - time.sleep(5) - mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30) - mySSH.command('docker rm -f ' + containerName, '\$', 30) - # Forcing the down now to remove the networks and any artifacts - mySSH.command('docker-compose --file ci-docker-compose.yml down', '\$', 5) + + svcName = self.services[self.eNB_instance] + forceDown = False + if svcName != '': + logging.warning(f'service name given, but will stop all services in ci-docker-compose.yml!') + svcName = '' + + mySSH.command(f'docker-compose -f ci-docker-compose.yml config --services', '\$', 5) + # first line has command, last line has next command prompt + allServices = mySSH.getBefore().split('\r\n')[1:-1] + services = [] + for s in allServices: + mySSH.command(f'docker-compose -f ci-docker-compose.yml ps --all -- {s}', '\$', 5, silent=False) + running = mySSH.getBefore().split('\r\n')[3:-1] + #logging.debug(f'running services: {running}') + if len(running) > 0: # something is running for that service + services.append(s) + logging.info(f'stopping services {services}') + + mySSH.command(f'docker-compose -f ci-docker-compose.yml stop', '\$', 30) + time.sleep(5) # give some time to running containers to stop + for svcName in services: + # head -n -1 suppresses the final "X exited with status code Y" + 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 - mySSH.command('docker volume prune --force || true', '\$', 20) + mySSH.command('docker volume prune --force', '\$', 20) mySSH.close() # Analyzing log file! - if containerToKill: - copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '.') - else: - copyin_res = 0 - nodeB_prefix = 'e' - if (copyin_res == -1): - HTML.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!' + files = ','.join([f'{s}-{HTML.testCase_id}' for s in services]) + if len(services) > 1: + files = '{' + files + '}' + copyin_res = 0 + if len(services) > 0: + copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, f'{lSourcePath}/cmake_targets/log/{files}.log', '.') + if copyin_res == -1: + HTML.htmleNBFailureMsg='Could not copy logfile to analyze it!' HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE) + self.exitStatus = 1 else: - if containerToKill: - logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + self.eNB_logFile[self.eNB_instance]) - logStatus = RAN.AnalyzeLogFile_eNB(self.eNB_logFile[self.eNB_instance], HTML, self.ran_checkers) - else: - logStatus = 0 - if (logStatus < 0): - HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus) - else: - HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK) + for svcName in services: + filename = f'{svcName}-{HTML.testCase_id}.log' + logging.debug(f'\u001B[1m Analyzing logfile {filename}\u001B[0m') + logStatus = RAN.AnalyzeLogFile_eNB(filename, HTML, self.ran_checkers) + if (logStatus < 0): + HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus) + self.exitStatus = 1 + else: + HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK) # all the xNB run logs shall be on the server 0 for logCollecting - if containerToKill and 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/') - logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m') + if self.eNB_serverId[self.eNB_instance] != '0': + 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') + else: + logging.error('\u001B[1m Undeploying OAI Object Failed\u001B[0m') def DeployGenObject(self, HTML, RAN, UE): self.exitStatus = 0 diff --git a/ci-scripts/conf_files/gNB_SA_CU.conf b/ci-scripts/conf_files/gNB_SA_CU.conf index 81635f7eb203bea1eca8f6292eb1a3d369df3997..a5036e354dfb25736fc81a51195b0a3f538ccfdb 100644 --- a/ci-scripts/conf_files/gNB_SA_CU.conf +++ b/ci-scripts/conf_files/gNB_SA_CU.conf @@ -19,6 +19,7 @@ gNBs = nr_cellid = 12345678L; + force_256qam_off = 1; tr_s_preference = "f1"; diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf index 2a2524cb8779bd3de3ce70240c47f6289788a246..ca5aba10c094c28f14f9c3724f08495a5c701d1b 100644 --- a/ci-scripts/conf_files/gNB_SA_DU.conf +++ b/ci-scripts/conf_files/gNB_SA_DU.conf @@ -22,6 +22,7 @@ gNBs = ////////// Physical parameters: min_rxtxtime = 6; + force_256qam_off = 1; pdcch_ConfigSIB1 = ( { @@ -57,7 +58,7 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPcontrolResourceSetZero = 12; initialDLBWPsearchSpaceZero = 0; #uplinkConfigCommon @@ -181,7 +182,8 @@ MACRLCs = ( local_n_portd = 2152; remote_n_portc = 501; remote_n_portd = 2152; - + pusch_TargetSNRx10 = 200; + pucch_TargetSNRx10 = 200; } ); diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.51PRB.usrpb210.conf similarity index 79% rename from ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf rename to ci-scripts/conf_files/gnb.sa.band78.fr1.51PRB.usrpb210.conf index b82944805a12d714552a5295dbf3bcde9df86e75..6080ac58aa135bcb2c638ca14b65a3037181e2f3 100644 --- a/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.51PRB.usrpb210.conf @@ -17,9 +17,8 @@ gNBs = ////////// Physical parameters: - min_rxtxtime = 2; - do_CSIRS = 1; - do_SRS = 1; + do_CSIRS = 0; + do_SRS = 0; pdcch_ConfigSIB1 = ( { @@ -36,21 +35,21 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL - # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641280; + # this is 3300.30 MHz + (19 PRBs + 10 SCs)@30kHz SCS (GSCN: 7715) + absoluteFrequencySSB = 620736; dl_frequencyBand = 78; - # this is 3600 MHz - dl_absoluteFrequencyPointA = 640008; + # this is 3300.30 MHz + dl_absoluteFrequencyPointA = 620020; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 dl_subcarrierSpacing = 1; - dl_carrierBandwidth = 106; + dl_carrierBandwidth = 51; #initialDownlinkBWP #genericParameters # this is RBstart=27,L=48 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 + initialDLBWPlocationAndBandwidth = 13750; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; @@ -66,11 +65,11 @@ gNBs = # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ul_subcarrierSpacing = 1; - ul_carrierBandwidth = 106; + ul_carrierBandwidth = 51; pMax = 20; #initialUplinkBWP #genericParameters - initialULBWPlocationAndBandwidth = 28875; + initialULBWPlocationAndBandwidth = 13750; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialULBWPsubcarrierSpacing = 1; @@ -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 : { @@ -252,6 +192,7 @@ MACRLCs = ( tr_n_preference = "local_RRC"; pusch_TargetSNRx10 = 200; pucch_TargetSNRx10 = 200; + ul_prbblack_SNR_threshold = 10; ulsch_max_frame_inactivity = 0; } ); @@ -271,8 +212,8 @@ RUs = ( local_rf = "yes" nb_tx = 1 nb_rx = 1 - att_tx = 10; - att_rx = 10; + att_tx = 14; + att_rx = 14; bands = [78]; max_pdschReferenceSignalPower = -27; max_rxgain = 114; diff --git a/ci-scripts/main.py b/ci-scripts/main.py index d60477427e814a2a26b6a43d73ef5afb7f4803de..f1ec41a1e7beb7c461b35fcce1a94cf4555b452d 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -423,6 +423,9 @@ def GetParametersFromXML(action): string_field=test.findtext('u_retx_th') if (string_field is not None): 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': string_field=test.findtext('yaml_path') @@ -986,6 +989,9 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re RAN.prematureExit = True elif action == 'Undeploy_Object': CONTAINERS.UndeployObject(HTML, RAN) + if CONTAINERS.exitStatus == 1: + CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) + RAN.prematureExit = True elif action == 'Cppcheck_Analysis': SCA.CppCheckAnalysis(HTML) elif action == 'LicenceAndFormattingCheck': diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index da2ac9a401b71fa622a430e6da4b892d853f0eaf..c758e620b7bfffe868469189f1526bc75089734c 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -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/gnb_*.pcap .','\$',20) 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()) 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 @@ -771,13 +771,13 @@ class RANManagement(): #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] #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 def AnalyzeLogFile_eNB(self, eNBlogFile, HTML, checkers={}): - if (not os.path.isfile('./' + eNBlogFile)): + if (not os.path.isfile(eNBlogFile)): return -1 - enb_log_file = open('./' + eNBlogFile, 'r') + enb_log_file = open(eNBlogFile, 'r') exitSignalReceived = False foundAssertion = False msgAssertion = '' @@ -1048,10 +1048,7 @@ class RANManagement(): gnb_markers[k].append(line_cnt) # check whether e/gNB log finishes with "Bye." message - # Note that it is "=" not "|=" so not only is the regex - # 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 + showedByeMsg |= re.search(r'^Bye.\n', str(line), re.MULTILINE) is not None enb_log_file.close() diff --git a/ci-scripts/xml_files/container_sa_b200_quectel.xml b/ci-scripts/xml_files/container_sa_b200_quectel.xml index 016a3f34ec26c01f27d348d124f39152d8ee04e1..53cfbf80cb739d4f56fe5321b8311ac25e37b59c 100644 --- a/ci-scripts/xml_files/container_sa_b200_quectel.xml +++ b/ci-scripts/xml_files/container_sa_b200_quectel.xml @@ -22,7 +22,7 @@ --> <testCaseList> <htmlTabRef>TEST-SA-FR1-B200</htmlTabRef> - <htmlTabName>SA SanityCheck with QUECTEL</htmlTabName> + <htmlTabName>40 MHz TDD SA</htmlTabName> <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> @@ -34,13 +34,13 @@ 000001 050000 050001 + 070001 + 070000 010002 000001 030201 </TestCaseRequestedList> <!-- - 070001 - 070000 070002 050002 050003 @@ -126,8 +126,8 @@ <testCase id="070000"> <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> + <desc>iperf (DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc> + <iperf_args>-u -b 30M -t 30 -i 1 -fm -l1400</iperf_args> <direction>DL</direction> <id>idefix</id> <iperf_packetloss_threshold>25</iperf_packetloss_threshold> @@ -137,8 +137,8 @@ <testCase id="070001"> <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> + <desc>iperf (UL/8Mbps/UDP)(30 sec)(single-ue profile)</desc> + <iperf_args>-u -b 8M -t 30 -i 1 -fm -l1400</iperf_args> <direction>UL</direction> <id>idefix</id> <iperf_packetloss_threshold>1</iperf_packetloss_threshold> diff --git a/ci-scripts/xml_files/container_sa_b200_terminate.xml b/ci-scripts/xml_files/container_sa_b200_terminate.xml index 8e7e0eff4487d786a8aa81ba7ad6b7774c1e242a..bddc94aedf03ead6cad98cdfd593e1be4460747b 100644 --- a/ci-scripts/xml_files/container_sa_b200_terminate.xml +++ b/ci-scripts/xml_files/container_sa_b200_terminate.xml @@ -22,12 +22,11 @@ --> <testCaseList> <htmlTabRef>TEST-SA-FR1-B200-terminate</htmlTabRef> - <htmlTabName>SA tear-down in case of problem</htmlTabName> + <htmlTabName>Tear-down</htmlTabName> <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> 030201 - 222222 </TestCaseRequestedList> <TestCaseExclusionList></TestCaseExclusionList> @@ -35,15 +34,8 @@ <class>Undeploy_Object</class> <desc>Undeploy gNB</desc> <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path> - <eNB_instance>1</eNB_instance> - <eNB_serverId>1</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> + <eNB_instance>0</eNB_instance> + <eNB_serverId>0</eNB_serverId> </testCase> </testCaseList> diff --git a/ci-scripts/xml_files/container_sa_f1_b200_quectel.xml b/ci-scripts/xml_files/container_sa_f1_b200_quectel.xml new file mode 100644 index 0000000000000000000000000000000000000000..16081f906a353de900a525adcb78c164bdf7df07 --- /dev/null +++ b/ci-scripts/xml_files/container_sa_f1_b200_quectel.xml @@ -0,0 +1,172 @@ +<!-- + + 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> + diff --git a/ci-scripts/xml_files/container_sa_f1_b200_terminate.xml b/ci-scripts/xml_files/container_sa_f1_b200_terminate.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd8445f9ce8f3cda7a6e1a58289610340ffddfee --- /dev/null +++ b/ci-scripts/xml_files/container_sa_f1_b200_terminate.xml @@ -0,0 +1,48 @@ +<!-- + + 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> diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml index 952732f22dd1c5c798fa20cd513eb7f5169d4f18..5765a33351ed8376d28e6d2c1a28beca4f15da0c 100644 --- a/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml @@ -270,7 +270,7 @@ services: container_name: rfsim5g-oai-du environment: RFSIMULATOR: server - USE_SA_TDD_CU: 'yes' + USE_SA_TDD_DU: 'yes' GNB_NAME: du-rfsim TAC: 1 MCC: '208' diff --git a/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml index 9ea52c12477a8436cd1a12cb991222a0321e950d..32655ffe772a1850463ef3e7ce82cc16df41501a 100644 --- a/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml +++ b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml @@ -20,7 +20,7 @@ services: GNB_NGA_IP_ADDRESS: 192.168.68.194 GNB_NGU_IF_NAME: eth0 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: - /dev:/dev networks: diff --git a/ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml b/ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..05b6ee03bc4ac95749c2c3ae142d4370616e8a84 --- /dev/null +++ b/ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml @@ -0,0 +1,89 @@ +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" diff --git a/docker/scripts/generateTemplate.py b/docker/scripts/generateTemplate.py index 1d5dbb5cb5369b9fb6645688cfd8815e1af3e583..9ad4f3c5e66d0d3ba7fff75ccca03471284f87f8 100644 --- a/docker/scripts/generateTemplate.py +++ b/docker/scripts/generateTemplate.py @@ -60,7 +60,7 @@ def main(): "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.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_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh index c3c4ef0b2d3f251de5d0cd384428fd9a9c640034..bb1bd50555737e641f1ca91ae7c64bc00d423c20 100755 --- a/docker/scripts/gnb_entrypoint.sh +++ b/docker/scripts/gnb_entrypoint.sh @@ -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_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_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 # 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 diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml index 524c6fbb4230e9f9701330b2c5294b17893cedbb..0d1a02974b69501bb211fd8843bd61b67db7bd87 100644 --- a/docker/scripts/gnb_parameters.yaml +++ b/docker/scripts/gnb_parameters.yaml @@ -109,7 +109,7 @@ - key: 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" config: - key: gNB_ID diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf index 730b7e2832a84304b35c3aff38925d00cabb1bd2..5dcff74a6f103083ebacf7947c4752b044e6d287 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf @@ -18,6 +18,7 @@ gNBs = plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) }); nr_cellid = 12345678L; + force_256qam_off = 1; tr_s_preference = "f1"; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf index 257f487aa5dbf802f3a850b09bba8064f18c7b8b..bbce460a11d2f7f59244ccc70640cff3d5853c8a 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf @@ -21,6 +21,7 @@ gNBs = ////////// Physical parameters: min_rxtxtime = 6; + force_256qam_off = 1; pdcch_ConfigSIB1 = ( {