Merge branch 'develop' of https://gitlab.eurecom.fr/oai/openairinterface5G into nr_prs
This commit is contained in:
@@ -136,16 +136,16 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("RHEL8 Build") {
|
stage ("RHEL8-Cluster-Image-Builder") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
triggerSlaveJob ('RAN-RHEL8-Image-Builder', 'RHEL8-Images-Build')
|
triggerSlaveJob ('RAN-RHEL8-Cluster-Image-Builder', 'RHEL8-Cluster-Image-Builder')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
finalizeSlaveJob('RAN-RHEL8-Image-Builder')
|
finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
|
|||||||
@@ -0,0 +1,254 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Location of the executor node
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Name of the resource
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
def directoryExistsGlob(fileNameWithGlob) {
|
||||||
|
/* if multiple directories match, will join their names and call fileExists() on that */
|
||||||
|
def dir = sh returnStdout: true, script: 'find . -name \'' + fileNameWithGlob + '\' -type d'
|
||||||
|
dir = dir.replaceAll("\n", "").trim()
|
||||||
|
echo "matching '" + fileNameWithGlob + "' found: '" + dir + "'"
|
||||||
|
if (dir == "")
|
||||||
|
return false
|
||||||
|
return fileExists(dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
// Pipeline start
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
timestamps()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage ('Verify Parameters') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
|
||||||
|
JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
|
||||||
|
JOB_TIMESTAMP = JOB_TIMESTAMP.trim()
|
||||||
|
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_IPAddress == null) {
|
||||||
|
echo "no eNB_IPAddress given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
echo "no eNB_SourceCodePath given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_Credentials == null) {
|
||||||
|
echo "no eNB_Credentials given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// the following 4 parameters should be pushed by the master trigger
|
||||||
|
// if not present, take the job GIT variables (used for developing)
|
||||||
|
if (params.eNB_Repository == null) {
|
||||||
|
eNB_Repository = env.GIT_URL
|
||||||
|
} else {
|
||||||
|
eNB_Repository = params.eNB_Repository
|
||||||
|
}
|
||||||
|
echo "eNB_Repository : ${eNB_Repository}"
|
||||||
|
if (params.eNB_Branch == null) {
|
||||||
|
eNB_Branch = env.GIT_BRANCH
|
||||||
|
} else {
|
||||||
|
eNB_Branch = params.eNB_Branch
|
||||||
|
}
|
||||||
|
echo "eNB_Branch : ${eNB_Branch}"
|
||||||
|
if (params.eNB_CommitID == null) {
|
||||||
|
eNB_CommitID = env.GIT_COMMIT
|
||||||
|
} else {
|
||||||
|
eNB_CommitID = params.eNB_CommitID
|
||||||
|
}
|
||||||
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
|
if (params.eNB_mergeRequest != null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_mergeRequest
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
if (params.eNB_TargetBranch != null) {
|
||||||
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
} else {
|
||||||
|
eNB_TargetBranch = 'develop'
|
||||||
|
}
|
||||||
|
echo "eNB_TargetBranch : ${eNB_TargetBranch}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "no eNB_mergeRequest given - not merging develop"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.EPC_IPAddress == null) {
|
||||||
|
echo "no EPC_IPAddress given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Type == null) {
|
||||||
|
echo "no EPC_Type given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_SourceCodePath == null) {
|
||||||
|
echo "no EPC_SourceCodePath given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Credentials == null) {
|
||||||
|
echo "no EPC_Credentials given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.ADB_IPAddress == null) {
|
||||||
|
echo "no ADB_IPAddress given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.ADB_Credentials == null) {
|
||||||
|
echo "no ADB_IPAddress given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.OC_Credentials == null) {
|
||||||
|
echo "no OC_Credentials given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.OC_ProjectName == null) {
|
||||||
|
echo "no OC_ProjectName given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
echo "no pythonTestXmlFile given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Deploy and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} ${mainPythonAllXmlFiles}"
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${xmlFile} --OCUserName=${OC_Username} --OCPassword=${OC_Password} --OCProjectName=${OC_ProjectName}"
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Log Collection") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
if (directoryExistsGlob("build_log_*")) {
|
||||||
|
sh "zip -r -qq build_log_${env.BUILD_ID}.zip build_log_*/*"
|
||||||
|
sh "rm -rf build_log_*/"
|
||||||
|
archiveArtifacts artifacts: "build_log_${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if (directoryExistsGlob("test_log_*")) {
|
||||||
|
sh "zip -r -qq test_log_${env.BUILD_ID}.zip test_log_*/*"
|
||||||
|
sh "rm -rf test_log_*/"
|
||||||
|
archiveArtifacts artifacts: "test_log_${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if (fileExists("test_results.html")) {
|
||||||
|
sh "mv test_results.html test_results-${env.JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts artifacts: "test_results-${env.JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -41,7 +41,7 @@ import constants as CONST
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM,CLUSTER):
|
||||||
|
|
||||||
|
|
||||||
py_param_file_present = False
|
py_param_file_present = False
|
||||||
@@ -82,6 +82,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.ranRepository=matchReg.group(1)
|
CONTAINERS.ranRepository=matchReg.group(1)
|
||||||
SCA.ranRepository=matchReg.group(1)
|
SCA.ranRepository=matchReg.group(1)
|
||||||
PHYSIM.ranRepository=matchReg.group(1)
|
PHYSIM.ranRepository=matchReg.group(1)
|
||||||
|
CLUSTER.ranRepository=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE)
|
||||||
@@ -96,6 +97,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.ranAllowMerge=True
|
CONTAINERS.ranAllowMerge=True
|
||||||
SCA.ranAllowMerge=True
|
SCA.ranAllowMerge=True
|
||||||
PHYSIM.ranAllowMerge=True
|
PHYSIM.ranAllowMerge=True
|
||||||
|
CLUSTER.ranAllowMerge=True
|
||||||
elif re.match('^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE)
|
||||||
@@ -108,6 +110,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.ranBranch=matchReg.group(1)
|
CONTAINERS.ranBranch=matchReg.group(1)
|
||||||
SCA.ranBranch=matchReg.group(1)
|
SCA.ranBranch=matchReg.group(1)
|
||||||
PHYSIM.ranBranch=matchReg.group(1)
|
PHYSIM.ranBranch=matchReg.group(1)
|
||||||
|
CLUSTER.ranBranch=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE)
|
||||||
@@ -120,6 +123,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.ranCommitID=matchReg.group(1)
|
CONTAINERS.ranCommitID=matchReg.group(1)
|
||||||
SCA.ranCommitID=matchReg.group(1)
|
SCA.ranCommitID=matchReg.group(1)
|
||||||
PHYSIM.ranCommitID=matchReg.group(1)
|
PHYSIM.ranCommitID=matchReg.group(1)
|
||||||
|
CLUSTER.ranCommitID=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE)
|
||||||
@@ -132,6 +136,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
||||||
SCA.ranTargetBranch=matchReg.group(1)
|
SCA.ranTargetBranch=matchReg.group(1)
|
||||||
PHYSIM.ranTargetBranch=matchReg.group(1)
|
PHYSIM.ranTargetBranch=matchReg.group(1)
|
||||||
|
CLUSTER.ranTargetBranch=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
@@ -140,6 +145,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.eNBIPAddress=matchReg.group(1)
|
CONTAINERS.eNBIPAddress=matchReg.group(1)
|
||||||
SCA.eNBIPAddress=matchReg.group(1)
|
SCA.eNBIPAddress=matchReg.group(1)
|
||||||
PHYSIM.eNBIPAddress=matchReg.group(1)
|
PHYSIM.eNBIPAddress=matchReg.group(1)
|
||||||
|
CLUSTER.eNBIPAddress=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1IPAddress=matchReg.group(1)
|
RAN.eNB1IPAddress=matchReg.group(1)
|
||||||
@@ -156,6 +162,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.eNBUserName=matchReg.group(1)
|
CONTAINERS.eNBUserName=matchReg.group(1)
|
||||||
SCA.eNBUserName=matchReg.group(1)
|
SCA.eNBUserName=matchReg.group(1)
|
||||||
PHYSIM.eNBUserName=matchReg.group(1)
|
PHYSIM.eNBUserName=matchReg.group(1)
|
||||||
|
CLUSTER.eNBUserName=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1UserName=matchReg.group(1)
|
RAN.eNB1UserName=matchReg.group(1)
|
||||||
@@ -172,6 +179,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.eNBPassword=matchReg.group(1)
|
CONTAINERS.eNBPassword=matchReg.group(1)
|
||||||
SCA.eNBPassword=matchReg.group(1)
|
SCA.eNBPassword=matchReg.group(1)
|
||||||
PHYSIM.eNBPassword=matchReg.group(1)
|
PHYSIM.eNBPassword=matchReg.group(1)
|
||||||
|
CLUSTER.eNBPassword=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1Password=matchReg.group(1)
|
RAN.eNB1Password=matchReg.group(1)
|
||||||
@@ -188,6 +196,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
||||||
SCA.eNBSourceCodePath=matchReg.group(1)
|
SCA.eNBSourceCodePath=matchReg.group(1)
|
||||||
PHYSIM.eNBSourceCodePath=matchReg.group(1)
|
PHYSIM.eNBSourceCodePath=matchReg.group(1)
|
||||||
|
CLUSTER.eNBSourceCodePath=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1SourceCodePath=matchReg.group(1)
|
RAN.eNB1SourceCodePath=matchReg.group(1)
|
||||||
@@ -260,12 +269,21 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
|
|||||||
elif re.match('^\-\-OCUserName=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-OCUserName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-OCUserName=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-OCUserName=(.+)$', myArgv, re.IGNORECASE)
|
||||||
PHYSIM.OCUserName = matchReg.group(1)
|
PHYSIM.OCUserName = matchReg.group(1)
|
||||||
|
CLUSTER.OCUserName = matchReg.group(1)
|
||||||
elif re.match('^\-\-OCPassword=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-OCPassword=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-OCPassword=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-OCPassword=(.+)$', myArgv, re.IGNORECASE)
|
||||||
PHYSIM.OCPassword = matchReg.group(1)
|
PHYSIM.OCPassword = matchReg.group(1)
|
||||||
|
CLUSTER.OCPassword = matchReg.group(1)
|
||||||
elif re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE)
|
||||||
PHYSIM.OCProjectName = matchReg.group(1)
|
PHYSIM.OCProjectName = matchReg.group(1)
|
||||||
|
CLUSTER.OCProjectName = matchReg.group(1)
|
||||||
|
elif re.match('^\-\-OCUrl=(.+)$', myArgv, re.IGNORECASE):
|
||||||
|
matchReg = re.match('^\-\-OCUrl=(.+)$', myArgv, re.IGNORECASE)
|
||||||
|
CLUSTER.OCUrl = matchReg.group(1)
|
||||||
|
elif re.match('^\-\-OCRegistry=(.+)$', myArgv, re.IGNORECASE):
|
||||||
|
matchReg = re.match('^\-\-OCRegistry=(.+)$', myArgv, re.IGNORECASE)
|
||||||
|
CLUSTER.OCRegistry = matchReg.group(1)
|
||||||
elif re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.BuildId = matchReg.group(1)
|
RAN.BuildId = matchReg.group(1)
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ then
|
|||||||
IS_NFAPI=`echo $FILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
IS_NFAPI=`echo $FILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
||||||
IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FILE || true`
|
IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FILE || true`
|
||||||
IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause" $FILE || true`
|
IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause" $FILE || true`
|
||||||
IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/types.h|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h" || true`
|
IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h" || true`
|
||||||
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
|
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
|
||||||
then
|
then
|
||||||
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
|
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
|
||||||
@@ -184,7 +184,7 @@ do
|
|||||||
IS_NFAPI=`echo $FULLFILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
IS_NFAPI=`echo $FULLFILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
||||||
IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FULLFILE || true`
|
IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FULLFILE || true`
|
||||||
IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause" $FULLFILE || true`
|
IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause" $FULLFILE || true`
|
||||||
IS_EXCEPTION=`echo $FULLFILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/types.h|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h" || true`
|
IS_EXCEPTION=`echo $FULLFILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h" || true`
|
||||||
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
|
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
|
||||||
then
|
then
|
||||||
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
|
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
|
||||||
|
|||||||
@@ -0,0 +1,377 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
# Required Python Package
|
||||||
|
# pexpect
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import logging
|
||||||
|
import sshconnection as SSH
|
||||||
|
import cls_oai_html
|
||||||
|
#import os
|
||||||
|
import re
|
||||||
|
import time
|
||||||
|
#import subprocess
|
||||||
|
import sys
|
||||||
|
import constants as CONST
|
||||||
|
import helpreadme as HELP
|
||||||
|
import cls_containerize
|
||||||
|
|
||||||
|
class Cluster:
|
||||||
|
def __init__(self):
|
||||||
|
self.eNBIPAddress = ""
|
||||||
|
self.eNBSourceCodePath = ""
|
||||||
|
self.forcedWorkspaceCleanup = False
|
||||||
|
self.OCUserName = ""
|
||||||
|
self.OCPassword = ""
|
||||||
|
self.OCProjectName = ""
|
||||||
|
self.OCUrl = "https://api.oai.cs.eurecom.fr:6443"
|
||||||
|
self.OCRegistry = "default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/"
|
||||||
|
self.ranRepository = ""
|
||||||
|
self.ranBranch = ""
|
||||||
|
self.ranCommitID = ""
|
||||||
|
self.ranAllowMerge = False
|
||||||
|
self.ranTargetBranch = ""
|
||||||
|
|
||||||
|
def _recreate_entitlements(self, sshSession):
|
||||||
|
# recreating entitlements, don't care if deletion fails
|
||||||
|
sshSession.command('oc delete secret etc-pki-entitlement', '\$', 5)
|
||||||
|
if re.search(r"not found", sshSession.getBefore()):
|
||||||
|
logging.warning("no secrets etc-pki-entitlement found, recreating")
|
||||||
|
sshSession.command('ls /etc/pki/entitlement/???????????????????.pem | tail -1', '\$', 5, silent=True)
|
||||||
|
regres1 = re.search(r"/etc/pki/entitlement/[0-9]+.pem", sshSession.getBefore())
|
||||||
|
sshSession.command('ls /etc/pki/entitlement/???????????????????-key.pem | tail -1', '\$', 5, silent=True)
|
||||||
|
regres2 = re.search(r"/etc/pki/entitlement/[0-9]+-key.pem", sshSession.getBefore())
|
||||||
|
if regres1 is None or regres2 is None:
|
||||||
|
logging.error("could not find entitlements")
|
||||||
|
return false
|
||||||
|
file1 = regres1.group(0)
|
||||||
|
file2 = regres2.group(0)
|
||||||
|
sshSession.command(f'oc create secret generic etc-pki-entitlement --from-file {file1} --from-file {file2}', '\$', 5)
|
||||||
|
regres = re.search(r"secret/etc-pki-entitlement created", sshSession.getBefore())
|
||||||
|
if regres is None:
|
||||||
|
logging.error("could not create secret/etc-pki-entitlement")
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _recreate_bc(self, sshSession, name, newTag, filename):
|
||||||
|
self._retag_image_statement(sshSession, name, name, newTag, filename)
|
||||||
|
sshSession.command(f'oc delete -f {filename}', '\$', 5)
|
||||||
|
sshSession.command(f'oc create -f {filename}', '\$', 5)
|
||||||
|
before = sshSession.getBefore()
|
||||||
|
if re.search('buildconfig.build.openshift.io/[a-zA-Z\-0-9]+ created', before) is not None:
|
||||||
|
return True
|
||||||
|
logging.error('error while creating buildconfig: ' + sshSession.getBefore())
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _recreate_is_tag(self, sshSession, name, newTag, filename):
|
||||||
|
sshSession.command(f'oc describe is {name}', '\$', 5)
|
||||||
|
if sshSession.getBefore().count('NotFound') > 0:
|
||||||
|
sshSession.command(f'oc create -f {filename}', '\$', 5)
|
||||||
|
before = sshSession.getBefore()
|
||||||
|
if re.search(f'imagestream.image.openshift.io/{name} created', before) is None:
|
||||||
|
logging.error('error while creating imagestream: ' + sshSession.getBefore())
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
logging.debug(f'-> imagestream {name} found')
|
||||||
|
image = f'{name}:{newTag}'
|
||||||
|
sshSession.command(f'oc delete istag {image}', '\$', 5) # we don't care if this fails, e.g., if it is missing
|
||||||
|
sshSession.command(f'oc create istag {image}', '\$', 5)
|
||||||
|
before = sshSession.getBefore()
|
||||||
|
if re.search(f'imagestreamtag.image.openshift.io/{image} created', before) is not None:
|
||||||
|
return True
|
||||||
|
logging.error('error while creating imagestreamtag: ' + sshSession.getBefore())
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _start_build(self, sshSession, name):
|
||||||
|
# will return "immediately" but build runs in background
|
||||||
|
# if multiple builds are started at the same time, this can take some time, however
|
||||||
|
ret = sshSession.command(f'oc start-build {name} --from-file={self.eNBSourceCodePath}', '\$', 300)
|
||||||
|
before = sshSession.getBefore()
|
||||||
|
regres = re.search(r'build.build.openshift.io/(?P<jobname>[a-zA-Z0-9\-]+) started', str(before))
|
||||||
|
if ret != 0 or before.count('Uploading finished') != 1 or regres is None:
|
||||||
|
logging.error("error during oc start-build: " + sshSession.getBefore())
|
||||||
|
self._delete_pod(sshSession, name)
|
||||||
|
return None
|
||||||
|
return regres.group('jobname') + '-build'
|
||||||
|
|
||||||
|
def _delete_pod(self, sshSession, shortName):
|
||||||
|
sshSession.command(f"oc get pods | grep {shortName}", '\$', 5)
|
||||||
|
regres = re.search(rf'{shortName}-[0-9]+-build', sshSession.getBefore())
|
||||||
|
if regres is not None:
|
||||||
|
sshSession.command(f"oc delete pod {regres.group(0)}", '\$', 5)
|
||||||
|
else:
|
||||||
|
logging.warning(f"no pod found with name {shortName}")
|
||||||
|
|
||||||
|
def _wait_build_end(self, sshSession, jobs, timeout_sec, check_interval_sec = 5):
|
||||||
|
logging.debug(f"waiting for jobs {jobs} to finish building")
|
||||||
|
while timeout_sec > 0:
|
||||||
|
# check status
|
||||||
|
for j in jobs:
|
||||||
|
sshSession.command(f'oc get pods | grep {j}', '\$', 10, silent = True)
|
||||||
|
if sshSession.getBefore().count('Completed') > 0: jobs.remove(j)
|
||||||
|
if sshSession.getBefore().count('Error') > 0:
|
||||||
|
logging.error(f'error for job {j}: ' + sshSession.getBefore())
|
||||||
|
return False
|
||||||
|
if jobs == []:
|
||||||
|
logging.debug('all jobs completed')
|
||||||
|
return True
|
||||||
|
time.sleep(check_interval_sec)
|
||||||
|
timeout_sec -= check_interval_sec
|
||||||
|
logging.error(f"timeout while waiting for end of build of {jobs}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _retag_image_statement(self, sshSession, oldImage, newImage, newTag, filename):
|
||||||
|
sshSession.command(f'sed -i -e "s#{oldImage}:latest#{newImage}:{newTag}#" {filename}', '\$', 5)
|
||||||
|
|
||||||
|
def _get_image_size(self, sshSession, image, tag):
|
||||||
|
# get the SHA of the image we built using the image name and its tag
|
||||||
|
sshSession.command(f'oc describe is {image} | grep -A4 {tag}', '\$', 5)
|
||||||
|
result = re.search(f'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/(?P<imageSha>{image}@sha256:[a-f0-9]+)', sshSession.getBefore())
|
||||||
|
if result is None:
|
||||||
|
return -1
|
||||||
|
imageSha = result.group("imageSha")
|
||||||
|
|
||||||
|
# retrieve the size
|
||||||
|
sshSession.command(f'oc get -o json isimage {imageSha} | jq -Mc "{{dockerImageSize: .image.dockerImageMetadata.Size}}"', '\$', 5)
|
||||||
|
result = re.search('{"dockerImageSize":(?P<size>[0-9]+)}', str(sshSession.getBefore()))
|
||||||
|
if result is None:
|
||||||
|
return -1
|
||||||
|
return int(result.group("size"))
|
||||||
|
|
||||||
|
def _deploy_pod(self, sshSession, filename, timeout = 30):
|
||||||
|
sshSession.command(f'oc create -f {filename}', '\$', 10)
|
||||||
|
result = re.search(f'pod/(?P<pod>[a-zA-Z0-9_\-]+) created', sshSession.getBefore())
|
||||||
|
if result is None:
|
||||||
|
logging.error(f'could not deploy pod: {sshSession.getBefore()}')
|
||||||
|
return None
|
||||||
|
pod = result.group("pod")
|
||||||
|
logging.debug(f'checking if pod {pod} is in Running state')
|
||||||
|
while timeout > 0:
|
||||||
|
sshSession.command(f'oc get pod {pod} -o json | jq -Mc .status.phase', '\$', 5, silent=True)
|
||||||
|
if re.search('"Running"', sshSession.getBefore()) is not None: return pod
|
||||||
|
timeout -= 1
|
||||||
|
time.sleep(1)
|
||||||
|
logging.error(f'pod {pod} did not reach Running state')
|
||||||
|
self._undeploy_pod(sshSession, filename)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _undeploy_pod(self, sshSession, filename):
|
||||||
|
# to save time we start this in the background and trust that oc stops correctly
|
||||||
|
sshSession.command(f'oc delete -f {filename} &', '\$', 5)
|
||||||
|
|
||||||
|
def BuildClusterImage(self, HTML):
|
||||||
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit(f'Insufficient Parameter: ranRepository {self.ranRepository} ranBranch {ranBranch} ranCommitID {self.ranCommitID}')
|
||||||
|
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
if lIpAddr == '' or lSourcePath == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter: no SSH Credentials')
|
||||||
|
ocUserName = self.OCUserName
|
||||||
|
ocPassword = self.OCPassword
|
||||||
|
ocProjectName = self.OCProjectName
|
||||||
|
if ocUserName == '' or ocPassword == '' or ocProjectName == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter: no OC Credentials')
|
||||||
|
if self.OCRegistry.startswith("http") and not self.OCRegistry.endswith("/"):
|
||||||
|
sys.exit(f'ocRegistry {self.OCRegistry} should not start with http:// or https:// and end on a slash /')
|
||||||
|
|
||||||
|
logging.debug(f'Building on cluster triggered from server: {lIpAddr}')
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(lIpAddr, "oaicicd", "SHOULD NOT BE NECESSARY")
|
||||||
|
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
|
||||||
|
# Workaround for some servers, we need to erase completely the workspace
|
||||||
|
if self.forcedWorkspaceCleanup:
|
||||||
|
mySSH.command(f'rm -Rf {lSourcePath}', '\$', 15)
|
||||||
|
cls_containerize.CreateWorkspace(mySSH, lSourcePath, self.ranRepository, self.ranCommitID, self.ranTargetBranch, self.ranAllowMerge)
|
||||||
|
|
||||||
|
# we don't necessarily need a forced workspace cleanup, but in
|
||||||
|
# order to reduce the amount of data send to OpenShift, we
|
||||||
|
# manually delete all generated files in the workspace
|
||||||
|
mySSH.command(f'rm -rf {lSourcePath}/cmake_targets/ran_build', '\$', 30);
|
||||||
|
|
||||||
|
baseTag = 'develop'
|
||||||
|
forceBaseImageBuild = False
|
||||||
|
imageTag = 'develop'
|
||||||
|
if self.ranAllowMerge: # merging MR branch into develop -> temporary image
|
||||||
|
imageTag = 'ci-temp'
|
||||||
|
if self.ranTargetBranch == 'develop':
|
||||||
|
mySSH.command(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base.rhel8.2 | grep --colour=never -i INDEX', '\$', 5)
|
||||||
|
result = re.search('index', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
forceBaseImageBuild = True
|
||||||
|
baseTag = 'ci-temp'
|
||||||
|
else:
|
||||||
|
forceBaseImageBuild = True
|
||||||
|
|
||||||
|
# logging to OC Cluster and then switch to corresponding project
|
||||||
|
mySSH.command(f'oc login -u {ocUserName} -p {ocPassword} --server {self.OCUrl}', '\$', 31)
|
||||||
|
if mySSH.getBefore().count('Login successful.') == 0:
|
||||||
|
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
||||||
|
mySSH.close()
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||||
|
return False
|
||||||
|
|
||||||
|
mySSH.command(f'oc project {ocProjectName}', '\$', 30)
|
||||||
|
if mySSH.getBefore().count(f'Already on project "{ocProjectName}"') == 0 and mySSH.getBefore().count(f'Now using project "{self.OCProjectName}"') == 0:
|
||||||
|
logging.error(f'\u001B[1mUnable to access OC project {ocProjectName}\u001B[0m')
|
||||||
|
mySSH.command('oc logout', '\$', 30)
|
||||||
|
mySSH.close()
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PROJECT_FAIL)
|
||||||
|
return False
|
||||||
|
|
||||||
|
self._recreate_entitlements(mySSH)
|
||||||
|
|
||||||
|
status = True # flag to abandon compiling if any image fails
|
||||||
|
attemptedImages = []
|
||||||
|
if forceBaseImageBuild:
|
||||||
|
self._recreate_is_tag(mySSH, 'ran-base', baseTag, 'openshift/ran-base-is.yaml')
|
||||||
|
self._recreate_bc(mySSH, 'ran-base', baseTag, 'openshift/ran-base-bc.yaml')
|
||||||
|
ranbase_job = self._start_build(mySSH, 'ran-base')
|
||||||
|
attemptedImages += ['ran-base']
|
||||||
|
status = ranbase_job is not None and self._wait_build_end(mySSH, [ranbase_job], 600)
|
||||||
|
if not status: logging.error('failure during build of ran-base')
|
||||||
|
mySSH.command(f'oc logs {ranbase_job} > cmake_targets/log/ran-base.log', '\$', 10)
|
||||||
|
# recover logs by mounting image
|
||||||
|
self._retag_image_statement(mySSH, 'ran-base', 'ran-base', baseTag, 'openshift/ran-base-log-retrieval.yaml')
|
||||||
|
pod = self._deploy_pod(mySSH, 'openshift/ran-base-log-retrieval.yaml')
|
||||||
|
if pod is not None:
|
||||||
|
mySSH.command(f'mkdir -p cmake_targets/log/ran-base', '\$', 5)
|
||||||
|
mySSH.command(f'oc rsync {pod}:/oai-ran/cmake_targets/log/ cmake_targets/log/ran-base', '\$', 5)
|
||||||
|
self._undeploy_pod(mySSH, 'openshift/ran-base-log-retrieval.yaml')
|
||||||
|
else:
|
||||||
|
status = False
|
||||||
|
|
||||||
|
if status:
|
||||||
|
self._recreate_is_tag(mySSH, 'oai-physim', imageTag, 'openshift/oai-physim-is.yaml')
|
||||||
|
self._recreate_bc(mySSH, 'oai-physim', imageTag, 'openshift/oai-physim-bc.yaml')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.phySim.rhel8.2')
|
||||||
|
physim_job = self._start_build(mySSH, 'oai-physim')
|
||||||
|
attemptedImages += ['oai-physim']
|
||||||
|
|
||||||
|
self._recreate_is_tag(mySSH, 'ran-build', imageTag, 'openshift/ran-build-is.yaml')
|
||||||
|
self._recreate_bc(mySSH, 'ran-build', imageTag, 'openshift/ran-build-bc.yaml')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.build.rhel8.2')
|
||||||
|
ranbuild_job = self._start_build(mySSH, 'ran-build')
|
||||||
|
attemptedImages += ['ran-build']
|
||||||
|
|
||||||
|
wait = ranbuild_job is not None and physim_job is not None and self._wait_build_end(mySSH, [ranbuild_job, physim_job], 1200)
|
||||||
|
if not wait: logging.error('error during build of ranbuild_job or physim_job')
|
||||||
|
status = status and wait
|
||||||
|
mySSH.command(f'oc logs {ranbuild_job} > cmake_targets/log/ran-build.log', '\$', 10)
|
||||||
|
mySSH.command(f'oc logs {physim_job} > cmake_targets/log/oai-physim.log', '\$', 10)
|
||||||
|
|
||||||
|
if status:
|
||||||
|
self._recreate_is_tag(mySSH, 'oai-enb', imageTag, 'openshift/oai-enb-is.yaml')
|
||||||
|
self._recreate_bc(mySSH, 'oai-enb', imageTag, 'openshift/oai-enb-bc.yaml')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.eNB.rhel8.2')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-build', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-build', imageTag, 'docker/Dockerfile.eNB.rhel8.2')
|
||||||
|
enb_job = self._start_build(mySSH, 'oai-enb')
|
||||||
|
attemptedImages += ['oai-enb']
|
||||||
|
|
||||||
|
self._recreate_is_tag(mySSH, 'oai-gnb', imageTag, 'openshift/oai-gnb-is.yaml')
|
||||||
|
self._recreate_bc(mySSH, 'oai-gnb', imageTag, 'openshift/oai-gnb-bc.yaml')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.gNB.rhel8.2')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-build', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-build', imageTag, 'docker/Dockerfile.gNB.rhel8.2')
|
||||||
|
gnb_job = self._start_build(mySSH, 'oai-gnb')
|
||||||
|
attemptedImages += ['oai-gnb']
|
||||||
|
|
||||||
|
self._recreate_is_tag(mySSH, 'oai-lte-ue', imageTag, 'openshift/oai-lte-ue-is.yaml')
|
||||||
|
self._recreate_bc(mySSH, 'oai-lte-ue', imageTag, 'openshift/oai-lte-ue-bc.yaml')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.lteUE.rhel8.2')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-build', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-build', imageTag, 'docker/Dockerfile.lteUE.rhel8.2')
|
||||||
|
lteue_job = self._start_build(mySSH, 'oai-lte-ue')
|
||||||
|
attemptedImages += ['oai-lte-ue']
|
||||||
|
|
||||||
|
self._recreate_is_tag(mySSH, 'oai-nr-ue', imageTag, 'openshift/oai-nr-ue-is.yaml')
|
||||||
|
self._recreate_bc(mySSH, 'oai-nr-ue', imageTag, 'openshift/oai-nr-ue-bc.yaml')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.nrUE.rhel8.2')
|
||||||
|
self._retag_image_statement(mySSH, 'ran-build', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-build', imageTag, 'docker/Dockerfile.nrUE.rhel8.2')
|
||||||
|
nrue_job = self._start_build(mySSH, 'oai-nr-ue')
|
||||||
|
attemptedImages += ['oai-nr-ue']
|
||||||
|
|
||||||
|
wait = enb_job is not None and gnb_job is not None and lteue_job is not None and nrue_job is not None and self._wait_build_end(mySSH, [enb_job, gnb_job, lteue_job, nrue_job], 600)
|
||||||
|
if not wait: logging.error('error during build of eNB/gNB/lteUE/nrUE')
|
||||||
|
status = status and wait
|
||||||
|
# recover logs
|
||||||
|
mySSH.command(f'oc logs {enb_job} > cmake_targets/log/oai-enb.log', '\$', 10)
|
||||||
|
mySSH.command(f'oc logs {gnb_job} > cmake_targets/log/oai-gnb.log', '\$', 10)
|
||||||
|
mySSH.command(f'oc logs {lteue_job} > cmake_targets/log/oai-lte-ue.log', '\$', 10)
|
||||||
|
mySSH.command(f'oc logs {nrue_job} > cmake_targets/log/oai-nr-ue.log', '\$', 10)
|
||||||
|
|
||||||
|
# split and analyze logs
|
||||||
|
imageSize = {}
|
||||||
|
for image in attemptedImages:
|
||||||
|
mySSH.command(f'mkdir -p cmake_targets/log/{image}', '\$', 5)
|
||||||
|
mySSH.command(f'python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/{image}.log', '\$', 5)
|
||||||
|
tag = imageTag if image != 'ran-base' else baseTag
|
||||||
|
size = self._get_image_size(mySSH, image, tag)
|
||||||
|
if size <= 0:
|
||||||
|
imageSize[image] = 'unknown -- BUILD FAILED'
|
||||||
|
status = False
|
||||||
|
else:
|
||||||
|
sizeMb = float(size) / 1000000
|
||||||
|
imageSize[image] = f'{sizeMb:.1f} Mbytes (uncompressed: ~{sizeMb*2.5:.1f} Mbytes)'
|
||||||
|
logging.info(f'\u001B[1m{image} size is {imageSize[image]}\u001B[0m')
|
||||||
|
|
||||||
|
grep_exp = "\|".join(attemptedImages)
|
||||||
|
mySSH.command(f'oc get images | grep -e \'{grep_exp}\' > cmake_targets/log/image_registry.log', '\$', 10);
|
||||||
|
|
||||||
|
build_log_name = f'build_log_{self.testCase_id}'
|
||||||
|
cls_containerize.CopyLogsToExecutor(mySSH, lSourcePath, build_log_name, lIpAddr, 'oaicicd', CONST.CI_NO_PASSWORD)
|
||||||
|
|
||||||
|
mySSH.command('for pod in $(oc get pods | tail -n +2 | awk \'{print $1}\'); do oc delete pod ${pod}; done', '\$', 60)
|
||||||
|
|
||||||
|
# logout will return eventually, but we don't care when -> start in background
|
||||||
|
mySSH.command('oc logout &', '\$', 5)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
# Analyze the logs
|
||||||
|
collectInfo = cls_containerize.AnalyzeBuildLogs(build_log_name, attemptedImages, status)
|
||||||
|
for img in collectInfo:
|
||||||
|
for f in collectInfo[img]:
|
||||||
|
status = status and collectInfo[img][f]['status']
|
||||||
|
if not status:
|
||||||
|
logging.debug(collectInfo)
|
||||||
|
|
||||||
|
if status:
|
||||||
|
logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow('all', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow('all', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, imageSize)
|
||||||
|
|
||||||
|
return status
|
||||||
+156
-167
@@ -48,6 +48,107 @@ import sshconnection as SSH
|
|||||||
import helpreadme as HELP
|
import helpreadme as HELP
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Helper functions used here and in other classes
|
||||||
|
# (e.g., cls_cluster.py)
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
def CreateWorkspace(sshSession, sourcePath, ranRepository, ranCommitID, ranTargetBranch, ranAllowMerge):
|
||||||
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', ranRepository)
|
||||||
|
if result is not None:
|
||||||
|
full_ran_repo_name = ranRepository.replace('git/', 'git')
|
||||||
|
else:
|
||||||
|
full_ran_repo_name = ranRepository + '.git'
|
||||||
|
sshSession.command('mkdir -p ' + sourcePath, '\$', 5)
|
||||||
|
sshSession.command('cd ' + sourcePath, '\$', 5)
|
||||||
|
sshSession.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
||||||
|
if sshSession.getBefore().count('done.') == 0:
|
||||||
|
logging.warning('did not find \'done.\' in git output while cloning/fetching, was not successful?')
|
||||||
|
sshSession.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
||||||
|
sshSession.command('git config user.name "OAI Jenkins"', '\$', 5)
|
||||||
|
|
||||||
|
sshSession.command('git clean -x -d -ff', '\$', 30)
|
||||||
|
sshSession.command('mkdir -p cmake_targets/log', '\$', 5)
|
||||||
|
# if the commit ID is provided use it to point to it
|
||||||
|
if ranCommitID != '':
|
||||||
|
sshSession.command('git checkout -f ' + ranCommitID, '\$', 30)
|
||||||
|
# if the branch is not develop, then it is a merge request and we need to do
|
||||||
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
|
if ranAllowMerge:
|
||||||
|
if ranTargetBranch == '':
|
||||||
|
sshSession.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
else:
|
||||||
|
logging.debug('Merging with the target branch: ' + ranTargetBranch)
|
||||||
|
sshSession.command('git merge --ff origin/' + ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
|
||||||
|
def CopyLogsToExecutor(sshSession, sourcePath, log_name, scpIp, scpUser, scpPw):
|
||||||
|
sshSession.command(f'cd {sourcePath}/cmake_targets', '\$', 5)
|
||||||
|
sshSession.command(f'rm -f {log_name}.zip', '\$', 5)
|
||||||
|
sshSession.command(f'mkdir -p {log_name}', '\$', 5)
|
||||||
|
sshSession.command(f'mv log/* {log_name}', '\$', 5)
|
||||||
|
sshSession.command(f'zip -r -qq {log_name}.zip {log_name}', '\$', 5)
|
||||||
|
|
||||||
|
# copy zip to executor for analysis
|
||||||
|
if (os.path.isfile(f'./{log_name}.zip')):
|
||||||
|
os.remove(f'./{log_name}.zip')
|
||||||
|
if (os.path.isdir(f'./{log_name}')):
|
||||||
|
shutil.rmtree(f'./{log_name}')
|
||||||
|
sshSession.copyin(scpIp, scpUser, scpPw, f'{sourcePath}/cmake_targets/{log_name}.zip', '.')
|
||||||
|
sshSession.command(f'rm -f {log_name}.zip','\$', 5)
|
||||||
|
ZipFile(f'{log_name}.zip').extractall('.')
|
||||||
|
|
||||||
|
def AnalyzeBuildLogs(buildRoot, images, globalStatus):
|
||||||
|
collectInfo = {}
|
||||||
|
for image in images:
|
||||||
|
files = {}
|
||||||
|
file_list = [f for f in os.listdir(f'{buildRoot}/{image}') if os.path.isfile(os.path.join(f'{buildRoot}/{image}', f)) and f.endswith('.txt')]
|
||||||
|
# Analyze the "sub-logs" of every target image
|
||||||
|
for fil in file_list:
|
||||||
|
errorandwarnings = {}
|
||||||
|
warningsNo = 0
|
||||||
|
errorsNo = 0
|
||||||
|
with open(f'{buildRoot}/{image}/{fil}', mode='r') as inputfile:
|
||||||
|
for line in inputfile:
|
||||||
|
result = re.search(' ERROR ', str(line))
|
||||||
|
if result is not None:
|
||||||
|
errorsNo += 1
|
||||||
|
result = re.search(' error:', str(line))
|
||||||
|
if result is not None:
|
||||||
|
errorsNo += 1
|
||||||
|
result = re.search(' WARNING ', str(line))
|
||||||
|
if result is not None:
|
||||||
|
warningsNo += 1
|
||||||
|
result = re.search(' warning:', str(line))
|
||||||
|
if result is not None:
|
||||||
|
warningsNo += 1
|
||||||
|
errorandwarnings['errors'] = errorsNo
|
||||||
|
errorandwarnings['warnings'] = warningsNo
|
||||||
|
errorandwarnings['status'] = globalStatus
|
||||||
|
files[fil] = errorandwarnings
|
||||||
|
# Analyze the target image
|
||||||
|
if os.path.isfile(f'{buildRoot}/{image}.log'):
|
||||||
|
errorandwarnings = {}
|
||||||
|
committed = False
|
||||||
|
tagged = False
|
||||||
|
with open(f'{buildRoot}/{image}.log', mode='r') as inputfile:
|
||||||
|
startOfTargetImageCreation = False # check for tagged/committed only after image created
|
||||||
|
for line in inputfile:
|
||||||
|
result = re.search(f'FROM .* [aA][sS] {image}$', str(line))
|
||||||
|
if result is not None:
|
||||||
|
startOfTargetImageCreation = True
|
||||||
|
if startOfTargetImageCreation:
|
||||||
|
lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None
|
||||||
|
tagged = tagged or lineHasTag
|
||||||
|
# the OpenShift Cluster builder prepends image registry URL
|
||||||
|
lineHasCommit = re.search(f'COMMIT [a-zA-Z0-9\.:/\-]*{image}', str(line)) is not None
|
||||||
|
committed = committed or lineHasCommit
|
||||||
|
errorandwarnings['errors'] = 0 if committed or tagged else 1
|
||||||
|
errorandwarnings['warnings'] = 0
|
||||||
|
errorandwarnings['status'] = committed or tagged
|
||||||
|
files['Target Image Creation'] = errorandwarnings
|
||||||
|
collectInfo[image] = files
|
||||||
|
return collectInfo
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Class Declaration
|
# Class Declaration
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -91,8 +192,6 @@ class Containerize():
|
|||||||
self.cliBuildOptions = ''
|
self.cliBuildOptions = ''
|
||||||
self.dockerfileprefix = ''
|
self.dockerfileprefix = ''
|
||||||
self.host = ''
|
self.host = ''
|
||||||
self.allImagesSize = {}
|
|
||||||
self.collectInfo = {}
|
|
||||||
|
|
||||||
self.deployedContainers = []
|
self.deployedContainers = []
|
||||||
self.tsharkStarted = False
|
self.tsharkStarted = False
|
||||||
@@ -115,35 +214,6 @@ class Containerize():
|
|||||||
# Container management functions
|
# Container management functions
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
def _createWorkspace(self, sshSession, password, sourcePath):
|
|
||||||
# on RedHat/CentOS .git extension is mandatory
|
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
|
||||||
if result is not None:
|
|
||||||
full_ran_repo_name = self.ranRepository.replace('git/', 'git')
|
|
||||||
else:
|
|
||||||
full_ran_repo_name = self.ranRepository + '.git'
|
|
||||||
sshSession.command('mkdir -p ' + sourcePath, '\$', 5)
|
|
||||||
sshSession.command('cd ' + sourcePath, '\$', 5)
|
|
||||||
sshSession.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
|
||||||
# Raphael: here add a check if git clone or git fetch went smoothly
|
|
||||||
sshSession.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
|
||||||
sshSession.command('git config user.name "OAI Jenkins"', '\$', 5)
|
|
||||||
|
|
||||||
sshSession.command('echo ' + password + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
|
||||||
sshSession.command('mkdir -p cmake_targets/log', '\$', 5)
|
|
||||||
# if the commit ID is provided use it to point to it
|
|
||||||
if self.ranCommitID != '':
|
|
||||||
sshSession.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
|
||||||
# if the branch is not develop, then it is a merge request and we need to do
|
|
||||||
# the potential merge. Note that merge conflicts should already been checked earlier
|
|
||||||
if (self.ranAllowMerge):
|
|
||||||
if self.ranTargetBranch == '':
|
|
||||||
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
|
||||||
sshSession.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
|
||||||
else:
|
|
||||||
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
|
||||||
sshSession.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
|
||||||
|
|
||||||
def BuildImage(self, HTML):
|
def BuildImage(self, HTML):
|
||||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -211,13 +281,14 @@ class Containerize():
|
|||||||
|
|
||||||
self.testCase_id = HTML.testCase_id
|
self.testCase_id = HTML.testCase_id
|
||||||
|
|
||||||
self._createWorkspace(mySSH, lPassWord, lSourcePath)
|
CreateWorkspace(mySSH, lSourcePath, self.ranRepository, self.ranCommitID, self.ranTargetBranch, self.ranAllowMerge)
|
||||||
|
|
||||||
# if asterix, copy the entitlement and subscription manager configurations
|
# if asterix, copy the entitlement and subscription manager configurations
|
||||||
if self.host == 'Red Hat':
|
if self.host == 'Red Hat':
|
||||||
mySSH.command('mkdir -p tmp/ca/ tmp/entitlement/', '\$', 5)
|
mySSH.command('mkdir -p ./etc-pki-entitlement ./rhsm-conf ./rhsm-ca', '\$', 5)
|
||||||
mySSH.command('sudo cp /etc/rhsm/ca/redhat-uep.pem tmp/ca/', '\$', 5)
|
mySSH.command('sudo cp /etc/rhsm/rhsm.conf ./rhsm-conf/', '\$', 5)
|
||||||
mySSH.command('sudo cp /etc/pki/entitlement/*.pem tmp/entitlement/', '\$', 5)
|
mySSH.command('sudo cp /etc/rhsm/ca/redhat-uep.pem ./rhsm-ca/', '\$', 5)
|
||||||
|
mySSH.command('sudo cp /etc/pki/entitlement/*.pem ./etc-pki-entitlement/', '\$', 5)
|
||||||
|
|
||||||
baseImage = 'ran-base'
|
baseImage = 'ran-base'
|
||||||
baseTag = 'develop'
|
baseTag = 'develop'
|
||||||
@@ -246,32 +317,10 @@ class Containerize():
|
|||||||
if forceBaseImageBuild:
|
if forceBaseImageBuild:
|
||||||
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + baseImage + ' --tag ' + baseImage + ':' + baseTag + ' --file docker/Dockerfile.base' + self.dockerfileprefix + ' . > cmake_targets/log/ran-base.log 2>&1', '\$', 1600)
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + baseImage + ' --tag ' + baseImage + ':' + baseTag + ' --file docker/Dockerfile.base' + self.dockerfileprefix + ' . > cmake_targets/log/ran-base.log 2>&1', '\$', 1600)
|
||||||
# First verify if the base image was properly created.
|
# First verify if the base image was properly created.
|
||||||
status = True
|
|
||||||
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + baseImage + ':' + baseTag, '\$', 5)
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + baseImage + ':' + baseTag, '\$', 5)
|
||||||
|
allImagesSize = {}
|
||||||
if mySSH.getBefore().count('o such image') != 0:
|
if mySSH.getBefore().count('o such image') != 0:
|
||||||
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
||||||
status = False
|
|
||||||
else:
|
|
||||||
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
|
||||||
if result is not None:
|
|
||||||
imageSize = float(result.group('size'))
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
if imageSize < 1000:
|
|
||||||
logging.debug('\u001B[1m ran-base size is ' + ('%.0f' % imageSize) + ' kbytes\u001B[0m')
|
|
||||||
self.allImagesSize['ran-base'] = str(round(imageSize,1)) + ' kbytes'
|
|
||||||
else:
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
if imageSize < 1000:
|
|
||||||
logging.debug('\u001B[1m ran-base size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
|
|
||||||
self.allImagesSize['ran-base'] = str(round(imageSize,1)) + ' Mbytes'
|
|
||||||
else:
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
logging.debug('\u001B[1m ran-base size is ' + ('%.3f' % imageSize) + ' Gbytes\u001B[0m')
|
|
||||||
self.allImagesSize['ran-base'] = str(round(imageSize,1)) + ' Gbytes'
|
|
||||||
else:
|
|
||||||
logging.debug('ran-base size is unknown')
|
|
||||||
# If the base image failed, no need to continue
|
|
||||||
if not status:
|
|
||||||
# Recover the name of the failed container?
|
# Recover the name of the failed container?
|
||||||
mySSH.command(self.cli + ' ps --quiet --filter "status=exited" -n1 | xargs ' + self.cli + ' rm -f', '\$', 5)
|
mySSH.command(self.cli + ' ps --quiet --filter "status=exited" -n1 | xargs ' + self.cli + ' rm -f', '\$', 5)
|
||||||
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
@@ -281,20 +330,32 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
# Recover build logs, for the moment only possible when build is successful
|
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
||||||
mySSH.command(self.cli + ' create --name test ' + baseImage + ':' + baseTag, '\$', 5)
|
if result is not None:
|
||||||
mySSH.command('mkdir -p cmake_targets/log/ran-base', '\$', 5)
|
size = float(result.group("size")) / 1000000
|
||||||
mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-base', '\$', 5)
|
imageSizeStr = f'{size:.1f}'
|
||||||
mySSH.command(self.cli + ' rm -f test', '\$', 5)
|
logging.debug(f'\u001B[1m ran-base size is {imageSizeStr} Mbytes\u001B[0m')
|
||||||
|
allImagesSize['ran-base'] = f'{imageSizeStr} Mbytes'
|
||||||
|
else:
|
||||||
|
logging.debug('ran-base size is unknown')
|
||||||
|
|
||||||
|
# Recover build logs, for the moment only possible when build is successful
|
||||||
|
mySSH.command(self.cli + ' create --name test ' + baseImage + ':' + baseTag, '\$', 5)
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log/ran-base', '\$', 5)
|
||||||
|
mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-base', '\$', 5)
|
||||||
|
mySSH.command(self.cli + ' rm -f test', '\$', 5)
|
||||||
|
|
||||||
# Build the target image(s)
|
# Build the target image(s)
|
||||||
|
status = True
|
||||||
|
attemptedImages = ['ran-base']
|
||||||
for image,pattern in imageNames:
|
for image,pattern in imageNames:
|
||||||
|
attemptedImages += [image]
|
||||||
# the archived Dockerfiles have "ran-base:latest" as base image
|
# the archived Dockerfiles have "ran-base:latest" as base image
|
||||||
# we need to update them with proper tag
|
# we need to update them with proper tag
|
||||||
mySSH.command('sed -i -e "s#' + baseImage + ':latest#' + baseImage + ':' + baseTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
mySSH.command(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}', '\$', 5)
|
||||||
if image != 'ran-build':
|
if image != 'ran-build':
|
||||||
mySSH.command('sed -i -e "s#' + "ran-build" + ':latest#' + "ran-build" + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
mySSH.command(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}', '\$', 5)
|
||||||
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
mySSH.command(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {image}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} . > cmake_targets/log/{image}.log 2>&1', '\$', 1200)
|
||||||
# Flatten Image
|
# Flatten Image
|
||||||
if image != 'ran-build':
|
if image != 'ran-build':
|
||||||
mySSH.command('python3 ./ci-scripts/flatten_image.py --tag ' + image + ':' + imageTag, '\$', 300)
|
mySSH.command('python3 ./ci-scripts/flatten_image.py --tag ' + image + ':' + imageTag, '\$', 300)
|
||||||
@@ -308,117 +369,43 @@ class Containerize():
|
|||||||
status = False
|
status = False
|
||||||
# Here we should check if the last container corresponds to a failed command and destroy it
|
# Here we should check if the last container corresponds to a failed command and destroy it
|
||||||
mySSH.command(self.cli + ' ps --quiet --filter "status=exited" -n1 | xargs ' + self.cli + ' rm -f', '\$', 5)
|
mySSH.command(self.cli + ' ps --quiet --filter "status=exited" -n1 | xargs ' + self.cli + ' rm -f', '\$', 5)
|
||||||
self.allImagesSize[image] = 'N/A -- Build Failed'
|
allImagesSize[image] = 'N/A -- Build Failed'
|
||||||
|
break
|
||||||
else:
|
else:
|
||||||
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
imageSize = float(result.group('size'))
|
size = float(result.group("size")) / 1000000
|
||||||
imageSize = imageSize / 1000
|
imageSizeStr = f'{size:.1f}'
|
||||||
if imageSize < 1000:
|
logging.debug(f'\u001B[1m {image} size is {imageSizeStr} Mbytes\u001B[0m')
|
||||||
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.0f' % imageSize) + ' kbytes\u001B[0m')
|
allImagesSize[image] = f'{imageSizeStr} Mbytes'
|
||||||
self.allImagesSize[image] = str(round(imageSize,1)) + ' kbytes'
|
|
||||||
else:
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
if imageSize < 1000:
|
|
||||||
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
|
|
||||||
self.allImagesSize[image] = str(round(imageSize,1)) + ' Mbytes'
|
|
||||||
else:
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.3f' % imageSize) + ' Gbytes\u001B[0m')
|
|
||||||
self.allImagesSize[image] = str(round(imageSize,1)) + ' Gbytes'
|
|
||||||
else:
|
else:
|
||||||
logging.debug('ran-base size is unknown')
|
logging.debug(f'{image} size is unknown')
|
||||||
self.allImagesSize[image] = 'unknown'
|
allImagesSize[image] = 'unknown'
|
||||||
# Now pruning dangling images in between target builds
|
# Now pruning dangling images in between target builds
|
||||||
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
|
|
||||||
# Analyzing the logs
|
# Remove all intermediate build images and clean up
|
||||||
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
|
||||||
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
|
|
||||||
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
|
|
||||||
|
|
||||||
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
|
||||||
mySSH.command('rm -f build_log_' + self.testCase_id + '.zip || true', '\$', 5)
|
|
||||||
if (os.path.isfile('./build_log_' + self.testCase_id + '.zip')):
|
|
||||||
os.remove('./build_log_' + self.testCase_id + '.zip')
|
|
||||||
if (os.path.isdir('./build_log_' + self.testCase_id)):
|
|
||||||
shutil.rmtree('./build_log_' + self.testCase_id)
|
|
||||||
mySSH.command('zip -r -qq build_log_' + self.testCase_id + '.zip build_log_' + self.testCase_id, '\$', 5)
|
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
|
|
||||||
mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
|
|
||||||
# Remove all intermediate build images
|
|
||||||
if self.ranAllowMerge and forceBaseImageBuild:
|
if self.ranAllowMerge and forceBaseImageBuild:
|
||||||
mySSH.command(self.cli + ' image rm ' + baseImage + ':' + baseTag + ' || true', '\$', 30)
|
mySSH.command(f'{self.cli} image rm {baseImage}:{baseTag} || true', '\$', 30)
|
||||||
mySSH.command(self.cli + ' image rm ran-build:' + imageTag + ' || true','\$', 30)
|
mySSH.command(f'{self.cli} image rm ran-build:{imageTag}','\$', 30)
|
||||||
# Cleaning any created tmp volume
|
mySSH.command(f'{self.cli} volume prune --force','\$', 15)
|
||||||
mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
|
|
||||||
mySSH.close()
|
|
||||||
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
|
|
||||||
|
|
||||||
#Trying to identify the errors and warnings for each built images
|
# create a zip with all logs
|
||||||
imageNames1 = imageNames
|
build_log_name = f'build_log_{self.testCase_id}'
|
||||||
base = ('ran-base','ran')
|
CopyLogsToExecutor(mySSH, lSourcePath, build_log_name, lIpAddr, lUserName, lPassWord)
|
||||||
imageNames1.insert(0, base)
|
mySSH.close()
|
||||||
for image,pattern in imageNames1:
|
|
||||||
files = {}
|
# Analyze the logs
|
||||||
file_list = [f for f in os.listdir('build_log_' + self.testCase_id + '/' + image) if os.path.isfile(os.path.join('build_log_' + self.testCase_id + '/' + image, f)) and f.endswith('.txt')]
|
collectInfo = AnalyzeBuildLogs(build_log_name, attemptedImages, status)
|
||||||
for fil in file_list:
|
|
||||||
errorandwarnings = {}
|
|
||||||
warningsNo = 0
|
|
||||||
errorsNo = 0
|
|
||||||
with open('build_log_{}/{}/{}'.format(self.testCase_id,image,fil), mode='r') as inputfile:
|
|
||||||
for line in inputfile:
|
|
||||||
result = re.search(' ERROR ', str(line))
|
|
||||||
if result is not None:
|
|
||||||
errorsNo += 1
|
|
||||||
result = re.search(' error:', str(line))
|
|
||||||
if result is not None:
|
|
||||||
errorsNo += 1
|
|
||||||
result = re.search(' WARNING ', str(line))
|
|
||||||
if result is not None:
|
|
||||||
warningsNo += 1
|
|
||||||
result = re.search(' warning:', str(line))
|
|
||||||
if result is not None:
|
|
||||||
warningsNo += 1
|
|
||||||
errorandwarnings['errors'] = errorsNo
|
|
||||||
errorandwarnings['warnings'] = warningsNo
|
|
||||||
errorandwarnings['status'] = status
|
|
||||||
files[fil] = errorandwarnings
|
|
||||||
# Let analyze the target image creation part
|
|
||||||
if os.path.isfile('build_log_{}/{}.log'.format(self.testCase_id,image)):
|
|
||||||
errorandwarnings = {}
|
|
||||||
with open('build_log_{}/{}.log'.format(self.testCase_id,image), mode='r') as inputfile:
|
|
||||||
startOfTargetImageCreation = False
|
|
||||||
buildStatus = False
|
|
||||||
for line in inputfile:
|
|
||||||
result = re.search('FROM .* [aA][sS] ' + image + '$', str(line))
|
|
||||||
if result is not None:
|
|
||||||
startOfTargetImageCreation = True
|
|
||||||
if startOfTargetImageCreation:
|
|
||||||
result = re.search('Successfully tagged ' + image + ':', str(line))
|
|
||||||
if result is not None:
|
|
||||||
buildStatus = True
|
|
||||||
result = re.search('COMMIT ' + image + ':', str(line))
|
|
||||||
if result is not None:
|
|
||||||
buildStatus = True
|
|
||||||
inputfile.close()
|
|
||||||
if buildStatus:
|
|
||||||
errorandwarnings['errors'] = 0
|
|
||||||
else:
|
|
||||||
errorandwarnings['errors'] = 1
|
|
||||||
errorandwarnings['warnings'] = 0
|
|
||||||
errorandwarnings['status'] = buildStatus
|
|
||||||
files['Target Image Creation'] = errorandwarnings
|
|
||||||
self.collectInfo[image] = files
|
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
|
logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, allImagesSize)
|
||||||
else:
|
else:
|
||||||
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, allImagesSize)
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
@@ -473,7 +460,7 @@ class Containerize():
|
|||||||
self.ranCommitID = self.proxyCommit
|
self.ranCommitID = self.proxyCommit
|
||||||
self.ranRepository = 'https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git'
|
self.ranRepository = 'https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git'
|
||||||
self.ranAllowMerge = False
|
self.ranAllowMerge = False
|
||||||
self._createWorkspace(mySSH, lPassWord, lSourcePath)
|
CreateWorkspace(mySSH, lSourcePath, self.ranRepository, self.ranCommitID, self.ranTargetBranch, self.ranAllowMerge)
|
||||||
# to prevent accidentally overwriting data that might be used later
|
# to prevent accidentally overwriting data that might be used later
|
||||||
self.ranCommitID = oldRanCommidID
|
self.ranCommitID = oldRanCommidID
|
||||||
self.ranRepository = oldRanRepository
|
self.ranRepository = oldRanRepository
|
||||||
@@ -540,16 +527,18 @@ class Containerize():
|
|||||||
errorandwarnings['warnings'] = 0
|
errorandwarnings['warnings'] = 0
|
||||||
errorandwarnings['status'] = True
|
errorandwarnings['status'] = True
|
||||||
files['Target Image Creation'] = errorandwarnings
|
files['Target Image Creation'] = errorandwarnings
|
||||||
self.collectInfo['proxy'] = files
|
collectInfo = {}
|
||||||
|
collectInfo['proxy'] = files
|
||||||
mySSH.command('docker image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
|
mySSH.command('docker image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
|
||||||
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
||||||
|
allImagesSize = {}
|
||||||
if result is not None:
|
if result is not None:
|
||||||
imageSize = float(result.group('size')) / 1000000
|
imageSize = float(result.group('size')) / 1000000
|
||||||
logging.debug('\u001B[1m proxy size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
|
logging.debug('\u001B[1m proxy size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
|
||||||
self.allImagesSize['proxy'] = str(round(imageSize,1)) + ' Mbytes'
|
allImagesSize['proxy'] = str(round(imageSize,1)) + ' Mbytes'
|
||||||
else:
|
else:
|
||||||
logging.debug('proxy size is unknown')
|
logging.debug('proxy size is unknown')
|
||||||
self.allImagesSize['proxy'] = 'unknown'
|
allImagesSize['proxy'] = 'unknown'
|
||||||
|
|
||||||
# Cleaning any created tmp volume
|
# Cleaning any created tmp volume
|
||||||
mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
|
mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
|
||||||
@@ -557,7 +546,7 @@ class Containerize():
|
|||||||
|
|
||||||
logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m')
|
logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m')
|
||||||
HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, allImagesSize)
|
||||||
|
|
||||||
def Copy_Image_to_Test_Server(self, HTML):
|
def Copy_Image_to_Test_Server(self, HTML):
|
||||||
imageTag = 'develop'
|
imageTag = 'develop'
|
||||||
@@ -652,7 +641,7 @@ class Containerize():
|
|||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
|
||||||
self._createWorkspace(mySSH, lPassWord, lSourcePath)
|
CreateWorkspace(mySSH, lSourcePath, self.ranRepository, self.ranCommitID, self.ranTargetBranch, self.ranAllowMerge)
|
||||||
|
|
||||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||||
mySSH.command('cp docker-compose.yml ci-docker-compose.yml', '\$', 5)
|
mySSH.command('cp docker-compose.yml ci-docker-compose.yml', '\$', 5)
|
||||||
|
|||||||
@@ -453,13 +453,11 @@ class HTMLManagement():
|
|||||||
self.htmlFile.write(' <td bgcolor = "red" >' + str(parameters['warnings']) + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "red" >' + str(parameters['warnings']) + '</td>\n')
|
||||||
elif (parameters['warnings'] == 0):
|
elif (parameters['warnings'] == 0):
|
||||||
self.htmlFile.write(' <td bgcolor = "green" >' + str(parameters['warnings']) + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "green" >' + str(parameters['warnings']) + '</td>\n')
|
||||||
elif ((parameters['warnings'] > 0) and (parameters['warnings'] <= 20)):
|
|
||||||
self.htmlFile.write(' <td bgcolor = "orange" >' + str(parameters['warnings']) + '</td>\n')
|
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <td bgcolor = "red" >' + str(parameters['warnings']) + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "orange" >' + str(parameters['warnings']) + '</td>\n')
|
||||||
if (parameters['errors'] == 0) and (parameters['warnings'] == 0):
|
if (parameters['errors'] == 0) and (parameters['warnings'] == 0):
|
||||||
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "green" ><font color="white">OK </font></th>\n')
|
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "green" ><font color="white">OK </font></th>\n')
|
||||||
elif (parameters['errors'] == 0) and ((parameters['warnings'] > 0) and (parameters['warnings'] <= 20)):
|
elif (parameters['errors'] == 0):
|
||||||
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "orange" ><font color="white">OK </font></th>\n')
|
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "orange" ><font color="white">OK </font></th>\n')
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "red" > NOT OK </th>\n')
|
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "red" > NOT OK </th>\n')
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ class PhySim:
|
|||||||
full_ran_repo_name = self.ranRepository.replace('git/', 'git')
|
full_ran_repo_name = self.ranRepository.replace('git/', 'git')
|
||||||
else:
|
else:
|
||||||
full_ran_repo_name = self.ranRepository + '.git'
|
full_ran_repo_name = self.ranRepository + '.git'
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo rm -Rf ' + lSourcePath, '\$', 30)
|
mySSH.command('rm -Rf ' + lSourcePath, '\$', 30)
|
||||||
mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
|
mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
|
||||||
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||||
mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
||||||
@@ -100,7 +100,7 @@ class PhySim:
|
|||||||
mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
||||||
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
||||||
|
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
mySSH.command('git clean -x -d -ff', '\$', 30)
|
||||||
mySSH.command('mkdir -p cmake_targets/log', '\$', 5)
|
mySSH.command('mkdir -p cmake_targets/log', '\$', 5)
|
||||||
# if the commit ID is provided use it to point to it
|
# if the commit ID is provided use it to point to it
|
||||||
if self.ranCommitID != '':
|
if self.ranCommitID != '':
|
||||||
@@ -115,30 +115,6 @@ class PhySim:
|
|||||||
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
||||||
else:
|
else:
|
||||||
imageTag = "develop"
|
imageTag = "develop"
|
||||||
# Check if image is exist on the Red Hat server, before pushing it to OC cluster
|
|
||||||
mySSH.command('sudo podman image inspect --format="Size = {{.Size}} bytes" oai-physim:' + imageTag, '\$', 60)
|
|
||||||
if mySSH.getBefore().count('no such image') != 0:
|
|
||||||
logging.error('\u001B[1m No such image oai-physim\u001B[0m')
|
|
||||||
mySSH.close()
|
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.PHYSIM_IMAGE_ABSENT)
|
|
||||||
RAN.prematureExit = True
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
|
||||||
if result is not None:
|
|
||||||
imageSize = float(result.group('size'))
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
if imageSize < 1000:
|
|
||||||
logging.debug('\u001B[1m oai-physim size is ' + ('%.0f' % imageSize) + ' kbytes\u001B[0m')
|
|
||||||
else:
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
if imageSize < 1000:
|
|
||||||
logging.debug('\u001B[1m oai-physim size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
|
|
||||||
else:
|
|
||||||
imageSize = imageSize / 1000
|
|
||||||
logging.debug('\u001B[1m oai-physim is ' + ('%.3f' % imageSize) + ' Gbytes\u001B[0m')
|
|
||||||
else:
|
|
||||||
logging.debug('oai-physim size is unknown')
|
|
||||||
|
|
||||||
# logging to OC Cluster and then switch to corresponding project
|
# logging to OC Cluster and then switch to corresponding project
|
||||||
mySSH.command(f'oc login -u {ocUserName} -p {ocPassword} --server https://api.oai.cs.eurecom.fr:6443', '\$', 30)
|
mySSH.command(f'oc login -u {ocUserName} -p {ocPassword} --server https://api.oai.cs.eurecom.fr:6443', '\$', 30)
|
||||||
@@ -161,46 +137,7 @@ class PhySim:
|
|||||||
else:
|
else:
|
||||||
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
||||||
|
|
||||||
# Tag the image and push to the OC cluster
|
|
||||||
mySSH.command('oc whoami -t | sudo podman login -u ' + ocUserName + ' --password-stdin https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/ --tls-verify=false', '\$', 30)
|
|
||||||
if mySSH.getBefore().count('Login Succeeded!') == 0:
|
|
||||||
logging.error('\u001B[1m Podman Login to OC Cluster Registry Failed\u001B[0m')
|
|
||||||
mySSH.command('oc logout', '\$', 30)
|
|
||||||
mySSH.close()
|
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
|
||||||
RAN.prematureExit = True
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
logging.debug('\u001B[1m Podman Login to OC Cluster Registry Successfully\u001B[0m')
|
|
||||||
time.sleep(2)
|
|
||||||
mySSH.command('oc create -f openshift/oai-physim-image-stream.yml || true', '\$', 30)
|
|
||||||
if mySSH.getBefore().count('(AlreadyExists):') == 0 and mySSH.getBefore().count('created') == 0:
|
|
||||||
logging.error(f'\u001B[1m Image Stream "oai-physim" Creation Failed on OC Cluster {ocProjectName}\u001B[0m')
|
|
||||||
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
|
||||||
mySSH.command('oc logout', '\$', 30)
|
|
||||||
mySSH.close()
|
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
|
||||||
RAN.prematureExit = True
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
logging.debug(f'\u001B[1m Image Stream "oai-physim" created on OC project {ocProjectName}\u001B[0m')
|
|
||||||
time.sleep(2)
|
|
||||||
mySSH.command(f'sudo podman tag oai-physim:{imageTag} default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 30)
|
|
||||||
time.sleep(2)
|
|
||||||
mySSH.command(f'sudo podman push default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag} --tls-verify=false', '\$', 180)
|
|
||||||
if mySSH.getBefore().count('Storing signatures') == 0:
|
|
||||||
logging.error('\u001B[1m Image "oai-physim" push to OC Cluster Registry Failed\u001B[0m')
|
|
||||||
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
|
||||||
mySSH.command('oc logout', '\$', 30)
|
|
||||||
mySSH.close()
|
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
|
||||||
RAN.prematureExit = True
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
logging.debug('\u001B[1m Image "oai-physim" push to OC Cluster Registry Successfully\u001B[0m')
|
|
||||||
|
|
||||||
# Using helm charts deployment
|
# Using helm charts deployment
|
||||||
time.sleep(5)
|
|
||||||
mySSH.command(f'grep -rl OAICICD_PROJECT ./charts/ | xargs sed -i -e "s#OAICICD_PROJECT#{ocProjectName}#"', '\$', 30)
|
mySSH.command(f'grep -rl OAICICD_PROJECT ./charts/ | xargs sed -i -e "s#OAICICD_PROJECT#{ocProjectName}#"', '\$', 30)
|
||||||
mySSH.command(f'sed -i -e "s#TAG#{imageTag}#g" ./charts/physims/values.yaml', '\$', 6)
|
mySSH.command(f'sed -i -e "s#TAG#{imageTag}#g" ./charts/physims/values.yaml', '\$', 6)
|
||||||
mySSH.command('helm install physim ./charts/physims/ 2>&1 | tee -a cmake_targets/log/physim_helm_summary.txt', '\$', 30)
|
mySSH.command('helm install physim ./charts/physims/ 2>&1 | tee -a cmake_targets/log/physim_helm_summary.txt', '\$', 30)
|
||||||
@@ -213,9 +150,6 @@ class PhySim:
|
|||||||
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
||||||
if re.search('No resources found', mySSH.getBefore()):
|
if re.search('No resources found', mySSH.getBefore()):
|
||||||
isFinished1 = True
|
isFinished1 = True
|
||||||
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 30)
|
|
||||||
mySSH.command('oc delete is oai-physim', '\$', 30)
|
|
||||||
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
|
||||||
mySSH.command('oc logout', '\$', 30)
|
mySSH.command('oc logout', '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
@@ -244,9 +178,6 @@ class PhySim:
|
|||||||
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
||||||
if re.search('No resources found', mySSH.getBefore()):
|
if re.search('No resources found', mySSH.getBefore()):
|
||||||
isFinished1 = True
|
isFinished1 = True
|
||||||
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
|
||||||
mySSH.command('oc delete is oai-physim', '\$', 6)
|
|
||||||
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
|
||||||
mySSH.command('oc logout', '\$', 30)
|
mySSH.command('oc logout', '\$', 30)
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PHYSIM_DEPLOY_FAIL)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PHYSIM_DEPLOY_FAIL)
|
||||||
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
||||||
@@ -304,10 +235,6 @@ class PhySim:
|
|||||||
isFinished1 = True
|
isFinished1 = True
|
||||||
if isFinished1 == True:
|
if isFinished1 == True:
|
||||||
logging.debug('\u001B[1m UnDeployed PhySim Successfully on OC Cluster\u001B[0m')
|
logging.debug('\u001B[1m UnDeployed PhySim Successfully on OC Cluster\u001B[0m')
|
||||||
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
|
||||||
mySSH.command('oc delete is oai-physim', '\$', 6)
|
|
||||||
logging.debug('\u001B[1m Deleted the Image and ImageStream\u001B[0m')
|
|
||||||
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
|
||||||
mySSH.command('oc logout', '\$', 6)
|
mySSH.command('oc logout', '\$', 6)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
|
|||||||
@@ -11,22 +11,7 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 40960;
|
tracking_area_code = 40960;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 95; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 95;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x1; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
|||||||
@@ -11,22 +11,7 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x1; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
|||||||
@@ -15,22 +15,7 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|||||||
@@ -14,22 +14,7 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|||||||
@@ -15,21 +15,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -16,21 +16,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -15,25 +15,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0x010203 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 97;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x1; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 97;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0x010203 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 97;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 97;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0x010203 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 97;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x010203; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -11,22 +11,7 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 95; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 95;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x1; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 2;
|
|
||||||
sd = 2; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
|||||||
@@ -11,18 +11,7 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 222; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||||
mcc = 222;
|
|
||||||
mnc = 01;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
#sd = 0x1; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
|||||||
@@ -11,22 +11,7 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x1; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
|||||||
@@ -4,5 +4,4 @@ uicc0 = {
|
|||||||
opc= "@OPC@";
|
opc= "@OPC@";
|
||||||
dnn= "@DNN@";
|
dnn= "@DNN@";
|
||||||
nssai_sst=@NSSAI_SST@;
|
nssai_sst=@NSSAI_SST@;
|
||||||
nssai_sd=@NSSAI_SD@;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,3 +79,7 @@ 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
|
||||||
|
|
||||||
|
# placeholder for a "don't care" password to gradually transition to
|
||||||
|
# passwordless CI
|
||||||
|
CI_NO_PASSWORD = "CIPASSWORDDONTCARE"
|
||||||
|
|||||||
+14
-12
@@ -45,6 +45,7 @@ import cls_containerize #class Containerize for all container-based oper
|
|||||||
import cls_static_code_analysis #class for static code analysis
|
import cls_static_code_analysis #class for static code analysis
|
||||||
import cls_ci_ueinfra #class defining the multi Ue infrastrucure
|
import cls_ci_ueinfra #class defining the multi Ue infrastrucure
|
||||||
import cls_physim1 #class PhySim for physical simulators deploy and run
|
import cls_physim1 #class PhySim for physical simulators deploy and run
|
||||||
|
import cls_cluster # class for building/deploying on cluster
|
||||||
|
|
||||||
import sshconnection
|
import sshconnection
|
||||||
import epc
|
import epc
|
||||||
@@ -102,20 +103,17 @@ def AssignParams(params_dict):
|
|||||||
|
|
||||||
|
|
||||||
def GetParametersFromXML(action):
|
def GetParametersFromXML(action):
|
||||||
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy':
|
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image":
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
CONTAINERS.imageKind=test.findtext('kind')
|
CONTAINERS.imageKind=test.findtext('kind')
|
||||||
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
||||||
if (forced_workspace_cleanup is None):
|
RAN.Build_eNB_forced_workspace_cleanup=False
|
||||||
RAN.Build_eNB_forced_workspace_cleanup=False
|
CONTAINERS.forcedWorkspaceCleanup=False
|
||||||
CONTAINERS.forcedWorkspaceCleanup=False
|
CLUSTER.forcedWorkspaceCleanup = False
|
||||||
else:
|
if forced_workspace_cleanup is not None and re.match('true', forced_workspace_cleanup, re.IGNORECASE):
|
||||||
if re.match('true', forced_workspace_cleanup, re.IGNORECASE):
|
RAN.Build_eNB_forced_workspace_cleanup = True
|
||||||
RAN.Build_eNB_forced_workspace_cleanup=True
|
CONTAINERS.forcedWorkspaceCleanup = True
|
||||||
CONTAINERS.forcedWorkspaceCleanup=True
|
CLUSTER.forcedWorkspaceCleanup = True
|
||||||
else:
|
|
||||||
RAN.Build_eNB_forced_workspace_cleanup=True
|
|
||||||
CONTAINERS.forcedWorkspaceCleanup=False
|
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
@@ -534,6 +532,7 @@ HTML = cls_oai_html.HTMLManagement()
|
|||||||
CONTAINERS = cls_containerize.Containerize()
|
CONTAINERS = cls_containerize.Containerize()
|
||||||
SCA = cls_static_code_analysis.StaticCodeAnalysis()
|
SCA = cls_static_code_analysis.StaticCodeAnalysis()
|
||||||
PHYSIM = cls_physim1.PhySim()
|
PHYSIM = cls_physim1.PhySim()
|
||||||
|
CLUSTER = cls_cluster.Cluster()
|
||||||
|
|
||||||
ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build
|
ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build
|
||||||
|
|
||||||
@@ -543,7 +542,7 @@ ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU b
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
import args_parse
|
import args_parse
|
||||||
py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM)
|
py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM,CLUSTER)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -931,6 +930,9 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML=ldpc.Run_NRulsimTest(HTML,CONST,id)
|
HTML=ldpc.Run_NRulsimTest(HTML,CONST,id)
|
||||||
if ldpc.exitStatus==1:
|
if ldpc.exitStatus==1:
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
|
elif action == 'Build_Cluster_Image':
|
||||||
|
if not CLUSTER.BuildClusterImage(HTML):
|
||||||
|
RAN.prematureExit = True
|
||||||
elif action == 'Build_Image':
|
elif action == 'Build_Image':
|
||||||
CONTAINERS.BuildImage(HTML)
|
CONTAINERS.BuildImage(HTML)
|
||||||
elif action == 'Build_Proxy':
|
elif action == 'Build_Proxy':
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
- Build_Proxy
|
- Build_Proxy
|
||||||
|
- Build_Cluster_Image
|
||||||
- Build_PhySim
|
- Build_PhySim
|
||||||
- Run_LDPCTest
|
- Run_LDPCTest
|
||||||
- Run_NRulsimTest
|
- Run_NRulsimTest
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
||||||
<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
|
<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>3</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
||||||
<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
|
<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>3</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build Images on Cluster</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>000001</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>Build_Cluster_Image</class>
|
||||||
|
<desc>Build Images on OpenShift Cluster</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>l2sim-4glte-tdd</htmlTabRef>
|
<htmlTabRef>l2sim-4glte-tdd</htmlTabRef>
|
||||||
<htmlTabName>Testing 4G LTE L2 sim - FDD eNB</htmlTabName>
|
<htmlTabName>Testing 4G LTE L2 sim - FDD eNB</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100001
|
100001
|
||||||
000000
|
000000
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>rfsim-4glte-tdd05mhz</htmlTabRef>
|
<htmlTabRef>rfsim-4glte-tdd05mhz</htmlTabRef>
|
||||||
<htmlTabName>Monolithic eNB - TDD 05MHz</htmlTabName>
|
<htmlTabName>Monolithic eNB - TDD 05MHz</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100011
|
100011
|
||||||
000011
|
000011
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>rfsim-5gnr-fdd</htmlTabRef>
|
<htmlTabRef>rfsim-5gnr-fdd</htmlTabRef>
|
||||||
<htmlTabName>Monolithic FDD gNB with SDAP</htmlTabName>
|
<htmlTabName>Monolithic FDD gNB with SDAP</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100011
|
100011
|
||||||
000010
|
000010
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>l2sim-5gnr-tdd</htmlTabRef>
|
<htmlTabRef>l2sim-5gnr-tdd</htmlTabRef>
|
||||||
<htmlTabName>Testing 5G NR L2 sim - TDD gNB</htmlTabName>
|
<htmlTabName>Testing 5G NR L2 sim - TDD gNB</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100001
|
100001
|
||||||
000000
|
000000
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>rfsim-5gnr-tdd</htmlTabRef>
|
<htmlTabRef>rfsim-5gnr-tdd</htmlTabRef>
|
||||||
<htmlTabName>Monolithic TDD gNB</htmlTabName>
|
<htmlTabName>Monolithic TDD gNB</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100001
|
100001
|
||||||
000000
|
000000
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1</htmlTabRef>
|
<htmlTabRef>test-05-tm1</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM1</htmlTabName>
|
<htmlTabName>Test-05MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-nos1-tunnel</htmlTabRef>
|
<htmlTabRef>test-05-tm1-nos1-tunnel</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM1-noS1-tunnel</htmlTabName>
|
<htmlTabName>Test-05MHz-TM1-noS1-tunnel</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 090109
|
030201 090109
|
||||||
030101 000001 090101 000002 040501 040502 000001 040601 040602 040641 040642 000001 090109 030201
|
030101 000001 090101 000002 040501 040502 000001 040601 040602 040641 040642 000001 090109 030201
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-fembms-nos1-tunnel</htmlTabRef>
|
<htmlTabRef>test-05-tm1-fembms-nos1-tunnel</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-FEMBMS-TM1-noS1-tunnel</htmlTabName>
|
<htmlTabName>Test-05MHz-FEMBMS-TM1-noS1-tunnel</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 090109
|
030201 090109
|
||||||
030104 000001 090104 000002 040605 000001 090109 030201
|
030104 000001 090104 000002 040605 000001 090109 030201
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-mbms-nos1-tunnel</htmlTabRef>
|
<htmlTabRef>test-05-tm1-mbms-nos1-tunnel</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-MBMS-TM1-noS1-tunnel</htmlTabName>
|
<htmlTabName>Test-05MHz-MBMS-TM1-noS1-tunnel</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 090109
|
030201 090109
|
||||||
030103 000001 090103 000002 040605 000001 090109 030201
|
030103 000001 090103 000002 040605 000001 090109 030201
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-tunnel</htmlTabRef>
|
<htmlTabRef>test-05-tm1-tunnel</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM1-tunnel</htmlTabName>
|
<htmlTabName>Test-05MHz-TM1-tunnel</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 090109
|
030201 090109
|
||||||
030102 000001 090102 000002 040503 000001 040603 040604 040643 040644 000001 090109 030201
|
030102 000001 090102 000002 040503 000001 040603 040604 040643 040644 000001 090109 030201
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<htmlTabRef>test-05-tm2</htmlTabRef>
|
<htmlTabRef>test-05-tm2</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM2</htmlTabName>
|
<htmlTabName>Test-05MHz-TM2</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestUnstable>True</TestUnstable>
|
<TestUnstable>True</TestUnstable>
|
||||||
<TestMinId>040608</TestMinId>
|
<TestMinId>040608</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-20-tm1</htmlTabRef>
|
<htmlTabRef>test-20-tm1</htmlTabRef>
|
||||||
<htmlTabName>Test-20MHz-TM1</htmlTabName>
|
<htmlTabName>Test-20MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestUnstable>True</TestUnstable>
|
<TestUnstable>True</TestUnstable>
|
||||||
<TestMinId>040623</TestMinId>
|
<TestMinId>040623</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-rrc-no-flex</htmlTabRef>
|
<htmlTabRef>test-05-tm1-rrc-no-flex</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM1-RRC-Inactivity</htmlTabName>
|
<htmlTabName>Test-05MHz-TM1-RRC-Inactivity</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-rrc-w-flex</htmlTabRef>
|
<htmlTabRef>test-05-tm1-rrc-w-flex</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM1-RRC-Inactivity-FlexRan</htmlTabName>
|
<htmlTabName>Test-05MHz-TM1-RRC-Inactivity-FlexRan</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-10-cdrx-tm1</htmlTabRef>
|
<htmlTabRef>test-10-cdrx-tm1</htmlTabRef>
|
||||||
<htmlTabName>Test-10MHz-CDRX-TM1</htmlTabName>
|
<htmlTabName>Test-10MHz-CDRX-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>run-oai-gnb-nr-ue</htmlTabRef>
|
<htmlTabRef>run-oai-gnb-nr-ue</htmlTabRef>
|
||||||
<htmlTabName>Run-gNB-and-NR-UE</htmlTabName>
|
<htmlTabName>Run-gNB-and-NR-UE</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090101 000001 090102 000002 090108 090109
|
090101 000001 090102 000002 090108 090109
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>run-oai-gnb-nr-ue-tx-write-thread</htmlTabRef>
|
<htmlTabRef>run-oai-gnb-nr-ue-tx-write-thread</htmlTabRef>
|
||||||
<htmlTabName>Run-gNB-and-NR-UE-TX-Write-Thread</htmlTabName>
|
<htmlTabName>Run-gNB-and-NR-UE-TX-Write-Thread</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090103 000001 090104 000002 090108 090109
|
090103 000001 090104 000002 090108 090109
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>gnb-build-tab</htmlTabRef>
|
<htmlTabRef>gnb-build-tab</htmlTabRef>
|
||||||
<htmlTabName>Build-gNB</htmlTabName>
|
<htmlTabName>Build-gNB</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010101
|
010101
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-10</htmlTabRef>
|
<htmlTabRef>test-10</htmlTabRef>
|
||||||
<htmlTabName>Test-10MHz</htmlTabName>
|
<htmlTabName>Test-10MHz</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestUnstable>True</TestUnstable>
|
<TestUnstable>True</TestUnstable>
|
||||||
<TestMinId>040612</TestMinId>
|
<TestMinId>040612</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-20</htmlTabRef>
|
<htmlTabRef>test-20</htmlTabRef>
|
||||||
<htmlTabName>Test-20MHz</htmlTabName>
|
<htmlTabName>Test-20MHz</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-oai-ue</htmlTabRef>
|
<htmlTabRef>test-05-tm1-oai-ue</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM1-OAI-UE</htmlTabName>
|
<htmlTabName>Test-05MHz-TM1-OAI-UE</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 090109
|
030201 090109
|
||||||
030102 000001 090102 000002 040503 000002 040603 040604 040643 040644 000002 090109 000001 030201
|
030102 000001 090102 000002 040503 000002 040603 040604 040643 040644 000002 090109 000001 030201
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-05-tm1-nos1-tunnel</htmlTabRef>
|
<htmlTabRef>test-05-tm1-nos1-tunnel</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz-TM1-noS1-tunnel</htmlTabName>
|
<htmlTabName>Test-05MHz-TM1-noS1-tunnel</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 090109
|
030201 090109
|
||||||
030101 000001 090101 000002 040501 040502 000001 040601 040602 040641 040642 000001 090109 030201
|
030101 000001 090101 000002 040501 040502 000001 040601 040602 040641 040642 000001 090109 030201
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-x2-ho-05-tm1</htmlTabRef>
|
<htmlTabRef>test-x2-ho-05-tm1</htmlTabRef>
|
||||||
<htmlTabName>Test-X2-Handover-05MHz-TM1</htmlTabName>
|
<htmlTabName>Test-X2-Handover-05MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
040101 030201 030202
|
040101 030201 030202
|
||||||
050102
|
050102
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-multi-rru-10</htmlTabRef>
|
<htmlTabRef>test-multi-rru-10</htmlTabRef>
|
||||||
<htmlTabName>Test-Multi-RRU-10MHz</htmlTabName>
|
<htmlTabName>Test-Multi-RRU-10MHz</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030211 030212 030213
|
030211 030212 030213
|
||||||
030111 030112 030113
|
030111 030112 030113
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>nr-ue-build-tab</htmlTabRef>
|
<htmlTabRef>nr-ue-build-tab</htmlTabRef>
|
||||||
<htmlTabName>Build-NR-UE</htmlTabName>
|
<htmlTabName>Build-NR-UE</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010102
|
010102
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-10mhz-orange</htmlTabRef>
|
<htmlTabRef>test-10mhz-orange</htmlTabRef>
|
||||||
<htmlTabName>Test-10Mhz-Orange</htmlTabName>
|
<htmlTabName>Test-10Mhz-Orange</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090109
|
090109
|
||||||
090110 000001 090109
|
090110 000001 090109
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>test-10mHz-sfr</htmlTabRef>
|
<htmlTabRef>test-10mHz-sfr</htmlTabRef>
|
||||||
<htmlTabName>Test-10MHz-SFR</htmlTabName>
|
<htmlTabName>Test-10MHz-SFR</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090109
|
090109
|
||||||
090111 000001 090109
|
090111 000001 090109
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<htmlTabRef>test-x2-ho-05-tm1</htmlTabRef>
|
<htmlTabRef>test-x2-ho-05-tm1</htmlTabRef>
|
||||||
<htmlTabName>Test-X2-HO-FDD-05MHz-TM1</htmlTabName>
|
<htmlTabName>Test-X2-HO-FDD-05MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestUnstable>True</TestUnstable>
|
<TestUnstable>True</TestUnstable>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 030202
|
030201 030202
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ version: '3.8'
|
|||||||
services:
|
services:
|
||||||
oai-nrf:
|
oai-nrf:
|
||||||
container_name: "rfsim5g-oai-nrf"
|
container_name: "rfsim5g-oai-nrf"
|
||||||
image: oai-nrf:latest
|
image: oai-nrf:august-dev
|
||||||
environment:
|
environment:
|
||||||
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
||||||
- NRF_INTERFACE_PORT_FOR_SBI=80
|
- NRF_INTERFACE_PORT_FOR_SBI=80
|
||||||
@@ -42,7 +42,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oai-amf:latest
|
image: oai-amf:august-dev
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
- INSTANCE=0
|
- INSTANCE=0
|
||||||
@@ -63,9 +63,9 @@ services:
|
|||||||
- PLMN_SUPPORT_MNC=99
|
- PLMN_SUPPORT_MNC=99
|
||||||
- PLMN_SUPPORT_TAC=0x0001
|
- PLMN_SUPPORT_TAC=0x0001
|
||||||
- SST_0=1
|
- SST_0=1
|
||||||
- SD_0=1
|
- SD_0=0xffffff
|
||||||
- SST_1=1
|
- SST_1=1
|
||||||
- SD_1=12
|
- SD_1=1
|
||||||
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
||||||
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
||||||
- SMF_INSTANCE_ID_0=1
|
- SMF_INSTANCE_ID_0=1
|
||||||
@@ -110,7 +110,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oai-smf:latest
|
image: oai-smf:august-dev
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
- INSTANCE=0
|
- INSTANCE=0
|
||||||
@@ -140,6 +140,12 @@ services:
|
|||||||
- DISCOVER_UPF=yes
|
- DISCOVER_UPF=yes
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- DNN_NI0=oai
|
- DNN_NI0=oai
|
||||||
|
- TYPE0=IPv4
|
||||||
|
- DNN_RANGE0=12.1.1.2 - 12.1.1.127
|
||||||
|
- NSSAI_SST0=1
|
||||||
|
- NSSAI_SD0=0xFFFFFF
|
||||||
|
- SESSION_AMBR_UL0=200Mbps
|
||||||
|
- SESSION_AMBR_DL0=400Mbps
|
||||||
- DNN_NI2=oai.ipv4
|
- DNN_NI2=oai.ipv4
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -156,7 +162,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-spgwu:
|
oai-spgwu:
|
||||||
container_name: "rfsim5g-oai-spgwu"
|
container_name: "rfsim5g-oai-spgwu"
|
||||||
image: oai-spgwu-tiny:latest
|
image: oai-spgwu-tiny:august-dev
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
- PID_DIRECTORY=/var/run
|
- PID_DIRECTORY=/var/run
|
||||||
@@ -183,7 +189,7 @@ services:
|
|||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- NSSAI_SST_0=1
|
- NSSAI_SST_0=1
|
||||||
- NSSAI_SD_0=1
|
- NSSAI_SD_0=0xffffff
|
||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -237,8 +243,6 @@ services:
|
|||||||
MNC: '99'
|
MNC: '99'
|
||||||
MNC_LENGTH: 2
|
MNC_LENGTH: 2
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD0: 1
|
|
||||||
NSSAI_SD1: 112233
|
|
||||||
AMF_IP_ADDRESS: 192.168.71.132
|
AMF_IP_ADDRESS: 192.168.71.132
|
||||||
GNB_NGA_IF_NAME: eth0
|
GNB_NGA_IF_NAME: eth0
|
||||||
GNB_NGA_IP_ADDRESS: 192.168.71.140
|
GNB_NGA_IP_ADDRESS: 192.168.71.140
|
||||||
@@ -273,8 +277,6 @@ services:
|
|||||||
MNC: '99'
|
MNC: '99'
|
||||||
MNC_LENGTH: 2
|
MNC_LENGTH: 2
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD0: 1
|
|
||||||
NSSAI_SD1: 112233
|
|
||||||
AMF_IP_ADDRESS: 192.168.71.132
|
AMF_IP_ADDRESS: 192.168.71.132
|
||||||
GNB_NGA_IF_NAME: eth0
|
GNB_NGA_IF_NAME: eth0
|
||||||
GNB_NGA_IP_ADDRESS: 192.168.71.142
|
GNB_NGA_IP_ADDRESS: 192.168.71.142
|
||||||
@@ -307,7 +309,6 @@ services:
|
|||||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
DNN: oai
|
DNN: oai
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD: 1
|
|
||||||
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-du
|
- oai-du
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ version: '3.8'
|
|||||||
services:
|
services:
|
||||||
oai-nrf:
|
oai-nrf:
|
||||||
container_name: "rfsim5g-oai-nrf"
|
container_name: "rfsim5g-oai-nrf"
|
||||||
image: oai-nrf:latest
|
image: oai-nrf:august-dev
|
||||||
environment:
|
environment:
|
||||||
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
||||||
- NRF_INTERFACE_PORT_FOR_SBI=80
|
- NRF_INTERFACE_PORT_FOR_SBI=80
|
||||||
@@ -42,7 +42,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oai-amf:latest
|
image: oai-amf:august-dev
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
- INSTANCE=0
|
- INSTANCE=0
|
||||||
@@ -63,9 +63,9 @@ services:
|
|||||||
- PLMN_SUPPORT_MNC=99
|
- PLMN_SUPPORT_MNC=99
|
||||||
- PLMN_SUPPORT_TAC=0x0001
|
- PLMN_SUPPORT_TAC=0x0001
|
||||||
- SST_0=1
|
- SST_0=1
|
||||||
- SD_0=1
|
- SD_0=0xffffff
|
||||||
- SST_1=1
|
- SST_1=1
|
||||||
- SD_1=12
|
- SD_1=1
|
||||||
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
||||||
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
||||||
- SMF_INSTANCE_ID_0=1
|
- SMF_INSTANCE_ID_0=1
|
||||||
@@ -110,7 +110,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oai-smf:latest
|
image: oai-smf:august-dev
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
- INSTANCE=0
|
- INSTANCE=0
|
||||||
@@ -140,6 +140,12 @@ services:
|
|||||||
- DISCOVER_UPF=yes
|
- DISCOVER_UPF=yes
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- DNN_NI0=oai
|
- DNN_NI0=oai
|
||||||
|
- TYPE0=IPv4
|
||||||
|
- DNN_RANGE0=12.1.1.2 - 12.1.1.127
|
||||||
|
- NSSAI_SST0=1
|
||||||
|
- NSSAI_SD0=0xFFFFFF
|
||||||
|
- SESSION_AMBR_UL0=200Mbps
|
||||||
|
- SESSION_AMBR_DL0=400Mbps
|
||||||
- DNN_NI2=oai.ipv4
|
- DNN_NI2=oai.ipv4
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -156,7 +162,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-spgwu:
|
oai-spgwu:
|
||||||
container_name: "rfsim5g-oai-spgwu"
|
container_name: "rfsim5g-oai-spgwu"
|
||||||
image: oai-spgwu-tiny:latest
|
image: oai-spgwu-tiny:august-dev
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
- PID_DIRECTORY=/var/run
|
- PID_DIRECTORY=/var/run
|
||||||
@@ -183,7 +189,7 @@ services:
|
|||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- NSSAI_SST_0=1
|
- NSSAI_SST_0=1
|
||||||
- NSSAI_SD_0=1
|
- NSSAI_SD_0=0xffffff
|
||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -237,8 +243,6 @@ services:
|
|||||||
MNC: '99'
|
MNC: '99'
|
||||||
MNC_LENGTH: 2
|
MNC_LENGTH: 2
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD0: 1
|
|
||||||
NSSAI_SD1: 112233
|
|
||||||
AMF_IP_ADDRESS: 192.168.71.132
|
AMF_IP_ADDRESS: 192.168.71.132
|
||||||
GNB_NGA_IF_NAME: eth0
|
GNB_NGA_IF_NAME: eth0
|
||||||
GNB_NGA_IP_ADDRESS: 192.168.71.140
|
GNB_NGA_IP_ADDRESS: 192.168.71.140
|
||||||
@@ -266,7 +270,6 @@ services:
|
|||||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
DNN: oai
|
DNN: oai
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD: 1
|
|
||||||
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --band 66 -C 2169080000 --CO -400000000 -s 396 --nokrnmod --log_config.global_log_options level,nocolor,time
|
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --band 66 -C 2169080000 --CO -400000000 -s 396 --nokrnmod --log_config.global_log_options level,nocolor,time
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-gnb
|
- oai-gnb
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ services:
|
|||||||
- PLMN_SUPPORT_MNC=99
|
- PLMN_SUPPORT_MNC=99
|
||||||
- PLMN_SUPPORT_TAC=0x0001
|
- PLMN_SUPPORT_TAC=0x0001
|
||||||
- SST_0=1
|
- SST_0=1
|
||||||
- SD_0=1
|
- SD_0=0xffffff
|
||||||
- SST_1=1
|
- SST_1=1
|
||||||
- SD_1=12
|
- SD_1=1
|
||||||
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
||||||
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
||||||
- SMF_INSTANCE_ID_0=1
|
- SMF_INSTANCE_ID_0=1
|
||||||
@@ -140,6 +140,12 @@ services:
|
|||||||
- DISCOVER_UPF=yes
|
- DISCOVER_UPF=yes
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- DNN_NI0=oai
|
- DNN_NI0=oai
|
||||||
|
- TYPE0=IPv4
|
||||||
|
- DNN_RANGE0=12.1.1.2 - 12.1.1.127
|
||||||
|
- NSSAI_SST0=1
|
||||||
|
- NSSAI_SD0=0xFFFFFF
|
||||||
|
- SESSION_AMBR_UL0=200Mbps
|
||||||
|
- SESSION_AMBR_DL0=400Mbps
|
||||||
- DNN_NI2=oai.ipv4
|
- DNN_NI2=oai.ipv4
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -183,7 +189,7 @@ services:
|
|||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- NSSAI_SST_0=1
|
- NSSAI_SST_0=1
|
||||||
- NSSAI_SD_0=1
|
- NSSAI_SD_0=0xffffff
|
||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -237,8 +243,6 @@ services:
|
|||||||
MNC: '99'
|
MNC: '99'
|
||||||
MNC_LENGTH: 2
|
MNC_LENGTH: 2
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD0: 1
|
|
||||||
NSSAI_SD1: 112233
|
|
||||||
AMF_IP_ADDRESS: 192.168.71.132
|
AMF_IP_ADDRESS: 192.168.71.132
|
||||||
GNB_NGA_IF_NAME: eno1
|
GNB_NGA_IF_NAME: eno1
|
||||||
GNB_NGA_IP_ADDRESS: 172.21.16.128
|
GNB_NGA_IP_ADDRESS: 172.21.16.128
|
||||||
@@ -287,7 +291,7 @@ services:
|
|||||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
DNN: oai
|
DNN: oai
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD: 1
|
NSSAI_SD: 0xffffff
|
||||||
NR_UE_NFAPI_IF_NAME: eno1
|
NR_UE_NFAPI_IF_NAME: eno1
|
||||||
GNB_IP_ADDRESS: 127.0.0.1
|
GNB_IP_ADDRESS: 127.0.0.1
|
||||||
NR_UE_IP_ADDRESS: 127.0.0.1
|
NR_UE_IP_ADDRESS: 127.0.0.1
|
||||||
|
|||||||
@@ -274,7 +274,6 @@ Create entry for Second UE in docker-compose.yaml file as follows:
|
|||||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
DNN: oai
|
DNN: oai
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD: 1
|
|
||||||
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-gnb
|
- oai-gnb
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ services:
|
|||||||
- PLMN_SUPPORT_MNC=99
|
- PLMN_SUPPORT_MNC=99
|
||||||
- PLMN_SUPPORT_TAC=0x0001
|
- PLMN_SUPPORT_TAC=0x0001
|
||||||
- SST_0=1
|
- SST_0=1
|
||||||
- SD_0=1
|
- SD_0=0xffffff
|
||||||
- SST_1=1
|
- SST_1=1
|
||||||
- SD_1=12
|
- SD_1=1
|
||||||
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
||||||
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
||||||
- SMF_INSTANCE_ID_0=1
|
- SMF_INSTANCE_ID_0=1
|
||||||
@@ -140,6 +140,12 @@ services:
|
|||||||
- DISCOVER_UPF=yes
|
- DISCOVER_UPF=yes
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- DNN_NI0=oai
|
- DNN_NI0=oai
|
||||||
|
- TYPE0=IPv4
|
||||||
|
- DNN_RANGE0=12.1.1.2 - 12.1.1.127
|
||||||
|
- NSSAI_SST0=1
|
||||||
|
- NSSAI_SD0=0xFFFFFF
|
||||||
|
- SESSION_AMBR_UL0=200Mbps
|
||||||
|
- SESSION_AMBR_DL0=400Mbps
|
||||||
- DNN_NI2=oai.ipv4
|
- DNN_NI2=oai.ipv4
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -183,7 +189,7 @@ services:
|
|||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- NSSAI_SST_0=1
|
- NSSAI_SST_0=1
|
||||||
- NSSAI_SD_0=1
|
- NSSAI_SD_0=0xffffff
|
||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -237,8 +243,6 @@ services:
|
|||||||
MNC: '99'
|
MNC: '99'
|
||||||
MNC_LENGTH: 2
|
MNC_LENGTH: 2
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD0: 1
|
|
||||||
NSSAI_SD1: 112233
|
|
||||||
AMF_IP_ADDRESS: 192.168.71.132
|
AMF_IP_ADDRESS: 192.168.71.132
|
||||||
GNB_NGA_IF_NAME: eth0
|
GNB_NGA_IF_NAME: eth0
|
||||||
GNB_NGA_IP_ADDRESS: 192.168.71.140
|
GNB_NGA_IP_ADDRESS: 192.168.71.140
|
||||||
@@ -266,7 +270,6 @@ services:
|
|||||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
DNN: oai
|
DNN: oai
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD: 1
|
|
||||||
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-gnb
|
- oai-gnb
|
||||||
@@ -290,7 +293,6 @@ services:
|
|||||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
DNN: oai
|
DNN: oai
|
||||||
NSSAI_SST: 1
|
NSSAI_SST: 1
|
||||||
NSSAI_SD: 1
|
|
||||||
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-gnb
|
- oai-gnb
|
||||||
|
|||||||
@@ -1267,6 +1267,7 @@ add_library(UTIL
|
|||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/backtrace.c
|
${OPENAIR_DIR}/common/utils/backtrace.c
|
||||||
${OPENAIR_DIR}/common/utils/time_meas.c
|
${OPENAIR_DIR}/common/utils/time_meas.c
|
||||||
|
${OPENAIR_DIR}/common/utils/time_stat.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SECU_OSA_SRC
|
set(SECU_OSA_SRC
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ void config_check_valptr(paramdef_t *cfgoptions, int elt_sz, int nb_elt) {
|
|||||||
sz=managed_ptr_sz(*cfgoptions->strptr);
|
sz=managed_ptr_sz(*cfgoptions->strptr);
|
||||||
else
|
else
|
||||||
sz=managed_ptr_sz(cfgoptions->voidptr);
|
sz=managed_ptr_sz(cfgoptions->voidptr);
|
||||||
if ( sz != -1) {
|
if ( sz == -1) {
|
||||||
CONFIG_PRINTF_ERROR("[CONFIG] %s NOT SUPPORTED not NULL pointer with array types", cfgoptions->optname);
|
CONFIG_PRINTF_ERROR("[CONFIG] %s NOT SUPPORTED not NULL pointer with array types", cfgoptions->optname);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
#ifndef __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
|
#ifndef __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
|
||||||
#define __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
|
#define __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
|
||||||
|
|
||||||
//#include "ws_symbol_export.h"
|
|
||||||
|
|
||||||
/* radioType */
|
/* radioType */
|
||||||
#define FDD_RADIO 1
|
#define FDD_RADIO 1
|
||||||
#define TDD_RADIO 2
|
#define TDD_RADIO 2
|
||||||
|
|||||||
@@ -738,3 +738,4 @@ void SLIV2SL(int SLIV,int *S,int *L) {
|
|||||||
*S=13-SLIVmod14;
|
*S=13-SLIVmod14;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,10 +56,9 @@ typedef enum frequency_range_e {
|
|||||||
} frequency_range_t;
|
} frequency_range_t;
|
||||||
|
|
||||||
extern const nr_bandentry_t nr_bandtable[];
|
extern const nr_bandentry_t nr_bandtable[];
|
||||||
|
|
||||||
static inline int get_num_dmrs(uint16_t dmrs_mask ) {
|
static inline int get_num_dmrs(uint16_t dmrs_mask ) {
|
||||||
|
|
||||||
int num_dmrs=0;
|
int num_dmrs=0;
|
||||||
|
|
||||||
for (int i=0;i<16;i++) num_dmrs+=((dmrs_mask>>i)&1);
|
for (int i=0;i<16;i++) num_dmrs+=((dmrs_mask>>i)&1);
|
||||||
return(num_dmrs);
|
return(num_dmrs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,6 +171,8 @@ extern "C" {
|
|||||||
AssertFatal(epoll_ctl(t->epoll_fd, EPOLL_CTL_ADD, fd, &event) == 0,
|
AssertFatal(epoll_ctl(t->epoll_fd, EPOLL_CTL_ADD, fd, &event) == 0,
|
||||||
"epoll_ctl (EPOLL_CTL_ADD) failed for task %s, fd %d: %s!\n",
|
"epoll_ctl (EPOLL_CTL_ADD) failed for task %s, fd %d: %s!\n",
|
||||||
itti_get_task_name(task_id), fd, strerror(errno));
|
itti_get_task_name(task_id), fd, strerror(errno));
|
||||||
|
eventfd_t sem_counter = 1;
|
||||||
|
AssertFatal ( sizeof(sem_counter) == write(t->sem_fd, &sem_counter, sizeof(sem_counter)), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
void itti_unsubscribe_event_fd(task_id_t task_id, int fd) {
|
void itti_unsubscribe_event_fd(task_id_t task_id, int fd) {
|
||||||
@@ -274,16 +276,12 @@ extern "C" {
|
|||||||
|
|
||||||
struct epoll_event events[t->nb_fd_epoll];
|
struct epoll_event events[t->nb_fd_epoll];
|
||||||
// Weird condition to deal with crap legacy itti interface
|
// Weird condition to deal with crap legacy itti interface
|
||||||
if ( t->nb_fd_epoll == 1 ) {
|
if (t->message_queue.empty()) {
|
||||||
while (t->message_queue.empty()) {
|
do {
|
||||||
itti_get_events_locked(task_id, events, t->nb_fd_epoll);
|
|
||||||
pthread_mutex_lock(&t->queue_cond_lock);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (t->message_queue.empty()) {
|
|
||||||
itti_get_events_locked(task_id, events, t->nb_fd_epoll);
|
itti_get_events_locked(task_id, events, t->nb_fd_epoll);
|
||||||
pthread_mutex_lock(&t->queue_cond_lock);
|
pthread_mutex_lock(&t->queue_cond_lock);
|
||||||
}
|
}
|
||||||
|
while (t->message_queue.empty() && t->nb_fd_epoll == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy design: we return even if we have no message
|
// Legacy design: we return even if we have no message
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "time_stat.h"
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "common/utils/LOG/log.h"
|
||||||
|
|
||||||
|
time_average_t *time_average_new(int duration, int initial_size)
|
||||||
|
{
|
||||||
|
time_average_t *ret;
|
||||||
|
|
||||||
|
/* let's only accept power of two initial_size */
|
||||||
|
if (initial_size & (initial_size - 1)) {
|
||||||
|
LOG_E(UTIL, "time_average_new: illegal initial_size %d, use power of two\n", initial_size);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = calloc(1, sizeof(time_average_t));
|
||||||
|
if (ret == NULL) {
|
||||||
|
LOG_E(UTIL, "out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret->duration = duration;
|
||||||
|
ret->r.head = initial_size - 1;
|
||||||
|
ret->r.maxsize = initial_size;
|
||||||
|
ret->r.buffer = calloc(initial_size, sizeof(time_value_t));
|
||||||
|
if (ret->r.buffer == NULL) {
|
||||||
|
LOG_E(UTIL, "out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void time_average_free(time_average_t *t)
|
||||||
|
{
|
||||||
|
free(t->r.buffer);
|
||||||
|
free(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
void time_average_reset(time_average_t *t)
|
||||||
|
{
|
||||||
|
t->r.head = t->r.maxsize - 1;
|
||||||
|
t->r.tail = 0;
|
||||||
|
t->r.size = 0;
|
||||||
|
t->accumulated_value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void remove_old(time_average_t *t, uint64_t time)
|
||||||
|
{
|
||||||
|
/* remove old events */
|
||||||
|
while (t->r.size && t->r.buffer[t->r.tail].time < time - t->duration) {
|
||||||
|
t->accumulated_value -= t->r.buffer[t->r.tail].value;
|
||||||
|
t->r.size--;
|
||||||
|
t->r.tail++;
|
||||||
|
t->r.tail %= t->r.maxsize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void time_average_add(time_average_t *t, uint64_t time, uint64_t value)
|
||||||
|
{
|
||||||
|
remove_old(t, time);
|
||||||
|
|
||||||
|
if (t->r.size == t->r.maxsize) {
|
||||||
|
t->r.maxsize *= 2;
|
||||||
|
t->r.buffer = realloc(t->r.buffer, t->r.maxsize * sizeof(time_value_t));
|
||||||
|
if (t->r.buffer == NULL) {
|
||||||
|
LOG_E(UTIL, "out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (t->r.head < t->r.tail) {
|
||||||
|
memcpy(&t->r.buffer[t->r.size], &t->r.buffer[0], (t->r.head + 1) * sizeof(time_value_t));
|
||||||
|
t->r.head += t->r.size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t->r.head++;
|
||||||
|
t->r.head %= t->r.maxsize;
|
||||||
|
t->r.buffer[t->r.head].time = time;
|
||||||
|
t->r.buffer[t->r.head].value = value;
|
||||||
|
|
||||||
|
t->r.size++;
|
||||||
|
|
||||||
|
t->accumulated_value += value;
|
||||||
|
}
|
||||||
|
|
||||||
|
double time_average_get_average(time_average_t *t, uint64_t time)
|
||||||
|
{
|
||||||
|
remove_old(t, time);
|
||||||
|
|
||||||
|
if (t->r.size == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return (double)t->accumulated_value / t->r.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t time_average_now(void)
|
||||||
|
{
|
||||||
|
struct timespec t;
|
||||||
|
uint64_t ret;
|
||||||
|
|
||||||
|
if (clock_gettime(CLOCK_REALTIME, &t)) {
|
||||||
|
LOG_E(UTIL, "clock_gettime failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = (uint64_t)t.tv_sec * (uint64_t)1000000 + t.tv_nsec / 1000;
|
||||||
|
/* round up if necessary */
|
||||||
|
if (t.tv_nsec % 1000 >= 500)
|
||||||
|
ret++;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _COMMON_UTIL_TIME_STAT_H_
|
||||||
|
#define _COMMON_UTIL_TIME_STAT_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t time; /* unit: microsecond */
|
||||||
|
uint64_t value; /* unit: microsecond */
|
||||||
|
} time_value_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int head;
|
||||||
|
int tail;
|
||||||
|
time_value_t *buffer;
|
||||||
|
int maxsize;
|
||||||
|
int size;
|
||||||
|
} time_ring_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int duration; /* unit: microsecond */
|
||||||
|
time_ring_t r;
|
||||||
|
uint64_t accumulated_value;
|
||||||
|
} time_average_t;
|
||||||
|
|
||||||
|
/* 'duration' is in unit microsecond */
|
||||||
|
time_average_t *time_average_new(int duration, int initial_size);
|
||||||
|
void time_average_free(time_average_t *t);
|
||||||
|
void time_average_reset(time_average_t *t);
|
||||||
|
|
||||||
|
/* add a value tagged with time 'time' unit microsecond (it also modifies 't',
|
||||||
|
* removing all data with time < 'time' - t->duration)
|
||||||
|
*/
|
||||||
|
void time_average_add(time_average_t *t, uint64_t time, uint64_t value);
|
||||||
|
|
||||||
|
/* get the average for time 'time' (it also modifies 't', removing all
|
||||||
|
* data with time < 'time' - t->duration)
|
||||||
|
*/
|
||||||
|
double time_average_get_average(time_average_t *t, uint64_t time);
|
||||||
|
|
||||||
|
/* unit microsecond */
|
||||||
|
uint64_t time_average_now(void);
|
||||||
|
|
||||||
|
#endif /* _COMMON_UTIL_TIME_STAT_H_ */
|
||||||
+3
-2
@@ -105,8 +105,9 @@ Webhook
|
|||||||
- [RAN-RF-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-5G/)
|
- [RAN-RF-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-5G/)
|
||||||
- obelix (gNB, 2x UE, OAI 5GC)
|
- obelix (gNB, 2x UE, OAI 5GC)
|
||||||
- uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split
|
- uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split
|
||||||
- [RAN-RHEL8-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Image-Builder/)
|
- [RAN-RHEL8-Cluster-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Cluster-Image-Builder/)
|
||||||
- asterix: RHEL 8 image build using podman
|
- asterix (`Asterix-OC-oaicicd-session` resource): RHEL 8 image build using
|
||||||
|
the OpenShift in Eurecom
|
||||||
- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
|
- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
|
||||||
- obelix: Ubuntu 18 image build using docker
|
- obelix: Ubuntu 18 image build using docker
|
||||||
|
|
||||||
|
|||||||
@@ -68,21 +68,7 @@ In the following, we highlight the fields of the file that have to be configured
|
|||||||
```bash
|
```bash
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
|
||||||
mnc_length = 2;
|
|
||||||
snssaiList = (
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x1; // 0 false, else true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sst = 1;
|
|
||||||
sd = 0x112233; // 0 false, else true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
```
|
```
|
||||||
Then, the source and destination IP interfaces for the communication with
|
Then, the source and destination IP interfaces for the communication with
|
||||||
the Core Network also need to be set as shown below.
|
the Core Network also need to be set as shown below.
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ services:
|
|||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- NSSAI_SST_0=1
|
- NSSAI_SST_0=1
|
||||||
- NSSAI_SD_0=0x1
|
- NSSAI_SD_0=0xffffff
|
||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
|
|||||||
@@ -32,8 +32,12 @@ ENV TZ=Europe/Paris
|
|||||||
ENV BUILD_UHD_FROM_SOURCE=True
|
ENV BUILD_UHD_FROM_SOURCE=True
|
||||||
ENV UHD_VERSION=3.15.0.0
|
ENV UHD_VERSION=3.15.0.0
|
||||||
|
|
||||||
COPY tmp/ca/redhat-uep.pem /etc/rhsm/ca
|
# Copy the entitlements
|
||||||
COPY tmp/entitlement/*.pem /etc/pki/entitlement
|
COPY ./etc-pki-entitlement /etc/pki/entitlement
|
||||||
|
|
||||||
|
# Copy the subscription manager configurations
|
||||||
|
COPY ./rhsm-conf /etc/rhsm
|
||||||
|
COPY ./rhsm-ca /etc/rhsm/ca
|
||||||
|
|
||||||
#install developers pkg/repo
|
#install developers pkg/repo
|
||||||
RUN rm -f /etc/rhsm-host && \
|
RUN rm -f /etc/rhsm-host && \
|
||||||
|
|||||||
@@ -35,4 +35,4 @@ COPY . .
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512
|
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512 -c
|
||||||
|
|||||||
@@ -35,4 +35,4 @@ COPY . .
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512
|
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512 -c
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL7 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
FROM image-registry.openshift-image-registry.svc:5000/oai/oai-ran:latest AS enb-build
|
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /oai-enb
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
#run build_oai to build the target image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai --eNB
|
|
||||||
|
|
||||||
|
|
||||||
#start from scratch for target executable
|
|
||||||
FROM registry.access.redhat.com/ubi7/ubi:latest as oai-enb
|
|
||||||
|
|
||||||
# Entitlements and RHSM configurations are Open-Shift Secret and ConfigMaps
|
|
||||||
# It is pre-requisite
|
|
||||||
RUN rm -Rf /etc/rhsm/ca /etc/pki/entitlement
|
|
||||||
# Copy the entitlements
|
|
||||||
COPY ./etc-pki-entitlement /etc/pki/entitlement
|
|
||||||
# Copy the subscription manager configurations
|
|
||||||
COPY ./rhsm-conf /etc/rhsm
|
|
||||||
COPY ./rhsm-ca /etc/rhsm/ca
|
|
||||||
|
|
||||||
|
|
||||||
#install developers pkg/repo
|
|
||||||
RUN rm /etc/rhsm-host && \
|
|
||||||
# Initialize /etc/yum.repos.d/redhat.repo
|
|
||||||
# See https://access.redhat.com/solutions/1443553
|
|
||||||
yum repolist --disablerepo=* && \
|
|
||||||
yum-config-manager --enable rhel-7-server-optional-rpms rhel-server-rhscl-7-rpms && \
|
|
||||||
yum update -y && \
|
|
||||||
yum install -y \
|
|
||||||
lksctp-tools \
|
|
||||||
protobuf-c \
|
|
||||||
nettle \
|
|
||||||
libyaml && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-enb/bin
|
|
||||||
COPY --from=enb-build /oai-enb/targets/bin/lte-softmodem.Rel15 .
|
|
||||||
|
|
||||||
RUN ldd lte-softmodem.Rel15
|
|
||||||
|
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
|
||||||
#EXPOSE 22100/tcp # ?
|
|
||||||
#EXPOSE 36412/udp # S1C, SCTP/UDP
|
|
||||||
#EXPOSE 36422/udp # X2C, SCTP/UDP
|
|
||||||
#EXPOSE 50000/udp # IF5 / ORI (control)
|
|
||||||
#EXPOSE 50001/udp # IF5 / ECPRI (data)
|
|
||||||
|
|
||||||
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
|
||||||
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
|
||||||
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL8 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
FROM image-registry.openshift-image-registry.svc:5000/oai/oai-ran:rhel8-latest AS enb-build
|
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
|
|
||||||
#run build_oai to build the target image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai --eNB --ninja -w USRP
|
|
||||||
|
|
||||||
# debug
|
|
||||||
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-softmodem.Rel15
|
|
||||||
#RUN ls -ls /oai-ran/targets/bin
|
|
||||||
#RUN ls -ls /oai-ran/cmake_targets/ran_build/build/*.so
|
|
||||||
|
|
||||||
#start from scratch for target executable
|
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-enb
|
|
||||||
|
|
||||||
RUN yum update -y && \
|
|
||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
|
||||||
lksctp-tools \
|
|
||||||
nettle \
|
|
||||||
atlas \
|
|
||||||
net-tools \
|
|
||||||
iproute \
|
|
||||||
iputils \
|
|
||||||
libyaml && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-enb/bin
|
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/lte-softmodem.Rel15 .
|
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libcoding.so .
|
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libparams_libconfig.so .
|
|
||||||
COPY --from=enb-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
|
||||||
COPY --from=enb-build /oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so .
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
|
||||||
|
|
||||||
COPY --from=enb-build /usr/local/lib/libprotobuf-c.so.1 .
|
|
||||||
|
|
||||||
COPY --from=enb-build /lib64/libconfig.so.9 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libblas.so.3 /lib64
|
|
||||||
COPY --from=enb-build /lib64/liblapack.so.3 /lib64
|
|
||||||
COPY --from=enb-build /lib64/liblapacke.so.3 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
|
||||||
|
|
||||||
#debug
|
|
||||||
RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/librfsimulator.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/libcoding.so
|
|
||||||
RUN ldd /usr/local/lib/libparams_libconfig.so
|
|
||||||
RUN ldd /usr/local/lib/libdfts.so
|
|
||||||
RUN ldd /usr/local/lib/liboai_iqplayer.so
|
|
||||||
RUN ldd /opt/oai-enb/bin/lte-softmodem.Rel15
|
|
||||||
|
|
||||||
# Copy the relevant configuration files for eNB
|
|
||||||
WORKDIR /opt/oai-enb/etc
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/enb.* .
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/rcc.* .
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/cu.* .
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/du.* .
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/rru.* .
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-enb
|
|
||||||
|
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
|
||||||
#EXPOSE 22100/tcp # ?
|
|
||||||
#EXPOSE 36412/udp # S1C, SCTP/UDP
|
|
||||||
#EXPOSE 36422/udp # X2C, SCTP/UDP
|
|
||||||
#EXPOSE 50000/udp # IF5 / ORI (control)
|
|
||||||
#EXPOSE 50001/udp # IF5 / ECPRI (data)
|
|
||||||
|
|
||||||
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
|
||||||
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
|
||||||
CMD ["sleep", "infinity"]
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL7 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
FROM image-registry.openshift-image-registry.svc:5000/oai/oai-ran:latest AS gnb-build
|
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /oai-gnb
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
#run build_oai to build the target image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai --gNB
|
|
||||||
|
|
||||||
|
|
||||||
#start from scratch for target executable
|
|
||||||
FROM registry.access.redhat.com/ubi7/ubi:latest as oai-gnb
|
|
||||||
|
|
||||||
# Entitlements and RHSM configurations are Open-Shift Secret and ConfigMaps
|
|
||||||
# It is pre-requisite
|
|
||||||
RUN rm -Rf /etc/rhsm/ca /etc/pki/entitlement
|
|
||||||
# Copy the entitlements
|
|
||||||
COPY ./etc-pki-entitlement /etc/pki/entitlement
|
|
||||||
# Copy the subscription manager configurations
|
|
||||||
COPY ./rhsm-conf /etc/rhsm
|
|
||||||
COPY ./rhsm-ca /etc/rhsm/ca
|
|
||||||
|
|
||||||
|
|
||||||
#install developers pkg/repo
|
|
||||||
RUN rm /etc/rhsm-host && \
|
|
||||||
# Initialize /etc/yum.repos.d/redhat.repo
|
|
||||||
# See https://access.redhat.com/solutions/1443553
|
|
||||||
yum repolist --disablerepo=* && \
|
|
||||||
yum-config-manager --enable rhel-7-server-optional-rpms rhel-server-rhscl-7-rpms && \
|
|
||||||
yum update -y && \
|
|
||||||
yum install -y \
|
|
||||||
libXpm \
|
|
||||||
libX11 \
|
|
||||||
atlas \
|
|
||||||
blas \
|
|
||||||
lapack \
|
|
||||||
lksctp-tools \
|
|
||||||
protobuf-c \
|
|
||||||
nettle \
|
|
||||||
libyaml && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-gnb/bin
|
|
||||||
COPY --from=gnb-build /oai-gnb/targets/bin/nr-softmodem.Rel15 .
|
|
||||||
WORKDIR /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libforms.so.2 .
|
|
||||||
|
|
||||||
RUN ldd /opt/oai-gnb/bin/nr-softmodem.Rel15
|
|
||||||
|
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
|
||||||
#EXPOSE 22100/tcp # ?
|
|
||||||
#EXPOSE 36412/udp # S1C, SCTP/UDP
|
|
||||||
#EXPOSE 36422/udp # X2C, SCTP/UDP
|
|
||||||
#EXPOSE 50000/udp # IF5 / ORI (control)
|
|
||||||
#EXPOSE 50001/udp # IF5 / ECPRI (data)
|
|
||||||
|
|
||||||
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
|
||||||
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
|
||||||
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL8 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
FROM image-registry.openshift-image-registry.svc:5000/oai/oai-ran:rhel8-latest AS gnb-build
|
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
|
|
||||||
#run build_oai to build the target image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai --gNB --ninja -w USRP
|
|
||||||
|
|
||||||
#debug
|
|
||||||
#RUN ldconfig -v
|
|
||||||
#RUN ldd /oai-ran/targets/bin/nr-softmodem.Rel15
|
|
||||||
#RUN ls -lst /oai-ran/targets/bin
|
|
||||||
#RUN ls -lst /oai-ran/cmake_targets/ran_build/build/*.so
|
|
||||||
|
|
||||||
#start from scratch for target executable
|
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-gnb
|
|
||||||
|
|
||||||
RUN yum repolist --disablerepo=* && \
|
|
||||||
yum update -y && \
|
|
||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
|
||||||
libXpm \
|
|
||||||
libX11 \
|
|
||||||
atlas \
|
|
||||||
lksctp-tools \
|
|
||||||
nettle \
|
|
||||||
net-tools \
|
|
||||||
iputils \
|
|
||||||
libyaml && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-gnb/bin
|
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/nr-softmodem.Rel15 .
|
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libcoding.so .
|
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libparams_libconfig.so .
|
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc.so .
|
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim.so .
|
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so .
|
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_orig.so .
|
|
||||||
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
|
||||||
COPY --from=gnb-build /usr/local/lib/libprotobuf-c.so.1 .
|
|
||||||
|
|
||||||
COPY --from=gnb-build /lib64/libconfig.so.9 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libforms.so.2 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libblas.so.3 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/liblapack.so.3 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/liblapacke.so.3 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
|
||||||
#debug
|
|
||||||
RUN ldd /opt/oai-gnb/bin/nr-softmodem.Rel15
|
|
||||||
RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/librfsimulator.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/libcoding.so
|
|
||||||
RUN ldd /usr/local/lib/libparams_libconfig.so
|
|
||||||
RUN ldd /usr/local/lib/libdfts.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc_optim.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc_optim8seg.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc_orig.so
|
|
||||||
|
|
||||||
# Copy the relevant configuration files for gNB
|
|
||||||
WORKDIR /opt/oai-gnb/etc
|
|
||||||
COPY --from=gnb-build /oai-ran/ci-scripts/conf_files/gnb.* .
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-gnb
|
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
|
||||||
#EXPOSE 22100/tcp # ?
|
|
||||||
#EXPOSE 36412/udp # S1C, SCTP/UDP
|
|
||||||
#EXPOSE 36422/udp # X2C, SCTP/UDP
|
|
||||||
#EXPOSE 50000/udp # IF5 / ORI (control)
|
|
||||||
#EXPOSE 50001/udp # IF5 / ECPRI (data)
|
|
||||||
|
|
||||||
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
|
||||||
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
|
||||||
CMD ["sleep", "infinity"]
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL8 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
FROM image-registry.openshift-image-registry.svc:5000/oai/oai-ran:rhel8-latest AS lte-ue-build
|
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
|
|
||||||
#run build_oai to build the target image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai --UE --ninja -w USRP
|
|
||||||
|
|
||||||
# debug
|
|
||||||
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-uesoftmodem.Rel15
|
|
||||||
#RUN ls -lst /oai-ran/targets/bin
|
|
||||||
#RUN ls -lst /oai-ran/cmake_targets/ran_build/build/*.so
|
|
||||||
|
|
||||||
#start from scratch for target executable
|
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ue
|
|
||||||
|
|
||||||
RUN yum update -y && \
|
|
||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
|
||||||
lksctp-tools \
|
|
||||||
nettle \
|
|
||||||
atlas \
|
|
||||||
iproute \
|
|
||||||
net-tools \
|
|
||||||
iputils \
|
|
||||||
libyaml && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue/bin
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/lte-uesoftmodem.Rel15 .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/conf2uedata .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/nvram .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/usim .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/.ue_emm.nvram0 .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/.ue.nvram0 .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/.usim.nvram0 .
|
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libcoding.so .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libparams_libconfig.so .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/cmake_targets/ran_build/build/libSIMU.so .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
|
||||||
|
|
||||||
COPY --from=lte-ue-build /usr/local/lib/libprotobuf-c.so.1 .
|
|
||||||
|
|
||||||
COPY --from=lte-ue-build /lib64/libconfig.so.9 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libblas.so.3 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/liblapack.so.3 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/liblapacke.so.3 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
|
||||||
|
|
||||||
#debug
|
|
||||||
RUN ldd /opt/oai-lte-ue/bin/lte-uesoftmodem.Rel15
|
|
||||||
RUN ldd /opt/oai-lte-ue/bin/conf2uedata
|
|
||||||
RUN ldd /opt/oai-lte-ue/bin/nvram
|
|
||||||
RUN ldd /opt/oai-lte-ue/bin/usim
|
|
||||||
RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/librfsimulator.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/libcoding.so
|
|
||||||
RUN ldd /usr/local/lib/libparams_libconfig.so
|
|
||||||
RUN ldd /usr/local/lib/libSIMU.so
|
|
||||||
RUN ldd /usr/local/lib/libdfts.so
|
|
||||||
|
|
||||||
# Copy the relevant configuration files for eNB
|
|
||||||
WORKDIR /opt/oai-lte-ue/etc
|
|
||||||
COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
|
||||||
COPY --from=lte-ue-build /oai-ran/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ./ue_usim.conf
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue
|
|
||||||
#CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
|
|
||||||
#ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
|
||||||
CMD ["sleep", "infinity"]
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL8 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
FROM image-registry.openshift-image-registry.svc:5000/oai/oai-ran:rhel8-latest AS nr-ue-build
|
|
||||||
|
|
||||||
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
|
|
||||||
#run build_oai to build the target image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai --nrUE --ninja -w USRP
|
|
||||||
|
|
||||||
# debug
|
|
||||||
#RUN ldconfig -v
|
|
||||||
#RUN ldd /oai-ran/targets/bin/nr-uesoftmodem.Rel15
|
|
||||||
#RUN ls -lst /oai-ran/targets/bin
|
|
||||||
#RUN ls -lst /oai-ran/cmake_targets/ran_build/build/*.so
|
|
||||||
|
|
||||||
#start from scratch for target executable
|
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue
|
|
||||||
|
|
||||||
RUN yum update -y && \
|
|
||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
|
||||||
lksctp-tools \
|
|
||||||
nettle \
|
|
||||||
net-tools \
|
|
||||||
iputils \
|
|
||||||
atlas \
|
|
||||||
libXpm \
|
|
||||||
libX11 \
|
|
||||||
libyaml && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue/bin
|
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/nr-uesoftmodem.Rel15 .
|
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libcoding.so .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libparams_libconfig.so .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc.so .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim.so .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so .
|
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_orig.so .
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
|
||||||
|
|
||||||
COPY --from=nr-ue-build /usr/local/lib/libprotobuf-c.so.1 .
|
|
||||||
|
|
||||||
COPY --from=nr-ue-build /lib64/libconfig.so.9 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libblas.so.3 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/liblapack.so.3 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/liblapacke.so.3 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libforms.so.2 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
|
||||||
RUN ldd /opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15
|
|
||||||
RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/librfsimulator.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
|
|
||||||
RUN ldd /usr/local/lib/libcoding.so
|
|
||||||
RUN ldd /usr/local/lib/libparams_libconfig.so
|
|
||||||
RUN ldd /usr/local/lib/libdfts.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc_optim.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc_optim8seg.so
|
|
||||||
RUN ldd /usr/local/lib/libldpc_orig.so
|
|
||||||
|
|
||||||
# Copy the relevant configuration files for eNB
|
|
||||||
WORKDIR /opt/oai-nr-ue/etc
|
|
||||||
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue
|
|
||||||
#CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
|
|
||||||
#ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
|
||||||
CMD ["sleep", "infinity"]
|
|
||||||
@@ -38,7 +38,7 @@ RUN yum install -y libasan
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address --noavx512
|
./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address --noavx512 -c
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim
|
||||||
|
|||||||
@@ -1,74 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL7 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
FROM registry.access.redhat.com/ubi7/ubi:latest AS ran-base
|
|
||||||
|
|
||||||
# Entitlements and RHSM configurations are Open-Shift Secret and ConfigMaps
|
|
||||||
# It is pre-requisite
|
|
||||||
RUN rm -Rf /etc/rhsm/ca /etc/pki/entitlement
|
|
||||||
# Copy the entitlements
|
|
||||||
COPY ./etc-pki-entitlement /etc/pki/entitlement
|
|
||||||
# Copy the subscription manager configurations
|
|
||||||
COPY ./rhsm-conf /etc/rhsm
|
|
||||||
COPY ./rhsm-ca /etc/rhsm/ca
|
|
||||||
|
|
||||||
|
|
||||||
#install developers pkg/repo
|
|
||||||
RUN rm /etc/rhsm-host && \
|
|
||||||
# Initialize /etc/yum.repos.d/redhat.repo
|
|
||||||
# See https://access.redhat.com/solutions/1443553
|
|
||||||
yum repolist --disablerepo=* && \
|
|
||||||
yum-config-manager --enable rhel-7-server-optional-rpms rhel-server-rhscl-7-rpms && \
|
|
||||||
yum update -y && \
|
|
||||||
yum install -y \
|
|
||||||
#gcc needed for build_oai
|
|
||||||
gcc gcc-c++ \
|
|
||||||
diffutils \
|
|
||||||
file \
|
|
||||||
psmisc \
|
|
||||||
git \
|
|
||||||
#unzip is needed for protobuf
|
|
||||||
unzip && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
# In some network environments, GIT proxy is required
|
|
||||||
RUN /bin/bash -c "if [[ -v NEEDED_GIT_PROXY ]]; then git config --global http.proxy $NEEDED_GIT_PROXY; fi"
|
|
||||||
|
|
||||||
#create the WORKDIR
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
#run build_oai -I to get the builder image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai -I
|
|
||||||
|
|
||||||
#as the image is public, we need to remove the subscription manager configurations
|
|
||||||
#RUN rm -Rf /etc/rhsm /etc/pki/entitlement
|
|
||||||
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for RHEL8 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest AS ran-base
|
|
||||||
|
|
||||||
# Entitlements and RHSM configurations are Open-Shift Secret and ConfigMaps
|
|
||||||
# It is pre-requisite
|
|
||||||
RUN rm -Rf /etc/rhsm/ca /etc/pki/entitlement
|
|
||||||
# Copy the entitlements
|
|
||||||
COPY ./etc-pki-entitlement /etc/pki/entitlement
|
|
||||||
# Copy the subscription manager configurations
|
|
||||||
COPY ./rhsm-conf /etc/rhsm
|
|
||||||
COPY ./rhsm-ca /etc/rhsm/ca
|
|
||||||
|
|
||||||
#install developers pkg/repo
|
|
||||||
RUN rm /etc/rhsm-host && \
|
|
||||||
# Initialize /etc/yum.repos.d/redhat.repo
|
|
||||||
# See https://access.redhat.com/solutions/1443553
|
|
||||||
yum repolist --disablerepo=* && \
|
|
||||||
subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms && \
|
|
||||||
yum update -y && \
|
|
||||||
yum install -y \
|
|
||||||
#gcc needed for build_oai
|
|
||||||
gcc gcc-c++ \
|
|
||||||
diffutils \
|
|
||||||
file \
|
|
||||||
psmisc \
|
|
||||||
git \
|
|
||||||
#unzip is needed for protobuf
|
|
||||||
unzip && \
|
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
|
||||||
|
|
||||||
# In some network environments, GIT proxy is required
|
|
||||||
RUN /bin/bash -c "if [[ -v NEEDED_GIT_PROXY ]]; then git config --global http.proxy $NEEDED_GIT_PROXY; fi"
|
|
||||||
|
|
||||||
#create the WORKDIR
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
#run build_oai -I to get the builder image
|
|
||||||
RUN /bin/sh oaienv && \
|
|
||||||
cd cmake_targets && \
|
|
||||||
mkdir -p log && \
|
|
||||||
./build_oai -I -w USRP
|
|
||||||
|
|
||||||
#as the image is public, we need to remove the subscription certificates
|
|
||||||
RUN rm -Rf /etc/pki/entitlement/*.pem
|
|
||||||
|
|
||||||
+1
-3
@@ -78,9 +78,7 @@ The currently-supported OS are:
|
|||||||
|
|
||||||
The currently-supported cluster version is:
|
The currently-supported cluster version is:
|
||||||
|
|
||||||
- `rhel8.2.oc4-4`
|
- `rhel8.2.oc4-9`
|
||||||
|
|
||||||
We have also `rhel7.oc4-4` support but it will be discontinued soon.
|
|
||||||
|
|
||||||
For more details in build within a Openshift Cluster, see [OpenShift README](../openshift/README.md) for more details.
|
For more details in build within a Openshift Cluster, see [OpenShift README](../openshift/README.md) for more details.
|
||||||
|
|
||||||
|
|||||||
@@ -32,11 +32,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: local_s_if_name
|
- key: local_s_if_name
|
||||||
@@ -75,11 +76,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: local_n_if_name
|
- key: local_n_if_name
|
||||||
@@ -136,11 +138,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: eutra_band
|
- key: eutra_band
|
||||||
@@ -187,11 +190,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: eutra_band
|
- key: eutra_band
|
||||||
@@ -226,11 +230,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: local_s_if_name
|
- key: local_s_if_name
|
||||||
@@ -271,11 +276,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: eutra_band
|
- key: eutra_band
|
||||||
@@ -316,11 +322,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: eutra_band
|
- key: eutra_band
|
||||||
@@ -361,11 +368,12 @@
|
|||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: eNB_name
|
- key: eNB_name
|
||||||
env: "@ENB_NAME@"
|
env: "@ENB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: eutra_band
|
- key: eutra_band
|
||||||
|
|||||||
@@ -82,47 +82,32 @@ def main():
|
|||||||
with open(f'{inputfile}', mode='r') as inputfile, \
|
with open(f'{inputfile}', mode='r') as inputfile, \
|
||||||
open(outputfile1, mode='w') as outputfile:
|
open(outputfile1, mode='w') as outputfile:
|
||||||
for line in inputfile:
|
for line in inputfile:
|
||||||
count = 0
|
|
||||||
if re.search(r'EHPLMN_LIST', line):
|
if re.search(r'EHPLMN_LIST', line):
|
||||||
outputfile.write(line)
|
outputfile.write(line)
|
||||||
continue
|
continue
|
||||||
if re.search(r'sd = 0x1;', line):
|
templine = line
|
||||||
templine = re.sub(r'sd = 0x1;', 'sd = 0x@NSSAI_SD0@;', line)
|
|
||||||
outputfile.write(templine)
|
|
||||||
continue
|
|
||||||
if re.search(r'sd = 0x010203;', line):
|
|
||||||
templine = re.sub(r'sd = 0x010203;', 'sd = 0x@NSSAI_SD0@;', line)
|
|
||||||
outputfile.write(templine)
|
|
||||||
continue
|
|
||||||
if re.search(r'sd = 0x112233;', line):
|
|
||||||
templine = re.sub(r'sd = 0x112233;', 'sd = 0x@NSSAI_SD1@;', line)
|
|
||||||
outputfile.write(templine)
|
|
||||||
continue
|
|
||||||
for key in config["config"]:
|
for key in config["config"]:
|
||||||
if line.find(key["key"]) >= 0:
|
if templine.find(key["key"]) >= 0:
|
||||||
count += 1
|
if re.search(r'preference', templine): # false positive
|
||||||
if re.search(r'preference', line):
|
continue
|
||||||
templine = line
|
if re.search(r'sdr_addrs', templine): # false positive
|
||||||
elif re.search(r'mnc_length', line) and key["key"] == "mnc":
|
|
||||||
continue
|
continue
|
||||||
elif re.search(r'plmn_list', line):
|
|
||||||
templine = re.sub(r'[0-9]+', '""', line)
|
|
||||||
templine = re.sub(r'\"\"', key["env"]["mcc"], templine, 1)
|
|
||||||
templine = re.sub(r'\"\"', key["env"]["mnc"], templine, 1)
|
|
||||||
templine = re.sub(r'\"\"', key["env"]["mnc_length"], templine, 1)
|
|
||||||
elif re.search('downlink_frequency', line):
|
elif re.search('downlink_frequency', line):
|
||||||
templine = re.sub(r'[0-9]+', key["env"], line)
|
templine = re.sub(r'[0-9]+', key["env"], line)
|
||||||
elif re.search('uplink_frequency_offset', line):
|
elif re.search('uplink_frequency_offset', line):
|
||||||
templine = re.sub(r'[0-9]+', key["env"], line)
|
templine = re.sub(r'[0-9]+', key["env"], line)
|
||||||
|
# next: matches key = ( "SOMETHING" ) or key = [ "SOMETHING" ]
|
||||||
elif re.search(r'"(.*?)"', line):
|
elif re.search(key["key"] + "\s*=\s*[\(\[]\s*\"[0-9.a-zA-Z:_-]+\"\s*[\)\]]", templine):
|
||||||
templine = re.sub(r'(?<=")[^"]*(?=")', key["env"], line)
|
templine = re.sub("(" + key["key"] + "\s*=\s*[\(\[]\s*\")[0-9.a-zA-Z:_-]+(\"[\)\]])",
|
||||||
elif re.search(r'[0-9]', line):
|
r'\1' + key["env"] + r"\2", templine)
|
||||||
templine = re.sub(r'\d+', key["env"], line)
|
# next: matches key = "SOMETHING" or key = [SOMETHING],
|
||||||
outputfile.write(templine)
|
elif re.search(key["key"] + "\s*=\s*[\"\[][0-9.a-zA-Z:_/-]+[\"\]]", templine):
|
||||||
|
templine = re.sub("(" + key["key"] + "\s*=\s*[\"\[])[0-9.a-zA-Z:_/-]+([\"\]])",
|
||||||
if count == 0:
|
r'\1' + key["env"] + r"\2", templine)
|
||||||
outputfile.write(line)
|
# next: matches key = NUMBER
|
||||||
|
elif re.search(key["key"] + "\s*=\s*[x0-9]+", templine): # x for "0x" hex start
|
||||||
|
templine = re.sub("(" + key["key"] + "\s*=\s*(?:0x)?)[x0-9]+", r"\1" + key["env"], templine)
|
||||||
|
outputfile.write(templine)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -32,11 +32,16 @@
|
|||||||
env: "@GNB_NAME@"
|
env: "@GNB_NAME@"
|
||||||
- key: gNB_name
|
- key: gNB_name
|
||||||
env: "@GNB_NAME@"
|
env: "@GNB_NAME@"
|
||||||
- key: plmn_list
|
- key: mcc
|
||||||
env:
|
env: "@MCC@"
|
||||||
mcc: "@MCC@"
|
- key: mnc
|
||||||
mnc: "@MNC@"
|
env: "@MNC@"
|
||||||
mnc_length: "@MNC_LENGTH@"
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
|
- key: sst
|
||||||
|
env: "@NSSAI_SST@"
|
||||||
|
- key: sd
|
||||||
|
env: "@NSSAI_SD@"
|
||||||
- key: tracking_area_code
|
- key: tracking_area_code
|
||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: enable_x2
|
- key: enable_x2
|
||||||
@@ -81,6 +86,8 @@
|
|||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: sst
|
- key: sst
|
||||||
env: "@NSSAI_SST@"
|
env: "@NSSAI_SST@"
|
||||||
|
- key: sd
|
||||||
|
env: "@NSSAI_SD@"
|
||||||
- key: ipv4
|
- key: ipv4
|
||||||
env: "@AMF_IP_ADDRESS@"
|
env: "@AMF_IP_ADDRESS@"
|
||||||
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
||||||
@@ -141,6 +148,8 @@
|
|||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: sst
|
- key: sst
|
||||||
env: "@NSSAI_SST@"
|
env: "@NSSAI_SST@"
|
||||||
|
- key: sd
|
||||||
|
env: "@NSSAI_SD@"
|
||||||
- key: ipv4
|
- key: ipv4
|
||||||
env: "@AMF_IP_ADDRESS@"
|
env: "@AMF_IP_ADDRESS@"
|
||||||
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
||||||
@@ -171,6 +180,8 @@
|
|||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: sst
|
- key: sst
|
||||||
env: "@NSSAI_SST@"
|
env: "@NSSAI_SST@"
|
||||||
|
- key: sd
|
||||||
|
env: "@NSSAI_SD@"
|
||||||
- key: ipv4
|
- key: ipv4
|
||||||
env: "@AMF_IP_ADDRESS@"
|
env: "@AMF_IP_ADDRESS@"
|
||||||
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
||||||
@@ -209,6 +220,8 @@
|
|||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: sst
|
- key: sst
|
||||||
env: "@NSSAI_SST@"
|
env: "@NSSAI_SST@"
|
||||||
|
- key: sd
|
||||||
|
env: "@NSSAI_SD@"
|
||||||
- key: ipv4
|
- key: ipv4
|
||||||
env: "@AMF_IP_ADDRESS@"
|
env: "@AMF_IP_ADDRESS@"
|
||||||
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
||||||
@@ -249,6 +262,8 @@
|
|||||||
env: "@TAC@"
|
env: "@TAC@"
|
||||||
- key: sst
|
- key: sst
|
||||||
env: "@NSSAI_SST@"
|
env: "@NSSAI_SST@"
|
||||||
|
- key: sd
|
||||||
|
env: "@NSSAI_SD@"
|
||||||
- key: ipv4
|
- key: ipv4
|
||||||
env: "@AMF_IP_ADDRESS@"
|
env: "@AMF_IP_ADDRESS@"
|
||||||
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
||||||
|
|||||||
@@ -509,8 +509,6 @@ int main( int argc, char **argv ) {
|
|||||||
*mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
|
*mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
init_symbol_rotation(&UE[CC_id]->frame_parms);
|
|
||||||
init_timeshift_rotation(&UE[CC_id]->frame_parms);
|
|
||||||
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -777,6 +777,7 @@ typedef struct {
|
|||||||
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
|
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
uint8_t ldpcBaseGraph;
|
||||||
uint32_t tbSizeLbrmBytes;
|
uint32_t tbSizeLbrmBytes;
|
||||||
}nfapi_v3_pdsch_maintenance_parameters_t;
|
}nfapi_v3_pdsch_maintenance_parameters_t;
|
||||||
|
|
||||||
@@ -1193,6 +1194,7 @@ typedef struct
|
|||||||
#define PUSCH_PDU_BITMAP_DFTS_OFDM 0x8
|
#define PUSCH_PDU_BITMAP_DFTS_OFDM 0x8
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
uint8_t ldpcBaseGraph;
|
||||||
uint32_t tbSizeLbrmBytes;
|
uint32_t tbSizeLbrmBytes;
|
||||||
}nfapi_v3_pusch_maintenance_parameters_t;
|
}nfapi_v3_pusch_maintenance_parameters_t;
|
||||||
|
|
||||||
|
|||||||
@@ -948,7 +948,11 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
|
|||||||
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
|
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
|
||||||
|
|
||||||
nr_init_frame_parms(gNB_config, fp);
|
nr_init_frame_parms(gNB_config, fp);
|
||||||
|
|
||||||
fp->ofdm_offset_divisor = UINT_MAX;
|
fp->ofdm_offset_divisor = UINT_MAX;
|
||||||
|
init_symbol_rotation(fp);
|
||||||
|
init_timeshift_rotation(fp);
|
||||||
|
|
||||||
gNB->configured = 1;
|
gNB->configured = 1;
|
||||||
LOG_I(PHY,"gNB configured\n");
|
LOG_I(PHY,"gNB configured\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -553,6 +553,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
|
|
||||||
init_nr_prach_tables(839);
|
init_nr_prach_tables(839);
|
||||||
init_symbol_rotation(fp);
|
init_symbol_rotation(fp);
|
||||||
|
init_timeshift_rotation(fp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
pil = pilot + idxDC / 2 - 1;
|
pil = pilot + idxDC / 2 - 1;
|
||||||
ul_ch += idxDC - 2 ;
|
ul_ch += idxDC - 2 ;
|
||||||
ul_ch = memset(ul_ch, 0, sizeof(*ul_ch)*5);
|
ul_ch = memset(ul_ch, 0, sizeof(*ul_ch)*5);
|
||||||
re_offset = (re_offset+idxDC-1) % symbolSize;
|
re_offset = (re_offset + idxDC - 2) % symbolSize;
|
||||||
const c16_t ch=c16mulShift(*pil,
|
const c16_t ch=c16mulShift(*pil,
|
||||||
rxdataF[soffset+nushift+re_offset],
|
rxdataF[soffset+nushift+re_offset],
|
||||||
15);
|
15);
|
||||||
|
|||||||
@@ -198,10 +198,10 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
int8_t cce_idx = reg_list_order[cce_count];
|
int8_t cce_idx = reg_list_order[cce_count];
|
||||||
|
|
||||||
for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx+=pdcch_pdu_rel15->DurationSymbols) {
|
for (int reg_in_cce_idx = symbol_idx; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx+=pdcch_pdu_rel15->DurationSymbols) {
|
||||||
|
|
||||||
k = cset_start_sc + cce_list[d][cce_idx].reg_list[reg_in_cce_idx].start_sc_idx;
|
k = cset_start_sc + cce_list[d][cce_idx].reg_list[reg_in_cce_idx].start_sc_idx;
|
||||||
LOG_D(PHY,"CCE %d REG %d k %d\n",cce_idx,reg_in_cce_idx+symbol_idx,k);
|
LOG_D(PHY,"CCE %d REG %d k %d\n",cce_idx,reg_in_cce_idx,k);
|
||||||
if (k >= frame_parms->ofdm_symbol_size)
|
if (k >= frame_parms->ofdm_symbol_size)
|
||||||
k -= frame_parms->ofdm_symbol_size;
|
k -= frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
|
|||||||
@@ -80,15 +80,15 @@ void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL]
|
|||||||
LOG_D(PHY, "cce_idx %d\n", cce->cce_idx);
|
LOG_D(PHY, "cce_idx %d\n", cce->cce_idx);
|
||||||
|
|
||||||
uint8_t j = cce->cce_idx;
|
uint8_t j = cce->cce_idx;
|
||||||
for (int k=6*j/bsize; k<(6*j/bsize+6/bsize); k++) { // loop over REG bundles
|
for (uint8_t bundle_idx=0; bundle_idx<NR_NB_REG_PER_CCE/bsize; bundle_idx++) {
|
||||||
|
uint8_t k = 6*j/bsize + bundle_idx;
|
||||||
int f = cce_to_reg_interleaving(R, k, n_shift, C, bsize, N_regs);
|
int f = cce_to_reg_interleaving(R, k, n_shift, C, bsize, N_regs);
|
||||||
|
|
||||||
for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) {
|
for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) {
|
||||||
reg = &cce->reg_list[reg_idx];
|
reg = &cce->reg_list[bundle_idx*bsize+reg_idx];
|
||||||
reg->reg_idx = bsize*f + reg_idx;
|
reg->reg_idx = bsize*f + reg_idx;
|
||||||
reg->start_sc_idx = (reg->reg_idx/dur) * NR_NB_SC_PER_RB;
|
reg->start_sc_idx = (reg->reg_idx/dur) * NR_NB_SC_PER_RB;
|
||||||
reg->symb_idx = reg_idx%dur;
|
reg->symb_idx = reg->reg_idx%dur;
|
||||||
LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
|
LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -375,14 +375,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
|||||||
memcpy(harq->b, a, (A / 8) + 3); // using 3 bytes to mimic the case of 24 bit crc
|
memcpy(harq->b, a, (A / 8) + 3); // using 3 bytes to mimic the case of 24 bit crc
|
||||||
}
|
}
|
||||||
|
|
||||||
// target_code_rate is in 0.1 units
|
impp.BG = rel15->maintenance_parms_v3.ldpcBaseGraph;
|
||||||
float Coderate = (float) rel15->targetCodeRate[0] / 10240.0f;
|
|
||||||
LOG_D(PHY,"DLSCH Coderate %f\n",Coderate);
|
|
||||||
|
|
||||||
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
|
|
||||||
impp.BG = 2;
|
|
||||||
else
|
|
||||||
impp.BG = 1;
|
|
||||||
|
|
||||||
start_meas(dlsch_segmentation_stats);
|
start_meas(dlsch_segmentation_stats);
|
||||||
impp.Kb = nr_segmentation(harq->b, harq->c, harq->B, &impp.n_segments, &impp.K, impp.Zc, &impp.F, impp.BG);
|
impp.Kb = nr_segmentation(harq->b, harq->c, harq->B, &impp.n_segments, &impp.K, impp.Zc, &impp.F, impp.BG);
|
||||||
|
|||||||
@@ -380,7 +380,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
uint32_t r;
|
uint32_t r;
|
||||||
uint32_t r_offset;
|
uint32_t r_offset;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
int kc;
|
|
||||||
int E;
|
int E;
|
||||||
int8_t llrProcBuf[22*384];
|
int8_t llrProcBuf[22*384];
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -462,8 +461,9 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, Coderate %f RV %d round %d\n",
|
LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, Coderate %f RV %d round %d\n",
|
||||||
harq_pid, A, G, mcs, n_layers, nb_rb, Qm, Coderate, pusch_pdu->pusch_data.rv_index, harq_process->round);
|
harq_pid, A, G, mcs, n_layers, nb_rb, Qm, Coderate, pusch_pdu->pusch_data.rv_index, harq_process->round);
|
||||||
|
|
||||||
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
|
p_decParams->BG = pusch_pdu->maintenance_parms_v3.ldpcBaseGraph;
|
||||||
p_decParams->BG = 2;
|
int kc;
|
||||||
|
if (p_decParams->BG == 2){
|
||||||
kc = 52;
|
kc = 52;
|
||||||
if (Coderate < 0.3333) {
|
if (Coderate < 0.3333) {
|
||||||
p_decParams->R = 15;
|
p_decParams->R = 15;
|
||||||
@@ -475,7 +475,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p_decParams->BG = 1;
|
|
||||||
kc = 68;
|
kc = 68;
|
||||||
if (Coderate < 0.6667) {
|
if (Coderate < 0.6667) {
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
|
|||||||
@@ -261,19 +261,20 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t calc_power_csirs(const uint16_t *x, const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu) {
|
uint32_t calc_power_csirs(const uint16_t *x, const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu)
|
||||||
|
{
|
||||||
uint64_t sum_x = 0;
|
uint64_t sum_x = 0;
|
||||||
uint64_t sum_x2 = 0;
|
uint64_t sum_x2 = 0;
|
||||||
uint16_t size = 0;
|
uint16_t size = 0;
|
||||||
for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
|
for (int rb = 0; rb < csirs_config_pdu->nr_of_rbs; rb++) {
|
||||||
if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
|
if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != ((rb + csirs_config_pdu->start_rb) % 2)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sum_x = sum_x + x[rb-csirs_config_pdu->start_rb];
|
sum_x = sum_x + x[rb];
|
||||||
sum_x2 = sum_x2 + x[rb]*x[rb-csirs_config_pdu->start_rb];
|
sum_x2 = sum_x2 + x[rb] * x[rb];
|
||||||
size++;
|
size++;
|
||||||
}
|
}
|
||||||
return sum_x2/size - (sum_x/size)*(sum_x/size);
|
return sum_x2 / size - (sum_x / size) * (sum_x / size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_csi_rs_channel_estimation(const PHY_VARS_NR_UE *ue,
|
int nr_csi_rs_channel_estimation(const PHY_VARS_NR_UE *ue,
|
||||||
|
|||||||
@@ -236,7 +236,6 @@ void nr_processDLSegment(void* arg) {
|
|||||||
int length_dec;
|
int length_dec;
|
||||||
int no_iteration_ldpc;
|
int no_iteration_ldpc;
|
||||||
int Kr;
|
int Kr;
|
||||||
int Kr_bytes;
|
|
||||||
int K_bits_F;
|
int K_bits_F;
|
||||||
uint8_t crc_type;
|
uint8_t crc_type;
|
||||||
int i;
|
int i;
|
||||||
@@ -259,8 +258,7 @@ void nr_processDLSegment(void* arg) {
|
|||||||
__m128i *pv = (__m128i*)&z;
|
__m128i *pv = (__m128i*)&z;
|
||||||
__m128i *pl = (__m128i*)&l;
|
__m128i *pl = (__m128i*)&l;
|
||||||
|
|
||||||
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
|
Kr = harq_process->K;
|
||||||
Kr_bytes = Kr>>3;
|
|
||||||
K_bits_F = Kr-harq_process->F;
|
K_bits_F = Kr-harq_process->F;
|
||||||
|
|
||||||
t_nrLDPC_time_stats procTime = {0};
|
t_nrLDPC_time_stats procTime = {0};
|
||||||
@@ -270,8 +268,7 @@ void nr_processDLSegment(void* arg) {
|
|||||||
start_meas(&rdata->ts_deinterleave);
|
start_meas(&rdata->ts_deinterleave);
|
||||||
|
|
||||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
|
||||||
int16_t w[E];
|
int16_t w[E];
|
||||||
memset(w, 0, sizeof(w));
|
|
||||||
nr_deinterleaving_ldpc(E,
|
nr_deinterleaving_ldpc(E,
|
||||||
Qm,
|
Qm,
|
||||||
w, // [hna] w is e
|
w, // [hna] w is e
|
||||||
@@ -298,7 +295,7 @@ void nr_processDLSegment(void* arg) {
|
|||||||
w,
|
w,
|
||||||
harq_process->C,
|
harq_process->C,
|
||||||
harq_process->rvidx,
|
harq_process->rvidx,
|
||||||
(harq_process->first_rx==1)?1:0,
|
harq_process->first_rx,
|
||||||
E,
|
E,
|
||||||
harq_process->F,
|
harq_process->F,
|
||||||
Kr-harq_process->F-2*(p_decoderParms->Z))==-1) {
|
Kr-harq_process->F-2*(p_decoderParms->Z))==-1) {
|
||||||
@@ -310,8 +307,6 @@ void nr_processDLSegment(void* arg) {
|
|||||||
}
|
}
|
||||||
stop_meas(&rdata->ts_rate_unmatch);
|
stop_meas(&rdata->ts_rate_unmatch);
|
||||||
|
|
||||||
r_offset += E;
|
|
||||||
|
|
||||||
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
|
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
|
||||||
LOG_D(PHY,"decoder input(segment %u) :",r);
|
LOG_D(PHY,"decoder input(segment %u) :",r);
|
||||||
|
|
||||||
@@ -321,8 +316,6 @@ void nr_processDLSegment(void* arg) {
|
|||||||
LOG_D(PHY,"\n");
|
LOG_D(PHY,"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(harq_process->c[r],0,Kr_bytes);
|
|
||||||
|
|
||||||
if (harq_process->C == 1) {
|
if (harq_process->C == 1) {
|
||||||
if (A > NR_MAX_PDSCH_TBS)
|
if (A > NR_MAX_PDSCH_TBS)
|
||||||
crc_type = CRC24_A;
|
crc_type = CRC24_A;
|
||||||
@@ -360,21 +353,23 @@ void nr_processDLSegment(void* arg) {
|
|||||||
&procTime);
|
&procTime);
|
||||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
|
LOG_D(PHY,"no_iteration_ldpc = %d\n", no_iteration_ldpc);
|
||||||
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
|
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
|
||||||
if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
|
if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
|
||||||
LOG_D(PHY,"Segment %u CRC OK\n",r);
|
LOG_D(PHY,"Segment %u CRC OK\n",r);
|
||||||
|
if (no_iteration_ldpc > dlsch->max_ldpc_iterations)
|
||||||
if (r==0) {
|
no_iteration_ldpc = dlsch->max_ldpc_iterations;
|
||||||
for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Temporary hack
|
|
||||||
no_iteration_ldpc = dlsch->max_ldpc_iterations;
|
|
||||||
rdata->decodeIterations = no_iteration_ldpc;
|
|
||||||
} else {
|
} else {
|
||||||
LOG_D(PHY,"CRC NOT OK\n");
|
LOG_D(PHY,"CRC NOT OK\n");
|
||||||
|
no_iteration_ldpc = dlsch->max_ldpc_iterations + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r==0) {
|
||||||
|
for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
rdata->decodeIterations = no_iteration_ldpc;
|
||||||
|
|
||||||
nb_total_decod++;
|
nb_total_decod++;
|
||||||
|
|
||||||
if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
|
if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
|
||||||
@@ -524,7 +519,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
|
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
|
||||||
LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
|
LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, harq_process->Z, harq_process->Nl);
|
||||||
}
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user