Merge remote-tracking branch 'origin/develop' into prb_based_dl_channel_estimation
Conflicts: cmake_targets/autotests/test_case_list.xml openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c openair1/SIMULATION/NR_PHY/ulsim.c targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band22.tm1.106PRB.adrv9371zc706.conf targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
This commit is contained in:
Regular → Executable
@@ -221,9 +221,9 @@ pipeline {
|
|||||||
archiveArtifacts artifacts: "physim_deploytest_logs_${env.BUILD_ID}.zip"
|
archiveArtifacts artifacts: "physim_deploytest_logs_${env.BUILD_ID}.zip"
|
||||||
}
|
}
|
||||||
if (fileExists("test_results.html")) {
|
if (fileExists("test_results.html")) {
|
||||||
sh "mv test_results.html test_results_${env.JOB_NAME}.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"
|
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"
|
archiveArtifacts artifacts: "test_results-${env.JOB_NAME}.html"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,304 @@
|
|||||||
|
#!/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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
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 phone resource
|
||||||
|
def ciSmartPhonesResource1 = params.SmartPhonesResource1
|
||||||
|
def ciSmartPhonesResource2 = params.SmartPhonesResource2
|
||||||
|
|
||||||
|
// Global Parameters. Populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository = "https://gitlab.eurecom.fr/oai/openairinterface5g.git"
|
||||||
|
def eNB_Branch = "develop"
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch = "develop"
|
||||||
|
def eNB_MR = "develop"
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: [[resource: ciSmartPhonesResource2]], resource: ciSmartPhonesResource1)
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
//retrieve latest commit ID from branch
|
||||||
|
latest_commit_from_branch= sh returnStdout: true, script: 'git log -1 origin/${eNB_Branch} | grep commit'
|
||||||
|
echo "Branch ${eNB_Branch}"
|
||||||
|
echo "${latest_commit_from_branch}"
|
||||||
|
tmp=latest_commit_from_branch.split()
|
||||||
|
echo "${tmp}"
|
||||||
|
eNB_CommitID = tmp[1]
|
||||||
|
echo "eNB_CommitID ${eNB_CommitID}"
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Commit : ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
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.SmartPhonesResource1 == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.SmartPhonesResource2 == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 1st eNB parameters
|
||||||
|
if (params.eNB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 2nd eNB parameters
|
||||||
|
if (params.eNB1_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB1_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB1_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 3rd eNB parameters
|
||||||
|
if (params.eNB2_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB2_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB2_Credentials == null) {
|
||||||
|
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_AllowMergeRequestProcess!= null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_AllowMergeRequestProcess
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
if (params.eNB_TargetBranch != null) {
|
||||||
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
} else {
|
||||||
|
eNB_TargetBranch = 'develop'
|
||||||
|
}
|
||||||
|
echo "eNB_TargetBranch : ${eNB_TargetBranch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.EPC_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Type == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.ADB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.ADB_Credentials == null) {
|
||||||
|
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 ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
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.eNB1_Credentials}", usernameVariable: 'eNB1_Username', passwordVariable: 'eNB1_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB2_Credentials}", usernameVariable: 'eNB2_Username', passwordVariable: 'eNB2_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']
|
||||||
|
]) {
|
||||||
|
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}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --eNB1IPAddress=${params.eNB1_IPAddress} --eNB1UserName=${eNB1_Username} --eNB1Password=${eNB1_Password} --eNB1SourceCodePath=${params.eNB1_SourceCodePath} --eNB2IPAddress=${params.eNB2_IPAddress} --eNB2UserName=${eNB2_Username} --eNB2Password=${eNB2_Password} --eNB2SourceCodePath=${params.eNB2_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}"
|
||||||
|
} 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') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Build)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Build)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Build)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/build.log.zip ./build.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
|
sh "mv ci-scripts/test_results.html test_results-${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 "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -37,7 +37,7 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
//retrieve MR that are opened nd with tag READY_TO_BE_MERGED
|
//retrieve MR that are opened nd with tag READY_TO_BE_MERGED
|
||||||
MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=READY_TO_BE_MERGED" | jq ".[].iid" || true '
|
MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq ".[].iid" || true '
|
||||||
echo "List of selected MR:\n${MR_LIST}"
|
echo "List of selected MR:\n${MR_LIST}"
|
||||||
def MR_ARRAY = MR_LIST.split('\n')
|
def MR_ARRAY = MR_LIST.split('\n')
|
||||||
//for every selected MR, retrieve the branch name and the latest commit
|
//for every selected MR, retrieve the branch name and the latest commit
|
||||||
@@ -48,7 +48,7 @@ pipeline {
|
|||||||
COMMIT_ID=COMMIT_ID.trim()
|
COMMIT_ID=COMMIT_ID.trim()
|
||||||
echo "Testing NSA on : ${MR} ${SRC_BRANCH} ${COMMIT_ID}"
|
echo "Testing NSA on : ${MR} ${SRC_BRANCH} ${COMMIT_ID}"
|
||||||
//calling NSA sub job
|
//calling NSA sub job
|
||||||
build job: "RAN-CI-NSA-B210", wait : false, propagate : false, parameters: [
|
build job: "RAN-CI-NSA-B210-N310-ModuleUE", wait : false, propagate : false, parameters: [
|
||||||
string(name: 'eNB_MR', value: String.valueOf(MR)),
|
string(name: 'eNB_MR', value: String.valueOf(MR)),
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
|
string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
|
string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
|
|
||||||
ranRepository : https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
ranRepository : https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||||
ranBranch : BRANCH_NAME
|
ranBranch : integration_2021_wk13_a
|
||||||
ranCommitID : COMMIT_ID
|
ranCommitID : 104aa7eed5d6702c1b9da663414079ef698da206
|
||||||
ranAllowMerge : 'true'
|
ranAllowMerge : 'yes'
|
||||||
ranTargetBranch : develop
|
ranTargetBranch : develop
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- InitiateHtml,none
|
- InitiateHtml,none
|
||||||
- TesteNB,xml_files/fr1_multi_node_build.xml
|
- TesteNB,xml_files/fr1_multi_node_build.xml
|
||||||
- TesteNB,xml_files/fr1_epc_start.xml
|
- TesteNB,xml_files/fr1_epc_start.xml
|
||||||
- TesteNB,xml_files/fr1_ran_ue_base.xml #ue toggle, nodes initialize, ue toggle, ping, nodes terminate
|
- TesteNB,xml_files/fr1_nsa_base_next.xml #ue toggle, nodes initialize, ue toggle, ping, nodes terminate
|
||||||
- TesteNB,xml_files/fr1_epc_closure.xml
|
- TesteNB,xml_files/fr1_epc_closure.xml
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#usage example:
|
||||||
|
#sudo python3 ci_ctl_qtel.py /dev/ttyUSB2 wup
|
||||||
|
#sudo python3 ci_ctl_qtel.py /dev/ttyUSB2 detach
|
||||||
|
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import serial
|
||||||
|
|
||||||
|
|
||||||
|
class qtel_ctl:
|
||||||
|
#---------------
|
||||||
|
#private methods
|
||||||
|
#---------------
|
||||||
|
def __init__(self, usb_port_at):
|
||||||
|
self.QUECTEL_USB_PORT_AT = usb_port_at #ex : '/dev/ttyUSB2'
|
||||||
|
self.modem = serial.Serial(self.QUECTEL_USB_PORT_AT, timeout=1)
|
||||||
|
self.cmd_dict= {"wup": self.wup,"detach":self.detach}#dictionary of function pointers
|
||||||
|
|
||||||
|
def __set_modem_state(self,ser,state):
|
||||||
|
self.__send_command(ser,"AT+CFUN={}\r".format(state))
|
||||||
|
|
||||||
|
def __send_command(self,ser,com):
|
||||||
|
ser.write(com.encode())
|
||||||
|
time.sleep(0.1)
|
||||||
|
ret=[]
|
||||||
|
while ser.inWaiting()>0:
|
||||||
|
print("waiting")
|
||||||
|
msg=ser.readline()
|
||||||
|
msg=msg.decode("utf-8")
|
||||||
|
msg=msg.replace("\r","")
|
||||||
|
msg=msg.replace("\n","")
|
||||||
|
print(msg)
|
||||||
|
if msg!="":
|
||||||
|
ret.append(msg)
|
||||||
|
else:
|
||||||
|
print("msg empty")
|
||||||
|
return ret
|
||||||
|
|
||||||
|
#--------------
|
||||||
|
#public methods
|
||||||
|
#--------------
|
||||||
|
def wup(self):#sending AT+CFUN=0, then AT+CFUN=1
|
||||||
|
self.__set_modem_state(self.modem,'0')
|
||||||
|
time.sleep(3)
|
||||||
|
self.__set_modem_state(self.modem,'1')
|
||||||
|
|
||||||
|
def detach(self):#sending AT+CFUN=0
|
||||||
|
self.__set_modem_state(self.modem,'0')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
#argv[1] : usb port
|
||||||
|
#argv[2] : qtel command (see function pointers dict "wup", "detach" etc ...)
|
||||||
|
command = sys.argv[2]
|
||||||
|
Module=qtel_ctl(sys.argv[1])
|
||||||
|
#calling the function to be applied
|
||||||
|
Module.cmd_dict[command]()
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
idefix:
|
||||||
|
ID: idefix
|
||||||
|
State : enabled
|
||||||
|
Kind : quectel
|
||||||
|
Process :
|
||||||
|
Name : quectel-CM
|
||||||
|
Cmd : /home/oaicicd/quectel-CM/quectel-CM -s oai.ipv4 -4
|
||||||
|
WakeupScript : ci_ctl_qtel.py /dev/ttyUSB2 wup
|
||||||
|
DetachScript : ci_ctl_qtel.py /dev/ttyUSB2 detach
|
||||||
|
PLMN : 22201
|
||||||
|
UENetwork : enxb22a941dbf00
|
||||||
|
HostIPAddress : 192.168.18.188
|
||||||
|
HostUsername : oaicicd
|
||||||
|
HostPassword : oaicicd
|
||||||
|
HostSourceCodePath : none
|
||||||
|
dummy:
|
||||||
|
ID: ''
|
||||||
|
State : ''
|
||||||
|
Kind : ''
|
||||||
|
Process :
|
||||||
|
Name : ''
|
||||||
|
Cmd : ''
|
||||||
|
WakeupScript : ''
|
||||||
|
DetachScript : ''
|
||||||
|
PLMN : 22201
|
||||||
|
UENetwork : wwan0
|
||||||
|
HostIPAddress : 192.168.18.188
|
||||||
|
HostUsername : oaicicd
|
||||||
|
HostPassword : oaicicd
|
||||||
|
HostSourceCodePath : none
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#to use isfile
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
#to create a SSH object locally in the methods
|
||||||
|
import sshconnection
|
||||||
|
#time.sleep
|
||||||
|
import time
|
||||||
|
#to load ue infrastructure dictionary
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
class InfraUE:
|
||||||
|
def __init__(self):
|
||||||
|
self.ci_ue_infra ={}
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------$
|
||||||
|
#PUBLIC Methods$
|
||||||
|
#-----------------$
|
||||||
|
|
||||||
|
#This method reads the yaml file describing the multi-UE infrastructure
|
||||||
|
#and stores the infra permanently in the related class attribute self.ci_ue_infra
|
||||||
|
def Get_UE_Infra(self,ue_infra_filename):
|
||||||
|
f_yaml=ue_infra_filename
|
||||||
|
with open(f_yaml,'r') as file:
|
||||||
|
logging.debug('Loading UE infrastructure from file '+f_yaml)
|
||||||
|
#load it permanently in the class attribute
|
||||||
|
self.ci_ue_infra = yaml.load(file,Loader=yaml.FullLoader)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -162,7 +162,7 @@ class Containerize():
|
|||||||
# on RedHat/CentOS .git extension is mandatory
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
full_ran_repo_name = self.ranRepository
|
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('mkdir -p ' + lSourcePath, '\$', 5)
|
mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
|
||||||
@@ -176,7 +176,7 @@ class Containerize():
|
|||||||
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 != '':
|
||||||
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||||
# if the branch is not develop, then it is a merge request and we need to do
|
# 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
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
imageTag = 'develop'
|
imageTag = 'develop'
|
||||||
|
|||||||
@@ -0,0 +1,132 @@
|
|||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#to use isfile
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
#to create a SSH object locally in the methods
|
||||||
|
import sshconnection
|
||||||
|
#time.sleep
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Module_UE:
|
||||||
|
|
||||||
|
def __init__(self,Module):
|
||||||
|
#create attributes as in the Module dictionary
|
||||||
|
for k, v in Module.items():
|
||||||
|
setattr(self, k, v)
|
||||||
|
self.UEIPAddress = ""
|
||||||
|
#dictionary linking command names and related module scripts
|
||||||
|
self.cmd_dict= {"wup": self.WakeupScript,"detach":self.DetachScript}#dictionary of function scripts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------$
|
||||||
|
#PUBLIC Methods$
|
||||||
|
#-----------------$
|
||||||
|
|
||||||
|
#this method checks if the specified Process is running on the server hosting the module
|
||||||
|
#if not it will be started
|
||||||
|
def CheckCMProcess(self):
|
||||||
|
HOST=self.HostIPAddress
|
||||||
|
COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep "
|
||||||
|
logging.debug(COMMAND)
|
||||||
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
|
result = ssh.stdout.readlines()
|
||||||
|
if len(result)!=0:
|
||||||
|
logging.debug(self.Process['Name'] + " process found")
|
||||||
|
return True
|
||||||
|
else:#start process and check again
|
||||||
|
logging.debug(self.Process['Name'] + " process NOT found")
|
||||||
|
#starting the process
|
||||||
|
logging.debug('Starting ' + self.Process['Name'])
|
||||||
|
mySSH = sshconnection.SSHConnection()
|
||||||
|
mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword)
|
||||||
|
mySSH.command('echo ' + self.HostPassword + ' | sudo -S ' + self.Process['Cmd'] + ' &','\$',5)
|
||||||
|
mySSH.close()
|
||||||
|
#checking the process
|
||||||
|
HOST=self.HostIPAddress
|
||||||
|
COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep "
|
||||||
|
logging.debug(COMMAND)
|
||||||
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
|
result = ssh.stdout.readlines()
|
||||||
|
if len(result)!=0:
|
||||||
|
logging.debug(self.Process['Name'] + " process found")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
logging.debug(self.Process['Name'] + " process NOT found")
|
||||||
|
return False
|
||||||
|
|
||||||
|
#Generic command function, using function pointers dictionary
|
||||||
|
def Command(self,cmd):
|
||||||
|
mySSH = sshconnection.SSHConnection()
|
||||||
|
mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword)
|
||||||
|
mySSH.command('echo ' + self.HostPassword + ' | sudo -S python3 ' + self.cmd_dict[cmd],'\$',10)
|
||||||
|
time.sleep(5)
|
||||||
|
logging.debug("Module "+ cmd)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
|
||||||
|
#this method retrieves the Module IP address (not the Host IP address)
|
||||||
|
def GetModuleIPAddress(self):
|
||||||
|
HOST=self.HostIPAddress
|
||||||
|
response= []
|
||||||
|
tentative = 10
|
||||||
|
while (len(response)==0) and (tentative>0):
|
||||||
|
COMMAND="ip a show dev " + self.UENetwork + " | grep inet | grep " + self.UENetwork
|
||||||
|
logging.debug(COMMAND)
|
||||||
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
|
response = ssh.stdout.readlines()
|
||||||
|
tentative-=1
|
||||||
|
time.sleep(10)
|
||||||
|
if (tentative==0) and (len(response)==0):
|
||||||
|
logging.debug('\u001B[1;37;41m Module IP Address Not Found! Time expired \u001B[0m')
|
||||||
|
return -1
|
||||||
|
else: #check response
|
||||||
|
result = re.search('inet (?P<moduleipaddress>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', response[0].decode("utf-8") )
|
||||||
|
if result is not None:
|
||||||
|
if result.group('moduleipaddress') is not None:
|
||||||
|
self.UEIPAddress = result.group('moduleipaddress')
|
||||||
|
logging.debug('\u001B[1mUE Module IP Address is ' + self.UEIPAddress + '\u001B[0m')
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
logging.debug('\u001B[1;37;41m Module IP Address Not Found! \u001B[0m')
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
logging.debug('\u001B[1;37;41m Module IP Address Not Found! \u001B[0m')
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
+252
-116
@@ -54,7 +54,8 @@ import helpreadme as HELP
|
|||||||
import constants as CONST
|
import constants as CONST
|
||||||
import sshconnection
|
import sshconnection
|
||||||
|
|
||||||
|
import cls_module_ue
|
||||||
|
import cls_ci_ueinfra #class defining the multi Ue infrastrucure
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -129,6 +130,7 @@ class OaiCiTest():
|
|||||||
self.iperf_packetloss_threshold = ''
|
self.iperf_packetloss_threshold = ''
|
||||||
self.iperf_profile = ''
|
self.iperf_profile = ''
|
||||||
self.iperf_options = ''
|
self.iperf_options = ''
|
||||||
|
self.iperf_direction = ''
|
||||||
self.nbMaxUEtoAttach = -1
|
self.nbMaxUEtoAttach = -1
|
||||||
self.UEDevices = []
|
self.UEDevices = []
|
||||||
self.UEDevicesStatus = []
|
self.UEDevicesStatus = []
|
||||||
@@ -157,6 +159,7 @@ class OaiCiTest():
|
|||||||
self.clean_repository = True
|
self.clean_repository = True
|
||||||
self.air_interface=''
|
self.air_interface=''
|
||||||
self.expectedNbOfConnectedUEs = 0
|
self.expectedNbOfConnectedUEs = 0
|
||||||
|
self.ue_id = '' #used for module identification
|
||||||
|
|
||||||
|
|
||||||
def BuildOAIUE(self,HTML):
|
def BuildOAIUE(self,HTML):
|
||||||
@@ -174,7 +177,7 @@ class OaiCiTest():
|
|||||||
ue_prefix = ''
|
ue_prefix = ''
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
full_ran_repo_name = self.ranRepository
|
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'
|
||||||
SSH.command('mkdir -p ' + self.UESourceCodePath, '\$', 5)
|
SSH.command('mkdir -p ' + self.UESourceCodePath, '\$', 5)
|
||||||
@@ -217,7 +220,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
# 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 != '':
|
||||||
SSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
SSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||||
# if the branch is not develop, then it is a merge request and we need to do
|
# 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
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
if self.ranAllowMerge:
|
if self.ranAllowMerge:
|
||||||
@@ -364,29 +367,44 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def InitializeUE(self,HTML,COTS_UE):
|
def InitializeUE(self,HTML,RAN,EPC, COTS_UE, InfraUE):
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
||||||
HELP.GenericHelp(CONST.Version)
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
sys.exit('Insufficient Parameter')
|
HELP.GenericHelp(CONST.Version)
|
||||||
multi_jobs = []
|
sys.exit('Insufficient Parameter')
|
||||||
i = 0
|
multi_jobs = []
|
||||||
for device_id in self.UEDevices:
|
i = 0
|
||||||
p = Process(target = self.InitializeUE_common, args = (device_id,i,COTS_UE,))
|
for device_id in self.UEDevices:
|
||||||
p.daemon = True
|
p = Process(target = self.InitializeUE_common, args = (device_id,i,COTS_UE,))
|
||||||
p.start()
|
p.daemon = True
|
||||||
multi_jobs.append(p)
|
p.start()
|
||||||
i += 1
|
multi_jobs.append(p)
|
||||||
for job in multi_jobs:
|
i += 1
|
||||||
job.join()
|
for job in multi_jobs:
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
job.join()
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else: #if an ID is specified, it is a module from the yaml infrastructure file
|
||||||
|
#RH
|
||||||
|
Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
|
||||||
|
is_module=Module_UE.CheckCMProcess()
|
||||||
|
if is_module:
|
||||||
|
Module_UE.Command("wup")
|
||||||
|
status=Module_UE.GetModuleIPAddress()
|
||||||
|
if status==0:
|
||||||
|
HTML.CreateHtmlTestRow(Module_UE.UEIPAddress, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
logging.debug('UE IP addresss : '+ Module_UE.UEIPAddress)
|
||||||
|
else: #status==-1 failed to retrieve IP address
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def InitializeOAIUE(self,HTML,RAN,EPC,COTS_UE):
|
def InitializeOAIUE(self,HTML,RAN,EPC,COTS_UE):
|
||||||
if self.UEIPAddress == '' or self.UEUserName == '' or self.UEPassword == '' or self.UESourceCodePath == '':
|
if self.UEIPAddress == '' or self.UEUserName == '' or self.UEPassword == '' or self.UESourceCodePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
|
|
||||||
|
|
||||||
if self.air_interface == 'lte-uesoftmodem':
|
if self.air_interface == 'lte-uesoftmodem':
|
||||||
result = re.search('--no-L2-connect', str(self.Initialize_OAI_UE_args))
|
result = re.search('--no-L2-connect', str(self.Initialize_OAI_UE_args))
|
||||||
if result is None:
|
if result is None:
|
||||||
@@ -403,13 +421,13 @@ class OaiCiTest():
|
|||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
SSH.open(self.UEIPAddress, self.UEUserName, self.UEPassword)
|
SSH.open(self.UEIPAddress, self.UEUserName, self.UEPassword)
|
||||||
# b2xx_fx3_utils reset procedure
|
# b2xx_fx3_utils reset procedure
|
||||||
SSH.command('echo ' + self.UEPassword + ' | sudo -S uhd_find_devices', '\$', 60)
|
SSH.command('echo ' + self.UEPassword + ' | sudo -S uhd_find_devices', '\$', 90)
|
||||||
result = re.search('type: b200', SSH.getBefore())
|
result = re.search('type: b200', SSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
logging.debug('Found a B2xx device --> resetting it')
|
logging.debug('Found a B2xx device --> resetting it')
|
||||||
SSH.command('echo ' + self.UEPassword + ' | sudo -S b2xx_fx3_utils --reset-device', '\$', 10)
|
SSH.command('echo ' + self.UEPassword + ' | sudo -S b2xx_fx3_utils --reset-device', '\$', 10)
|
||||||
# Reloading FGPA bin firmware
|
# Reloading FGPA bin firmware
|
||||||
SSH.command('echo ' + self.UEPassword + ' | sudo -S uhd_find_devices', '\$', 60)
|
SSH.command('echo ' + self.UEPassword + ' | sudo -S uhd_find_devices', '\$', 90)
|
||||||
result = re.search('type: n3xx', str(SSH.getBefore()))
|
result = re.search('type: n3xx', str(SSH.getBefore()))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
logging.debug('Found a N3xx device --> resetting it')
|
logging.debug('Found a N3xx device --> resetting it')
|
||||||
@@ -945,30 +963,31 @@ class OaiCiTest():
|
|||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def AttachUE(self,HTML,RAN,EPC,COTS_UE):
|
def AttachUE(self,HTML,RAN,EPC,COTS_UE):
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
||||||
HELP.GenericHelp(CONST.Version)
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
sys.exit('Insufficient Parameter')
|
HELP.GenericHelp(CONST.Version)
|
||||||
check_eNB = True
|
sys.exit('Insufficient Parameter')
|
||||||
check_OAI_UE = False
|
check_eNB = True
|
||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
check_OAI_UE = False
|
||||||
if (pStatus < 0):
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
if (pStatus < 0):
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
return
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
multi_jobs = []
|
return
|
||||||
status_queue = SimpleQueue()
|
multi_jobs = []
|
||||||
lock = Lock()
|
status_queue = SimpleQueue()
|
||||||
nb_ue_to_connect = 0
|
lock = Lock()
|
||||||
for device_id in self.UEDevices:
|
nb_ue_to_connect = 0
|
||||||
if (self.nbMaxUEtoAttach == -1) or (nb_ue_to_connect < self.nbMaxUEtoAttach):
|
for device_id in self.UEDevices:
|
||||||
self.UEDevicesStatus[nb_ue_to_connect] = CONST.UE_STATUS_ATTACHING
|
if (self.nbMaxUEtoAttach == -1) or (nb_ue_to_connect < self.nbMaxUEtoAttach):
|
||||||
p = Process(target = self.AttachUE_common, args = (device_id, status_queue, lock,nb_ue_to_connect,COTS_UE,))
|
self.UEDevicesStatus[nb_ue_to_connect] = CONST.UE_STATUS_ATTACHING
|
||||||
p.daemon = True
|
p = Process(target = self.AttachUE_common, args = (device_id, status_queue, lock,nb_ue_to_connect,COTS_UE,))
|
||||||
p.start()
|
p.daemon = True
|
||||||
multi_jobs.append(p)
|
p.start()
|
||||||
nb_ue_to_connect = nb_ue_to_connect + 1
|
multi_jobs.append(p)
|
||||||
for job in multi_jobs:
|
nb_ue_to_connect = nb_ue_to_connect + 1
|
||||||
job.join()
|
for job in multi_jobs:
|
||||||
|
job.join()
|
||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
@@ -1025,37 +1044,44 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def DetachUE(self,HTML,RAN,EPC,COTS_UE):
|
def DetachUE(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
||||||
HELP.GenericHelp(CONST.Version)
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
sys.exit('Insufficient Parameter')
|
HELP.GenericHelp(CONST.Version)
|
||||||
check_eNB = True
|
sys.exit('Insufficient Parameter')
|
||||||
check_OAI_UE = False
|
check_eNB = True
|
||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
check_OAI_UE = False
|
||||||
if (pStatus < 0):
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
if (pStatus < 0):
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
return
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
multi_jobs = []
|
return
|
||||||
cnt = 0
|
multi_jobs = []
|
||||||
for device_id in self.UEDevices:
|
cnt = 0
|
||||||
self.UEDevicesStatus[cnt] = CONST.UE_STATUS_DETACHING
|
for device_id in self.UEDevices:
|
||||||
p = Process(target = self.DetachUE_common, args = (device_id,cnt,COTS_UE,))
|
self.UEDevicesStatus[cnt] = CONST.UE_STATUS_DETACHING
|
||||||
p.daemon = True
|
p = Process(target = self.DetachUE_common, args = (device_id,cnt,COTS_UE,))
|
||||||
p.start()
|
p.daemon = True
|
||||||
multi_jobs.append(p)
|
p.start()
|
||||||
cnt += 1
|
multi_jobs.append(p)
|
||||||
for job in multi_jobs:
|
cnt += 1
|
||||||
job.join()
|
for job in multi_jobs:
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
job.join()
|
||||||
result = re.search('T_stdout', str(RAN.Initialize_eNB_args))
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
if result is not None:
|
result = re.search('T_stdout', str(RAN.Initialize_eNB_args))
|
||||||
logging.debug('Waiting 5 seconds to fill up record file')
|
if result is not None:
|
||||||
time.sleep(5)
|
logging.debug('Waiting 5 seconds to fill up record file')
|
||||||
cnt = 0
|
time.sleep(5)
|
||||||
while cnt < len(self.UEDevices):
|
cnt = 0
|
||||||
self.UEDevicesStatus[cnt] = CONST.UE_STATUS_DETACHED
|
while cnt < len(self.UEDevices):
|
||||||
cnt += 1
|
self.UEDevicesStatus[cnt] = CONST.UE_STATUS_DETACHED
|
||||||
|
cnt += 1
|
||||||
|
else:#if an ID is specified, it is a module from the yaml infrastructure file
|
||||||
|
Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
|
||||||
|
Module_UE.Command("detach")
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def RebootUE_common(self, device_id):
|
def RebootUE_common(self, device_id):
|
||||||
try:
|
try:
|
||||||
@@ -1437,14 +1463,20 @@ class OaiCiTest():
|
|||||||
statusQueue.put(message)
|
statusQueue.put(message)
|
||||||
lock.release()
|
lock.release()
|
||||||
|
|
||||||
def Ping_common(self, lock, UE_IPAddress, device_id, statusQueue,EPC):
|
def Ping_common(self, lock, UE_IPAddress, device_id, statusQueue,EPC, Module_UE):
|
||||||
try:
|
try:
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
# Launch ping on the EPC side (true for ltebox and old open-air-cn)
|
# Launch ping on the EPC side (true for ltebox and old open-air-cn)
|
||||||
# But for OAI-Rel14-CUPS, we launch from python executor
|
# But for OAI-Rel14-CUPS, we launch from python executor
|
||||||
launchFromEpc = True
|
launchFromEpc = True
|
||||||
|
launchFromModule = False
|
||||||
if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
|
||||||
launchFromEpc = False
|
launchFromEpc = False
|
||||||
|
#if module, ping from module to EPC
|
||||||
|
if self.ue_id!='':
|
||||||
|
launchFromEpc = False
|
||||||
|
launchfromModule = True
|
||||||
|
|
||||||
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
||||||
|
|
||||||
if launchFromEpc:
|
if launchFromEpc:
|
||||||
@@ -1462,21 +1494,34 @@ class OaiCiTest():
|
|||||||
#copy the ping log file to have it locally for analysis (ping stats)
|
#copy the ping log file to have it locally for analysis (ping stats)
|
||||||
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
else:
|
else:
|
||||||
#ping log file is on the python executor
|
if launchfromModule == False:
|
||||||
cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log'
|
#ping log file is on the python executor
|
||||||
message = cmd + '\n'
|
cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
logging.debug(cmd)
|
message = cmd + '\n'
|
||||||
ret = subprocess.run(cmd, shell=True)
|
logging.debug(cmd)
|
||||||
ping_status = ret.returncode
|
ret = subprocess.run(cmd, shell=True)
|
||||||
#copy the ping log file to an other folder for log collection (source and destination are EPC)
|
ping_status = ret.returncode
|
||||||
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'ping_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
#copy the ping log file to an other folder for log collection (source and destination are EPC)
|
||||||
#copy the ping log file to have it locally for analysis (ping stats)
|
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'ping_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
||||||
logging.debug(EPC.SourceCodePath + 'ping_' + self.testCase_id + '_' + device_id + '.log')
|
#copy the ping log file to have it locally for analysis (ping stats)
|
||||||
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath +'/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
logging.debug(EPC.SourceCodePath + 'ping_' + self.testCase_id + '_' + device_id + '.log')
|
||||||
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath +'/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
|
|
||||||
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
|
#cat is executed on EPC
|
||||||
|
SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
|
else: #launch from Module
|
||||||
|
SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
|
||||||
|
#ping from module NIC rather than IP address to make sure round trip is over the air
|
||||||
|
cmd = 'ping -I ' + Module_UE.UENetwork + ' ' + self.ping_args + ' ' + EPC.IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',int(ping_time[0])*1.5)
|
||||||
|
#copy the ping log file to have it locally for analysis (ping stats)
|
||||||
|
SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, 'ping_' + self.testCase_id + '_' + self.ue_id + '.log', '.')
|
||||||
|
|
||||||
|
#cat is executed locally
|
||||||
|
SSH.command('cat ping_' + self.testCase_id + '_' + self.ue_id + '.log', '\$', 5)
|
||||||
|
ping_status=0
|
||||||
|
|
||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
|
||||||
#cat is executed on EPC
|
|
||||||
SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
|
||||||
# TIMEOUT CASE
|
# TIMEOUT CASE
|
||||||
if ping_status < 0:
|
if ping_status < 0:
|
||||||
message = 'Ping with UE (' + str(UE_IPAddress) + ') crashed due to TIMEOUT!'
|
message = 'Ping with UE (' + str(UE_IPAddress) + ') crashed due to TIMEOUT!'
|
||||||
@@ -1660,7 +1705,7 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def Ping(self,HTML,RAN,EPC,COTS_UE):
|
def Ping(self,HTML,RAN,EPC,COTS_UE, InfraUE):
|
||||||
result = re.search('noS1', str(RAN.Initialize_eNB_args))
|
result = re.search('noS1', str(RAN.Initialize_eNB_args))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
self.PingNoS1(HTML,RAN,EPC,COTS_UE)
|
self.PingNoS1(HTML,RAN,EPC,COTS_UE)
|
||||||
@@ -1678,18 +1723,30 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
|
||||||
if (ueIpStatus < 0):
|
if self.ue_id=="":
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra['dummy']) #RH, temporary, we need a dummy Module_UE object to pass to Ping_common
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
return
|
if (ueIpStatus < 0):
|
||||||
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.UEIPAddresses=[]
|
||||||
|
Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
|
||||||
|
Module_UE.GetModuleIPAddress()
|
||||||
|
self.UEIPAddresses.append(Module_UE.UEIPAddress)
|
||||||
|
logging.debug(self.UEIPAddresses)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
i = 0
|
i = 0
|
||||||
lock = Lock()
|
lock = Lock()
|
||||||
status_queue = SimpleQueue()
|
status_queue = SimpleQueue()
|
||||||
for UE_IPAddress in self.UEIPAddresses:
|
for UE_IPAddress in self.UEIPAddresses:
|
||||||
device_id = self.UEDevices[i]
|
if self.ue_id=="":
|
||||||
p = Process(target = self.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,EPC,))
|
device_id = self.UEDevices[i]
|
||||||
|
else:
|
||||||
|
device_id = Module_UE.ID + "-" + Module_UE.Kind
|
||||||
|
p = Process(target = self.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,EPC,Module_UE,))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -1864,8 +1921,8 @@ class OaiCiTest():
|
|||||||
else:
|
else:
|
||||||
return -2
|
return -2
|
||||||
|
|
||||||
def Iperf_analyzeV2Server(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options):
|
def Iperf_analyzeV2Server(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options, filename,type):
|
||||||
if (not os.path.isfile('iperf_server_' + self.testCase_id + '_' + device_id + '.log')):
|
if (not os.path.isfile(filename)):
|
||||||
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
|
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
|
||||||
return
|
return
|
||||||
# Computing the requested bandwidth in float
|
# Computing the requested bandwidth in float
|
||||||
@@ -1890,14 +1947,18 @@ class OaiCiTest():
|
|||||||
req_bandwidth = '%.1f Gbits/sec' % req_bw
|
req_bandwidth = '%.1f Gbits/sec' % req_bw
|
||||||
req_bw = req_bw * 1000000000
|
req_bw = req_bw * 1000000000
|
||||||
|
|
||||||
server_file = open('iperf_server_' + self.testCase_id + '_' + device_id + '.log', 'r')
|
server_file = open(filename, 'r')
|
||||||
br_sum = 0.0
|
br_sum = 0.0
|
||||||
ji_sum = 0.0
|
ji_sum = 0.0
|
||||||
pl_sum = 0
|
pl_sum = 0
|
||||||
ps_sum = 0
|
ps_sum = 0
|
||||||
row_idx = 0
|
row_idx = 0
|
||||||
for line in server_file.readlines():
|
for line in server_file.readlines():
|
||||||
result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(?P<lostPack>[0-9]+)/ +(?P<sentPack>[0-9]+)', str(line))
|
if type==0:
|
||||||
|
result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(?P<lostPack>[0-9]+)/ +(?P<sentPack>[0-9]+)', str(line))
|
||||||
|
else:
|
||||||
|
result = re.search('^\[ \d\].+ +(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(?P<lostPack>[0-9]+)\/(?P<sentPack>[0-9]+)', str(line))
|
||||||
|
|
||||||
if result is not None:
|
if result is not None:
|
||||||
bitrate = result.group('bitrate')
|
bitrate = result.group('bitrate')
|
||||||
jitter = result.group('jitter')
|
jitter = result.group('jitter')
|
||||||
@@ -2127,12 +2188,65 @@ class OaiCiTest():
|
|||||||
SSH.command('docker cp prod-trf-gen:/iperf-2.0.5/iperf_server_' + self.testCase_id + '_' + device_id + '.log ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
SSH.command('docker cp prod-trf-gen:/iperf-2.0.5/iperf_server_' + self.testCase_id + '_' + device_id + '.log ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath+ '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath+ '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
filename='iperf_server_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options,filename,0)
|
||||||
# in case of OAI-UE
|
# in case of OAI-UE
|
||||||
if (device_id == 'OAI-UE'):
|
if (device_id == 'OAI-UE'):
|
||||||
SSH.copyin(self.UEIPAddress, self.UEUserName, self.UEPassword, self.UESourceCodePath + '/cmake_targets/iperf_' + self.testCase_id + '_' + device_id + '.log', '.')
|
SSH.copyin(self.UEIPAddress, self.UEUserName, self.UEPassword, self.UESourceCodePath + '/cmake_targets/iperf_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'iperf_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'iperf_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
||||||
|
|
||||||
|
|
||||||
|
def Iperf_Module(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue,EPC, Module_UE):
|
||||||
|
SSH = sshconnection.SSHConnection()
|
||||||
|
iperf_time = self.Iperf_ComputeTime()
|
||||||
|
if self.iperf_direction=="DL":
|
||||||
|
logging.debug("Iperf for Module in DL mode detected")
|
||||||
|
#server side UE
|
||||||
|
SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
|
||||||
|
cmd = 'rm iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',5)
|
||||||
|
cmd = 'echo $USER; nohup /opt/iperf-2.0.10/iperf -s -B ' + UE_IPAddress + ' -u 2>&1 > iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',5)
|
||||||
|
#client side EPC
|
||||||
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
|
cmd = 'rm iperf_client_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',5)
|
||||||
|
cmd = 'iperf -c ' + UE_IPAddress + ' ' + self.iperf_args + ' 2>&1 > iperf_client_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',int(iperf_time)*5.0)
|
||||||
|
#copy the 2 resulting files locally
|
||||||
|
SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, 'iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log', '.')
|
||||||
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, 'iperf_client_' + self.testCase_id + '_' + self.ue_id + '.log', '.')
|
||||||
|
#send for analysis
|
||||||
|
filename='iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, self.iperf_args,filename,1)
|
||||||
|
|
||||||
|
elif self.iperf_direction=="UL":#does not work at the moment
|
||||||
|
logging.debug("Iperf for Module in UL mode detected")
|
||||||
|
#server side EPC
|
||||||
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
|
cmd = 'rm iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',5)
|
||||||
|
cmd = 'echo $USER; nohup iperf -s -i 1 -u 2>&1 > iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',5)
|
||||||
|
|
||||||
|
#client side UE
|
||||||
|
SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
|
||||||
|
cmd = 'rm iperf_client_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
SSH.command(cmd,'\$',5)
|
||||||
|
SSH.command('/opt/iperf-2.0.10/iperf -c 192.172.0.1 ' + self.iperf_args + ' 2>&1 > iperf_client_' + self.testCase_id + '_' + self.ue_id + '.log', '\$', int(iperf_time)*5.0)
|
||||||
|
|
||||||
|
#copy the 2 resulting files locally
|
||||||
|
SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, 'iperf_client_' + self.testCase_id + '_' + self.ue_id + '.log', '.')
|
||||||
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, 'iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log', '.')
|
||||||
|
#send for analysis
|
||||||
|
filename='iperf_client_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, self.iperf_args,filename,1)
|
||||||
|
else :
|
||||||
|
logging.debug("Incorrect or missing IPERF direction in XML")
|
||||||
|
|
||||||
|
SSH.close()
|
||||||
|
return
|
||||||
|
|
||||||
def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue,EPC):
|
def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue,EPC):
|
||||||
try:
|
try:
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
@@ -2229,8 +2343,13 @@ class OaiCiTest():
|
|||||||
# Launch the IPERF client on the EPC side for DL (true for ltebox and old open-air-cn
|
# Launch the IPERF client on the EPC side for DL (true for ltebox and old open-air-cn
|
||||||
# But for OAI-Rel14-CUPS, we launch from python executor
|
# But for OAI-Rel14-CUPS, we launch from python executor
|
||||||
launchFromEpc = True
|
launchFromEpc = True
|
||||||
|
launchFromModule = False
|
||||||
if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
|
||||||
launchFromEpc = False
|
launchFromEpc = False
|
||||||
|
#if module
|
||||||
|
if self.ue_id!='' and self.iperf :
|
||||||
|
launchFromEpc = False
|
||||||
|
launchfromModule = True
|
||||||
# When using a docker-based deployment, IPERF client shall be launched from trf container
|
# When using a docker-based deployment, IPERF client shall be launched from trf container
|
||||||
launchFromTrfContainer = False
|
launchFromTrfContainer = False
|
||||||
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
||||||
@@ -2334,7 +2453,8 @@ class OaiCiTest():
|
|||||||
subprocess.run(cmd, shell=True)
|
subprocess.run(cmd, shell=True)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
filename='iperf_server_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options,filename,0)
|
||||||
|
|
||||||
# in case of OAI UE:
|
# in case of OAI UE:
|
||||||
if (device_id == 'OAI-UE'):
|
if (device_id == 'OAI-UE'):
|
||||||
@@ -2422,7 +2542,8 @@ class OaiCiTest():
|
|||||||
if (os.path.isfile('iperf_server_' + self.testCase_id + '.log')):
|
if (os.path.isfile('iperf_server_' + self.testCase_id + '.log')):
|
||||||
os.remove('iperf_server_' + self.testCase_id + '.log')
|
os.remove('iperf_server_' + self.testCase_id + '.log')
|
||||||
SSH.copyin(iServerIPAddr, iServerUser, iServerPasswd, '/tmp/tmp_iperf_server_' + self.testCase_id + '.log', 'iperf_server_' + self.testCase_id + '_OAI-UE.log')
|
SSH.copyin(iServerIPAddr, iServerUser, iServerPasswd, '/tmp/tmp_iperf_server_' + self.testCase_id + '.log', 'iperf_server_' + self.testCase_id + '_OAI-UE.log')
|
||||||
self.Iperf_analyzeV2Server(lock, '10.0.1.2', 'OAI-UE', status_queue, modified_options)
|
filename='iperf_server_' + self.testCase_id + '_OAI-UE.log'
|
||||||
|
self.Iperf_analyzeV2Server(lock, '10.0.1.2', 'OAI-UE', status_queue, modified_options,filename,0)
|
||||||
|
|
||||||
# copying on the EPC server for logCollection
|
# copying on the EPC server for logCollection
|
||||||
if (clientStatus == -1):
|
if (clientStatus == -1):
|
||||||
@@ -2457,7 +2578,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def Iperf(self,HTML,RAN,EPC,COTS_UE):
|
def Iperf(self,HTML,RAN,EPC,COTS_UE, InfraUE):
|
||||||
result = re.search('noS1', str(RAN.Initialize_eNB_args))
|
result = re.search('noS1', str(RAN.Initialize_eNB_args))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
self.IperfNoS1(HTML,RAN,EPC,COTS_UE)
|
self.IperfNoS1(HTML,RAN,EPC,COTS_UE)
|
||||||
@@ -2475,12 +2596,21 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
|
||||||
if (ueIpStatus < 0):
|
if self.ue_id=="":#is not a module, follow legacy code
|
||||||
logging.debug('going here')
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
if (ueIpStatus < 0):
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
return
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
return
|
||||||
|
else: #is a module
|
||||||
|
self.UEIPAddresses=[]
|
||||||
|
Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
|
||||||
|
Module_UE.GetModuleIPAddress()
|
||||||
|
self.UEIPAddresses.append(Module_UE.UEIPAddress)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self.dummyIperfVersion = '2.0.10'
|
self.dummyIperfVersion = '2.0.10'
|
||||||
#cmd = 'iperf --version'
|
#cmd = 'iperf --version'
|
||||||
@@ -2498,9 +2628,15 @@ class OaiCiTest():
|
|||||||
ue_num = len(self.UEIPAddresses)
|
ue_num = len(self.UEIPAddresses)
|
||||||
lock = Lock()
|
lock = Lock()
|
||||||
status_queue = SimpleQueue()
|
status_queue = SimpleQueue()
|
||||||
|
logging.debug(self.UEIPAddresses)
|
||||||
for UE_IPAddress in self.UEIPAddresses:
|
for UE_IPAddress in self.UEIPAddresses:
|
||||||
device_id = self.UEDevices[i]
|
device_id = self.UEDevices[i]
|
||||||
p = Process(target = self.Iperf_common, args = (lock,UE_IPAddress,device_id,i,ue_num,status_queue,EPC,))
|
#special quick and dirty treatment for modules, iperf to be restructured
|
||||||
|
if self.ue_id!="": #is module
|
||||||
|
device_id = Module_UE.ID + "-" + Module_UE.Kind
|
||||||
|
p = Process(target = self.Iperf_Module ,args = (lock, UE_IPAddress, device_id, i, ue_num, status_queue, EPC, Module_UE,))
|
||||||
|
else: #legacy code
|
||||||
|
p = Process(target = self.Iperf_common, args = (lock, UE_IPAddress, device_id, i, ue_num, status_queue, EPC, ))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -3273,7 +3409,7 @@ class OaiCiTest():
|
|||||||
UhdVersion = result.group('uhd_version')
|
UhdVersion = result.group('uhd_version')
|
||||||
logging.debug('UHD Version is: ' + UhdVersion)
|
logging.debug('UHD Version is: ' + UhdVersion)
|
||||||
HTML.UhdVersion[idx]=UhdVersion
|
HTML.UhdVersion[idx]=UhdVersion
|
||||||
SSH.command('echo ' + Password + ' | sudo -S uhd_find_devices', '\$', 60)
|
SSH.command('echo ' + Password + ' | sudo -S uhd_find_devices', '\$', 90)
|
||||||
usrp_boards = re.findall('product: ([0-9A-Za-z]+)\\\\r\\\\n', SSH.getBefore())
|
usrp_boards = re.findall('product: ([0-9A-Za-z]+)\\\\r\\\\n', SSH.getBefore())
|
||||||
count = 0
|
count = 0
|
||||||
for board in usrp_boards:
|
for board in usrp_boards:
|
||||||
|
|||||||
+191
-191
@@ -1,191 +1,191 @@
|
|||||||
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
# * contributor license agreements. See the NOTICE file distributed with
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
# * this work for additional information regarding copyright ownership.
|
# * this work for additional information regarding copyright ownership.
|
||||||
# * The OpenAirInterface Software Alliance licenses this file to You under
|
# * 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
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
# * except in compliance with the License.
|
# * except in compliance with the License.
|
||||||
# * You may obtain a copy of the License at
|
# * You may obtain a copy of the License at
|
||||||
# *
|
# *
|
||||||
# * http://www.openairinterface.org/?page_id=698
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
# *
|
# *
|
||||||
# * Unless required by applicable law or agreed to in writing, software
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
# * distributed under the License is distributed on an "AS IS" BASIS,
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
# * See the License for the specific language governing permissions and
|
# * See the License for the specific language governing permissions and
|
||||||
# * limitations under the License.
|
# * limitations under the License.
|
||||||
# *-------------------------------------------------------------------------------
|
# *-------------------------------------------------------------------------------
|
||||||
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
# * contact@openairinterface.org
|
# * contact@openairinterface.org
|
||||||
# */
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
# Python for CI of OAI-eNB + COTS-UE
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
#
|
#
|
||||||
# Required Python Version
|
# Required Python Version
|
||||||
# Python 3.x
|
# Python 3.x
|
||||||
#
|
#
|
||||||
# Required Python Package
|
# Required Python Package
|
||||||
# pexpect
|
# pexpect
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
#to use logging.info()
|
#to use logging.info()
|
||||||
import logging
|
import logging
|
||||||
#to create a SSH object locally in the methods
|
#to create a SSH object locally in the methods
|
||||||
import sshconnection
|
import sshconnection
|
||||||
#to update the HTML object
|
#to update the HTML object
|
||||||
import html
|
import html
|
||||||
from multiprocessing import SimpleQueue
|
from multiprocessing import SimpleQueue
|
||||||
#for log folder maintenance
|
#for log folder maintenance
|
||||||
import os
|
import os
|
||||||
|
|
||||||
class PhySim:
|
class PhySim:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.buildargs = ""
|
self.buildargs = ""
|
||||||
self.runargs = ""
|
self.runargs = ""
|
||||||
self.eNBIpAddr = ""
|
self.eNBIpAddr = ""
|
||||||
self.eNBUserName = ""
|
self.eNBUserName = ""
|
||||||
self.eNBPassWord = ""
|
self.eNBPassWord = ""
|
||||||
self.eNBSourceCodePath = ""
|
self.eNBSourceCodePath = ""
|
||||||
self.ranRepository = ""
|
self.ranRepository = ""
|
||||||
self.ranBranch = ""
|
self.ranBranch = ""
|
||||||
self.ranCommitID= ""
|
self.ranCommitID= ""
|
||||||
self.ranAllowMerge= ""
|
self.ranAllowMerge= ""
|
||||||
self.ranTargetBranch= ""
|
self.ranTargetBranch= ""
|
||||||
self.exitStatus=0
|
self.exitStatus=0
|
||||||
self.forced_workspace_cleanup=False
|
self.forced_workspace_cleanup=False
|
||||||
#private attributes
|
#private attributes
|
||||||
self.__workSpacePath=''
|
self.__workSpacePath=''
|
||||||
self.__buildLogFile='compile_phy_sim.log'
|
self.__buildLogFile='compile_phy_sim.log'
|
||||||
self.__runLogFile=''
|
self.__runLogFile=''
|
||||||
self.__runResults=[]
|
self.__runResults=[]
|
||||||
self.__runLogPath='phy_sim_logs'
|
self.__runLogPath='phy_sim_logs'
|
||||||
|
|
||||||
|
|
||||||
#-----------------
|
#-----------------
|
||||||
#PRIVATE Methods
|
#PRIVATE Methods
|
||||||
#-----------------
|
#-----------------
|
||||||
|
|
||||||
def __CheckResults_PhySim(self,HTML,CONST,testcase_id):
|
def __CheckResults_PhySim(self,HTML,CONST,testcase_id):
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
||||||
#retrieve run log file and store it locally$
|
#retrieve run log file and store it locally$
|
||||||
mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, self.__workSpacePath+self.__runLogFile, '.')
|
mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, self.__workSpacePath+self.__runLogFile, '.')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#parse results looking for Encoding and Decoding mean values
|
#parse results looking for Encoding and Decoding mean values
|
||||||
self.__runResults=[]
|
self.__runResults=[]
|
||||||
with open(self.__runLogFile) as f:
|
with open(self.__runLogFile) as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
if 'mean' in line:
|
if 'mean' in line:
|
||||||
self.__runResults.append(line)
|
self.__runResults.append(line)
|
||||||
#the values are appended for each mean value (2), so we take these 2 values from the list
|
#the values are appended for each mean value (2), so we take these 2 values from the list
|
||||||
info=self.__runResults[0]+self.__runResults[1]
|
info=self.__runResults[0]+self.__runResults[1]
|
||||||
|
|
||||||
#once parsed move the local logfile to its folder for tidiness
|
#once parsed move the local logfile to its folder for tidiness
|
||||||
os.system('mv '+self.__runLogFile+' '+ self.__runLogPath+'/.')
|
os.system('mv '+self.__runLogFile+' '+ self.__runLogPath+'/.')
|
||||||
|
|
||||||
#updating the HTML with results
|
#updating the HTML with results
|
||||||
html_cell = '<pre style="background-color:white">' + info + '</pre>'
|
html_cell = '<pre style="background-color:white">' + info + '</pre>'
|
||||||
html_queue=SimpleQueue()
|
html_queue=SimpleQueue()
|
||||||
html_queue.put(html_cell)
|
html_queue.put(html_cell)
|
||||||
HTML.CreateHtmlTestRowQueue(self.runargs, 'OK', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue(self.runargs, 'OK', 1, html_queue)
|
||||||
return HTML
|
return HTML
|
||||||
|
|
||||||
|
|
||||||
def __CheckBuild_PhySim(self, HTML, CONST):
|
def __CheckBuild_PhySim(self, HTML, CONST):
|
||||||
self.__workSpacePath=self.eNBSourceCodePath+'/cmake_targets/'
|
self.__workSpacePath=self.eNBSourceCodePath+'/cmake_targets/'
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
||||||
#retrieve compile log file and store it locally
|
#retrieve compile log file and store it locally
|
||||||
mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, self.__workSpacePath+self.__buildLogFile, '.')
|
mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, self.__workSpacePath+self.__buildLogFile, '.')
|
||||||
#delete older run log file
|
#delete older run log file
|
||||||
mySSH.command('rm ' + self.__workSpacePath+self.__runLogFile, '\$', 5)
|
mySSH.command('rm ' + self.__workSpacePath+self.__runLogFile, '\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#check build result from local compile log file
|
#check build result from local compile log file
|
||||||
buildStatus=False
|
buildStatus=False
|
||||||
with open(self.__buildLogFile) as f:
|
with open(self.__buildLogFile) as f:
|
||||||
#nr_prachsim is the last compile step
|
#nr_prachsim is the last compile step
|
||||||
if 'nr_prachsim compiled' in f.read():
|
if 'nr_prachsim compiled' in f.read():
|
||||||
buildStatus=True
|
buildStatus=True
|
||||||
#update HTML based on build status
|
#update HTML based on build status
|
||||||
if buildStatus:
|
if buildStatus:
|
||||||
HTML.CreateHtmlTestRow(self.buildargs, 'OK', CONST.ALL_PROCESSES_OK, 'LDPC')
|
HTML.CreateHtmlTestRow(self.buildargs, 'OK', CONST.ALL_PROCESSES_OK, 'LDPC')
|
||||||
self.exitStatus=0
|
self.exitStatus=0
|
||||||
else:
|
else:
|
||||||
logging.error('\u001B[1m Building Physical Simulators Failed\u001B[0m')
|
logging.error('\u001B[1m Building Physical Simulators Failed\u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.buildargs, 'KO', CONST.ALL_PROCESSES_OK, 'LDPC')
|
HTML.CreateHtmlTestRow(self.buildargs, 'KO', CONST.ALL_PROCESSES_OK, 'LDPC')
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
#exitStatus=1 will do a sys.exit in main
|
#exitStatus=1 will do a sys.exit in main
|
||||||
self.exitStatus=1
|
self.exitStatus=1
|
||||||
return HTML
|
return HTML
|
||||||
|
|
||||||
|
|
||||||
#-----------------$
|
#-----------------$
|
||||||
#PUBLIC Methods$
|
#PUBLIC Methods$
|
||||||
#-----------------$
|
#-----------------$
|
||||||
|
|
||||||
def Build_PhySim(self,htmlObj,constObj):
|
def Build_PhySim(self,htmlObj,constObj):
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
||||||
|
|
||||||
#create working dir
|
#create working dir
|
||||||
mySSH.command('mkdir -p ' + self.eNBSourceCodePath, '\$', 5)
|
mySSH.command('mkdir -p ' + self.eNBSourceCodePath, '\$', 5)
|
||||||
mySSH.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
mySSH.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
||||||
|
|
||||||
if not self.ranRepository.lower().endswith('.git'):
|
if not self.ranRepository.lower().endswith('.git'):
|
||||||
self.ranRepository+='.git'
|
self.ranRepository+='.git'
|
||||||
|
|
||||||
#git clone
|
#git clone
|
||||||
mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + self.ranRepository + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + self.ranRepository + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
||||||
#git config
|
#git config
|
||||||
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)
|
||||||
|
|
||||||
#git clean depending on self.forced_workspace_cleanup captured in xml
|
#git clean depending on self.forced_workspace_cleanup captured in xml
|
||||||
if self.forced_workspace_cleanup==True:
|
if self.forced_workspace_cleanup==True:
|
||||||
logging.info('Cleaning workspace ...')
|
logging.info('Cleaning workspace ...')
|
||||||
mySSH.command('echo ' + self.eNBPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
mySSH.command('echo ' + self.eNBPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
||||||
else:
|
else:
|
||||||
logging.info('Workspace cleaning was disabled')
|
logging.info('Workspace cleaning was disabled')
|
||||||
|
|
||||||
# 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 != '':
|
||||||
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||||
# if the branch is not develop, then it is a merge request and we need to do
|
# 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 have already been checked earlier
|
# the potential merge. Note that merge conflicts should have already been checked earlier
|
||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
if self.ranTargetBranch == '':
|
if self.ranTargetBranch == '':
|
||||||
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
||||||
mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
||||||
else:
|
else:
|
||||||
logging.info('Merging with the target branch: ' + self.ranTargetBranch)
|
logging.info('Merging with the target branch: ' + self.ranTargetBranch)
|
||||||
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)
|
||||||
|
|
||||||
#build
|
#build
|
||||||
mySSH.command('source oaienv', '\$', 5)
|
mySSH.command('source oaienv', '\$', 5)
|
||||||
mySSH.command('cd cmake_targets', '\$', 5)
|
mySSH.command('cd cmake_targets', '\$', 5)
|
||||||
mySSH.command('mkdir -p log', '\$', 5)
|
mySSH.command('mkdir -p log', '\$', 5)
|
||||||
mySSH.command('chmod 777 log', '\$', 5)
|
mySSH.command('chmod 777 log', '\$', 5)
|
||||||
mySSH.command('stdbuf -o0 ./build_oai ' + self.buildargs + ' 2>&1 | stdbuf -o0 tee ' + self.__buildLogFile, 'Bypassing the Tests|build have failed', 1500)
|
mySSH.command('stdbuf -o0 ./build_oai ' + self.buildargs + ' 2>&1 | stdbuf -o0 tee ' + self.__buildLogFile, 'Bypassing the Tests|build have failed', 1500)
|
||||||
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#check build status and update HTML object
|
#check build status and update HTML object
|
||||||
lHTML = html.HTMLManagement()
|
lHTML = html.HTMLManagement()
|
||||||
lHTML=self.__CheckBuild_PhySim(htmlObj,constObj)
|
lHTML=self.__CheckBuild_PhySim(htmlObj,constObj)
|
||||||
return lHTML
|
return lHTML
|
||||||
|
|
||||||
|
|
||||||
def Run_PhySim(self,htmlObj,constObj,testcase_id):
|
def Run_PhySim(self,htmlObj,constObj,testcase_id):
|
||||||
#create run logs folder locally
|
#create run logs folder locally
|
||||||
os.system('mkdir -p ./'+self.__runLogPath)
|
os.system('mkdir -p ./'+self.__runLogPath)
|
||||||
#log file is tc_<testcase_id>.log remotely
|
#log file is tc_<testcase_id>.log remotely
|
||||||
self.__runLogFile='physim_'+str(testcase_id)+'.log'
|
self.__runLogFile='physim_'+str(testcase_id)+'.log'
|
||||||
#open a session for test run
|
#open a session for test run
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
|
||||||
mySSH.command('cd '+self.__workSpacePath,'\$',5)
|
mySSH.command('cd '+self.__workSpacePath,'\$',5)
|
||||||
#run and redirect the results to a log file
|
#run and redirect the results to a log file
|
||||||
mySSH.command(self.__workSpacePath+'phy_simulators/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30)
|
mySSH.command(self.__workSpacePath+'phy_simulators/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#return updated HTML to main
|
#return updated HTML to main
|
||||||
lHTML = html.HTMLManagement()
|
lHTML = html.HTMLManagement()
|
||||||
lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id)
|
lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id)
|
||||||
return lHTML
|
return lHTML
|
||||||
|
|||||||
+66
-21
@@ -64,7 +64,7 @@ class PhySim:
|
|||||||
#PUBLIC Methods$
|
#PUBLIC Methods$
|
||||||
#-----------------$
|
#-----------------$
|
||||||
|
|
||||||
def Deploy_PhySim(self, HTML):
|
def Deploy_PhySim(self, HTML, RAN):
|
||||||
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)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
@@ -88,9 +88,10 @@ class PhySim:
|
|||||||
# on RedHat/CentOS .git extension is mandatory
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
full_ran_repo_name = self.ranRepository
|
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('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)
|
||||||
@@ -102,9 +103,15 @@ class PhySim:
|
|||||||
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 != '':
|
||||||
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||||
if self.ranAllowMerge:
|
if self.ranAllowMerge:
|
||||||
imageTag = "ci-temp"
|
imageTag = "ci-temp"
|
||||||
|
if self.ranTargetBranch == '':
|
||||||
|
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
||||||
|
mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
else:
|
||||||
|
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
||||||
|
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
|
# Check if image is exist on the Red Hat server, before pushing it to OC cluster
|
||||||
@@ -112,7 +119,9 @@ class PhySim:
|
|||||||
if mySSH.getBefore().count('no such image') != 0:
|
if mySSH.getBefore().count('no such image') != 0:
|
||||||
logging.error('\u001B[1m No such image oai-physim\u001B[0m')
|
logging.error('\u001B[1m No such image oai-physim\u001B[0m')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
sys.exit(-1)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.PHYSIM_IMAGE_ABSENT)
|
||||||
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
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:
|
||||||
@@ -135,14 +144,18 @@ class PhySim:
|
|||||||
if mySSH.getBefore().count('Login successful.') == 0:
|
if mySSH.getBefore().count('Login successful.') == 0:
|
||||||
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
sys.exit(-1)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||||
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m Login to OC Cluster Successfully\u001B[0m')
|
logging.debug('\u001B[1m Login to OC Cluster Successfully\u001B[0m')
|
||||||
mySSH.command(f'oc project {ocProjectName}', '\$', 6)
|
mySSH.command(f'oc project {ocProjectName}', '\$', 6)
|
||||||
if mySSH.getBefore().count(f'Already on project "{ocProjectName}"') == 0 and mySSH.getBefore().count(f'Now using project "{self.OCProjectName}"') == 0:
|
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[1m Unable to access OC project {ocProjectName}\u001B[0m')
|
logging.error(f'\u001B[1m Unable to access OC project {ocProjectName}\u001B[0m')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
sys.exit(-1)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PROJECT_FAIL)
|
||||||
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
||||||
|
|
||||||
@@ -151,34 +164,53 @@ class PhySim:
|
|||||||
if mySSH.getBefore().count('Login Succeeded!') == 0:
|
if mySSH.getBefore().count('Login Succeeded!') == 0:
|
||||||
logging.error('\u001B[1m Podman Login to OC Cluster Registry Failed\u001B[0m')
|
logging.error('\u001B[1m Podman Login to OC Cluster Registry Failed\u001B[0m')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
sys.exit(-1)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||||
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m Podman Login to OC Cluster Registry Successfully\u001B[0m')
|
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', '\$', 6)
|
mySSH.command('oc create -f openshift/oai-physim-image-stream.yml', '\$', 6)
|
||||||
if mySSH.getBefore().count('(AlreadyExists):') == 0 and mySSH.getBefore().count('created') == 0:
|
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')
|
logging.error(f'\u001B[1m Image Stream "oai-physim" Creation Failed on OC Cluster {ocProjectName}\u001B[0m')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
sys.exit(-1)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
||||||
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
logging.debug(f'\u001B[1m Image Stream "oai-physim" created on OC project {ocProjectName}\u001B[0m')
|
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.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
mySSH.command(f'sudo podman tag oai-physim:{imageTag} default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
||||||
|
time.sleep(2)
|
||||||
mySSH.command(f'sudo podman push default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag} --tls-verify=false', '\$', 30)
|
mySSH.command(f'sudo podman push default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag} --tls-verify=false', '\$', 30)
|
||||||
if mySSH.getBefore().count('Storing signatures') == 0:
|
if mySSH.getBefore().count('Storing signatures') == 0:
|
||||||
logging.error('\u001B[1m Image "oai-physim" push to OC Cluster Registry Failed\u001B[0m')
|
logging.error('\u001B[1m Image "oai-physim" push to OC Cluster Registry Failed\u001B[0m')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
sys.exit(-1)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
||||||
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m Image "oai-physim" push to OC Cluster Registry Successfully\u001B[0m')
|
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'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/ | tee -a cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
mySSH.command('helm install physim ./charts/physims/ | tee -a cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
||||||
if mySSH.getBefore().count('STATUS: deployed') == 0:
|
if mySSH.getBefore().count('STATUS: deployed') == 0:
|
||||||
logging.error('\u001B[1m Deploying PhySim Failed using helm chart on OC Cluster\u001B[0m')
|
logging.error('\u001B[1m Deploying PhySim Failed using helm chart on OC Cluster\u001B[0m')
|
||||||
mySSH.command('helm uninstall physim >> cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
mySSH.command('helm uninstall physim >> cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
||||||
|
isFinished1 = False
|
||||||
|
while(isFinished1 == False):
|
||||||
|
time.sleep(20)
|
||||||
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
||||||
|
if re.search('No resources found', mySSH.getBefore()):
|
||||||
|
isFinished1 = True
|
||||||
|
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
||||||
|
mySSH.command('oc delete is oai-physim', '\$', 6)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
sys.exit(-1)
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m Deployed PhySim Successfully using helm chart\u001B[0m')
|
logging.debug('\u001B[1m Deployed PhySim Successfully using helm chart\u001B[0m')
|
||||||
isRunning = False
|
isRunning = False
|
||||||
@@ -196,18 +228,28 @@ class PhySim:
|
|||||||
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim 2>&1 | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 6)
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim 2>&1 | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 6)
|
||||||
mySSH.command('helm uninstall physim >> cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
mySSH.command('helm uninstall physim >> cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
sys.exit(-1)
|
isFinished1 = False
|
||||||
|
while(isFinished1 == False):
|
||||||
|
time.sleep(20)
|
||||||
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
||||||
|
if re.search('No resources found', mySSH.getBefore()):
|
||||||
|
isFinished1 = True
|
||||||
|
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
||||||
|
mySSH.command('oc delete is oai-physim', '\$', 6)
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PHYSIM_DEPLOY_FAIL)
|
||||||
|
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
||||||
|
RAN.prematureExit = True
|
||||||
|
return
|
||||||
# Waiting to complete the running test
|
# Waiting to complete the running test
|
||||||
count = 0
|
count = 0
|
||||||
isFinished = False
|
isFinished = False
|
||||||
# doing a deep copy!
|
# doing a deep copy!
|
||||||
tmpPodNames = podNames.copy()
|
tmpPodNames = podNames.copy()
|
||||||
while(count < 28 and isFinished == False):
|
while(count < 28 and isFinished == False):
|
||||||
time.sleep(58)
|
time.sleep(60)
|
||||||
for podName in tmpPodNames:
|
for podName in tmpPodNames:
|
||||||
mySSH.command(f'oc logs --tail=1 {podName} 2>&1', '\$', 6, silent=True, resync=True)
|
mySSH.command2(f'oc logs --tail=1 {podName} 2>&1', 6, silent=True)
|
||||||
time.sleep(2)
|
if mySSH.cmd2Results.count('FINISHED') != 0:
|
||||||
if mySSH.getBefore().count('FINISHED') != 0:
|
|
||||||
logging.debug(podName + ' is finished')
|
logging.debug(podName + ' is finished')
|
||||||
tmpPodNames.remove(podName)
|
tmpPodNames.remove(podName)
|
||||||
if not tmpPodNames:
|
if not tmpPodNames:
|
||||||
@@ -237,8 +279,15 @@ class PhySim:
|
|||||||
mySSH.command('oc logout', '\$', 6)
|
mySSH.command('oc logout', '\$', 6)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
if self.testStatus == False:
|
if self.testStatus:
|
||||||
sys.exit(-1)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
||||||
|
logging.info('\u001B[1m Physical Simulator Pass\u001B[0m')
|
||||||
|
else:
|
||||||
|
RAN.prematureExit = True
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
||||||
|
logging.info('\u001B[1m Physical Simulator Fail\u001B[0m')
|
||||||
|
|
||||||
def AnalyzeLogFile_phySim(self, HTML):
|
def AnalyzeLogFile_phySim(self, HTML):
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
@@ -255,7 +304,6 @@ class PhySim:
|
|||||||
os.mkdir(f'./physim_test_logs_{self.testCase_id}')
|
os.mkdir(f'./physim_test_logs_{self.testCase_id}')
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/physim_test_log_' + self.testCase_id + '/*', './physim_test_logs_' + self.testCase_id)
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/physim_test_log_' + self.testCase_id + '/*', './physim_test_logs_' + self.testCase_id)
|
||||||
mySSH.command('rm -rf ./physim_test_log_'+ self.testCase_id, '\$', 5)
|
mySSH.command('rm -rf ./physim_test_log_'+ self.testCase_id, '\$', 5)
|
||||||
mySSH.command('oc logout', '\$', 6)
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
# physim test log analysis
|
# physim test log analysis
|
||||||
nextt = 0
|
nextt = 0
|
||||||
@@ -286,7 +334,4 @@ class PhySim:
|
|||||||
self.testSummary['Nbfail'] = self.testCount[2]
|
self.testSummary['Nbfail'] = self.testCount[2]
|
||||||
if self.testSummary['Nbfail'] == 0:
|
if self.testSummary['Nbfail'] == 0:
|
||||||
self.testStatus = True
|
self.testStatus = True
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
|
||||||
logging.info('\u001B[1m Physical Simulator Pass\u001B[0m')
|
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ class StaticCodeAnalysis():
|
|||||||
# on RedHat/CentOS .git extension is mandatory
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
full_ran_repo_name = self.ranRepository
|
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('mkdir -p ' + lSourcePath, '\$', 5)
|
mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
|
||||||
@@ -115,7 +115,7 @@ class StaticCodeAnalysis():
|
|||||||
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 != '':
|
||||||
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||||
|
|
||||||
mySSH.command('docker image rm oai-cppcheck:bionic oai-cppcheck:xenial || true', '\$', 60)
|
mySSH.command('docker image rm oai-cppcheck:bionic oai-cppcheck:xenial || true', '\$', 60)
|
||||||
mySSH.command('docker build --tag oai-cppcheck:xenial --file ci-scripts/docker/Dockerfile.cppcheck.xenial . > cmake_targets/log/cppcheck-xenial.txt 2>&1', '\$', 600)
|
mySSH.command('docker build --tag oai-cppcheck:xenial --file ci-scripts/docker/Dockerfile.cppcheck.xenial . > cmake_targets/log/cppcheck-xenial.txt 2>&1', '\$', 600)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ gNBs =
|
|||||||
initialULBWPk2_0 = 6;
|
initialULBWPk2_0 = 6;
|
||||||
initialULBWPmappingType_0 = 1
|
initialULBWPmappingType_0 = 1
|
||||||
# this is SS=0 L=11
|
# this is SS=0 L=11
|
||||||
initialULBWPstartSymbolAndLength_0 = 55;
|
initialULBWPstartSymbolAndLength_0 = 41;
|
||||||
|
|
||||||
initialULBWPk2_1 = 6;
|
initialULBWPk2_1 = 6;
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ gNBs =
|
|||||||
# pusch-ConfigCommon (up to 16 elements)
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
initialULBWPk2_0 = 6; # used for UL slot
|
initialULBWPk2_0 = 6; # used for UL slot
|
||||||
initialULBWPmappingType_0 = 1
|
initialULBWPmappingType_0 = 1
|
||||||
initialULBWPstartSymbolAndLength_0 = 55; # this is SS=0 L=12
|
initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13
|
||||||
|
|
||||||
initialULBWPk2_1 = 6; # used for mixed slot
|
initialULBWPk2_1 = 6; # used for mixed slot
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ gNBs =
|
|||||||
# pusch-ConfigCommon (up to 16 elements)
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
initialULBWPk2_0 = 6; # used for UL slot
|
initialULBWPk2_0 = 6; # used for UL slot
|
||||||
initialULBWPmappingType_0 = 1
|
initialULBWPmappingType_0 = 1
|
||||||
initialULBWPstartSymbolAndLength_0 = 55; # this is SS=0 L=12
|
initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13
|
||||||
|
|
||||||
initialULBWPk2_1 = 6; # used for mixed slot
|
initialULBWPk2_1 = 6; # used for mixed slot
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ gNBs =
|
|||||||
# pusch-ConfigCommon (up to 16 elements)
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
initialULBWPk2_0 = 2; # used for UL slot
|
initialULBWPk2_0 = 2; # used for UL slot
|
||||||
initialULBWPmappingType_0 = 1
|
initialULBWPmappingType_0 = 1
|
||||||
initialULBWPstartSymbolAndLength_0 = 55; # this is SS=0 L=12
|
initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13
|
||||||
|
|
||||||
initialULBWPk2_1 = 2; # used for mixed slot
|
initialULBWPk2_1 = 2; # used for mixed slot
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
|
|||||||
@@ -61,24 +61,15 @@ gNBs =
|
|||||||
initialDLBWPk0_0 = 0;
|
initialDLBWPk0_0 = 0;
|
||||||
#initialULBWPmappingType
|
#initialULBWPmappingType
|
||||||
#0=typeA,1=typeB
|
#0=typeA,1=typeB
|
||||||
initialDLBWPmappingType_0 = 0;
|
initialDLBWPmappingType_0 = 0;#for DL slot
|
||||||
#this is SS=1,L=13
|
#this is SS=1,L=13
|
||||||
initialDLBWPstartSymbolAndLength_0 = 40;
|
initialDLBWPstartSymbolAndLength_0 = 40;
|
||||||
|
|
||||||
initialDLBWPk0_1 = 0;
|
initialDLBWPk0_1 = 0;#for mixed slot
|
||||||
initialDLBWPmappingType_1 = 0;
|
initialDLBWPmappingType_1 = 0;
|
||||||
#this is SS=2,L=12
|
#this is SS=1,L=5
|
||||||
initialDLBWPstartSymbolAndLength_1 = 53;
|
initialDLBWPstartSymbolAndLength_1 = 57;
|
||||||
|
|
||||||
initialDLBWPk0_2 = 0;
|
|
||||||
initialDLBWPmappingType_2 = 0;
|
|
||||||
#this is SS=1,L=12
|
|
||||||
initialDLBWPstartSymbolAndLength_2 = 54;
|
|
||||||
|
|
||||||
initialDLBWPk0_3 = 0;
|
|
||||||
initialDLBWPmappingType_3 = 0;
|
|
||||||
#this is SS=1,L=4 //5 (4 is for 43, 5 is for 57)
|
|
||||||
initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
|
|
||||||
#uplinkConfigCommon
|
#uplinkConfigCommon
|
||||||
#frequencyInfoUL
|
#frequencyInfoUL
|
||||||
ul_frequencyBand = 78;
|
ul_frequencyBand = 78;
|
||||||
@@ -103,7 +94,7 @@ gNBs =
|
|||||||
prach_msg1_FDM = 0;
|
prach_msg1_FDM = 0;
|
||||||
prach_msg1_FrequencyStart = 0;
|
prach_msg1_FrequencyStart = 0;
|
||||||
zeroCorrelationZoneConfig = 13;
|
zeroCorrelationZoneConfig = 13;
|
||||||
preambleReceivedTargetPower = -100;
|
preambleReceivedTargetPower = -90;
|
||||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
preambleTransMax = 6;
|
preambleTransMax = 6;
|
||||||
#powerRampingStep
|
#powerRampingStep
|
||||||
@@ -136,7 +127,7 @@ gNBs =
|
|||||||
initialULBWPk2_0 = 2;
|
initialULBWPk2_0 = 2;
|
||||||
initialULBWPmappingType_0 = 1
|
initialULBWPmappingType_0 = 1
|
||||||
# this is SS=0 L=11
|
# this is SS=0 L=11
|
||||||
initialULBWPstartSymbolAndLength_0 = 55;
|
initialULBWPstartSymbolAndLength_0 = 41;
|
||||||
|
|
||||||
initialULBWPk2_1 = 2;
|
initialULBWPk2_1 = 2;
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
@@ -188,7 +179,7 @@ gNBs =
|
|||||||
nrofUplinkSlots = 2;
|
nrofUplinkSlots = 2;
|
||||||
nrofUplinkSymbols = 4; //0; //4;
|
nrofUplinkSymbols = 4; //0; //4;
|
||||||
|
|
||||||
ssPBCH_BlockPower = -25;
|
ssPBCH_BlockPower = -15;
|
||||||
}
|
}
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -60,6 +60,11 @@ OAI_UE_PROCESS_SEG_FAULT = -25
|
|||||||
OAI_UE_PROCESS_NO_MBMS_MSGS = -26
|
OAI_UE_PROCESS_NO_MBMS_MSGS = -26
|
||||||
OAI_UE_PROCESS_OK = +6
|
OAI_UE_PROCESS_OK = +6
|
||||||
INVALID_PARAMETER = -50
|
INVALID_PARAMETER = -50
|
||||||
|
PHYSIM_IMAGE_ABSENT = -60
|
||||||
|
OC_LOGIN_FAIL = -61
|
||||||
|
OC_PROJECT_FAIL = -62
|
||||||
|
OC_IS_FAIL = -63
|
||||||
|
OC_PHYSIM_DEPLOY_FAIL = -64
|
||||||
|
|
||||||
UE_STATUS_DETACHED = 0
|
UE_STATUS_DETACHED = 0
|
||||||
UE_STATUS_DETACHING = 1
|
UE_STATUS_DETACHING = 1
|
||||||
|
|||||||
@@ -365,6 +365,16 @@ class HTMLManagement():
|
|||||||
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - SPGW process not found</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - SPGW process not found</td>\n')
|
||||||
elif (processesStatus == CONST.UE_IP_ADDRESS_ISSUE):
|
elif (processesStatus == CONST.UE_IP_ADDRESS_ISSUE):
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - Could not retrieve UE IP address</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - Could not retrieve UE IP address</td>\n')
|
||||||
|
elif (processesStatus == CONST.PHYSIM_IMAGE_ABSENT):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - No such image oai-physim</td>\n')
|
||||||
|
elif (processesStatus == CONST.OC_LOGIN_FAIL):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - Could not log onto cluster</td>\n')
|
||||||
|
elif (processesStatus == CONST.OC_PROJECT_FAIL):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - Could not register into cluster project</td>\n')
|
||||||
|
elif (processesStatus == CONST.OC_IS_FAIL):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - Could not create Image Stream</td>\n')
|
||||||
|
elif (processesStatus == CONST.OC_PHYSIM_DEPLOY_FAIL):
|
||||||
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - Could not properly deploy physim on cluster</td>\n')
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n')
|
||||||
else:
|
else:
|
||||||
|
|||||||
+45
-6
@@ -43,6 +43,7 @@ import cls_physim #class PhySim for physical simulators build and
|
|||||||
import cls_cots_ue #class CotsUe for Airplane mode control
|
import cls_cots_ue #class CotsUe for Airplane mode control
|
||||||
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
||||||
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_physim1 #class PhySim for physical simulators deploy and run
|
import cls_physim1 #class PhySim for physical simulators deploy and run
|
||||||
|
|
||||||
import sshconnection
|
import sshconnection
|
||||||
@@ -193,6 +194,20 @@ def GetParametersFromXML(action):
|
|||||||
else :
|
else :
|
||||||
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
RAN.air_interface[RAN.eNB_instance] = 'ocp-enb'
|
||||||
|
|
||||||
|
elif action == 'Initialize_UE':
|
||||||
|
ue_id = test.findtext('id')
|
||||||
|
if (ue_id is None):
|
||||||
|
CiTestObj.ue_id = ""
|
||||||
|
else:
|
||||||
|
CiTestObj.ue_id = ue_id
|
||||||
|
|
||||||
|
elif action == 'Detach_UE':
|
||||||
|
ue_id = test.findtext('id')
|
||||||
|
if (ue_id is None):
|
||||||
|
CiTestObj.ue_id = ""
|
||||||
|
else:
|
||||||
|
CiTestObj.ue_id = ue_id
|
||||||
|
|
||||||
elif action == 'Attach_UE':
|
elif action == 'Attach_UE':
|
||||||
nbMaxUEtoAttach = test.findtext('nbMaxUEtoAttach')
|
nbMaxUEtoAttach = test.findtext('nbMaxUEtoAttach')
|
||||||
if (nbMaxUEtoAttach is None):
|
if (nbMaxUEtoAttach is None):
|
||||||
@@ -253,9 +268,20 @@ def GetParametersFromXML(action):
|
|||||||
elif (action == 'Ping') or (action == 'Ping_CatM_module'):
|
elif (action == 'Ping') or (action == 'Ping_CatM_module'):
|
||||||
CiTestObj.ping_args = test.findtext('ping_args')
|
CiTestObj.ping_args = test.findtext('ping_args')
|
||||||
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
|
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
|
||||||
|
ue_id = test.findtext('id')
|
||||||
|
if (ue_id is None):
|
||||||
|
CiTestObj.ue_id = ""
|
||||||
|
else:
|
||||||
|
CiTestObj.ue_id = ue_id
|
||||||
|
|
||||||
elif action == 'Iperf':
|
elif action == 'Iperf':
|
||||||
CiTestObj.iperf_args = test.findtext('iperf_args')
|
CiTestObj.iperf_args = test.findtext('iperf_args')
|
||||||
|
ue_id = test.findtext('id')
|
||||||
|
if (ue_id is None):
|
||||||
|
CiTestObj.ue_id = ""
|
||||||
|
else:
|
||||||
|
CiTestObj.ue_id = ue_id
|
||||||
|
CiTestObj.iperf_direction = test.findtext('direction')#used for modules only
|
||||||
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
||||||
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
CiTestObj.iperf_profile = test.findtext('iperf_profile')
|
||||||
if (CiTestObj.iperf_profile is None):
|
if (CiTestObj.iperf_profile is None):
|
||||||
@@ -370,6 +396,20 @@ with open(yaml_file,'r') as f:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#loading UE infrastructure from yaml
|
||||||
|
ue_infra_file='ci_ueinfra.yaml'
|
||||||
|
if (os.path.isfile(ue_infra_file)):
|
||||||
|
yaml_file=ue_infra_file
|
||||||
|
elif (os.path.isfile('ci-scripts/'+ue_infra_file)):
|
||||||
|
yaml_file='ci-scripts/'+ue_infra_file
|
||||||
|
else:
|
||||||
|
logging.error("UE infrastructure yaml file cannot be found")
|
||||||
|
sys.exit("UE infrastructure file cannot be found")
|
||||||
|
InfraUE=cls_ci_ueinfra.InfraUE() #initialize UE infrastructure class
|
||||||
|
InfraUE.Get_UE_Infra(yaml_file) #read the UE infra, filename is hardcoded and unique for the moment but should be passed as parameter from the test suite
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mode = ''
|
mode = ''
|
||||||
|
|
||||||
CiTestObj = cls_oaicitest.OaiCiTest()
|
CiTestObj = cls_oaicitest.OaiCiTest()
|
||||||
@@ -385,7 +425,6 @@ PHYSIM = cls_physim1.PhySim()
|
|||||||
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Parsing Command Line Arguments
|
# Parsing Command Line Arguments
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -674,13 +713,13 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
elif action == 'Terminate_eNB':
|
elif action == 'Terminate_eNB':
|
||||||
RAN.TerminateeNB(HTML, EPC)
|
RAN.TerminateeNB(HTML, EPC)
|
||||||
elif action == 'Initialize_UE':
|
elif action == 'Initialize_UE':
|
||||||
CiTestObj.InitializeUE(HTML,COTS_UE)
|
CiTestObj.InitializeUE(HTML,RAN, EPC, COTS_UE, InfraUE)
|
||||||
elif action == 'Terminate_UE':
|
elif action == 'Terminate_UE':
|
||||||
CiTestObj.TerminateUE(HTML,COTS_UE)
|
CiTestObj.TerminateUE(HTML,COTS_UE)
|
||||||
elif action == 'Attach_UE':
|
elif action == 'Attach_UE':
|
||||||
CiTestObj.AttachUE(HTML,RAN,EPC,COTS_UE)
|
CiTestObj.AttachUE(HTML,RAN,EPC,COTS_UE)
|
||||||
elif action == 'Detach_UE':
|
elif action == 'Detach_UE':
|
||||||
CiTestObj.DetachUE(HTML,RAN,EPC,COTS_UE)
|
CiTestObj.DetachUE(HTML,RAN,EPC,COTS_UE,InfraUE)
|
||||||
elif action == 'DataDisable_UE':
|
elif action == 'DataDisable_UE':
|
||||||
CiTestObj.DataDisableUE(HTML)
|
CiTestObj.DataDisableUE(HTML)
|
||||||
elif action == 'DataEnable_UE':
|
elif action == 'DataEnable_UE':
|
||||||
@@ -704,9 +743,9 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
elif action == 'Ping_CatM_module':
|
elif action == 'Ping_CatM_module':
|
||||||
CiTestObj.PingCatM(HTML,RAN,EPC,COTS_UE,EPC)
|
CiTestObj.PingCatM(HTML,RAN,EPC,COTS_UE,EPC)
|
||||||
elif action == 'Ping':
|
elif action == 'Ping':
|
||||||
CiTestObj.Ping(HTML,RAN,EPC,COTS_UE)
|
CiTestObj.Ping(HTML,RAN,EPC,COTS_UE, InfraUE)
|
||||||
elif action == 'Iperf':
|
elif action == 'Iperf':
|
||||||
CiTestObj.Iperf(HTML,RAN,EPC,COTS_UE)
|
CiTestObj.Iperf(HTML,RAN,EPC,COTS_UE, InfraUE)
|
||||||
elif action == 'Reboot_UE':
|
elif action == 'Reboot_UE':
|
||||||
CiTestObj.RebootUE(HTML,RAN,EPC)
|
CiTestObj.RebootUE(HTML,RAN,EPC)
|
||||||
elif action == 'Initialize_HSS':
|
elif action == 'Initialize_HSS':
|
||||||
@@ -747,7 +786,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
elif action == 'Cppcheck_Analysis':
|
elif action == 'Cppcheck_Analysis':
|
||||||
SCA.CppCheckAnalysis(HTML)
|
SCA.CppCheckAnalysis(HTML)
|
||||||
elif action == 'Deploy_Run_PhySim':
|
elif action == 'Deploy_Run_PhySim':
|
||||||
PHYSIM.Deploy_PhySim(HTML)
|
PHYSIM.Deploy_PhySim(HTML, RAN)
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid class (action) from xml')
|
sys.exit('Invalid class (action) from xml')
|
||||||
if not RAN.prematureExit:
|
if not RAN.prematureExit:
|
||||||
|
|||||||
+62
-14
@@ -130,12 +130,16 @@ class RANManagement():
|
|||||||
result = re.search('--eNBocp', self.Build_eNB_args)
|
result = re.search('--eNBocp', self.Build_eNB_args)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
self.air_interface[self.eNB_instance] = 'ocp-enb'
|
self.air_interface[self.eNB_instance] = 'ocp-enb'
|
||||||
else:
|
else:
|
||||||
result = re.search('--gNB', self.Build_eNB_args)
|
result = re.search('--RU', self.Build_eNB_args)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
self.air_interface[self.eNB_instance] = 'nr-softmodem'
|
self.air_interface[self.eNB_instance] = 'oairu'
|
||||||
else:
|
else:
|
||||||
self.air_interface[self.eNB_instance] = 'lte-softmodem'
|
result = re.search('--gNB', self.Build_eNB_args)
|
||||||
|
if result is not None:
|
||||||
|
self.air_interface[self.eNB_instance] = 'nr-softmodem'
|
||||||
|
else:
|
||||||
|
self.air_interface[self.eNB_instance] = 'lte-softmodem'
|
||||||
|
|
||||||
# Worakround for some servers, we need to erase completely the workspace
|
# Worakround for some servers, we need to erase completely the workspace
|
||||||
if self.Build_eNB_forced_workspace_cleanup:
|
if self.Build_eNB_forced_workspace_cleanup:
|
||||||
@@ -144,7 +148,7 @@ class RANManagement():
|
|||||||
# on RedHat/CentOS .git extension is mandatory
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
full_ran_repo_name = self.ranRepository
|
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('mkdir -p ' + lSourcePath, '\$', 5)
|
mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
|
||||||
@@ -187,7 +191,7 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
||||||
# 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 != '':
|
||||||
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||||
# if the branch is not develop, then it is a merge request and we need to do
|
# 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
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
@@ -242,7 +246,6 @@ class RANManagement():
|
|||||||
while (count > 0) and buildOAIprocess:
|
while (count > 0) and buildOAIprocess:
|
||||||
mySSH.command('ps aux | grep --color=never build_ | grep -v grep', '\$', 6)
|
mySSH.command('ps aux | grep --color=never build_ | grep -v grep', '\$', 6)
|
||||||
result = re.search('build_oai', mySSH.getBefore())
|
result = re.search('build_oai', mySSH.getBefore())
|
||||||
print(result)
|
|
||||||
if result is None:
|
if result is None:
|
||||||
buildOAIprocess = False
|
buildOAIprocess = False
|
||||||
else:
|
else:
|
||||||
@@ -297,7 +300,7 @@ class RANManagement():
|
|||||||
mySSH.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
mySSH.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
||||||
mySSH.command('cd ' + self.eNBSourceCodePath + '/cmake_targets', '\$', 5)
|
mySSH.command('cd ' + self.eNBSourceCodePath + '/cmake_targets', '\$', 5)
|
||||||
#-qq quiet / -u update orcreate files
|
#-qq quiet / -u update orcreate files
|
||||||
mySSH.command('unzip -u -qq -DD tmp_build' + testcaseId + '.zip', '\$', 5)
|
mySSH.command('unzip -o -u -qq -DD tmp_build' + testcaseId + '.zip', '\$', 5)
|
||||||
mySSH.command('rm -f tmp_build' + testcaseId + '.zip', '\$', 5)
|
mySSH.command('rm -f tmp_build' + testcaseId + '.zip', '\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
else:
|
else:
|
||||||
@@ -385,13 +388,13 @@ class RANManagement():
|
|||||||
# do not reset board twice in IF4.5 case
|
# do not reset board twice in IF4.5 case
|
||||||
result = re.search('^rru|^enb|^du.band', str(config_file))
|
result = re.search('^rru|^enb|^du.band', str(config_file))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 60)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 90)
|
||||||
result = re.search('type: b200', mySSH.getBefore())
|
result = re.search('type: b200', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
logging.debug('Found a B2xx device --> resetting it')
|
logging.debug('Found a B2xx device --> resetting it')
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S b2xx_fx3_utils --reset-device', '\$', 10)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S b2xx_fx3_utils --reset-device', '\$', 10)
|
||||||
# Reloading FGPA bin firmware
|
# Reloading FGPA bin firmware
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 60)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 90)
|
||||||
# Make a copy and adapt to EPC / eNB IP addresses
|
# Make a copy and adapt to EPC / eNB IP addresses
|
||||||
mySSH.command('cp ' + full_config_file + ' ' + ci_full_config_file, '\$', 5)
|
mySSH.command('cp ' + full_config_file + ' ' + ci_full_config_file, '\$', 5)
|
||||||
localMmeIpAddr = EPC.MmeIPAddress
|
localMmeIpAddr = EPC.MmeIPAddress
|
||||||
@@ -636,7 +639,8 @@ class RANManagement():
|
|||||||
HTML.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
if len(self.datalog_rt_stats)!=0:
|
#display rt stats for gNB only
|
||||||
|
if len(self.datalog_rt_stats)!=0 and nodeB_prefix == 'g':
|
||||||
HTML.CreateHtmlDataLogTable(self.datalog_rt_stats)
|
HTML.CreateHtmlDataLogTable(self.datalog_rt_stats)
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
self.eNBstatuses[int(self.eNB_instance)] = -1
|
self.eNBstatuses[int(self.eNB_instance)] = -1
|
||||||
@@ -703,6 +707,8 @@ class RANManagement():
|
|||||||
real_time_stats = {}
|
real_time_stats = {}
|
||||||
#count "problem receiving samples" msg
|
#count "problem receiving samples" msg
|
||||||
pb_receiving_samples_cnt = 0
|
pb_receiving_samples_cnt = 0
|
||||||
|
#NSA specific log markers
|
||||||
|
nsa_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': []}
|
||||||
|
|
||||||
#the datalog config file has to be loaded
|
#the datalog config file has to be loaded
|
||||||
datalog_rt_stats_file='datalog_rt_stats.yaml'
|
datalog_rt_stats_file='datalog_rt_stats.yaml'
|
||||||
@@ -718,8 +724,9 @@ class RANManagement():
|
|||||||
datalog_rt_stats = yaml.load(f,Loader=yaml.FullLoader)
|
datalog_rt_stats = yaml.load(f,Loader=yaml.FullLoader)
|
||||||
rt_keys = datalog_rt_stats['Ref'] #we use the keys from the Ref field
|
rt_keys = datalog_rt_stats['Ref'] #we use the keys from the Ref field
|
||||||
|
|
||||||
|
line_cnt=0 #log file line counter
|
||||||
for line in enb_log_file.readlines():
|
for line in enb_log_file.readlines():
|
||||||
|
line_cnt+=1
|
||||||
# Runtime statistics
|
# Runtime statistics
|
||||||
result = re.search('Run time:' ,str(line))
|
result = re.search('Run time:' ,str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -895,7 +902,13 @@ class RANManagement():
|
|||||||
#count "problem receiving samples" msg
|
#count "problem receiving samples" msg
|
||||||
result = re.search('\[PHY\]\s+problem receiving samples', str(line))
|
result = re.search('\[PHY\]\s+problem receiving samples', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
pb_receiving_samples_cnt += 1
|
pb_receiving_samples_cnt += 1
|
||||||
|
|
||||||
|
#nsa markers logging
|
||||||
|
for k in nsa_markers:
|
||||||
|
result = re.search(k, line)
|
||||||
|
if result is not None:
|
||||||
|
nsa_markers[k].append(line_cnt)
|
||||||
|
|
||||||
enb_log_file.close()
|
enb_log_file.close()
|
||||||
logging.debug(' File analysis completed')
|
logging.debug(' File analysis completed')
|
||||||
@@ -904,7 +917,7 @@ class RANManagement():
|
|||||||
else:
|
else:
|
||||||
nodeB_prefix = 'g'
|
nodeB_prefix = 'g'
|
||||||
|
|
||||||
if self.air_interface[self.eNB_instance] == 'nr-softmodem':
|
if nodeB_prefix == 'g':
|
||||||
if ulschReceiveOK > 0:
|
if ulschReceiveOK > 0:
|
||||||
statMsg = nodeB_prefix + 'NB showed ' + str(ulschReceiveOK) + ' "ULSCH received ok" message(s)'
|
statMsg = nodeB_prefix + 'NB showed ' + str(ulschReceiveOK) + ' "ULSCH received ok" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
@@ -931,6 +944,22 @@ class RANManagement():
|
|||||||
htmlMsg = statMsg+'\n'
|
htmlMsg = statMsg+'\n'
|
||||||
logging.debug(statMsg)
|
logging.debug(statMsg)
|
||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
#nsa markers
|
||||||
|
statMsg = 'logfile line count = ' + str(line_cnt)
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
if len(nsa_markers['SgNBReleaseRequestAcknowledge'])!=0:
|
||||||
|
statMsg = 'SgNBReleaseRequestAcknowledge = ' + str(len(nsa_markers['SgNBReleaseRequestAcknowledge'])) + ' occurences , starting line ' + str(nsa_markers['SgNBReleaseRequestAcknowledge'][0])
|
||||||
|
else:
|
||||||
|
statMsg = 'SgNBReleaseRequestAcknowledge = ' + str(len(nsa_markers['SgNBReleaseRequestAcknowledge'])) + ' occurences'
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
statMsg = 'FAILURE = ' + str(len(nsa_markers['FAILURE'])) + ' occurences'
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
#ulsch and dlsch statistics
|
#ulsch and dlsch statistics
|
||||||
if len(dlsch_ulsch_stats)!=0: #check if dictionary is not empty
|
if len(dlsch_ulsch_stats)!=0: #check if dictionary is not empty
|
||||||
@@ -962,6 +991,25 @@ class RANManagement():
|
|||||||
logging.debug('No real time stats found in the log file')
|
logging.debug('No real time stats found in the log file')
|
||||||
htmleNBFailureMsg += statMsg
|
htmleNBFailureMsg += statMsg
|
||||||
|
|
||||||
|
else:
|
||||||
|
#nsa markers
|
||||||
|
statMsg = 'logfile line count = ' + str(line_cnt)
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
if len(nsa_markers['SgNBReleaseRequest'])!=0:
|
||||||
|
statMsg = 'SgNBReleaseRequest = ' + str(len(nsa_markers['SgNBReleaseRequest'])) + ' occurences , starting line ' + str(nsa_markers['SgNBReleaseRequest'][0])
|
||||||
|
else:
|
||||||
|
statMsg = 'SgNBReleaseRequest = ' + str(len(nsa_markers['SgNBReleaseRequest'])) + ' occurences'
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
statMsg = 'scgFailureInformationNR-r15 = ' + str(len(nsa_markers['scgFailureInformationNR-r15'])) + ' occurences'
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
|
|
||||||
if uciStatMsgCount > 0:
|
if uciStatMsgCount > 0:
|
||||||
statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
|||||||
@@ -309,14 +309,14 @@ function report_test {
|
|||||||
NB_ENB_GOT_SYNC=`egrep -c "got sync" $ENB_LOG`
|
NB_ENB_GOT_SYNC=`egrep -c "got sync" $ENB_LOG`
|
||||||
NB_UE_GOT_SYNC=`egrep -c "got sync" $UE_LOG`
|
NB_UE_GOT_SYNC=`egrep -c "got sync" $UE_LOG`
|
||||||
NB_ENB_SYNCED_WITH_UE=`egrep -c "got UE capabilities for UE" $ENB_LOG`
|
NB_ENB_SYNCED_WITH_UE=`egrep -c "got UE capabilities for UE" $ENB_LOG`
|
||||||
if [ $NB_ENB_GOT_SYNC -eq 1 ] && [ $NB_UE_GOT_SYNC -eq 2 ] && [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
|
if [ $NB_ENB_GOT_SYNC -gt 0 ] && [ $NB_UE_GOT_SYNC -eq 2 ] && [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
|
||||||
then
|
then
|
||||||
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
||||||
else
|
else
|
||||||
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
||||||
fi
|
fi
|
||||||
echo " <td><pre>" >> ./test_simulator_results.html
|
echo " <td><pre>" >> ./test_simulator_results.html
|
||||||
if [ $NB_ENB_GOT_SYNC -eq 1 ]
|
if [ $NB_ENB_GOT_SYNC -gt 0 ]
|
||||||
then
|
then
|
||||||
echo "<font color = \"blue\">- eNB --> got sync</font>" >> ./test_simulator_results.html
|
echo "<font color = \"blue\">- eNB --> got sync</font>" >> ./test_simulator_results.html
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1235,9 +1235,9 @@ function start_rf_sim_gnb {
|
|||||||
then
|
then
|
||||||
if [ $LOC_RA_TEST -eq 0 ] #no RA test => use --phy-test option
|
if [ $LOC_RA_TEST -eq 0 ] #no RA test => use --phy-test option
|
||||||
then
|
then
|
||||||
echo "echo \"./nr-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-$LOC_CONF_FILE --log_config.global_log_options level,nocolor --parallel-config PARALLEL_SINGLE_THREAD --noS1 --nokrnmod 1 --rfsim --phy-test\" > ./my-nr-softmodem-run.sh " >> $1
|
echo "echo \"./nr-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-$LOC_CONF_FILE --log_config.global_log_options level,nocolor --parallel-config PARALLEL_SINGLE_THREAD --noS1 --nokrnmod 1 --rfsim --phy-test --lowmem --noS1\" > ./my-nr-softmodem-run.sh " >> $1
|
||||||
else #RA test => use --do-ra option
|
else #RA test => use --do-ra option
|
||||||
echo "echo \"./nr-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-$LOC_CONF_FILE --log_config.global_log_options level,nocolor --parallel-config PARALLEL_SINGLE_THREAD --rfsim --do-ra\" > ./my-nr-softmodem-run.sh " >> $1
|
echo "echo \"./nr-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-$LOC_CONF_FILE --log_config.global_log_options level,nocolor --parallel-config PARALLEL_SINGLE_THREAD --rfsim --do-ra --lowmem --noS1\" > ./my-nr-softmodem-run.sh " >> $1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo "chmod 775 ./my-nr-softmodem-run.sh" >> $1
|
echo "chmod 775 ./my-nr-softmodem-run.sh" >> $1
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import pexpect # pexpect
|
|||||||
import logging
|
import logging
|
||||||
import time # sleep
|
import time # sleep
|
||||||
import re
|
import re
|
||||||
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -44,6 +45,9 @@ class SSHConnection():
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.ssh = ''
|
self.ssh = ''
|
||||||
self.picocom_closure = False
|
self.picocom_closure = False
|
||||||
|
self.ipaddress = ''
|
||||||
|
self.username = ''
|
||||||
|
self.cmd2Results = ''
|
||||||
|
|
||||||
def disablePicocomClosure(self):
|
def disablePicocomClosure(self):
|
||||||
self.picocom_closure = False
|
self.picocom_closure = False
|
||||||
@@ -98,6 +102,8 @@ class SSHConnection():
|
|||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
sys.exit('SSH Connection Failed')
|
sys.exit('SSH Connection Failed')
|
||||||
|
self.ipaddress = ipaddress
|
||||||
|
self.username = username
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -146,10 +152,23 @@ class SSHConnection():
|
|||||||
logging.debug('Expected Line : ' + expectedline)
|
logging.debug('Expected Line : ' + expectedline)
|
||||||
sys.exit(self.sshresponse)
|
sys.exit(self.sshresponse)
|
||||||
|
|
||||||
|
def command2(self, commandline, timeout, silent=False):
|
||||||
|
if not silent:
|
||||||
|
logging.debug(commandline)
|
||||||
|
self.cmd2Results = ''
|
||||||
|
myHost = self.username + '@' + self.ipaddress
|
||||||
|
# CAUTION: THIS METHOD IMPLIES THAT THERE ARE VALID SSH KEYS
|
||||||
|
# BETWEEN THE PYTHON EXECUTOR NODE AND THE REMOTE HOST
|
||||||
|
# OTHERWISE IT WON'T WORK
|
||||||
|
lSsh = subprocess.Popen(["ssh", "%s" % myHost, commandline],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
|
self.cmd2Results = str(lSsh.stdout.readlines())
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.ssh.timeout = 5
|
self.ssh.timeout = 5
|
||||||
self.ssh.sendline('exit')
|
self.ssh.sendline('exit')
|
||||||
self.sshresponse = self.ssh.expect([pexpect.EOF, pexpect.TIMEOUT])
|
self.sshresponse = self.ssh.expect([pexpect.EOF, pexpect.TIMEOUT])
|
||||||
|
self.ipaddress = ''
|
||||||
|
self.username = ''
|
||||||
if self.sshresponse == 0:
|
if self.sshresponse == 0:
|
||||||
pass
|
pass
|
||||||
elif self.sshresponse == 1:
|
elif self.sshresponse == 1:
|
||||||
|
|||||||
+29
-44
@@ -21,49 +21,40 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-FR1-TM1</htmlTabRef>
|
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
||||||
<htmlTabName>FR1</htmlTabName>
|
<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>3</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010000
|
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
010001
|
000002
|
||||||
000001
|
010000
|
||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
000001
|
000001
|
||||||
060000
|
|
||||||
060001
|
|
||||||
000001
|
|
||||||
070000
|
070000
|
||||||
|
000001
|
||||||
070001
|
070001
|
||||||
|
000001
|
||||||
010002
|
010002
|
||||||
000001
|
000001
|
||||||
080001
|
080001
|
||||||
080000
|
080000
|
||||||
010003
|
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="010000">
|
<testCase id="010000">
|
||||||
<class>Initialize_UE</class>
|
<class>Initialize_UE</class>
|
||||||
<desc>Initialize UE</desc>
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="010003">
|
|
||||||
<class>Terminate_UE</class>
|
|
||||||
<desc>Terminate UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="010001">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="010002">
|
<testCase id="010002">
|
||||||
<class>Detach_UE</class>
|
<class>Detach_UE</class>
|
||||||
<desc>Detach UE</desc>
|
<desc>Detach UE</desc>
|
||||||
|
<id>idefix</id>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
@@ -74,27 +65,35 @@
|
|||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="040000">
|
<testCase id="040000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB</desc>
|
<desc>Initialize gNB</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/benetel-5g.conf</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/benetel-5g.conf -q</Initialize_eNB_args>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
<class>IdleSleep</class>
|
<class>IdleSleep</class>
|
||||||
<desc>Sleep</desc>
|
<desc>Sleep</desc>
|
||||||
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="050000">
|
<testCase id="050000">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping: 20pings in 20sec</desc>
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
<ping_args>-c 20</ping_args>
|
<ping_args>-c 20</ping_args>
|
||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
@@ -102,46 +101,32 @@
|
|||||||
<testCase id="050001">
|
<testCase id="050001">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping: 100pings in 20sec</desc>
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
<ping_args>-c 100 -i 0.2</ping_args>
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="060000">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (DL/2.5Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 2.5M -t 60 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060001">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (UL/1.5Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 1.5M -t 60 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 20M -t 20 -i 1</iperf_args>
|
<iperf_args>-u -b 20M -t 60 -i 1</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="070001">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 3M -t 20 -i 1 -R</iperf_args>
|
<iperf_args>-u -b 3M -t 60 -i 1</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<testCase id="080000">
|
<testCase id="080000">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Terminate eNB</desc>
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
||||||
|
<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>3</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030000
|
||||||
|
040000
|
||||||
|
000002
|
||||||
|
010000
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
000001
|
||||||
|
070000
|
||||||
|
000001
|
||||||
|
070001
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
000001
|
||||||
|
080001
|
||||||
|
080000
|
||||||
|
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/benetel-4g.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/benetel-5g.conf -q</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>30</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/20Mbps/UDP)(20 min)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 1200 -i 1</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/3Mbps/UDP)(20 min)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 1200 -i 1</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="080000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="080001">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -35,6 +35,7 @@
|
|||||||
<kind>all</kind>
|
<kind>all</kind>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
+28
-42
@@ -22,47 +22,39 @@
|
|||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
||||||
<htmlTabName>NSA FULL</htmlTabName>
|
<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>3</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010000
|
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
010001
|
000002
|
||||||
000001
|
010000
|
||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
000001
|
000001
|
||||||
060000
|
070000
|
||||||
060001
|
|
||||||
000001
|
000001
|
||||||
070000
|
070000
|
||||||
|
000001
|
||||||
010002
|
010002
|
||||||
000001
|
000001
|
||||||
080001
|
080001
|
||||||
080000
|
080000
|
||||||
010003
|
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="010000">
|
<testCase id="010000">
|
||||||
<class>Initialize_UE</class>
|
<class>Initialize_UE</class>
|
||||||
<desc>Initialize UE</desc>
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="010003">
|
|
||||||
<class>Terminate_UE</class>
|
|
||||||
<desc>Terminate UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="010001">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="010002">
|
<testCase id="010002">
|
||||||
<class>Detach_UE</class>
|
<class>Detach_UE</class>
|
||||||
<desc>Detach UE</desc>
|
<desc>Detach UE</desc>
|
||||||
|
<id>idefix</id>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
@@ -73,27 +65,35 @@
|
|||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="040000">
|
<testCase id="040000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB</desc>
|
<desc>Initialize gNB</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf -q</Initialize_eNB_args>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
<class>IdleSleep</class>
|
<class>IdleSleep</class>
|
||||||
<desc>Sleep</desc>
|
<desc>Sleep</desc>
|
||||||
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="050000">
|
<testCase id="050000">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping: 20pings in 20sec</desc>
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
<ping_args>-c 20</ping_args>
|
<ping_args>-c 20</ping_args>
|
||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
@@ -101,46 +101,32 @@
|
|||||||
<testCase id="050001">
|
<testCase id="050001">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping: 100pings in 20sec</desc>
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
<ping_args>-c 100 -i 0.2</ping_args>
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="060000">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (DL/3Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 3M -t 20 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060001">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (UL/1Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 1M -t 20 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 20M -t 20 -i 1</iperf_args>
|
<iperf_args>-u -b 20M -t 60 -i 1</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="070001">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 3M -t 20 -i 1 -R</iperf_args>
|
<iperf_args>-u -b 3M -t 60 -i 1</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<testCase id="080000">
|
<testCase id="080000">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Terminate eNB</desc>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010101 010102 010103
|
010101 010102 010103
|
||||||
000101 000102 000103
|
000102 000103 000101
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
<testCase id="010102">
|
<testCase id="010102">
|
||||||
<class>Build_eNB</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Build Master RRU</desc>
|
<desc>Build Master RRU</desc>
|
||||||
<Build_eNB_args>-w USRP -c --eNB --ninja</Build_eNB_args>
|
<Build_eNB_args>-w USRP -c --RU --ninja</Build_eNB_args>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<backgroundBuild>True</backgroundBuild>
|
<backgroundBuild>True</backgroundBuild>
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
<testCase id="000102">
|
<testCase id="000102">
|
||||||
<class>WaitEndBuild_eNB</class>
|
<class>WaitEndBuild_eNB</class>
|
||||||
<desc>Wait for end of Build Master RRU</desc>
|
<desc>Wait for end of Build Master RRU</desc>
|
||||||
<Build_eNB_args>-w USRP -c --eNB --ninja</Build_eNB_args>
|
<Build_eNB_args>-w USRP -c --RU --ninja</Build_eNB_args>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
</testCase>
|
</testCase>
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
<testCase id="010103">
|
<testCase id="010103">
|
||||||
<class>Build_eNB</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Build Slave RRU</desc>
|
<desc>Build Slave RRU</desc>
|
||||||
<Build_eNB_args>-w USRP -c --eNB --ninja</Build_eNB_args>
|
<Build_eNB_args>-w USRP -c --RU --ninja</Build_eNB_args>
|
||||||
<eNB_instance>2</eNB_instance>
|
<eNB_instance>2</eNB_instance>
|
||||||
<eNB_serverId>2</eNB_serverId>
|
<eNB_serverId>2</eNB_serverId>
|
||||||
<backgroundBuild>True</backgroundBuild>
|
<backgroundBuild>True</backgroundBuild>
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
<testCase id="000103">
|
<testCase id="000103">
|
||||||
<class>WaitEndBuild_eNB</class>
|
<class>WaitEndBuild_eNB</class>
|
||||||
<desc>Wait for end of Build Slave RRU</desc>
|
<desc>Wait for end of Build Slave RRU</desc>
|
||||||
<Build_eNB_args>-w USRP -c --eNB --ninja</Build_eNB_args>
|
<Build_eNB_args>-w USRP -c --RU --ninja</Build_eNB_args>
|
||||||
<eNB_instance>2</eNB_instance>
|
<eNB_instance>2</eNB_instance>
|
||||||
<eNB_serverId>2</eNB_serverId>
|
<eNB_serverId>2</eNB_serverId>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|||||||
+137
-76
@@ -62,6 +62,8 @@ elseif (${RF_BOARD} STREQUAL "OAI_IRIS")
|
|||||||
|
|
||||||
endif (${RF_BOARD} STREQUAL "OAI_USRP")
|
endif (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||||
|
|
||||||
|
message("RU=${RU}")
|
||||||
|
|
||||||
pkg_search_module(OPENPGM openpgm-5.1 openpgm-5.2)
|
pkg_search_module(OPENPGM openpgm-5.1 openpgm-5.2)
|
||||||
if(NOT ${OPENPGM_FOUND})
|
if(NOT ${OPENPGM_FOUND})
|
||||||
message("PACKAGE openpgm-5.1 is required by binaries such as oaisim: will fail later if this target is built")
|
message("PACKAGE openpgm-5.1 is required by binaries such as oaisim: will fail later if this target is built")
|
||||||
@@ -437,7 +439,6 @@ set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
|||||||
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
||||||
set(protobuf_generated_dir ${OPENAIR_BIN_DIR})
|
set(protobuf_generated_dir ${OPENAIR_BIN_DIR})
|
||||||
|
|
||||||
|
|
||||||
# RRC
|
# RRC
|
||||||
######
|
######
|
||||||
set (RRC_ASN1_VERSION "Rel15")
|
set (RRC_ASN1_VERSION "Rel15")
|
||||||
@@ -448,15 +449,18 @@ add_definitions(-DLTE_RRC_VERSION=${LTE_RRC_VERSION})
|
|||||||
set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
|
set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
|
||||||
|
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${RRC_FULL_DIR}" "${RRC_GRAMMAR}" "LTE_"
|
if (${RU} STREQUAL 0)
|
||||||
RESULT_VARIABLE ret)
|
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "LTE_" " " "${RRC_FULL_DIR}" "${RRC_GRAMMAR}"
|
||||||
|
RESULT_VARIABLE ret)
|
||||||
|
endif (${RU} STREQUAL 0)
|
||||||
|
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${ret}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
file(GLOB rrc_source ${RRC_FULL_DIR}/*.c)
|
file(GLOB rrc_source ${RRC_FULL_DIR}/*.c)
|
||||||
add_custom_target (
|
add_custom_target (
|
||||||
rrc_flag ALL
|
rrc_flag ALL
|
||||||
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${RRC_FULL_DIR}" "${RRC_GRAMMAR}" "LTE_"
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "LTE_" " " "${RRC_FULL_DIR}" "${RRC_GRAMMAR}"
|
||||||
DEPENDS ${RRC_GRAMMAR}
|
DEPENDS ${RRC_GRAMMAR}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -477,16 +481,18 @@ add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
|
|||||||
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
|
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
|
||||||
|
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NR_RRC_FULL_DIR}" "${NR_RRC_GRAMMAR}" "NR_" "-findirect-choice"
|
execute_process(
|
||||||
RESULT_VARIABLE ret)
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "NR_" "-findirect-choice" "${NR_RRC_FULL_DIR}" "${NR_RRC_GRAMMAR}"
|
||||||
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${ret}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif ()
|
endif ()
|
||||||
file(GLOB nr_rrc_source ${NR_RRC_FULL_DIR}/*.c)
|
file(GLOB nr_rrc_source ${NR_RRC_FULL_DIR}/*.c)
|
||||||
file(GLOB nr_rrc_h ${NR_RRC_FULL_DIR}/*.h)
|
file(GLOB nr_rrc_h ${NR_RRC_FULL_DIR}/*.h)
|
||||||
|
|
||||||
add_custom_target (
|
add_custom_target (
|
||||||
nr_rrc_flag ALL
|
nr_rrc_flag ALL
|
||||||
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NR_RRC_FULL_DIR}" "${NR_RRC_GRAMMAR}" "NR_" "-findirect-choice"
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "NR_" "-findirect-choice" "${NR_RRC_FULL_DIR}" "${NR_RRC_GRAMMAR}"
|
||||||
DEPENDS ${NR_RRC_GRAMMAR}
|
DEPENDS ${NR_RRC_GRAMMAR}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -511,31 +517,34 @@ set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${S1AP_RELEASE})
|
|||||||
set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${S1AP_RELEASE})
|
set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${S1AP_RELEASE})
|
||||||
|
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${S1AP_C_DIR}" "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}" "S1AP_" -fno-include-deps
|
if (${RU} STREQUAL 0)
|
||||||
RESULT_VARIABLE ret)
|
execute_process(
|
||||||
if (NOT ${ret} STREQUAL 0)
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "S1AP_" -fno-include-deps "${S1AP_C_DIR}" "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}"
|
||||||
message(FATAL_ERROR "${ret}: error")
|
RESULT_VARIABLE ret)
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
file(GLOB S1AP_source ${S1AP_C_DIR}/*.c)
|
message(FATAL_ERROR "${ret}: error")
|
||||||
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
file(GLOB S1AP_source ${S1AP_C_DIR}/*.c)
|
||||||
|
endif (${RU} STREQUAL 0)
|
||||||
|
|
||||||
add_custom_target (
|
add_custom_target (
|
||||||
s1ap_flag ALL
|
s1ap_flag ALL
|
||||||
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${S1AP_C_DIR}" "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}" "S1AP_" -fno-include-deps
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "S1AP_" -fno-include-deps "${S1AP_C_DIR}" "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}"
|
||||||
DEPENDS "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}"
|
DEPENDS "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}"
|
||||||
)
|
|
||||||
|
|
||||||
add_library(S1AP_LIB
|
|
||||||
${S1AP_source}
|
|
||||||
${S1AP_DIR}/s1ap_common.c
|
|
||||||
)
|
)
|
||||||
add_dependencies(S1AP_LIB rrc_flag s1ap_flag)
|
|
||||||
|
|
||||||
include_directories ("${S1AP_C_DIR}")
|
add_library(S1AP_LIB
|
||||||
include_directories ("${S1AP_DIR}")
|
${S1AP_source}
|
||||||
|
${S1AP_DIR}/s1ap_common.c
|
||||||
|
)
|
||||||
|
add_dependencies(S1AP_LIB rrc_flag s1ap_flag)
|
||||||
|
|
||||||
|
include_directories ("${S1AP_C_DIR}")
|
||||||
|
include_directories ("${S1AP_DIR}")
|
||||||
|
|
||||||
add_library(S1AP_ENB
|
add_library(S1AP_ENB
|
||||||
${S1AP_DIR}/s1ap_eNB.c
|
${S1AP_DIR}/s1ap_eNB.c
|
||||||
${S1AP_DIR}/s1ap_eNB_context_management_procedures.c
|
${S1AP_DIR}/s1ap_eNB_context_management_procedures.c
|
||||||
${S1AP_DIR}/s1ap_eNB_decoder.c
|
${S1AP_DIR}/s1ap_eNB_decoder.c
|
||||||
${S1AP_DIR}/s1ap_eNB_encoder.c
|
${S1AP_DIR}/s1ap_eNB_encoder.c
|
||||||
${S1AP_DIR}/s1ap_eNB_handlers.c
|
${S1AP_DIR}/s1ap_eNB_handlers.c
|
||||||
@@ -565,8 +574,9 @@ set(NGAP_ASN_DIR ${NGAP_DIR}/MESSAGES/ASN1/ASN1_files)
|
|||||||
set(NGAP_C_DIR ${asn1_generated_dir}/NGAP_${NGAP_RELEASE})
|
set(NGAP_C_DIR ${asn1_generated_dir}/NGAP_${NGAP_RELEASE})
|
||||||
|
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}" "NGAP_" -fno-include-deps -findirect-choice
|
execute_process(
|
||||||
RESULT_VARIABLE ret)
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "NGAP_" "-fno-include-deps -findirect-choice" "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}"
|
||||||
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${ret}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
@@ -574,7 +584,7 @@ file(GLOB NGAP_source ${NGAP_C_DIR}/*.c)
|
|||||||
|
|
||||||
add_custom_target (
|
add_custom_target (
|
||||||
ngap_flag ALL
|
ngap_flag ALL
|
||||||
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}" "NGAP_" -fno-include-deps
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "NGAP_" "-fno-include-deps -findirect-choice" "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}"
|
||||||
DEPENDS "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}"
|
DEPENDS "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -631,17 +641,20 @@ set(M2AP_ASN_DIR ${M2AP_DIR}/MESSAGES/ASN1/${M2AP_RELEASE})
|
|||||||
set(M2AP_C_DIR ${asn1_generated_dir}/M2AP_${M2AP_RELEASE})
|
set(M2AP_C_DIR ${asn1_generated_dir}/M2AP_${M2AP_RELEASE})
|
||||||
|
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${M2AP_C_DIR}" "${M2AP_ASN_DIR}/${M2AP_ASN_FILES}" "M2AP_" -fno-include-deps -DEMIT_ASN_DEBUG=1
|
if (${RU} STREQUAL 0)
|
||||||
RESULT_VARIABLE ret)
|
execute_process(
|
||||||
if (NOT ${ret} STREQUAL 0)
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "M2AP_" "-fno-include-deps -DEMIT_ASN_DEBUG=1" "${M2AP_C_DIR}" "${M2AP_ASN_DIR}/${M2AP_ASN_FILES}"
|
||||||
message(FATAL_ERROR "${ret}: error")
|
RESULT_VARIABLE ret)
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
|
message(FATAL_ERROR "${ret}: error")
|
||||||
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
endif (${RU} STREQUAL 0)
|
||||||
|
|
||||||
file(GLOB M2AP_source ${M2AP_C_DIR}/*.c)
|
file(GLOB M2AP_source ${M2AP_C_DIR}/*.c)
|
||||||
|
|
||||||
add_custom_target (
|
add_custom_target (
|
||||||
m2_flag ALL
|
m2_flag ALL
|
||||||
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${M2AP_C_DIR}" "${M2AP_ASN_DIR}/${M2AP_ASN_FILES}" "M2AP_" -fno-include-deps
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "M2AP_" "-fno-include-deps -DEMIT_ASN_DEBUG=1" "${M2AP_C_DIR}" "${M2AP_ASN_DIR}/${M2AP_ASN_FILES}"
|
||||||
DEPENDS ${M2AP_ASN_DIR}/${M2AP_ASN_FILES}
|
DEPENDS ${M2AP_ASN_DIR}/${M2AP_ASN_FILES}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -701,17 +714,20 @@ set(M3AP_ASN_DIR ${M3AP_DIR}/MESSAGES/ASN1/${M3AP_RELEASE})
|
|||||||
set(M3AP_C_DIR ${asn1_generated_dir}/M3AP_${M3AP_RELEASE})
|
set(M3AP_C_DIR ${asn1_generated_dir}/M3AP_${M3AP_RELEASE})
|
||||||
|
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${M3AP_C_DIR}" "${M3AP_ASN_DIR}/${M3AP_ASN_FILES}" "M3AP_" -fno-include-deps
|
if (${RU} STREQUAL 0)
|
||||||
RESULT_VARIABLE ret)
|
execute_process(
|
||||||
if (NOT ${ret} STREQUAL 0)
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "M3AP_" -fno-include-deps "${M3AP_C_DIR}" "${M3AP_ASN_DIR}/${M3AP_ASN_FILES}"
|
||||||
message(FATAL_ERROR "${ret}: error")
|
RESULT_VARIABLE ret)
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
|
message(FATAL_ERROR "${ret}: error")
|
||||||
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
endif (${RU} STREQUAL 0)
|
||||||
|
|
||||||
file(GLOB M3AP_source ${M3AP_C_DIR}/*.c)
|
file(GLOB M3AP_source ${M3AP_C_DIR}/*.c)
|
||||||
|
|
||||||
add_custom_target (
|
add_custom_target (
|
||||||
m3_flag ALL
|
m3_flag ALL
|
||||||
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${M3AP_C_DIR}" "${M3AP_ASN_DIR}/${M3AP_ASN_FILES}" "M3AP_" -fno-include-deps
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "M3AP_" -fno-include-deps "${M3AP_C_DIR}" "${M3AP_ASN_DIR}/${M3AP_ASN_FILES}"
|
||||||
DEPENDS ${M3AP_ASN_DIR}/${M3AP_ASN_FILES}
|
DEPENDS ${M3AP_ASN_DIR}/${M3AP_ASN_FILES}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -755,17 +771,20 @@ add_definitions(-DX2AP_VERSION=${X2AP_VERSION})
|
|||||||
set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE})
|
set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE})
|
||||||
set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${X2AP_RELEASE})
|
set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${X2AP_RELEASE})
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${X2AP_C_DIR}" "${X2AP_ASN_DIR}/${X2AP_ASN_FILES}" "X2AP_" -fno-include-deps
|
if (${RU} STREQUAL 0)
|
||||||
RESULT_VARIABLE ret)
|
execute_process(
|
||||||
if (NOT ${ret} STREQUAL 0)
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "X2AP_" -fno-include-deps "${X2AP_C_DIR}" "${X2AP_ASN_DIR}/${X2AP_ASN_FILES}"
|
||||||
message(FATAL_ERROR "${ret}: error")
|
RESULT_VARIABLE ret)
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
|
message(FATAL_ERROR "${ret}: error")
|
||||||
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
endif (${RU} STREQUAL 0)
|
||||||
|
|
||||||
file(GLOB X2AP_source ${X2AP_C_DIR}/*.c)
|
file(GLOB X2AP_source ${X2AP_C_DIR}/*.c)
|
||||||
|
|
||||||
add_custom_target (
|
add_custom_target (
|
||||||
x2_flag ALL
|
x2_flag ALL
|
||||||
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${X2AP_C_DIR}" "${X2AP_ASN_DIR}/${X2AP_ASN_FILES}" "X2AP_" -fno-include-deps
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "X2AP_" -fno-include-deps "${X2AP_C_DIR}" "${X2AP_ASN_DIR}/${X2AP_ASN_FILES}"
|
||||||
DEPENDS ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
DEPENDS ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -794,12 +813,12 @@ add_dependencies(X2AP_ENB X2AP_LIB rrc_flag x2_flag)
|
|||||||
|
|
||||||
# F1AP
|
# F1AP
|
||||||
##############
|
##############
|
||||||
add_list1_option(F1AP_RELEASE R15 "F1AP ASN.1 grammar version" R15)
|
add_list1_option(F1AP_RELEASE R16 "F1AP ASN.1 grammar version" R16)
|
||||||
set(F1AP_DIR ${OPENAIR2_DIR}/F1AP)
|
set(F1AP_DIR ${OPENAIR2_DIR}/F1AP)
|
||||||
if (${F1AP_RELEASE} STREQUAL "R15")
|
if (${F1AP_RELEASE} STREQUAL "R16")
|
||||||
make_version(F1AP_VERSION 15 2 1)
|
make_version(F1AP_VERSION 16 3 1)
|
||||||
set (ASN1RELDIR R15.2.1)
|
set (ASN1RELDIR R16.3.1)
|
||||||
endif(${F1AP_RELEASE} STREQUAL "R15")
|
endif(${F1AP_RELEASE} STREQUAL "R16")
|
||||||
add_definitions(-DF1AP_VERSION=${F1AP_VERSION})
|
add_definitions(-DF1AP_VERSION=${F1AP_VERSION})
|
||||||
set(F1AP_ASN_DIR ${F1AP_DIR}/MESSAGES/ASN1/${ASN1RELDIR})
|
set(F1AP_ASN_DIR ${F1AP_DIR}/MESSAGES/ASN1/${ASN1RELDIR})
|
||||||
set(F1AP_ASN_FILES
|
set(F1AP_ASN_FILES
|
||||||
@@ -811,22 +830,28 @@ set(F1AP_ASN_FILES
|
|||||||
${F1AP_ASN_DIR}/F1AP-Containers.asn
|
${F1AP_ASN_DIR}/F1AP-Containers.asn
|
||||||
)
|
)
|
||||||
|
|
||||||
set(F1AP_ASN_GENERATED_C_DIR ${asn1_generated_dir}/F1AP_${ASN1RELDIR})
|
if (${RU} STREQUAL 0)
|
||||||
message("calling ASN1C_PREFIX=F1AP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${F1AP_ASN_GENERATED_C_DIR} ${F1AP_ASN_FILES}")
|
set(F1AP_ASN_GENERATED_C_DIR ${asn1_generated_dir}/F1AP_${ASN1RELDIR})
|
||||||
execute_process(COMMAND mkdir -p ${F1AP_ASN_GENERATED_C_DIR}
|
message("calling ASN1C_PREFIX=F1AP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${F1AP_ASN_GENERATED_C_DIR} ${F1AP_ASN_FILES}")
|
||||||
COMMAND env "ASN1C_PREFIX=F1AP_" asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${F1AP_ASN_GENERATED_C_DIR} ${F1AP_ASN_FILES}
|
execute_process(
|
||||||
RESULT_VARIABLE ret
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "F1AP_" "-findirect-choice -fno-include-deps" ${F1AP_ASN_GENERATED_C_DIR} ${F1AP_ASN_FILES}
|
||||||
OUTPUT_QUIET
|
RESULT_VARIABLE ret
|
||||||
ERROR_QUIET)
|
)
|
||||||
|
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "asn1c: error")
|
message(FATAL_ERROR "asn1c: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
|
||||||
file(GLOB F1AP_ASN_GENERATED_C_FILES ${F1AP_ASN_GENERATED_C_DIR}/*.c)
|
add_custom_target (
|
||||||
add_library(F1AP_LIB
|
f1_flag ALL
|
||||||
${F1AP_ASN_GENERATED_C_FILES}
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "F1AP_" "-findirect-choice -fno-include-deps" ${F1AP_ASN_GENERATED_C_DIR} ${F1AP_ASN_FILES}
|
||||||
)
|
DEPENDS ${F1AP_ASN_FILES}
|
||||||
|
)
|
||||||
|
file(GLOB F1AP_ASN_GENERATED_C_FILES ${F1AP_ASN_GENERATED_C_DIR}/*.c)
|
||||||
|
add_library(F1AP_LIB
|
||||||
|
${F1AP_ASN_GENERATED_C_FILES}
|
||||||
|
)
|
||||||
|
add_dependencies (F1AP_LIB f1_flag)
|
||||||
|
|
||||||
include_directories ("${F1AP_ASN_GENERATED_C_DIR}")
|
include_directories ("${F1AP_ASN_GENERATED_C_DIR}")
|
||||||
include_directories ("${F1AP_DIR}")
|
include_directories ("${F1AP_DIR}")
|
||||||
@@ -836,6 +861,7 @@ add_library(F1AP
|
|||||||
${F1AP_C_FILES}
|
${F1AP_C_FILES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
endif (${RU} STREQUAL 0)
|
||||||
|
|
||||||
# Hardware dependant options
|
# Hardware dependant options
|
||||||
###################################
|
###################################
|
||||||
@@ -844,8 +870,6 @@ add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2"
|
|||||||
|
|
||||||
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU")
|
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET")
|
add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET")
|
||||||
#NOKIA config enhancement
|
#NOKIA config enhancement
|
||||||
set (CONFIG_ROOTDIR
|
set (CONFIG_ROOTDIR
|
||||||
@@ -1642,7 +1666,6 @@ set(PHY_SRC_COMMON
|
|||||||
${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
|
${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/init_top.c
|
${OPENAIR1_DIR}/PHY/INIT/init_top.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
|
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
|
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/dfts_load.c
|
${OPENAIR1_DIR}/PHY/TOOLS/dfts_load.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
||||||
@@ -2908,6 +2931,8 @@ add_executable(lte-softmodem
|
|||||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
${XFORMSINTERFACE_SOURCE}
|
${XFORMSINTERFACE_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
@@ -2949,6 +2974,8 @@ add_executable(ocp-enb
|
|||||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
${XFORMSINTERFACE_SOURCE}
|
${XFORMSINTERFACE_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
@@ -2993,6 +3020,33 @@ target_link_libraries(du_test
|
|||||||
${PROTO_AGENT_LIB} pthread UTIL ${T_LIB} dl ${ITTI_LIB}
|
${PROTO_AGENT_LIB} pthread UTIL ${T_LIB} dl ${ITTI_LIB}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_executable(oairu
|
||||||
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
|
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
||||||
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
|
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
|
${OPENAIR_DIR}/executables/main_ru.c
|
||||||
|
${T_SOURCE}
|
||||||
|
${OPENAIR_DIR}/common/utils/LOG/log.c
|
||||||
|
${CONFIG_SOURCES}
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
|
${SHLIB_LOADER_SOURCES}
|
||||||
|
)
|
||||||
|
target_link_libraries (oairu
|
||||||
|
-Wl,--start-group
|
||||||
|
SCHED_RU_LIB
|
||||||
|
PHY_COMMON PHY_RU
|
||||||
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
|
target_link_libraries (oairu pthread m ${CONFIG_LIB} rt ${CMAKE_DL_LIBS} ${T_LIB})
|
||||||
|
|
||||||
|
|
||||||
# lte-uesoftmodem is UE implementation
|
# lte-uesoftmodem is UE implementation
|
||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
@@ -3001,9 +3055,6 @@ add_executable(lte-uesoftmodem
|
|||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rfsim.c
|
|
||||||
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
||||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||||
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
||||||
@@ -3015,6 +3066,8 @@ add_executable(lte-uesoftmodem
|
|||||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
${XFORMSINTERFACE_SOURCE}
|
${XFORMSINTERFACE_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
@@ -3061,6 +3114,8 @@ add_executable(nr-softmodem
|
|||||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${XFORMSINTERFACE_SOURCE}
|
${XFORMSINTERFACE_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
@@ -3159,7 +3214,7 @@ target_link_libraries (nr-uesoftmodem
|
|||||||
NFAPI_USER_LIB MISC_NFAPI_NR_LIB S1AP_LIB S1AP_ENB
|
NFAPI_USER_LIB MISC_NFAPI_NR_LIB S1AP_LIB S1AP_ENB
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
|
||||||
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB ${NAS_SIM_LIB}
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES})
|
target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES})
|
||||||
@@ -3410,6 +3465,9 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr
|
|||||||
${OPENAIR_DIR}/common/utils/backtrace.c
|
${OPENAIR_DIR}/common/utils/backtrace.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
|
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
|
||||||
${XFORMS_SOURCE}
|
${XFORMS_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
@@ -3594,6 +3652,9 @@ add_executable(nr-ittisim
|
|||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
|
${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c
|
||||||
${XFORMSINTERFACE_SOURCE}
|
${XFORMSINTERFACE_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
@@ -3606,7 +3667,7 @@ target_link_libraries (nr-ittisim
|
|||||||
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
|
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
|
||||||
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||||
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
||||||
PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE
|
PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES})
|
target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES})
|
||||||
|
|||||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+34
-34
@@ -1099,10 +1099,9 @@
|
|||||||
(Test14: 3 PTRS, 8 Interpolated Symbols),
|
(Test14: 3 PTRS, 8 Interpolated Symbols),
|
||||||
(Test15: 6 PTRS, 5 Interpolated Symbols),
|
(Test15: 6 PTRS, 5 Interpolated Symbols),
|
||||||
(Test16: 11 PTRS, 0 Interpolated Symbols),
|
(Test16: 11 PTRS, 0 Interpolated Symbols),
|
||||||
(Test17: 2 DMRS Symbols),
|
(Test17: Mapping type A, 2 DMRS Symbols),
|
||||||
(Test18: 3 DMRS Symbols),
|
(Test18: Mapping type A, 3 DMRS Symbols),
|
||||||
(Test19: 106 PDSCH-PRBs MCS 28),
|
(Test19: Mapping type B, 4 DMRS Symbols)</desc>
|
||||||
(Test20: 256 QAM MCS 27)</desc>
|
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1110,26 +1109,25 @@
|
|||||||
<pre_exec_args></pre_exec_args>
|
<pre_exec_args></pre_exec_args>
|
||||||
<main_exec> $OPENAIR_DIR/targets/bin/nr_dlsim.Rel15</main_exec>
|
<main_exec> $OPENAIR_DIR/targets/bin/nr_dlsim.Rel15</main_exec>
|
||||||
<main_exec_args>-n100 -R106 -b106 -s5
|
<main_exec_args>-n100 -R106 -b106 -s5
|
||||||
-n100 -R217 -b217 -s5
|
-n100 -R217 -b217 -s5
|
||||||
-n100 -R273 -b273 -s5
|
-n100 -R273 -b273 -s5
|
||||||
-n100 -R106 -a25 -s5
|
-n100 -R106 -a25 -s5
|
||||||
-n100 -R106 -a51 -s5
|
-n100 -R106 -a51 -s5
|
||||||
-n100 -R217 -b100 -s5
|
-n100 -R217 -b100 -s5
|
||||||
-n100 -R217 -a80 -s5
|
-n100 -R217 -a80 -s5
|
||||||
-n100 -R217 -a110 -s5 -b100
|
-n100 -R217 -a110 -s5 -b100
|
||||||
-n100 -e27 -s30
|
-n100 -e27 -s30
|
||||||
-n100 -e16 -s10
|
-n100 -e16 -s10
|
||||||
-n100 -s1 -t25
|
-n100 -s1 -t25
|
||||||
-n100 -s1 -t33
|
-n100 -s1 -t33
|
||||||
-n100 -s1 -t50
|
-n100 -s1 -t50
|
||||||
-n100 -s5 -T 2 2 2
|
-n100 -s5 -T 2 2 2
|
||||||
-n100 -s5 -T 2 1 2
|
-n100 -s5 -T 2 1 2
|
||||||
-n100 -s5 -T 2 0 4
|
-n100 -s5 -T 2 0 4
|
||||||
-n100 -s2 -U 2 0 1
|
-n100 -s2 -U 2 0 1
|
||||||
-n100 -s2 -U 2 0 2
|
-n100 -s2 -U 2 0 2
|
||||||
-n100 -s25 -e28 -t75
|
-n100 -s2 -U 2 1 3</main_exec_args>
|
||||||
-n100 -s35 -q -e27 -t75</main_exec_args>
|
<tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19</tags>
|
||||||
<tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20</tags>
|
|
||||||
<search_expr_true>PDSCH test OK</search_expr_true>
|
<search_expr_true>PDSCH test OK</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
@@ -1291,15 +1289,16 @@
|
|||||||
(Test3: MCS 28 50 PRBs),
|
(Test3: MCS 28 50 PRBs),
|
||||||
(Test4: MCS 9 217 PRBs),
|
(Test4: MCS 9 217 PRBs),
|
||||||
(Test5: MCS 9 273 PRBs),
|
(Test5: MCS 9 273 PRBs),
|
||||||
(Test6: DMRS Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols),
|
(Test6: DMRS Type A, 2 DMRS Symbols),
|
||||||
(Test7: DMRS Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols),
|
(Test7: DMRS Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols),
|
||||||
(Test8: DMRS Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
|
(Test8: DMRS Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols),
|
||||||
(Test9: SC-FDMA, 50 PRBs),
|
(Test9: DMRS Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
|
||||||
(Test10: SC-FDMA, 75 PRBs),
|
(Test10: SC-FDMA, 50 PRBs),
|
||||||
(Test11: SC-FDMA, 216 PRBs),
|
(Test11: SC-FDMA, 75 PRBs),
|
||||||
(Test12: SC-FDMA, 273 PRBs),
|
(Test12: SC-FDMA, 216 PRBs),
|
||||||
(Test13: SC-FDMA, 3 DMRS),
|
(Test13: SC-FDMA, 273 PRBs),
|
||||||
(Test14: MCS 16 50 PRBs 2 RX_Antenna)</desc>
|
(Test14: SC-FDMA, 3 DMRS),
|
||||||
|
(Test15: MCS 16 50 PRBs 2 RX_Antenna)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1311,6 +1310,7 @@
|
|||||||
-n100 -m28 -s20
|
-n100 -m28 -s20
|
||||||
-n100 -m9 -R217 -r217 -s5
|
-n100 -m9 -R217 -r217 -s5
|
||||||
-n100 -m9 -R273 -r273 -s5
|
-n100 -m9 -R273 -r273 -s5
|
||||||
|
-n100 -s5 -U 2 0 1
|
||||||
-n100 -s5 -T 2 1 2 -U 2 0 2
|
-n100 -s5 -T 2 1 2 -U 2 0 2
|
||||||
-n100 -s5 -T 2 2 2 -U 2 1 2
|
-n100 -s5 -T 2 2 2 -U 2 1 2
|
||||||
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
|
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
|
||||||
@@ -1321,7 +1321,7 @@
|
|||||||
-n100 -s2 -Z -U 2 0 2
|
-n100 -s2 -Z -U 2 0 2
|
||||||
-n100 -m16 -s10 -z2</main_exec_args>
|
-n100 -m16 -s10 -z2</main_exec_args>
|
||||||
|
|
||||||
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14</tags>
|
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15</tags>
|
||||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
<search_expr_true>PUSCH test OK</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
|
|||||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+39
-21
@@ -70,6 +70,7 @@ NR="False"
|
|||||||
ITTI_SIM="False"
|
ITTI_SIM="False"
|
||||||
SANITIZE_ADDRESS="False"
|
SANITIZE_ADDRESS="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
||||||
|
RU=0
|
||||||
trap handle_ctrl_c INT
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
function print_help() {
|
function print_help() {
|
||||||
@@ -104,6 +105,8 @@ Options
|
|||||||
Makes the NR softmodem
|
Makes the NR softmodem
|
||||||
--nrUE
|
--nrUE
|
||||||
Makes the NR UE softmodem
|
Makes the NR UE softmodem
|
||||||
|
--RU
|
||||||
|
Makes the OAI RRU (without full stack)
|
||||||
--UE
|
--UE
|
||||||
Makes the UE specific parts (ue_ip, usim, nvram) from the given configuration file
|
Makes the UE specific parts (ue_ip, usim, nvram) from the given configuration file
|
||||||
--UE-conf-nvram [configuration file]
|
--UE-conf-nvram [configuration file]
|
||||||
@@ -241,25 +244,34 @@ function main() {
|
|||||||
shift;;
|
shift;;
|
||||||
--eNB)
|
--eNB)
|
||||||
eNB=1
|
eNB=1
|
||||||
|
RU=0
|
||||||
echo_info "Will compile eNB"
|
echo_info "Will compile eNB"
|
||||||
shift;;
|
shift;;
|
||||||
--eNBocp)
|
--eNBocp)
|
||||||
eNBocp=1
|
eNBocp=1
|
||||||
|
RU=0
|
||||||
echo_info "Will compile OCP eNB"
|
echo_info "Will compile OCP eNB"
|
||||||
shift;;
|
shift;;
|
||||||
--gNB)
|
--gNB)
|
||||||
gNB=1
|
gNB=1
|
||||||
|
RU=0
|
||||||
NR="True"
|
NR="True"
|
||||||
echo_info "Will compile gNB"
|
echo_info "Will compile gNB"
|
||||||
shift;;
|
shift;;
|
||||||
|
--RU)
|
||||||
|
RU=1
|
||||||
|
echo_info "Will compile RRU"
|
||||||
|
shift;;
|
||||||
-a | --agent)
|
-a | --agent)
|
||||||
echo_info "FlexRAN support is always compiled into the eNB"
|
echo_info "FlexRAN support is always compiled into the eNB"
|
||||||
shift;;
|
shift;;
|
||||||
--UE)
|
--UE)
|
||||||
|
RU=0
|
||||||
UE=1
|
UE=1
|
||||||
echo_info "Will compile UE"
|
echo_info "Will compile UE"
|
||||||
shift;;
|
shift;;
|
||||||
--nrUE)
|
--nrUE)
|
||||||
|
RU=0
|
||||||
nrUE=1
|
nrUE=1
|
||||||
NR="True"
|
NR="True"
|
||||||
echo_info "Will compile NR UE"
|
echo_info "Will compile NR UE"
|
||||||
@@ -296,6 +308,7 @@ function main() {
|
|||||||
shift 2;;
|
shift 2;;
|
||||||
-P | --phy_simulators)
|
-P | --phy_simulators)
|
||||||
SIMUS_PHY=1
|
SIMUS_PHY=1
|
||||||
|
RU=0
|
||||||
echo_info "Will compile dlsim, ulsim, ..."
|
echo_info "Will compile dlsim, ulsim, ..."
|
||||||
shift;;
|
shift;;
|
||||||
-S | --core_simulators)
|
-S | --core_simulators)
|
||||||
@@ -464,7 +477,7 @@ function main() {
|
|||||||
########################################################
|
########################################################
|
||||||
# to be discussed
|
# to be discussed
|
||||||
|
|
||||||
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$gNB" = "1" ] ; then
|
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$gNB" = "1" -o "$RU" = "1" ] ; then
|
||||||
if [ "$HW" = "None" -a "$TP" = "None" ] ; then
|
if [ "$HW" = "None" -a "$TP" = "None" ] ; then
|
||||||
echo_info "No local radio head and no transport protocol selected"
|
echo_info "No local radio head and no transport protocol selected"
|
||||||
fi
|
fi
|
||||||
@@ -591,7 +604,7 @@ function main() {
|
|||||||
config_libconfig_shlib=params_libconfig
|
config_libconfig_shlib=params_libconfig
|
||||||
|
|
||||||
# first generate the CMakefile in the right directory
|
# first generate the CMakefile in the right directory
|
||||||
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" -o "$HW" = "EXMIMO" -o "$ittiSIM" = "1" ] ; then
|
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$RU" = "1" -o "$nrUE" = "1" -o "$HW" = "EXMIMO" -o "$ittiSIM" = "1" ] ; then
|
||||||
|
|
||||||
# softmodem compilation
|
# softmodem compilation
|
||||||
|
|
||||||
@@ -615,6 +628,7 @@ function main() {
|
|||||||
echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file
|
echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file
|
||||||
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
||||||
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
||||||
|
echo "set ( RU $RU )" >> $cmake_file
|
||||||
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
||||||
echo "set ( SANITIZE_ADDRESS $SANITIZE_ADDRESS )" >> $cmake_file
|
echo "set ( SANITIZE_ADDRESS $SANITIZE_ADDRESS )" >> $cmake_file
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||||
@@ -631,6 +645,9 @@ function main() {
|
|||||||
if [ "$gNB" = "1" ] ; then
|
if [ "$gNB" = "1" ] ; then
|
||||||
execlist="$execlist nr-softmodem"
|
execlist="$execlist nr-softmodem"
|
||||||
fi
|
fi
|
||||||
|
if [ "$RU" = "1" ] ; then
|
||||||
|
execlist="$execlist oairu"
|
||||||
|
fi
|
||||||
if [ "$UE" = 1 ] ; then
|
if [ "$UE" = 1 ] ; then
|
||||||
execlist="$execlist lte-uesoftmodem"
|
execlist="$execlist lte-uesoftmodem"
|
||||||
fi
|
fi
|
||||||
@@ -659,28 +676,29 @@ function main() {
|
|||||||
$build_dir $config_libconfig_shlib \
|
$build_dir $config_libconfig_shlib \
|
||||||
lib$config_libconfig_shlib.so $dbin/lib$config_libconfig_shlib.so
|
lib$config_libconfig_shlib.so $dbin/lib$config_libconfig_shlib.so
|
||||||
|
|
||||||
compilations \
|
if [ "$RU" = "0" ] ; then
|
||||||
$build_dir coding \
|
|
||||||
libcoding.so $dbin/libcoding.so
|
|
||||||
|
|
||||||
|
|
||||||
#check if we run inside a container or not
|
|
||||||
#IS_CONTAINER variable is defined in build_helper file
|
|
||||||
#compile nasmesh and rb_tool only if NOT running in a container
|
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
|
||||||
then
|
|
||||||
compilations \
|
|
||||||
$build_dir nasmesh \
|
|
||||||
CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko
|
|
||||||
|
|
||||||
compilations \
|
compilations \
|
||||||
$build_dir rb_tool \
|
$build_dir coding \
|
||||||
rb_tool $dbin/rb_tool
|
libcoding.so $dbin/libcoding.so
|
||||||
|
|
||||||
cp $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $dbin
|
#check if we run inside a container or not
|
||||||
fi #IS_CONTAINER
|
#IS_CONTAINER variable is defined in build_helper file
|
||||||
|
#compile nasmesh and rb_tool only if NOT running in a container
|
||||||
|
if [ $IS_CONTAINER -eq 0 ]
|
||||||
|
then
|
||||||
|
compilations \
|
||||||
|
$build_dir nasmesh \
|
||||||
|
CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko
|
||||||
|
|
||||||
|
compilations \
|
||||||
|
$build_dir rb_tool \
|
||||||
|
rb_tool $dbin/rb_tool
|
||||||
|
|
||||||
|
cp $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $dbin
|
||||||
|
fi #IS_CONTAINER
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$UE" = 1 ] ; then
|
if [ "$UE" = 1 ] ; then
|
||||||
@@ -862,7 +880,7 @@ function main() {
|
|||||||
####################################################
|
####################################################
|
||||||
# Build RF device and transport protocol libraries #
|
# Build RF device and transport protocol libraries #
|
||||||
####################################################
|
####################################################
|
||||||
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" -o "$HWLAT" = "1" ] ; then
|
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$RU" = "1" -o "$nrUE" = "1" -o "$HWLAT" = "1" ] ; then
|
||||||
|
|
||||||
# build RF device libraries
|
# build RF device libraries
|
||||||
if [ "$HW" != "None" ] ; then
|
if [ "$HW" != "None" ] ; then
|
||||||
|
|||||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+1
@@ -17,4 +17,5 @@ set ( UE_TIMING_TRACE False )
|
|||||||
set ( USRP_REC_PLAY False )
|
set ( USRP_REC_PLAY False )
|
||||||
set ( SKIP_SHARED_LIB_FLAG False )
|
set ( SKIP_SHARED_LIB_FLAG False )
|
||||||
set ( PHYSIM True)
|
set ( PHYSIM True)
|
||||||
|
set ( RU 0)
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
|
||||||
|
|||||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user