Merge remote-tracking branch 'origin/develop' into NR_UE_Capabilities
This commit is contained in:
@@ -1,3 +1,24 @@
|
|||||||
|
<h1 align="center">
|
||||||
|
<a href="https://openairinterface.org/"><img src="https://openairinterface.org/wp-content/uploads/2015/06/cropped-oai_final_logo.png" alt="OAI" width="550"></a>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-OAI--Public--V1.1-blue" alt="License"></a>
|
||||||
|
<a href="https://releases.ubuntu.com/18.04/"><img src="https://img.shields.io/badge/OS-Ubuntu18-Green" alt="Supported OS"></a>
|
||||||
|
<a href="https://www.redhat.com/en/enterprise-linux-8"><img src="https://img.shields.io/badge/OS-RHEL8-Green" alt="Supported OS"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://jenkins-oai.eurecom.fr/job/RAN-Container-Parent/"><img src="https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins-oai.eurecom.fr%2Fjob%2FRAN-Container-Parent%2F&label=build%20Images"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://hub.docker.com/r/rdefosseoai/oai-enb"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/rdefosseoai/oai-enb?label=eNB%20docker%20pulls"></a>
|
||||||
|
<a href="https://hub.docker.com/r/rdefosseoai/oai-lte-ue"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/rdefosseoai/oai-lte-ue?label=LTE-UE%20docker%20pulls"></a>
|
||||||
|
<a href="https://hub.docker.com/r/rdefosseoai/oai-gnb"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/rdefosseoai/oai-gnb?label=gNB%20docker%20pulls"></a>
|
||||||
|
<a href="https://hub.docker.com/r/rdefosseoai/oai-nr-ue"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/rdefosseoai/oai-nr-ue?label=NR-UE%20docker%20pulls"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
# OpenAirInterface License #
|
# OpenAirInterface License #
|
||||||
|
|
||||||
OpenAirInterface is under OpenAirInterface Software Alliance license.
|
OpenAirInterface is under OpenAirInterface Software Alliance license.
|
||||||
|
|||||||
@@ -218,6 +218,26 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("NSA B200 Sanity Check") {
|
||||||
|
when { expression {doMandatoryTests} }
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-NSA-B200-Module-LTEBOX-Container', 'Test-NSA-B200')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Images Push to Registries") {
|
stage ("Images Push to Registries") {
|
||||||
@@ -226,11 +246,12 @@ pipeline {
|
|||||||
script {
|
script {
|
||||||
triggerSlaveJob ('RAN-DockerHub-Push', 'Push-to-Docker-Hub')
|
triggerSlaveJob ('RAN-DockerHub-Push', 'Push-to-Docker-Hub')
|
||||||
}
|
}
|
||||||
post {
|
}
|
||||||
failure {
|
post {
|
||||||
script {
|
failure {
|
||||||
currentBuild.result = 'FAILURE'
|
script {
|
||||||
}
|
echo "Push to Docker-Hub KO"
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -262,6 +283,7 @@ pipeline {
|
|||||||
echo "This is a MERGE event"
|
echo "This is a MERGE event"
|
||||||
addGitLabMRComment comment: message
|
addGitLabMRComment comment: message
|
||||||
}
|
}
|
||||||
|
echo "Pipeline is SUCCESSFUL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
@@ -271,6 +293,7 @@ pipeline {
|
|||||||
echo "This is a MERGE event"
|
echo "This is a MERGE event"
|
||||||
addGitLabMRComment comment: message
|
addGitLabMRComment comment: message
|
||||||
}
|
}
|
||||||
|
echo "Pipeline FAILED"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -279,6 +302,11 @@ pipeline {
|
|||||||
// ---- Slave Job functions
|
// ---- Slave Job functions
|
||||||
|
|
||||||
def triggerSlaveJob (jobName, gitlabStatusName) {
|
def triggerSlaveJob (jobName, gitlabStatusName) {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
MR_NUMBER = env.gitlabMergeRequestIid
|
||||||
|
} else {
|
||||||
|
MR_NUMBER = 'develop'
|
||||||
|
}
|
||||||
// Workaround for the "cancelled" GitLab pipeline notification
|
// Workaround for the "cancelled" GitLab pipeline notification
|
||||||
// The slave job is triggered with the propagate false so the following commands are executed
|
// The slave job is triggered with the propagate false so the following commands are executed
|
||||||
// Its status is now PASS/SUCCESS from a stage pipeline point of view
|
// Its status is now PASS/SUCCESS from a stage pipeline point of view
|
||||||
@@ -288,6 +316,7 @@ def triggerSlaveJob (jobName, gitlabStatusName) {
|
|||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
||||||
|
string(name: 'eNB_MR', value: String.valueOf(MR_NUMBER)),
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)),
|
booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)),
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
||||||
], propagate: false
|
], propagate: false
|
||||||
@@ -304,6 +333,11 @@ def triggerSlaveJob (jobName, gitlabStatusName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def triggerSlaveJobNoGitLab (jobName) {
|
def triggerSlaveJobNoGitLab (jobName) {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
MR_NUMBER = env.gitlabMergeRequestIid
|
||||||
|
} else {
|
||||||
|
MR_NUMBER = 'develop'
|
||||||
|
}
|
||||||
// Workaround for the "cancelled" GitLab pipeline notification
|
// Workaround for the "cancelled" GitLab pipeline notification
|
||||||
// The slave job is triggered with the propagate false so the following commands are executed
|
// The slave job is triggered with the propagate false so the following commands are executed
|
||||||
// Its status is now PASS/SUCCESS from a stage pipeline point of view
|
// Its status is now PASS/SUCCESS from a stage pipeline point of view
|
||||||
@@ -313,6 +347,7 @@ def triggerSlaveJobNoGitLab (jobName) {
|
|||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
||||||
|
string(name: 'eNB_MR', value: String.valueOf(MR_NUMBER)),
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)),
|
booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)),
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
||||||
], propagate: false
|
], propagate: false
|
||||||
|
|||||||
@@ -33,9 +33,12 @@ pipeline {
|
|||||||
stages {
|
stages {
|
||||||
stage ("gDashboard") {
|
stage ("gDashboard") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
//retrieve MR data from gitlab and export to gSheet
|
dir ("ci-scripts/ran_dashboard") {
|
||||||
sh returnStdout: true, script: 'python3 ci-scripts/ran_dashboard.py'
|
//retrieve MR data from gitlab / mySQL db, build HTML pages and load them to AWS S3 bucket (configured as static web page hosting)
|
||||||
|
//deprecated method : sh returnStdout: true, script: 'python3 ran_dashboard.py'
|
||||||
|
sh returnStdout: true, script: 'python3 Hdashboard.py'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,8 +134,8 @@ pipeline {
|
|||||||
eNB_CommitID = params.eNB_CommitID
|
eNB_CommitID = params.eNB_CommitID
|
||||||
}
|
}
|
||||||
echo "eNB_CommitID : ${eNB_CommitID}"
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
if (params.eNB_AllowMergeRequestProcess!= null) {
|
if (params.eNB_mergeRequest!= null) {
|
||||||
eNB_AllowMergeRequestProcess = params.eNB_AllowMergeRequestProcess
|
eNB_AllowMergeRequestProcess = params.eNB_mergeRequest
|
||||||
if (eNB_AllowMergeRequestProcess) {
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
if (params.eNB_TargetBranch != null) {
|
if (params.eNB_TargetBranch != null) {
|
||||||
eNB_TargetBranch = params.eNB_TargetBranch
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
|||||||
@@ -145,8 +145,8 @@ pipeline {
|
|||||||
// eNB_CommitID = params.eNB_CommitID
|
// eNB_CommitID = params.eNB_CommitID
|
||||||
//}
|
//}
|
||||||
echo "eNB_CommitID : ${eNB_CommitID}"
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
if (params.eNB_AllowMergeRequestProcess!= null) {
|
if (params.eNB_mergeRequest!= null) {
|
||||||
eNB_AllowMergeRequestProcess = params.eNB_AllowMergeRequestProcess
|
eNB_AllowMergeRequestProcess = params.eNB_mergeRequest
|
||||||
if (eNB_AllowMergeRequestProcess) {
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
if (params.eNB_TargetBranch != null) {
|
if (params.eNB_TargetBranch != null) {
|
||||||
eNB_TargetBranch = params.eNB_TargetBranch
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
|||||||
@@ -51,270 +51,356 @@ def StatusForDb = ""
|
|||||||
|
|
||||||
|
|
||||||
pipeline {
|
pipeline {
|
||||||
agent {label pythonExecutor}
|
agent {label pythonExecutor}
|
||||||
options {
|
options {
|
||||||
disableConcurrentBuilds()
|
disableConcurrentBuilds()
|
||||||
ansiColor('xterm')
|
ansiColor('xterm')
|
||||||
lock(extra: [[resource: ciSmartPhonesResource2]], resource: ciSmartPhonesResource1)
|
lock(extra: [[resource: ciSmartPhonesResource2]], resource: ciSmartPhonesResource1)
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
stages {
|
stage ("Verify Parameters") {
|
||||||
stage("Build Init") {
|
steps {
|
||||||
steps {
|
script {
|
||||||
// update the build name and description
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
buildName "${params.eNB_MR}"
|
def allParametersPresent = true
|
||||||
buildDescription "Branch : ${params.eNB_Branch}"
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
if (params.UE_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.UE_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.UE_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_mergeRequest!= null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_mergeRequest
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
if (params.eNB_TargetBranch != null) {
|
||||||
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
} else {
|
||||||
|
eNB_TargetBranch = 'develop'
|
||||||
|
}
|
||||||
|
echo "eNB_TargetBranch : ${eNB_TargetBranch}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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.EPC_IPAddress == null) {
|
||||||
if (params.pythonExecutor != null) {
|
allParametersPresent = false
|
||||||
echo "eNB CI executor node : ${pythonExecutor}"
|
}
|
||||||
}
|
if (params.EPC_Type == null) {
|
||||||
// If not present picking a default Stage Name
|
allParametersPresent = false
|
||||||
if (params.pipelineTestStageName == null) {
|
}
|
||||||
// picking default
|
if (params.EPC_SourceCodePath == null) {
|
||||||
testStageName = 'Template Test Stage'
|
allParametersPresent = false
|
||||||
}
|
}
|
||||||
|
if (params.EPC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
if (params.SmartPhonesResource1 == null) {
|
if (params.ADB_IPAddress == null) {
|
||||||
allParametersPresent = false
|
allParametersPresent = false
|
||||||
}
|
}
|
||||||
if (params.SmartPhonesResource2 == null) {
|
if (params.ADB_Credentials == null) {
|
||||||
allParametersPresent = false
|
allParametersPresent = false
|
||||||
}
|
}
|
||||||
// 1st eNB parameters
|
if (params.DataBaseHost == "none") {
|
||||||
if (params.eNB_IPAddress == null) {
|
DataBaseHost = pythonExecutor
|
||||||
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) {
|
if (allParametersPresent) {
|
||||||
allParametersPresent = false
|
echo "All parameters are present"
|
||||||
}
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
if (params.EPC_Type == null) {
|
sh "git fetch"
|
||||||
allParametersPresent = false
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
}
|
} else {
|
||||||
if (params.EPC_SourceCodePath == null) {
|
sh "git fetch"
|
||||||
allParametersPresent = false
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
}
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
stage ("Build and Test") {
|
}
|
||||||
steps {
|
}
|
||||||
script {
|
stage ("Build and Test") {
|
||||||
dir ('ci-scripts') {
|
steps {
|
||||||
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
script {
|
||||||
// If not present picking a default XML file
|
dir ('ci-scripts') {
|
||||||
if (params.pythonTestXmlFile == null) {
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
// picking default
|
// If not present picking a default XML file
|
||||||
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
if (params.pythonTestXmlFile == null) {
|
||||||
echo "Test XML file(default): ${testXMLFile}"
|
// picking default
|
||||||
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
} else {
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
for (xmlFile in myXmlTestSuite) {
|
} else {
|
||||||
if (fileExists(xmlFile)) {
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
for (xmlFile in myXmlTestSuite) {
|
||||||
echo "Test XML file : ${xmlFile}"
|
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}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
withCredentials([
|
||||||
stage('Log Collection') {
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||||
parallel {
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB1_Credentials}", usernameVariable: 'eNB1_Username', passwordVariable: 'eNB1_Password'],
|
||||||
stage('Log Collection (eNB - Build)') {
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB2_Credentials}", usernameVariable: 'eNB2_Username', passwordVariable: 'eNB2_Password'],
|
||||||
steps {
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||||
withCredentials([
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password'],
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
]) {
|
]) {
|
||||||
echo '\u2705 \u001B[32mLog Collection (eNB - Build)\u001B[0m'
|
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}"
|
||||||
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
echo '\u2705 \u001B[32mLog Transfer (eNB - Build)\u001B[0m'
|
if (fileExists(xmlFile)) {
|
||||||
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"
|
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} --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_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}"
|
||||||
script {
|
} catch (Exception e) {
|
||||||
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
|
currentBuild.result = 'FAILURE'
|
||||||
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
|
buildStageStatus = false
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Log Collection (CN)') {
|
|
||||||
steps {
|
|
||||||
withCredentials([
|
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
|
||||||
]) {
|
|
||||||
echo '\u2705 \u001B[32mLog Transfer (CN)\u001B[0m'
|
|
||||||
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/logs/oai-cn5g.log.zip ./oai-cn5g.log.${env.BUILD_ID}.zip || true"
|
|
||||||
}
|
|
||||||
script {
|
|
||||||
if(fileExists("oai-cn5g.log.${env.BUILD_ID}.zip")) {
|
|
||||||
archiveArtifacts "oai-cn5g.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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("SQL Collect"){
|
|
||||||
agent {label DataBaseHost}
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
if (currentBuild.result=='FAILURE') {StatusForDb = 'FAIL'} else {StatusForDb = 'PASS'}
|
|
||||||
sh "python3 /home/oaicicd/mysql/sql_connect.py ${JOB_NAME} ${params.eNB_MR} ${params.eNB_Branch} ${env.BUILD_ID} ${env.BUILD_URL} ${StatusForDb} ''"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_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}"
|
||||||
|
|
||||||
post {
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Build)\u001B[0m'
|
||||||
always {
|
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 {
|
script {
|
||||||
if (params.pipelineZipsConsoleLog != null) {
|
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
|
||||||
if (params.pipelineZipsConsoleLog) {
|
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
|
||||||
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"
|
stage('Log Collection (OAI UE - Build)') {
|
||||||
}
|
steps {
|
||||||
}
|
echo '\u2705 \u001B[32mLog Collection (OAI UE - Build)\u001B[0m'
|
||||||
}
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (UE - Build)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${UE_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${UE_Username}@${params.UE_IPAddress}:${UE_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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (OAI UE - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (OAI UE - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectOAIUE --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (OAI UE - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${UE_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${UE_Username}@${params.UE_IPAddress}:${UE_SourceCodePath}/cmake_targets/ue.log.zip ./ue.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("ue.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "ue.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (CN)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (HSS)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
if (params.EPC_Type != 'OAICN5G') {
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/hss.log.zip ./hss.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (MME or AMF)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
if (params.EPC_Type == 'OAICN5G') {
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/mme.log.zip ./amf.log.${env.BUILD_ID}.zip || true"
|
||||||
|
} else {
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/mme.log.zip ./mme.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (SPGW or SMF/UPF)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
if (params.EPC_Type == 'OAICN5G') {
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/spgw.log.zip ./smf-upf.log.${env.BUILD_ID}.zip || true"
|
||||||
|
} else {
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/spgw.log.zip ./spgw.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(fileExists("hss.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "hss.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("mme.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "mme.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("spgw.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "spgw.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("amf.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "amf.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("smf-upf.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "smf-upf.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
echo '\u2705 \u001B[32mLog Collection for CoreNetwork Done!\u001B[0m'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("SQL Collect"){
|
||||||
|
when {
|
||||||
|
expression { params.DataBaseHost != "none" }
|
||||||
|
}
|
||||||
|
agent {label DataBaseHost}
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
if (currentBuild.result=='FAILURE') {StatusForDb = 'FAIL'} else {StatusForDb = 'PASS'}
|
||||||
|
sh "python3 /home/oaicicd/mysql/sql_connect.py ${JOB_NAME} ${params.eNB_MR} ${params.eNB_Branch} ${env.BUILD_ID} ${env.BUILD_URL} ${StatusForDb} ''"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ pipeline {
|
|||||||
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)),
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
||||||
booleanParam(name: 'eNB_AllowMergeRequestProcess', value: Boolean.valueOf(ALLOW_MERGE))
|
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
]
|
]
|
||||||
//calling NSA 2x2
|
//calling NSA 2x2
|
||||||
build job: "RAN-NSA-2x2-Module-OAIEPC", wait : true, propagate : false, parameters: [
|
build job: "RAN-NSA-2x2-Module-OAIEPC", wait : true, propagate : false, parameters: [
|
||||||
@@ -61,7 +61,7 @@ pipeline {
|
|||||||
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)),
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
||||||
booleanParam(name: 'eNB_AllowMergeRequestProcess', value: Boolean.valueOf(ALLOW_MERGE))
|
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
]
|
]
|
||||||
//calling LTE 2x2
|
//calling LTE 2x2
|
||||||
build job: "RAN-LTE-2x2-Module-OAIEPC", wait : true, propagate : false, parameters: [
|
build job: "RAN-LTE-2x2-Module-OAIEPC", wait : true, propagate : false, parameters: [
|
||||||
@@ -69,7 +69,7 @@ pipeline {
|
|||||||
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)),
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
||||||
booleanParam(name: 'eNB_AllowMergeRequestProcess', value: Boolean.valueOf(ALLOW_MERGE))
|
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
]
|
]
|
||||||
//calling SA
|
//calling SA
|
||||||
build job: "RAN-SA-Module-CN5G", wait : true, propagate : false, parameters: [
|
build job: "RAN-SA-Module-CN5G", wait : true, propagate : false, parameters: [
|
||||||
@@ -77,8 +77,25 @@ pipeline {
|
|||||||
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)),
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
||||||
booleanParam(name: 'eNB_AllowMergeRequestProcess', value: Boolean.valueOf(ALLOW_MERGE))
|
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
]
|
]
|
||||||
|
//calling OAIUE B200
|
||||||
|
build job: "RAN-SA-OAIUE-B200-CN5G", wait : true, propagate : false, parameters: [
|
||||||
|
string(name: 'eNB_MR', value: String.valueOf(MR)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
|
]
|
||||||
|
//calling OAIUE N310
|
||||||
|
build job: "RAN-SA-OAIUE-N310-CN5G", wait : true, propagate : false, parameters: [
|
||||||
|
string(name: 'eNB_MR', value: String.valueOf(MR)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+246
-63
@@ -101,10 +101,43 @@ class Containerize():
|
|||||||
self.cliContName = ''
|
self.cliContName = ''
|
||||||
self.cliOptions = ''
|
self.cliOptions = ''
|
||||||
|
|
||||||
|
self.imageToCopy = ''
|
||||||
|
self.registrySvrId = ''
|
||||||
|
self.testSvrId = ''
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Container management functions
|
# Container management functions
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
def _createWorkspace(self, sshSession, password, sourcePath):
|
||||||
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
|
if result is not None:
|
||||||
|
full_ran_repo_name = self.ranRepository.replace('git/', 'git')
|
||||||
|
else:
|
||||||
|
full_ran_repo_name = self.ranRepository + '.git'
|
||||||
|
sshSession.command('mkdir -p ' + sourcePath, '\$', 5)
|
||||||
|
sshSession.command('cd ' + sourcePath, '\$', 5)
|
||||||
|
sshSession.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
||||||
|
# Raphael: here add a check if git clone or git fetch went smoothly
|
||||||
|
sshSession.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
||||||
|
sshSession.command('git config user.name "OAI Jenkins"', '\$', 5)
|
||||||
|
|
||||||
|
sshSession.command('echo ' + password + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
||||||
|
sshSession.command('mkdir -p cmake_targets/log', '\$', 5)
|
||||||
|
# if the commit ID is provided use it to point to it
|
||||||
|
if self.ranCommitID != '':
|
||||||
|
sshSession.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||||
|
# if the branch is not develop, then it is a merge request and we need to do
|
||||||
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
if self.ranTargetBranch == '':
|
||||||
|
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
||||||
|
sshSession.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
else:
|
||||||
|
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
||||||
|
sshSession.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
|
||||||
def BuildImage(self, HTML):
|
def BuildImage(self, HTML):
|
||||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -173,36 +206,7 @@ class Containerize():
|
|||||||
|
|
||||||
self.testCase_id = HTML.testCase_id
|
self.testCase_id = HTML.testCase_id
|
||||||
|
|
||||||
# on RedHat/CentOS .git extension is mandatory
|
self._createWorkspace(mySSH, lPassWord, lSourcePath)
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
|
||||||
if result is not None:
|
|
||||||
full_ran_repo_name = self.ranRepository.replace('git/', 'git')
|
|
||||||
else:
|
|
||||||
full_ran_repo_name = self.ranRepository + '.git'
|
|
||||||
mySSH.command('mkdir -p ' + 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)
|
|
||||||
# Raphael: here add a check if git clone or git fetch went smoothly
|
|
||||||
mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
|
||||||
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
|
||||||
|
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
|
||||||
mySSH.command('mkdir -p cmake_targets/log', '\$', 5)
|
|
||||||
# if the commit ID is provided use it to point to it
|
|
||||||
if self.ranCommitID != '':
|
|
||||||
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
|
|
||||||
# the potential merge. Note that merge conflicts should already been checked earlier
|
|
||||||
imageTag = 'develop'
|
|
||||||
sharedTag = 'develop'
|
|
||||||
if (self.ranAllowMerge):
|
|
||||||
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)
|
|
||||||
|
|
||||||
# if asterix, copy the entitlement and subscription manager configurations
|
# if asterix, copy the entitlement and subscription manager configurations
|
||||||
if self.host == 'Red Hat':
|
if self.host == 'Red Hat':
|
||||||
@@ -212,15 +216,30 @@ class Containerize():
|
|||||||
mySSH.command('sudo cp /etc/pki/entitlement/*.pem tmp/entitlement/', '\$', 5)
|
mySSH.command('sudo cp /etc/pki/entitlement/*.pem tmp/entitlement/', '\$', 5)
|
||||||
|
|
||||||
sharedimage = 'ran-build'
|
sharedimage = 'ran-build'
|
||||||
|
sharedTag = 'develop'
|
||||||
|
forceSharedImageBuild = False
|
||||||
|
imageTag = 'develop'
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
imageTag = 'ci-temp'
|
||||||
|
if self.ranTargetBranch == 'develop':
|
||||||
|
mySSH.command('git diff HEAD..origin/develop -- docker/Dockerfile.ran' + self.dockerfileprefix + ' | grep --colour=never -i INDEX', '\$', 5)
|
||||||
|
result = re.search('index', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
forceSharedImageBuild = True
|
||||||
|
sharedTag = 'ci-temp'
|
||||||
|
else:
|
||||||
|
forceSharedImageBuild = True
|
||||||
|
|
||||||
# Let's remove any previous run artifacts if still there
|
# Let's remove any previous run artifacts if still there
|
||||||
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
if (not self.ranAllowMerge):
|
if forceSharedImageBuild:
|
||||||
mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + sharedTag, '\$', 30)
|
mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + sharedTag + ' || true', '\$', 30)
|
||||||
for image,pattern in imageNames:
|
for image,pattern in imageNames:
|
||||||
mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag, '\$', 30)
|
mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag + ' || true', '\$', 30)
|
||||||
|
|
||||||
# Build the shared image only on Push Events (not on Merge Requests)
|
# Build the shared image only on Push Events (not on Merge Requests)
|
||||||
if (not self.ranAllowMerge):
|
# On when the shared image docker file is being modified.
|
||||||
|
if forceSharedImageBuild:
|
||||||
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
|
||||||
# First verify if the shared image was properly created.
|
# First verify if the shared image was properly created.
|
||||||
status = True
|
status = True
|
||||||
@@ -388,6 +407,56 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
def Copy_Image_to_Test_Server(self, HTML):
|
||||||
|
imageTag = 'develop'
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
imageTag = 'ci-temp'
|
||||||
|
|
||||||
|
lSsh = SSH.SSHConnection()
|
||||||
|
# Going to the Docker Registry server
|
||||||
|
if self.registrySvrId == '0':
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
elif self.registrySvrId == '1':
|
||||||
|
lIpAddr = self.eNB1IPAddress
|
||||||
|
lUserName = self.eNB1UserName
|
||||||
|
lPassWord = self.eNB1Password
|
||||||
|
elif self.registrySvrId == '2':
|
||||||
|
lIpAddr = self.eNB2IPAddress
|
||||||
|
lUserName = self.eNB2UserName
|
||||||
|
lPassWord = self.eNB2Password
|
||||||
|
lSsh.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
lSsh.command('docker save ' + self.imageToCopy + ':' + imageTag + ' | gzip > ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60)
|
||||||
|
lSsh.copyin(lIpAddr, lUserName, lPassWord, '~/' + self.imageToCopy + '-' + imageTag + '.tar.gz', '.')
|
||||||
|
lSsh.command('rm ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60)
|
||||||
|
lSsh.close()
|
||||||
|
|
||||||
|
# Going to the Test Server
|
||||||
|
if self.testSvrId == '0':
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
elif self.testSvrId == '1':
|
||||||
|
lIpAddr = self.eNB1IPAddress
|
||||||
|
lUserName = self.eNB1UserName
|
||||||
|
lPassWord = self.eNB1Password
|
||||||
|
elif self.testSvrId == '2':
|
||||||
|
lIpAddr = self.eNB2IPAddress
|
||||||
|
lUserName = self.eNB2UserName
|
||||||
|
lPassWord = self.eNB2Password
|
||||||
|
lSsh.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
lSsh.copyout(lIpAddr, lUserName, lPassWord, './' + self.imageToCopy + '-' + imageTag + '.tar.gz', '~')
|
||||||
|
lSsh.command('docker rmi ' + self.imageToCopy + ':' + imageTag, '\$', 10)
|
||||||
|
lSsh.command('docker load < ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60)
|
||||||
|
lSsh.command('rm ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60)
|
||||||
|
lSsh.close()
|
||||||
|
|
||||||
|
if os.path.isfile('./' + self.imageToCopy + '-' + imageTag + '.tar.gz'):
|
||||||
|
os.remove('./' + self.imageToCopy + '-' + imageTag + '.tar.gz')
|
||||||
|
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
def DeployObject(self, HTML, EPC):
|
def DeployObject(self, HTML, EPC):
|
||||||
if self.eNB_serverId[self.eNB_instance] == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
@@ -408,35 +477,33 @@ class Containerize():
|
|||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
|
logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
|
||||||
|
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
# Putting the CPUs in a good state, we do that only on a few servers
|
|
||||||
mySSH.command('hostname', '\$', 5)
|
|
||||||
result = re.search('obelix|asterix', mySSH.getBefore())
|
|
||||||
if result is not None:
|
|
||||||
mySSH.command('if command -v cpupower &> /dev/null; then echo ' + lPassWord + ' | sudo -S cpupower idle-set -D 0; fi', '\$', 5)
|
|
||||||
time.sleep(5)
|
|
||||||
|
|
||||||
|
self._createWorkspace(mySSH, lPassWord, lSourcePath)
|
||||||
|
|
||||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||||
mySSH.command('cp docker-compose.yml ci-docker-compose.yml', '\$', 5)
|
mySSH.command('cp docker-compose.yml ci-docker-compose.yml', '\$', 5)
|
||||||
imageTag = 'develop'
|
imageTag = 'develop'
|
||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
imageTag = 'ci-temp'
|
imageTag = 'ci-temp'
|
||||||
mySSH.command('sed -i -e "s/image: oai-enb:latest/image: oai-enb:' + imageTag + '/" ci-docker-compose.yml', '\$', 2)
|
mySSH.command('sed -i -e "s/image: oai-enb:latest/image: oai-enb:' + imageTag + '/" ci-docker-compose.yml', '\$', 2)
|
||||||
|
mySSH.command('sed -i -e "s/image: oai-gnb:latest/image: oai-gnb:' + imageTag + '/" ci-docker-compose.yml', '\$', 2)
|
||||||
localMmeIpAddr = EPC.MmeIPAddress
|
localMmeIpAddr = EPC.MmeIPAddress
|
||||||
mySSH.command('sed -i -e "s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/" ci-docker-compose.yml', '\$', 2)
|
mySSH.command('sed -i -e "s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/" ci-docker-compose.yml', '\$', 2)
|
||||||
if self.flexranCtrlDeployed:
|
# if self.flexranCtrlDeployed:
|
||||||
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED:.*/FLEXRAN_ENABLED: "yes"/\' ci-docker-compose.yml', '\$', 2)
|
# mySSH.command('sed -i -e "s/FLEXRAN_ENABLED:.*/FLEXRAN_ENABLED: \'yes\'/" ci-docker-compose.yml', '\$', 2)
|
||||||
mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/' + self.flexranCtrlIpAddress + '/" ci-docker-compose.yml', '\$', 2)
|
# mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/' + self.flexranCtrlIpAddress + '/" ci-docker-compose.yml', '\$', 2)
|
||||||
else:
|
# else:
|
||||||
mySSH.command('sed -i -e "s/FLEXRAN_ENABLED:.*$/FLEXRAN_ENABLED: \"no\"/" ci-docker-compose.yml', '\$', 2)
|
# mySSH.command('sed -i -e "s/FLEXRAN_ENABLED:.*$/FLEXRAN_ENABLED: \'no\'/" ci-docker-compose.yml', '\$', 2)
|
||||||
mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/127.0.0.1/" ci-docker-compose.yml', '\$', 2)
|
# mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/127.0.0.1/" ci-docker-compose.yml', '\$', 2)
|
||||||
# Currently support only one
|
# Currently support only one
|
||||||
mySSH.command('docker-compose --file ci-docker-compose.yml config --services | sed -e "s@^@service=@"', '\$', 2)
|
mySSH.command('docker-compose --file ci-docker-compose.yml config --services | sed -e "s@^@service=@" 2>&1', '\$', 10)
|
||||||
result = re.search('service=(?P<svc_name>[a-zA-Z0-9\_]+)', mySSH.getBefore())
|
result = re.search('service=(?P<svc_name>[a-zA-Z0-9\_]+)', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
svcName = result.group('svc_name')
|
svcName = result.group('svc_name')
|
||||||
mySSH.command('docker-compose --file ci-docker-compose.yml up -d ' + svcName, '\$', 2)
|
mySSH.command('docker-compose --file ci-docker-compose.yml up -d ' + svcName, '\$', 10)
|
||||||
|
|
||||||
# Checking Status
|
# Checking Status
|
||||||
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
||||||
@@ -450,7 +517,7 @@ class Containerize():
|
|||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
cnt = 0
|
cnt = 0
|
||||||
while (cnt < 3):
|
while (cnt < 3):
|
||||||
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + containerName, '\$', 5)
|
mySSH.command('docker inspect --format="{{.State.Health.Status}}" ' + containerName, '\$', 5)
|
||||||
unhealthyNb = mySSH.getBefore().count('unhealthy')
|
unhealthyNb = mySSH.getBefore().count('unhealthy')
|
||||||
healthyNb = mySSH.getBefore().count('healthy') - unhealthyNb
|
healthyNb = mySSH.getBefore().count('healthy') - unhealthyNb
|
||||||
startingNb = mySSH.getBefore().count('starting')
|
startingNb = mySSH.getBefore().count('starting')
|
||||||
@@ -513,18 +580,17 @@ class Containerize():
|
|||||||
# Currently support only one
|
# Currently support only one
|
||||||
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
||||||
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
||||||
|
if self.eNB_logFile[self.eNB_instance] == '':
|
||||||
|
self.eNB_logFile[self.eNB_instance] = 'enb_' + HTML.testCase_id + '.log'
|
||||||
if result is not None:
|
if result is not None:
|
||||||
containerName = result.group('container_name')
|
containerName = result.group('container_name')
|
||||||
mySSH.command('docker kill --signal INT ' + containerName, '\$', 30)
|
mySSH.command('docker kill --signal INT ' + containerName, '\$', 30)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30)
|
mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30)
|
||||||
mySSH.command('docker rm -f ' + containerName, '\$', 30)
|
mySSH.command('docker rm -f ' + containerName, '\$', 30)
|
||||||
|
# Forcing the down now to remove the networks and any artifacts
|
||||||
|
mySSH.command('docker-compose --file ci-docker-compose.yml down', '\$', 5)
|
||||||
|
|
||||||
# Putting the CPUs back in a idle state, we do that only on a few servers
|
|
||||||
mySSH.command('hostname', '\$', 5)
|
|
||||||
result = re.search('obelix|asterix', mySSH.getBefore())
|
|
||||||
if result is not None:
|
|
||||||
mySSH.command('if command -v cpupower &> /dev/null; then echo ' + lPassWord + ' | sudo -S cpupower idle-set -E; fi', '\$', 5)
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
# Analyzing log file!
|
# Analyzing log file!
|
||||||
@@ -540,6 +606,9 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
# all the xNB run logs shall be on the server 0 for logCollecting
|
||||||
|
if self.eNB_serverId[self.eNB_instance] != '0':
|
||||||
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + self.eNB_logFile[self.eNB_instance], self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
|
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
|
||||||
|
|
||||||
def DeployGenObject(self, HTML):
|
def DeployGenObject(self, HTML):
|
||||||
@@ -572,7 +641,7 @@ class Containerize():
|
|||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml up -d ' + self.services[0]
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml up -d ' + self.services[0]
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
try:
|
try:
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.exitStatus = 1
|
self.exitStatus = 1
|
||||||
logging.error('Could not deploy')
|
logging.error('Could not deploy')
|
||||||
@@ -585,7 +654,7 @@ class Containerize():
|
|||||||
healthy = 0
|
healthy = 0
|
||||||
while (count < 10):
|
while (count < 10):
|
||||||
count += 1
|
count += 1
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
healthy = 0
|
healthy = 0
|
||||||
for state in deployStatus.split('\n'):
|
for state in deployStatus.split('\n'):
|
||||||
res = re.search('Up \(healthy\)', state)
|
res = re.search('Up \(healthy\)', state)
|
||||||
@@ -617,7 +686,7 @@ class Containerize():
|
|||||||
# if the containers are running, recover the logs!
|
# if the containers are running, recover the logs!
|
||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
anyLogs = False
|
anyLogs = False
|
||||||
for state in deployStatus.split('\n'):
|
for state in deployStatus.split('\n'):
|
||||||
res = re.search('Name|----------', state)
|
res = re.search('Name|----------', state)
|
||||||
@@ -631,7 +700,7 @@ class Containerize():
|
|||||||
cName = res.group('container_name')
|
cName = res.group('container_name')
|
||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker logs ' + cName + ' > ' + cName + '.log 2>&1'
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker logs ' + cName + ' > ' + cName + '.log 2>&1'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
if anyLogs:
|
if anyLogs:
|
||||||
cmd = 'mkdir -p ../cmake_targets/log && mv ' + self.yamlPath[0] + '/*.log ../cmake_targets/log'
|
cmd = 'mkdir -p ../cmake_targets/log && mv ' + self.yamlPath[0] + '/*.log ../cmake_targets/log'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
@@ -656,7 +725,7 @@ class Containerize():
|
|||||||
cmd = 'mkdir -p ../cmake_targets/log'
|
cmd = 'mkdir -p ../cmake_targets/log'
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
|
||||||
cmd = 'docker exec ' + self.pingContName + ' /bin/bash -c "ping ' + self.pingOptions + '" 2>&1 | tee ../cmake_targets/log/ping_' + HTML.testCase_id + '.log'
|
cmd = 'docker exec ' + self.pingContName + ' /bin/bash -c "ping ' + self.pingOptions + '" 2>&1 | tee ../cmake_targets/log/ping_' + HTML.testCase_id + '.log || true'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
|
||||||
|
|
||||||
@@ -722,24 +791,24 @@ class Containerize():
|
|||||||
logStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
logStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
|
||||||
# Start the server process
|
# Start the server process
|
||||||
cmd = 'docker exec -d ' + self.svrContName + ' /bin/bash -c "nohup iperf ' + self.svrOptions + ' > /tmp/iperf_server.log 2>&1"'
|
cmd = 'docker exec -d ' + self.svrContName + ' /bin/bash -c "nohup iperf ' + self.svrOptions + ' > /tmp/iperf_server.log 2>&1" || true'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
|
||||||
# Start the client process
|
# Start the client process
|
||||||
cmd = 'docker exec ' + self.cliContName + ' /bin/bash -c "iperf ' + self.cliOptions + '" 2>&1 | tee ../cmake_targets/log/iperf_client_' + HTML.testCase_id + '.log'
|
cmd = 'docker exec ' + self.cliContName + ' /bin/bash -c "iperf ' + self.cliOptions + '" 2>&1 | tee ../cmake_targets/log/iperf_client_' + HTML.testCase_id + '.log || true'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
clientStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
|
clientStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
|
||||||
|
|
||||||
# Stop the server process
|
# Stop the server process
|
||||||
cmd = 'docker exec ' + self.svrContName + ' /bin/bash -c "pkill iperf"'
|
cmd = 'docker exec ' + self.svrContName + ' /bin/bash -c "pkill iperf" || true'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
cmd = 'docker cp ' + self.svrContName + ':/tmp/iperf_server.log ../cmake_targets/log/iperf_server_' + HTML.testCase_id + '.log'
|
cmd = 'docker cp ' + self.svrContName + ':/tmp/iperf_server.log ../cmake_targets/log/iperf_server_' + HTML.testCase_id + '.log'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
|
|
||||||
# Analyze client output
|
# Analyze client output
|
||||||
result = re.search('Server Report:', clientStatus)
|
result = re.search('Server Report:', clientStatus)
|
||||||
@@ -750,6 +819,7 @@ class Containerize():
|
|||||||
else:
|
else:
|
||||||
message = 'Server Report and Connection refused Not Found!'
|
message = 'Server Report and Connection refused Not Found!'
|
||||||
self.IperfExit(HTML, False, message)
|
self.IperfExit(HTML, False, message)
|
||||||
|
logging.error('\u001B[1;37;41m Iperf Test FAIL\u001B[0m')
|
||||||
return
|
return
|
||||||
|
|
||||||
# Computing the requested bandwidth in float
|
# Computing the requested bandwidth in float
|
||||||
@@ -822,6 +892,8 @@ class Containerize():
|
|||||||
self.IperfExit(HTML, iperfStatus, 'problem?')
|
self.IperfExit(HTML, iperfStatus, 'problem?')
|
||||||
if iperfStatus:
|
if iperfStatus:
|
||||||
logging.info('\u001B[1m Iperf Test PASS\u001B[0m')
|
logging.info('\u001B[1m Iperf Test PASS\u001B[0m')
|
||||||
|
else:
|
||||||
|
logging.error('\u001B[1;37;41m Iperf Test FAIL\u001B[0m')
|
||||||
|
|
||||||
def IperfExit(self, HTML, status, message):
|
def IperfExit(self, HTML, status, message):
|
||||||
html_queue = SimpleQueue()
|
html_queue = SimpleQueue()
|
||||||
@@ -832,3 +904,114 @@ class Containerize():
|
|||||||
else:
|
else:
|
||||||
self.exitStatus = 1
|
self.exitStatus = 1
|
||||||
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'KO', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'KO', 1, html_queue)
|
||||||
|
|
||||||
|
def CheckAndAddRoute(self, svrName, ipAddr, userName, password):
|
||||||
|
logging.debug('Checking IP routing on ' + svrName)
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
if svrName == 'porcepix':
|
||||||
|
mySSH.open(ipAddr, userName, password)
|
||||||
|
# Check if route to asterix gnb exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.68.64/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.194', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.64/26 via 192.168.18.194 dev eno1', '\$', 10)
|
||||||
|
# Check if route to obelix enb exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.193', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 192.168.18.193 dev eno1', '\$', 10)
|
||||||
|
# Check if route to nepes gnb exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.68.192/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.209', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.192/26 via 192.168.18.209 dev eno1', '\$', 10)
|
||||||
|
# Check if forwarding is enabled
|
||||||
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S sysctl net.ipv4.conf.all.forwarding=1', '\$', 10)
|
||||||
|
# Check if iptables forwarding is accepted
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -L FORWARD', '\$', 10)
|
||||||
|
result = re.search('Chain FORWARD .*policy ACCEPT', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -P FORWARD ACCEPT', '\$', 10)
|
||||||
|
mySSH.close()
|
||||||
|
if svrName == 'asterix':
|
||||||
|
mySSH.open(ipAddr, userName, password)
|
||||||
|
# Check if route to porcepix epc exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.210', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 192.168.18.210 dev em1', '\$', 10)
|
||||||
|
# Check if route to porcepix cn5g exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.70.128/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.210', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.70.128/26 via 192.168.18.210 dev em1', '\$', 10)
|
||||||
|
# Check if X2 route to obelix enb exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.193', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 192.168.18.193 dev em1', '\$', 10)
|
||||||
|
# Check if forwarding is enabled
|
||||||
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S sysctl net.ipv4.conf.all.forwarding=1', '\$', 10)
|
||||||
|
# Check if iptables forwarding is accepted
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -L FORWARD', '\$', 10)
|
||||||
|
result = re.search('Chain FORWARD .*policy ACCEPT', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -P FORWARD ACCEPT', '\$', 10)
|
||||||
|
mySSH.close()
|
||||||
|
if svrName == 'obelix':
|
||||||
|
mySSH.open(ipAddr, userName, password)
|
||||||
|
# Check if route to porcepix epc exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.210', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 192.168.18.210 dev eno1', '\$', 10)
|
||||||
|
# Check if X2 route to asterix gnb exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.68.64/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.194', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.64/26 via 192.168.18.194 dev eno1', '\$', 10)
|
||||||
|
# Check if X2 route to nepes gnb exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.68.192/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.209', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.192/26 via 192.168.18.209 dev eno1', '\$', 10)
|
||||||
|
# Check if forwarding is enabled
|
||||||
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S sysctl net.ipv4.conf.all.forwarding=1', '\$', 10)
|
||||||
|
# Check if iptables forwarding is accepted
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -L FORWARD', '\$', 10)
|
||||||
|
result = re.search('Chain FORWARD .*policy ACCEPT', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -P FORWARD ACCEPT', '\$', 10)
|
||||||
|
mySSH.close()
|
||||||
|
if svrName == 'nepes':
|
||||||
|
mySSH.open(ipAddr, userName, password)
|
||||||
|
# Check if route to porcepix epc exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.210', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 192.168.18.210 dev enp0s31f6', '\$', 10)
|
||||||
|
# Check if X2 route to obelix enb exists
|
||||||
|
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
||||||
|
result = re.search('192.168.18.193', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 192.168.18.193 dev enp0s31f6', '\$', 10)
|
||||||
|
# Check if forwarding is enabled
|
||||||
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S sysctl net.ipv4.conf.all.forwarding=1', '\$', 10)
|
||||||
|
# Check if iptables forwarding is accepted
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -L FORWARD', '\$', 10)
|
||||||
|
result = re.search('Chain FORWARD .*policy ACCEPT', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.command('echo ' + password + ' | sudo -S iptables -P FORWARD ACCEPT', '\$', 10)
|
||||||
|
mySSH.close()
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class Module_UE:
|
|||||||
#if not it will be started
|
#if not it will be started
|
||||||
def CheckCMProcess(self,CNType):
|
def CheckCMProcess(self,CNType):
|
||||||
HOST=self.HostUsername+'@'+self.HostIPAddress
|
HOST=self.HostUsername+'@'+self.HostIPAddress
|
||||||
COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep "
|
COMMAND="ps aux | grep --colour=never " + self.Process['Name'] + " | grep -v grep "
|
||||||
logging.debug(COMMAND)
|
logging.debug(COMMAND)
|
||||||
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
result = ssh.stdout.readlines()
|
result = ssh.stdout.readlines()
|
||||||
@@ -76,12 +76,12 @@ class Module_UE:
|
|||||||
logging.debug('Starting ' + self.Process['Name'])
|
logging.debug('Starting ' + self.Process['Name'])
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword)
|
mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword)
|
||||||
mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S ' + self.Process['Cmd'] + ' ' + self.Process['Apn'][CNType] + ' &','\$',5)
|
mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S ' + self.Process['Cmd'] + ' ' + self.Process['Apn'][CNType] + ' > /dev/null 2>&1 &','\$',5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#checking the process
|
#checking the process
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
HOST=self.HostUsername+'@'+self.HostIPAddress
|
HOST=self.HostUsername+'@'+self.HostIPAddress
|
||||||
COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep "
|
COMMAND="ps aux | grep --colour=never " + self.Process['Name'] + " | grep -v grep "
|
||||||
logging.debug(COMMAND)
|
logging.debug(COMMAND)
|
||||||
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
result = ssh.stdout.readlines()
|
result = ssh.stdout.readlines()
|
||||||
@@ -108,7 +108,7 @@ class Module_UE:
|
|||||||
response= []
|
response= []
|
||||||
tentative = 3
|
tentative = 3
|
||||||
while (len(response)==0) and (tentative>0):
|
while (len(response)==0) and (tentative>0):
|
||||||
COMMAND="ip a show dev " + self.UENetwork + " | grep inet | grep " + self.UENetwork
|
COMMAND="ip a show dev " + self.UENetwork + " | grep --colour=never inet | grep " + self.UENetwork
|
||||||
logging.debug(COMMAND)
|
logging.debug(COMMAND)
|
||||||
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
response = ssh.stdout.readlines()
|
response = ssh.stdout.readlines()
|
||||||
@@ -136,7 +136,7 @@ class Module_UE:
|
|||||||
response= []
|
response= []
|
||||||
tentative = 3
|
tentative = 3
|
||||||
while (len(response)==0) and (tentative>0):
|
while (len(response)==0) and (tentative>0):
|
||||||
COMMAND="ip a show dev " + self.UENetwork + " | grep mtu"
|
COMMAND="ip a show dev " + self.UENetwork + " | grep --colour=never mtu"
|
||||||
logging.debug(COMMAND)
|
logging.debug(COMMAND)
|
||||||
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
response = ssh.stdout.readlines()
|
response = ssh.stdout.readlines()
|
||||||
@@ -165,7 +165,7 @@ class Module_UE:
|
|||||||
#delete old artifacts
|
#delete old artifacts
|
||||||
mySSH.command('echo ' + self.HostPassword + ' | sudo -S rm -rf ci_qlog','\$',5)
|
mySSH.command('echo ' + self.HostPassword + ' | sudo -S rm -rf ci_qlog','\$',5)
|
||||||
#start Trace, artifact is created in home dir
|
#start Trace, artifact is created in home dir
|
||||||
mySSH.command('echo $USER; nohup sudo -E QLog/QLog -s ci_qlog -f NR5G.cfg &','\$', 5)
|
mySSH.command('echo $USER; nohup sudo -E QLog/QLog -s ci_qlog -f NR5G.cfg > /dev/null 2>&1 &','\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
def DisableTrace(self):
|
def DisableTrace(self):
|
||||||
@@ -192,7 +192,7 @@ class Module_UE:
|
|||||||
source='ci_qlog'
|
source='ci_qlog'
|
||||||
destination= self.LogStore + '/ci_qlog_'+now_string+'.zip'
|
destination= self.LogStore + '/ci_qlog_'+now_string+'.zip'
|
||||||
#qlog artifact is zipped into the target folder
|
#qlog artifact is zipped into the target folder
|
||||||
mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S zip -r '+destination+' '+source+' &','\$', 10)
|
mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S zip -r '+destination+' '+source+' > /dev/null 2>&1 &','\$', 10)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#post action : log cleaning to make sure enough space is reserved for the next run
|
#post action : log cleaning to make sure enough space is reserved for the next run
|
||||||
Log_Mgt=cls_log_mgt.Log_Mgt(self.HostUsername,self.HostIPAddress, self.HostPassword, self.LogStore)
|
Log_Mgt=cls_log_mgt.Log_Mgt(self.HostUsername,self.HostIPAddress, self.HostPassword, self.LogStore)
|
||||||
|
|||||||
+71
-61
@@ -192,16 +192,16 @@ class OaiCiTest():
|
|||||||
result = re.search('LAST_BUILD_INFO', SSH.getBefore())
|
result = re.search('LAST_BUILD_INFO', SSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
mismatch = False
|
mismatch = False
|
||||||
SSH.command('grep SRC_COMMIT LAST_BUILD_INFO.txt', '\$', 2)
|
SSH.command('grep --colour=never SRC_COMMIT LAST_BUILD_INFO.txt', '\$', 2)
|
||||||
result = re.search(self.ranCommitID, SSH.getBefore())
|
result = re.search(self.ranCommitID, SSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mismatch = True
|
mismatch = True
|
||||||
SSH.command('grep MERGED_W_TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
SSH.command('grep --colour=never MERGED_W_TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
||||||
if self.ranAllowMerge:
|
if self.ranAllowMerge:
|
||||||
result = re.search('YES', SSH.getBefore())
|
result = re.search('YES', SSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mismatch = True
|
mismatch = True
|
||||||
SSH.command('grep TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
SSH.command('grep --colour=never TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
||||||
if self.ranTargetBranch == '':
|
if self.ranTargetBranch == '':
|
||||||
result = re.search('develop', SSH.getBefore())
|
result = re.search('develop', SSH.getBefore())
|
||||||
else:
|
else:
|
||||||
@@ -368,7 +368,7 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def InitializeUE(self,HTML,RAN,EPC, COTS_UE, InfraUE,ue_trace):
|
def InitializeUE(self,HTML,RAN,EPC, COTS_UE, InfraUE,ue_trace,CONTAINERS):
|
||||||
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -424,12 +424,12 @@ class OaiCiTest():
|
|||||||
Module_UE.CheckModuleMTU()
|
Module_UE.CheckModuleMTU()
|
||||||
else: #status==-1 failed to retrieve IP address
|
else: #status==-1 failed to retrieve IP address
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def InitializeOAIUE(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
def InitializeOAIUE(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
|
||||||
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')
|
||||||
@@ -451,13 +451,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', '\$', 90)
|
SSH.command('echo ' + self.UEPassword + ' | sudo -S uhd_find_devices', '\$', 180)
|
||||||
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', '\$', 90)
|
SSH.command('echo ' + self.UEPassword + ' | sudo -S uhd_find_devices', '\$', 180)
|
||||||
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')
|
||||||
@@ -653,14 +653,14 @@ class OaiCiTest():
|
|||||||
HTML.htmlUEFailureMsg='nr-uesoftmodem did NOT synced'
|
HTML.htmlUEFailureMsg='nr-uesoftmodem did NOT synced'
|
||||||
HTML.CreateHtmlTestRow(self.air_interface + ' ' + self.Initialize_OAI_UE_args, 'KO', CONST.OAI_UE_PROCESS_COULD_NOT_SYNC, 'OAI UE')
|
HTML.CreateHtmlTestRow(self.air_interface + ' ' + self.Initialize_OAI_UE_args, 'KO', CONST.OAI_UE_PROCESS_COULD_NOT_SYNC, 'OAI UE')
|
||||||
logging.error('\033[91mInitialize OAI UE Failed! \033[0m')
|
logging.error('\033[91mInitialize OAI UE Failed! \033[0m')
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
|
|
||||||
def checkDevTTYisUnlocked(self):
|
def checkDevTTYisUnlocked(self):
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
count = 0
|
count = 0
|
||||||
while count < 5:
|
while count < 5:
|
||||||
SSH.command('echo ' + self.ADBPassword + ' | sudo -S lsof | grep ttyUSB0', '\$', 10)
|
SSH.command('echo ' + self.ADBPassword + ' | sudo -S lsof | grep --colour=never ttyUSB0', '\$', 10)
|
||||||
result = re.search('picocom', SSH.getBefore())
|
result = re.search('picocom', SSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
count = 10
|
count = 10
|
||||||
@@ -731,7 +731,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.checkDevTTYisUnlocked()
|
self.checkDevTTYisUnlocked()
|
||||||
|
|
||||||
def AttachCatM(self,HTML,RAN,COTS_UE,EPC,InfraUE):
|
def AttachCatM(self,HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS):
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
@@ -804,9 +804,9 @@ class OaiCiTest():
|
|||||||
html_cell = '<pre style="background-color:white">CAT-M module Attachment Failed</pre>'
|
html_cell = '<pre style="background-color:white">CAT-M module Attachment Failed</pre>'
|
||||||
html_queue.put(html_cell)
|
html_queue.put(html_cell)
|
||||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue('N/A', 'KO', 1, html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
|
|
||||||
def PingCatM(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
def PingCatM(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
@@ -815,7 +815,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
statusQueue = SimpleQueue()
|
statusQueue = SimpleQueue()
|
||||||
@@ -836,7 +836,7 @@ class OaiCiTest():
|
|||||||
moduleIPAddr = result.group('ipaddr')
|
moduleIPAddr = result.group('ipaddr')
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
||||||
device_id = 'catm'
|
device_id = 'catm'
|
||||||
@@ -900,7 +900,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', 1, statusQueue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', 1, statusQueue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', 1, statusQueue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', 1, statusQueue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
@@ -992,7 +992,7 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def AttachUE(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
def AttachUE(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
|
||||||
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -1002,7 +1002,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
status_queue = SimpleQueue()
|
status_queue = SimpleQueue()
|
||||||
@@ -1021,7 +1021,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
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)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
attach_status = True
|
attach_status = True
|
||||||
@@ -1050,7 +1050,7 @@ class OaiCiTest():
|
|||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
|
|
||||||
else: #if an ID is specified, it is a module from the yaml infrastructure file
|
else: #if an ID is specified, it is a module from the yaml infrastructure file
|
||||||
#Attention, as opposed to InitializeUE, the connect manager process is not checked as it is supposed to be active already
|
#Attention, as opposed to InitializeUE, the connect manager process is not checked as it is supposed to be active already
|
||||||
@@ -1086,7 +1086,7 @@ class OaiCiTest():
|
|||||||
Module_UE.CheckModuleMTU()
|
Module_UE.CheckModuleMTU()
|
||||||
else: #status==-1 failed to retrieve IP address
|
else: #status==-1 failed to retrieve IP address
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
|
|
||||||
def DetachUE_common(self, device_id, idx,COTS_UE):
|
def DetachUE_common(self, device_id, idx,COTS_UE):
|
||||||
@@ -1111,7 +1111,7 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def DetachUE(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
def DetachUE(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
|
||||||
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -1121,7 +1121,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
cnt = 0
|
cnt = 0
|
||||||
@@ -1328,7 +1328,7 @@ class OaiCiTest():
|
|||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||||
if self.ADBCentralized:
|
if self.ADBCentralized:
|
||||||
SSH.command('lsusb | egrep "Future Technology Devices International, Ltd FT2232C" | sed -e "s#:.*##" -e "s# #_#g"', '\$', 15)
|
SSH.command('lsusb | egrep --colour=never "Future Technology Devices International, Ltd FT2232C" | sed -e "s#:.*##" -e "s# #_#g"', '\$', 15)
|
||||||
#self.CatMDevices = re.findall("\\\\r\\\\n([A-Za-z0-9_]+)",SSH.getBefore())
|
#self.CatMDevices = re.findall("\\\\r\\\\n([A-Za-z0-9_]+)",SSH.getBefore())
|
||||||
self.CatMDevices = re.findall("\\\\r\\\\n([A-Za-z0-9_]+)",SSH.getBefore())
|
self.CatMDevices = re.findall("\\\\r\\\\n([A-Za-z0-9_]+)",SSH.getBefore())
|
||||||
else:
|
else:
|
||||||
@@ -1396,7 +1396,7 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def CheckStatusUE(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
def CheckStatusUE(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
@@ -1443,7 +1443,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow(htmlOptions, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(htmlOptions, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
else:
|
else:
|
||||||
check_status = True
|
check_status = True
|
||||||
html_queue = SimpleQueue()
|
html_queue = SimpleQueue()
|
||||||
@@ -1459,7 +1459,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(htmlOptions, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(htmlOptions, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(htmlOptions, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(htmlOptions, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
|
|
||||||
def GetAllUEIPAddresses(self):
|
def GetAllUEIPAddresses(self):
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
@@ -1552,7 +1552,7 @@ class OaiCiTest():
|
|||||||
SSH.command('cd scripts', '\$', 5)
|
SSH.command('cd scripts', '\$', 5)
|
||||||
# In case of a docker-based deployment, we need to ping from the trf-gen container
|
# In case of a docker-based deployment, we need to ping from the trf-gen 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)) or (re.match('OAICN5G', EPC.Type, re.IGNORECASE)):
|
||||||
launchFromTrfContainer = True
|
launchFromTrfContainer = True
|
||||||
if launchFromTrfContainer:
|
if launchFromTrfContainer:
|
||||||
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
@@ -1583,7 +1583,7 @@ class OaiCiTest():
|
|||||||
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
||||||
Target = EPC.MmeIPAddress
|
Target = EPC.MmeIPAddress
|
||||||
elif re.match('OAICN5G', EPC.Type, re.IGNORECASE):
|
elif re.match('OAICN5G', EPC.Type, re.IGNORECASE):
|
||||||
Target = '8.8.8.8'
|
Target = EPC.MmeIPAddress
|
||||||
else:
|
else:
|
||||||
Target = EPC.IPAddress
|
Target = EPC.IPAddress
|
||||||
#ping from module NIC rather than IP address to make sure round trip is over the air
|
#ping from module NIC rather than IP address to make sure round trip is over the air
|
||||||
@@ -1686,14 +1686,14 @@ class OaiCiTest():
|
|||||||
html_queue.put(html_cell)
|
html_queue.put(html_cell)
|
||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
|
|
||||||
def PingNoS1(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
def PingNoS1(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
|
||||||
SSH=sshconnection.SSHConnection()
|
SSH=sshconnection.SSHConnection()
|
||||||
check_eNB = True
|
check_eNB = True
|
||||||
check_OAI_UE = True
|
check_OAI_UE = True
|
||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
ping_from_eNB = re.search('oaitun_enb1', str(self.ping_args))
|
ping_from_eNB = re.search('oaitun_enb1', str(self.ping_args))
|
||||||
if ping_from_eNB is not None:
|
if ping_from_eNB is not None:
|
||||||
@@ -1779,10 +1779,10 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def Ping(self,HTML,RAN,EPC,COTS_UE, InfraUE):
|
def Ping(self,HTML,RAN,EPC,COTS_UE, InfraUE, CONTAINERS):
|
||||||
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,InfraUE)
|
self.PingNoS1(HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -1795,7 +1795,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.ue_id=="":
|
if self.ue_id=="":
|
||||||
@@ -1803,7 +1803,7 @@ class OaiCiTest():
|
|||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
if (ueIpStatus < 0):
|
if (ueIpStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
self.UEIPAddresses=[]
|
self.UEIPAddresses=[]
|
||||||
@@ -1830,7 +1830,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
else:
|
else:
|
||||||
ping_status = True
|
ping_status = True
|
||||||
html_queue = SimpleQueue()
|
html_queue = SimpleQueue()
|
||||||
@@ -1847,7 +1847,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
|
|
||||||
def Iperf_ComputeTime(self):
|
def Iperf_ComputeTime(self):
|
||||||
result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args))
|
result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args))
|
||||||
@@ -2325,7 +2325,7 @@ class OaiCiTest():
|
|||||||
server_filename = 'iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log'
|
server_filename = 'iperf_server_' + self.testCase_id + '_' + self.ue_id + '.log'
|
||||||
SSH.command('docker exec -it prod-trf-gen /bin/bash -c "killall --signal SIGKILL iperf"', '\$', 5)
|
SSH.command('docker exec -it prod-trf-gen /bin/bash -c "killall --signal SIGKILL iperf"', '\$', 5)
|
||||||
iperf_cmd = 'echo $USER; nohup bin/iperf -s -u 2>&1 > ' + server_filename
|
iperf_cmd = 'echo $USER; nohup bin/iperf -s -u 2>&1 > ' + server_filename
|
||||||
cmd = 'docker exec -it prod-trf-gen /bin/bash -c \"' + iperf_cmd + '\"'
|
cmd = 'docker exec -d prod-trf-gen /bin/bash -c \"' + iperf_cmd + '\"'
|
||||||
SSH.command(cmd,'\$',5)
|
SSH.command(cmd,'\$',5)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
|
|
||||||
@@ -2647,7 +2647,7 @@ class OaiCiTest():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def IperfNoS1(self,HTML,RAN,EPC,COTS_UE,InfraUE):
|
def IperfNoS1(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
if RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or self.UEIPAddress == '' or self.UEUserName == '' or self.UEPassword == '':
|
if RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or self.UEIPAddress == '' or self.UEUserName == '' or self.UEPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -2657,7 +2657,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
server_on_enb = re.search('-R', str(self.iperf_args))
|
server_on_enb = re.search('-R', str(self.iperf_args))
|
||||||
if server_on_enb is not None:
|
if server_on_enb is not None:
|
||||||
@@ -2756,12 +2756,12 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
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,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
|
|
||||||
def Iperf(self,HTML,RAN,EPC,COTS_UE, InfraUE):
|
def Iperf(self,HTML,RAN,EPC,COTS_UE, InfraUE,CONTAINERS):
|
||||||
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,InfraUE)
|
self.IperfNoS1(HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '' or self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '' or self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -2774,14 +2774,14 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.ue_id=="":#is not a module, follow legacy code
|
if self.ue_id=="":#is not a module, follow legacy code
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
if (ueIpStatus < 0):
|
if (ueIpStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
return
|
return
|
||||||
else: #is a module
|
else: #is a module
|
||||||
self.UEIPAddresses=[]
|
self.UEIPAddresses=[]
|
||||||
@@ -2826,7 +2826,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
else:
|
else:
|
||||||
iperf_status = True
|
iperf_status = True
|
||||||
iperf_noperf = False
|
iperf_noperf = False
|
||||||
@@ -2848,7 +2848,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
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,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
|
|
||||||
def CheckProcessExist(self, check_eNB, check_OAI_UE,RAN,EPC):
|
def CheckProcessExist(self, check_eNB, check_OAI_UE,RAN,EPC):
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
@@ -3280,7 +3280,7 @@ class OaiCiTest():
|
|||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow('QLog trace is disabled', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('QLog trace is disabled', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
def TerminateOAIUE(self,HTML,RAN,COTS_UE,EPC, InfraUE):
|
def TerminateOAIUE(self,HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS):
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
SSH.open(self.UEIPAddress, self.UEUserName, self.UEPassword)
|
SSH.open(self.UEIPAddress, self.UEUserName, self.UEPassword)
|
||||||
SSH.command('cd ' + self.UESourceCodePath + '/cmake_targets', '\$', 5)
|
SSH.command('cd ' + self.UESourceCodePath + '/cmake_targets', '\$', 5)
|
||||||
@@ -3321,11 +3321,11 @@ class OaiCiTest():
|
|||||||
# Not an error then
|
# Not an error then
|
||||||
if (logStatus != CONST.OAI_UE_PROCESS_COULD_NOT_SYNC) or (ueAction != 'Sniffing'):
|
if (logStatus != CONST.OAI_UE_PROCESS_COULD_NOT_SYNC) or (ueAction != 'Sniffing'):
|
||||||
self.Initialize_OAI_UE_args = ''
|
self.Initialize_OAI_UE_args = ''
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
else:
|
else:
|
||||||
if (logStatus == CONST.OAI_UE_PROCESS_COULD_NOT_SYNC):
|
if (logStatus == CONST.OAI_UE_PROCESS_COULD_NOT_SYNC):
|
||||||
self.Initialize_OAI_UE_args = ''
|
self.Initialize_OAI_UE_args = ''
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m' + ueAction + ' Completed \u001B[0m')
|
logging.debug('\u001B[1m' + ueAction + ' Completed \u001B[0m')
|
||||||
HTML.htmlUEFailureMsg='<b>' + ueAction + ' Completed</b>\n' + HTML.htmlUEFailureMsg
|
HTML.htmlUEFailureMsg='<b>' + ueAction + ' Completed</b>\n' + HTML.htmlUEFailureMsg
|
||||||
@@ -3334,26 +3334,26 @@ class OaiCiTest():
|
|||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
def AutoTerminateUEandeNB(self,HTML,RAN,COTS_UE,EPC,InfraUE):
|
def AutoTerminateUEandeNB(self,HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS):
|
||||||
if (self.ADBIPAddress != 'none'):
|
if (self.ADBIPAddress != 'none'):
|
||||||
self.testCase_id = 'AUTO-KILL-UE'
|
self.testCase_id = 'AUTO-KILL-UE'
|
||||||
HTML.testCase_id=self.testCase_id
|
HTML.testCase_id = self.testCase_id
|
||||||
self.desc = 'Automatic Termination of UE'
|
self.desc = 'Automatic Termination of UE'
|
||||||
HTML.desc='Automatic Termination of UE'
|
HTML.desc = self.desc
|
||||||
self.ShowTestID()
|
self.ShowTestID()
|
||||||
self.TerminateUE(HTML,COTS_UE,InfraUE,self.ue_trace)
|
self.TerminateUE(HTML,COTS_UE,InfraUE,self.ue_trace)
|
||||||
if (self.Initialize_OAI_UE_args != ''):
|
if (self.Initialize_OAI_UE_args != ''):
|
||||||
self.testCase_id = 'AUTO-KILL-OAI-UE'
|
self.testCase_id = 'AUTO-KILL-OAI-UE'
|
||||||
HTML.testCase_id=self.testCase_id
|
HTML.testCase_id = self.testCase_id
|
||||||
self.desc = 'Automatic Termination of OAI-UE'
|
self.desc = 'Automatic Termination of OAI-UE'
|
||||||
HTML.desc='Automatic Termination of OAI-UE'
|
HTML.desc = self.desc
|
||||||
self.ShowTestID()
|
self.ShowTestID()
|
||||||
self.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE)
|
self.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
if (RAN.Initialize_eNB_args != ''):
|
if (RAN.Initialize_eNB_args != ''):
|
||||||
self.testCase_id = 'AUTO-KILL-RAN'
|
self.testCase_id = 'AUTO-KILL-RAN'
|
||||||
HTML.testCase_id=self.testCase_id
|
HTML.testCase_id = self.testCase_id
|
||||||
self.desc = 'Automatic Termination of all RAN nodes'
|
self.desc = 'Automatic Termination of all RAN nodes'
|
||||||
HTML.desc='Automatic Termination of RAN nodes'
|
HTML.desc = self.desc
|
||||||
self.ShowTestID()
|
self.ShowTestID()
|
||||||
#terminate all RAN nodes eNB/gNB/OCP
|
#terminate all RAN nodes eNB/gNB/OCP
|
||||||
for instance in range(0, len(RAN.air_interface)):
|
for instance in range(0, len(RAN.air_interface)):
|
||||||
@@ -3363,11 +3363,21 @@ class OaiCiTest():
|
|||||||
RAN.TerminateeNB(HTML,EPC)
|
RAN.TerminateeNB(HTML,EPC)
|
||||||
if RAN.flexranCtrlInstalled and RAN.flexranCtrlStarted:
|
if RAN.flexranCtrlInstalled and RAN.flexranCtrlStarted:
|
||||||
self.testCase_id = 'AUTO-KILL-flexran-ctl'
|
self.testCase_id = 'AUTO-KILL-flexran-ctl'
|
||||||
HTML.testCase_id=self.testCase_id
|
HTML.testCase_id = self.testCase_id
|
||||||
self.desc = 'Automatic Termination of FlexRan CTL'
|
self.desc = 'Automatic Termination of FlexRan CTL'
|
||||||
HTML.desc='Automatic Termination of FlexRan CTL'
|
HTML.desc = self.desc
|
||||||
self.ShowTestID()
|
self.ShowTestID()
|
||||||
self.TerminateFlexranCtrl(HTML,RAN,EPC)
|
self.TerminateFlexranCtrl(HTML,RAN,EPC)
|
||||||
|
if CONTAINERS.yamlPath[0] != '':
|
||||||
|
self.testCase_id = 'AUTO-KILL-CONTAINERS'
|
||||||
|
HTML.testCase_id = self.testCase_id
|
||||||
|
self.desc = 'Automatic Termination of all RAN containers'
|
||||||
|
HTML.desc = self.desc
|
||||||
|
self.ShowTestID()
|
||||||
|
for instance in range(0, len(CONTAINERS.yamlPath)):
|
||||||
|
if CONTAINERS.yamlPath[instance]!='':
|
||||||
|
CONTAINERS.eNB_instance=instance
|
||||||
|
CONTAINERS.UndeployObject(HTML,RAN)
|
||||||
RAN.prematureExit=True
|
RAN.prematureExit=True
|
||||||
|
|
||||||
def IdleSleep(self,HTML):
|
def IdleSleep(self,HTML):
|
||||||
@@ -3601,7 +3611,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', '\$', 90)
|
SSH.command('echo ' + Password + ' | sudo -S uhd_find_devices', '\$', 180)
|
||||||
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:
|
||||||
|
|||||||
+31
-12
@@ -37,6 +37,7 @@ import html
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
import helpreadme as HELP
|
import helpreadme as HELP
|
||||||
@@ -115,7 +116,7 @@ class PhySim:
|
|||||||
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
|
||||||
mySSH.command("sudo podman image inspect --format='Size = {{.Size}} bytes' oai-physim:" + imageTag, '\$', 60)
|
mySSH.command('sudo podman image inspect --format="Size = {{.Size}} bytes" oai-physim:' + imageTag, '\$', 60)
|
||||||
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()
|
||||||
@@ -140,7 +141,7 @@ class PhySim:
|
|||||||
logging.debug('oai-physim size is unknown')
|
logging.debug('oai-physim size is unknown')
|
||||||
|
|
||||||
# logging to OC Cluster and then switch to corresponding project
|
# logging to OC Cluster and then switch to corresponding project
|
||||||
mySSH.command(f'oc login -u {ocUserName} -p {ocPassword}', '\$', 6)
|
mySSH.command(f'oc login -u {ocUserName} -p {ocPassword}', '\$', 30)
|
||||||
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()
|
||||||
@@ -149,7 +150,7 @@ class PhySim:
|
|||||||
return
|
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}', '\$', 30)
|
||||||
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()
|
||||||
@@ -160,7 +161,7 @@ class PhySim:
|
|||||||
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
||||||
|
|
||||||
# Tag the image and push to the OC cluster
|
# Tag the image and push to the OC cluster
|
||||||
mySSH.command('oc whoami -t | sudo podman login -u ' + ocUserName + ' --password-stdin https://default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/ --tls-verify=false', '\$', 6)
|
mySSH.command('oc whoami -t | sudo podman login -u ' + ocUserName + ' --password-stdin https://default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/ --tls-verify=false', '\$', 30)
|
||||||
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()
|
||||||
@@ -170,7 +171,7 @@ class PhySim:
|
|||||||
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)
|
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', '\$', 30)
|
||||||
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()
|
||||||
@@ -180,9 +181,9 @@ class PhySim:
|
|||||||
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)
|
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}', '\$', 30)
|
||||||
time.sleep(2)
|
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', '\$', 180)
|
||||||
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()
|
||||||
@@ -195,18 +196,18 @@ class PhySim:
|
|||||||
# Using helm charts deployment
|
# Using helm charts deployment
|
||||||
time.sleep(5)
|
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', '\$', 30)
|
||||||
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', '\$', 30)
|
||||||
isFinished1 = False
|
isFinished1 = False
|
||||||
while(isFinished1 == False):
|
while(isFinished1 == False):
|
||||||
time.sleep(20)
|
time.sleep(20)
|
||||||
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
||||||
if re.search('No resources found', mySSH.getBefore()):
|
if re.search('No resources found', mySSH.getBefore()):
|
||||||
isFinished1 = True
|
isFinished1 = True
|
||||||
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 30)
|
||||||
mySSH.command('oc delete is oai-physim', '\$', 6)
|
mySSH.command('oc delete is oai-physim', '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
@@ -217,7 +218,7 @@ class PhySim:
|
|||||||
count = 0
|
count = 0
|
||||||
while(count < 2 and isRunning == False):
|
while(count < 2 and isRunning == False):
|
||||||
time.sleep(60)
|
time.sleep(60)
|
||||||
mySSH.command('oc get pods -o wide -l app.kubernetes.io/instance=physim | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 6, resync=True)
|
mySSH.command('oc get pods -o wide -l app.kubernetes.io/instance=physim | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 30, resync=True)
|
||||||
if mySSH.getBefore().count('Running') == 12:
|
if mySSH.getBefore().count('Running') == 12:
|
||||||
logging.debug('\u001B[1m Running the physim test Scenarios\u001B[0m')
|
logging.debug('\u001B[1m Running the physim test Scenarios\u001B[0m')
|
||||||
isRunning = True
|
isRunning = True
|
||||||
@@ -264,6 +265,23 @@ class PhySim:
|
|||||||
for podName in podNames:
|
for podName in podNames:
|
||||||
mySSH.command(f'oc logs {podName} >> cmake_targets/log/physim_test.txt 2>&1', '\$', 15, resync=True)
|
mySSH.command(f'oc logs {podName} >> cmake_targets/log/physim_test.txt 2>&1', '\$', 15, resync=True)
|
||||||
time.sleep(30)
|
time.sleep(30)
|
||||||
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/log/physim_test.txt', '.')
|
||||||
|
try:
|
||||||
|
listLogFiles = subprocess.check_output('egrep --colour=never "Execution Log file|Linux oai-" physim_test.txt', shell=True, universal_newlines=True)
|
||||||
|
for line in listLogFiles.split('\n'):
|
||||||
|
res1 = re.search('Linux (?P<pod>oai-[a-zA-Z0-9\-]+) ', str(line))
|
||||||
|
res2 = re.search('Execution Log file = (?P<name>[a-zA-Z0-9\-\/\.\_]+)', str(line))
|
||||||
|
if res1 is not None:
|
||||||
|
podName = res1.group('pod')
|
||||||
|
if res2 is not None:
|
||||||
|
logFileInPod = res2.group('name')
|
||||||
|
folderName = re.sub('/opt/oai-physim/cmake_targets/autotests/log/', '', logFileInPod)
|
||||||
|
folderName = re.sub('/test.*', '', folderName)
|
||||||
|
fileName = re.sub('/opt/oai-physim/cmake_targets/autotests/log/' + folderName + '/', '', logFileInPod)
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log/' + folderName, '\$', 5, silent=True)
|
||||||
|
mySSH.command('oc cp ' + podName + ':' + logFileInPod + ' cmake_targets/log/' + folderName + '/' + fileName, '\$', 20, silent=True)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
|
||||||
# UnDeploy the physical simulator pods
|
# UnDeploy the physical simulator pods
|
||||||
mySSH.command('helm uninstall physim | tee -a cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
mySSH.command('helm uninstall physim | tee -a cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
||||||
@@ -305,6 +323,7 @@ class PhySim:
|
|||||||
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
mySSH.command('mkdir -p physim_test_log_' + self.testCase_id, '\$', 5)
|
mySSH.command('mkdir -p physim_test_log_' + self.testCase_id, '\$', 5)
|
||||||
mySSH.command('cp log/physim_* ' + 'physim_test_log_' + self.testCase_id, '\$', 5)
|
mySSH.command('cp log/physim_* ' + 'physim_test_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.command('tar cvf physim_test_log_' + self.testCase_id + '/physim_log.tar log/015*', '\$', 180)
|
||||||
if not os.path.exists(f'./physim_test_logs_{self.testCase_id}'):
|
if not os.path.exists(f'./physim_test_logs_{self.testCase_id}'):
|
||||||
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)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ channelmod = {
|
|||||||
ds_tdl = 0;
|
ds_tdl = 0;
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
model_name = "rfsimu_channel_ue1"
|
model_name = "rfsimu_channel_ue0"
|
||||||
type = "AWGN";
|
type = "AWGN";
|
||||||
ploss_dB = 0;
|
ploss_dB = 0;
|
||||||
noise_power_dB = 0;
|
noise_power_dB = 0;
|
||||||
|
|||||||
@@ -0,0 +1,281 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-B38");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe02;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-B38";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 97; mnc_length = 2; } );
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNODEB";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "TDD";
|
||||||
|
tdd_config = 1;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 38;
|
||||||
|
downlink_frequency = 2605000000L;
|
||||||
|
nr_scg_ssb_freq = 624608;
|
||||||
|
uplink_frequency_offset = 0;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 100;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 2;
|
||||||
|
nb_antennas_rx = 2;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 125;
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -29;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -108;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
|
||||||
|
//Parameters for SIB18
|
||||||
|
rxPool_sc_CP_Len = "normal";
|
||||||
|
rxPool_sc_Period = "sf40";
|
||||||
|
rxPool_data_CP_Len = "normal";
|
||||||
|
rxPool_ResourceConfig_prb_Num = 20;
|
||||||
|
rxPool_ResourceConfig_prb_Start = 5;
|
||||||
|
rxPool_ResourceConfig_prb_End = 44;
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
|
*/
|
||||||
|
// Parameters for SIB19
|
||||||
|
discRxPool_cp_Len = "normal"
|
||||||
|
discRxPool_discPeriod = "rf32"
|
||||||
|
discRxPool_numRetx = 1;
|
||||||
|
discRxPool_numRepetition = 2;
|
||||||
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
enable_measurement_reports = "no";
|
||||||
|
|
||||||
|
///X2
|
||||||
|
enable_x2 = "yes";
|
||||||
|
t_reloc_prep = 1000; /* unit: millisecond */
|
||||||
|
tx2_reloc_overall = 2000; /* unit: millisecond */
|
||||||
|
t_dc_prep = 1000; /* unit: millisecond */
|
||||||
|
t_dc_overall = 2000; /* unit: millisecond */
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eno1";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eno1";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
phy_test_mode = 0;
|
||||||
|
scheduler_mode = "fairRR";
|
||||||
|
bler_target_upper = 20.0;
|
||||||
|
bler_target_lower = 10.0;
|
||||||
|
max_ul_rb_index = 27;
|
||||||
|
puSch10xSnr = 200;
|
||||||
|
puCch10xSnr = 150;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
prach_dtx_threshold = 200;
|
||||||
|
pucch1_dtx_threshold = 5
|
||||||
|
pucch1ab_dtx_threshold =0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 2
|
||||||
|
nb_rx = 2
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [38];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
|
eNB_instances = [0];
|
||||||
|
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_CONTROLLER :
|
||||||
|
{
|
||||||
|
FLEXRAN_ENABLED = "no";
|
||||||
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
|
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
||||||
|
FLEXRAN_PORT = 2210;
|
||||||
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@ eNBs =
|
|||||||
(
|
(
|
||||||
{
|
{
|
||||||
////////// Identification parameters:
|
////////// Identification parameters:
|
||||||
eNB_ID = 0xe00;
|
eNB_ID = 0xe04;
|
||||||
|
|
||||||
cell_type = "CELL_MACRO_ENB";
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ THREAD_STRUCT =
|
|||||||
(
|
(
|
||||||
{
|
{
|
||||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
worker_config = "WORKER_ENABLE";
|
worker_config = "WORKER_ENABLE";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,7 +254,6 @@ MACRLCs = (
|
|||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
pusch_TargetSNRx10 = 200;
|
pusch_TargetSNRx10 = 200;
|
||||||
pucch_TargetSNRx10 = 150;
|
pucch_TargetSNRx10 = 150;
|
||||||
ulsch_max_slots_inactivity=20;
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -251,7 +251,6 @@ MACRLCs = (
|
|||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
pusch_TargetSNRx10 = 200;
|
pusch_TargetSNRx10 = 200;
|
||||||
pucch_TargetSNRx10 = 150;
|
pucch_TargetSNRx10 = 150;
|
||||||
ulsch_max_slots_inactivity=20;
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ gNBs =
|
|||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts = 1;
|
pdsch_AntennaPorts = 1;
|
||||||
pusch_AntennaPorts = 1;
|
pusch_AntennaPorts = 1;
|
||||||
|
min_rxtxtime_pdsch = 6;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
@@ -228,9 +229,8 @@ MACRLCs = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
ulsch_max_slots_inactivity = 1;
|
|
||||||
pusch_TargetSNRx10 = 200;
|
pusch_TargetSNRx10 = 200;
|
||||||
pucch_TargetSNRx10 = 200;
|
pucch_TargetSNRx10 = 200;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -226,6 +226,7 @@ MACRLCs = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
|
ulsch_max_frame_inactivity = 1;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -251,6 +252,7 @@ RUs = (
|
|||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
bf_weights = [0x00007fff, 0x00007fff];
|
bf_weights = [0x00007fff, 0x00007fff];
|
||||||
#clock_src = "external";
|
#clock_src = "external";
|
||||||
|
sf_extension = 0
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -253,9 +253,9 @@ MACRLCs = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
pusch_TargetSNRx10 = 200;
|
# pusch_TargetSNRx10 = 200;
|
||||||
pucch_TargetSNRx10 = 150;
|
# pucch_TargetSNRx10 = 150;
|
||||||
ulsch_max_slots_inactivity=20;
|
ulsch_max_frame_inactivity = 1;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -263,9 +263,9 @@ L1s = (
|
|||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
pusch_proc_threads = 2;
|
pusch_proc_threads = 4;
|
||||||
prach_dtx_threshold = 120;
|
prach_dtx_threshold = 120;
|
||||||
pucch0_dtx_threshold = 150;
|
# pucch0_dtx_threshold = 150;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -288,7 +288,7 @@ RUs = (
|
|||||||
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
sf_extension = 0
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,321 +1,343 @@
|
|||||||
Active_gNBs = ( "gNB-OAI");
|
Active_gNBs = ( "gNB-OAI");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
gNBs =
|
gNBs =
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
////////// Identification parameters:
|
////////// Identification parameters:
|
||||||
gNB_ID = 0xe00;
|
gNB_CU_ID = 0xe00;
|
||||||
gNB_name = "gNB-OAI";
|
|
||||||
|
# cell_type = "CELL_MACRO_GNB";
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
|
||||||
tracking_area_code = 1;
|
gNB_name = "gNB-OAI";
|
||||||
plmn_list = ({
|
min_rxtxtime_pdsch = 6;
|
||||||
mcc = 208;
|
|
||||||
mnc = 99;
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
mnc_length = 2;
|
tracking_area_code = 1;
|
||||||
snssaiList = (
|
|
||||||
{
|
plmn_list = ({
|
||||||
sst = 1;
|
mcc = 208;
|
||||||
sd = 0x1; // 0 false, else true
|
mnc = 97;
|
||||||
},
|
mnc_length = 2;
|
||||||
{
|
snssaiList = (
|
||||||
sst = 1;
|
{
|
||||||
sd = 0x112233; // 0 false, else true
|
sst = 1;
|
||||||
}
|
sd = 0x010203; // 0 false, else true
|
||||||
);
|
},
|
||||||
|
{
|
||||||
});
|
sst = 1;
|
||||||
|
sd = 0x112233; // 0 false, else true
|
||||||
nr_cellid = 12345678L;
|
}
|
||||||
|
);
|
||||||
////////// Physical parameters:
|
});
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
nr_cellid = 12345678L
|
||||||
pdsch_AntennaPorts = 1;
|
|
||||||
pusch_AntennaPorts = 1;
|
# tr_s_preference = "local_mac"
|
||||||
ul_prbblacklist = "51,52,53,54"
|
|
||||||
|
////////// Physical parameters:
|
||||||
pdcch_ConfigSIB1 = (
|
|
||||||
{
|
ssb_SubcarrierOffset = 0;
|
||||||
controlResourceSetZero = 12;
|
pdsch_AntennaPorts = 1;
|
||||||
searchSpaceZero = 0;
|
pusch_AntennaPorts = 1;
|
||||||
}
|
#pusch_TargetSNRx10 = 200;
|
||||||
);
|
#pucch_TargetSNRx10 = 200;
|
||||||
|
ul_prbblacklist = "51,52,53,54"
|
||||||
servingCellConfigCommon = (
|
|
||||||
{
|
pdcch_ConfigSIB1 = (
|
||||||
#spCellConfigCommon
|
{
|
||||||
|
controlResourceSetZero = 11;
|
||||||
physCellId = 0;
|
searchSpaceZero = 0;
|
||||||
|
}
|
||||||
# downlinkConfigCommon
|
);
|
||||||
#frequencyInfoDL
|
|
||||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
servingCellConfigCommon = (
|
||||||
absoluteFrequencySSB = 641280;
|
{
|
||||||
dl_frequencyBand = 78;
|
#spCellConfigCommon
|
||||||
# this is 3600 MHz
|
|
||||||
dl_absoluteFrequencyPointA = 640008;
|
physCellId = 0;
|
||||||
#scs-SpecificCarrierList
|
|
||||||
dl_offstToCarrier = 0;
|
# downlinkConfigCommon
|
||||||
# subcarrierSpacing
|
#frequencyInfoDL
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
|
||||||
dl_subcarrierSpacing = 1;
|
#absoluteFrequencySSB = 620640;
|
||||||
dl_carrierBandwidth = 106;
|
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
|
||||||
#initialDownlinkBWP
|
absoluteFrequencySSB = 621312;
|
||||||
#genericParameters
|
# this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
|
||||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
#absoluteFrequencySSB = 634080;
|
||||||
initialDLBWPlocationAndBandwidth = 12952; # 6366 12925 12956 28875 12952
|
# this is 3600.48 MHz
|
||||||
# subcarrierSpacing
|
#absoluteFrequencySSB = 640032;
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
#dl_frequencyBand = 78;
|
||||||
initialDLBWPsubcarrierSpacing = 1;
|
# this is 3301.68 MHz
|
||||||
#pdcch-ConfigCommon
|
#dl_absoluteFrequencyPointA = 620112;
|
||||||
initialDLBWPcontrolResourceSetZero = 12;
|
# this is 3300.60 MHz
|
||||||
initialDLBWPsearchSpaceZero = 0;
|
dl_absoluteFrequencyPointA = 620040;
|
||||||
#pdsch-ConfigCommon
|
# this is 3502.56 MHz
|
||||||
#pdschTimeDomainAllocationList (up to 16 entries)
|
#dl_absoluteFrequencyPointA = 633552;
|
||||||
initialDLBWPk0_0 = 0; #for DL slot
|
# this is 3600.48 MHz
|
||||||
initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB
|
#dl_absoluteFrequencyPointA = 640032;
|
||||||
initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
initialDLBWPk0_1 = 0; #for mixed slot
|
# subcarrierSpacing
|
||||||
initialDLBWPmappingType_1 = 0;
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5
|
dl_subcarrierSpacing = 1;
|
||||||
|
dl_carrierBandwidth = 106;
|
||||||
#uplinkConfigCommon
|
#initialDownlinkBWP
|
||||||
#frequencyInfoUL
|
#genericParameters
|
||||||
ul_frequencyBand = 78;
|
# this is RBstart=0,L=106 (275*(L-1))+RBstart
|
||||||
#scs-SpecificCarrierList
|
initialDLBWPlocationAndBandwidth = 28875;
|
||||||
ul_offstToCarrier = 0;
|
# subcarrierSpacing
|
||||||
# subcarrierSpacing
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
ul_subcarrierSpacing = 1;
|
#pdcch-ConfigCommon
|
||||||
ul_carrierBandwidth = 106;
|
initialDLBWPcontrolResourceSetZero = 11;
|
||||||
pMax = 20;
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
#initialUplinkBWP
|
#pdsch-ConfigCommon
|
||||||
#genericParameters
|
#pdschTimeDomainAllocationList (up to 16 entries)
|
||||||
initialULBWPlocationAndBandwidth = 12952;
|
initialDLBWPk0_0 = 0;
|
||||||
# subcarrierSpacing
|
#initialULBWPmappingType
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
#0=typeA,1=typeB
|
||||||
initialULBWPsubcarrierSpacing = 1;
|
initialDLBWPmappingType_0 = 0;
|
||||||
#rach-ConfigCommon
|
#this is SS=1,L=13
|
||||||
#rach-ConfigGeneric
|
initialDLBWPstartSymbolAndLength_0 = 40;
|
||||||
prach_ConfigurationIndex = 98;
|
|
||||||
#prach_msg1_FDM
|
initialDLBWPk0_1 = 0;
|
||||||
#0 = one, 1=two, 2=four, 3=eight
|
initialDLBWPmappingType_1 = 0;
|
||||||
prach_msg1_FDM = 0;
|
#this is SS=1,L=5
|
||||||
prach_msg1_FrequencyStart = 0;
|
initialDLBWPstartSymbolAndLength_1 = 57;
|
||||||
zeroCorrelationZoneConfig = 13;
|
|
||||||
preambleReceivedTargetPower = -96;
|
#uplinkConfigCommon
|
||||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
#frequencyInfoUL
|
||||||
preambleTransMax = 6;
|
ul_frequencyBand = 78;
|
||||||
#powerRampingStep
|
#scs-SpecificCarrierList
|
||||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
ul_offstToCarrier = 0;
|
||||||
powerRampingStep = 1;
|
# subcarrierSpacing
|
||||||
#ra_ReponseWindow
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
#1,2,4,8,10,20,40,80
|
ul_subcarrierSpacing = 1;
|
||||||
ra_ResponseWindow = 4;
|
ul_carrierBandwidth = 106;
|
||||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
pMax = 20;
|
||||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
#initialUplinkBWP
|
||||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
#genericParameters
|
||||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
initialULBWPlocationAndBandwidth = 28875;
|
||||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
# subcarrierSpacing
|
||||||
#ra_ContentionResolutionTimer
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
#(0..7) 8,16,24,32,40,48,56,64
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
ra_ContentionResolutionTimer = 7;
|
#rach-ConfigCommon
|
||||||
rsrp_ThresholdSSB = 19;
|
#rach-ConfigGeneric
|
||||||
#prach-RootSequenceIndex_PR
|
prach_ConfigurationIndex = 98;
|
||||||
#1 = 839, 2 = 139
|
#prach_msg1_FDM
|
||||||
prach_RootSequenceIndex_PR = 2;
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
prach_RootSequenceIndex = 1;
|
prach_msg1_FDM = 0;
|
||||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
prach_msg1_FrequencyStart = 0;
|
||||||
#
|
zeroCorrelationZoneConfig = 12;
|
||||||
msg1_SubcarrierSpacing = 1,
|
preambleReceivedTargetPower = -104;
|
||||||
# restrictedSetConfig
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
preambleTransMax = 6;
|
||||||
restrictedSetConfig = 0,
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
# pusch-ConfigCommon (up to 16 elements)
|
powerRampingStep = 1;
|
||||||
initialULBWPk2_0 = 6; # used for UL slot
|
#ra_ReponseWindow
|
||||||
initialULBWPmappingType_0 = 1
|
#1,2,4,8,10,20,40,80
|
||||||
initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13
|
ra_ResponseWindow = 4;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
initialULBWPk2_1 = 6; # used for mixed slot
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
initialULBWPmappingType_1 = 1;
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||||
initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||||
initialULBWPk2_2 = 7; # used for Msg.3 during RA
|
#ra_ContentionResolutionTimer
|
||||||
initialULBWPmappingType_2 = 1;
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
msg3_DeltaPreamble = 1;
|
#prach-RootSequenceIndex_PR
|
||||||
p0_NominalWithGrant =-90;
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 2;
|
||||||
# pucch-ConfigCommon setup :
|
prach_RootSequenceIndex = 1;
|
||||||
# pucchGroupHopping
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
#
|
||||||
pucchGroupHopping = 0;
|
msg1_SubcarrierSpacing = 1,
|
||||||
hoppingId = 40;
|
# restrictedSetConfig
|
||||||
p0_nominal = -90;
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
# ssb_PositionsInBurs_BitmapPR
|
restrictedSetConfig = 0,
|
||||||
# 1=short, 2=medium, 3=long
|
|
||||||
ssb_PositionsInBurst_PR = 2;
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
ssb_PositionsInBurst_Bitmap = 1;
|
initialULBWPk2_0 = 6;
|
||||||
|
initialULBWPmappingType_0 = 1
|
||||||
# ssb_periodicityServingCell
|
# this is SS=2 L=13
|
||||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
initialULBWPstartSymbolAndLength_0 = 41;
|
||||||
ssb_periodicityServingCell = 2;
|
|
||||||
|
initialULBWPk2_1 = 6;
|
||||||
# dmrs_TypeA_position
|
initialULBWPmappingType_1 = 1;
|
||||||
# 0 = pos2, 1 = pos3
|
# this is SS=0 L=4
|
||||||
dmrs_TypeA_Position = 0;
|
initialULBWPstartSymbolAndLength_1 = 52;
|
||||||
|
|
||||||
# subcarrierSpacing
|
initialULBWPk2_2 = 7;
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
initialULBWPmappingType_2 = 1;
|
||||||
subcarrierSpacing = 1;
|
# this is SS=10 L=4
|
||||||
|
initialULBWPstartSymbolAndLength_2 = 52;
|
||||||
|
|
||||||
#tdd-UL-DL-ConfigurationCommon
|
msg3_DeltaPreamble = 1;
|
||||||
# subcarrierSpacing
|
p0_NominalWithGrant =-90;
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
|
||||||
referenceSubcarrierSpacing = 1;
|
# pucch-ConfigCommon setup :
|
||||||
# pattern1
|
# pucchGroupHopping
|
||||||
# dl_UL_TransmissionPeriodicity
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
pucchGroupHopping = 0;
|
||||||
dl_UL_TransmissionPeriodicity = 6;
|
hoppingId = 40;
|
||||||
nrofDownlinkSlots = 7;
|
p0_nominal = -90;
|
||||||
nrofDownlinkSymbols = 6;
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
nrofUplinkSlots = 2;
|
# 1=short, 2=medium, 3=long
|
||||||
nrofUplinkSymbols = 4;
|
ssb_PositionsInBurst_PR = 2;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 1;
|
||||||
ssPBCH_BlockPower = -25;
|
|
||||||
}
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
);
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
# ------- SCTP definitions
|
# 0 = pos2, 1 = pos3
|
||||||
SCTP :
|
dmrs_TypeA_Position = 0;
|
||||||
{
|
|
||||||
# Number of streams to use in input/output
|
# subcarrierSpacing
|
||||||
SCTP_INSTREAMS = 2;
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
SCTP_OUTSTREAMS = 2;
|
subcarrierSpacing = 1;
|
||||||
};
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
////////// AMF parameters:
|
# subcarrierSpacing
|
||||||
amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
ipv6 = "192:168:30::17";
|
referenceSubcarrierSpacing = 1;
|
||||||
active = "yes";
|
# pattern1
|
||||||
preference = "ipv4";
|
# dl_UL_TransmissionPeriodicity
|
||||||
}
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
);
|
dl_UL_TransmissionPeriodicity = 6;
|
||||||
|
nrofDownlinkSlots = 7;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
NETWORK_INTERFACES :
|
nrofUplinkSlots = 2;
|
||||||
{
|
nrofUplinkSymbols = 4;
|
||||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0";
|
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
|
ssPBCH_BlockPower = -25;
|
||||||
GNB_INTERFACE_NAME_FOR_NGU = "eth0";
|
}
|
||||||
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
|
|
||||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
);
|
||||||
};
|
|
||||||
|
|
||||||
}
|
# ------- SCTP definitions
|
||||||
);
|
SCTP :
|
||||||
|
{
|
||||||
MACRLCs = (
|
# Number of streams to use in input/output
|
||||||
{
|
SCTP_INSTREAMS = 2;
|
||||||
num_cc = 1;
|
SCTP_OUTSTREAMS = 2;
|
||||||
tr_s_preference = "local_L1";
|
};
|
||||||
tr_n_preference = "local_RRC";
|
|
||||||
pusch_TargetSNRx10 = 200;
|
////////// AMF parameters:
|
||||||
pucch_TargetSNRx10 = 150;
|
amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ulsch_max_slots_inactivity = 10;
|
ipv6 = "192:168:30::17";
|
||||||
}
|
active = "yes";
|
||||||
);
|
preference = "ipv4";
|
||||||
|
}
|
||||||
L1s = (
|
);
|
||||||
{
|
|
||||||
num_cc = 1;
|
NETWORK_INTERFACES :
|
||||||
tr_n_preference = "local_mac";
|
{
|
||||||
pusch_proc_threads = 8;
|
|
||||||
prach_dtx_threshold = 120;
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
|
||||||
pucch0_dtx_threshold = 150;
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
|
||||||
}
|
GNB_INTERFACE_NAME_FOR_NGU = "em1";
|
||||||
);
|
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
RUs = (
|
};
|
||||||
{
|
|
||||||
local_rf = "yes"
|
}
|
||||||
nb_tx = 1
|
);
|
||||||
nb_rx = 1
|
|
||||||
att_tx = 0
|
MACRLCs = (
|
||||||
att_rx = 0;
|
{
|
||||||
bands = [78];
|
num_cc = 1;
|
||||||
max_pdschReferenceSignalPower = -27;
|
tr_s_preference = "local_L1";
|
||||||
max_rxgain = 75;
|
tr_n_preference = "local_RRC";
|
||||||
eNB_instances = [0];
|
pusch_TargetSNRx10 = 200;
|
||||||
#beamforming 1x4 matrix:
|
pucch_TargetSNRx10 = 200;
|
||||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
ulsch_max_frame_inactivity = 1;
|
||||||
#clock_src = "external";
|
}
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
);
|
||||||
}
|
|
||||||
);
|
L1s = (
|
||||||
|
{
|
||||||
THREAD_STRUCT = (
|
num_cc = 1;
|
||||||
{
|
tr_n_preference = "local_mac";
|
||||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
pusch_proc_threads = 2;
|
||||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
prach_dtx_threshold = 120;
|
||||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
# pucch0_dtx_threshold = 150;
|
||||||
worker_config = "WORKER_ENABLE";
|
}
|
||||||
}
|
);
|
||||||
);
|
|
||||||
|
RUs = (
|
||||||
rfsimulator :
|
{
|
||||||
{
|
local_rf = "yes"
|
||||||
serveraddr = "server";
|
nb_tx = 1
|
||||||
serverport = "4043";
|
nb_rx = 1
|
||||||
options = (); #("saviq"); or/and "chanmod"
|
att_tx = 0
|
||||||
modelname = "AWGN";
|
att_rx = 0;
|
||||||
IQfile = "/tmp/rfsimulator.iqs";
|
bands = [78];
|
||||||
};
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
security = {
|
eNB_instances = [0];
|
||||||
# preferred ciphering algorithms
|
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
# the first one of the list that an UE supports in chosen
|
bf_weights = [0x00007fff, 0x0000];
|
||||||
# valid values: nea0, nea1, nea2, nea3
|
##beamforming 1x4 matrix: 1 layer x 4 antennas
|
||||||
ciphering_algorithms = ( "nea0" );
|
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
||||||
|
## beamforming 2x2 matrix:
|
||||||
# preferred integrity algorithms
|
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
||||||
# the first one of the list that an UE supports in chosen
|
## beamforming 4x4 matrix:
|
||||||
# valid values: nia0, nia1, nia2, nia3
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
integrity_algorithms = ( "nia2", "nia0" );
|
sf_extension = 0
|
||||||
|
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
}
|
||||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
);
|
||||||
drb_ciphering = "yes";
|
|
||||||
drb_integrity = "no";
|
THREAD_STRUCT = (
|
||||||
};
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
log_config :
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
{
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
global_log_level ="info";
|
worker_config = "WORKER_ENABLE";
|
||||||
global_log_verbosity ="medium";
|
}
|
||||||
hw_log_level ="info";
|
);
|
||||||
hw_log_verbosity ="medium";
|
|
||||||
phy_log_level ="info";
|
security = {
|
||||||
phy_log_verbosity ="medium";
|
# preferred ciphering algorithms
|
||||||
mac_log_level ="info";
|
# the first one of the list that an UE supports in chosen
|
||||||
mac_log_verbosity ="high";
|
# valid values: nea0, nea1, nea2, nea3
|
||||||
rlc_log_level ="info";
|
ciphering_algorithms = ( "nea0" );
|
||||||
rlc_log_verbosity ="medium";
|
|
||||||
pdcp_log_level ="info";
|
# preferred integrity algorithms
|
||||||
pdcp_log_verbosity ="medium";
|
# the first one of the list that an UE supports in chosen
|
||||||
rrc_log_level ="info";
|
# valid values: nia0, nia1, nia2, nia3
|
||||||
rrc_log_verbosity ="medium";
|
integrity_algorithms = ( "nia2", "nia0" );
|
||||||
ngap_log_level ="debug";
|
|
||||||
ngap_log_verbosity ="medium";
|
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||||
};
|
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||||
|
drb_ciphering = "yes";
|
||||||
|
drb_integrity = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
f1ap_log_level ="debug";
|
||||||
|
f1ap_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|||||||
@@ -21,9 +21,10 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts = 1;
|
pdsch_AntennaPorts = 1;
|
||||||
pusch_AntennaPorts = 1;
|
pusch_AntennaPorts = 1;
|
||||||
|
min_rxtxtime_pdsch = 6;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
@@ -124,7 +125,7 @@ gNBs =
|
|||||||
|
|
||||||
initialULBWPk2_1 = 6; # used for mixed slot
|
initialULBWPk2_1 = 6; # used for mixed slot
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
initialULBWPstartSymbolAndLength_1 = 69; # this is SS=10 L=2
|
initialULBWPstartSymbolAndLength_1 = 38; # this is SS=10 L=3
|
||||||
|
|
||||||
initialULBWPk2_2 = 7; # used for Msg.3 during RA
|
initialULBWPk2_2 = 7; # used for Msg.3 during RA
|
||||||
initialULBWPmappingType_2 = 1;
|
initialULBWPmappingType_2 = 1;
|
||||||
@@ -211,7 +212,6 @@ MACRLCs = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
ulsch_max_slots_inactivity = 1;
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -226,6 +226,7 @@ MACRLCs = (
|
|||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
pusch_TargetSNRx10 = 200;
|
pusch_TargetSNRx10 = 200;
|
||||||
pucch_TargetSNRx10 = 200;
|
pucch_TargetSNRx10 = 200;
|
||||||
|
ulsch_max_frame_inactivity = 1;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -249,6 +250,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 111;
|
max_rxgain = 111;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
|
# sdr_addrs = "serial=30C51D4";
|
||||||
# clock_src = "external";
|
# clock_src = "external";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
uicc0 = {
|
||||||
|
imsi = "208970100001127";
|
||||||
|
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||||
|
opc= "c42449363bbad02b66d16bc975d77cc1";
|
||||||
|
dnn= "oai";
|
||||||
|
nssai_sst=1;
|
||||||
|
nssai_sd=66051;
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@ Ref :
|
|||||||
DLSCH encoding : 230.0
|
DLSCH encoding : 230.0
|
||||||
L1 Rx processing : 175.0
|
L1 Rx processing : 175.0
|
||||||
PUSCH inner-receiver : 100.0
|
PUSCH inner-receiver : 100.0
|
||||||
PUSCH decoding : 140.0
|
PUSCH decoding : 180.0
|
||||||
DL & UL scheduling timing stats : 37.0
|
DL & UL scheduling timing stats : 37.0
|
||||||
UL Indication : 38.0
|
UL Indication : 38.0
|
||||||
Threshold :
|
Threshold :
|
||||||
|
|||||||
+193
-37
@@ -53,7 +53,7 @@ import constants as CONST
|
|||||||
class EPCManagement():
|
class EPCManagement():
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
self.IPAddress = ''
|
self.IPAddress = ''
|
||||||
self.UserName = ''
|
self.UserName = ''
|
||||||
self.Password = ''
|
self.Password = ''
|
||||||
@@ -62,10 +62,10 @@ class EPCManagement():
|
|||||||
self.PcapFileName = ''
|
self.PcapFileName = ''
|
||||||
self.testCase_id = ''
|
self.testCase_id = ''
|
||||||
self.MmeIPAddress = ''
|
self.MmeIPAddress = ''
|
||||||
self.AmfIPAddress = ''
|
|
||||||
self.containerPrefix = 'prod'
|
self.containerPrefix = 'prod'
|
||||||
self.mmeConfFile = 'mme.conf'
|
self.mmeConfFile = 'mme.conf'
|
||||||
self.yamlPath = ''
|
self.yamlPath = ''
|
||||||
|
self.isMagmaUsed = False
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -108,6 +108,14 @@ class EPCManagement():
|
|||||||
logging.debug('Using the ltebox simulated HSS')
|
logging.debug('Using the ltebox simulated HSS')
|
||||||
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
||||||
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
|
result = re.search('hss_sim s6as diam_hss', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
mySSH.command('echo ' + self.Password + ' | sudo -S killall hss_sim', '\$', 5)
|
||||||
|
mySSH.command('ps aux | grep --colour=never xGw | grep -v grep', '\$', 5, silent=True)
|
||||||
|
result = re.search('root.*xGw', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
mySSH.command('cd /opt/ltebox/tools', '\$', 5)
|
||||||
|
mySSH.command('echo ' + self.Password + ' | sudo -S ./stop_ltebox', '\$', 5)
|
||||||
mySSH.command('cd /opt/hss_sim0609', '\$', 5)
|
mySSH.command('cd /opt/hss_sim0609', '\$', 5)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm -f hss.log', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S rm -f hss.log', '\$', 5)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S echo "Starting sudo session" && sudo su -c "screen -dm -S simulated_hss ./starthss"', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S echo "Starting sudo session" && sudo su -c "screen -dm -S simulated_hss ./starthss"', '\$', 5)
|
||||||
@@ -164,7 +172,15 @@ class EPCManagement():
|
|||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
mySSH.command('docker inspect --format="MME_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ' + self.containerPrefix + '-oai-mme', '\$', 5)
|
self.isMagmaUsed = False
|
||||||
|
mySSH.command('docker ps -a', '\$', 5)
|
||||||
|
result = re.search('magma', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
self.isMagmaUsed = True
|
||||||
|
if self.isMagmaUsed:
|
||||||
|
mySSH.command('docker inspect --format="MME_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ' + self.containerPrefix + '-magma-mme', '\$', 5)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker inspect --format="MME_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ' + self.containerPrefix + '-oai-mme', '\$', 5)
|
||||||
result = re.search('MME_IP_ADDR = (?P<mme_ip_addr>[0-9\.]+)', mySSH.getBefore())
|
result = re.search('MME_IP_ADDR = (?P<mme_ip_addr>[0-9\.]+)', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
self.MmeIPAddress = result.group('mme_ip_addr')
|
self.MmeIPAddress = result.group('mme_ip_addr')
|
||||||
@@ -219,6 +235,7 @@ class EPCManagement():
|
|||||||
sys.exit('Insufficient EPC Parameters')
|
sys.exit('Insufficient EPC Parameters')
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
|
html_cell = '<pre style="background-color:white">\n'
|
||||||
if re.match('ltebox', self.Type, re.IGNORECASE):
|
if re.match('ltebox', self.Type, re.IGNORECASE):
|
||||||
logging.debug('Using the SABOX simulated HSS')
|
logging.debug('Using the SABOX simulated HSS')
|
||||||
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
||||||
@@ -229,16 +246,48 @@ class EPCManagement():
|
|||||||
logging.debug('Using the sabox')
|
logging.debug('Using the sabox')
|
||||||
mySSH.command('cd /opt/ltebox/tools', '\$', 5)
|
mySSH.command('cd /opt/ltebox/tools', '\$', 5)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S ./start_sabox', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S ./start_sabox', '\$', 5)
|
||||||
|
html_cell += 'N/A\n'
|
||||||
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
||||||
logging.debug('Starting OAI CN5G')
|
logging.debug('Starting OAI CN5G')
|
||||||
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
||||||
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
|
mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
|
||||||
mySSH.command('./core-network.sh start nrf spgwu', '\$', 60)
|
mySSH.command('./core-network.sh start nrf spgwu', '\$', 60)
|
||||||
|
time.sleep(2)
|
||||||
|
mySSH.command('docker-compose -p 5gcn ps -a', '\$', 60)
|
||||||
|
if mySSH.getBefore().count('Up (healthy)') != 6:
|
||||||
|
logging.error('Not all container healthy')
|
||||||
|
else:
|
||||||
|
logging.debug('OK')
|
||||||
|
mySSH.command('docker-compose config | grep --colour=never image', '\$', 10)
|
||||||
|
listOfImages = mySSH.getBefore()
|
||||||
|
for imageLine in listOfImages.split('\\r\\n'):
|
||||||
|
res1 = re.search('image: (?P<name>[a-zA-Z0-9\-]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine))
|
||||||
|
res2 = re.search('mysql', str(imageLine))
|
||||||
|
if res1 is not None and res2 is None:
|
||||||
|
html_cell += res1.group('name') + ':' + res1.group('tag') + ' '
|
||||||
|
nbChars = len(res1.group('name')) + len(res1.group('tag')) + 2
|
||||||
|
while (nbChars < 32):
|
||||||
|
html_cell += ' '
|
||||||
|
nbChars += 1
|
||||||
|
mySSH.command('docker image inspect --format="Size = {{.Size}} bytes" ' + res1.group('name') + ':' + res1.group('tag'), '\$', 10)
|
||||||
|
res3 = re.search('Size *= *(?P<size>[0-9\-]*) *bytes', mySSH.getBefore())
|
||||||
|
if res3 is not None:
|
||||||
|
imageSize = int(res3.group('size'))
|
||||||
|
imageSize = int(imageSize/(1024*1024))
|
||||||
|
html_cell += str(imageSize) + ' MBytes '
|
||||||
|
mySSH.command('docker image inspect --format="Date = {{.Created}}" ' + res1.group('name') + ':' + res1.group('tag'), '\$', 10)
|
||||||
|
res4 = re.search('Date *= *(?P<date>[0-9\-]*)T', mySSH.getBefore())
|
||||||
|
if res4 is not None:
|
||||||
|
html_cell += '(' + res4.group('date') + ')'
|
||||||
|
html_cell += '\n'
|
||||||
else:
|
else:
|
||||||
logging.error('This option should not occur!')
|
logging.error('This option should not occur!')
|
||||||
|
html_cell += '</pre>'
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
html_queue = SimpleQueue()
|
||||||
|
html_queue.put(html_cell)
|
||||||
|
HTML.CreateHtmlTestRowQueue(self.Type, 'OK', 1, html_queue)
|
||||||
|
|
||||||
def SetAmfIPAddress(self):
|
def SetAmfIPAddress(self):
|
||||||
# Not an error if we don't need an 5GCN
|
# Not an error if we don't need an 5GCN
|
||||||
@@ -289,7 +338,15 @@ class EPCManagement():
|
|||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('docker top ' + self.containerPrefix + '-oai-mme', '\$', 5)
|
self.isMagmaUsed = False
|
||||||
|
mySSH.command('docker ps -a', '\$', 5)
|
||||||
|
result = re.search('magma', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
self.isMagmaUsed = True
|
||||||
|
if self.isMagmaUsed:
|
||||||
|
mySSH.command('docker top ' + self.containerPrefix + '-magma-mme', '\$', 5)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker top ' + self.containerPrefix + '-oai-mme', '\$', 5)
|
||||||
else:
|
else:
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep --color=never mme | grep -v grep', '\$', 5)
|
mySSH.command('stdbuf -o0 ps -aux | grep --color=never mme | grep -v grep', '\$', 5)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
@@ -354,7 +411,7 @@ class EPCManagement():
|
|||||||
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGINT oai_hss || true', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGINT oai_hss || true', '\$', 5)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep hss | grep -v grep', '\$', 5)
|
mySSH.command('stdbuf -o0 ps -aux | grep --colour=never hss | grep -v grep', '\$', 5)
|
||||||
result = re.search('oai_hss -j', mySSH.getBefore())
|
result = re.search('oai_hss -j', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGKILL oai_hss || true', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGKILL oai_hss || true', '\$', 5)
|
||||||
@@ -362,7 +419,7 @@ class EPCManagement():
|
|||||||
elif re.match('OAI', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGINT run_hss oai_hss || true', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGINT run_hss oai_hss || true', '\$', 5)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep hss | grep -v grep', '\$', 5)
|
mySSH.command('stdbuf -o0 ps -aux | grep --colour=never hss | grep -v grep', '\$', 5)
|
||||||
result = re.search('\/bin\/bash .\/run_', mySSH.getBefore())
|
result = re.search('\/bin\/bash .\/run_', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGKILL run_hss oai_hss || true', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGKILL run_hss oai_hss || true', '\$', 5)
|
||||||
@@ -371,6 +428,11 @@ class EPCManagement():
|
|||||||
mySSH.command('cd scripts', '\$', 5)
|
mySSH.command('cd scripts', '\$', 5)
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S screen -S simulated_hss -X quit', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S screen -S simulated_hss -X quit', '\$', 5)
|
||||||
|
time.sleep(5)
|
||||||
|
mySSH.command('ps aux | grep --colour=never hss_sim | grep -v grep', '\$', 5, silent=True)
|
||||||
|
result = re.search('hss_sim s6as diam_hss', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
mySSH.command('echo ' + self.Password + ' | sudo -S killall hss_sim', '\$', 5)
|
||||||
else:
|
else:
|
||||||
logging.error('This should not happen!')
|
logging.error('This should not happen!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
@@ -397,6 +459,7 @@ class EPCManagement():
|
|||||||
elif re.match('ltebox', self.Type, re.IGNORECASE):
|
elif re.match('ltebox', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('cd /opt/ltebox/tools', '\$', 5)
|
mySSH.command('cd /opt/ltebox/tools', '\$', 5)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S ./stop_mme', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S ./stop_mme', '\$', 5)
|
||||||
|
time.sleep(5)
|
||||||
else:
|
else:
|
||||||
logging.error('This should not happen!')
|
logging.error('This should not happen!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
@@ -448,6 +511,7 @@ class EPCManagement():
|
|||||||
def Terminate5GCN(self, HTML):
|
def Terminate5GCN(self, HTML):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
|
message = ''
|
||||||
if re.match('ltebox', self.Type, re.IGNORECASE):
|
if re.match('ltebox', self.Type, re.IGNORECASE):
|
||||||
logging.debug('Terminating SA BOX')
|
logging.debug('Terminating SA BOX')
|
||||||
mySSH.command('cd /opt/ltebox/tools', '\$', 5)
|
mySSH.command('cd /opt/ltebox/tools', '\$', 5)
|
||||||
@@ -458,15 +522,31 @@ class EPCManagement():
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S screen -S simulated_5g_hss -X quit', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S screen -S simulated_5g_hss -X quit', '\$', 5)
|
||||||
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
||||||
self.LogCollectOAICN5G()
|
logging.debug('OAI CN5G Collecting Log files to workspace')
|
||||||
|
mySSH.command('echo ' + self.Password + ' | sudo rm -rf ' + self.SourceCodePath + '/logs', '\$', 5)
|
||||||
|
mySSH.command('mkdir ' + self.SourceCodePath + '/logs','\$', 5)
|
||||||
|
containers_list=['oai-smf','oai-spgwu','oai-amf','oai-nrf']
|
||||||
|
for c in containers_list:
|
||||||
|
mySSH.command('docker logs ' + c + ' > ' + self.SourceCodePath + '/logs/' + c + '.log', '\$', 5)
|
||||||
|
|
||||||
logging.debug('Terminating OAI CN5G')
|
logging.debug('Terminating OAI CN5G')
|
||||||
mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
|
mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
|
||||||
mySSH.command('docker-compose down', '\$', 5)
|
|
||||||
mySSH.command('./core-network.sh stop nrf spgwu', '\$', 60)
|
mySSH.command('./core-network.sh stop nrf spgwu', '\$', 60)
|
||||||
|
time.sleep(2)
|
||||||
|
mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30)
|
||||||
|
result = re.search('Tracking area update request', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
message = 'UE requested ' + str(mySSH.getBefore().count('Tracking area update request')) + 'Tracking area update request(s)'
|
||||||
|
else:
|
||||||
|
message = 'No Tracking area update request'
|
||||||
|
logging.debug(message)
|
||||||
else:
|
else:
|
||||||
logging.error('This should not happen!')
|
logging.error('This should not happen!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">' + message + '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
|
HTML.CreateHtmlTestRowQueue(self.Type, 'OK', 1, html_queue)
|
||||||
|
|
||||||
def DeployEpc(self, HTML):
|
def DeployEpc(self, HTML):
|
||||||
logging.debug('Trying to deploy')
|
logging.debug('Trying to deploy')
|
||||||
@@ -489,6 +569,12 @@ class EPCManagement():
|
|||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit('docker-compose not installed on ' + self.IPAddress)
|
sys.exit('docker-compose not installed on ' + self.IPAddress)
|
||||||
|
|
||||||
|
# Checking if it is a MAGMA deployment
|
||||||
|
self.isMagmaUsed = False
|
||||||
|
if os.path.isfile('./' + self.yamlPath + '/redis_extern.conf'):
|
||||||
|
self.isMagmaUsed = True
|
||||||
|
logging.debug('MAGMA MME is used!')
|
||||||
|
|
||||||
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
||||||
mySSH.command('if [ -d ' + self.SourceCodePath + '/logs ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/logs ; fi', '\$', 5)
|
mySSH.command('if [ -d ' + self.SourceCodePath + '/logs ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/logs ; fi', '\$', 5)
|
||||||
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts ' + self.SourceCodePath + '/logs', '\$', 5)
|
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts ' + self.SourceCodePath + '/logs', '\$', 5)
|
||||||
@@ -500,10 +586,19 @@ class EPCManagement():
|
|||||||
# - docker-compose config | grep container_name
|
# - docker-compose config | grep container_name
|
||||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/docker-compose.yml', self.SourceCodePath + '/scripts')
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/docker-compose.yml', self.SourceCodePath + '/scripts')
|
||||||
|
if self.isMagmaUsed:
|
||||||
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/entrypoint.sh', self.SourceCodePath + '/scripts')
|
||||||
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/mme.conf', self.SourceCodePath + '/scripts')
|
||||||
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/mme_fd.sprint.conf', self.SourceCodePath + '/scripts')
|
||||||
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/redis_extern.conf', self.SourceCodePath + '/scripts')
|
||||||
|
mySSH.command('chmod a+x ' + self.SourceCodePath + '/scripts/entrypoint.sh', '\$', 5)
|
||||||
|
else:
|
||||||
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/entrypoint.sh', self.SourceCodePath + '/scripts')
|
||||||
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/mme.conf', self.SourceCodePath + '/scripts')
|
||||||
|
mySSH.command('chmod 775 entrypoint.sh', '\$', 60)
|
||||||
mySSH.command('wget --quiet --tries=3 --retry-connrefused https://raw.githubusercontent.com/OPENAIRINTERFACE/openair-hss/develop/src/hss_rel14/db/oai_db.cql', '\$', 30)
|
mySSH.command('wget --quiet --tries=3 --retry-connrefused https://raw.githubusercontent.com/OPENAIRINTERFACE/openair-hss/develop/src/hss_rel14/db/oai_db.cql', '\$', 30)
|
||||||
mySSH.command('docker-compose down', '\$', 60)
|
mySSH.command('docker-compose down', '\$', 60)
|
||||||
mySSH.command('docker-compose up -d db_init', '\$', 60)
|
mySSH.command('docker-compose up -d db_init', '\$', 60)
|
||||||
|
|
||||||
# databases take time...
|
# databases take time...
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
cnt = 0
|
cnt = 0
|
||||||
@@ -525,8 +620,12 @@ class EPCManagement():
|
|||||||
|
|
||||||
# deploying EPC cNFs
|
# deploying EPC cNFs
|
||||||
mySSH.command('docker-compose up -d oai_spgwu', '\$', 60)
|
mySSH.command('docker-compose up -d oai_spgwu', '\$', 60)
|
||||||
listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
|
if self.isMagmaUsed:
|
||||||
expectedHealthyContainers = 5
|
listOfContainers = 'prod-cassandra prod-oai-hss prod-magma-mme prod-oai-spgwc prod-oai-spgwu-tiny prod-redis'
|
||||||
|
expectedHealthyContainers = 6
|
||||||
|
else:
|
||||||
|
listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
|
||||||
|
expectedHealthyContainers = 5
|
||||||
|
|
||||||
# Checking for additional services
|
# Checking for additional services
|
||||||
mySSH.command('docker-compose config', '\$', 5)
|
mySSH.command('docker-compose config', '\$', 5)
|
||||||
@@ -540,6 +639,30 @@ class EPCManagement():
|
|||||||
listOfContainers += ' prod-trf-gen'
|
listOfContainers += ' prod-trf-gen'
|
||||||
expectedHealthyContainers += 1
|
expectedHealthyContainers += 1
|
||||||
|
|
||||||
|
mySSH.command('docker-compose config | grep --colour=never image', '\$', 10)
|
||||||
|
html_cell = '<pre style="background-color:white">\n'
|
||||||
|
listOfImages = mySSH.getBefore()
|
||||||
|
for imageLine in listOfImages.split('\\r\\n'):
|
||||||
|
res1 = re.search('image: (?P<name>[a-zA-Z0-9\-]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine))
|
||||||
|
res2 = re.search('cassandra|redis', str(imageLine))
|
||||||
|
if res1 is not None and res2 is None:
|
||||||
|
html_cell += res1.group('name') + ':' + res1.group('tag') + ' '
|
||||||
|
nbChars = len(res1.group('name')) + len(res1.group('tag')) + 2
|
||||||
|
while (nbChars < 32):
|
||||||
|
html_cell += ' '
|
||||||
|
nbChars += 1
|
||||||
|
mySSH.command('docker image inspect --format="Size = {{.Size}} bytes" ' + res1.group('name') + ':' + res1.group('tag'), '\$', 10)
|
||||||
|
res3 = re.search('Size *= *(?P<size>[0-9\-]*) *bytes', mySSH.getBefore())
|
||||||
|
if res3 is not None:
|
||||||
|
imageSize = int(res3.group('size'))
|
||||||
|
imageSize = int(imageSize/(1024*1024))
|
||||||
|
html_cell += str(imageSize) + ' MBytes '
|
||||||
|
mySSH.command('docker image inspect --format="Date = {{.Created}}" ' + res1.group('name') + ':' + res1.group('tag'), '\$', 10)
|
||||||
|
res4 = re.search('Date *= *(?P<date>[0-9\-]*)T', mySSH.getBefore())
|
||||||
|
if res4 is not None:
|
||||||
|
html_cell += '(' + res4.group('date') + ')'
|
||||||
|
html_cell += '\n'
|
||||||
|
html_cell += '</pre>'
|
||||||
# Checking if all are healthy
|
# Checking if all are healthy
|
||||||
cnt = 0
|
cnt = 0
|
||||||
while (cnt < 3):
|
while (cnt < 3):
|
||||||
@@ -555,19 +678,24 @@ class EPCManagement():
|
|||||||
logging.debug(' -- ' + str(healthyNb) + ' healthy container(s)')
|
logging.debug(' -- ' + str(healthyNb) + ' healthy container(s)')
|
||||||
logging.debug(' -- ' + str(unhealthyNb) + ' unhealthy container(s)')
|
logging.debug(' -- ' + str(unhealthyNb) + ' unhealthy container(s)')
|
||||||
logging.debug(' -- ' + str(startingNb) + ' still starting container(s)')
|
logging.debug(' -- ' + str(startingNb) + ' still starting container(s)')
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_queue.put(html_cell)
|
||||||
if healthyNb == expectedHealthyContainers:
|
if healthyNb == expectedHealthyContainers:
|
||||||
mySSH.command('docker exec -d prod-oai-hss /bin/bash -c "nohup tshark -i any -f \'port 9042 or port 3868\' -w /tmp/hss_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
mySSH.command('docker exec -d prod-oai-hss /bin/bash -c "nohup tshark -i any -f \'port 9042 or port 3868\' -w /tmp/hss_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||||
mySSH.command('docker exec -d prod-oai-mme /bin/bash -c "nohup tshark -i any -f \'port 3868 or port 2123 or port 36412\' -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
if self.isMagmaUsed:
|
||||||
|
mySSH.command('docker exec -d prod-magma-mme /bin/bash -c "nohup tshark -i any -f \'port 3868 or port 2123 or port 36412\' -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker exec -d prod-oai-mme /bin/bash -c "nohup tshark -i any -f \'port 3868 or port 2123 or port 36412\' -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
||||||
mySSH.command('docker exec -d prod-oai-spgwc /bin/bash -c "nohup tshark -i any -f \'port 2123 or port 8805\' -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
mySSH.command('docker exec -d prod-oai-spgwc /bin/bash -c "nohup tshark -i any -f \'port 2123 or port 8805\' -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
||||||
# on SPGW-U, not capturing on SGI to avoid huge file
|
# on SPGW-U, not capturing on SGI to avoid huge file
|
||||||
mySSH.command('docker exec -d prod-oai-spgwu-tiny /bin/bash -c "nohup tshark -i any -f \'port 8805\' -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
mySSH.command('docker exec -d prod-oai-spgwu-tiny /bin/bash -c "nohup tshark -i any -f \'port 8805\' -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
logging.debug('Deployment OK')
|
logging.debug('Deployment OK')
|
||||||
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRowQueue(self.Type, 'OK', 1, html_queue)
|
||||||
else:
|
else:
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
logging.debug('Deployment went wrong')
|
logging.debug('Deployment went wrong')
|
||||||
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
HTML.CreateHtmlTestRowQueue(self.Type, 'KO', 1, html_queue)
|
||||||
|
|
||||||
def UndeployEpc(self, HTML):
|
def UndeployEpc(self, HTML):
|
||||||
logging.debug('Trying to undeploy')
|
logging.debug('Trying to undeploy')
|
||||||
@@ -575,24 +703,52 @@ class EPCManagement():
|
|||||||
|
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
|
# Checking if it is a MAGMA deployment.
|
||||||
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
|
mySSH.command('docker-compose ps -a', '\$', 5)
|
||||||
|
self.isMagmaUsed = False
|
||||||
|
result = re.search('magma', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
self.isMagmaUsed = True
|
||||||
|
logging.debug('MAGMA MME is used!')
|
||||||
# Recovering logs and pcap files
|
# Recovering logs and pcap files
|
||||||
mySSH.command('cd ' + self.SourceCodePath + '/logs', '\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/logs', '\$', 5)
|
||||||
mySSH.command('docker exec -it prod-oai-hss /bin/bash -c "killall --signal SIGINT oai_hss tshark"', '\$', 5)
|
mySSH.command('docker exec -it prod-oai-hss /bin/bash -c "killall --signal SIGINT oai_hss tshark"', '\$', 5)
|
||||||
mySSH.command('docker exec -it prod-oai-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
|
if self.isMagmaUsed:
|
||||||
|
mySSH.command('docker exec -it prod-magma-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker exec -it prod-oai-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
|
||||||
mySSH.command('docker exec -it prod-oai-spgwc /bin/bash -c "killall --signal SIGINT oai_spgwc tshark"', '\$', 5)
|
mySSH.command('docker exec -it prod-oai-spgwc /bin/bash -c "killall --signal SIGINT oai_spgwc tshark"', '\$', 5)
|
||||||
mySSH.command('docker exec -it prod-oai-spgwu-tiny /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
|
mySSH.command('docker exec -it prod-oai-spgwu-tiny /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
|
||||||
mySSH.command('docker logs prod-oai-hss > hss_' + self.testCase_id + '.log', '\$', 5)
|
mySSH.command('docker logs prod-oai-hss > hss_' + self.testCase_id + '.log', '\$', 5)
|
||||||
mySSH.command('docker logs prod-oai-mme > mme_' + self.testCase_id + '.log', '\$', 5)
|
if self.isMagmaUsed:
|
||||||
|
mySSH.command('docker cp --follow-link prod-magma-mme:/var/log/mme.log mme_' + self.testCase_id + '.log', '\$', 15)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker logs prod-oai-mme > mme_' + self.testCase_id + '.log', '\$', 5)
|
||||||
mySSH.command('docker logs prod-oai-spgwc > spgwc_' + self.testCase_id + '.log', '\$', 5)
|
mySSH.command('docker logs prod-oai-spgwc > spgwc_' + self.testCase_id + '.log', '\$', 5)
|
||||||
mySSH.command('docker logs prod-oai-spgwu-tiny > spgwu_' + self.testCase_id + '.log', '\$', 5)
|
mySSH.command('docker logs prod-oai-spgwu-tiny > spgwu_' + self.testCase_id + '.log', '\$', 5)
|
||||||
mySSH.command('docker cp prod-oai-hss:/tmp/hss_check_run.pcap hss_' + self.testCase_id + '.pcap', '\$', 60)
|
mySSH.command('docker cp prod-oai-hss:/tmp/hss_check_run.pcap hss_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
mySSH.command('docker cp prod-oai-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
|
if self.isMagmaUsed:
|
||||||
|
mySSH.command('docker cp prod-magma-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker cp prod-oai-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
|
mySSH.command('tshark -r mme_' + self.testCase_id + '.pcap | egrep --colour=never "Tracking area update"', '\$', 60)
|
||||||
|
result = re.search('Tracking area update request', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
message = 'UE requested ' + str(mySSH.getBefore().count('Tracking area update request')) + 'Tracking area update request(s)'
|
||||||
|
else:
|
||||||
|
message = 'No Tracking area update request'
|
||||||
|
logging.debug(message)
|
||||||
mySSH.command('docker cp prod-oai-spgwc:/tmp/spgwc_check_run.pcap spgwc_' + self.testCase_id + '.pcap', '\$', 60)
|
mySSH.command('docker cp prod-oai-spgwc:/tmp/spgwc_check_run.pcap spgwc_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
mySSH.command('docker cp prod-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap spgwu_' + self.testCase_id + '.pcap', '\$', 60)
|
mySSH.command('docker cp prod-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap spgwu_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
# Remove all
|
# Remove all
|
||||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
|
if self.isMagmaUsed:
|
||||||
nbContainers = 5
|
listOfContainers = 'prod-cassandra prod-oai-hss prod-magma-mme prod-oai-spgwc prod-oai-spgwu-tiny prod-redis'
|
||||||
|
nbContainers = 6
|
||||||
|
else:
|
||||||
|
listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
|
||||||
|
nbContainers = 5
|
||||||
# Checking for additional services
|
# Checking for additional services
|
||||||
mySSH.command('docker-compose config', '\$', 5)
|
mySSH.command('docker-compose config', '\$', 5)
|
||||||
configResponse = mySSH.getBefore()
|
configResponse = mySSH.getBefore()
|
||||||
@@ -609,12 +765,15 @@ class EPCManagement():
|
|||||||
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
|
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
|
||||||
noMoreNetworkNb = mySSH.getBefore().count('No such object')
|
noMoreNetworkNb = mySSH.getBefore().count('No such object')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">' + message + '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
if noMoreContainerNb == nbContainers and noMoreNetworkNb == 2:
|
if noMoreContainerNb == nbContainers and noMoreNetworkNb == 2:
|
||||||
logging.debug('Undeployment OK')
|
logging.debug('Undeployment OK')
|
||||||
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRowQueue(self.Type, 'OK', 1, html_queue)
|
||||||
else:
|
else:
|
||||||
logging.debug('Undeployment went wrong')
|
logging.debug('Undeployment went wrong')
|
||||||
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
HTML.CreateHtmlTestRowQueue(self.Type, 'KO', 1, html_queue)
|
||||||
|
|
||||||
def LogCollectHSS(self):
|
def LogCollectHSS(self):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
@@ -633,6 +792,8 @@ class EPCManagement():
|
|||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/openair-hss/hss_check_run.log .', '\$', 60)
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/openair-hss/hss_check_run.log .', '\$', 60)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 60)
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 60)
|
||||||
mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
|
mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
|
||||||
|
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
||||||
|
logging.debug('LogCollect is bypassed for that variant')
|
||||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('zip hss.log.zip hss*.log', '\$', 60)
|
mySSH.command('zip hss.log.zip hss*.log', '\$', 60)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm hss*.log', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S rm hss*.log', '\$', 5)
|
||||||
@@ -663,6 +824,11 @@ class EPCManagement():
|
|||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/openair-mme/mme_check_run.log .', '\$', 60)
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/openair-mme/mme_check_run.log .', '\$', 60)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 60)
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 60)
|
||||||
mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
|
mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
|
||||||
|
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
||||||
|
mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5)
|
||||||
|
mySSH.command('cp -f /tmp/oai-cn5g.pcap .','\$', 30)
|
||||||
|
mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g.pcap','\$', 30)
|
||||||
|
mySSH.command('mv mme.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
|
||||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
|
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm mme*.log', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S rm mme*.log', '\$', 5)
|
||||||
@@ -692,6 +858,10 @@ class EPCManagement():
|
|||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap .', '\$', 60)
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap .', '\$', 60)
|
||||||
mySSH.command('zip spgw.log.zip spgw*_check_run.*', '\$', 60)
|
mySSH.command('zip spgw.log.zip spgw*_check_run.*', '\$', 60)
|
||||||
|
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
||||||
|
mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5)
|
||||||
|
mySSH.command('zip spgw.log.zip oai-smf.log oai-spgwu.log','\$', 30)
|
||||||
|
mySSH.command('mv spgw.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
|
||||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('zip spgw.log.zip spgw*.log', '\$', 60)
|
mySSH.command('zip spgw.log.zip spgw*.log', '\$', 60)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm spgw*.log', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S rm spgw*.log', '\$', 5)
|
||||||
@@ -701,17 +871,3 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('This option should not occur!')
|
logging.error('This option should not occur!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
def LogCollectOAICN5G(self):
|
|
||||||
mySSH = SSH.SSHConnection()
|
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
|
||||||
logging.debug('OAI CN5G Collecting Log files to workspace')
|
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo rm -rf ' + self.SourceCodePath + '/logs', '\$', 5)
|
|
||||||
mySSH.command('mkdir ' + self.SourceCodePath + '/logs','\$', 5)
|
|
||||||
containers_list=['oai-smf','oai-spgwu','oai-amf','oai-nrf']
|
|
||||||
for c in containers_list:
|
|
||||||
mySSH.command('docker logs ' + c + ' > ' + self.SourceCodePath + '/logs/' + c + '.log', '\$', 5)
|
|
||||||
mySSH.command('cd ' + self.SourceCodePath + '/logs', '\$', 5)
|
|
||||||
mySSH.command('zip oai-cn5g.log.zip *.log', '\$', 60)
|
|
||||||
mySSH.close()
|
|
||||||
|
|
||||||
|
|||||||
+40
-11
@@ -410,6 +410,17 @@ def GetParametersFromXML(action):
|
|||||||
if (string_field is not None):
|
if (string_field is not None):
|
||||||
CONTAINERS.cliOptions = string_field
|
CONTAINERS.cliOptions = string_field
|
||||||
|
|
||||||
|
elif action == 'Copy_Image_to_Test':
|
||||||
|
string_field = test.findtext('image_name')
|
||||||
|
if (string_field is not None):
|
||||||
|
CONTAINERS.imageToCopy = string_field
|
||||||
|
string_field = test.findtext('registry_svr_id')
|
||||||
|
if (string_field is not None):
|
||||||
|
CONTAINERS.registrySvrId = string_field
|
||||||
|
string_field = test.findtext('test_svr_id')
|
||||||
|
if (string_field is not None):
|
||||||
|
CONTAINERS.testSvrId = string_field
|
||||||
|
|
||||||
else: # ie action == 'Run_PhySim':
|
else: # ie action == 'Run_PhySim':
|
||||||
ldpc.runargs = test.findtext('physim_run_args')
|
ldpc.runargs = test.findtext('physim_run_args')
|
||||||
|
|
||||||
@@ -533,7 +544,7 @@ elif re.match('^TerminateOAIUE$', mode, re.IGNORECASE):
|
|||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
signal.signal(signal.SIGUSR1, receive_signal)
|
signal.signal(signal.SIGUSR1, receive_signal)
|
||||||
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE)
|
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
elif re.match('^TerminateHSS$', mode, re.IGNORECASE):
|
elif re.match('^TerminateHSS$', mode, re.IGNORECASE):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -734,6 +745,22 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML.SethtmlUEConnected(len(CiTestObj.UEDevices) + len(CiTestObj.CatMDevices))
|
HTML.SethtmlUEConnected(len(CiTestObj.UEDevices) + len(CiTestObj.CatMDevices))
|
||||||
HTML.CreateHtmlTabHeader()
|
HTML.CreateHtmlTabHeader()
|
||||||
|
|
||||||
|
# On CI bench w/ containers, we need to validate if IP routes are set
|
||||||
|
if EPC.IPAddress == '192.168.18.210':
|
||||||
|
CONTAINERS.CheckAndAddRoute('porcepix', EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
|
if CONTAINERS.eNBIPAddress == '192.168.18.194':
|
||||||
|
CONTAINERS.CheckAndAddRoute('asterix', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
||||||
|
if CONTAINERS.eNB1IPAddress == '192.168.18.194':
|
||||||
|
CONTAINERS.CheckAndAddRoute('asterix', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
||||||
|
if CONTAINERS.eNBIPAddress == '192.168.18.193':
|
||||||
|
CONTAINERS.CheckAndAddRoute('obelix', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
||||||
|
if CONTAINERS.eNB1IPAddress == '192.168.18.193':
|
||||||
|
CONTAINERS.CheckAndAddRoute('obelix', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
||||||
|
if CONTAINERS.eNBIPAddress == '192.168.18.209':
|
||||||
|
CONTAINERS.CheckAndAddRoute('nepes', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
||||||
|
if CONTAINERS.eNB1IPAddress == '192.168.18.209':
|
||||||
|
CONTAINERS.CheckAndAddRoute('nepes', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
||||||
|
|
||||||
CiTestObj.FailReportCnt = 0
|
CiTestObj.FailReportCnt = 0
|
||||||
RAN.prematureExit=True
|
RAN.prematureExit=True
|
||||||
HTML.startTime=int(round(time.time() * 1000))
|
HTML.startTime=int(round(time.time() * 1000))
|
||||||
@@ -782,39 +809,39 @@ 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,RAN, EPC, COTS_UE, InfraUE, CiTestObj.ue_trace)
|
CiTestObj.InitializeUE(HTML,RAN, EPC, COTS_UE, InfraUE, CiTestObj.ue_trace, CONTAINERS)
|
||||||
elif action == 'Terminate_UE':
|
elif action == 'Terminate_UE':
|
||||||
CiTestObj.TerminateUE(HTML,COTS_UE, InfraUE, CiTestObj.ue_trace)
|
CiTestObj.TerminateUE(HTML,COTS_UE, InfraUE, CiTestObj.ue_trace)
|
||||||
elif action == 'Attach_UE':
|
elif action == 'Attach_UE':
|
||||||
CiTestObj.AttachUE(HTML,RAN,EPC,COTS_UE,InfraUE)
|
CiTestObj.AttachUE(HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS)
|
||||||
elif action == 'Detach_UE':
|
elif action == 'Detach_UE':
|
||||||
CiTestObj.DetachUE(HTML,RAN,EPC,COTS_UE,InfraUE)
|
CiTestObj.DetachUE(HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS)
|
||||||
elif action == 'DataDisable_UE':
|
elif action == 'DataDisable_UE':
|
||||||
CiTestObj.DataDisableUE(HTML)
|
CiTestObj.DataDisableUE(HTML)
|
||||||
elif action == 'DataEnable_UE':
|
elif action == 'DataEnable_UE':
|
||||||
CiTestObj.DataEnableUE(HTML)
|
CiTestObj.DataEnableUE(HTML)
|
||||||
elif action == 'CheckStatusUE':
|
elif action == 'CheckStatusUE':
|
||||||
CiTestObj.CheckStatusUE(HTML,RAN,EPC,COTS_UE,InfraUE)
|
CiTestObj.CheckStatusUE(HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS)
|
||||||
elif action == 'Build_OAI_UE':
|
elif action == 'Build_OAI_UE':
|
||||||
CiTestObj.BuildOAIUE(HTML)
|
CiTestObj.BuildOAIUE(HTML)
|
||||||
elif action == 'Initialize_OAI_UE':
|
elif action == 'Initialize_OAI_UE':
|
||||||
CiTestObj.InitializeOAIUE(HTML,RAN,EPC,COTS_UE,InfraUE)
|
CiTestObj.InitializeOAIUE(HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS)
|
||||||
elif action == 'Terminate_OAI_UE':
|
elif action == 'Terminate_OAI_UE':
|
||||||
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE)
|
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
elif action == 'Initialize_CatM_module':
|
elif action == 'Initialize_CatM_module':
|
||||||
CiTestObj.InitializeCatM(HTML)
|
CiTestObj.InitializeCatM(HTML)
|
||||||
elif action == 'Terminate_CatM_module':
|
elif action == 'Terminate_CatM_module':
|
||||||
CiTestObj.TerminateCatM(HTML)
|
CiTestObj.TerminateCatM(HTML)
|
||||||
elif action == 'Attach_CatM_module':
|
elif action == 'Attach_CatM_module':
|
||||||
CiTestObj.AttachCatM(HTML,RAN,COTS_UE,EPC,InfraUE)
|
CiTestObj.AttachCatM(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
elif action == 'Detach_CatM_module':
|
elif action == 'Detach_CatM_module':
|
||||||
CiTestObj.TerminateCatM(HTML)
|
CiTestObj.TerminateCatM(HTML)
|
||||||
elif action == 'Ping_CatM_module':
|
elif action == 'Ping_CatM_module':
|
||||||
CiTestObj.PingCatM(HTML,RAN,EPC,COTS_UE,EPC,InfraUE)
|
CiTestObj.PingCatM(HTML,RAN,EPC,COTS_UE,EPC,InfraUE,CONTAINERS)
|
||||||
elif action == 'Ping':
|
elif action == 'Ping':
|
||||||
CiTestObj.Ping(HTML,RAN,EPC,COTS_UE, InfraUE)
|
CiTestObj.Ping(HTML,RAN,EPC,COTS_UE, InfraUE, CONTAINERS)
|
||||||
elif action == 'Iperf':
|
elif action == 'Iperf':
|
||||||
CiTestObj.Iperf(HTML,RAN,EPC,COTS_UE, InfraUE)
|
CiTestObj.Iperf(HTML,RAN,EPC,COTS_UE, InfraUE, CONTAINERS)
|
||||||
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':
|
||||||
@@ -853,6 +880,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
||||||
elif action == 'Build_Image':
|
elif action == 'Build_Image':
|
||||||
CONTAINERS.BuildImage(HTML)
|
CONTAINERS.BuildImage(HTML)
|
||||||
|
elif action == 'Copy_Image_to_Test':
|
||||||
|
CONTAINERS.Copy_Image_to_Test_Server(HTML)
|
||||||
elif action == 'Deploy_Object':
|
elif action == 'Deploy_Object':
|
||||||
CONTAINERS.DeployObject(HTML, EPC)
|
CONTAINERS.DeployObject(HTML, EPC)
|
||||||
elif action == 'Undeploy_Object':
|
elif action == 'Undeploy_Object':
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
container_name: oaicicd_mysql
|
||||||
|
restart: always
|
||||||
|
image: mysql:latest
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: 'ucZBc2XRYdvEm59F'
|
||||||
|
ports:
|
||||||
|
- "3307:3306"
|
||||||
|
volumes:
|
||||||
|
- /home/oaicicd/mysql/data:/var/lib/mysql
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import pymysql
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
#This is the script used to write the test results to the mysql DB
|
||||||
|
#Called by Jenkins pipeline (jenkinsfile)
|
||||||
|
#Must be located in /home/oaicicid/mysql on the database host
|
||||||
|
#Usage from Jenkinsfile :
|
||||||
|
#python3 /home/oaicicd/mysql/sql_connect.py ${JOB_NAME} ${params.eNB_MR} ${params.eNB_Branch} ${env.BUILD_ID} ${env.BUILD_URL} ${StatusForDb} ''
|
||||||
|
|
||||||
|
class SQLConnect:
|
||||||
|
def __init__(self):
|
||||||
|
self.connection = pymysql.connect(
|
||||||
|
host='172.22.0.2',
|
||||||
|
user='root',
|
||||||
|
password = 'ucZBc2XRYdvEm59F',
|
||||||
|
db='oaicicd_tests',
|
||||||
|
port=3306
|
||||||
|
)
|
||||||
|
|
||||||
|
def put(self,TEST,MR,BRANCH,BUILD,BUILD_LINK,STATUS):
|
||||||
|
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
cur=self.connection.cursor()
|
||||||
|
cur.execute ('INSERT INTO test_results (TEST,MR,BRANCH,BUILD,BUILD_LINK,STATUS,DATE) VALUES (%s,%s,%s,%s,%s,%s,%s);' , (TEST, MR, BRANCH, BUILD, BUILD_LINK, STATUS, now))
|
||||||
|
self.connection.commit()
|
||||||
|
self.connection.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
mydb=SQLConnect()
|
||||||
|
mydb.put(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5],sys.argv[6])
|
||||||
|
|
||||||
|
|
||||||
+92
-40
@@ -165,16 +165,16 @@ class RANManagement():
|
|||||||
result = re.search('LAST_BUILD_INFO', mySSH.getBefore())
|
result = re.search('LAST_BUILD_INFO', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
mismatch = False
|
mismatch = False
|
||||||
mySSH.command('grep SRC_COMMIT LAST_BUILD_INFO.txt', '\$', 2)
|
mySSH.command('grep --colour=never SRC_COMMIT LAST_BUILD_INFO.txt', '\$', 2)
|
||||||
result = re.search(self.ranCommitID, mySSH.getBefore())
|
result = re.search(self.ranCommitID, mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mismatch = True
|
mismatch = True
|
||||||
mySSH.command('grep MERGED_W_TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
mySSH.command('grep --colour=never MERGED_W_TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
result = re.search('YES', mySSH.getBefore())
|
result = re.search('YES', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mismatch = True
|
mismatch = True
|
||||||
mySSH.command('grep TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
mySSH.command('grep --colour=never TGT_BRANCH LAST_BUILD_INFO.txt', '\$', 2)
|
||||||
if self.ranTargetBranch == '':
|
if self.ranTargetBranch == '':
|
||||||
result = re.search('develop', mySSH.getBefore())
|
result = re.search('develop', mySSH.getBefore())
|
||||||
else:
|
else:
|
||||||
@@ -374,7 +374,7 @@ class RANManagement():
|
|||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
||||||
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
||||||
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -w /tmp/' + pcapfile + ' 2>&1 &','\$', 5)
|
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
|
|
||||||
@@ -423,13 +423,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', '\$', 90)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 180)
|
||||||
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', '\$', 90)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 180)
|
||||||
# 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
|
||||||
@@ -446,7 +446,7 @@ class RANManagement():
|
|||||||
else:
|
else:
|
||||||
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED.*;/FLEXRAN_ENABLED = "no";/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED.*;/FLEXRAN_ENABLED = "no";/\' ' + ci_full_config_file, '\$', 2);
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
mySSH.command('grep enable_enb_m2 ' + ci_full_config_file, '\$', 2);
|
mySSH.command('grep --colour=never enable_enb_m2 ' + ci_full_config_file, '\$', 2);
|
||||||
result = re.search('yes', mySSH.getBefore())
|
result = re.search('yes', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = True
|
self.eNBmbmsEnables[int(self.eNB_instance)] = True
|
||||||
@@ -593,8 +593,12 @@ class RANManagement():
|
|||||||
lPassWord = self.eNBPassword
|
lPassWord = self.eNBPassword
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep --color=never ' + self.air_interface[self.eNB_instance] + ' | grep -v grep', '\$', 5)
|
if self.air_interface[self.eNB_instance] == '':
|
||||||
result = re.search(self.air_interface[self.eNB_instance], mySSH.getBefore())
|
pattern = 'softmodem'
|
||||||
|
else:
|
||||||
|
pattern = self.air_interface[self.eNB_instance]
|
||||||
|
mySSH.command('stdbuf -o0 ps -aux | grep --color=never ' + pattern + ' | grep -v grep', '\$', 5)
|
||||||
|
result = re.search(pattern, mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
logging.debug('\u001B[1;37;41m eNB Process Not Found! \u001B[0m')
|
logging.debug('\u001B[1;37;41m eNB Process Not Found! \u001B[0m')
|
||||||
status_queue.put(CONST.ENB_PROCESS_FAILED)
|
status_queue.put(CONST.ENB_PROCESS_FAILED)
|
||||||
@@ -734,8 +738,8 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor.png', '\$', 60)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png log/*/*.log log/*/*.pcap', '\$', 60)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *.pickle *.png', '\$', 5)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png log/*/*.log log/*/*.pcap', '\$', 15)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML):
|
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML):
|
||||||
@@ -792,26 +796,25 @@ class RANManagement():
|
|||||||
pb_receiving_samples_cnt = 0
|
pb_receiving_samples_cnt = 0
|
||||||
#count "removing UE" msg
|
#count "removing UE" msg
|
||||||
removing_ue = 0
|
removing_ue = 0
|
||||||
|
#count"X2AP-PDU"
|
||||||
|
x2ap_pdu = 0
|
||||||
#NSA specific log markers
|
#NSA specific log markers
|
||||||
nsa_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': []}
|
nsa_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': []}
|
||||||
|
nodeB_prefix_found = False
|
||||||
|
|
||||||
#the datalog config file has to be loaded
|
|
||||||
datalog_rt_stats_file='datalog_rt_stats.yaml'
|
|
||||||
if (os.path.isfile(datalog_rt_stats_file)):
|
|
||||||
yaml_file=datalog_rt_stats_file
|
|
||||||
elif (os.path.isfile('ci-scripts/'+datalog_rt_stats_file)):
|
|
||||||
yaml_file='ci-scripts/'+datalog_rt_stats_file
|
|
||||||
else:
|
|
||||||
logging.error("Datalog RT stats yaml file cannot be found")
|
|
||||||
sys.exit("Datalog RT stats yaml file cannot be found")
|
|
||||||
|
|
||||||
with open(yaml_file,'r') as f:
|
|
||||||
datalog_rt_stats = yaml.load(f,Loader=yaml.FullLoader)
|
|
||||||
rt_keys = datalog_rt_stats['Ref'] #we use the keys from the Ref field
|
|
||||||
|
|
||||||
line_cnt=0 #log file line counter
|
line_cnt=0 #log file line counter
|
||||||
for line in enb_log_file.readlines():
|
for line in enb_log_file.readlines():
|
||||||
line_cnt+=1
|
line_cnt+=1
|
||||||
|
# Detection of eNB/gNB from a container log
|
||||||
|
result = re.search('Starting eNB soft modem', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nodeB_prefix_found = True
|
||||||
|
nodeB_prefix = 'e'
|
||||||
|
result = re.search('Starting gNB soft modem', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nodeB_prefix_found = True
|
||||||
|
nodeB_prefix = 'g'
|
||||||
|
result = re.search('Run time:' ,str(line))
|
||||||
# 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:
|
||||||
@@ -962,7 +965,7 @@ class RANManagement():
|
|||||||
if result is not None:
|
if result is not None:
|
||||||
mbmsRequestMsg += 1
|
mbmsRequestMsg += 1
|
||||||
#FR1 NSA test : add new markers to make sure gNB is used
|
#FR1 NSA test : add new markers to make sure gNB is used
|
||||||
result = re.search('\[gNB [0-9]+\]\[RAPROC\] PUSCH with TC_RNTI [0-9a-fA-F]+ received correctly, adding UE MAC Context UE_id [0-9]+\/RNTI [0-9a-fA-F]+', str(line))
|
result = re.search('\[gNB [0-9]+\]\[RAPROC\] PUSCH with TC_RNTI 0x[0-9a-fA-F]+ received correctly, adding UE MAC Context UE_id [0-9]+\/RNTI 0x[0-9a-fA-F]+', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
NSA_RAPROC_PUSCH_check = 1
|
NSA_RAPROC_PUSCH_check = 1
|
||||||
#dlsch and ulsch statistics
|
#dlsch and ulsch statistics
|
||||||
@@ -975,15 +978,7 @@ class RANManagement():
|
|||||||
if result is not None:
|
if result is not None:
|
||||||
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
||||||
dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
||||||
#real time statistics for gNB
|
|
||||||
for k in rt_keys:
|
|
||||||
result = re.search(k, line)
|
|
||||||
if result is not None:
|
|
||||||
#remove 1- all useless char before relevant info 2- trailing char
|
|
||||||
line=line.replace('[0m','')
|
|
||||||
tmp=re.match(rf'^.*?(\b{k}\b.*)',line.rstrip()) #from python 3.6 we can use literal string interpolation for the variable k, using rf' in the regex
|
|
||||||
if tmp!=None: #with ULULULUULULULLLL at the head of the line, we skip it
|
|
||||||
real_time_stats[k]=tmp.group(1)
|
|
||||||
|
|
||||||
#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))
|
||||||
@@ -993,7 +988,10 @@ class RANManagement():
|
|||||||
result = re.search('\[MAC\]\s+Removing UE', str(line))
|
result = re.search('\[MAC\]\s+Removing UE', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
removing_ue += 1
|
removing_ue += 1
|
||||||
|
#count "X2AP-PDU"
|
||||||
|
result = re.search('X2AP-PDU', str(line))
|
||||||
|
if result is not None:
|
||||||
|
x2ap_pdu += 1
|
||||||
#nsa markers logging
|
#nsa markers logging
|
||||||
for k in nsa_markers:
|
for k in nsa_markers:
|
||||||
result = re.search(k, line)
|
result = re.search(k, line)
|
||||||
@@ -1001,11 +999,60 @@ class RANManagement():
|
|||||||
nsa_markers[k].append(line_cnt)
|
nsa_markers[k].append(line_cnt)
|
||||||
|
|
||||||
enb_log_file.close()
|
enb_log_file.close()
|
||||||
logging.debug(' File analysis completed')
|
|
||||||
if (self.air_interface[self.eNB_instance] == 'lte-softmodem') or (self.air_interface[self.eNB_instance] == 'ocp-enb'):
|
|
||||||
nodeB_prefix = 'e'
|
#the following part takes the *_stats.log files as source (not the stdout log file)
|
||||||
|
|
||||||
|
#the datalog config file has to be loaded
|
||||||
|
datalog_rt_stats_file='datalog_rt_stats.yaml'
|
||||||
|
if (os.path.isfile(datalog_rt_stats_file)):
|
||||||
|
yaml_file=datalog_rt_stats_file
|
||||||
|
elif (os.path.isfile('ci-scripts/'+datalog_rt_stats_file)):
|
||||||
|
yaml_file='ci-scripts/'+datalog_rt_stats_file
|
||||||
else:
|
else:
|
||||||
nodeB_prefix = 'g'
|
logging.error("Datalog RT stats yaml file cannot be found")
|
||||||
|
sys.exit("Datalog RT stats yaml file cannot be found")
|
||||||
|
|
||||||
|
with open(yaml_file,'r') as f:
|
||||||
|
datalog_rt_stats = yaml.load(f,Loader=yaml.FullLoader)
|
||||||
|
rt_keys = datalog_rt_stats['Ref'] #we use the keys from the Ref field
|
||||||
|
|
||||||
|
if (os.path.isfile('./nrL1_stats.log')) and (os.path.isfile('./nrL1_stats.log')):
|
||||||
|
stat_files_present=True
|
||||||
|
else:
|
||||||
|
stat_files_present=False
|
||||||
|
logging.debug("NR Stats files for RT analysis not found")
|
||||||
|
if stat_files_present:
|
||||||
|
nrL1_stats = open('./nrL1_stats.log', 'r')
|
||||||
|
nrMAC_stats = open('./nrMAC_stats.log', 'r')
|
||||||
|
for line in nrL1_stats.readlines():
|
||||||
|
for k in rt_keys:
|
||||||
|
result = re.search(k, line)
|
||||||
|
if result is not None:
|
||||||
|
#remove 1- all useless char before relevant info 2- trailing char
|
||||||
|
tmp=re.match(rf'^.*?(\b{k}\b.*)',line.rstrip()) #from python 3.6 we can use literal string interpolation for the variable k, using rf' in the regex
|
||||||
|
if tmp!=None:
|
||||||
|
real_time_stats[k]=tmp.group(1)
|
||||||
|
for line in nrMAC_stats.readlines():
|
||||||
|
for k in rt_keys:
|
||||||
|
result = re.search(k, line)
|
||||||
|
if result is not None:
|
||||||
|
#remove 1- all useless char before relevant info 2- trailing char
|
||||||
|
tmp=re.match(rf'^.*?(\b{k}\b.*)',line.rstrip()) #from python 3.6 we can use literal string interpolation for the variable k, using rf' in the regex
|
||||||
|
if tmp!=None:
|
||||||
|
real_time_stats[k]=tmp.group(1)
|
||||||
|
nrL1_stats.close()
|
||||||
|
nrMAC_stats.close()
|
||||||
|
|
||||||
|
#stdout log file and stat log files analysis completed
|
||||||
|
logging.debug(' File analysis (stdout, stats) completed')
|
||||||
|
|
||||||
|
#post processing depending on the node type
|
||||||
|
if not nodeB_prefix_found:
|
||||||
|
if (self.air_interface[self.eNB_instance] == 'lte-softmodem') or (self.air_interface[self.eNB_instance] == 'ocp-enb'):
|
||||||
|
nodeB_prefix = 'e'
|
||||||
|
else:
|
||||||
|
nodeB_prefix = 'g'
|
||||||
|
|
||||||
if nodeB_prefix == 'g':
|
if nodeB_prefix == 'g':
|
||||||
if ulschReceiveOK > 0:
|
if ulschReceiveOK > 0:
|
||||||
@@ -1087,6 +1134,11 @@ class RANManagement():
|
|||||||
htmlMsg = statMsg+'\n'
|
htmlMsg = statMsg+'\n'
|
||||||
logging.debug(statMsg)
|
logging.debug(statMsg)
|
||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
#X2AP-PDU log
|
||||||
|
statMsg = 'X2AP-PDU msg count = '+str(x2ap_pdu)
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
#nsa markers
|
#nsa markers
|
||||||
statMsg = 'logfile line count = ' + str(line_cnt)
|
statMsg = 'logfile line count = ' + str(line_cnt)
|
||||||
htmlMsg = statMsg+'\n'
|
htmlMsg = statMsg+'\n'
|
||||||
|
|||||||
@@ -0,0 +1,401 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
# Merge Requests Dashboard for RAN on googleSheet
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#Author Remi
|
||||||
|
import boto3
|
||||||
|
import shlex
|
||||||
|
import subprocess
|
||||||
|
import json #json structures
|
||||||
|
import datetime #now() and date formating
|
||||||
|
from datetime import datetime
|
||||||
|
import re
|
||||||
|
import gitlab
|
||||||
|
import yaml
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
from sqlconnect import SQLConnect
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Class Declaration
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
class Dashboard:
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
|
||||||
|
#init with data sources : git, yaml config file, test results databases
|
||||||
|
print("Collecting Data")
|
||||||
|
cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
|
||||||
|
self.git = self.__getGitData(cmd) #git data from Gitlab
|
||||||
|
self.tests = self.__loadCfg('ran_dashboard_cfg.yaml') #tests table setup from yaml
|
||||||
|
self.db = self.__loadFromDB() #test results from database
|
||||||
|
|
||||||
|
|
||||||
|
def __loadCfg(self,yaml_file):
|
||||||
|
with open(yaml_file,'r') as f:
|
||||||
|
tests = yaml.load(f)
|
||||||
|
return tests
|
||||||
|
|
||||||
|
def __getGitData(self,cmd):
|
||||||
|
#cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
|
||||||
|
process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
||||||
|
output = process.stdout.readline()
|
||||||
|
tmp=output.decode("utf-8")
|
||||||
|
d = json.loads(tmp)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def __loadFromDB(self):
|
||||||
|
mr_list=[]
|
||||||
|
for x in range(len(self.git)):
|
||||||
|
mr_list.append(str(self.git[x]['iid']))
|
||||||
|
mydb=SQLConnect()
|
||||||
|
for MR in mr_list:
|
||||||
|
mydb.get(MR)
|
||||||
|
mydb.close_connection()
|
||||||
|
return mydb.data
|
||||||
|
|
||||||
|
def Test_initHTML(self, date):
|
||||||
|
self.f_html.write('<!DOCTYPE html>\n')
|
||||||
|
self.f_html.write('<head>\n')
|
||||||
|
self.f_html.write('<link rel="stylesheet" href="test_styles.css">\n')
|
||||||
|
self.f_html.write('<title>Test Dashboard</title>\n')
|
||||||
|
self.f_html.write('</head>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
self.f_html.write('<table>\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td class="Main">OAI RAN TEST Status Dashboard</td>\n')
|
||||||
|
self.f_html.write('</td>\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td class="DashLink"> <a href="https://oairandashboard.s3.eu-west-1.amazonaws.com/index.html">Merge Requests Dashboard</a></td>\n')
|
||||||
|
self.f_html.write('</td>\n')
|
||||||
|
self.f_html.write('<tr></tr>\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td class="Date">Update : '+date+'</td>\n')
|
||||||
|
self.f_html.write('</td>\n')
|
||||||
|
self.f_html.write('</tr>\n')
|
||||||
|
self.f_html.write('</table>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
|
||||||
|
def Test_terminateHTML(self):
|
||||||
|
self.f_html.write('</body>\n')
|
||||||
|
self.f_html.write('</html>\n')
|
||||||
|
self.f_html.close()
|
||||||
|
|
||||||
|
|
||||||
|
def MR_initHTML(self,date):
|
||||||
|
self.f_html.write('<!DOCTYPE html>\n')
|
||||||
|
self.f_html.write('<head>\n')
|
||||||
|
self.f_html.write('<link rel="stylesheet" href="mr_styles.css">\n')
|
||||||
|
self.f_html.write('<title>MR Dashboard</title>\n')
|
||||||
|
self.f_html.write('</head>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
self.f_html.write('<table>\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td class="Main">OAI RAN MR Status Dashboard</td>\n')
|
||||||
|
self.f_html.write('</td>\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td class="DashLink"> <a href="https://oaitestdashboard.s3.eu-west-1.amazonaws.com/index.html">Tests Dashboard</a></td>\n')
|
||||||
|
self.f_html.write('</td>\n')
|
||||||
|
self.f_html.write('<tr></tr>\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td class="Date">Update : '+date+'</td>\n')
|
||||||
|
self.f_html.write('</td>\n')
|
||||||
|
self.f_html.write('</tr>\n')
|
||||||
|
self.f_html.write('</table>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
self.f_html.write('<br>\n')
|
||||||
|
self.f_html.write('<table class="MR_Table">\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<th class="MR">MR</th>\n')
|
||||||
|
self.f_html.write('<th class="CREATED_AT">Created_At</th>\n')
|
||||||
|
self.f_html.write('<th class="AUTHOR">Author</th>\n')
|
||||||
|
self.f_html.write('<th class="TITLE">Title</th>\n')
|
||||||
|
self.f_html.write('<th class="ASSIGNEE">Assignee</th>\n')
|
||||||
|
self.f_html.write('<th class="REVIEWER">Reviewer</th>\n')
|
||||||
|
self.f_html.write('<th class="CAN_START">CAN START</th>\n')
|
||||||
|
self.f_html.write('<th class="IN_PROGRESS">IN PROGRESS</th>\n')
|
||||||
|
self.f_html.write('<th class="COMPLETED">COMPLETED</th>\n')
|
||||||
|
self.f_html.write('<th class="REVIEW_FORM">Review Form</th>\n')
|
||||||
|
self.f_html.write('<th class="OK_MERGE">OK Merge</th>\n')
|
||||||
|
self.f_html.write('<th class="MERGE_CONFLICTS">Merge Conflicts</th>\n')
|
||||||
|
self.f_html.write('</tr>\n')
|
||||||
|
|
||||||
|
def MR_terminateHTML(self):
|
||||||
|
self.f_html.write('</table> \n')
|
||||||
|
self.f_html.write('</body>\n')
|
||||||
|
self.f_html.write('</html>\n')
|
||||||
|
self.f_html.close()
|
||||||
|
|
||||||
|
|
||||||
|
def MR_rowHTML(self,row):
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td><a href=\"'+row[0]+'\">'+row[1]+'</a></td>\n')
|
||||||
|
self.f_html.write('<td>'+row[2]+'</td>\n')
|
||||||
|
self.f_html.write('<td>'+row[3]+'</td>\n')
|
||||||
|
self.f_html.write('<td class="title_cell">'+row[4]+'</td>\n')
|
||||||
|
self.f_html.write('<td>'+row[5]+'</td>\n')
|
||||||
|
self.f_html.write('<td>'+row[6]+'</td>\n')
|
||||||
|
if row[7]=='X':
|
||||||
|
self.f_html.write('<td style="background-color: orange;">'+row[7]+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
if row[8]=='X':
|
||||||
|
self.f_html.write('<td style="background-color: yellow;">'+row[8]+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
if row[9]=='X':
|
||||||
|
self.f_html.write('<td style="background-color: rgb(144, 221, 231);">'+row[9]+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
if row[10]=='X':
|
||||||
|
self.f_html.write('<td style="background-color: rgb(58, 236, 58);">'+row[10]+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
if row[11]=='X':
|
||||||
|
self.f_html.write('<td style="background-color: rgb(58, 236, 58);">'+row[11]+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
if row[12]=='YES':
|
||||||
|
self.f_html.write('<td style="background-color: red;">'+row[12]+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
self.f_html.write('</tr>\n')
|
||||||
|
|
||||||
|
|
||||||
|
def Build(self, type, htmlfilename):
|
||||||
|
if type=='MR':
|
||||||
|
self.Build_MR_Table(htmlfilename)
|
||||||
|
elif type=='Tests':
|
||||||
|
self.Build_Test_Table(htmlfilename)
|
||||||
|
else :
|
||||||
|
print("Undefined Dashboard Type, options : MR or Tests")
|
||||||
|
|
||||||
|
|
||||||
|
def Build_Test_Table(self,htmlfilename):
|
||||||
|
print("Building Tests Dashboard...")
|
||||||
|
|
||||||
|
self.f_html=open(htmlfilename,'w')
|
||||||
|
|
||||||
|
###update date/time, format dd/mm/YY H:M:S
|
||||||
|
now = datetime.now()
|
||||||
|
dt_string = now.strftime("%d/%m/%Y %H:%M")
|
||||||
|
#HTML table header
|
||||||
|
self.Test_initHTML(dt_string)
|
||||||
|
|
||||||
|
|
||||||
|
#1 table per MR if test results exist
|
||||||
|
for x in range(len(self.git)):
|
||||||
|
mr=str(self.git[x]['iid'])
|
||||||
|
if 'PASS' not in self.db[mr]:
|
||||||
|
self.f_html.write('<h3><a href="https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/'+mr+'">'+mr+'</a>'+' '+self.git[x]['title'] + '</h3>\n')
|
||||||
|
self.f_html.write('<table class="Test_Table">\n')
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<th class="Test_Name">Test Name</th>\n')
|
||||||
|
self.f_html.write('<th class="Test_Descr">Bench</th> \n')
|
||||||
|
self.f_html.write('<th class="Test_Descr">Test</th> \n')
|
||||||
|
self.f_html.write('<th class="Pass"># Pass</th>\n')
|
||||||
|
self.f_html.write('<th class="Fail"># Fail</th>\n')
|
||||||
|
self.f_html.write('<th class="Last_Pass">Last Pass</th>\n')
|
||||||
|
self.f_html.write('<th class="Last_Fail">Last Fail</th>\n')
|
||||||
|
self.f_html.write('</tr>\n')
|
||||||
|
|
||||||
|
#parsing the tests
|
||||||
|
for t in self.tests:
|
||||||
|
|
||||||
|
row=[]
|
||||||
|
short_name= t
|
||||||
|
hyperlink= self.tests[t]['link']
|
||||||
|
job=self.tests[t]['job']
|
||||||
|
|
||||||
|
|
||||||
|
if job in self.db[mr]:
|
||||||
|
if 'PASS' in self.db[mr][job]:
|
||||||
|
row.append(self.db[mr][job]['PASS'])
|
||||||
|
else:
|
||||||
|
row.append('')
|
||||||
|
if 'FAIL' in self.db[mr][job]:
|
||||||
|
row.append(self.db[mr][job]['FAIL'])
|
||||||
|
else:
|
||||||
|
row.append('')
|
||||||
|
#2 columns for last_pass and last_fail links
|
||||||
|
if 'last_pass' in self.db[mr][job]:
|
||||||
|
lastpasshyperlink= self.db[mr][job]['last_pass'][1]
|
||||||
|
lastpasstext= self.db[mr][job]['last_pass'][0]
|
||||||
|
else:
|
||||||
|
lastpasshyperlink=''
|
||||||
|
lastpasstext=''
|
||||||
|
|
||||||
|
if 'last_fail' in self.db[mr][job]:
|
||||||
|
lastfailhyperlink= self.db[mr][job]['last_fail'][1]
|
||||||
|
lastfailtext= self.db[mr][job]['last_fail'][0]
|
||||||
|
else:
|
||||||
|
lastfailhyperlink=''
|
||||||
|
lastfailtext=''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
self.f_html.write('<tr>\n')
|
||||||
|
self.f_html.write('<td><a href='+hyperlink+'>'+short_name+'</a></td>\n')
|
||||||
|
self.f_html.write('<td>'+self.tests[t]['bench']+'</td>\n')
|
||||||
|
self.f_html.write('<td>'+self.tests[t]['test']+'</td>\n')
|
||||||
|
if row[0]!='':
|
||||||
|
self.f_html.write('<td style="background-color: rgb(58, 236, 58);">'+str(row[0])+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
if row[1]!='':
|
||||||
|
self.f_html.write('<td style="background-color: red;">'+str(row[1])+'</td>\n')
|
||||||
|
else:
|
||||||
|
self.f_html.write('<td></td>\n')
|
||||||
|
self.f_html.write('<td><a href='+lastpasshyperlink+'>'+lastpasstext+'</a></td>\n')
|
||||||
|
self.f_html.write('<td><a href='+lastfailhyperlink+'>'+lastfailtext+'</a></td>\n')
|
||||||
|
self.f_html.write('</tr>\n')
|
||||||
|
|
||||||
|
self.f_html.write('</table>\n')
|
||||||
|
|
||||||
|
#terminate HTML table and close file
|
||||||
|
self.Test_terminateHTML()
|
||||||
|
|
||||||
|
|
||||||
|
def Build_MR_Table(self,htmlfilename):
|
||||||
|
|
||||||
|
print("Building Merge Requests Dashboard...")
|
||||||
|
|
||||||
|
self.f_html=open(htmlfilename,'w')
|
||||||
|
|
||||||
|
###update date/time, format dd/mm/YY H:M:S
|
||||||
|
now = datetime.now()
|
||||||
|
dt_string = now.strftime("%d/%m/%Y %H:%M")
|
||||||
|
|
||||||
|
#HTML table header
|
||||||
|
self.MR_initHTML(dt_string)
|
||||||
|
|
||||||
|
|
||||||
|
###MR data lines
|
||||||
|
for x in range(len(self.git)):
|
||||||
|
|
||||||
|
|
||||||
|
hyperlink= 'https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/'+ str(self.git[x]['iid'])
|
||||||
|
text= str(self.git[x]['iid'])
|
||||||
|
|
||||||
|
|
||||||
|
date_time_str = self.git[x]['created_at']
|
||||||
|
date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||||||
|
|
||||||
|
milestone1=milestone2=milestone3=milestone4=""
|
||||||
|
if self.git[x]['milestone']!=None:
|
||||||
|
if self.git[x]['milestone']['title']=="REVIEW_CAN_START":
|
||||||
|
milestone1="X"
|
||||||
|
elif self.git[x]['milestone']['title']=="REVIEW_IN_PROGRESS":
|
||||||
|
milestone2="X"
|
||||||
|
elif self.git[x]['milestone']['title']=="REVIEW_COMPLETED_AND_APPROVED":
|
||||||
|
milestone3="X"
|
||||||
|
elif self.git[x]['milestone']['title']=="OK_TO_BE_MERGED":
|
||||||
|
milestone4="X"
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
#check if empty or not
|
||||||
|
if self.git[x]['assignee']!=None:
|
||||||
|
assignee = str(self.git[x]['assignee']['name'])
|
||||||
|
else:
|
||||||
|
assignee = ""
|
||||||
|
|
||||||
|
#check if empty or not
|
||||||
|
if len(self.git[x]['reviewers'])!=0:
|
||||||
|
reviewer = str(self.git[x]['reviewers'][0]['name'])
|
||||||
|
else:
|
||||||
|
reviewer = ""
|
||||||
|
|
||||||
|
if self.git[x]['has_conflicts']==True:
|
||||||
|
conflicts = "YES"
|
||||||
|
else:
|
||||||
|
conflicts = ""
|
||||||
|
|
||||||
|
|
||||||
|
#add a column flagging that the review form is present
|
||||||
|
#we use gitlab API to parse the MR notes
|
||||||
|
gl = gitlab.Gitlab.from_config('OAI')
|
||||||
|
project_id = 223
|
||||||
|
project = gl.projects.get(project_id)
|
||||||
|
#get the opened MR in the project
|
||||||
|
mrs = project.mergerequests.list(state='opened',per_page=100)
|
||||||
|
review_form=''
|
||||||
|
for m in range (0,len(mrs)):
|
||||||
|
if mrs[m].iid==self.git[x]['iid']:#check the iid is the one we are on
|
||||||
|
mr_notes = mrs[m].notes.list(all=True)
|
||||||
|
n=0
|
||||||
|
found=False
|
||||||
|
while found==False and n<len(mr_notes):
|
||||||
|
res=re.search('Code Review by',mr_notes[n].body)#this is the marker we are looking for in all notes
|
||||||
|
if res!=None:
|
||||||
|
review_form = "X"
|
||||||
|
found=True
|
||||||
|
n+=1
|
||||||
|
|
||||||
|
#build final row to be inserted
|
||||||
|
row =[hyperlink, text, str(date_time_obj.date()),str(self.git[x]['author']['name']), str(self.git[x]['title']),\
|
||||||
|
assignee, reviewer,\
|
||||||
|
milestone1,milestone2,milestone3,review_form,milestone4,conflicts]
|
||||||
|
|
||||||
|
self.MR_rowHTML(row)
|
||||||
|
|
||||||
|
#terminate HTML table and close file
|
||||||
|
self.MR_terminateHTML()
|
||||||
|
|
||||||
|
def CopyToS3(self,htmlfilename,bucket,key):
|
||||||
|
print("Uploading to S3 bucket")
|
||||||
|
#Creating Session With Boto3.
|
||||||
|
s3 = boto3.client('s3')
|
||||||
|
|
||||||
|
#Creating S3 Resource From the Session.
|
||||||
|
result = s3.upload_file(htmlfilename, bucket,key, ExtraArgs={'ACL':'public-read','ContentType': 'text/html'})
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
htmlDash=Dashboard()
|
||||||
|
htmlDash.Build('MR','/tmp/MR_index.html')
|
||||||
|
htmlDash.CopyToS3('/tmp/MR_index.html','oairandashboard','index.html')
|
||||||
|
htmlDash.Build('Tests','/tmp/Tests_index.html')
|
||||||
|
htmlDash.CopyToS3('/tmp/Tests_index.html','oaitestdashboard','index.html')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# execute only if run as a script
|
||||||
|
main()
|
||||||
Executable
+136
@@ -0,0 +1,136 @@
|
|||||||
|
body {
|
||||||
|
font-family: 'lato', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.Main {
|
||||||
|
text-align:left;
|
||||||
|
font-size: 30px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.DashLink {
|
||||||
|
text-align:left;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.DashLink:hover {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Date {
|
||||||
|
text-align:left;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
a { text-decoration: none; }
|
||||||
|
a:visited { text-decoration: none; color:blue}
|
||||||
|
a:hover { text-decoration: none; font-weight: bold; color:blue}
|
||||||
|
|
||||||
|
|
||||||
|
.MR_Table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
.MR_Table tr {
|
||||||
|
font-size: 12px;
|
||||||
|
text-align:center;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.MR_Table tr:hover {
|
||||||
|
background-color:lightgray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.MR_Table td {
|
||||||
|
border: 1px solid black;
|
||||||
|
padding : 5px;
|
||||||
|
}
|
||||||
|
.MR_Table td:hover {
|
||||||
|
font-weight : bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.MR_Table th {
|
||||||
|
font-size: 14px;
|
||||||
|
text-align:center;
|
||||||
|
padding : 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.title_cell {
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.MR {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 50px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.CREATED_AT {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.AUTHOR {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 150px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.TITLE {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 500px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ASSIGNEE {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 150px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.REVIEWER {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 150px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.CAN_START {
|
||||||
|
background-color: orange;
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
.IN_PROGRESS {
|
||||||
|
background-color: yellow;
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
.COMPLETED {
|
||||||
|
background-color: rgb(144, 221, 231);
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.REVIEW_FORM {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.OK_MERGE {
|
||||||
|
background-color: rgb(58, 236, 58);
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.MERGE_CONFLICTS {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -30,6 +30,8 @@
|
|||||||
# Import
|
# Import
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
#author Remi
|
||||||
|
|
||||||
#import google spreadsheet API
|
#import google spreadsheet API
|
||||||
import gspread
|
import gspread
|
||||||
from oauth2client.service_account import ServiceAccountCredentials
|
from oauth2client.service_account import ServiceAccountCredentials
|
||||||
@@ -42,6 +44,13 @@ import datetime #now() and date formating
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import re
|
import re
|
||||||
import gitlab
|
import gitlab
|
||||||
|
import yaml
|
||||||
|
import os
|
||||||
|
import pickle
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
from sqlconnect import SQLConnect
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Class Declaration
|
# Class Declaration
|
||||||
@@ -57,48 +66,78 @@ class gDashboard:
|
|||||||
#worksheet
|
#worksheet
|
||||||
self.sheet = self.ss.worksheet(worksheet)
|
self.sheet = self.ss.worksheet(worksheet)
|
||||||
self.ss.del_worksheet(self.sheet) #start by deleting the old sheet
|
self.ss.del_worksheet(self.sheet) #start by deleting the old sheet
|
||||||
self.sheet = self.ss.add_worksheet(title=worksheet, rows="100", cols="20") #create a new one
|
self.sheet = self.ss.add_worksheet(title=worksheet, rows="100", cols="30") #create a new one
|
||||||
|
|
||||||
self.d = {} #data dictionary
|
#init with data sources : git, yaml config file, test results databases
|
||||||
|
cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
|
||||||
|
self.git = self.__getGitData(cmd) #git data from Gitlab
|
||||||
|
self.tests = self.__loadCfg('ran_dashboard_cfg.yaml') #tests table setup from yaml
|
||||||
|
self.db = self.__loadFromDB() #test results from database
|
||||||
|
|
||||||
|
|
||||||
def fetchData(self,cmd):
|
def __loadCfg(self,yaml_file):
|
||||||
|
with open(yaml_file,'r') as f:
|
||||||
|
tests = yaml.load(f)
|
||||||
|
return tests
|
||||||
|
|
||||||
|
def __getGitData(self,cmd):
|
||||||
#cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
|
#cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
|
||||||
process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
||||||
output = process.stdout.readline()
|
output = process.stdout.readline()
|
||||||
tmp=output.decode("utf-8")
|
tmp=output.decode("utf-8")
|
||||||
self.d = json.loads(tmp)
|
d = json.loads(tmp)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def __loadFromDB(self):
|
||||||
|
mr_list=[]
|
||||||
|
for x in range(len(self.git)):
|
||||||
|
mr_list.append(str(self.git[x]['iid']))
|
||||||
|
mydb=SQLConnect()
|
||||||
|
for MR in mr_list:
|
||||||
|
mydb.get(MR)
|
||||||
|
mydb.close_connection()
|
||||||
|
return mydb.data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def gBuild(self, destinationSheetName):
|
def gBuild(self, destinationSheetName):
|
||||||
|
|
||||||
#line 1 : update date/time, format dd/mm/YY H:M:S
|
###line 1 : update date/time, format dd/mm/YY H:M:S
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
dt_string = "Update : " + now.strftime("%d/%m/%Y %H:%M")
|
dt_string = "Update : " + now.strftime("%d/%m/%Y %H:%M")
|
||||||
row =[dt_string]
|
row =[dt_string]
|
||||||
self.sheet.insert_row(row, index=1, value_input_option='RAW')
|
self.sheet.insert_row(row, index=1, value_input_option='RAW')
|
||||||
|
|
||||||
#line 2 empty
|
###line 2 is for the test short names (links to jenkins pipeline), updated at the end
|
||||||
#line 3 is for the column names
|
|
||||||
|
###line 3 is for the column names
|
||||||
i=3
|
i=3
|
||||||
row =["MR","Created_at","Author","Title","Assignee", "Reviewer", "CAN START","IN PROGRESS","COMPLETED","Review Form","OK MERGE","Merge conflicts"]
|
row =["MR","Created_at","Author","Title","Assignee", "Reviewer", "CAN START","IN PROGRESS","COMPLETED","Review Form","OK MERGE","Merge conflicts",""]
|
||||||
|
|
||||||
|
#tests
|
||||||
|
for t in range(0,len(self.tests)):
|
||||||
|
row.append("# PASS")
|
||||||
|
row.append("# FAIL")
|
||||||
|
row.append("Last Pass")
|
||||||
|
row.append("Last Fail")
|
||||||
|
|
||||||
self.sheet.insert_row(row, index=i, value_input_option='RAW')
|
self.sheet.insert_row(row, index=i, value_input_option='RAW')
|
||||||
|
|
||||||
#line 4 onward, MR data lines
|
###line 4 onward, MR data lines
|
||||||
for x in range(len(self.d)):
|
for x in range(len(self.git)):
|
||||||
i=i+1
|
i=i+1
|
||||||
date_time_str = self.d[x]['created_at']
|
date_time_str = self.git[x]['created_at']
|
||||||
date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%dT%H:%M:%S.%fZ')
|
date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||||||
|
|
||||||
milestone1=milestone2=milestone3=milestone4=""
|
milestone1=milestone2=milestone3=milestone4=""
|
||||||
if self.d[x]['milestone']!=None:
|
if self.git[x]['milestone']!=None:
|
||||||
if self.d[x]['milestone']['title']=="REVIEW_CAN_START":
|
if self.git[x]['milestone']['title']=="REVIEW_CAN_START":
|
||||||
milestone1="X"
|
milestone1="X"
|
||||||
elif self.d[x]['milestone']['title']=="REVIEW_IN_PROGRESS":
|
elif self.git[x]['milestone']['title']=="REVIEW_IN_PROGRESS":
|
||||||
milestone2="X"
|
milestone2="X"
|
||||||
elif self.d[x]['milestone']['title']=="REVIEW_COMPLETED_AND_APPROVED":
|
elif self.git[x]['milestone']['title']=="REVIEW_COMPLETED_AND_APPROVED":
|
||||||
milestone3="X"
|
milestone3="X"
|
||||||
elif self.d[x]['milestone']['title']=="OK_TO_BE_MERGED":
|
elif self.git[x]['milestone']['title']=="OK_TO_BE_MERGED":
|
||||||
milestone4="X"
|
milestone4="X"
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
@@ -106,18 +145,18 @@ class gDashboard:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
#check if empty or not
|
#check if empty or not
|
||||||
if self.d[x]['assignee']!=None:
|
if self.git[x]['assignee']!=None:
|
||||||
assignee = str(self.d[x]['assignee']['name'])
|
assignee = str(self.git[x]['assignee']['name'])
|
||||||
else:
|
else:
|
||||||
assignee = ""
|
assignee = ""
|
||||||
|
|
||||||
#check if empty or not
|
#check if empty or not
|
||||||
if len(self.d[x]['reviewers'])!=0:
|
if len(self.git[x]['reviewers'])!=0:
|
||||||
reviewer = str(self.d[x]['reviewers'][0]['name'])
|
reviewer = str(self.git[x]['reviewers'][0]['name'])
|
||||||
else:
|
else:
|
||||||
reviewer = ""
|
reviewer = ""
|
||||||
|
|
||||||
if self.d[x]['has_conflicts']==True:
|
if self.git[x]['has_conflicts']==True:
|
||||||
conflicts = "YES"
|
conflicts = "YES"
|
||||||
else:
|
else:
|
||||||
conflicts = ""
|
conflicts = ""
|
||||||
@@ -129,13 +168,13 @@ class gDashboard:
|
|||||||
project_id = 223
|
project_id = 223
|
||||||
project = gl.projects.get(project_id)
|
project = gl.projects.get(project_id)
|
||||||
#get the opened MR in the project
|
#get the opened MR in the project
|
||||||
mrs = project.mergerequests.list(state='opened')
|
mrs = project.mergerequests.list(state='opened',per_page=100)
|
||||||
|
review_form=''
|
||||||
for m in range (0,len(mrs)):
|
for m in range (0,len(mrs)):
|
||||||
if mrs[m].iid==self.d[x]['iid']:#check the iid is the one we are on
|
if mrs[m].iid==self.git[x]['iid']:#check the iid is the one we are on
|
||||||
mr_notes = mrs[m].notes.list(all=True)
|
mr_notes = mrs[m].notes.list(all=True)
|
||||||
n=0
|
n=0
|
||||||
found=False
|
found=False
|
||||||
review_form=""
|
|
||||||
while found==False and n<len(mr_notes):
|
while found==False and n<len(mr_notes):
|
||||||
res=re.search('Code Review by',mr_notes[n].body)#this is the marker we are looking for in all notes
|
res=re.search('Code Review by',mr_notes[n].body)#this is the marker we are looking for in all notes
|
||||||
if res!=None:
|
if res!=None:
|
||||||
@@ -143,29 +182,81 @@ class gDashboard:
|
|||||||
found=True
|
found=True
|
||||||
n+=1
|
n+=1
|
||||||
|
|
||||||
|
|
||||||
#build final row to be inserted, the first column is left empty for now, will be filled afterward with hyperlinks to gitlab MR
|
#build final row to be inserted, the first column is left empty for now, will be filled afterward with hyperlinks to gitlab MR
|
||||||
row =["", str(date_time_obj.date()),str(self.d[x]['author']['name']),str(self.d[x]['title']),\
|
row =["", str(date_time_obj.date()),str(self.git[x]['author']['name']), str(self.git[x]['title']),\
|
||||||
assignee, reviewer,\
|
assignee, reviewer,\
|
||||||
milestone1,milestone2,milestone3,review_form,milestone4,conflicts]
|
milestone1,milestone2,milestone3,review_form,milestone4,conflicts,""]
|
||||||
|
#and append the test results coming from self.db
|
||||||
#insert the row to worksheet
|
mr=str(self.git[x]['iid'])
|
||||||
|
for t in self.tests:
|
||||||
|
if mr in self.db:
|
||||||
|
job=self.tests[t]['job']
|
||||||
|
if job in self.db[mr]:
|
||||||
|
if 'PASS' in self.db[mr][job]:
|
||||||
|
row.append(self.db[mr][job]['PASS'])
|
||||||
|
else:
|
||||||
|
row.append('')
|
||||||
|
if 'FAIL' in self.db[mr][job]:
|
||||||
|
row.append(self.db[mr][job]['FAIL'])
|
||||||
|
else:
|
||||||
|
row.append('')
|
||||||
|
#leave 2 columns for last_pass and last_fail links
|
||||||
|
row.append('')
|
||||||
|
row.append('')
|
||||||
|
else:
|
||||||
|
#4 columns are empty
|
||||||
|
row.append('')
|
||||||
|
row.append('')
|
||||||
|
row.append('')
|
||||||
|
row.append('')
|
||||||
|
|
||||||
|
#insert the final row to worksheet
|
||||||
self.sheet.insert_row(row, index=i, value_input_option='RAW')
|
self.sheet.insert_row(row, index=i, value_input_option='RAW')
|
||||||
|
time.sleep(10)
|
||||||
|
|
||||||
|
|
||||||
#add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas)
|
#add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas)
|
||||||
i=3
|
i=3
|
||||||
requests=[]
|
requests=[]
|
||||||
for x in range(len(self.d)):
|
for x in range(len(self.git)):
|
||||||
rowIndex=i
|
rowIndex=i
|
||||||
colIndex=0
|
colIndex=0
|
||||||
hyperlink= '\"'+"https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/"+ str(self.d[x]['iid']) +'\"'
|
hyperlink= '\"'+"https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/"+ str(self.git[x]['iid']) +'\"'
|
||||||
text= '\"'+str(self.d[x]['iid'])+'"'
|
text= '\"'+str(self.git[x]['iid'])+'"'
|
||||||
requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex))
|
requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex))
|
||||||
i=i+1
|
|
||||||
|
mr=str(self.git[x]['iid'])
|
||||||
|
colIndex=15
|
||||||
|
for t in self.tests:
|
||||||
|
job=self.tests[t]['job']
|
||||||
|
if job in self.db[mr]:
|
||||||
|
if 'last_pass' in self.db[mr][job]:
|
||||||
|
hyperlink= '\"'+ self.db[mr][job]['last_pass'][1] +'\"'
|
||||||
|
text= '\"'+self.db[mr][job]['last_pass'][0]+'"'
|
||||||
|
requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex))
|
||||||
|
if 'last_fail' in self.db[mr][job]:
|
||||||
|
hyperlink= '\"'+ self.db[mr][job]['last_fail'][1] +'\"'
|
||||||
|
text= '\"'+self.db[mr][job]['last_fail'][0]+'"'
|
||||||
|
requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex+1))
|
||||||
|
colIndex+=4 #move to next test
|
||||||
|
i=i+1 #increment row index for next MR
|
||||||
|
|
||||||
body = {"requests": requests}
|
body = {"requests": requests}
|
||||||
self.ss.batch_update(body)
|
self.ss.batch_update(body)
|
||||||
|
|
||||||
|
###line 2 is for the test names
|
||||||
|
#add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas)
|
||||||
|
requests=[]
|
||||||
|
rowIndex=1
|
||||||
|
colIndex=13
|
||||||
|
for t in self.tests :
|
||||||
|
hyperlink= '\"'+self.tests[t]['link']+'\"'
|
||||||
|
short_name= '\"'+ t +'\"'
|
||||||
|
requests.append(self.addHyperlink(hyperlink, short_name, destinationSheetName, rowIndex, colIndex))
|
||||||
|
colIndex+=4
|
||||||
|
|
||||||
|
body = {"requests": requests}
|
||||||
|
self.ss.batch_update(body)
|
||||||
|
|
||||||
|
|
||||||
def addHyperlink(self, hyperlink, text, destinationSheetName, rowIndex, colIndex):
|
def addHyperlink(self, hyperlink, text, destinationSheetName, rowIndex, colIndex):
|
||||||
@@ -207,17 +298,17 @@ class gDashboard:
|
|||||||
"copyPaste": {
|
"copyPaste": {
|
||||||
"source": {
|
"source": {
|
||||||
"sheetId": sourceSheetId,
|
"sheetId": sourceSheetId,
|
||||||
"startRowIndex": 0,
|
"startRowIndex": 1,
|
||||||
"endRowIndex": 40,
|
"endRowIndex": 40,
|
||||||
"startColumnIndex": 0,
|
"startColumnIndex": 0,
|
||||||
"endColumnIndex": 12
|
"endColumnIndex": 30
|
||||||
},
|
},
|
||||||
"destination": {
|
"destination": {
|
||||||
"sheetId": destinationSheetId,
|
"sheetId": destinationSheetId,
|
||||||
"startRowIndex": 0,
|
"startRowIndex": 1,
|
||||||
"endRowIndex": 40,
|
"endRowIndex": 40,
|
||||||
"startColumnIndex": 0,
|
"startColumnIndex": 0,
|
||||||
"endColumnIndex": 12
|
"endColumnIndex": 30
|
||||||
},
|
},
|
||||||
"pasteType": "PASTE_FORMAT"
|
"pasteType": "PASTE_FORMAT"
|
||||||
}
|
}
|
||||||
@@ -280,15 +371,30 @@ class gDashboard:
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
body = {"requests": requests}
|
|
||||||
self.ss.batch_update(body)
|
|
||||||
|
|
||||||
|
#group MR related columns
|
||||||
|
# sheetId = self.ss.worksheet(destinationSheetName)._properties['sheetId']
|
||||||
|
# requests.append(
|
||||||
|
# {
|
||||||
|
# "addDimensionGroup": {
|
||||||
|
# "range": {
|
||||||
|
# "dimension": "COLUMNS",
|
||||||
|
# "sheetId": sheetId,
|
||||||
|
# "startIndex": 3,
|
||||||
|
# "endIndex": 12
|
||||||
|
# },
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
body = {"requests": requests}
|
||||||
|
self.ss.batch_update(body)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
my_gDashboard=gDashboard("/opt/dashboard/g_creds.json", 'OAI RAN Dashboard', 'MR Status')
|
my_gDashboard=gDashboard("/opt/dashboard/g_creds.json", 'OAI RAN Dashboard', 'MR Status')
|
||||||
cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """
|
|
||||||
my_gDashboard.fetchData(cmd)
|
|
||||||
my_gDashboard.gBuild("MR Status")
|
my_gDashboard.gBuild("MR Status")
|
||||||
my_gDashboard.gFormat("Formating" , "MR Status")
|
my_gDashboard.gFormat("Formating" , "MR Status")
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
LTE-2x2 : #short name used in the dashboard
|
||||||
|
job : 'RAN-LTE-2x2-Module-OAIEPC' #job name from Jenkins, used in the database
|
||||||
|
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-LTE-2x2-Module-OAIEPC'
|
||||||
|
bench : 'Obelix-N310-OAIEPC-Quectel(nrmodule2)'
|
||||||
|
test : 'TDD, 40MHz, MCS9, 26Mb DL, 7Mb UL'
|
||||||
|
NSA-B200 :
|
||||||
|
job : 'RAN-NSA-B200-Module-LTEBOX'
|
||||||
|
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-B200-Module-LTEBOX'
|
||||||
|
bench : 'Nepes-B200-Obelix-B200-LTEBOX-Quectel(idefix)'
|
||||||
|
test : '20MHz, 60Mb DL, 3Mb UL'
|
||||||
|
NSA-2x2 :
|
||||||
|
job : 'RAN-NSA-2x2-Module-OAIEPC'
|
||||||
|
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-2x2-Module-OAIEPC'
|
||||||
|
bench : 'Asterix-N310-Obelix-N310-OAIEPC-Quectel(nrmodule2)'
|
||||||
|
test : 'TDD, 40MHz, 60Mb DL, 3Mb UL'
|
||||||
|
SA-N310 :
|
||||||
|
job : 'RAN-SA-Module-CN5G'
|
||||||
|
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G'
|
||||||
|
bench : 'Asterix-N310-OAICN5G-Quectel(nrmodule2)'
|
||||||
|
test : 'TDD, 40MHz, 60Mb DL, 3Mb UL'
|
||||||
|
SA-OAIUE-B200 :
|
||||||
|
job : 'RAN-SA-OAIUE-B200-CN5G'
|
||||||
|
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-OAIUE-B200-CN5G/'
|
||||||
|
bench : 'Asterix-N310-OAICN5G-OAIUE-B200'
|
||||||
|
test : 'TDD, 40MHz, Ping, (to be implemented : iperf)'
|
||||||
|
SA-OAIUE-N310 :
|
||||||
|
job : 'RAN-SA-OAIUE-N310-CN5G'
|
||||||
|
link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-OAIUE-N310-CN5G/'
|
||||||
|
bench : 'Asterix-N310-OAICN5G-OAIUE-N310'
|
||||||
|
test : 'TDD, 40MHz, Ping, (to be implemented : iperf)'
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
The code ran_dashboard.py was initially developped to bring MR status and test resuts to a google sheet, using google sheets API.
|
||||||
|
This method is now deprecated, and replaced by Hdashboard.py that builds the results as HTML page and loads it to AWS S3.
|
||||||
|
ran_dashboard_cfg.yaml is still used by Hdashboard.py as tests config file.
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
# Merge Requests Dashboard for RAN on googleSheet
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#author Remi
|
||||||
|
|
||||||
|
|
||||||
|
import pymysql
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
#This is the script/package used by the dashboard to retrieve the MR test results from the database
|
||||||
|
|
||||||
|
class SQLConnect:
|
||||||
|
def __init__(self):
|
||||||
|
self.connection = pymysql.connect(
|
||||||
|
host='172.22.0.2',
|
||||||
|
user='root',
|
||||||
|
password = 'ucZBc2XRYdvEm59F',
|
||||||
|
db='oaicicd_tests',
|
||||||
|
port=3306
|
||||||
|
)
|
||||||
|
self.data={}
|
||||||
|
|
||||||
|
|
||||||
|
#retrieve data from mysql database and organize it in a dictionary (per MR passed as argument)
|
||||||
|
def get(self,MR):
|
||||||
|
self.data[MR]={}
|
||||||
|
cur=self.connection.cursor()
|
||||||
|
|
||||||
|
#get counters per test
|
||||||
|
sql = "select TEST,STATUS, count(*) AS COUNT from test_results where MR=(%s) group by TEST, STATUS;"
|
||||||
|
cur.execute(sql,MR)
|
||||||
|
response=cur.fetchall()
|
||||||
|
if len(response)==0:#no test results yet
|
||||||
|
self.data[MR]['PASS']=''
|
||||||
|
self.data[MR]['FAIL']=''
|
||||||
|
else:
|
||||||
|
for i in range(0,len(response)):
|
||||||
|
test=response[i][0]
|
||||||
|
status=response[i][1]
|
||||||
|
count=response[i][2]
|
||||||
|
if test in self.data[MR]:
|
||||||
|
self.data[MR][test][status]=count
|
||||||
|
else:
|
||||||
|
self.data[MR][test]={}
|
||||||
|
self.data[MR][test][status]=count
|
||||||
|
|
||||||
|
#get last failing build and link
|
||||||
|
sql = "select TEST,BUILD, BUILD_LINK from test_results where MR=(%s) and STATUS='FAIL' order by DATE DESC;"
|
||||||
|
cur.execute(sql,MR)
|
||||||
|
response=cur.fetchall()
|
||||||
|
if len(response)!=0:
|
||||||
|
for i in range(0,len(response)):
|
||||||
|
test=response[i][0]
|
||||||
|
build=response[i][1]
|
||||||
|
link=response[i][2]
|
||||||
|
if 'last_fail' not in self.data[MR][test]:
|
||||||
|
self.data[MR][test]['last_fail']=[]
|
||||||
|
self.data[MR][test]['last_fail'].append(build)
|
||||||
|
self.data[MR][test]['last_fail'].append(link)
|
||||||
|
|
||||||
|
#get last passing build and link
|
||||||
|
sql = "select TEST,BUILD, BUILD_LINK from test_results where MR=(%s) and STATUS='PASS' order by DATE DESC;"
|
||||||
|
cur.execute(sql,MR)
|
||||||
|
response=cur.fetchall()
|
||||||
|
if len(response)!=0:
|
||||||
|
for i in range(0,len(response)):
|
||||||
|
test=response[i][0]
|
||||||
|
build=response[i][1]
|
||||||
|
link=response[i][2]
|
||||||
|
if 'last_pass' not in self.data[MR][test]:
|
||||||
|
self.data[MR][test]['last_pass']=[]
|
||||||
|
self.data[MR][test]['last_pass'].append(build)
|
||||||
|
self.data[MR][test]['last_pass'].append(link)
|
||||||
|
|
||||||
|
|
||||||
|
#close database connection
|
||||||
|
def close_connection(self):
|
||||||
|
self.connection.close()
|
||||||
|
|
||||||
|
|
||||||
Executable
+103
@@ -0,0 +1,103 @@
|
|||||||
|
body {
|
||||||
|
font-family: 'lato', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Main {
|
||||||
|
text-align: left;
|
||||||
|
font-size: 30px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.DashLink {
|
||||||
|
text-align:left;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.DashLink:hover {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.Date {
|
||||||
|
text-align: left;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a { text-decoration: none; }
|
||||||
|
a:visited { text-decoration: none; color:blue}
|
||||||
|
a:hover { text-decoration: none; font-weight: bold; color:blue}
|
||||||
|
|
||||||
|
|
||||||
|
.Test_Table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Test_Table tr {
|
||||||
|
font-size: 12px;
|
||||||
|
text-align:center;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.Test_Table tr:hover {
|
||||||
|
background-color:lightgray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Test_Table td {
|
||||||
|
border: 1px solid black;
|
||||||
|
padding : 5px;
|
||||||
|
}
|
||||||
|
.Test_Table td:hover {
|
||||||
|
font-weight : bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Test_Table th {
|
||||||
|
font-size: 14px;
|
||||||
|
text-align:center;
|
||||||
|
padding : 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.Test_Name {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Test_Descr {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 400px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Pass {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Fail {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Last_Pass {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Last_Fail {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100px;
|
||||||
|
background-color: rgb(143, 154, 216);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -60,7 +60,8 @@ class SSHConnection():
|
|||||||
connect_status = False
|
connect_status = False
|
||||||
while count < 4:
|
while count < 4:
|
||||||
self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress))
|
self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress))
|
||||||
self.ssh.timeout = 5
|
# Longer timeout at connection due to asterix slowness
|
||||||
|
self.ssh.timeout = 25
|
||||||
self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
|
self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
|
||||||
if self.sshresponse == 0:
|
if self.sshresponse == 0:
|
||||||
self.ssh.sendline('yes')
|
self.ssh.sendline('yes')
|
||||||
@@ -99,7 +100,7 @@ class SSHConnection():
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
count += 1
|
count += 1
|
||||||
if connect_status:
|
if connect_status:
|
||||||
pass
|
self.command('unset HISTFILE', '\$', 5, silent=True)
|
||||||
else:
|
else:
|
||||||
sys.exit('SSH Connection Failed')
|
sys.exit('SSH Connection Failed')
|
||||||
self.ipaddress = ipaddress
|
self.ipaddress = ipaddress
|
||||||
|
|||||||
+45
-20
@@ -17,9 +17,15 @@ class StatMonitor():
|
|||||||
def __init__(self,cfg_file):
|
def __init__(self,cfg_file):
|
||||||
with open(cfg_file,'r') as file:
|
with open(cfg_file,'r') as file:
|
||||||
self.d = yaml.load(file)
|
self.d = yaml.load(file)
|
||||||
for node in self.d:
|
for node in self.d:#so far we have enb or gnb as nodes
|
||||||
for metric in self.d[node]:
|
for metric_l1 in self.d[node]: #first level of metric keys
|
||||||
self.d[node][metric]=[]
|
if metric_l1!="graph": #graph is a reserved word to configure graph paging, so it is disregarded
|
||||||
|
if self.d[node][metric_l1] is None:#first level is None -> create array
|
||||||
|
self.d[node][metric_l1]=[]
|
||||||
|
else: #first level is not None -> there is a second level -> create array
|
||||||
|
for metric_l2 in self.d[node][metric_l1]:
|
||||||
|
self.d[node][metric_l1][metric_l2]=[]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def process_gnb (self,node_type,output):
|
def process_gnb (self,node_type,output):
|
||||||
@@ -36,6 +42,11 @@ class StatMonitor():
|
|||||||
percentage=float(result.group(2))/float(result.group(1))
|
percentage=float(result.group(2))/float(result.group(1))
|
||||||
self.d[node_type]['ulsch_err_perc_round_1'].append(percentage)
|
self.d[node_type]['ulsch_err_perc_round_1'].append(percentage)
|
||||||
|
|
||||||
|
for k in self.d[node_type]['rt']:
|
||||||
|
result=re.match(rf'^.*\b{k}\b:\s+([0-9\.]+) us;\s+([0-9]+);\s+([0-9\.]+) us;',tmp)
|
||||||
|
if result is not None:
|
||||||
|
self.d[node_type]['rt'][k].append(float(result.group(3)))
|
||||||
|
|
||||||
|
|
||||||
def process_enb (self,node_type,output):
|
def process_enb (self,node_type,output):
|
||||||
for line in output:
|
for line in output:
|
||||||
@@ -62,23 +73,37 @@ class StatMonitor():
|
|||||||
|
|
||||||
|
|
||||||
def graph(self,node_type):
|
def graph(self,node_type):
|
||||||
col = 1
|
for page in self.d[node_type]['graph']:#work out a set a graphs per page
|
||||||
figure, axis = plt.subplots(len(self.d[node_type]), col ,figsize=(10, 10))
|
col = 1
|
||||||
i=0
|
figure, axis = plt.subplots(len(self.d[node_type]['graph'][page]), col ,figsize=(10, 10))
|
||||||
for metric in self.d[node_type]:
|
i=0
|
||||||
major_ticks = np.arange(0, len(self.d[node_type][metric])+1, 1)
|
for m in self.d[node_type]['graph'][page]:#metric may refer to 1 level or 2 levels
|
||||||
axis[i].set_xticks(major_ticks)
|
metric_path=m.split('.')
|
||||||
axis[i].set_xticklabels([])
|
if len(metric_path)==1:#1 level
|
||||||
axis[i].plot(self.d[node_type][metric],marker='o')
|
metric_l1=metric_path[0]
|
||||||
axis[i].set_xlabel('time')
|
major_ticks = np.arange(0, len(self.d[node_type][metric_l1])+1, 1)
|
||||||
axis[i].set_ylabel(metric)
|
axis[i].set_xticks(major_ticks)
|
||||||
axis[i].set_title(metric)
|
axis[i].set_xticklabels([])
|
||||||
i+=1
|
axis[i].plot(self.d[node_type][metric_l1],marker='o')
|
||||||
|
axis[i].set_xlabel('time')
|
||||||
|
axis[i].set_ylabel(metric_l1)
|
||||||
|
axis[i].set_title(metric_l1)
|
||||||
|
|
||||||
|
else:#2 levels
|
||||||
|
metric_l1=metric_path[0]
|
||||||
|
metric_l2=metric_path[1]
|
||||||
|
major_ticks = np.arange(0, len(self.d[node_type][metric_l1][metric_l2])+1, 1)
|
||||||
|
axis[i].set_xticks(major_ticks)
|
||||||
|
axis[i].set_xticklabels([])
|
||||||
|
axis[i].plot(self.d[node_type][metric_l1][metric_l2],marker='o')
|
||||||
|
axis[i].set_xlabel('time')
|
||||||
|
axis[i].set_ylabel(metric_l2)
|
||||||
|
axis[i].set_title(metric_l2)
|
||||||
|
i+=1
|
||||||
|
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
# Combine all the operations and display
|
#save as png
|
||||||
plt.savefig(node_type+'_stats_monitor.png')
|
plt.savefig(node_type+'_stats_monitor_'+page+'.png')
|
||||||
plt.show()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
@@ -88,7 +113,7 @@ if __name__ == "__main__":
|
|||||||
mon=StatMonitor(cfg_filename)
|
mon=StatMonitor(cfg_filename)
|
||||||
|
|
||||||
#collecting stats when modem process is stopped
|
#collecting stats when modem process is stopped
|
||||||
CMD='ps aux | grep mode | grep -v grep'
|
CMD='ps aux | grep modem | grep -v grep'
|
||||||
process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
|
process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
|
||||||
output = process.stdout.readlines()
|
output = process.stdout.readlines()
|
||||||
while len(output)!=0 :
|
while len(output)!=0 :
|
||||||
|
|||||||
@@ -2,10 +2,50 @@ enb :
|
|||||||
PHR:
|
PHR:
|
||||||
bler:
|
bler:
|
||||||
mcsoff:
|
mcsoff:
|
||||||
mcs:
|
mcs:
|
||||||
|
graph:
|
||||||
|
page1:
|
||||||
|
PHR:
|
||||||
|
bler:
|
||||||
|
mcsoff:
|
||||||
|
mcs:
|
||||||
|
|
||||||
gnb :
|
gnb :
|
||||||
dlsch_err:
|
dlsch_err:
|
||||||
dlsch_err_perc_round_1:
|
dlsch_err_perc_round_1:
|
||||||
ulsch_err:
|
ulsch_err:
|
||||||
ulsch_err_perc_round_1:
|
ulsch_err_perc_round_1:
|
||||||
|
rt :
|
||||||
|
feprx:
|
||||||
|
feptx_prec:
|
||||||
|
feptx_ofdm:
|
||||||
|
feptx_total:
|
||||||
|
L1 Tx processing thread 0:
|
||||||
|
L1 Tx processing thread 1:
|
||||||
|
DLSCH encoding:
|
||||||
|
L1 Rx processing:
|
||||||
|
PUSCH inner-receiver:
|
||||||
|
PUSCH decoding:
|
||||||
|
DL & UL scheduling timing stats:
|
||||||
|
UL Indication:
|
||||||
|
graph :
|
||||||
|
page1:
|
||||||
|
dlsch_err:
|
||||||
|
dlsch_err_perc_round_1:
|
||||||
|
ulsch_err:
|
||||||
|
ulsch_err_perc_round_1:
|
||||||
|
page2:
|
||||||
|
rt.feprx:
|
||||||
|
rt.feptx_prec:
|
||||||
|
rt.feptx_ofdm:
|
||||||
|
rt.feptx_total:
|
||||||
|
page3:
|
||||||
|
rt.L1 Tx processing thread 0:
|
||||||
|
rt.L1 Tx processing thread 1:
|
||||||
|
rt.DLSCH encoding:
|
||||||
|
rt.L1 Rx processing:
|
||||||
|
page4:
|
||||||
|
rt.PUSCH inner-receiver:
|
||||||
|
rt.PUSCH decoding:
|
||||||
|
rt.DL & UL scheduling timing stats:
|
||||||
|
rt.UL Indication:
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
- IdleSleep
|
- IdleSleep
|
||||||
- Perform_X2_Handover
|
- Perform_X2_Handover
|
||||||
- Build_Image
|
- Build_Image
|
||||||
|
- Copy_Image_to_Test
|
||||||
- Deploy_Object
|
- Deploy_Object
|
||||||
- Undeploy_Object
|
- Undeploy_Object
|
||||||
- Cppcheck_Analysis
|
- Cppcheck_Analysis
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
<htmlTabRef>rfsim-4glte</htmlTabRef>
|
<htmlTabRef>rfsim-4glte</htmlTabRef>
|
||||||
<htmlTabName>Testing 4G LTE RF sim in containers</htmlTabName>
|
<htmlTabName>Testing 4G LTE RF sim in containers</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<repeatCount>2</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100011
|
100011
|
||||||
000011
|
000011
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
<htmlTabRef>rfsim-5gnr</htmlTabRef>
|
<htmlTabRef>rfsim-5gnr</htmlTabRef>
|
||||||
<htmlTabName>Testing 5G NR RF sim in containers</htmlTabName>
|
<htmlTabName>Testing 5G NR RF sim in containers</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<repeatCount>4</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100001
|
100001
|
||||||
000001
|
000001
|
||||||
|
|||||||
@@ -0,0 +1,153 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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-B200</htmlTabRef>
|
||||||
|
<htmlTabName>NSA SanityCheck with QUECTEL</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
030000
|
||||||
|
030101
|
||||||
|
000001
|
||||||
|
030102
|
||||||
|
000001
|
||||||
|
010000
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
070000
|
||||||
|
070001
|
||||||
|
010002
|
||||||
|
000001
|
||||||
|
030202
|
||||||
|
030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<UE_Trace>yes</UE_Trace>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Copy_Image_to_Test</class>
|
||||||
|
<desc>Copy gNB image to test server</desc>
|
||||||
|
<image_name>oai-gnb</image_name>
|
||||||
|
<registry_svr_id>0</registry_svr_id>
|
||||||
|
<test_svr_id>1</test_svr_id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Deploy_Object</class>
|
||||||
|
<desc>Deploy eNB (FDD/Band7/5MHz/B200) in a container</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/nsa_b200_enb</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030102">
|
||||||
|
<class>Deploy_Object</class>
|
||||||
|
<desc>Deploy gNB (TDD/Band78/40MHz/B200) in a container</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/nsa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</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>1</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>1</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/40Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 40M -t 60</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/2Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 60</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy eNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/nsa_b200_enb</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy gNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/nsa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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-B200-terminate</htmlTabRef>
|
||||||
|
<htmlTabName>NSA tear-down in case of problem</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030202
|
||||||
|
030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy eNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/nsa_b200_enb</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy gNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/nsa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -38,11 +38,4 @@
|
|||||||
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000002">
|
|
||||||
<class>WaitEndBuild_eNB</class>
|
|
||||||
<desc>Wait for end of Build gNB</desc>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
<eNB_serverId>0</eNB_serverId>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -59,7 +59,7 @@
|
|||||||
<testCase id="030000">
|
<testCase id="030000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize eNB</desc>
|
<desc>Initialize eNB</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band38.lte_2x2.100PRB.usrpn310.conf --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args>
|
||||||
<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>
|
||||||
|
|||||||
@@ -21,10 +21,10 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-NSA-FR1-TM2</htmlTabRef>
|
<htmlTabRef>TEST-NSA-FR1-TM2-Tab1</htmlTabRef>
|
||||||
<htmlTabName>NSA 2x2 Ping DL UL with QUECTEL</htmlTabName>
|
<htmlTabName>NSA 2x2 Ping DL UL with QUECTEL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>5</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
<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.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1</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>
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
<class>IdleSleep</class>
|
<class>IdleSleep</class>
|
||||||
<desc>Sleep</desc>
|
<desc>Sleep</desc>
|
||||||
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
<idle_sleep_time_in_sec>60</idle_sleep_time_in_sec>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000002">
|
<testCase id="000002">
|
||||||
@@ -113,8 +113,8 @@
|
|||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 20M -t 60</iperf_args>
|
<iperf_args>-u -b 60M -t 60</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
|||||||
@@ -0,0 +1,145 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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-TM2-Tab2</htmlTabRef>
|
||||||
|
<htmlTabName>NSA 2x2 Attach-Detach with QUECTEL</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>5</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
031000
|
||||||
|
041000
|
||||||
|
000002
|
||||||
|
010000
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
000002
|
||||||
|
010004
|
||||||
|
000002
|
||||||
|
010003
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
000002
|
||||||
|
010004
|
||||||
|
000002
|
||||||
|
010003
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
000002
|
||||||
|
010002
|
||||||
|
080001
|
||||||
|
080000
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<UE_Trace>yes</UE_Trace>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010003">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010004">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="031000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<USRP_IPAddress>192.168.18.241</USRP_IPAddress>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="041000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>60</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</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>
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
<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 -q</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E -q --RUs.[0].sdr_addrs "serial=30C51D4"</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>
|
||||||
@@ -110,8 +110,8 @@
|
|||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 20M -t 60</iperf_args>
|
<iperf_args>-u -b 60M -t 60</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
<testCase id="000100">
|
<testCase id="000100">
|
||||||
<class>Deploy_EPC</class>
|
<class>Deploy_EPC</class>
|
||||||
<desc>Deploy all EPC containers</desc>
|
<desc>Deploy all EPC containers</desc>
|
||||||
<parameters>yaml_files/fr1_epc_20897</parameters>
|
<parameters>yaml_files/magma_nsa_20897</parameters>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
|
||||||
|
<htmlTabName>SA Ping DL UL with OAI NR UE</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040000
|
||||||
|
000002
|
||||||
|
010000
|
||||||
|
000002
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
080000
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_OAI_UE</class>
|
||||||
|
<desc>Initialize OAI UE</desc>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
<Initialize_OAI_UE_args>--sa -O ../../../ci-scripts/conf_files/ue.sa.conf --usrp-args "serial=30C51D1" --numerology 1 -r 106 --band 78 -C 3319680000 --nokrnmod 1 --ue-txgain 0 -E</Initialize_OAI_UE_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_OAI_UE</class>
|
||||||
|
<desc>Terminate OAI UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa -q --usrp-tx-thread-config 1</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping from CN to UE: 20pings in 20sec</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping from CN to UE: 100pings in 20sec</desc>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 60M -t 60</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 3M -t 60</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="080000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
|
||||||
|
<htmlTabName>SA Ping DL UL with OAI NR UE</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040000
|
||||||
|
000002
|
||||||
|
010000
|
||||||
|
000002
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
080000
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_OAI_UE</class>
|
||||||
|
<desc>Initialize OAI UE</desc>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
<Initialize_OAI_UE_args>--sa -O ../../../ci-scripts/conf_files/ue.sa.conf --usrp-args "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2" --numerology 1 -r 106 --band 78 -C 3319680000 --nokrnmod 1 --ue-txgain 0 --ue-rxgain 70 --ue-fo-compensation </Initialize_OAI_UE_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_OAI_UE</class>
|
||||||
|
<desc>Terminate OAI UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa --usrp-tx-thread-config 1</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping from CN to UE: 20pings in 20sec</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping from CN to UE: 100pings in 20sec</desc>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 60M -t 60</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 3M -t 60</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="080000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-SA-FR1-TM1</htmlTabRef>
|
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
|
||||||
<htmlTabName>SA Ping DL UL with QUECTEL</htmlTabName>
|
<htmlTabName>SA Ping DL UL with QUECTEL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
<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.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1</Initialize_eNB_args>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
@@ -98,8 +98,8 @@
|
|||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 20M -t 60</iperf_args>
|
<iperf_args>-u -b 60M -t 60</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
|||||||
@@ -0,0 +1,156 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-SA-FR1-Tab2</htmlTabRef>
|
||||||
|
<htmlTabName>SA Staged DL with QUECTEL</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040000
|
||||||
|
000002
|
||||||
|
010000
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
000001
|
||||||
|
070000
|
||||||
|
000001
|
||||||
|
070001
|
||||||
|
000001
|
||||||
|
070002
|
||||||
|
000001
|
||||||
|
070003
|
||||||
|
000001
|
||||||
|
070004
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
080000
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<UE_Trace>yes</UE_Trace>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/10Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 10M -t 30</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 30</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
<testCase id="070002">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/40Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 40M -t 30</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
<testCase id="070003">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/60Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 60M -t 30</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
<testCase id="070004">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/90Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 90M -t 30</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="080000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -111,6 +111,9 @@ services:
|
|||||||
TAC_LB_SGW_TEST_0: '03'
|
TAC_LB_SGW_TEST_0: '03'
|
||||||
TAC_HB_SGW_TEST_0: '00'
|
TAC_HB_SGW_TEST_0: '00'
|
||||||
SGW_IPV4_ADDRESS_FOR_S11_TEST_0: 0.0.0.0
|
SGW_IPV4_ADDRESS_FOR_S11_TEST_0: 0.0.0.0
|
||||||
|
volumes:
|
||||||
|
- ./mme.conf:/openair-mme/etc/mme.conf
|
||||||
|
- ./entrypoint.sh:/openair-mme/bin/entrypoint.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "pgrep oai_mme"
|
test: /bin/bash -c "pgrep oai_mme"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
|
|||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# First see if all interfaces are up
|
||||||
|
ifconfig
|
||||||
|
|
||||||
|
# S10 might be on loopback --> needs bring-up
|
||||||
|
if [[ "$MME_INTERFACE_NAME_FOR_S10" == *"lo:"* ]]
|
||||||
|
then
|
||||||
|
ifconfig ${MME_INTERFACE_NAME_FOR_S10} ${MME_IPV4_ADDRESS_FOR_S10} up
|
||||||
|
fi
|
||||||
|
|
||||||
|
LIST_OF_NETWORKS=`ifconfig -s | egrep -v "^Iface|^lo" | cut -d' ' -f1`
|
||||||
|
|
||||||
|
for if_name in $LIST_OF_NETWORKS
|
||||||
|
do
|
||||||
|
IF_IP_ADDR=`ifconfig $if_name | grep inet | sed -e "s# *inet#inet#" | cut -d' ' -f2`
|
||||||
|
if [[ "${IF_IP_ADDR}" == "${MME_IPV4_ADDRESS_FOR_S1_MME}" ]]; then
|
||||||
|
echo "S1C is on $if_name"
|
||||||
|
MME_INTERFACE_NAME_FOR_S1_MME=$if_name
|
||||||
|
fi
|
||||||
|
if [[ "${IF_IP_ADDR}" == "${MME_IPV4_ADDRESS_FOR_S10}" ]]; then
|
||||||
|
echo "S10 is on $if_name"
|
||||||
|
MME_INTERFACE_NAME_FOR_S10=$if_name
|
||||||
|
fi
|
||||||
|
if [[ "${IF_IP_ADDR}" == "${MME_IPV4_ADDRESS_FOR_S11}" ]]; then
|
||||||
|
echo "S11 is on $if_name"
|
||||||
|
MME_INTERFACE_NAME_FOR_S11=$if_name
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
CONFIG_DIR="/openair-mme/etc"
|
||||||
|
|
||||||
|
for c in ${CONFIG_DIR}/mme_fd.conf; do
|
||||||
|
#echo "entrypoint.sh process config file $c"
|
||||||
|
sed -i -e "s#@TAC-LB#@TAC_LB#" -e "s#TAC-HB_#TAC_HB_#" ${c}
|
||||||
|
# grep variable names (format: ${VAR}) from template to be rendered
|
||||||
|
VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
|
||||||
|
#echo "entrypoint.sh process vars $VARS"
|
||||||
|
|
||||||
|
# create sed expressions for substituting each occurrence of ${VAR}
|
||||||
|
# with the value of the environment variable "VAR"
|
||||||
|
EXPRESSIONS=""
|
||||||
|
for v in ${VARS}; do
|
||||||
|
#echo "var is $v"
|
||||||
|
NEW_VAR=`echo $v | sed -e "s#@##g"`
|
||||||
|
#echo "NEW_VAR is $NEW_VAR"
|
||||||
|
if [[ "${!NEW_VAR}x" == "x" ]]; then
|
||||||
|
echo "Error: Environment variable '${NEW_VAR}' is not set." \
|
||||||
|
"Config file '$(basename $c)' requires all of $VARS."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# Some fields require CIDR format
|
||||||
|
if [[ "${NEW_VAR}" == "MME_IPV4_ADDRESS_FOR_S1_MME" ]] || \
|
||||||
|
[[ "${NEW_VAR}" == "MME_IPV4_ADDRESS_FOR_S11" ]] || \
|
||||||
|
[[ "${NEW_VAR}" == "MME_IPV4_ADDRESS_FOR_S10" ]]; then
|
||||||
|
EXPRESSIONS="${EXPRESSIONS};s|${v}|${!NEW_VAR}/24|g"
|
||||||
|
else
|
||||||
|
EXPRESSIONS="${EXPRESSIONS};s|${v}|${!NEW_VAR}|g"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
EXPRESSIONS="${EXPRESSIONS#';'}"
|
||||||
|
|
||||||
|
# render template and inline replace config file
|
||||||
|
sed -i "${EXPRESSIONS}" ${c}
|
||||||
|
done
|
||||||
|
|
||||||
|
pushd /openair-mme/scripts
|
||||||
|
./check_mme_s6a_certificate ${PREFIX} ${MME_FQDN}
|
||||||
|
popd
|
||||||
|
|
||||||
|
exec "$@"
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
MME :
|
||||||
|
{
|
||||||
|
REALM = "openairinterface.org"; # YOUR REALM HERE
|
||||||
|
INSTANCE = 1; # 0 is the default
|
||||||
|
PID_DIRECTORY = "/var/run"; # /var/run is the default
|
||||||
|
MAX_S1_ENB = 64;
|
||||||
|
MAX_UE = 4096;
|
||||||
|
RELATIVE_CAPACITY = 10;
|
||||||
|
EMERGENCY_ATTACH_SUPPORTED = "no";
|
||||||
|
UNAUTHENTICATED_IMSI_SUPPORTED = "no";
|
||||||
|
DUMMY_HANDOVER_FORWARDING_ENABLED = "yes";
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_IMS_VOICE_OVER_PS_SESSION_IN_S1 = "no"; # DO NOT CHANGE
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_EMERGENCY_BEARER_SERVICES_IN_S1_MODE = "no"; # DO NOT CHANGE
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_LOCATION_SERVICES_VIA_EPC = "no"; # DO NOT CHANGE
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_EXTENDED_SERVICE_REQUEST = "no"; # DO NOT CHANGE
|
||||||
|
|
||||||
|
# Display statistics about whole system (expressed in seconds)
|
||||||
|
MME_STATISTIC_TIMER = 10;
|
||||||
|
MME_MOBILITY_COMPLETION_TIMER = 2; # Amount of time in seconds the source MME waits to release resources after HANDOVER/TAU is complete (with or without.
|
||||||
|
MME_S10_HANDOVER_COMPLETION_TIMER = 2; # Amount of time in soconds the target MME waits to check if a handover/tau process has completed successfully.
|
||||||
|
|
||||||
|
IP_CAPABILITY = "IPV4V6";
|
||||||
|
INTERTASK_INTERFACE :
|
||||||
|
{
|
||||||
|
ITTI_QUEUE_SIZE = 2000000;
|
||||||
|
};
|
||||||
|
|
||||||
|
S6A :
|
||||||
|
{
|
||||||
|
S6A_CONF = "/openair-mme/etc/mme_fd.conf";
|
||||||
|
HSS_HOSTNAME = "hss.openairinterface.org"; # THE HSS FQDN ex: hss.epc.mnc001.mcc001.3gppnetwork.org
|
||||||
|
HSS_REALM = "openairinterface.org"; # THE HSS REALM ex: epc.mnc001.mcc001.3gppnetwork.org
|
||||||
|
};
|
||||||
|
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
SCTP_INSTREAMS = 8;
|
||||||
|
SCTP_OUTSTREAMS = 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
S1AP :
|
||||||
|
{
|
||||||
|
S1AP_OUTCOME_TIMER = 10;
|
||||||
|
};
|
||||||
|
|
||||||
|
GUMMEI_LIST = (
|
||||||
|
{MCC="208" ; MNC="97"; MME_GID="32768" ; MME_CODE="3"; } # YOUR GUMMEI CONFIG HERE
|
||||||
|
);
|
||||||
|
|
||||||
|
TAI_LIST = (
|
||||||
|
{MCC="208" ; MNC="97"; TAC = "1"; }, # YOUR TAI CONFIG HERE
|
||||||
|
{MCC="208" ; MNC="97"; TAC = "2"; }, # YOUR TAI CONFIG HERE
|
||||||
|
{MCC="208" ; MNC="97"; TAC = "3"; } # YOUR TAI CONFIG HERE
|
||||||
|
);
|
||||||
|
|
||||||
|
NAS :
|
||||||
|
{
|
||||||
|
ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "EIA2" , "EIA1" , "EIA0" ];
|
||||||
|
ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "EEA0" , "EEA1" , "EEA2" ];
|
||||||
|
T3402 = 12
|
||||||
|
T3412 = 0
|
||||||
|
T3422 = 6
|
||||||
|
T3450 = 6
|
||||||
|
T3460 = 6
|
||||||
|
T3470 = 6
|
||||||
|
T3485 = 3
|
||||||
|
T3486 = 3
|
||||||
|
T3489 = 4
|
||||||
|
T3495 = 3
|
||||||
|
NAS_FORCE_TAU = 0
|
||||||
|
STRICT_FILLER_BITS_CHECK = "yes";
|
||||||
|
};
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
# MME binded interface for S1-C or S1-MME communication (S1AP), can be ethernet interface, virtual ethernet interface, we don't advise wireless interfaces
|
||||||
|
MME_INTERFACE_NAME_FOR_S1_MME = "eth0"; # YOUR NETWORK CONFIG HERE
|
||||||
|
MME_IPV4_ADDRESS_FOR_S1_MME = "192.168.61.195/24"; # CIDR, YOUR NETWORK CONFIG HERE
|
||||||
|
# MME_IPV6_ADDRESS_FOR_S1_MME = "fd00::191/118"; # YOUR NETWORK CONFIG HERE
|
||||||
|
# MME binded interface for S11 communication (GTPV2-C)
|
||||||
|
MME_INTERFACE_NAME_FOR_S11 = "eth0"; # YOUR NETWORK CONFIG HERE
|
||||||
|
MME_IPV4_ADDRESS_FOR_S11 = "192.168.61.195/24"; # CIDR, YOUR NETWORK CONFIG HERE
|
||||||
|
# MME_IPV6_ADDRESS_FOR_S11 = "fd00:0:0:4::191/64";
|
||||||
|
MME_PORT_FOR_S11 = 2123; # YOUR NETWORK CONFIG HERE
|
||||||
|
|
||||||
|
|
||||||
|
#S10 Interface
|
||||||
|
MME_INTERFACE_NAME_FOR_S10 = "lo"; # YOUR NETWORK CONFIG HERE
|
||||||
|
MME_IPV4_ADDRESS_FOR_S10 = "127.0.0.10/24"; # CIDR, YOUR NETWORK CONFIG HERE
|
||||||
|
# MME_IPV6_ADDRESS_FOR_S10 = "fd00:0:0:4::191/64";
|
||||||
|
MME_PORT_FOR_S10 = 2123; # YOUR NETWORK CONFIG HERE
|
||||||
|
};
|
||||||
|
|
||||||
|
LOGGING :
|
||||||
|
{
|
||||||
|
# OUTPUT choice in { "CONSOLE", `path to file`", "`IPv4@`:`TCP port num`"}
|
||||||
|
# `path to file` must start with '.' or '/'
|
||||||
|
# if TCP stream choice, then you can easily dump the traffic on the remote or local host: nc -l `TCP port num` > received.txt
|
||||||
|
OUTPUT = "CONSOLE";
|
||||||
|
THREAD_SAFE = "no"; # THREAD_SAFE choice in { "yes", "no" }, safe to let 'no'
|
||||||
|
COLOR = "yes"; # COLOR choice in { "yes", "no" } means use of ANSI styling codes or no
|
||||||
|
# Log level choice in { "EMERGENCY", "ALERT", "CRITICAL", "ERROR", "WARNING", "NOTICE", "INFO", "DEBUG", "TRACE"}
|
||||||
|
SCTP_LOG_LEVEL = "TRACE";
|
||||||
|
S10_LOG_LEVEL = "TRACE";
|
||||||
|
S11_LOG_LEVEL = "TRACE";
|
||||||
|
# NEW LOGS FOR MCE
|
||||||
|
SM_LOG_LEVEL = "TRACE";
|
||||||
|
MCE_APP_LOG_LEVEL = "TRACE";
|
||||||
|
M2AP_LOG_LEVEL = "TRACE";
|
||||||
|
GTPV2C_LOG_LEVEL = "TRACE";
|
||||||
|
UDP_LOG_LEVEL = "DEBUG";
|
||||||
|
S1AP_LOG_LEVEL = "DEBUG";
|
||||||
|
NAS_LOG_LEVEL = "TRACE";
|
||||||
|
MME_APP_LOG_LEVEL = "TRACE";
|
||||||
|
S6A_LOG_LEVEL = "TRACE";
|
||||||
|
UTIL_LOG_LEVEL = "ERROR";
|
||||||
|
MSC_LOG_LEVEL = "ERROR";
|
||||||
|
ITTI_LOG_LEVEL = "ERROR";
|
||||||
|
ASN1_VERBOSITY = "annoying";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# WRR_LIST_SELECTION = (
|
||||||
|
# {ID="tac-lb03.tac-hb00.tac.epc.mnc001.mcc001.3gppnetwork.org" ; SGW_IP_ADDRESS_FOR_S11="192.168.61.196";},
|
||||||
|
# {ID="tac-lb01.tac-hb00.tac.epc.mnc097.mcc208.3gppnetwork.org" ; SGW_IP_ADDRESS_FOR_S11="192.168.61.196";},
|
||||||
|
# {ID="tac-lb02.tac-hb00.tac.epc.mnc097.mcc208.3gppnetwork.org" ; MME_IP_ADDRESS_FOR_S10="0.0.0.0";},
|
||||||
|
# {ID="tac-lb03.tac-hb00.tac.epc.mnc097.mcc208.3gppnetwork.org" ; MME_IP_ADDRESS_FOR_S10="0.0.0.0";}
|
||||||
|
# );
|
||||||
|
WRR_LIST_SELECTION = (
|
||||||
|
{ID="tac-lb01.tac-hb00.tac.epc.mnc097.mcc208.3gppnetwork.org" ; SGW_IP_ADDRESS_FOR_S11="192.168.61.196";}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,198 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
cassandra:
|
||||||
|
image: cassandra:2.1
|
||||||
|
container_name: prod-cassandra
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
ipv4_address: 192.168.68.2
|
||||||
|
environment:
|
||||||
|
CASSANDRA_CLUSTER_NAME: "OAI HSS Cluster"
|
||||||
|
CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "nodetool status"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
db_init:
|
||||||
|
image: cassandra:2.1
|
||||||
|
container_name: prod-db-init
|
||||||
|
depends_on: [cassandra]
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: on-failure
|
||||||
|
max_attempts: 10
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
ipv4_address: 192.168.68.4
|
||||||
|
volumes:
|
||||||
|
- ./oai_db.cql:/home/oai_db.cql
|
||||||
|
entrypoint: /bin/bash -c "cqlsh --file /home/oai_db.cql 192.168.68.2 && echo 'OK'"
|
||||||
|
|
||||||
|
oai_hss:
|
||||||
|
image: oai-hss:production
|
||||||
|
container_name: prod-oai-hss
|
||||||
|
privileged: true
|
||||||
|
depends_on: [cassandra]
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
ipv4_address: 192.168.68.3
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.194
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Paris
|
||||||
|
REALM: openairinterface.org
|
||||||
|
HSS_FQDN: hss.openairinterface.org
|
||||||
|
PREFIX: /openair-hss/etc
|
||||||
|
cassandra_Server_IP: 192.168.68.2
|
||||||
|
OP_KEY: 1006020f0a478bf6b699f15c062e42b3
|
||||||
|
LTE_K: FEC86BA6EB707ED08905757B1BB44B8F
|
||||||
|
APN1: oai.ipv4
|
||||||
|
APN2: oai2.ipv4
|
||||||
|
FIRST_IMSI: 208970100001127
|
||||||
|
NB_USERS: 10
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_hss"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:6.0.5
|
||||||
|
container_name: prod-redis
|
||||||
|
privileged: true
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.198
|
||||||
|
volumes:
|
||||||
|
- ./redis_extern.conf:/usr/local/etc/redis/redis.conf
|
||||||
|
entrypoint: /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf"
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "redis-cli -h 192.168.61.198 -p 6380 ping"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
magma_mme:
|
||||||
|
image: magma-mme:production
|
||||||
|
container_name: prod-magma-mme
|
||||||
|
hostname: mme
|
||||||
|
privileged: true
|
||||||
|
depends_on: [oai_hss, redis]
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.195
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Paris
|
||||||
|
REALM: openairinterface.org
|
||||||
|
PREFIX: /openair-mme/etc
|
||||||
|
HSS_HOSTNAME: hss
|
||||||
|
HSS_FQDN: hss.openairinterface.org
|
||||||
|
HSS_REALM: openairinterface.org
|
||||||
|
MME_FQDN: mme.openairinterface.org
|
||||||
|
FEATURES: mme_oai
|
||||||
|
volumes:
|
||||||
|
- ./mme_fd.sprint.conf:/magma-mme/etc/mme_fd.conf.tmplt
|
||||||
|
- ./mme.conf:/magma-mme/etc/mme.conf
|
||||||
|
- ./entrypoint.sh:/magma-mme/bin/entrypoint.sh
|
||||||
|
entrypoint: /bin/bash -c "/magma-mme/bin/entrypoint.sh"
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_mme"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
oai_spgwc:
|
||||||
|
image: oai-spgwc:production
|
||||||
|
privileged: true
|
||||||
|
depends_on: [magma_mme]
|
||||||
|
container_name: prod-oai-spgwc
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.196
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Paris
|
||||||
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
|
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
||||||
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
|
APN_NI_1: oai.ipv4
|
||||||
|
APN_NI_2: oai2.ipv4
|
||||||
|
DEFAULT_APN_NI_1: oai.ipv4
|
||||||
|
UE_IP_ADDRESS_POOL_1: '12.1.1.2 - 12.1.1.254'
|
||||||
|
UE_IP_ADDRESS_POOL_2: '12.0.0.2 - 12.0.0.254'
|
||||||
|
MCC: '208'
|
||||||
|
MNC: '97'
|
||||||
|
MNC03: '097'
|
||||||
|
TAC: 1
|
||||||
|
GW_ID: 1
|
||||||
|
REALM: openairinterface.org
|
||||||
|
UE_MTU_IPV4: 1500
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_spgwc"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
oai_spgwu:
|
||||||
|
image: oai-spgwu-tiny:production
|
||||||
|
privileged: true
|
||||||
|
container_name: prod-oai-spgwu-tiny
|
||||||
|
depends_on: [oai_spgwc]
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.197
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Paris
|
||||||
|
PID_DIRECTORY: /var/run
|
||||||
|
INSTANCE: 1
|
||||||
|
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP: eth0
|
||||||
|
PGW_INTERFACE_NAME_FOR_SGI: eth0
|
||||||
|
SGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
|
SPGWC0_IP_ADDRESS: 192.168.61.196
|
||||||
|
NETWORK_UE_IP: '12.1.1.0/24'
|
||||||
|
NETWORK_UE_NAT_OPTION: 'yes'
|
||||||
|
MCC: '208'
|
||||||
|
MNC: '97'
|
||||||
|
MNC03: '097'
|
||||||
|
TAC: 1
|
||||||
|
GW_ID: 1
|
||||||
|
REALM: openairinterface.org
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_spgwu"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
trf_gen:
|
||||||
|
image: trf-gen:production
|
||||||
|
privileged: true
|
||||||
|
container_name: prod-trf-gen
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.200
|
||||||
|
entrypoint: /bin/bash -c "ip route add 12.1.1.0/24 via 192.168.61.197 dev eth0; sleep infinity"
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "ip route | grep '12.1.1.0'"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
name: prod-oai-private-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.68.0/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "oai-priv-net"
|
||||||
|
public_net:
|
||||||
|
name: prod-oai-public-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.61.192/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "oai-pub-net"
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
INSTANCE=1
|
||||||
|
PREFIX='/magma-mme/etc'
|
||||||
|
MY_REALM='openairinterface.org'
|
||||||
|
|
||||||
|
declare -A MME_CONF
|
||||||
|
|
||||||
|
pushd $PREFIX
|
||||||
|
MME_CONF[@MME_S6A_IP_ADDR@]="192.168.61.195"
|
||||||
|
MME_CONF[@INSTANCE@]=$INSTANCE
|
||||||
|
MME_CONF[@PREFIX@]=$PREFIX
|
||||||
|
MME_CONF[@REALM@]=$MY_REALM
|
||||||
|
MME_CONF[@MME_FQDN@]="mme.${MME_CONF[@REALM@]}"
|
||||||
|
MME_CONF[@HSS_HOSTNAME@]='hss'
|
||||||
|
MME_CONF[@HSS_FQDN@]="${MME_CONF[@HSS_HOSTNAME@]}.${MME_CONF[@REALM@]}"
|
||||||
|
MME_CONF[@HSS_IP_ADDR@]="192.168.61.194"
|
||||||
|
|
||||||
|
cp mme_fd.conf.tmplt $PREFIX/mme_fd.conf
|
||||||
|
|
||||||
|
for K in "${!MME_CONF[@]}"; do
|
||||||
|
egrep -lRZ "$K" $PREFIX/mme_fd.conf | xargs -0 -l sed -i -e "s|$K|${MME_CONF[$K]}|g"
|
||||||
|
ret=$?;[[ ret -ne 0 ]] && echo "Tried to replace $K with ${MME_CONF[$K]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
sed -i -e "s@etc/freeDiameter@etc@" /magma-mme/etc/mme_fd.conf
|
||||||
|
sed -i -e "s@bind: 127.0.0.1@bind: 192.168.61.198@" /etc/magma/redis.yml
|
||||||
|
# Generate freeDiameter certificate
|
||||||
|
popd
|
||||||
|
cd /magma-mme/scripts
|
||||||
|
./check_mme_s6a_certificate $PREFIX mme.${MME_CONF[@REALM@]}
|
||||||
|
|
||||||
|
cd /magma-mme
|
||||||
|
nohup /magma-mme/bin/sctpd > /var/log/sctpd.log 2>&1 &
|
||||||
|
sleep 5
|
||||||
|
/magma-mme/bin/oai_mme -c /magma-mme/etc/mme.conf
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
# generated by generate_mme_config_script.py
|
||||||
|
MME :
|
||||||
|
{
|
||||||
|
REALM = "openairinterface.org"
|
||||||
|
PID_DIRECTORY = "/var/run";
|
||||||
|
MAXENB = 8; # power of 2
|
||||||
|
MAXUE = 16; # power of 2
|
||||||
|
RELATIVE_CAPACITY = 10;
|
||||||
|
|
||||||
|
EMERGENCY_ATTACH_SUPPORTED = "no";
|
||||||
|
UNAUTHENTICATED_IMSI_SUPPORTED = "no";
|
||||||
|
|
||||||
|
# EPS network feature support
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_IMS_VOICE_OVER_PS_SESSION_IN_S1 = "no"; # DO NOT CHANGE
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_EMERGENCY_BEARER_SERVICES_IN_S1_MODE = "no"; # DO NOT CHANGE
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_LOCATION_SERVICES_VIA_EPC = "no"; # DO NOT CHANGE
|
||||||
|
EPS_NETWORK_FEATURE_SUPPORT_EXTENDED_SERVICE_REQUEST = "no"; # DO NOT CHANGE
|
||||||
|
|
||||||
|
# Display statistics about whole system (expressed in seconds)
|
||||||
|
MME_STATISTIC_TIMER = 10;
|
||||||
|
IP_CAPABILITY = "IPV4"; # UE PDN_TYPE
|
||||||
|
USE_STATELESS = "";
|
||||||
|
|
||||||
|
INTERTASK_INTERFACE :
|
||||||
|
{
|
||||||
|
# max queue size per task
|
||||||
|
ITTI_QUEUE_SIZE = 2000000;
|
||||||
|
};
|
||||||
|
|
||||||
|
S6A :
|
||||||
|
{
|
||||||
|
S6A_CONF = "/magma-mme/etc/mme_fd.conf"; # YOUR MME freeDiameter config file path
|
||||||
|
HSS_HOSTNAME = "hss.openairinterface.org";
|
||||||
|
HSS_REALM = "openairinterface.org";
|
||||||
|
};
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 8;
|
||||||
|
SCTP_OUTSTREAMS = 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
# ------- S1AP definitions
|
||||||
|
S1AP :
|
||||||
|
{
|
||||||
|
# outcome drop timer value (seconds)
|
||||||
|
S1AP_OUTCOME_TIMER = 10;
|
||||||
|
};
|
||||||
|
|
||||||
|
# ------- MME served GUMMEIs
|
||||||
|
GUMMEI_LIST = (
|
||||||
|
{ MCC="208" ; MNC="97"; MME_GID="32768" ; MME_CODE="3"; }
|
||||||
|
);
|
||||||
|
|
||||||
|
# ------- MME served TAIs
|
||||||
|
TAI_LIST = (
|
||||||
|
{MCC="208" ; MNC="97"; TAC = "1"; }
|
||||||
|
);
|
||||||
|
|
||||||
|
TAC_LIST = (
|
||||||
|
{MCC="208" ; MNC="97"; TAC = "1"; }
|
||||||
|
);
|
||||||
|
|
||||||
|
CSFB :
|
||||||
|
{
|
||||||
|
NON_EPS_SERVICE_CONTROL = "OFF";
|
||||||
|
CSFB_MCC = "208";
|
||||||
|
CSFB_MNC = "97";
|
||||||
|
LAC = "1";
|
||||||
|
};
|
||||||
|
NAS :
|
||||||
|
{
|
||||||
|
ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "EIA2" , "EIA1" , "EIA0" ];
|
||||||
|
ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "EEA0" , "EEA1" , "EEA2" ];
|
||||||
|
T3402 = 1 # in minutes (default is 12 minutes)
|
||||||
|
T3412 = 54 # in minutes (default is 54 minutes, network dependent)
|
||||||
|
T3422 = 6 # in seconds (default is 6s)
|
||||||
|
T3450 = 6 # in seconds (default is 6s)
|
||||||
|
T3460 = 6 # in seconds (default is 6s)
|
||||||
|
T3470 = 6 # in seconds (default is 6s)
|
||||||
|
T3485 = 8 # UNUSED in seconds (default is 8s)
|
||||||
|
T3486 = 8 # UNUSED in seconds (default is 8s)
|
||||||
|
T3489 = 4 # UNUSED in seconds (default is 4s)
|
||||||
|
T3495 = 8 # UNUSED in seconds (default is 8s)
|
||||||
|
};
|
||||||
|
|
||||||
|
SGS :
|
||||||
|
{
|
||||||
|
TS6_1 = 10 # in seconds (default is 10s)
|
||||||
|
TS8 = 4 # in seconds (default is 4s)
|
||||||
|
TS9 = 2 # in seconds (default is 4s)
|
||||||
|
TS10 = 4 # in seconds (default is 4s)
|
||||||
|
TS13 = 4 # in seconds (default is 4s)
|
||||||
|
};
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
MME_IPV4_ADDRESS_FOR_S1_MME = "192.168.61.195/24";
|
||||||
|
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
|
||||||
|
MME_IPV4_ADDRESS_FOR_S11_MME = "192.168.61.195/24";
|
||||||
|
MME_PORT_FOR_S11_MME = 2123;
|
||||||
|
};
|
||||||
|
|
||||||
|
LOGGING :
|
||||||
|
{
|
||||||
|
OUTPUT = "CONSOLE";
|
||||||
|
THREAD_SAFE = "no";
|
||||||
|
COLOR = "no";
|
||||||
|
|
||||||
|
SCTP_LOG_LEVEL = "ERROR";
|
||||||
|
GTPV1U_LOG_LEVEL = "INFO";
|
||||||
|
SPGW_APP_LOG_LEVEL = "INFO";
|
||||||
|
UDP_LOG_LEVEL = "INFO";
|
||||||
|
S1AP_LOG_LEVEL = "DEBUG";
|
||||||
|
NAS_LOG_LEVEL = "INFO";
|
||||||
|
MME_APP_LOG_LEVEL = "DEBUG";
|
||||||
|
GTPV2C_LOG_LEVEL = "INFO";
|
||||||
|
S11_LOG_LEVEL = "DEBUG";
|
||||||
|
S6A_LOG_LEVEL = "DEBUG";
|
||||||
|
UTIL_LOG_LEVEL = "INFO";
|
||||||
|
MSC_LOG_LEVEL = "ERROR";
|
||||||
|
ITTI_LOG_LEVEL = "ERROR";
|
||||||
|
MME_SCENARIO_PLAYER_LOG_LEVEL = "ERROR";
|
||||||
|
ASN1_VERBOSITY = "INFO";
|
||||||
|
};
|
||||||
|
|
||||||
|
S-GW :
|
||||||
|
{
|
||||||
|
SGW_IPV4_ADDRESS_FOR_S11 = "192.168.61.196";
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
# -------- Local ---------
|
||||||
|
|
||||||
|
# Uncomment if the framework cannot resolv it.
|
||||||
|
Identity = "@MME_FQDN@";
|
||||||
|
Realm = "@REALM@";
|
||||||
|
|
||||||
|
# TLS configuration (see previous section)
|
||||||
|
TLS_Cred = "@PREFIX@/freeDiameter/mme.cert.pem",
|
||||||
|
"@PREFIX@/freeDiameter/mme.key.pem";
|
||||||
|
TLS_CA = "@PREFIX@/freeDiameter/mme.cacert.pem";
|
||||||
|
|
||||||
|
# Disable use of TCP protocol (only listen and connect in SCTP)
|
||||||
|
# Default : TCP enabled
|
||||||
|
No_SCTP;
|
||||||
|
|
||||||
|
# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option.
|
||||||
|
# Prefer TCP instead of SCTP for establishing new connections.
|
||||||
|
# This setting may be overwritten per peer in peer configuration blocs.
|
||||||
|
# Default : SCTP is attempted first.
|
||||||
|
Prefer_TCP;
|
||||||
|
|
||||||
|
|
||||||
|
No_IPv6;
|
||||||
|
|
||||||
|
# Overwrite the number of SCTP streams. This value should be kept low,
|
||||||
|
# especially if you are using TLS over SCTP, because it consumes a lot of
|
||||||
|
# resources in that case. See tickets 19 and 27 for some additional details on
|
||||||
|
# this.
|
||||||
|
# Limit the number of SCTP streams
|
||||||
|
SCTP_streams = 3;
|
||||||
|
|
||||||
|
|
||||||
|
# By default, freeDiameter acts as a Diameter Relay Agent by forwarding all
|
||||||
|
# messages it cannot handle locally. This parameter disables this behavior.
|
||||||
|
NoRelay;
|
||||||
|
|
||||||
|
# Use RFC3588 method for TLS protection, where TLS is negociated after CER/CEA exchange is completed
|
||||||
|
# on the unsecure connection. The alternative is RFC6733 mechanism, where TLS protects also the
|
||||||
|
# CER/CEA exchange on a dedicated secure port.
|
||||||
|
# This parameter only affects outgoing connections.
|
||||||
|
# The setting can be also defined per-peer (see Peers configuration section).
|
||||||
|
# Default: use RFC6733 method with separate port for TLS.
|
||||||
|
|
||||||
|
#TLS_old_method;
|
||||||
|
|
||||||
|
AppServThreads = 4;
|
||||||
|
|
||||||
|
# Specify the addresses on which to bind the listening server. This must be
|
||||||
|
# specified if the framework is unable to auto-detect these addresses, or if the
|
||||||
|
# auto-detected values are incorrect. Note that the list of addresses is sent
|
||||||
|
# in CER or CEA message, so one should pay attention to this parameter if some
|
||||||
|
# adresses should be kept hidden.
|
||||||
|
ListenOn = "@MME_S6A_IP_ADDR@";
|
||||||
|
|
||||||
|
Port = 3870;
|
||||||
|
SecPort = 5870;
|
||||||
|
|
||||||
|
# -------- Extensions ---------
|
||||||
|
|
||||||
|
# Uncomment (and create rtd.conf) to specify routing table for this peer.
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_default.fdx" : "rtd.conf";
|
||||||
|
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/_sample.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/app_acct.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/app_diameap.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/app_radgw.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/app_redirect.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/app_sip.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dbg_interactive.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dbg_monitor.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dbg_msg_dumps.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dbg_msg_timings.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dbg_rt.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_CreditControl.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_CxDx.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_Gx.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_NAS.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_Ro.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_Rx.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_S6mS6n.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_SGd.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_SLh.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_Sd.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_Sh.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_T4.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_T6aT6bT7.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_Tsp.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca_3gpp.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca_starent.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_eap.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_legacy_xml.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_mip6a.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_mip6i.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_nas_mipv6.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_nasreq.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_sip.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_busypeers.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_default.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_ereg.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_ignore_dh.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_load_balance.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_randomize.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/rt_redirect.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/test_acct.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/test_app.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/test_hss.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/test_netemul.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/test_rt_any.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/test_sip.fdx";
|
||||||
|
#LoadExtension = "/usr/local/lib/freeDiameter/dict_Rf.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx";
|
||||||
|
LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx";
|
||||||
|
|
||||||
|
|
||||||
|
# -------- Peers ---------
|
||||||
|
|
||||||
|
# The framework will actively attempt to establish and maintain a connection
|
||||||
|
# with the peers listed here.
|
||||||
|
# For only accepting incoming connections, see the acl_wl.fx extension.
|
||||||
|
|
||||||
|
# ConnectPeer
|
||||||
|
# Declare a remote peer to which this peer must maintain a connection.
|
||||||
|
# In addition, this allows specifying non-default parameters for this peer only
|
||||||
|
# (for example disable SCTP with this peer, or use RFC3588-flavour TLS).
|
||||||
|
# Note that by default, if a peer is not listed as a ConnectPeer entry, an
|
||||||
|
# incoming connection from this peer will be rejected. If you want to accept
|
||||||
|
# incoming connections from other peers, see the acl_wl.fdx? extension which
|
||||||
|
# allows exactly this.
|
||||||
|
|
||||||
|
ConnectPeer= "@HSS_FQDN@" { ConnectTo = "@HSS_IP_ADDR@"; No_SCTP ; No_IPv6; Prefer_TCP; No_TLS; port = 3868;};
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2016-present, Facebook, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This source code is licensed under the BSD-style license found in the
|
||||||
|
# LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
# of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
# Jinja template for Redis configuration
|
||||||
|
# See the default config file for options and explanations:
|
||||||
|
# https://github.com/antirez/redis/blob/unstable/redis.conf
|
||||||
|
|
||||||
|
# TODO: make sensible, production-aware config decisions
|
||||||
|
|
||||||
|
bind 192.168.61.198
|
||||||
|
port 6380
|
||||||
|
|
||||||
|
daemonize no
|
||||||
|
loglevel notice
|
||||||
|
|
||||||
|
timeout 0
|
||||||
|
databases 1
|
||||||
|
|
||||||
|
dbfilename redis_dump.rdb
|
||||||
|
dir /data
|
||||||
|
|
||||||
|
# Save the DB on disk
|
||||||
|
|
||||||
|
save 900 1
|
||||||
|
|
||||||
|
save 300 10
|
||||||
|
|
||||||
|
save 60 1000
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
enb_mono_fdd:
|
||||||
|
image: oai-enb:latest
|
||||||
|
privileged: true
|
||||||
|
container_name: nsa-b200-enb
|
||||||
|
environment:
|
||||||
|
USE_FDD_MONO: 'yes'
|
||||||
|
USE_B2XX: 'yes'
|
||||||
|
ENB_NAME: eNB-in-docker
|
||||||
|
MCC: '222'
|
||||||
|
MNC: '01'
|
||||||
|
MNC_LENGTH: 2
|
||||||
|
TAC: 1
|
||||||
|
UTRA_BAND_ID: 7
|
||||||
|
DL_FREQUENCY_IN_MHZ: 2680
|
||||||
|
UL_FREQUENCY_OFFSET_IN_MHZ: 120
|
||||||
|
NID_CELL: 0
|
||||||
|
NB_PRB: 25
|
||||||
|
ENABLE_MEASUREMENT_REPORTS: 'yes'
|
||||||
|
ENABLE_X2: 'yes'
|
||||||
|
MME_S1C_IP_ADDRESS: 192.168.18.210
|
||||||
|
ENB_S1C_IF_NAME: eth0
|
||||||
|
ENB_S1C_IP_ADDRESS: 192.168.68.130
|
||||||
|
ENB_S1U_IF_NAME: eth0
|
||||||
|
ENB_S1U_IP_ADDRESS: 192.168.68.130
|
||||||
|
ENB_X2_IP_ADDRESS: 192.168.68.130
|
||||||
|
RRC_INACTIVITY_THRESHOLD: 0
|
||||||
|
FLEXRAN_ENABLED: 'no'
|
||||||
|
FLEXRAN_INTERFACE_NAME: eth0
|
||||||
|
FLEXRAN_IPV4_ADDRESS: 192.168.18.210
|
||||||
|
THREAD_PARALLEL_CONFIG: PARALLEL_SINGLE_THREAD
|
||||||
|
volumes:
|
||||||
|
- /dev:/dev
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.68.130
|
||||||
|
healthcheck:
|
||||||
|
# pgrep does NOT work
|
||||||
|
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
name: nsa-b200-enb-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.68.128/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "nsa-enb-net"
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
gnb_mono_tdd:
|
||||||
|
image: oai-gnb:latest
|
||||||
|
privileged: true
|
||||||
|
container_name: nsa-b200-gnb
|
||||||
|
environment:
|
||||||
|
USE_NSA_TDD_MONO: 'yes'
|
||||||
|
USE_B2XX: 'yes'
|
||||||
|
GNB_NAME: gNB-in-docker
|
||||||
|
MCC: '222'
|
||||||
|
MNC: '01'
|
||||||
|
MNC_LENGTH: 2
|
||||||
|
TAC: 1
|
||||||
|
ENABLE_X2: 'yes'
|
||||||
|
ENB_X2_IP_ADDRESS: 192.168.68.130
|
||||||
|
MME_S1C_IP_ADDRESS: 192.168.18.210
|
||||||
|
GNB_S1C_IF_NAME: eth0
|
||||||
|
GNB_S1C_IP_ADDRESS: 192.168.68.194
|
||||||
|
GNB_S1U_IF_NAME: eth0
|
||||||
|
GNB_S1U_IP_ADDRESS: 192.168.68.194
|
||||||
|
GNB_X2_IP_ADDRESS: 192.168.68.194
|
||||||
|
RRC_INACTIVITY_THRESHOLD: 0
|
||||||
|
FLEXRAN_ENABLED: 'no'
|
||||||
|
FLEXRAN_INTERFACE_NAME: eth0
|
||||||
|
FLEXRAN_IPV4_ADDRESS: 192.168.18.210
|
||||||
|
THREAD_PARALLEL_CONFIG: PARALLEL_RU_L1_TRX_SPLIT
|
||||||
|
USE_ADDITIONAL_OPTIONS: -E -q --RUs.[0].sdr_addrs serial=30C51D4
|
||||||
|
volumes:
|
||||||
|
- /dev:/dev
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.68.194
|
||||||
|
#entrypoint: /bin/bash -c "sleep infinity"
|
||||||
|
healthcheck:
|
||||||
|
# pgrep does NOT work
|
||||||
|
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
name: nsa-b200-gnb-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.68.192/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "nsa-gnb-net"
|
||||||
@@ -60,6 +60,13 @@ elseif (${RF_BOARD} STREQUAL "OAI_IRIS")
|
|||||||
LINK_DIRECTORIES("/usr/local/lib")
|
LINK_DIRECTORIES("/usr/local/lib")
|
||||||
set(option_HW_lib "-lSoapySDR -rdynamic -ldl")
|
set(option_HW_lib "-lSoapySDR -rdynamic -ldl")
|
||||||
|
|
||||||
|
elseif (${RF_BOARD} STREQUAL "OAI_AW2SORI")
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/AW2SORI")
|
||||||
|
set(HW_SOURCE ${HW_SOURCE}
|
||||||
|
${OPENAIR_TARGETS}/ARCH/AW2SORI/ARCH/AW2SORI/oaiori.c)
|
||||||
|
LINK_DIRECTORIES("/usr/local/lib")
|
||||||
|
set(openair_HW_lib "-shared -fPIC -msse4 -g -ggdb -lori")
|
||||||
|
|
||||||
endif (${RF_BOARD} STREQUAL "OAI_USRP")
|
endif (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||||
|
|
||||||
message("RU=${RU}")
|
message("RU=${RU}")
|
||||||
@@ -309,6 +316,7 @@ endif()
|
|||||||
|
|
||||||
#
|
#
|
||||||
# add autotools definitions that were maybe used!
|
# add autotools definitions that were maybe used!
|
||||||
|
|
||||||
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
|
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
|
||||||
|
|
||||||
set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
|
set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
|
||||||
@@ -318,11 +326,7 @@ set(CMAKE_C_FLAGS
|
|||||||
set(CMAKE_CXX_FLAGS
|
set(CMAKE_CXX_FLAGS
|
||||||
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=c++11")
|
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=c++11")
|
||||||
|
|
||||||
# cuda compiler bug (limitation) on complex macro definition
|
|
||||||
if (CUDA_FOUND)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCUDA_FLAG")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCUDA_FLAG")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (SANITIZE_ADDRESS)
|
if (SANITIZE_ADDRESS)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-common")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-common")
|
||||||
@@ -332,11 +336,11 @@ endif ()
|
|||||||
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ggdb3 -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ggdb2 -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
#########################
|
#########################
|
||||||
# set a flag for changes in the source code
|
# set a flag for changes in the source code
|
||||||
# these changes are related to hardcoded path to include .h files
|
# these changes are related to hardcoded path to include .h files
|
||||||
set(debugOpt "-ggdb3 -DMALLOC_CHECK_=3 -fno-delete-null-pointer-checks")
|
set(debugOpt "-ggdb2 -DMALLOC_CHECK_=3 -fno-delete-null-pointer-checks")
|
||||||
set(CMAKE_C_FLAGS_DEBUG "${debugOpt} -O0")
|
set(CMAKE_C_FLAGS_DEBUG "${debugOpt} -O0")
|
||||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${debugOpt} -O2")
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${debugOpt} -O2")
|
||||||
set(CMAKE_C_FLAGS_RELEASE "-O3")
|
set(CMAKE_C_FLAGS_RELEASE "-O3")
|
||||||
@@ -897,6 +901,7 @@ add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} )
|
|||||||
target_include_directories(oai_lmssdrdevif PRIVATE /usr/local/include/lime)
|
target_include_directories(oai_lmssdrdevif PRIVATE /usr/local/include/lime)
|
||||||
target_link_libraries(oai_lmssdrdevif LimeSuite )
|
target_link_libraries(oai_lmssdrdevif LimeSuite )
|
||||||
|
|
||||||
|
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/")
|
include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/")
|
||||||
set(TPLIB_ETHERNET_SOURCE
|
set(TPLIB_ETHERNET_SOURCE
|
||||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
||||||
@@ -905,6 +910,15 @@ set(TPLIB_ETHERNET_SOURCE
|
|||||||
)
|
)
|
||||||
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
|
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
|
||||||
|
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/AW2SORI/")
|
||||||
|
link_directories("/usr/local/lib")
|
||||||
|
set(HWLIB_AW2SORI_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/AW2SORI/oaiori.c
|
||||||
|
)
|
||||||
|
add_library(aw2sori_transpro MODULE ${HWLIB_AW2SORI_SOURCE})
|
||||||
|
target_compile_options(aw2sori_transpro PRIVATE -shared -fPIC -msse4 -g -ggdb -DLITE_COMPILATION)
|
||||||
|
target_link_libraries(aw2sori_transpro libori.so)
|
||||||
|
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
|
include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
|
||||||
set(option_HWIRISLIB_lib "-l SoapySDR")
|
set(option_HWIRISLIB_lib "-l SoapySDR")
|
||||||
set(HWLIB_IRIS_SOURCE
|
set(HWLIB_IRIS_SOURCE
|
||||||
@@ -985,8 +999,6 @@ Message("CPU_Affinity flag is ${CPU_AFFINITY}")
|
|||||||
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
|
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
add_boolean_option(NO_RRM True "DO WE HAVE A RADIO RESSOURCE MANAGER: NO")
|
|
||||||
|
|
||||||
add_boolean_option(OAI_NW_DRIVER_TYPE_ETHERNET False "????")
|
add_boolean_option(OAI_NW_DRIVER_TYPE_ETHERNET False "????")
|
||||||
add_boolean_option(DEADLINE_SCHEDULER False "Use the Linux scheduler SCHED_DEADLINE: kernel >= 3.14")
|
add_boolean_option(DEADLINE_SCHEDULER False "Use the Linux scheduler SCHED_DEADLINE: kernel >= 3.14")
|
||||||
add_boolean_option(CPU_AFFINITY False "Enable CPU Affinity of threads (only valid without deadline scheduler). It is enabled only with >2 CPUs")
|
add_boolean_option(CPU_AFFINITY False "Enable CPU Affinity of threads (only valid without deadline scheduler). It is enabled only with >2 CPUs")
|
||||||
@@ -1047,7 +1059,6 @@ add_boolean_option(JUMBO_FRAME True "ENABLE LARGE SDU in ACCESS STR
|
|||||||
##########################
|
##########################
|
||||||
# RLC LAYER OPTIONS
|
# RLC LAYER OPTIONS
|
||||||
##########################
|
##########################
|
||||||
add_boolean_option(OPENAIR2 True "Access Stratum layer 2 built in executable")
|
|
||||||
add_boolean_option(TRACE_RLC_PAYLOAD False "Fatal assert in this case")
|
add_boolean_option(TRACE_RLC_PAYLOAD False "Fatal assert in this case")
|
||||||
add_boolean_option(RLC_STOP_ON_LOST_PDU False "Fatal assert in this case")
|
add_boolean_option(RLC_STOP_ON_LOST_PDU False "Fatal assert in this case")
|
||||||
|
|
||||||
@@ -1075,8 +1086,6 @@ add_boolean_option(TRACE_RLC_UM_TX_STATUS False "TRACE for RLC UM, TO BE CHANGE
|
|||||||
##########################
|
##########################
|
||||||
# PDCP LAYER OPTIONS
|
# PDCP LAYER OPTIONS
|
||||||
##########################
|
##########################
|
||||||
#add_boolean_option(PDCP_USE_NETLINK False "For eNB, PDCP communicate with a NETLINK socket if connected to network driver, else could use a RT-FIFO")
|
|
||||||
#add_boolean_option(PDCP_USE_NETLINK_QUEUES False "When PDCP_USE_NETLINK is true, incoming IP packets are stored in queues")
|
|
||||||
#add_boolean_option(LINK_ENB_PDCP_TO_IP_DRIVER False "For eNB, PDCP communicate with a IP driver")
|
#add_boolean_option(LINK_ENB_PDCP_TO_IP_DRIVER False "For eNB, PDCP communicate with a IP driver")
|
||||||
#add_boolean_option(LINK_ENB_PDCP_TO_GTPV1U True "For eNB, PDCP communicate with GTP-U protocol (eNB<->S-GW)")
|
#add_boolean_option(LINK_ENB_PDCP_TO_GTPV1U True "For eNB, PDCP communicate with GTP-U protocol (eNB<->S-GW)")
|
||||||
|
|
||||||
@@ -1590,6 +1599,16 @@ set(PHY_LDPC_OPTIM8SEGMULTI_SRC
|
|||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
|
||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
||||||
)
|
)
|
||||||
|
set(PHY_LDPC_CUDA_SRC
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(PHY_LDPC_CL_SRC
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
||||||
|
)
|
||||||
|
|
||||||
set(PHY_NR_CODINGIF
|
set(PHY_NR_CODINGIF
|
||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c;
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c;
|
||||||
)
|
)
|
||||||
@@ -1597,8 +1616,18 @@ set(PHY_NR_CODINGIF
|
|||||||
add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} )
|
add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} )
|
||||||
add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
|
add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
|
||||||
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
||||||
|
add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} )
|
||||||
|
target_link_libraries(ldpc_cl OpenCL)
|
||||||
|
|
||||||
|
if (CUDA_FOUND)
|
||||||
|
cuda_add_library(ldpc_cuda MODULE ${PHY_LDPC_CUDA_SRC} )
|
||||||
|
set_target_properties(ldpc_cuda PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
|
||||||
|
# CUDA_ADD_CUFFT_TO_TARGET(ldpc_cuda)
|
||||||
|
endif (CUDA_FOUND)
|
||||||
|
|
||||||
add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} )
|
add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} )
|
||||||
|
|
||||||
|
|
||||||
add_library(coding MODULE ${PHY_TURBOSRC} )
|
add_library(coding MODULE ${PHY_TURBOSRC} )
|
||||||
|
|
||||||
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c )
|
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c )
|
||||||
@@ -1744,7 +1773,6 @@ set(PHY_SRC_UE
|
|||||||
|
|
||||||
set(PHY_NR_SRC_COMMON
|
set(PHY_NR_SRC_COMMON
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools_common.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_NR_SRC
|
set(PHY_NR_SRC
|
||||||
@@ -1983,6 +2011,10 @@ set(NR_PDCP_SRC
|
|||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set(NR_SDAP_SRC
|
||||||
|
${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap_gnb.c
|
||||||
|
)
|
||||||
|
|
||||||
set(L2_SRC
|
set(L2_SRC
|
||||||
${PDCP_DIR}/pdcp.c
|
${PDCP_DIR}/pdcp.c
|
||||||
${PDCP_DIR}/pdcp_fifo.c
|
${PDCP_DIR}/pdcp_fifo.c
|
||||||
@@ -2026,6 +2058,7 @@ set(L2_LTE_SRC
|
|||||||
set(L2_NR_SRC
|
set(L2_NR_SRC
|
||||||
${NR_RLC_SRC}
|
${NR_RLC_SRC}
|
||||||
${NR_PDCP_SRC}
|
${NR_PDCP_SRC}
|
||||||
|
${NR_SDAP_SRC}
|
||||||
${NR_RRC_DIR}/rrc_gNB.c
|
${NR_RRC_DIR}/rrc_gNB.c
|
||||||
${NR_RRC_DIR}/nr_rrc_common.c
|
${NR_RRC_DIR}/nr_rrc_common.c
|
||||||
${NR_RRC_DIR}/L2_nr_interface.c
|
${NR_RRC_DIR}/L2_nr_interface.c
|
||||||
@@ -2061,6 +2094,7 @@ set(L2_RRC_SRC_UE
|
|||||||
set(NR_L2_SRC_UE
|
set(NR_L2_SRC_UE
|
||||||
${NR_RLC_SRC}
|
${NR_RLC_SRC}
|
||||||
${NR_PDCP_SRC}
|
${NR_PDCP_SRC}
|
||||||
|
${NR_SDAP_SRC}
|
||||||
${NR_UE_RRC_DIR}/L2_interface_ue.c
|
${NR_UE_RRC_DIR}/L2_interface_ue.c
|
||||||
${NR_UE_RRC_DIR}/main_ue.c
|
${NR_UE_RRC_DIR}/main_ue.c
|
||||||
${NR_UE_RRC_DIR}/rrc_UE.c
|
${NR_UE_RRC_DIR}/rrc_UE.c
|
||||||
@@ -3113,7 +3147,11 @@ target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES})
|
|||||||
target_link_libraries (nr-uesoftmodem ${T_LIB})
|
target_link_libraries (nr-uesoftmodem ${T_LIB})
|
||||||
|
|
||||||
add_dependencies( nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
add_dependencies( nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
||||||
|
if (CUDA_FOUND)
|
||||||
|
add_dependencies( nr-uesoftmodem ldpc_cuda)
|
||||||
|
add_dependencies( nr-softmodem ldpc_cuda)
|
||||||
|
add_dependencies( ocp-gnb ldpc_cuda)
|
||||||
|
endif (CUDA_FOUND)
|
||||||
###################################"
|
###################################"
|
||||||
# Addexecutables for tests
|
# Addexecutables for tests
|
||||||
####################################
|
####################################
|
||||||
@@ -3173,46 +3211,18 @@ target_link_libraries(smallblocktest
|
|||||||
m pthread ${ATLAS_LIBRARIES} dl
|
m pthread ${ATLAS_LIBRARIES} dl
|
||||||
)
|
)
|
||||||
|
|
||||||
if (CUDA_FOUND)
|
|
||||||
###################################################
|
|
||||||
# For CUDA library
|
|
||||||
###################################################
|
|
||||||
|
|
||||||
CUDA_ADD_LIBRARY(LDPC_CU
|
add_executable(ldpctest
|
||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu
|
${PHY_NR_CODINGIF}
|
||||||
)
|
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
|
||||||
CUDA_ADD_CUFFT_TO_TARGET(LDPC_CU)
|
${T_SOURCE}
|
||||||
cuda_add_executable(ldpctest
|
${SHLIB_LOADER_SOURCES}
|
||||||
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
|
)
|
||||||
${T_SOURCE}
|
|
||||||
${SHLIB_LOADER_SOURCES}
|
|
||||||
)
|
|
||||||
target_link_libraries(ldpctest -ldl
|
|
||||||
-Wl,--start-group
|
|
||||||
LDPC_CU UTIL SIMU PHY_NR CONFIG_LIB
|
|
||||||
-Wl,--end-group
|
|
||||||
m pthread ${ATLAS_LIBRARIES} dl
|
|
||||||
)
|
|
||||||
|
|
||||||
else (CUDA_FOUND)
|
|
||||||
add_executable(ldpctest
|
|
||||||
${PHY_NR_CODINGIF}
|
|
||||||
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
|
|
||||||
${T_SOURCE}
|
|
||||||
${SHLIB_LOADER_SOURCES}
|
|
||||||
)
|
|
||||||
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
|
|
||||||
# add_executable(ldpctest
|
|
||||||
# ${PHY_NR_CODINGIF}
|
|
||||||
# ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
|
|
||||||
# ${T_SOURCE}
|
|
||||||
# ${SHLIB_LOADER_SOURCES}
|
|
||||||
# )
|
|
||||||
add_dependencies( ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
add_dependencies( ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
||||||
|
if (CUDA_FOUND)
|
||||||
|
add_dependencies( ldpctest ldpc_cuda)
|
||||||
|
endif (CUDA_FOUND)
|
||||||
target_link_libraries(ldpctest
|
target_link_libraries(ldpctest
|
||||||
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
|
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
|
||||||
m pthread ${ATLAS_LIBRARIES} dl
|
m pthread ${ATLAS_LIBRARIES} dl
|
||||||
|
|||||||
+11
-3
@@ -118,7 +118,7 @@ Options
|
|||||||
-a | --agent
|
-a | --agent
|
||||||
Enables agent for software-defined control of the eNB
|
Enables agent for software-defined control of the eNB
|
||||||
-w | --hardware
|
-w | --hardware
|
||||||
EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, None (Default)
|
EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, AW2SORI, None (Default)
|
||||||
Adds this RF board support (in external packages installation and in compilation)
|
Adds this RF board support (in external packages installation and in compilation)
|
||||||
-P | --phy_simulators
|
-P | --phy_simulators
|
||||||
Makes the unitary tests Layer 1 simulators
|
Makes the unitary tests Layer 1 simulators
|
||||||
@@ -293,7 +293,7 @@ function main() {
|
|||||||
"EXMIMO")
|
"EXMIMO")
|
||||||
HW="EXMIMO"
|
HW="EXMIMO"
|
||||||
;;
|
;;
|
||||||
"USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "ADRV9371_ZC706" | "SIMU")
|
"USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "ADRV9371_ZC706" | "SIMU" | "AW2SORI")
|
||||||
HW="OAI_"$2
|
HW="OAI_"$2
|
||||||
;;
|
;;
|
||||||
"None")
|
"None")
|
||||||
@@ -551,7 +551,7 @@ function main() {
|
|||||||
if [ "$HW" == "OAI_USRP" ] ; then
|
if [ "$HW" == "OAI_USRP" ] ; then
|
||||||
echo_info "installing packages for USRP support"
|
echo_info "installing packages for USRP support"
|
||||||
check_install_usrp_uhd_driver
|
check_install_usrp_uhd_driver
|
||||||
if [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
|
if [ ! -v BUILD_UHD_FROM_SOURCE ] && [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
|
||||||
install_usrp_uhd_driver $UHD_IMAGES_DIR
|
install_usrp_uhd_driver $UHD_IMAGES_DIR
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -931,6 +931,14 @@ function main() {
|
|||||||
echo_error "== FAILED == Unexpected Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN"
|
echo_error "== FAILED == Unexpected Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN"
|
||||||
fi
|
fi
|
||||||
echo_info "liboai_device.so is linked to ADRV9371_ZC706 device library for Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN"
|
echo_info "liboai_device.so is linked to ADRV9371_ZC706 device library for Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN"
|
||||||
|
elif [ "$HW" == "OAI_AW2SORI" ] ; then
|
||||||
|
compilations \
|
||||||
|
$build_dir aw2sori_transpro \
|
||||||
|
libaw2sori_transpro.so $dbin/libaw2sori_transpro.so.$REL
|
||||||
|
|
||||||
|
ln -sf libaw2sori_transpro.so libthirdparty_transpro.so
|
||||||
|
ln -sf $dbin/libaw2sori_transpro.so.$REL $dbin/libaw2sori_transpro.so
|
||||||
|
echo_info "build libthirdparty_transpro.so for AW2SORI fronthaul"
|
||||||
else
|
else
|
||||||
echo_info "liboai_device.so is not linked to any device library"
|
echo_info "liboai_device.so is not linked to any device library"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -117,6 +117,9 @@ check_supported_distribution() {
|
|||||||
"rhel8.2") return 0 ;;
|
"rhel8.2") return 0 ;;
|
||||||
"rhel8.3") return 0 ;;
|
"rhel8.3") return 0 ;;
|
||||||
"rhel8.4") return 0 ;;
|
"rhel8.4") return 0 ;;
|
||||||
|
"rhel8.5") return 0 ;;
|
||||||
|
"rhel8.6") return 0 ;;
|
||||||
|
"rhel8.7") return 0 ;;
|
||||||
"centos7") return 0 ;;
|
"centos7") return 0 ;;
|
||||||
esac
|
esac
|
||||||
return 1
|
return 1
|
||||||
@@ -317,19 +320,30 @@ install_usrp_uhd_driver_from_source(){
|
|||||||
echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log "
|
echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log "
|
||||||
(
|
(
|
||||||
pushd /tmp
|
pushd /tmp
|
||||||
echo "Downloading UHD driver"
|
echo "Cloning UHD driver repository"
|
||||||
rm -rf /tmp/uhd
|
rm -rf /tmp/uhd
|
||||||
git clone https://github.com/EttusResearch/uhd.git
|
git clone https://github.com/EttusResearch/uhd.git
|
||||||
cd uhd
|
cd uhd
|
||||||
git checkout tags/v4.0.0.0
|
if [[ -v UHD_VERSION ]]; then
|
||||||
|
git checkout tags/v${UHD_VERSION}
|
||||||
|
else
|
||||||
|
git checkout tags/v4.0.0.0
|
||||||
|
fi
|
||||||
mkdir -p host/build
|
mkdir -p host/build
|
||||||
cd host/build
|
cd host/build || true
|
||||||
$CMAKE ../
|
$CMAKE ../ -GNinja
|
||||||
echo "Compiling UHD"
|
echo "Compiling UHD"
|
||||||
make -j`nproc`
|
ninja
|
||||||
make test
|
$SUDO ninja install
|
||||||
$SUDO make install
|
|
||||||
$SUDO ldconfig -v
|
$SUDO ldconfig -v
|
||||||
|
if [ $IS_CONTAINER -eq 0 ]; then
|
||||||
|
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||||
|
$SUDO /usr/local/lib/uhd/utils/uhd_images_downloader.py
|
||||||
|
fi
|
||||||
|
if [[ "$OS_DISTRO" == "rhel" ]]; then
|
||||||
|
$SUDO /usr/local/lib64/uhd/utils/uhd_images_downloader.py
|
||||||
|
fi
|
||||||
|
fi
|
||||||
popd
|
popd
|
||||||
rm -rf /tmp/uhd
|
rm -rf /tmp/uhd
|
||||||
) >& $uhd_install_log
|
) >& $uhd_install_log
|
||||||
@@ -338,10 +352,26 @@ install_usrp_uhd_driver_from_source(){
|
|||||||
check_install_usrp_uhd_driver(){
|
check_install_usrp_uhd_driver(){
|
||||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||||
#first we remove old installation
|
#first we remove old installation
|
||||||
$SUDO apt-get remove -y uhd || true
|
$SUDO apt-get remove uhd -y || true
|
||||||
$SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y || true
|
$SUDO apt-get remove uhd-host -y || true
|
||||||
|
$SUDO apt-get remove libuhd-dev -y || true
|
||||||
|
$SUDO apt-get remove libuhd003 -y || true
|
||||||
|
$SUDO apt-get remove libuhd3.13.1 -y || true
|
||||||
|
$SUDO apt-get remove libuhd3.14.0 -y || true
|
||||||
|
$SUDO apt-get remove libuhd3.14.1 -y || true
|
||||||
|
$SUDO apt-get remove libuhd3.15.0 -y || true
|
||||||
|
local distribution=$(get_distribution_release)
|
||||||
|
if [[ "$distribution" == "ubuntu18.04" ]]; then
|
||||||
|
$SUDO apt-get remove libuhd4.0.0 -y || true
|
||||||
|
$SUDO apt-get remove libuhd4.1.0 -y || true
|
||||||
|
fi
|
||||||
v=$(lsb_release -cs)
|
v=$(lsb_release -cs)
|
||||||
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
|
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
|
||||||
|
if [[ -v BUILD_UHD_FROM_SOURCE ]]; then
|
||||||
|
$SUDO apt-get install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-setuptools ninja-build
|
||||||
|
install_usrp_uhd_driver_from_source
|
||||||
|
return
|
||||||
|
fi
|
||||||
# The new USRP repository
|
# The new USRP repository
|
||||||
# Raphael Defosseux: Adding a loop on adding PPA because in CI the gpg key retrieve may
|
# Raphael Defosseux: Adding a loop on adding PPA because in CI the gpg key retrieve may
|
||||||
# timeout due to proxy / network latencies in Eurecom on VM
|
# timeout due to proxy / network latencies in Eurecom on VM
|
||||||
@@ -361,7 +391,12 @@ check_install_usrp_uhd_driver(){
|
|||||||
done
|
done
|
||||||
$SUDO apt-get update
|
$SUDO apt-get update
|
||||||
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
|
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
|
||||||
$SUDO apt-get -y install libuhd-dev libuhd003 uhd-host
|
if [[ "$distribution" == "ubuntu16.04" ]]; then
|
||||||
|
$SUDO apt-get -y install libuhd-dev libuhd3.15.0 uhd-host
|
||||||
|
fi
|
||||||
|
if [[ "$distribution" == "ubuntu18.04" ]]; then
|
||||||
|
$SUDO apt-get -y install libuhd-dev libuhd4.1.0 uhd-host
|
||||||
|
fi
|
||||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
if [ $IS_CONTAINER -eq 0 ]
|
||||||
then
|
then
|
||||||
@@ -692,6 +727,7 @@ check_install_oai_software() {
|
|||||||
build-essential \
|
build-essential \
|
||||||
$CMAKE \
|
$CMAKE \
|
||||||
cmake-curses-gui \
|
cmake-curses-gui \
|
||||||
|
curl \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
doxygen \
|
doxygen \
|
||||||
doxygen-gui \
|
doxygen-gui \
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
|
|||||||
* If the farray pointer is null, looks for `< modname >_getfarray` symbol, calls the corresponding function when the symbol is found. `< modname >_getfarray` takes one argument, a pointer to a `loader_shlibfunc_t` array, and returns the number of items in this array, as defined by the `getfarrayfunc_t` type. The `loader_shlibfunc_t` array returned by the shared library must be fully filled (both `fname` and `fptr` fields).
|
* If the farray pointer is null, looks for `< modname >_getfarray` symbol, calls the corresponding function when the symbol is found. `< modname >_getfarray` takes one argument, a pointer to a `loader_shlibfunc_t` array, and returns the number of items in this array, as defined by the `getfarrayfunc_t` type. The `loader_shlibfunc_t` array returned by the shared library must be fully filled (both `fname` and `fptr` fields).
|
||||||
* looks for the `numf` function symbols listed in the `farray[i].fname` arguments and set the corresponding `farray[i].fptr`function pointers
|
* looks for the `numf` function symbols listed in the `farray[i].fname` arguments and set the corresponding `farray[i].fptr`function pointers
|
||||||
|
|
||||||
|
```c
|
||||||
|
int load_module_version_shlib(char *modname, char *version, loader_shlibfunc_t *farray, int numf)
|
||||||
|
```
|
||||||
|
Allows loading a specific library version, as specified by the `version` parameter. When version is not NULL the version that is possibly specified as a config module parameter is ignored. This call has been introduced for phy simulators executables which do not use the config module. It is used, for example, by the ldcp initialization (`load_nrLDPClib` function in [nrLDPC_load.c](../../../../../openair1/PHY/CODING/nrLDPC_load.c) to allow the `ldpctest` simulator to select the cuda accelerated ldcp implementation. `load_module_shlib` is just a define macro to switch to a `load_module_version_shlib` call, adding a NULL pointer for the version parameter.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void * get_shlibmodule_fptr(char *modname, char *fname)
|
void * get_shlibmodule_fptr(char *modname, char *fname)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include"log.h"
|
#include "log.h"
|
||||||
|
|
||||||
extern log_t *g_log;
|
extern log_t *g_log;
|
||||||
|
|
||||||
|
|||||||
@@ -155,6 +155,10 @@ ID = GNB_MAC_DL_RAR_PDU_WITH_DATA
|
|||||||
DESC = NR MAC downlink PDU for RAR
|
DESC = NR MAC downlink PDU for RAR
|
||||||
GROUP = ALL:MAC:GNB:WIRESHARK
|
GROUP = ALL:MAC:GNB:WIRESHARK
|
||||||
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : buffer,data
|
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : buffer,data
|
||||||
|
ID = GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA
|
||||||
|
DESC = NR MAC downlink retransmitted PDU for an UE
|
||||||
|
GROUP = ALL:MAC:GNB:WIRESHARK
|
||||||
|
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : int,round : buffer,data
|
||||||
|
|
||||||
#RLC logs
|
#RLC logs
|
||||||
ID = ENB_RLC_DL
|
ID = ENB_RLC_DL
|
||||||
|
|||||||
@@ -59,12 +59,20 @@ typedef struct {
|
|||||||
int nr_ul_rnti;
|
int nr_ul_rnti;
|
||||||
int nr_ul_frame;
|
int nr_ul_frame;
|
||||||
int nr_ul_slot;
|
int nr_ul_slot;
|
||||||
|
int nr_ul_harq_pid;
|
||||||
int nr_ul_data;
|
int nr_ul_data;
|
||||||
/* NR dl */
|
/* NR dl */
|
||||||
int nr_dl_rnti;
|
int nr_dl_rnti;
|
||||||
int nr_dl_frame;
|
int nr_dl_frame;
|
||||||
int nr_dl_slot;
|
int nr_dl_slot;
|
||||||
|
int nr_dl_harq_pid;
|
||||||
int nr_dl_data;
|
int nr_dl_data;
|
||||||
|
/* NR dl retx */
|
||||||
|
int nr_dl_retx_rnti;
|
||||||
|
int nr_dl_retx_frame;
|
||||||
|
int nr_dl_retx_slot;
|
||||||
|
int nr_dl_retx_harq_pid;
|
||||||
|
int nr_dl_retx_data;
|
||||||
/* NR mib */
|
/* NR mib */
|
||||||
int nr_mib_frame;
|
int nr_mib_frame;
|
||||||
int nr_mib_slot;
|
int nr_mib_slot;
|
||||||
@@ -254,6 +262,7 @@ void sr(void *_d, event e)
|
|||||||
#define MAC_NR_PAYLOAD_TAG 0x01
|
#define MAC_NR_PAYLOAD_TAG 0x01
|
||||||
#define MAC_NR_RNTI_TAG 0x02
|
#define MAC_NR_RNTI_TAG 0x02
|
||||||
#define MAC_NR_UEID_TAG 0x03
|
#define MAC_NR_UEID_TAG 0x03
|
||||||
|
#define MAC_NR_HARQID 0x06
|
||||||
#define MAC_NR_FRAME_SLOT_TAG 0x07
|
#define MAC_NR_FRAME_SLOT_TAG 0x07
|
||||||
|
|
||||||
#define NR_FDD_RADIO 1
|
#define NR_FDD_RADIO 1
|
||||||
@@ -267,7 +276,8 @@ void sr(void *_d, event e)
|
|||||||
#define NR_C_RNTI 3
|
#define NR_C_RNTI 3
|
||||||
|
|
||||||
void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
|
void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
|
||||||
int frame, int slot, void *buf, int bufsize, int preamble)
|
int frame, int slot, int harq_pid, void *buf, int bufsize,
|
||||||
|
int preamble)
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
int i;
|
int i;
|
||||||
@@ -307,6 +317,8 @@ void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
|
|||||||
PUTC(&d->buf, frame & 255);
|
PUTC(&d->buf, frame & 255);
|
||||||
PUTC(&d->buf, (slot>>8) & 255);
|
PUTC(&d->buf, (slot>>8) & 255);
|
||||||
PUTC(&d->buf, slot & 255);
|
PUTC(&d->buf, slot & 255);
|
||||||
|
PUTC(&d->buf, MAC_NR_HARQID);
|
||||||
|
PUTC(&d->buf, harq_pid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PUTC(&d->buf, MAC_NR_PAYLOAD_TAG);
|
PUTC(&d->buf, MAC_NR_PAYLOAD_TAG);
|
||||||
@@ -326,7 +338,8 @@ void nr_ul(void *_d, event e)
|
|||||||
|
|
||||||
trace_nr(d, NR_DIRECTION_UPLINK, NR_C_RNTI, e.e[d->nr_ul_rnti].i,
|
trace_nr(d, NR_DIRECTION_UPLINK, NR_C_RNTI, e.e[d->nr_ul_rnti].i,
|
||||||
e.e[d->nr_ul_frame].i, e.e[d->nr_ul_slot].i,
|
e.e[d->nr_ul_frame].i, e.e[d->nr_ul_slot].i,
|
||||||
e.e[d->nr_ul_data].b, e.e[d->nr_ul_data].bsize, NO_PREAMBLE);
|
e.e[d->nr_ul_harq_pid].i, e.e[d->nr_ul_data].b,
|
||||||
|
e.e[d->nr_ul_data].bsize, NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_dl(void *_d, event e)
|
void nr_dl(void *_d, event e)
|
||||||
@@ -335,7 +348,18 @@ void nr_dl(void *_d, event e)
|
|||||||
|
|
||||||
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_rnti].i,
|
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_rnti].i,
|
||||||
e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
|
e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
|
||||||
e.e[d->nr_dl_data].b, e.e[d->nr_dl_data].bsize, NO_PREAMBLE);
|
e.e[d->nr_dl_harq_pid].i, e.e[d->nr_dl_data].b,
|
||||||
|
e.e[d->nr_dl_data].bsize, NO_PREAMBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_dl_retx(void *_d, event e)
|
||||||
|
{
|
||||||
|
ev_data *d = _d;
|
||||||
|
|
||||||
|
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_retx_rnti].i,
|
||||||
|
e.e[d->nr_dl_retx_frame].i, e.e[d->nr_dl_retx_slot].i,
|
||||||
|
e.e[d->nr_dl_retx_harq_pid].i, e.e[d->nr_dl_retx_data].b,
|
||||||
|
e.e[d->nr_dl_retx_data].bsize, NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_mib(void *_d, event e)
|
void nr_mib(void *_d, event e)
|
||||||
@@ -349,7 +373,7 @@ void nr_mib(void *_d, event e)
|
|||||||
d->cur_mib++;
|
d->cur_mib++;
|
||||||
|
|
||||||
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_NO_RNTI, 0,
|
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_NO_RNTI, 0,
|
||||||
e.e[d->nr_mib_frame].i, e.e[d->nr_mib_slot].i,
|
e.e[d->nr_mib_frame].i, e.e[d->nr_mib_slot].i, 0 /* harq pid */,
|
||||||
e.e[d->nr_mib_data].b, e.e[d->nr_mib_data].bsize, NO_PREAMBLE);
|
e.e[d->nr_mib_data].b, e.e[d->nr_mib_data].bsize, NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +382,7 @@ void nr_rar(void *_d, event e)
|
|||||||
ev_data *d = _d;
|
ev_data *d = _d;
|
||||||
|
|
||||||
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_RA_RNTI, e.e[d->nr_rar_rnti].i,
|
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_RA_RNTI, e.e[d->nr_rar_rnti].i,
|
||||||
e.e[d->nr_rar_frame].i, e.e[d->nr_rar_slot].i,
|
e.e[d->nr_rar_frame].i, e.e[d->nr_rar_slot].i, 0 /* harq pid */,
|
||||||
e.e[d->nr_rar_data].b, e.e[d->nr_rar_data].bsize, NO_PREAMBLE);
|
e.e[d->nr_rar_data].b, e.e[d->nr_rar_data].bsize, NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,47 +391,55 @@ void nr_rar(void *_d, event e)
|
|||||||
|
|
||||||
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
||||||
int preamble_id, int rar_id, int sr_id,
|
int preamble_id, int rar_id, int sr_id,
|
||||||
int nr_ul_id, int nr_dl_id, int nr_mib_id, int nr_rar_id)
|
int nr_ul_id, int nr_dl_id, int nr_dl_retx_id, int nr_mib_id,
|
||||||
|
int nr_rar_id)
|
||||||
{
|
{
|
||||||
database_event_format f;
|
database_event_format f;
|
||||||
int i;
|
int i;
|
||||||
d->ul_rnti = -1;
|
d->ul_rnti = -1;
|
||||||
d->ul_frame = -1;
|
d->ul_frame = -1;
|
||||||
d->ul_subframe = -1;
|
d->ul_subframe = -1;
|
||||||
d->ul_data = -1;
|
d->ul_data = -1;
|
||||||
d->dl_rnti = -1;
|
d->dl_rnti = -1;
|
||||||
d->dl_frame = -1;
|
d->dl_frame = -1;
|
||||||
d->dl_subframe = -1;
|
d->dl_subframe = -1;
|
||||||
d->dl_data = -1;
|
d->dl_data = -1;
|
||||||
d->mib_frame = -1;
|
d->mib_frame = -1;
|
||||||
d->mib_subframe = -1;
|
d->mib_subframe = -1;
|
||||||
d->mib_data = -1;
|
d->mib_data = -1;
|
||||||
d->preamble_frame = -1;
|
d->preamble_frame = -1;
|
||||||
d->preamble_subframe = -1;
|
d->preamble_subframe = -1;
|
||||||
d->preamble_preamble = -1;
|
d->preamble_preamble = -1;
|
||||||
d->rar_rnti = -1;
|
d->rar_rnti = -1;
|
||||||
d->rar_frame = -1;
|
d->rar_frame = -1;
|
||||||
d->rar_subframe = -1;
|
d->rar_subframe = -1;
|
||||||
d->rar_data = -1;
|
d->rar_data = -1;
|
||||||
d->sr_rnti = -1;
|
d->sr_rnti = -1;
|
||||||
d->sr_frame = -1;
|
d->sr_frame = -1;
|
||||||
d->sr_subframe = -1;
|
d->sr_subframe = -1;
|
||||||
|
|
||||||
d->nr_ul_rnti = -1;
|
d->nr_ul_rnti = -1;
|
||||||
d->nr_ul_frame = -1;
|
d->nr_ul_frame = -1;
|
||||||
d->nr_ul_slot = -1;
|
d->nr_ul_slot = -1;
|
||||||
d->nr_ul_data = -1;
|
d->nr_ul_harq_pid = -1;
|
||||||
d->nr_dl_rnti = -1;
|
d->nr_ul_data = -1;
|
||||||
d->nr_dl_frame = -1;
|
d->nr_dl_rnti = -1;
|
||||||
d->nr_dl_slot = -1;
|
d->nr_dl_frame = -1;
|
||||||
d->nr_dl_data = -1;
|
d->nr_dl_slot = -1;
|
||||||
d->nr_mib_frame = -1;
|
d->nr_dl_harq_pid = -1;
|
||||||
d->nr_mib_slot = -1;
|
d->nr_dl_data = -1;
|
||||||
d->nr_mib_data = -1;
|
d->nr_dl_retx_rnti = -1;
|
||||||
d->nr_rar_rnti = -1;
|
d->nr_dl_retx_frame = -1;
|
||||||
d->nr_rar_frame = -1;
|
d->nr_dl_retx_slot = -1;
|
||||||
d->nr_rar_slot = -1;
|
d->nr_dl_retx_harq_pid = -1;
|
||||||
d->nr_rar_data = -1;
|
d->nr_dl_retx_data = -1;
|
||||||
|
d->nr_mib_frame = -1;
|
||||||
|
d->nr_mib_slot = -1;
|
||||||
|
d->nr_mib_data = -1;
|
||||||
|
d->nr_rar_rnti = -1;
|
||||||
|
d->nr_rar_frame = -1;
|
||||||
|
d->nr_rar_slot = -1;
|
||||||
|
d->nr_rar_data = -1;
|
||||||
|
|
||||||
#define G(var_name, var_type, var) \
|
#define G(var_name, var_type, var) \
|
||||||
if (!strcmp(f.name[i], var_name)) { \
|
if (!strcmp(f.name[i], var_name)) { \
|
||||||
@@ -490,32 +522,50 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
|||||||
if (d->sr_rnti == -1 || d->sr_frame == -1 || d->sr_subframe == -1)
|
if (d->sr_rnti == -1 || d->sr_frame == -1 || d->sr_subframe == -1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* NR ul: rnti, frame, slot, data */
|
/* NR ul: rnti, frame, slot, harq_pid, data */
|
||||||
f = get_format(database, nr_ul_id);
|
f = get_format(database, nr_ul_id);
|
||||||
|
|
||||||
for (i = 0; i < f.count; i++) {
|
for (i = 0; i < f.count; i++) {
|
||||||
G("rnti", "int", d->nr_ul_rnti);
|
G("rnti", "int", d->nr_ul_rnti);
|
||||||
G("frame", "int", d->nr_ul_frame);
|
G("frame", "int", d->nr_ul_frame);
|
||||||
G("slot", "int", d->nr_ul_slot);
|
G("slot", "int", d->nr_ul_slot);
|
||||||
G("data", "buffer", d->nr_ul_data);
|
G("harq_pid", "int", d->nr_ul_harq_pid);
|
||||||
|
G("data", "buffer", d->nr_ul_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->nr_ul_rnti == -1 || d->nr_ul_frame == -1 || d->nr_ul_slot == -1 ||
|
if (d->nr_ul_rnti == -1 || d->nr_ul_frame == -1 || d->nr_ul_slot == -1 ||
|
||||||
d->nr_ul_data == -1)
|
d->nr_ul_harq_pid == -1 || d->nr_ul_data == -1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* NR dl: rnti, frame, slot, data */
|
/* NR dl: rnti, frame, slot, harq_pid, data */
|
||||||
f = get_format(database, nr_dl_id);
|
f = get_format(database, nr_dl_id);
|
||||||
|
|
||||||
for (i = 0; i < f.count; i++) {
|
for (i = 0; i < f.count; i++) {
|
||||||
G("rnti", "int", d->nr_dl_rnti);
|
G("rnti", "int", d->nr_dl_rnti);
|
||||||
G("frame", "int", d->nr_dl_frame);
|
G("frame", "int", d->nr_dl_frame);
|
||||||
G("slot", "int", d->nr_dl_slot);
|
G("slot", "int", d->nr_dl_slot);
|
||||||
G("data", "buffer", d->nr_dl_data);
|
G("harq_pid", "int", d->nr_dl_harq_pid);
|
||||||
|
G("data", "buffer", d->nr_dl_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->nr_dl_rnti == -1 || d->nr_dl_frame == -1 || d->nr_dl_slot == -1 ||
|
if (d->nr_dl_rnti == -1 || d->nr_dl_frame == -1 || d->nr_dl_slot == -1 ||
|
||||||
d->nr_dl_data == -1)
|
d->nr_dl_harq_pid == -1 || d->nr_dl_data == -1)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* NR dl retx: rnti, frame, slot, harq_pid, data */
|
||||||
|
f = get_format(database, nr_dl_retx_id);
|
||||||
|
|
||||||
|
for (i = 0; i < f.count; i++) {
|
||||||
|
G("rnti", "int", d->nr_dl_retx_rnti);
|
||||||
|
G("frame", "int", d->nr_dl_retx_frame);
|
||||||
|
G("slot", "int", d->nr_dl_retx_slot);
|
||||||
|
G("harq_pid", "int", d->nr_dl_retx_harq_pid);
|
||||||
|
G("data", "buffer", d->nr_dl_retx_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d->nr_dl_retx_rnti == -1 || d->nr_dl_retx_frame == -1 ||
|
||||||
|
d->nr_dl_retx_slot == -1 || d->nr_dl_retx_harq_pid == -1 ||
|
||||||
|
d->nr_dl_retx_data == -1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* NR MIB: frame, slot, data */
|
/* NR MIB: frame, slot, data */
|
||||||
@@ -612,7 +662,7 @@ int main(int n, char **v)
|
|||||||
int in;
|
int in;
|
||||||
int i;
|
int i;
|
||||||
int ul_id, dl_id, mib_id, preamble_id, rar_id;
|
int ul_id, dl_id, mib_id, preamble_id, rar_id;
|
||||||
int nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id;
|
int nr_ul_id, nr_dl_id, nr_dl_retx_id, nr_mib_id, nr_rar_id;
|
||||||
int sr_id;
|
int sr_id;
|
||||||
ev_data d;
|
ev_data d;
|
||||||
char *ip = DEFAULT_IP;
|
char *ip = DEFAULT_IP;
|
||||||
@@ -692,6 +742,7 @@ int main(int n, char **v)
|
|||||||
|
|
||||||
on_off(database, "GNB_MAC_UL_PDU_WITH_DATA", is_on, 1);
|
on_off(database, "GNB_MAC_UL_PDU_WITH_DATA", is_on, 1);
|
||||||
on_off(database, "GNB_MAC_DL_PDU_WITH_DATA", is_on, 1);
|
on_off(database, "GNB_MAC_DL_PDU_WITH_DATA", is_on, 1);
|
||||||
|
on_off(database, "GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA", is_on, 1);
|
||||||
on_off(database, "GNB_PHY_MIB", is_on, 1);
|
on_off(database, "GNB_PHY_MIB", is_on, 1);
|
||||||
on_off(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA", is_on, 1);
|
on_off(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA", is_on, 1);
|
||||||
|
|
||||||
@@ -715,11 +766,12 @@ int main(int n, char **v)
|
|||||||
|
|
||||||
nr_ul_id = event_id_from_name(database, "GNB_MAC_UL_PDU_WITH_DATA");
|
nr_ul_id = event_id_from_name(database, "GNB_MAC_UL_PDU_WITH_DATA");
|
||||||
nr_dl_id = event_id_from_name(database, "GNB_MAC_DL_PDU_WITH_DATA");
|
nr_dl_id = event_id_from_name(database, "GNB_MAC_DL_PDU_WITH_DATA");
|
||||||
|
nr_dl_retx_id = event_id_from_name(database, "GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA");
|
||||||
nr_mib_id = event_id_from_name(database, "GNB_PHY_MIB");
|
nr_mib_id = event_id_from_name(database, "GNB_PHY_MIB");
|
||||||
nr_rar_id = event_id_from_name(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA");
|
nr_rar_id = event_id_from_name(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA");
|
||||||
|
|
||||||
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id, sr_id,
|
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id, sr_id,
|
||||||
nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id);
|
nr_ul_id, nr_dl_id, nr_dl_retx_id, nr_mib_id, nr_rar_id);
|
||||||
|
|
||||||
register_handler_function(h, ul_id, ul, &d);
|
register_handler_function(h, ul_id, ul, &d);
|
||||||
register_handler_function(h, dl_id, dl, &d);
|
register_handler_function(h, dl_id, dl, &d);
|
||||||
@@ -730,6 +782,7 @@ int main(int n, char **v)
|
|||||||
|
|
||||||
register_handler_function(h, nr_ul_id, nr_ul, &d);
|
register_handler_function(h, nr_ul_id, nr_ul, &d);
|
||||||
register_handler_function(h, nr_dl_id, nr_dl, &d);
|
register_handler_function(h, nr_dl_id, nr_dl, &d);
|
||||||
|
register_handler_function(h, nr_dl_retx_id, nr_dl_retx, &d);
|
||||||
register_handler_function(h, nr_mib_id, nr_mib, &d);
|
register_handler_function(h, nr_mib_id, nr_mib, &d);
|
||||||
register_handler_function(h, nr_rar_id, nr_rar, &d);
|
register_handler_function(h, nr_rar_id, nr_rar, &d);
|
||||||
|
|
||||||
@@ -753,10 +806,11 @@ int main(int n, char **v)
|
|||||||
|
|
||||||
if (e.type == -1) break;
|
if (e.type == -1) break;
|
||||||
|
|
||||||
if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
|
if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
|
||||||
e.type == preamble_id || e.type == rar_id || e.type == sr_id ||
|
e.type == preamble_id || e.type == rar_id || e.type == sr_id ||
|
||||||
e.type == nr_ul_id || e.type == nr_dl_id ||
|
e.type == nr_ul_id || e.type == nr_dl_id ||
|
||||||
e.type == nr_mib_id || e.type == nr_rar_id)) continue;
|
e.type == nr_dl_retx_id || e.type == nr_mib_id ||
|
||||||
|
e.type == nr_rar_id)) continue;
|
||||||
|
|
||||||
handle_event(h, e);
|
handle_event(h, e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ void loader_init(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* build the full shared lib name from the module name */
|
/* build the full shared lib name from the module name */
|
||||||
char *loader_format_shlibpath(char *modname)
|
char *loader_format_shlibpath(char *modname, char *version)
|
||||||
{
|
{
|
||||||
|
|
||||||
char *tmpstr;
|
char *tmpstr;
|
||||||
@@ -97,7 +97,10 @@ int ret;
|
|||||||
shlibpath = loader_data.shlibpath ;
|
shlibpath = loader_data.shlibpath ;
|
||||||
}
|
}
|
||||||
/* no specific shared lib version */
|
/* no specific shared lib version */
|
||||||
if (shlibversion == NULL) {
|
if (version != NULL) { // version specified as a function parameter
|
||||||
|
shlibversion=version;
|
||||||
|
}
|
||||||
|
if (shlibversion == NULL) { // no specific version specified, neither as a config param or as a function param
|
||||||
shlibversion = "" ;
|
shlibversion = "" ;
|
||||||
}
|
}
|
||||||
/* alloc memory for full module shared lib file name */
|
/* alloc memory for full module shared lib file name */
|
||||||
@@ -118,7 +121,7 @@ int ret;
|
|||||||
return tmpstr;
|
return tmpstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *autoinit_arg)
|
int load_module_version_shlib(char *modname, char *version, loader_shlibfunc_t *farray, int numf, void *autoinit_arg)
|
||||||
{
|
{
|
||||||
void *lib_handle = NULL;
|
void *lib_handle = NULL;
|
||||||
initfunc_t fpi;
|
initfunc_t fpi;
|
||||||
@@ -138,7 +141,7 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *
|
|||||||
loader_init();
|
loader_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
shlib_path = loader_format_shlibpath(modname);
|
shlib_path = loader_format_shlibpath(modname, version);
|
||||||
|
|
||||||
for (int i = 0; i < loader_data.numshlibs; i++) {
|
for (int i = 0; i < loader_data.numshlibs; i++) {
|
||||||
if (strcmp(loader_data.shlibs[i].name, modname) == 0) {
|
if (strcmp(loader_data.shlibs[i].name, modname) == 0) {
|
||||||
|
|||||||
@@ -84,10 +84,11 @@ loader_data_t loader_data;
|
|||||||
|
|
||||||
/*-------------------------------------------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------------------------------------------*/
|
||||||
#else /* LOAD_MODULE_SHLIB_MAIN */
|
#else /* LOAD_MODULE_SHLIB_MAIN */
|
||||||
extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf, void *initfunc_arg);
|
|
||||||
|
extern int load_module_version_shlib(char *modname, char *version, loader_shlibfunc_t *farray, int numf, void *initfunc_arg);
|
||||||
extern void * get_shlibmodule_fptr(char *modname, char *fname);
|
extern void * get_shlibmodule_fptr(char *modname, char *fname);
|
||||||
extern loader_data_t loader_data;
|
extern loader_data_t loader_data;
|
||||||
#endif /* LOAD_MODULE_SHLIB_MAIN */
|
#endif /* LOAD_MODULE_SHLIB_MAIN */
|
||||||
|
#define load_module_shlib(M, F, N, I) load_module_version_shlib(M, NULL, F, N, I)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+209
-4
@@ -34,6 +34,8 @@
|
|||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "nr_common.h"
|
#include "nr_common.h"
|
||||||
|
|
||||||
|
const char *duplex_mode[]={"FDD","TDD"};
|
||||||
|
|
||||||
// Table 5.2-1 NR operating bands in FR1 & FR2 (3GPP TS 38.101)
|
// Table 5.2-1 NR operating bands in FR1 & FR2 (3GPP TS 38.101)
|
||||||
// Table 5.4.2.3-1 Applicable NR-ARFCN per operating band in FR1 & FR2 (3GPP TS 38.101)
|
// Table 5.4.2.3-1 Applicable NR-ARFCN per operating band in FR1 & FR2 (3GPP TS 38.101)
|
||||||
// Notes:
|
// Notes:
|
||||||
@@ -63,8 +65,8 @@ nr_bandentry_t nr_bandtable[] = {
|
|||||||
{41, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
{41, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
||||||
{41, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
{41, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
||||||
{47, 5855000, 5925000, 5855000, 5925000, 1, 790334, 15},
|
{47, 5855000, 5925000, 5855000, 5925000, 1, 790334, 15},
|
||||||
//{48, 3550000, 3700000, 3550000, 3700000, 1, 636667, 15},
|
{48, 3550000, 3700000, 3550000, 3700000, 1, 636667, 15},
|
||||||
//{48, 3550000, 3700000, 3550000, 3700000, 2, 636668, 30},
|
{48, 3550000, 3700000, 3550000, 3700000, 2, 636668, 30},
|
||||||
{50, 1432000, 1517000, 1432000, 1517000, 20, 286400, 100},
|
{50, 1432000, 1517000, 1432000, 1517000, 20, 286400, 100},
|
||||||
{51, 1427000, 1432000, 1427000, 1432000, 20, 285400, 100},
|
{51, 1427000, 1432000, 1427000, 1432000, 20, 285400, 100},
|
||||||
{53, 2483500, 2495000, 2483500, 2495000, 20, 496700, 100},
|
{53, 2483500, 2495000, 2483500, 2495000, 20, 496700, 100},
|
||||||
@@ -88,14 +90,15 @@ nr_bandentry_t nr_bandtable[] = {
|
|||||||
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
|
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
|
||||||
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
||||||
{89, 824000, 849000, 000, 000, 20, 342000, 100},
|
{89, 824000, 849000, 000, 000, 20, 342000, 100},
|
||||||
{90, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
{90, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
||||||
{90, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
{90, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
||||||
{90, 2496000, 2690000, 2496000, 2690000, 20, 499200, 100},
|
{90, 2496000, 2690000, 2496000, 2690000, 20, 499200, 100},
|
||||||
{91, 832000, 862000, 1427000, 1432000, 20, 285400, 100},
|
{91, 832000, 862000, 1427000, 1432000, 20, 285400, 100},
|
||||||
{92, 832000, 862000, 1432000, 1517000, 20, 286400, 100},
|
{92, 832000, 862000, 1432000, 1517000, 20, 286400, 100},
|
||||||
{93, 880000, 915000, 1427000, 1432000, 20, 285400, 100},
|
{93, 880000, 915000, 1427000, 1432000, 20, 285400, 100},
|
||||||
{94, 880000, 915000, 1432000, 1517000, 20, 286400, 100},
|
{94, 880000, 915000, 1432000, 1517000, 20, 286400, 100},
|
||||||
{95, 2010000, 2025000, 000, 000, 20, 402000, 100},
|
{95, 2010000, 2025000, 000, 000, 20, 402000, 100},
|
||||||
|
{96, 5925000, 7125000, 5925000, 7125000, 1, 795000, 15},
|
||||||
{257,26500020,29500000,26500020,29500000, 1,2054166, 60},
|
{257,26500020,29500000,26500020,29500000, 1,2054166, 60},
|
||||||
{257,26500080,29500000,26500080,29500000, 2,2054167, 120},
|
{257,26500080,29500000,26500080,29500000, 2,2054167, 120},
|
||||||
{258,24250080,27500000,24250080,27500000, 1,2016667, 60},
|
{258,24250080,27500000,24250080,27500000, 1,2016667, 60},
|
||||||
@@ -231,6 +234,30 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
|
||||||
|
|
||||||
|
uint8_t count=0, start=0, start_set=0;
|
||||||
|
|
||||||
|
uint64_t bitmap = (((uint64_t)FreqDomainResource[0])<<37)|
|
||||||
|
(((uint64_t)FreqDomainResource[1])<<29)|
|
||||||
|
(((uint64_t)FreqDomainResource[2])<<21)|
|
||||||
|
(((uint64_t)FreqDomainResource[3])<<13)|
|
||||||
|
(((uint64_t)FreqDomainResource[4])<<5)|
|
||||||
|
(((uint64_t)FreqDomainResource[5])>>3);
|
||||||
|
|
||||||
|
for (int i=0; i<45; i++)
|
||||||
|
if ((bitmap>>(44-i))&1) {
|
||||||
|
count++;
|
||||||
|
if (!start_set) {
|
||||||
|
start = i;
|
||||||
|
start_set = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*rb_offset = 6*start;
|
||||||
|
*n_rb = 6*count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int get_dmrs_port(int nl, uint16_t dmrs_ports) {
|
int get_dmrs_port(int nl, uint16_t dmrs_ports) {
|
||||||
|
|
||||||
if (dmrs_ports == 0) return 0; // dci 1_0
|
if (dmrs_ports == 0) return 0; // dci 1_0
|
||||||
@@ -249,6 +276,184 @@ int get_dmrs_port(int nl, uint16_t dmrs_ports) {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_num_dmrs(uint16_t dmrs_mask ) {
|
||||||
|
|
||||||
|
int num_dmrs=0;
|
||||||
|
|
||||||
|
for (int i=0;i<16;i++) num_dmrs+=((dmrs_mask>>i)&1);
|
||||||
|
return(num_dmrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
lte_frame_type_t get_frame_type(uint16_t current_band, uint8_t scs_index)
|
||||||
|
{
|
||||||
|
lte_frame_type_t current_type;
|
||||||
|
int32_t delta_duplex = get_delta_duplex(current_band, scs_index);
|
||||||
|
|
||||||
|
if (delta_duplex == 0)
|
||||||
|
current_type = TDD;
|
||||||
|
else
|
||||||
|
current_type = FDD;
|
||||||
|
|
||||||
|
LOG_I(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[current_type], delta_duplex);
|
||||||
|
|
||||||
|
return current_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Computes the duplex spacing (either positive or negative) in KHz
|
||||||
|
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index)
|
||||||
|
{
|
||||||
|
int nr_table_idx = get_nr_table_idx(nr_bandP, scs_index);
|
||||||
|
|
||||||
|
int32_t delta_duplex = (nr_bandtable[nr_table_idx].ul_min - nr_bandtable[nr_table_idx].dl_min);
|
||||||
|
|
||||||
|
LOG_I(NR_MAC, "NR band duplex spacing is %d KHz (nr_bandtable[%d].band = %d)\n", delta_duplex, nr_table_idx, nr_bandtable[nr_table_idx].band);
|
||||||
|
|
||||||
|
return delta_duplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (nr_band < 100) { //FR1
|
||||||
|
switch(mu) {
|
||||||
|
case 0 :
|
||||||
|
if (nb_rb<=25)
|
||||||
|
return 5;
|
||||||
|
if (nb_rb<=52)
|
||||||
|
return 10;
|
||||||
|
if (nb_rb<=79)
|
||||||
|
return 15;
|
||||||
|
if (nb_rb<=106)
|
||||||
|
return 20;
|
||||||
|
if (nb_rb<=133)
|
||||||
|
return 25;
|
||||||
|
if (nb_rb<=160)
|
||||||
|
return 30;
|
||||||
|
if (nb_rb<=216)
|
||||||
|
return 40;
|
||||||
|
if (nb_rb<=270)
|
||||||
|
return 50;
|
||||||
|
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||||
|
break;
|
||||||
|
case 1 :
|
||||||
|
if (nb_rb<=11)
|
||||||
|
return 5;
|
||||||
|
if (nb_rb<=24)
|
||||||
|
return 10;
|
||||||
|
if (nb_rb<=38)
|
||||||
|
return 15;
|
||||||
|
if (nb_rb<=51)
|
||||||
|
return 20;
|
||||||
|
if (nb_rb<=65)
|
||||||
|
return 25;
|
||||||
|
if (nb_rb<=78)
|
||||||
|
return 30;
|
||||||
|
if (nb_rb<=106)
|
||||||
|
return 40;
|
||||||
|
if (nb_rb<=133)
|
||||||
|
return 50;
|
||||||
|
if (nb_rb<=162)
|
||||||
|
return 60;
|
||||||
|
if (nb_rb<=189)
|
||||||
|
return 70;
|
||||||
|
if (nb_rb<=217)
|
||||||
|
return 80;
|
||||||
|
if (nb_rb<=245)
|
||||||
|
return 90;
|
||||||
|
if (nb_rb<=273)
|
||||||
|
return 100;
|
||||||
|
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
|
if (nb_rb<=11)
|
||||||
|
return 10;
|
||||||
|
if (nb_rb<=18)
|
||||||
|
return 15;
|
||||||
|
if (nb_rb<=24)
|
||||||
|
return 20;
|
||||||
|
if (nb_rb<=31)
|
||||||
|
return 25;
|
||||||
|
if (nb_rb<=38)
|
||||||
|
return 30;
|
||||||
|
if (nb_rb<=51)
|
||||||
|
return 40;
|
||||||
|
if (nb_rb<=65)
|
||||||
|
return 50;
|
||||||
|
if (nb_rb<=79)
|
||||||
|
return 60;
|
||||||
|
if (nb_rb<=93)
|
||||||
|
return 70;
|
||||||
|
if (nb_rb<=107)
|
||||||
|
return 80;
|
||||||
|
if (nb_rb<=121)
|
||||||
|
return 90;
|
||||||
|
if (nb_rb<=135)
|
||||||
|
return 100;
|
||||||
|
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Numerology %d undefined for band %d in FR1\n", mu,nr_band);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switch(mu) {
|
||||||
|
case 2 :
|
||||||
|
if (nb_rb<=66)
|
||||||
|
return 50;
|
||||||
|
if (nb_rb<=132)
|
||||||
|
return 100;
|
||||||
|
if (nb_rb<=264)
|
||||||
|
return 200;
|
||||||
|
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||||
|
break;
|
||||||
|
case 3 :
|
||||||
|
if (nb_rb<=32)
|
||||||
|
return 50;
|
||||||
|
if (nb_rb<=66)
|
||||||
|
return 100;
|
||||||
|
if (nb_rb<=132)
|
||||||
|
return 200;
|
||||||
|
if (nb_rb<=264)
|
||||||
|
return 400;
|
||||||
|
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Numerology %d undefined for band %d in FR1\n", mu,nr_band);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the corresponding row index of the NR table
|
||||||
|
int get_nr_table_idx(int nr_bandP, uint8_t scs_index) {
|
||||||
|
int i, j;
|
||||||
|
int scs_khz = 15 << scs_index;
|
||||||
|
int supplementary_bands[] = {29,75,76,80,81,82,83,84,86,89,95};
|
||||||
|
size_t s = sizeof(supplementary_bands)/sizeof(supplementary_bands[0]);
|
||||||
|
|
||||||
|
for(j = 0; j < s; j++){
|
||||||
|
if (nr_bandP == supplementary_bands[j])
|
||||||
|
AssertFatal(0 == 1, "Band %d is a supplementary band (%d). This is not supported yet.\n", nr_bandP, supplementary_bands[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
AssertFatal(nr_bandP <= nr_bandtable[nr_bandtable_size-1].band, "NR band %d exceeds NR bands table maximum limit %d\n", nr_bandP, nr_bandtable[nr_bandtable_size-1].band);
|
||||||
|
for (i = 0; i < nr_bandtable_size && nr_bandtable[i].band != nr_bandP; i++);
|
||||||
|
|
||||||
|
// In frequency bands with two deltaFRaster,
|
||||||
|
// the higher deltaFRaster applies to channels using only the SCS that is equal to or larger than the higher deltaFRaster
|
||||||
|
// and SSB SCS is equal to the higher deltaFRaster.
|
||||||
|
while(((i+1)<nr_bandtable_size) &&
|
||||||
|
(nr_bandtable[i+1].band == nr_bandtable[i].band) &&
|
||||||
|
(nr_bandtable[i].deltaf_raster != scs_khz)) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
AssertFatal(nr_bandtable[i].band == nr_bandP, "Found band table %d does not correspond to the input one %d\n",nr_bandtable[i].band,nr_bandP);
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(PHY, "NR band table index %d (Band %d, dl_min %lu, ul_min %lu)\n", i, nr_bandtable[i].band, nr_bandtable[i].dl_min,nr_bandtable[i].ul_min);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
int get_subband_size(int NPRB,int size) {
|
int get_subband_size(int NPRB,int size) {
|
||||||
// implements table 5.2.1.4-2 from 36.214
|
// implements table 5.2.1.4-2 from 36.214
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
#include "PHY/defs_common.h"
|
||||||
|
|
||||||
typedef struct nr_bandentry_s {
|
typedef struct nr_bandentry_s {
|
||||||
int16_t band;
|
int16_t band;
|
||||||
@@ -50,6 +51,12 @@ typedef struct nr_bandentry_s {
|
|||||||
extern const size_t nr_bandtable_size;
|
extern const size_t nr_bandtable_size;
|
||||||
extern nr_bandentry_t nr_bandtable[];
|
extern nr_bandentry_t nr_bandtable[];
|
||||||
|
|
||||||
|
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
|
||||||
|
int get_num_dmrs(uint16_t dmrs_mask);
|
||||||
|
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
||||||
|
int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
|
||||||
|
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
|
||||||
|
lte_frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index);
|
||||||
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex);
|
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex);
|
||||||
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
||||||
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
||||||
|
|||||||
@@ -62,34 +62,27 @@
|
|||||||
#include "telnetsrv_proccmd.h"
|
#include "telnetsrv_proccmd.h"
|
||||||
static char *telnet_defstatmod[] = {"softmodem","phy","loader","measur"};
|
static char *telnet_defstatmod[] = {"softmodem","phy","loader","measur"};
|
||||||
static telnetsrv_params_t telnetparams;
|
static telnetsrv_params_t telnetparams;
|
||||||
#define TELNETSRV_LISTENADDR 0
|
|
||||||
#define TELNETSRV_LISTENPORT 1
|
#define TELNETSRV_OPTNAME_STATICMOD "staticmod"
|
||||||
#define TELNETSRV_PRIORITY 2
|
#define TELNETSRV_OPTNAME_SHRMOD "shrmod"
|
||||||
#define TELNETSRV_DEBUG 3
|
|
||||||
#define TELNETSRV_LOOPC 4
|
|
||||||
#define TELNETSRV_LOOPD 5
|
|
||||||
#define TELNETSRV_HISFILE 6
|
|
||||||
#define TELNETSRV_HISSIZE 7
|
|
||||||
#define TELNETSRV_PHYBSIZE 8
|
|
||||||
#define TELNETSRV_STATICMOD 9
|
|
||||||
#define TELNETSRV_SHRMOD 10
|
|
||||||
|
|
||||||
paramdef_t telnetoptions[] = {
|
paramdef_t telnetoptions[] = {
|
||||||
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
/* configuration parameters for telnet utility */
|
/* configuration parameters for telnet utility */
|
||||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||||
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
{"listenaddr", "<listen ip address>\n", 0, uptr:&telnetparams.listenaddr, defstrval:"0.0.0.0", TYPE_IPV4ADDR, 0 },
|
{"listenaddr", "<listen ip address>\n", 0, uptr:&telnetparams.listenaddr, defstrval:"0.0.0.0", TYPE_IPV4ADDR, 0 },
|
||||||
{"listenport", "<local port>\n", 0, uptr:&(telnetparams.listenport), defuintval:9090, TYPE_UINT, 0 },
|
{"listenport", "<local port>\n", 0, uptr:&(telnetparams.listenport), defuintval:9090, TYPE_UINT, 0 },
|
||||||
{"priority", "<scheduling policy (0-99)\n", 0, iptr:&telnetparams.priority, defuintval:0, TYPE_INT, 0 },
|
{"listenstdin", "enable input from stdin\n", PARAMFLAG_BOOL, uptr:&(telnetparams.listenstdin), defuintval:0, TYPE_UINT, 0 },
|
||||||
{"debug", "<debug level>\n", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0 },
|
{"priority", "<scheduling policy (0-99)\n", 0, iptr:&telnetparams.priority, defuintval:0, TYPE_INT, 0 },
|
||||||
{"loopcount", "<loop command iterations>\n", 0, uptr:&(telnetparams.loopcount), defuintval:10, TYPE_UINT, 0 },
|
{"debug", "<debug level>\n", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0 },
|
||||||
{"loopdelay", "<loop command delay (ms)>\n", 0, uptr:&(telnetparams.loopdelay), defuintval:5000, TYPE_UINT, 0 },
|
{"loopcount", "<loop command iterations>\n", 0, uptr:&(telnetparams.loopcount), defuintval:10, TYPE_UINT, 0 },
|
||||||
{"histfile", "<history file name>\n", PARAMFLAG_NOFREE, strptr:&(telnetparams.histfile), defstrval:"oaitelnet.history", TYPE_STRING, 0 },
|
{"loopdelay", "<loop command delay (ms)>\n", 0, uptr:&(telnetparams.loopdelay), defuintval:5000, TYPE_UINT, 0 },
|
||||||
{"histsize", "<history sizes>\n", 0, iptr:&(telnetparams.histsize), defuintval:50, TYPE_INT, 0 },
|
{"histfile", "<history file name>\n", PARAMFLAG_NOFREE, strptr:&(telnetparams.histfile), defstrval:"oaitelnet.history", TYPE_STRING, 0 },
|
||||||
{"phypbsize", "<phy dump buff size (bytes)>\n",0, uptr:&(telnetparams.phyprntbuff_size),defuintval:65000, TYPE_UINT, 0 },
|
{"histsize", "<history sizes>\n", 0, iptr:&(telnetparams.histsize), defuintval:50, TYPE_INT, 0 },
|
||||||
{"staticmod", "<static modules selection>\n", 0, strlistptr:NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,(sizeof(telnet_defstatmod)/sizeof(char *))},
|
{"phypbsize", "<phy dump buff size (bytes)>\n",0, uptr:&(telnetparams.phyprntbuff_size),defuintval:65000, TYPE_UINT, 0 },
|
||||||
{"shrmod", "<dynamic modules selection>\n", 0, strlistptr:NULL, defstrlistval:NULL,TYPE_STRINGLIST,0 }
|
{TELNETSRV_OPTNAME_STATICMOD, "<static modules selection>\n", 0, strlistptr:NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,(sizeof(telnet_defstatmod)/sizeof(char *))},
|
||||||
|
{TELNETSRV_OPTNAME_SHRMOD, "<dynamic modules selection>\n", 0, strlistptr:NULL, defstrlistval:NULL,TYPE_STRINGLIST,0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
int get_phybsize(void) {
|
int get_phybsize(void) {
|
||||||
@@ -682,6 +675,77 @@ void run_telnetsrv(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void run_telnetclt(void) {
|
||||||
|
int sock;
|
||||||
|
struct sockaddr_in name;
|
||||||
|
pthread_setname_np(pthread_self(), "telnetclt");
|
||||||
|
set_sched(pthread_self(),0,telnetparams.priority);
|
||||||
|
char prompt[sizeof(TELNET_PROMPT_PREFIX)+10];
|
||||||
|
sprintf(prompt,"%s_%s> ",TELNET_PROMPT_PREFIX,get_softmodem_function(NULL));
|
||||||
|
name.sin_family = AF_INET;
|
||||||
|
struct in_addr addr;
|
||||||
|
inet_aton("127.0.0.1", &addr) ;
|
||||||
|
name.sin_addr.s_addr = addr.s_addr;
|
||||||
|
name.sin_port = htons((unsigned short)(telnetparams.listenport));
|
||||||
|
while (1) {
|
||||||
|
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
if (sock < 0)
|
||||||
|
fprintf(stderr,"[TELNETSRV] Error %s on socket call\n",strerror(errno));
|
||||||
|
|
||||||
|
if(connect(sock, (void *) &name, sizeof(name)))
|
||||||
|
fprintf(stderr,"[TELNETSRV] Error %s on connect call\n",strerror(errno));
|
||||||
|
|
||||||
|
struct timeval ts;
|
||||||
|
ts.tv_sec = 1; // 1 second
|
||||||
|
ts.tv_usec = 0;
|
||||||
|
while (1) {
|
||||||
|
fd_set fds;
|
||||||
|
FD_ZERO(&fds);
|
||||||
|
FD_SET(sock, &fds);
|
||||||
|
FD_SET(STDIN_FILENO , &fds);
|
||||||
|
// wait for data
|
||||||
|
int nready = select(sock + 1, &fds, (fd_set *) 0, (fd_set *) 0, &ts);
|
||||||
|
if (nready < 0) {
|
||||||
|
perror("select. Error");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (nready == 0) {
|
||||||
|
ts.tv_sec = 1; // 1 second
|
||||||
|
ts.tv_usec = 0;
|
||||||
|
}
|
||||||
|
else if ( FD_ISSET(sock, &fds)) {
|
||||||
|
int rv;
|
||||||
|
char inbuf[TELNET_MAX_MSGLENGTH*2];
|
||||||
|
memset(inbuf,0,sizeof(inbuf));
|
||||||
|
rv = recv(sock , inbuf , sizeof(inbuf)-1 , 0);
|
||||||
|
if (rv > 0) {
|
||||||
|
printf("%s",inbuf);
|
||||||
|
}
|
||||||
|
else if (rv == 0) {
|
||||||
|
printf("Connection closed by the remote end\n\r");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
perror("recv error");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (FD_ISSET(STDIN_FILENO , &fds)) {
|
||||||
|
char *inbuf=NULL;
|
||||||
|
size_t inlen=0;
|
||||||
|
inlen = getline( &inbuf,&inlen, stdin);
|
||||||
|
if ( inlen > 0 ) {
|
||||||
|
if ( send(sock, inbuf,inlen, 0) < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
free(inbuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(sock);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} /* run_telnetclt */
|
||||||
|
|
||||||
void poll_telnetcmdq(void *qid, void *arg) {
|
void poll_telnetcmdq(void *qid, void *arg) {
|
||||||
notifiedFIFO_elt_t *msg = pollNotifiedFIFO((notifiedFIFO_t *)qid);
|
notifiedFIFO_elt_t *msg = pollNotifiedFIFO((notifiedFIFO_t *)qid);
|
||||||
|
|
||||||
@@ -720,10 +784,10 @@ void exec_moduleinit(char *modname) {
|
|||||||
|
|
||||||
int add_embeddedmodules(void) {
|
int add_embeddedmodules(void) {
|
||||||
int ret=0;
|
int ret=0;
|
||||||
|
int pindex = config_paramidx_fromname(telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t), TELNETSRV_OPTNAME_STATICMOD);
|
||||||
for(int i=0; i<telnetoptions[TELNETSRV_STATICMOD].numelt; i++) {
|
for(int i=0; i<telnetoptions[pindex].numelt; i++) {
|
||||||
ret++;
|
ret++;
|
||||||
exec_moduleinit(telnetoptions[TELNETSRV_STATICMOD].strlistptr[i]);
|
exec_moduleinit(telnetoptions[pindex].strlistptr[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -733,16 +797,16 @@ int add_sharedmodules(void) {
|
|||||||
char initfunc[TELNET_CMD_MAXSIZE+9];
|
char initfunc[TELNET_CMD_MAXSIZE+9];
|
||||||
void (*fptr)(void);
|
void (*fptr)(void);
|
||||||
int ret=0;
|
int ret=0;
|
||||||
|
int pindex = config_paramidx_fromname(telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t), TELNETSRV_OPTNAME_SHRMOD);
|
||||||
for(int i=0; i<telnetoptions[TELNETSRV_SHRMOD].numelt; i++) {
|
for(int i=0; i<telnetoptions[pindex].numelt; i++) {
|
||||||
sprintf(initfunc,"add_%s_cmds",telnetoptions[TELNETSRV_SHRMOD].strlistptr[i]);
|
sprintf(initfunc,"add_%s_cmds",telnetoptions[pindex].strlistptr[i]);
|
||||||
fptr = dlsym(RTLD_DEFAULT,initfunc);
|
fptr = dlsym(RTLD_DEFAULT,initfunc);
|
||||||
|
|
||||||
if ( fptr != NULL) {
|
if ( fptr != NULL) {
|
||||||
fptr();
|
fptr();
|
||||||
ret++;
|
ret++;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,"[TELNETSRV] couldn't find %s for module %s \n",initfunc,telnetoptions[TELNETSRV_STATICMOD].strlistptr[i]);
|
fprintf(stderr,"[TELNETSRV] couldn't find %s for module %s \n",initfunc,telnetoptions[pindex].strlistptr[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -767,6 +831,12 @@ int telnetsrv_autoinit(void) {
|
|||||||
|
|
||||||
add_telnetcmd("telnet", telnet_vardef, telnet_cmdarray);
|
add_telnetcmd("telnet", telnet_vardef, telnet_cmdarray);
|
||||||
add_embeddedmodules();
|
add_embeddedmodules();
|
||||||
|
if ( telnetparams.listenstdin ) {
|
||||||
|
if(pthread_create(&telnetparams.telnetclt_pthread,NULL, (void *(*)(void *))run_telnetclt, NULL) != 0) {
|
||||||
|
fprintf(stderr,"[TELNETSRV] Error %s on pthread_create f() run_telnetclt \n",strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -807,7 +877,7 @@ int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmdde
|
|||||||
|
|
||||||
|
|
||||||
/* function which will be called by the shared lib loader, to check shared lib version
|
/* function which will be called by the shared lib loader, to check shared lib version
|
||||||
against main exec version. version mismatch no considered as fatal (interfaces not supposed to change)
|
against main exec version. version mismatch not considered as fatal (interfaces not supposed to change)
|
||||||
*/
|
*/
|
||||||
int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildversion) {
|
int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildversion) {
|
||||||
#ifndef PACKAGE_VERSION
|
#ifndef PACKAGE_VERSION
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ typedef struct cmdparser {
|
|||||||
/* global variables used by the telnet server */
|
/* global variables used by the telnet server */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
pthread_t telnet_pthread; // thread id of the telnet server
|
pthread_t telnet_pthread; // thread id of the telnet server
|
||||||
|
pthread_t telnetclt_pthread; // thread id of the telnet client (used when listenstdin set to true)
|
||||||
int telnetdbg; // debug level of the server
|
int telnetdbg; // debug level of the server
|
||||||
int priority; // server running priority
|
int priority; // server running priority
|
||||||
char *histfile; // command history
|
char *histfile; // command history
|
||||||
@@ -119,6 +120,7 @@ typedef struct {
|
|||||||
char msgbuff[TELNET_MAX_MSGLENGTH]; // internal buffer of the client_printf function which is used to print to the client terminal */
|
char msgbuff[TELNET_MAX_MSGLENGTH]; // internal buffer of the client_printf function which is used to print to the client terminal */
|
||||||
unsigned int listenport; // ip port the telnet server is listening on
|
unsigned int listenport; // ip port the telnet server is listening on
|
||||||
unsigned int listenaddr; // ip address the telnet server is listening on
|
unsigned int listenaddr; // ip address the telnet server is listening on
|
||||||
|
unsigned int listenstdin; // enable command input from stdin
|
||||||
unsigned int loopcount; // loop command param: number of loop iteration
|
unsigned int loopcount; // loop command param: number of loop iteration
|
||||||
unsigned int loopdelay; // loop command param: delay in ms between 2 iterations
|
unsigned int loopdelay; // loop command param: delay in ms between 2 iterations
|
||||||
unsigned int phyprntbuff_size; // for phy module, dump_eNB_stats function buffer size
|
unsigned int phyprntbuff_size; // for phy module, dump_eNB_stats function buffer size
|
||||||
|
|||||||
@@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! \file common/utils/telnetsrv/telnetsrv_nrue_measurements.c
|
||||||
|
* \brief: implementation of telnet commands related to nrUE measurments
|
||||||
|
* \author Francois TABURET
|
||||||
|
* \date 2021
|
||||||
|
* \version 0.1
|
||||||
|
* \company NOKIA BellLabs France
|
||||||
|
* \email: francois.taburet@nokia-bell-labs.com
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define TELNETSERVERCODE
|
||||||
|
#include "telnetsrv.h"
|
||||||
|
|
||||||
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "common/config/config_userapi.h"
|
||||||
|
#include "telnetsrv_measurements.h"
|
||||||
|
#include "telnetsrv_ltemeasur_def.h"
|
||||||
|
#include "telnetsrv_cpumeasur_def.h"
|
||||||
|
#include "openair2/LAYER2/NR_MAC_UE/mac_defs.h"
|
||||||
|
#include "openair1/PHY/phy_extern_nr_ue.h"
|
||||||
|
|
||||||
|
void measurcmd_display_macstats(telnet_printfunc_t prnt);
|
||||||
|
void measurcmd_display_macstats_ue(telnet_printfunc_t prnt);
|
||||||
|
void measurcmd_display_rlcstats(telnet_printfunc_t prnt);
|
||||||
|
void measurcmd_display_phycpu(telnet_printfunc_t prnt);
|
||||||
|
void measurcmd_display_maccpu(telnet_printfunc_t prnt);
|
||||||
|
void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt);
|
||||||
|
|
||||||
|
|
||||||
|
static telnet_measurgroupdef_t nrUEmeasurgroups[] = {
|
||||||
|
// {"ue", GROUP_LTESTATS,0, measurcmd_display_macstats, {NULL}},
|
||||||
|
// {"rlc", GROUP_LTESTATS,0, measurcmd_display_rlcstats, {NULL}},
|
||||||
|
{"phycpu",GROUP_CPUSTATS,0, measurcmd_display_phycpu, {NULL}},
|
||||||
|
// {"maccpu",GROUP_CPUSTATS,0, measurcmd_display_maccpu, {NULL}},
|
||||||
|
// {"pdcpcpu",GROUP_CPUSTATS,0, measurcmd_display_pdcpcpu, {NULL}},
|
||||||
|
};
|
||||||
|
#define TELNET_NUM_NRUEMEASURGROUPS (sizeof(nrUEmeasurgroups)/sizeof(telnet_measurgroupdef_t))
|
||||||
|
|
||||||
|
|
||||||
|
static double cpufreq;
|
||||||
|
|
||||||
|
|
||||||
|
#define HDR "---------------------------------"
|
||||||
|
|
||||||
|
|
||||||
|
int get_measurgroups(telnet_measurgroupdef_t **measurgroups) {
|
||||||
|
*measurgroups = nrUEmeasurgroups;
|
||||||
|
return TELNET_NUM_NRUEMEASURGROUPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void measurcmd_display_phycpu(telnet_printfunc_t prnt) {
|
||||||
|
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
|
||||||
|
telnet_cpumeasurdef_t cpumeasur[]=CPU_PHYNRUE_MEASURE;
|
||||||
|
prnt("%s cpu (%1.1g GHz) measurements: PHY (cpustats %s) %s\n",HDR,cpufreq,
|
||||||
|
PRINT_CPUMEAS_STATE,HDR);
|
||||||
|
measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
void measurcmd_display_maccpu(telnet_printfunc_t prnt) {
|
||||||
|
eNB_MAC_INST *macvars = RC.mac[eNB_id];
|
||||||
|
telnet_cpumeasurdef_t cpumeasur[]=CPU_MACENB_MEASURE;
|
||||||
|
prnt("%s cpu (%1.1g GHz) measurements: MAC (cpustats %s) %s\n",HDR,cpufreq,
|
||||||
|
PRINT_CPUMEAS_STATE,HDR);
|
||||||
|
measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt) {
|
||||||
|
pdcp_stats_t *pdcpvars = &(eNB_pdcp_stats[eNB_id]);
|
||||||
|
telnet_cpumeasurdef_t cpumeasur[]=CPU_PDCPENB_MEASURE;
|
||||||
|
prnt("%s cpu (%1.1g GHz) measurements: PDCP (cpustats %s) %s \n",HDR,cpufreq,
|
||||||
|
PRINT_CPUMEAS_STATE,HDR);
|
||||||
|
measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
void measurcmd_display_macstats_ue(telnet_printfunc_t prnt) {
|
||||||
|
UE_info_t *UE_info = &(RC.mac[eNB_id]->UE_info);
|
||||||
|
|
||||||
|
for (int UE_id=UE_info->list.head; UE_id>=0; UE_id=UE_info->list.next[UE_id]) {
|
||||||
|
for (int i=0; i<UE_info->numactiveCCs[UE_id]; i++) {
|
||||||
|
int CC_id = UE_info->ordered_CCids[i][UE_id];
|
||||||
|
prnt("%s UE %i Id %i CCid %i %s\n",HDR,i,UE_id,CC_id,HDR);
|
||||||
|
eNB_UE_STATS *macuestatptr = &(UE_info->eNB_UE_stats[CC_id][UE_id]);
|
||||||
|
telnet_ltemeasurdef_t statsptr[]=LTEMAC_UEMEASURE;
|
||||||
|
measurcmd_display_measures(prnt, statsptr, sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // measurcmd_display_macstats_ue
|
||||||
|
|
||||||
|
void measurcmd_display_macstats(telnet_printfunc_t prnt) {
|
||||||
|
for (int CC_id=0 ; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
|
eNB_STATS *macstatptr=&(RC.mac[eNB_id]->eNB_stats[CC_id]);
|
||||||
|
telnet_ltemeasurdef_t statsptr[]=LTEMAC_MEASURE;
|
||||||
|
prnt("%s eNB %i mac stats CC %i frame %u %s\n",
|
||||||
|
HDR, eNB_id, CC_id, RC.mac[eNB_id]->frame,HDR);
|
||||||
|
measurcmd_display_measures(prnt,statsptr,sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
|
||||||
|
}
|
||||||
|
} // measurcmd_display_macstats
|
||||||
|
|
||||||
|
|
||||||
|
void measurcmd_display_one_rlcstat(telnet_printfunc_t prnt, int UE_id, telnet_ltemeasurdef_t *statsptr, int num_rlcmeasure, unsigned int *rlcstats,
|
||||||
|
char *rbid_str, protocol_ctxt_t *ctxt, const srb_flag_t srb_flagP, const rb_id_t rb_idP)
|
||||||
|
|
||||||
|
{
|
||||||
|
int rlc_status = rlc_stat_req(ctxt,srb_flagP,rb_idP,
|
||||||
|
rlcstats, rlcstats+1, rlcstats+2, rlcstats+3, rlcstats+4, rlcstats+5,
|
||||||
|
rlcstats+6, rlcstats+7, rlcstats+8, rlcstats+9, rlcstats+10, rlcstats+11,
|
||||||
|
rlcstats+12, rlcstats+13, rlcstats+14, rlcstats+15, rlcstats+16, rlcstats+17,
|
||||||
|
rlcstats+18, rlcstats+19, rlcstats+20, rlcstats+21, rlcstats+22, rlcstats+23,
|
||||||
|
rlcstats+24, rlcstats+25, rlcstats+26, rlcstats+27);
|
||||||
|
|
||||||
|
if (rlc_status == RLC_OP_STATUS_OK) {
|
||||||
|
prnt("%s UE %i RLC %s mode %s %s\n",HDR,UE_id, rbid_str,
|
||||||
|
(rlcstats[0]==RLC_MODE_AM)? "AM": (rlcstats[0]==RLC_MODE_UM)?"UM":"NONE",HDR);
|
||||||
|
measurcmd_display_measures(prnt, statsptr, num_rlcmeasure);
|
||||||
|
}
|
||||||
|
} // status measurcmd_rlc_stat_req
|
||||||
|
|
||||||
|
|
||||||
|
void measurcmd_display_rlcstats(telnet_printfunc_t prnt) {
|
||||||
|
protocol_ctxt_t ctxt;
|
||||||
|
UE_info_t *UE_info = &(RC.mac[eNB_id]->UE_info);
|
||||||
|
telnet_ltemeasurdef_t statsptr[]=LTE_RLCMEASURE;
|
||||||
|
int num_rlcmeasure = sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t );
|
||||||
|
unsigned int *rlcstats = malloc(num_rlcmeasure*sizeof(unsigned int));
|
||||||
|
eNB_MAC_INST *eNB = RC.mac[eNB_id];
|
||||||
|
|
||||||
|
for(int i=0; i <num_rlcmeasure ; i++) {
|
||||||
|
statsptr[i].vptr = rlcstats + i;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int UE_id=UE_info->list.head; UE_id>=0; UE_id=UE_info->list.next[UE_id]) {
|
||||||
|
#define NB_eNB_INST 1
|
||||||
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt,eNB_id, ENB_FLAG_YES,UE_info->eNB_UE_stats[0][UE_id].crnti,
|
||||||
|
eNB->frame,eNB->subframe,eNB_id);
|
||||||
|
measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DCCH", &ctxt, SRB_FLAG_YES, DCCH);
|
||||||
|
measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DTCH", &ctxt, SRB_FLAG_NO, DTCH-2);
|
||||||
|
}
|
||||||
|
} // measurcmd_display_macstats_ue
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -8,9 +8,9 @@ set(TELNETSRV_SOURCE
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} )
|
add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} )
|
||||||
target_link_libraries(telnetsrv PRIVATE history)
|
target_link_libraries(telnetsrv PRIVATE history ncurses form )
|
||||||
|
|
||||||
foreach(TELNETLIB enb gnb 4gUE 5gUE)
|
foreach(TELNETLIB enb gnb 4Gue 5Gue)
|
||||||
set(TELNETLIB_SRCS "")
|
set(TELNETLIB_SRCS "")
|
||||||
foreach(TELNETLIB_ASRC measurements phycmd)
|
foreach(TELNETLIB_ASRC measurements phycmd)
|
||||||
set(TELNETLIB_SRC ${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_${TELNETLIB}_${TELNETLIB_ASRC}.c)
|
set(TELNETLIB_SRC ${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_${TELNETLIB}_${TELNETLIB_ASRC}.c)
|
||||||
@@ -32,4 +32,4 @@ install(TARGETS telnetsrv DESTINATION bin)
|
|||||||
|
|
||||||
if (EXISTS "${OPENAIR_BUILD_DIR}/ran_build/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/ran_build/build")
|
if (EXISTS "${OPENAIR_BUILD_DIR}/ran_build/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/ran_build/build")
|
||||||
install(TARGETS telnetsrv DESTINATION ${OPENAIR_BUILD_DIR}/ran_build/build)
|
install(TARGETS telnetsrv DESTINATION ${OPENAIR_BUILD_DIR}/ran_build/build)
|
||||||
endif (EXISTS "${OPENAIR_BUILD_DIR}/ran_build/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/ran_build/build")
|
endif (EXISTS "${OPENAIR_BUILD_DIR}/ran_build/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/ran_build/build")
|
||||||
|
|||||||
@@ -24,8 +24,8 @@
|
|||||||
* \ strucures arrays which are then used by the display functions
|
* \ strucures arrays which are then used by the display functions
|
||||||
* \ in telnetsrv_measurements.c.
|
* \ in telnetsrv_measurements.c.
|
||||||
* \author Francois TABURET
|
* \author Francois TABURET
|
||||||
* \date 2019
|
* \date 2021
|
||||||
* \version 0.1
|
* \version 0.2
|
||||||
* \company NOKIA BellLabs France
|
* \company NOKIA BellLabs France
|
||||||
* \email: francois.taburet@nokia-bell-labs.com
|
* \email: francois.taburet@nokia-bell-labs.com
|
||||||
* \note
|
* \note
|
||||||
@@ -37,67 +37,119 @@
|
|||||||
|
|
||||||
#define CPU_PHYENB_MEASURE \
|
#define CPU_PHYENB_MEASURE \
|
||||||
{ \
|
{ \
|
||||||
{"phy_proc_tx", &(phyvars->phy_proc_tx),0},\
|
{"phy_proc_tx", &(phyvars->phy_proc_tx),0,1},\
|
||||||
{"phy_proc_rx", &(phyvars->phy_proc_rx),0},\
|
{"phy_proc_rx", &(phyvars->phy_proc_rx),0,1},\
|
||||||
{"rx_prach", &(phyvars->rx_prach),0},\
|
{"rx_prach", &(phyvars->rx_prach),0,1},\
|
||||||
{"ofdm_mod", &(phyvars->ofdm_mod_stats),0},\
|
{"ofdm_mod", &(phyvars->ofdm_mod_stats),0,1},\
|
||||||
{"dlsch_common_and_dci", &(phyvars->dlsch_common_and_dci),0},\
|
{"dlsch_common_and_dci", &(phyvars->dlsch_common_and_dci),0,1},\
|
||||||
{"dlsch_ue_specific", &(phyvars->dlsch_ue_specific),0},\
|
{"dlsch_ue_specific", &(phyvars->dlsch_ue_specific),0,1},\
|
||||||
{"dlsch_encoding", &(phyvars->dlsch_encoding_stats),0},\
|
{"dlsch_encoding", &(phyvars->dlsch_encoding_stats),0,1},\
|
||||||
{"dlsch_modulation", &(phyvars->dlsch_modulation_stats),0},\
|
{"dlsch_modulation", &(phyvars->dlsch_modulation_stats),0,1},\
|
||||||
{"dlsch_scrambling", &(phyvars->dlsch_scrambling_stats),0},\
|
{"dlsch_scrambling", &(phyvars->dlsch_scrambling_stats),0,1},\
|
||||||
{"dlsch_rate_matching", &(phyvars->dlsch_rate_matching_stats),0},\
|
{"dlsch_rate_matching", &(phyvars->dlsch_rate_matching_stats),0,1},\
|
||||||
{"dlsch_turbo_encod_prep", &(phyvars->dlsch_turbo_encoding_preperation_stats),0},\
|
{"dlsch_turbo_encod_prep", &(phyvars->dlsch_turbo_encoding_preperation_stats),0,1},\
|
||||||
{"dlsch_turbo_encod_segm", &(phyvars->dlsch_turbo_encoding_segmentation_stats),0},\
|
{"dlsch_turbo_encod_segm", &(phyvars->dlsch_turbo_encoding_segmentation_stats),0,1},\
|
||||||
{"dlsch_turbo_encod", &(phyvars->dlsch_turbo_encoding_stats),0},\
|
{"dlsch_turbo_encod", &(phyvars->dlsch_turbo_encoding_stats),0,1},\
|
||||||
{"dlsch_turbo_encod_waiting", &(phyvars->dlsch_turbo_encoding_waiting_stats),0},\
|
{"dlsch_turbo_encod_waiting", &(phyvars->dlsch_turbo_encoding_waiting_stats),0,1},\
|
||||||
{"dlsch_turbo_encod_signal", &(phyvars->dlsch_turbo_encoding_signal_stats),0},\
|
{"dlsch_turbo_encod_signal", &(phyvars->dlsch_turbo_encoding_signal_stats),0,1},\
|
||||||
{"dlsch_turbo_encod_main", &(phyvars->dlsch_turbo_encoding_main_stats),0},\
|
{"dlsch_turbo_encod_main", &(phyvars->dlsch_turbo_encoding_main_stats),0,1},\
|
||||||
{"dlsch_turbo_encod_wakeup0", &(phyvars->dlsch_turbo_encoding_wakeup_stats0),0},\
|
{"dlsch_turbo_encod_wakeup0", &(phyvars->dlsch_turbo_encoding_wakeup_stats0),0,1},\
|
||||||
{"dlsch_turbo_encod_wakeup1", &(phyvars->dlsch_turbo_encoding_wakeup_stats1),0},\
|
{"dlsch_turbo_encod_wakeup1", &(phyvars->dlsch_turbo_encoding_wakeup_stats1),0,1},\
|
||||||
{"dlsch_interleaving", &(phyvars->dlsch_interleaving_stats),0},\
|
{"dlsch_interleaving", &(phyvars->dlsch_interleaving_stats),0,1},\
|
||||||
{"rx_dft", &(phyvars->rx_dft_stats),0},\
|
{"rx_dft", &(phyvars->rx_dft_stats),0,1},\
|
||||||
{"ulsch_channel_estimation", &(phyvars->ulsch_channel_estimation_stats),0},\
|
{"ulsch_channel_estimation", &(phyvars->ulsch_channel_estimation_stats),0,1},\
|
||||||
{"ulsch_freq_offset_estimation", &(phyvars->ulsch_freq_offset_estimation_stats),0},\
|
{"ulsch_freq_offset_estimation", &(phyvars->ulsch_freq_offset_estimation_stats),0,1},\
|
||||||
{"ulsch_decoding", &(phyvars->ulsch_decoding_stats),0},\
|
{"ulsch_decoding", &(phyvars->ulsch_decoding_stats),0,1},\
|
||||||
{"ulsch_demodulation", &(phyvars->ulsch_demodulation_stats),0},\
|
{"ulsch_demodulation", &(phyvars->ulsch_demodulation_stats),0,1},\
|
||||||
{"ulsch_rate_unmatching", &(phyvars->ulsch_rate_unmatching_stats),0},\
|
{"ulsch_rate_unmatching", &(phyvars->ulsch_rate_unmatching_stats),0,1},\
|
||||||
{"ulsch_turbo_decoding", &(phyvars->ulsch_turbo_decoding_stats),0},\
|
{"ulsch_turbo_decoding", &(phyvars->ulsch_turbo_decoding_stats),0,1},\
|
||||||
{"ulsch_deinterleaving", &(phyvars->ulsch_deinterleaving_stats),0},\
|
{"ulsch_deinterleaving", &(phyvars->ulsch_deinterleaving_stats),0,1},\
|
||||||
{"ulsch_demultiplexing", &(phyvars->ulsch_demultiplexing_stats),0},\
|
{"ulsch_demultiplexing", &(phyvars->ulsch_demultiplexing_stats),0,1},\
|
||||||
{"ulsch_llr", &(phyvars->ulsch_llr_stats),0},\
|
{"ulsch_llr", &(phyvars->ulsch_llr_stats),0,1},\
|
||||||
{"ulsch_tc_init", &(phyvars->ulsch_tc_init_stats),0},\
|
{"ulsch_tc_init", &(phyvars->ulsch_tc_init_stats),0,1},\
|
||||||
{"ulsch_tc_alpha", &(phyvars->ulsch_tc_alpha_stats),0},\
|
{"ulsch_tc_alpha", &(phyvars->ulsch_tc_alpha_stats),0,1},\
|
||||||
{"ulsch_tc_beta", &(phyvars->ulsch_tc_beta_stats),0},\
|
{"ulsch_tc_beta", &(phyvars->ulsch_tc_beta_stats),0,1},\
|
||||||
{"ulsch_tc_gamma", &(phyvars->ulsch_tc_gamma_stats),0},\
|
{"ulsch_tc_gamma", &(phyvars->ulsch_tc_gamma_stats),0,1},\
|
||||||
{"ulsch_tc_ext", &(phyvars->ulsch_tc_ext_stats),0},\
|
{"ulsch_tc_ext", &(phyvars->ulsch_tc_ext_stats),0,1},\
|
||||||
{"ulsch_tc_intl1", &(phyvars->ulsch_tc_intl1_stats),0},\
|
{"ulsch_tc_intl1", &(phyvars->ulsch_tc_intl1_stats),0,1},\
|
||||||
{"ulsch_tc_intl2", &(phyvars->ulsch_tc_intl2_stats),0},\
|
{"ulsch_tc_intl2", &(phyvars->ulsch_tc_intl2_stats),0,1},\
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CPU_MACENB_MEASURE \
|
#define CPU_MACENB_MEASURE \
|
||||||
{ \
|
{ \
|
||||||
{"eNB_scheduler", &(macvars->eNB_scheduler),0},\
|
{"eNB_scheduler", &(macvars->eNB_scheduler),0,1},\
|
||||||
{"schedule_si", &(macvars->schedule_si),0},\
|
{"schedule_si", &(macvars->schedule_si),0,1},\
|
||||||
{"schedule_ra", &(macvars->schedule_ra),0},\
|
{"schedule_ra", &(macvars->schedule_ra),0,1},\
|
||||||
{"schedule_ulsch", &(macvars->schedule_ulsch),0},\
|
{"schedule_ulsch", &(macvars->schedule_ulsch),0,1},\
|
||||||
{"fill_DLSCH_dci", &(macvars->fill_DLSCH_dci),0},\
|
{"fill_DLSCH_dci", &(macvars->fill_DLSCH_dci),0,1},\
|
||||||
{"schedule_dlsch_pre", &(macvars->schedule_dlsch_preprocessor),0},\
|
{"schedule_dlsch_pre", &(macvars->schedule_dlsch_preprocessor),0,1},\
|
||||||
{"schedule_dlsch", &(macvars->schedule_dlsch),0},\
|
{"schedule_dlsch", &(macvars->schedule_dlsch),0,1},\
|
||||||
{"schedule_mch", &(macvars->schedule_mch),0},\
|
{"schedule_mch", &(macvars->schedule_mch),0,1},\
|
||||||
{"rx_ulsch_sdu", &(macvars->rx_ulsch_sdu),0},\
|
{"rx_ulsch_sdu", &(macvars->rx_ulsch_sdu),0,1},\
|
||||||
{"schedule_pch", &(macvars->schedule_pch),0},\
|
{"schedule_pch", &(macvars->schedule_pch),0,1},\
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CPU_PDCPENB_MEASURE \
|
#define CPU_PDCPENB_MEASURE \
|
||||||
{ \
|
{ \
|
||||||
{"pdcp_run", &(pdcpvars->pdcp_run),0},\
|
{"pdcp_run", &(pdcpvars->pdcp_run),0,1},\
|
||||||
{"data_req", &(pdcpvars->data_req),0},\
|
{"data_req", &(pdcpvars->data_req),0,1},\
|
||||||
{"data_ind", &(pdcpvars->data_ind),0},\
|
{"data_ind", &(pdcpvars->data_ind),0,1},\
|
||||||
{"apply_security", &(pdcpvars->apply_security),0},\
|
{"apply_security", &(pdcpvars->apply_security),0,1},\
|
||||||
{"validate_security", &(pdcpvars->validate_security),0},\
|
{"validate_security", &(pdcpvars->validate_security),0,1},\
|
||||||
{"pdcp_ip", &(pdcpvars->pdcp_ip),0},\
|
{"pdcp_ip", &(pdcpvars->pdcp_ip),0,1},\
|
||||||
{"ip_pdcp", &(pdcpvars->ip_pdcp),0},\
|
{"ip_pdcp", &(pdcpvars->ip_pdcp),0,1},\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* from openair1/PHY/defs_nr_UE.h */
|
||||||
|
#define CPU_PHYNRUE_MEASURE \
|
||||||
|
{ \
|
||||||
|
{"phy_proc", &(UE->phy_proc[0]),0,RX_NB_TH},\
|
||||||
|
{"phy_proc_rx", &(UE-> phy_proc_rx[0]),0,RX_NB_TH},\
|
||||||
|
{"phy_proc_tx", &(UE->phy_proc_tx),0,1},\
|
||||||
|
{"ofdm_mod_stats", &(UE->ofdm_mod_stats),0,1},\
|
||||||
|
{"ulsch_encoding_stats", &(UE->ulsch_encoding_stats),0,1},\
|
||||||
|
{"ulsch_modulation_stats", &(UE->ulsch_modulation_stats),0,1},\
|
||||||
|
{"ulsch_segmentation_stats", &(UE->ulsch_segmentation_stats),0,1},\
|
||||||
|
{"ulsch_rate_matching_stats", &(UE->ulsch_rate_matching_stats),0,1},\
|
||||||
|
{"ulsch_turbo_encoding_stats", &(UE->ulsch_turbo_encoding_stats),0,1},\
|
||||||
|
{"ulsch_interleaving_stats", &(UE->ulsch_interleaving_stats),0,1},\
|
||||||
|
{"ulsch_multiplexing_stats", &(UE->ulsch_multiplexing_stats),0,1},\
|
||||||
|
{"generic_stat", &(UE->generic_stat),0,1},\
|
||||||
|
{"generic_stat_bis", &(UE->generic_stat_bis[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\
|
||||||
|
{"ofdm_demod_stats", &(UE->ofdm_demod_stats),0,1},\
|
||||||
|
{"dlsch_rx_pdcch_stats", &(UE->dlsch_rx_pdcch_stats),0,1},\
|
||||||
|
{"rx_dft_stats", &(UE->rx_dft_stats),0,1},\
|
||||||
|
{"dlsch_c...timation_stats", &(UE->dlsch_channel_estimation_stats),0,1},\
|
||||||
|
{"dlsch_f...timation_stats", &(UE->dlsch_freq_offset_estimation_stats),0,1},\
|
||||||
|
{"dlsch_demodulation_stats", &(UE->dlsch_demodulation_stats),0,1},\
|
||||||
|
{"dlsch_rate_unmatching_stats", &(UE->dlsch_rate_unmatching_stats),0,1},\
|
||||||
|
{"dlsch_turbo_decoding_stats", &(UE->dlsch_turbo_decoding_stats),0,1},\
|
||||||
|
{"dlsch_deinterleaving_stats", &(UE->dlsch_deinterleaving_stats),0,1},\
|
||||||
|
{"dlsch_llr_stats", &(UE->dlsch_llr_stats),0,1},\
|
||||||
|
{"dlsch_unscrambling_stats", &(UE->dlsch_unscrambling_stats),0,1},\
|
||||||
|
{"dlsch_rate_matching_stats", &(UE->dlsch_rate_matching_stats),0,1},\
|
||||||
|
{"dlsch_turbo_encoding_stats", &(UE->dlsch_turbo_encoding_stats),0,1},\
|
||||||
|
{"dlsch_interleaving_stats", &(UE->dlsch_interleaving_stats),0,1},\
|
||||||
|
{"dlsch_tc_init_stats", &(UE->dlsch_tc_init_stats),0,1},\
|
||||||
|
{"dlsch_tc_alpha_stats", &(UE->dlsch_tc_alpha_stats),0,1},\
|
||||||
|
{"dlsch_tc_beta_stats", &(UE->dlsch_tc_beta_stats),0,1},\
|
||||||
|
{"dlsch_tc_gamma_stats", &(UE->dlsch_tc_gamma_stats),0,1},\
|
||||||
|
{"dlsch_tc_ext_stats", &(UE->dlsch_tc_ext_stats),0,1},\
|
||||||
|
{"dlsch_tc_intl1_stats", &(UE->dlsch_tc_intl1_stats),0,1},\
|
||||||
|
{"dlsch_tc_intl2_stats", &(UE->dlsch_tc_intl2_stats),0,1},\
|
||||||
|
{"tx_prach", &(UE->tx_prach),0,1},\
|
||||||
|
{"dlsch_encoding_SIC_stats", &(UE->dlsch_encoding_SIC_stats),0,1},\
|
||||||
|
{"dlsch_scrambling_SIC_stats", &(UE->dlsch_scrambling_SIC_stats),0,1},\
|
||||||
|
{"dlsch_modulation_SIC_stats", &(UE->dlsch_modulation_SIC_stats),0,1},\
|
||||||
|
{"dlsch...ping_unit_SIC_stats", &(UE->dlsch_llr_stripping_unit_SIC_stats),0,1},\
|
||||||
|
{"dlsch_unscrambling_SIC_stats", &(UE->dlsch_unscrambling_SIC_stats),0,1},\
|
||||||
|
{"ue_front_end_stat", &(UE->ue_front_end_stat[0]),0,RX_NB_TH},\
|
||||||
|
{"ue_front_end_per_slot_stat", &(UE->ue_front_end_per_slot_stat[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\
|
||||||
|
{"pdcch_procedures_stat", &(UE->pdcch_procedures_stat[0]),0,RX_NB_TH},\
|
||||||
|
{"pdsch_procedures_stat", &(UE->pdsch_procedures_stat[0]),0,RX_NB_TH},\
|
||||||
|
{"pdsch_procedures_per_slot_stat", &(UE->pdsch_procedures_per_slot_stat[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\
|
||||||
|
{"dlsch_procedures_stat", &(UE->dlsch_procedures_stat[0]),0,RX_NB_TH},\
|
||||||
|
{"dlsch_decoding_stats", &(UE->dlsch_decoding_stats[0]),0,RX_NB_TH},\
|
||||||
|
{"dlsch_llr_stats_para", &(UE->dlsch_llr_stats_parallelization[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -64,13 +64,30 @@ void measurcmd_display_groups(telnet_printfunc_t prnt,telnet_measurgroupdef_t *m
|
|||||||
} /* measurcmd_display_groups */
|
} /* measurcmd_display_groups */
|
||||||
/*----------------------------------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------------------------------*/
|
||||||
/* cpu measurements functions */
|
/* cpu measurements functions */
|
||||||
void measurcmd_display_cpumeasures(telnet_printfunc_t prnt, telnet_cpumeasurdef_t *cpumeasure, int cpumeasure_size) {
|
|
||||||
for (int i=0; i<cpumeasure_size; i++) {
|
|
||||||
prnt("%02d %*s: %15.3f us; %15d %s",i,TELNET_MAXMEASURNAME_LEN-1,(cpumeasure+i)->statname,
|
|
||||||
((cpumeasure+i)->astatptr->trials!=0)?(((cpumeasure+i)->astatptr->diff)/((cpumeasure+i)->astatptr->trials))/cpufreq/1000:0,
|
|
||||||
(cpumeasure+i)->astatptr->trials, ((i%2)==1)?"|\n":" | " );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
static char *stridx(int max,int i, char *buff) {
|
||||||
|
if (max>1)
|
||||||
|
sprintf(buff,"[%d]",i);
|
||||||
|
else
|
||||||
|
sprintf(buff," ");
|
||||||
|
return buff;
|
||||||
|
|
||||||
|
}
|
||||||
|
void measurcmd_display_cpumeasures(telnet_printfunc_t prnt, telnet_cpumeasurdef_t *cpumeasure, int cpumeasure_size) {
|
||||||
|
int p=0;
|
||||||
|
char stridx1[16];
|
||||||
|
char stridx2[16];
|
||||||
|
for (int i=0; i<cpumeasure_size; i++)
|
||||||
|
for (int o1=0;o1<cpumeasure[i].num_occur1;o1++)
|
||||||
|
for (int o2=0;o2<=cpumeasure[i].num_occur2;o2++)
|
||||||
|
{
|
||||||
|
prnt("%02d %*s%s%s: %15.3f us; %15d %s",p,TELNET_MAXMEASURNAME_LEN+7,(cpumeasure+i)->statname,
|
||||||
|
stridx(cpumeasure[i].num_occur1,o1,stridx1),stridx(cpumeasure[i].num_occur2,o2,stridx2),
|
||||||
|
((cpumeasure+i+o1+o2)->astatptr->trials!=0)?(((cpumeasure+i+o1+o2)->astatptr->diff)/((cpumeasure+i+o1+o2)->astatptr->trials))/cpufreq/1000:0,
|
||||||
|
(cpumeasure+i+o1+o2)->astatptr->trials, ((p%2)==1)?"|\n":" | " );
|
||||||
|
p++;
|
||||||
|
}
|
||||||
prnt("\n\n");
|
prnt("\n\n");
|
||||||
} /* measurcmd_display_measures */
|
} /* measurcmd_display_measures */
|
||||||
|
|
||||||
@@ -137,11 +154,17 @@ int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt) {
|
|||||||
}
|
}
|
||||||
telnet_measurgroupdef_t *measurgroups;
|
telnet_measurgroupdef_t *measurgroups;
|
||||||
int num_measurgroups = fptr( &measurgroups);
|
int num_measurgroups = fptr( &measurgroups);
|
||||||
|
|
||||||
int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
|
int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
|
||||||
|
|
||||||
if (s>0) {
|
if (s>0) {
|
||||||
if ( strcmp(subcmd,"groups") == 0) {
|
if ( strcmp(subcmd,"inq") == 0) {
|
||||||
|
notifiedFIFO_elt_t *msg =newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL);
|
||||||
|
time_stats_msg_t *msgdata=NotifiedFifoData(msg);
|
||||||
|
msgdata->msgid = TIMESTAT_MSGID_DISPLAY;
|
||||||
|
msgdata->displayFunc = prnt;
|
||||||
|
pushNotifiedFIFO(&measur_fifo, msg);
|
||||||
|
} else if ( strcmp(subcmd,"groups") == 0){
|
||||||
measurcmd_display_groups(prnt,measurgroups,num_measurgroups);
|
measurcmd_display_groups(prnt,measurgroups,num_measurgroups);
|
||||||
badcmd=0;
|
badcmd=0;
|
||||||
} else {
|
} else {
|
||||||
@@ -182,13 +205,13 @@ int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt) {
|
|||||||
int badcmd=1;
|
int badcmd=1;
|
||||||
|
|
||||||
if (debug > 0)
|
if (debug > 0)
|
||||||
prnt(" measurcmd_show received %s\n",buf);
|
prnt(" measurcmd_cpustats received %s\n",buf);
|
||||||
|
|
||||||
int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
|
int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
|
||||||
|
|
||||||
if (s>0) {
|
if (s>0) {
|
||||||
if ( strcmp(subcmd,"enable") == 0) {
|
if ( strcmp(subcmd,"enable") == 0) {
|
||||||
cpumeas(CPUMEAS_ENABLE);
|
|
||||||
badcmd=0;
|
badcmd=0;
|
||||||
} else if ( strcmp(subcmd,"disable") == 0) {
|
} else if ( strcmp(subcmd,"disable") == 0) {
|
||||||
cpumeas(CPUMEAS_DISABLE);
|
cpumeas(CPUMEAS_DISABLE);
|
||||||
@@ -203,6 +226,64 @@ int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt) {
|
|||||||
free(subcmd);
|
free(subcmd);
|
||||||
return CMDSTATUS_FOUND;
|
return CMDSTATUS_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void measurcmd_async_help(telnet_printfunc_t prnt) {
|
||||||
|
}
|
||||||
|
|
||||||
|
int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt) {
|
||||||
|
char *subcmd=NULL;
|
||||||
|
int idx1, idx2;
|
||||||
|
int okcmd=0;
|
||||||
|
|
||||||
|
if (buf == NULL) {
|
||||||
|
measurcmd_async_help(prnt);
|
||||||
|
return CMDSTATUS_FOUND;
|
||||||
|
}
|
||||||
|
if (debug > 0)
|
||||||
|
prnt(" measurcmd_async received %s\n",buf);
|
||||||
|
|
||||||
|
|
||||||
|
int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
|
||||||
|
|
||||||
|
if (s==1) {
|
||||||
|
if ( strcmp(subcmd,"enable") == 0) {
|
||||||
|
init_meas();
|
||||||
|
okcmd=1;
|
||||||
|
} else if ( strcmp(subcmd,"disable") == 0) {
|
||||||
|
end_meas();
|
||||||
|
okcmd=1;
|
||||||
|
}
|
||||||
|
} else if ( s == 3 ) {
|
||||||
|
int msgid;
|
||||||
|
if ( strcmp(subcmd,"enable") == 0) {
|
||||||
|
msgid = TIMESTAT_MSGID_ENABLE;
|
||||||
|
okcmd=1;
|
||||||
|
} else if ( strcmp(subcmd,"disable") == 0) {
|
||||||
|
msgid = TIMESTAT_MSGID_DISABLE;
|
||||||
|
okcmd=1;
|
||||||
|
} else if ( strcmp(subcmd,"display") == 0) {
|
||||||
|
msgid = TIMESTAT_MSGID_DISPLAY;
|
||||||
|
okcmd=1;
|
||||||
|
}
|
||||||
|
if (okcmd) {
|
||||||
|
notifiedFIFO_elt_t *nfe = newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL);
|
||||||
|
time_stats_msg_t *msg = (time_stats_msg_t *)NotifiedFifoData(nfe);
|
||||||
|
msg->msgid = msgid ;
|
||||||
|
msg->displayFunc = prnt;
|
||||||
|
for(int i=idx1; i<idx2; i++) {
|
||||||
|
msg->timestat_id =i;
|
||||||
|
pushNotifiedFIFO(&measur_fifo, nfe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(okcmd)) {
|
||||||
|
prnt("Unknown command: %s\n",buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(subcmd);
|
||||||
|
return CMDSTATUS_FOUND;
|
||||||
|
}
|
||||||
/*-------------------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* function called at telnet server init to add the measur command */
|
/* function called at telnet server init to add the measur command */
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ typedef struct cpumeasurdef {
|
|||||||
char statname[TELNET_MAXMEASURNAME_LEN];
|
char statname[TELNET_MAXMEASURNAME_LEN];
|
||||||
time_stats_t *astatptr;
|
time_stats_t *astatptr;
|
||||||
unsigned int statemask;
|
unsigned int statemask;
|
||||||
|
uint8_t num_occur1;
|
||||||
|
uint8_t num_occur2;
|
||||||
|
uint8_t num_occur3;
|
||||||
} telnet_cpumeasurdef_t;
|
} telnet_cpumeasurdef_t;
|
||||||
|
|
||||||
typedef struct ltemeasurdef {
|
typedef struct ltemeasurdef {
|
||||||
@@ -60,6 +63,7 @@ typedef struct ltemeasurdef {
|
|||||||
|
|
||||||
#define GROUP_LTESTATS 0
|
#define GROUP_LTESTATS 0
|
||||||
#define GROUP_CPUSTATS 1
|
#define GROUP_CPUSTATS 1
|
||||||
|
|
||||||
typedef void(*measur_dislayfunc_t)(telnet_printfunc_t prnt);
|
typedef void(*measur_dislayfunc_t)(telnet_printfunc_t prnt);
|
||||||
typedef struct mesurgroupdef {
|
typedef struct mesurgroupdef {
|
||||||
char groupname[TELNET_MAXMEASURNAME_LEN];
|
char groupname[TELNET_MAXMEASURNAME_LEN];
|
||||||
@@ -79,9 +83,11 @@ typedef struct mesurgroupdef {
|
|||||||
#ifdef TELNETSRV_MEASURMENTS_MAIN
|
#ifdef TELNETSRV_MEASURMENTS_MAIN
|
||||||
int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt);
|
int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt);
|
||||||
int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt);
|
int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt);
|
||||||
|
int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt);
|
||||||
telnetshell_cmddef_t measur_cmdarray[] = {
|
telnetshell_cmddef_t measur_cmdarray[] = {
|
||||||
{"show", "groups | <group name>" , measurcmd_show},
|
{"show", "groups | <group name> | inq" , measurcmd_show},
|
||||||
{"cpustats","[enable | disable]",measurcmd_cpustats},
|
{"cpustats","[enable | disable]",measurcmd_cpustats},
|
||||||
|
{"async","[enable | disable]",measurcmd_async},
|
||||||
{"","",NULL}
|
{"","",NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,21 @@ You can build any oai softmodem executable separately, you may not need all of t
|
|||||||
|
|
||||||
After completing the build, the binaries are available in the `cmake_targets/ran_build/build` directory. A copy is also available in the `target/bin` directory, with all binaries suffixed by the 3GPP release number, today .Rel15.
|
After completing the build, the binaries are available in the `cmake_targets/ran_build/build` directory. A copy is also available in the `target/bin` directory, with all binaries suffixed by the 3GPP release number, today .Rel15.
|
||||||
|
|
||||||
|
When installing the pre-requisites, especially the `UHD` driver, you can now specify if you want to install from source or not.
|
||||||
|
|
||||||
|
- For `fedora`-based OS, it was already the case all the time. But now you can specify which version to install.
|
||||||
|
- For `ubuntu` OS, the Ettus PPA currently installs the following versions:
|
||||||
|
* `Ubuntu16.04`: --> version `3.15.0.0`
|
||||||
|
* `Ubuntu18.04`: --> version `4.1.0.0`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export BUILD_UHD_FROM_SOURCE=True
|
||||||
|
export UHD_VERSION=3.15.0.0
|
||||||
|
./build_oai -I -w USRP
|
||||||
|
```
|
||||||
|
|
||||||
|
The `UHD_VERSION` env variable `SHALL` be a valid tag (minus `v`) from the `https://github.com/EttusResearch/uhd.git` repository.
|
||||||
|
|
||||||
## Issue when building `nasmeh` module ##
|
## Issue when building `nasmeh` module ##
|
||||||
|
|
||||||
A lot of users and contributors have faced the issue: `nasmesh` module does not build.
|
A lot of users and contributors have faced the issue: `nasmesh` module does not build.
|
||||||
|
|||||||
+9
-6
@@ -104,7 +104,7 @@ The MAC layer implements a subset of the **3GPP 36.321** release v8.6 in support
|
|||||||
- RLC interface (AM, UM)
|
- RLC interface (AM, UM)
|
||||||
- UL power control
|
- UL power control
|
||||||
- Link adaptation
|
- Link adaptation
|
||||||
- Connected DRX (CDRX) support for FDD LTE UE. Compatible with R13 from 3GPP. Support for Cat-M1 UE comming soon.
|
- Connected DRX (CDRX) support for FDD LTE UE. Compatible with R13 from 3GPP. Support for Cat-M1 UE comming soon.
|
||||||
|
|
||||||
## eNB RLC Layer ##
|
## eNB RLC Layer ##
|
||||||
|
|
||||||
@@ -206,7 +206,7 @@ The Physical layer implements **3GPP 36.211**, **36.212**, **36.213** and provid
|
|||||||
- PRACH preamble format 0
|
- PRACH preamble format 0
|
||||||
- All downlink (DL) channels are supported: PSS, SSS, PBCH, PCFICH, PHICH, PDCCH, PDSCH, PMCH
|
- All downlink (DL) channels are supported: PSS, SSS, PBCH, PCFICH, PHICH, PDCCH, PDSCH, PMCH
|
||||||
- All uplink (UL) channels are supported: PRACH, PUSCH, PUCCH (format 1/1a/1b), SRS, DRS
|
- All uplink (UL) channels are supported: PRACH, PUSCH, PUCCH (format 1/1a/1b), SRS, DRS
|
||||||
- LTE MBMS-dedicated cell (feMBMS) procedures subset for LTE release 14 (experimental)
|
- LTE MBMS-dedicated cell (feMBMS) procedures subset for LTE release 14 (experimental)
|
||||||
- LTE non-MBSFN subframe (feMBMS) Carrier Adquistion Subframe-CAS procedures (PSS/SSS/PBCH/PDSH) (experimental)
|
- LTE non-MBSFN subframe (feMBMS) Carrier Adquistion Subframe-CAS procedures (PSS/SSS/PBCH/PDSH) (experimental)
|
||||||
- LTE MBSFN MBSFN subframe channel (feMBMS): PMCH (CS@1.25KHz) (channel estimation for 25MHz bandwidth) (experimental)
|
- LTE MBSFN MBSFN subframe channel (feMBMS): PMCH (CS@1.25KHz) (channel estimation for 25MHz bandwidth) (experimental)
|
||||||
|
|
||||||
@@ -307,12 +307,15 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
- MAC <-> PHY data interface using FAPI P7 interface for BCH PDU, DCI PDU, PDSCH PDU
|
- MAC <-> PHY data interface using FAPI P7 interface for BCH PDU, DCI PDU, PDSCH PDU
|
||||||
- Scheduler procedures for SIB1
|
- Scheduler procedures for SIB1
|
||||||
- Scheduler procedures for RA
|
- Scheduler procedures for RA
|
||||||
- Contention free RA procedure
|
- Contention Free RA procedure
|
||||||
- Contention based RA procedure
|
- Contention Based RA procedure
|
||||||
|
- Msg3 can transfer uplink CCCH, DTCH or DCCH messages
|
||||||
|
- CBRA can be performed using MAC CE or C-RNTI
|
||||||
- Scheduler procedures for CSI-RS
|
- Scheduler procedures for CSI-RS
|
||||||
- MAC downlink scheduler
|
- MAC downlink scheduler
|
||||||
- phy-test scheduler (fixed allocation and usable also without UE)
|
- phy-test scheduler (fixed allocation and usable also without UE)
|
||||||
- regular scheduler with dynamic allocation
|
- regular scheduler with dynamic allocation
|
||||||
|
- MCS adaptation from HARQ BLER
|
||||||
- MAC header generation (including timing advance)
|
- MAC header generation (including timing advance)
|
||||||
- ACK / NACK handling and HARQ procedures for downlink
|
- ACK / NACK handling and HARQ procedures for downlink
|
||||||
- MAC uplink scheduler
|
- MAC uplink scheduler
|
||||||
@@ -398,7 +401,7 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
- Creates TUN interface to PDCP to inject and receive user-place traffic
|
- Creates TUN interface to PDCP to inject and receive user-place traffic
|
||||||
- No connection to the core network
|
- No connection to the core network
|
||||||
* Supporting Standalone (SA) mode:
|
* Supporting Standalone (SA) mode:
|
||||||
- UE can register with the 5G Core Network, establish a PDU Session and exchange user-plane traffic
|
- UE can register with the 5G Core Network, establish a PDU Session and exchange user-plane traffic
|
||||||
|
|
||||||
## NR UE PHY Layer ##
|
## NR UE PHY Layer ##
|
||||||
|
|
||||||
@@ -484,7 +487,7 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
- Interfaces with PDCP, MAC
|
- Interfaces with PDCP, MAC
|
||||||
|
|
||||||
**UE PDCP**
|
**UE PDCP**
|
||||||
* Tx/Rx operations according to 38.323 Rel.16
|
* Tx/Rx operations according to 38.323 Rel.16
|
||||||
- Integrity protection and ciphering procedures
|
- Integrity protection and ciphering procedures
|
||||||
- Sequence number management, SDU dicard and in-order delivery
|
- Sequence number management, SDU dicard and in-order delivery
|
||||||
- Radio bearer establishment/handling and association with PDCP entities
|
- Radio bearer establishment/handling and association with PDCP entities
|
||||||
|
|||||||
+1
-4
@@ -203,10 +203,7 @@ UE on machine 2:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[oai wiki home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
[oai wiki home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
||||||
|
|
||||||
|
|||||||
@@ -37,60 +37,80 @@ RUN /bin/sh oaienv && \
|
|||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --ninja -w USRP --verbose-ci
|
./build_oai --eNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/enb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-enb
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-enb
|
||||||
|
ENV TZ=Europe/Paris
|
||||||
|
|
||||||
RUN yum update -y && \
|
RUN yum update -y && \
|
||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
nettle \
|
nettle \
|
||||||
|
tzdata \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
atlas \
|
atlas \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
net-tools \
|
net-tools \
|
||||||
iputils \
|
iputils \
|
||||||
iproute \
|
iproute \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
|
pip3 install six && \
|
||||||
|
pip3 install requests && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-enb/bin
|
WORKDIR /opt/oai-enb/bin
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/lte-softmodem.Rel15 .
|
COPY --from=enb-build \
|
||||||
COPY --from=enb-build /oai-ran/docker/scripts/enb_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/lte-softmodem.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=enb-build \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=enb-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=enb-build /oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so .
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
./
|
||||||
|
|
||||||
COPY --from=enb-build /usr/local/lib/libprotobuf-c.so.1 .
|
COPY --from=enb-build \
|
||||||
|
/lib64/libconfig.so.9 \
|
||||||
|
/lib64/libblas.so.3 \
|
||||||
|
/lib64/liblapack.so.3 \
|
||||||
|
/lib64/liblapacke.so.3 \
|
||||||
|
/lib64/libboost_chrono.so.1.66.0 \
|
||||||
|
/lib64/libboost_date_time.so.1.66.0 \
|
||||||
|
/lib64/libboost_filesystem.so.1.66.0 \
|
||||||
|
/lib64/libboost_program_options.so.1.66.0 \
|
||||||
|
/lib64/libboost_serialization.so.1.66.0 \
|
||||||
|
/lib64/libboost_thread.so.1.66.0 \
|
||||||
|
/lib64/libboost_system.so.1.66.0 \
|
||||||
|
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||||
|
/lib64/libboost_atomic.so.1.66.0 \
|
||||||
|
/lib64/libboost_timer.so.1.66.0 \
|
||||||
|
/lib64/libboost_regex.so.1.66.0 \
|
||||||
|
/lib64/
|
||||||
|
|
||||||
COPY --from=enb-build /lib64/libconfig.so.9 /lib64
|
# Now we are copying from builder-image the UHD files.
|
||||||
COPY --from=enb-build /lib64/libblas.so.3 /lib64
|
COPY --from=enb-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
COPY --from=enb-build /lib64/liblapack.so.3 /lib64
|
COPY --from=enb-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
|
||||||
COPY --from=enb-build /lib64/liblapacke.so.3 /lib64
|
COPY --from=enb-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-enb/bin
|
||||||
COPY --from=enb-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=enb-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
WORKDIR /usr/local/share/uhd/rfnoc
|
||||||
|
COPY --from=enb-build /usr/local/share/uhd/rfnoc/ .
|
||||||
|
|
||||||
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
# Copy the relevant configuration files for eNB
|
# Copy the relevant configuration files for eNB
|
||||||
WORKDIR /opt/oai-enb/etc
|
WORKDIR /opt/oai-enb/etc
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
#
|
#
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
FROM ran-build:latest AS enb-build
|
FROM ran-build:latest AS enb-build
|
||||||
|
|
||||||
RUN rm -Rf /oai-ran
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /oai-ran
|
WORKDIR /oai-ran
|
||||||
@@ -37,18 +37,19 @@ RUN /bin/sh oaienv && \
|
|||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --ninja -w USRP --verbose-ci
|
./build_oai --eNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/enb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM ubuntu:bionic as oai-enb
|
FROM ubuntu:bionic as oai-enb
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
ENV TZ=Europe
|
ENV TZ=Europe/Paris
|
||||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||||
software-properties-common \
|
software-properties-common \
|
||||||
|
tzdata \
|
||||||
procps \
|
procps \
|
||||||
libsctp1 \
|
libsctp1 \
|
||||||
libnettle6 \
|
libnettle6 \
|
||||||
@@ -60,38 +61,52 @@ RUN apt-get update && \
|
|||||||
iputils-ping \
|
iputils-ping \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
iperf \
|
iperf \
|
||||||
libyaml-0-2 && \
|
|
||||||
# Install UHD driver from ettus ppa
|
|
||||||
# At time of writing, it is 3.14
|
|
||||||
add-apt-repository ppa:ettusresearch/uhd --yes && \
|
|
||||||
apt-get update && \
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
|
||||||
python \
|
python \
|
||||||
|
python3 \
|
||||||
|
python3-six \
|
||||||
|
python3-requests \
|
||||||
libusb-1.0-0 \
|
libusb-1.0-0 \
|
||||||
libuhd003 \
|
libyaml-0-2 && \
|
||||||
uhd-host && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
WORKDIR /opt/oai-enb/bin
|
WORKDIR /opt/oai-enb/bin
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/lte-softmodem.Rel15 .
|
COPY --from=enb-build \
|
||||||
COPY --from=enb-build /oai-ran/docker/scripts/enb_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/lte-softmodem.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=enb-build \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=enb-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=enb-build /oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so .
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
./
|
||||||
|
|
||||||
COPY --from=enb-build /usr/local/lib/libprotobuf-c.so.1 .
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
COPY --from=enb-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
|
COPY --from=enb-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
|
||||||
|
COPY --from=enb-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-enb/bin
|
||||||
|
WORKDIR /usr/lib/x86_64-linux-gnu
|
||||||
|
COPY --from=enb-build \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 \
|
||||||
|
./
|
||||||
|
|
||||||
RUN ldconfig
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
# Copy the relevant configuration files for eNB
|
# Copy the relevant configuration files for eNB
|
||||||
WORKDIR /opt/oai-enb/etc
|
WORKDIR /opt/oai-enb/etc
|
||||||
|
|||||||
@@ -37,10 +37,12 @@ RUN /bin/sh oaienv && \
|
|||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --gNB --ninja -w USRP --verbose-ci
|
./build_oai --gNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/gnb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-gnb
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-gnb
|
||||||
|
ENV TZ=Europe/Paris
|
||||||
|
|
||||||
RUN yum repolist --disablerepo=* && \
|
RUN yum repolist --disablerepo=* && \
|
||||||
yum update -y && \
|
yum update -y && \
|
||||||
@@ -51,52 +53,70 @@ RUN yum repolist --disablerepo=* && \
|
|||||||
atlas \
|
atlas \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
nettle \
|
nettle \
|
||||||
|
tzdata \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
net-tools \
|
net-tools \
|
||||||
iputils \
|
iputils \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
|
pip3 install six && \
|
||||||
|
pip3 install requests && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-gnb/bin
|
WORKDIR /opt/oai-gnb/bin
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/nr-softmodem.Rel15 .
|
COPY --from=gnb-build \
|
||||||
COPY --from=gnb-build /oai-ran/docker/scripts/gnb_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/nr-softmodem.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=gnb-build \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc.so .
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_orig.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
|
./
|
||||||
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
COPY --from=gnb-build \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
/lib64/libconfig.so.9 \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
/lib64/libforms.so.2 \
|
||||||
COPY --from=gnb-build /usr/local/lib/libprotobuf-c.so.1 .
|
/lib64/libblas.so.3 \
|
||||||
|
/lib64/liblapack.so.3 \
|
||||||
|
/lib64/liblapacke.so.3 \
|
||||||
|
/lib64/libboost_chrono.so.1.66.0 \
|
||||||
|
/lib64/libboost_date_time.so.1.66.0 \
|
||||||
|
/lib64/libboost_filesystem.so.1.66.0 \
|
||||||
|
/lib64/libboost_program_options.so.1.66.0 \
|
||||||
|
/lib64/libboost_serialization.so.1.66.0 \
|
||||||
|
/lib64/libboost_thread.so.1.66.0 \
|
||||||
|
/lib64/libboost_system.so.1.66.0 \
|
||||||
|
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||||
|
/lib64/libboost_atomic.so.1.66.0 \
|
||||||
|
/lib64/libboost_timer.so.1.66.0 \
|
||||||
|
/lib64/libboost_regex.so.1.66.0 \
|
||||||
|
/lib64/
|
||||||
|
|
||||||
COPY --from=gnb-build /lib64/libconfig.so.9 /lib64
|
# Now we are copying from builder-image the UHD files.
|
||||||
COPY --from=gnb-build /lib64/libforms.so.2 /lib64
|
COPY --from=gnb-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
COPY --from=gnb-build /lib64/libblas.so.3 /lib64
|
COPY --from=gnb-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
|
||||||
COPY --from=gnb-build /lib64/liblapack.so.3 /lib64
|
COPY --from=gnb-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-gnb/bin
|
||||||
COPY --from=gnb-build /lib64/liblapacke.so.3 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=gnb-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
WORKDIR /usr/local/share/uhd/rfnoc
|
||||||
|
COPY --from=gnb-build /usr/local/share/uhd/rfnoc/ .
|
||||||
|
|
||||||
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
# Copy the relevant configuration files for gNB
|
# Copy the relevant configuration files for gNB
|
||||||
WORKDIR /opt/oai-gnb/etc
|
WORKDIR /opt/oai-gnb/etc
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ RUN /bin/sh oaienv && \
|
|||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --gNB --ninja -w USRP --verbose-ci
|
./build_oai --gNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/gnb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM ubuntu:bionic as oai-gnb
|
FROM ubuntu:bionic as oai-gnb
|
||||||
@@ -59,41 +60,55 @@ RUN apt-get update && \
|
|||||||
net-tools \
|
net-tools \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
iputils-ping \
|
iputils-ping \
|
||||||
libyaml-0-2 && \
|
|
||||||
# Install UHD driver from ettus ppa
|
|
||||||
# At time of writing, it is 3.14
|
|
||||||
add-apt-repository ppa:ettusresearch/uhd --yes && \
|
|
||||||
apt-get update && \
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
|
||||||
python \
|
python \
|
||||||
|
python3 \
|
||||||
|
python3-six \
|
||||||
|
python3-requests \
|
||||||
libusb-1.0-0 \
|
libusb-1.0-0 \
|
||||||
libuhd003 \
|
libyaml-0-2 && \
|
||||||
uhd-host && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
WORKDIR /opt/oai-gnb/bin
|
WORKDIR /opt/oai-gnb/bin
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/nr-softmodem.Rel15 .
|
COPY --from=gnb-build \
|
||||||
COPY --from=gnb-build /oai-ran/docker/scripts/gnb_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/nr-softmodem.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=gnb-build \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=gnb-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc.so .
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
COPY --from=gnb-build /oai-ran/cmake_targets/ran_build/build/libldpc_orig.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
|
./
|
||||||
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
# Now we are copying from builder-image the UHD files.
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
COPY --from=gnb-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
COPY --from=gnb-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
|
||||||
COPY --from=gnb-build /usr/local/lib/libprotobuf-c.so.1 .
|
COPY --from=gnb-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-gnb/bin
|
||||||
|
WORKDIR /usr/lib/x86_64-linux-gnu
|
||||||
|
COPY --from=gnb-build \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 \
|
||||||
|
./
|
||||||
|
|
||||||
RUN ldconfig
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
# Copy the relevant configuration files for gNB
|
# Copy the relevant configuration files for gNB
|
||||||
WORKDIR /opt/oai-gnb/etc
|
WORKDIR /opt/oai-gnb/etc
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ RUN /bin/sh oaienv && \
|
|||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --RU --ninja -w USRP --verbose-ci
|
./build_oai --RU --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/lte_ru_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ru
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ru
|
||||||
@@ -48,40 +49,57 @@ RUN yum update -y && \
|
|||||||
tzdata \
|
tzdata \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
atlas \
|
atlas \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
net-tools \
|
net-tools \
|
||||||
iputils \
|
iputils \
|
||||||
iproute && \
|
iproute && \
|
||||||
|
pip3 install six && \
|
||||||
|
pip3 install requests && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ru/bin
|
WORKDIR /opt/oai-lte-ru/bin
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/oairu.Rel15 .
|
COPY --from=ru-build \
|
||||||
COPY --from=ru-build /oai-ran/docker/scripts/lte_ru_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/oairu.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
.
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=ru-build \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
|
./
|
||||||
|
|
||||||
|
COPY --from=ru-build \
|
||||||
|
/lib64/libconfig.so.9 \
|
||||||
|
/lib64/libblas.so.3 \
|
||||||
|
/lib64/liblapack.so.3 \
|
||||||
|
/lib64/liblapacke.so.3 \
|
||||||
|
/lib64/libboost_chrono.so.1.66.0 \
|
||||||
|
/lib64/libboost_date_time.so.1.66.0 \
|
||||||
|
/lib64/libboost_filesystem.so.1.66.0 \
|
||||||
|
/lib64/libboost_program_options.so.1.66.0 \
|
||||||
|
/lib64/libboost_serialization.so.1.66.0 \
|
||||||
|
/lib64/libboost_thread.so.1.66.0 \
|
||||||
|
/lib64/libboost_system.so.1.66.0 \
|
||||||
|
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||||
|
/lib64/libboost_atomic.so.1.66.0 \
|
||||||
|
/lib64/libboost_timer.so.1.66.0 \
|
||||||
|
/lib64/libboost_regex.so.1.66.0 \
|
||||||
|
/lib64/
|
||||||
|
|
||||||
# Copying from the ran-build image the USRP needed packages
|
# Copying from the ran-build image the USRP needed packages
|
||||||
COPY --from=ru-build /lib64/libconfig.so.9 /lib64
|
COPY --from=ru-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
COPY --from=ru-build /lib64/libblas.so.3 /lib64
|
COPY --from=ru-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
|
||||||
COPY --from=ru-build /lib64/liblapack.so.3 /lib64
|
COPY --from=ru-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ru/bin
|
||||||
COPY --from=ru-build /lib64/liblapacke.so.3 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
WORKDIR /usr/local/share/uhd/rfnoc
|
||||||
COPY --from=ru-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
COPY --from=ru-build /usr/local/share/uhd/rfnoc/ .
|
||||||
COPY --from=ru-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=ru-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ RUN /bin/sh oaienv && \
|
|||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --RU --ninja -w USRP --verbose-ci
|
./build_oai --RU --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/lte_ru_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM ubuntu:bionic as oai-lte-ru
|
FROM ubuntu:bionic as oai-lte-ru
|
||||||
@@ -54,30 +55,46 @@ RUN apt-get update && \
|
|||||||
libatlas3-base \
|
libatlas3-base \
|
||||||
libconfig9 \
|
libconfig9 \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
python \
|
||||||
|
python3 \
|
||||||
|
python3-six \
|
||||||
|
python3-requests \
|
||||||
|
libusb-1.0-0 \
|
||||||
iputils-ping \
|
iputils-ping \
|
||||||
iproute2 && \
|
iproute2 && \
|
||||||
# Install UHD driver from ettus ppa
|
|
||||||
# At time of writing, it is 3.14
|
|
||||||
add-apt-repository ppa:ettusresearch/uhd --yes && \
|
|
||||||
apt-get update && \
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
|
||||||
python \
|
|
||||||
libusb-1.0-0 \
|
|
||||||
libuhd003 \
|
|
||||||
uhd-host && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ru/bin
|
WORKDIR /opt/oai-lte-ru/bin
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/oairu.Rel15 .
|
COPY --from=ru-build \
|
||||||
COPY --from=ru-build /oai-ran/docker/scripts/lte_ru_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/oairu.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=ru-build \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=ru-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
|
./
|
||||||
|
|
||||||
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
COPY --from=ru-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
|
COPY --from=ru-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
|
||||||
|
COPY --from=ru-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ru/bin
|
||||||
|
|
||||||
|
WORKDIR /usr/lib/x86_64-linux-gnu
|
||||||
|
COPY --from=ru-build \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \
|
||||||
|
./
|
||||||
|
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
|||||||
@@ -38,63 +38,83 @@ RUN /bin/sh oaienv && \
|
|||||||
./build_oai --UE --ninja -w USRP --verbose-ci
|
./build_oai --UE --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
|
||||||
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml
|
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/lte_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ue
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ue
|
||||||
|
ENV TZ=Europe/Paris
|
||||||
|
|
||||||
RUN yum update -y && \
|
RUN yum update -y && \
|
||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
nettle \
|
nettle \
|
||||||
|
tzdata \
|
||||||
atlas \
|
atlas \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
iproute \
|
iproute \
|
||||||
net-tools \
|
net-tools \
|
||||||
iputils \
|
iputils \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
|
pip3 install six && \
|
||||||
|
pip3 install requests && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue/bin
|
WORKDIR /opt/oai-lte-ue/bin
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/lte-uesoftmodem.Rel15 .
|
COPY --from=lte-ue-build \
|
||||||
COPY --from=lte-ue-build /oai-ran/docker/scripts/lte_ue_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/lte-uesoftmodem.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/conf2uedata .
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/nvram .
|
/oai-ran/targets/bin/conf2uedata \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/usim .
|
/oai-ran/targets/bin/nvram \
|
||||||
|
/oai-ran/targets/bin/usim \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=lte-ue-build \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=lte-ue-build /oai-ran/cmake_targets/ran_build/build/libSIMU.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=lte-ue-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
./
|
||||||
|
|
||||||
COPY --from=lte-ue-build /usr/local/lib/libprotobuf-c.so.1 .
|
COPY --from=lte-ue-build \
|
||||||
|
/lib64/libconfig.so.9 \
|
||||||
|
/lib64/libblas.so.3 \
|
||||||
|
/lib64/liblapack.so.3 \
|
||||||
|
/lib64/liblapacke.so.3 \
|
||||||
|
/lib64/libboost_chrono.so.1.66.0 \
|
||||||
|
/lib64/libboost_date_time.so.1.66.0 \
|
||||||
|
/lib64/libboost_filesystem.so.1.66.0 \
|
||||||
|
/lib64/libboost_program_options.so.1.66.0 \
|
||||||
|
/lib64/libboost_serialization.so.1.66.0 \
|
||||||
|
/lib64/libboost_thread.so.1.66.0 \
|
||||||
|
/lib64/libboost_system.so.1.66.0 \
|
||||||
|
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||||
|
/lib64/libboost_atomic.so.1.66.0 \
|
||||||
|
/lib64/libboost_timer.so.1.66.0 \
|
||||||
|
/lib64/libboost_regex.so.1.66.0 \
|
||||||
|
/lib64/
|
||||||
|
|
||||||
COPY --from=lte-ue-build /lib64/libconfig.so.9 /lib64
|
# Now we are copying from builder-image the UHD files.
|
||||||
COPY --from=lte-ue-build /lib64/libblas.so.3 /lib64
|
COPY --from=lte-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
COPY --from=lte-ue-build /lib64/liblapack.so.3 /lib64
|
COPY --from=lte-ue-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
|
||||||
COPY --from=lte-ue-build /lib64/liblapacke.so.3 /lib64
|
COPY --from=lte-ue-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ue/bin
|
||||||
COPY --from=lte-ue-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=lte-ue-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
WORKDIR /usr/local/share/uhd/rfnoc
|
||||||
|
COPY --from=lte-ue-build /usr/local/share/uhd/rfnoc/ .
|
||||||
|
|
||||||
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
# Copy the relevant configuration files for UE
|
# Copy the relevant configuration files for UE
|
||||||
WORKDIR /opt/oai-lte-ue/etc
|
WORKDIR /opt/oai-lte-ue/etc
|
||||||
|
|||||||
@@ -38,18 +38,19 @@ RUN /bin/sh oaienv && \
|
|||||||
./build_oai --UE --ninja -w USRP --verbose-ci
|
./build_oai --UE --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
|
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
|
||||||
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml
|
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml && \
|
||||||
|
cp /oai-ran/docker/scripts/lte_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM ubuntu:bionic as oai-lte-ue
|
FROM ubuntu:bionic as oai-lte-ue
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
ENV TZ=Europe
|
ENV TZ=Europe/Paris
|
||||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||||
software-properties-common \
|
software-properties-common \
|
||||||
|
tzdata \
|
||||||
procps \
|
procps \
|
||||||
libsctp1 \
|
libsctp1 \
|
||||||
libnettle6 \
|
libnettle6 \
|
||||||
@@ -58,44 +59,59 @@ RUN apt-get update && \
|
|||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
python \
|
||||||
|
python3 \
|
||||||
|
python3-six \
|
||||||
|
python3-requests \
|
||||||
|
libusb-1.0-0 \
|
||||||
iputils-ping \
|
iputils-ping \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
iperf \
|
iperf \
|
||||||
libyaml-0-2 && \
|
libyaml-0-2 && \
|
||||||
# Install UHD driver from ettus ppa
|
|
||||||
# At time of writing, it is 3.14
|
|
||||||
add-apt-repository ppa:ettusresearch/uhd --yes && \
|
|
||||||
apt-get update && \
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
|
||||||
python \
|
|
||||||
libusb-1.0-0 \
|
|
||||||
libuhd003 \
|
|
||||||
uhd-host && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue/bin
|
WORKDIR /opt/oai-lte-ue/bin
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/lte-uesoftmodem.Rel15 .
|
COPY --from=lte-ue-build \
|
||||||
COPY --from=lte-ue-build /oai-ran/docker/scripts/lte_ue_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/lte-uesoftmodem.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/conf2uedata .
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/nvram .
|
/oai-ran/targets/bin/conf2uedata \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/usim .
|
/oai-ran/targets/bin/nvram \
|
||||||
|
/oai-ran/targets/bin/usim \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=lte-ue-build \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=lte-ue-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=lte-ue-build /oai-ran/cmake_targets/ran_build/build/libSIMU.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=lte-ue-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
./
|
||||||
|
|
||||||
COPY --from=lte-ue-build /usr/local/lib/libprotobuf-c.so.1 .
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
COPY --from=lte-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
|
COPY --from=lte-ue-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
|
||||||
|
COPY --from=lte-ue-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ue/bin
|
||||||
|
|
||||||
RUN ldconfig
|
WORKDIR /usr/lib/x86_64-linux-gnu
|
||||||
|
COPY --from=lte-ue-build \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 \
|
||||||
|
./
|
||||||
|
|
||||||
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
# Copy the relevant configuration files for UE
|
# Copy the relevant configuration files for UE
|
||||||
WORKDIR /opt/oai-lte-ue/etc
|
WORKDIR /opt/oai-lte-ue/etc
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ COPY . .
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --nrUE --ninja -w USRP --verbose-ci
|
./build_oai --nrUE --ninja -w USRP --verbose-ci && \
|
||||||
|
cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue
|
||||||
@@ -51,55 +52,72 @@ RUN yum update -y && \
|
|||||||
iputils \
|
iputils \
|
||||||
iproute \
|
iproute \
|
||||||
atlas \
|
atlas \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
|
pip3 install six && \
|
||||||
|
pip3 install requests && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue/bin
|
WORKDIR /opt/oai-nr-ue/bin
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/nr-uesoftmodem.Rel15 .
|
COPY --from=nr-ue-build \
|
||||||
COPY --from=nr-ue-build /oai-ran/docker/scripts/nr_ue_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/nr-uesoftmodem.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue/etc
|
WORKDIR /opt/oai-nr-ue/etc
|
||||||
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
|
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=nr-ue-build \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc.so .
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_orig.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
./
|
||||||
|
|
||||||
COPY --from=nr-ue-build /usr/local/lib/libprotobuf-c.so.1 .
|
COPY --from=nr-ue-build \
|
||||||
|
/lib64/libconfig.so.9 \
|
||||||
|
/lib64/libblas.so.3 \
|
||||||
|
/lib64/liblapack.so.3 \
|
||||||
|
/lib64/liblapacke.so.3 \
|
||||||
|
/lib64/libforms.so.2 \
|
||||||
|
/lib64/libboost_chrono.so.1.66.0 \
|
||||||
|
/lib64/libboost_date_time.so.1.66.0 \
|
||||||
|
/lib64/libboost_filesystem.so.1.66.0 \
|
||||||
|
/lib64/libboost_program_options.so.1.66.0 \
|
||||||
|
/lib64/libboost_serialization.so.1.66.0 \
|
||||||
|
/lib64/libboost_thread.so.1.66.0 \
|
||||||
|
/lib64/libboost_system.so.1.66.0 \
|
||||||
|
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||||
|
/lib64/libboost_atomic.so.1.66.0 \
|
||||||
|
/lib64/libboost_timer.so.1.66.0 \
|
||||||
|
/lib64/libboost_regex.so.1.66.0 \
|
||||||
|
/lib64/
|
||||||
|
|
||||||
COPY --from=nr-ue-build /lib64/libconfig.so.9 /lib64
|
# Now we are copying from builder-image the UHD files.
|
||||||
COPY --from=nr-ue-build /lib64/libblas.so.3 /lib64
|
COPY --from=nr-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
COPY --from=nr-ue-build /lib64/liblapack.so.3 /lib64
|
COPY --from=nr-ue-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
|
||||||
COPY --from=nr-ue-build /lib64/liblapacke.so.3 /lib64
|
COPY --from=nr-ue-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-nr-ue/bin
|
||||||
COPY --from=nr-ue-build /lib64/libforms.so.2 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_chrono.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_date_time.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_filesystem.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_program_options.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_serialization.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_thread.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_system.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_atomic.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /lib64/libboost_timer.so.1.66.0 /lib64
|
|
||||||
COPY --from=nr-ue-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
|
|
||||||
|
|
||||||
RUN ldconfig
|
WORKDIR /usr/local/share/uhd/rfnoc
|
||||||
|
COPY --from=nr-ue-build /usr/local/share/uhd/rfnoc/ .
|
||||||
|
|
||||||
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
# Copy the relevant configuration files for eNB
|
# Copy the relevant configuration files for eNB
|
||||||
WORKDIR /opt/oai-nr-ue/etc
|
WORKDIR /opt/oai-nr-ue/etc
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ COPY . .
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --nrUE --ninja -w USRP --verbose-ci
|
./build_oai --nrUE --ninja -w USRP --verbose-ci && \
|
||||||
|
cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM ubuntu:bionic as oai-nr-ue
|
FROM ubuntu:bionic as oai-nr-ue
|
||||||
@@ -55,47 +56,62 @@ RUN apt-get update && \
|
|||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
python \
|
||||||
|
python3 \
|
||||||
|
python3-six \
|
||||||
|
python3-requests \
|
||||||
|
libusb-1.0-0 \
|
||||||
iputils-ping \
|
iputils-ping \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
iperf \
|
iperf \
|
||||||
libyaml-0-2 && \
|
libyaml-0-2 && \
|
||||||
# Install UHD driver from ettus ppa
|
|
||||||
# At time of writing, it is 3.14
|
|
||||||
add-apt-repository ppa:ettusresearch/uhd --yes && \
|
|
||||||
apt-get update && \
|
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
|
||||||
python \
|
|
||||||
libusb-1.0-0 \
|
|
||||||
libuhd003 \
|
|
||||||
uhd-host && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue/bin
|
WORKDIR /opt/oai-nr-ue/bin
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/nr-uesoftmodem.Rel15 .
|
COPY --from=nr-ue-build \
|
||||||
COPY --from=nr-ue-build /oai-ran/docker/scripts/nr_ue_entrypoint.sh entrypoint.sh
|
/oai-ran/targets/bin/nr-uesoftmodem.Rel15 \
|
||||||
|
/oai-ran/docker/scripts/entrypoint.sh \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue/etc
|
WORKDIR /opt/oai-nr-ue/etc
|
||||||
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
|
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=nr-ue-build \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 .
|
/oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
|
/oai-ran/targets/bin/libtcp_bridge_oai.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
|
/oai-ran/targets/bin/librfsimulator.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libcoding.so .
|
/oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 \
|
||||||
COPY --from=nr-ue-build /oai-ran/targets/bin/libparams_libconfig.so .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
|
/oai-ran/targets/bin/libparams_libconfig.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc.so .
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
COPY --from=nr-ue-build /oai-ran/cmake_targets/ran_build/build/libldpc_orig.so .
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so"
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so"
|
/usr/local/lib/libprotobuf-c.so.1 \
|
||||||
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
|
./
|
||||||
|
|
||||||
COPY --from=nr-ue-build /usr/local/lib/libprotobuf-c.so.1 .
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
COPY --from=nr-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||||
|
COPY --from=nr-ue-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
|
||||||
|
COPY --from=nr-ue-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-nr-ue/bin
|
||||||
|
|
||||||
RUN ldconfig
|
WORKDIR /usr/lib/x86_64-linux-gnu
|
||||||
|
COPY --from=nr-ue-build \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 \
|
||||||
|
./
|
||||||
|
|
||||||
|
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
|
||||||
|
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
|
||||||
|
ldconfig
|
||||||
|
|
||||||
WORKDIR /opt/oai-nr-ue
|
WORKDIR /opt/oai-nr-ue
|
||||||
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
|
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ RUN /bin/sh oaienv && \
|
|||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --phy_simulators --ninja --verbose-ci
|
./build_oai --phy_simulators --ninja --verbose-ci
|
||||||
|
|
||||||
|
|
||||||
#start from scratch for target executable
|
#start from scratch for target executable
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim
|
||||||
|
|
||||||
@@ -45,6 +44,7 @@ RUN yum update -y && \
|
|||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
nettle \
|
nettle \
|
||||||
|
tzdata \
|
||||||
atlas \
|
atlas \
|
||||||
hostname \
|
hostname \
|
||||||
sudo \
|
sudo \
|
||||||
@@ -58,66 +58,62 @@ RUN yum update -y && \
|
|||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-physim/targets/bin
|
WORKDIR /opt/oai-physim/targets/bin
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/dlsim.Rel15 .
|
COPY --from=phy-sim-build \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_dlsim.Rel15 .
|
/oai-ran/targets/bin/dlsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_prachsim.Rel15 .
|
/oai-ran/targets/bin/nr_dlsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_ulschsim.Rel15 .
|
/oai-ran/targets/bin/nr_prachsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/polartest.Rel15 .
|
/oai-ran/targets/bin/nr_ulschsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/ulsim.Rel15 .
|
/oai-ran/targets/bin/polartest.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/ldpctest.Rel15 .
|
/oai-ran/targets/bin/ulsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_dlschsim.Rel15 .
|
/oai-ran/targets/bin/ldpctest.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_pbchsim.Rel15 .
|
/oai-ran/targets/bin/nr_dlschsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_pucchsim.Rel15 .
|
/oai-ran/targets/bin/nr_pbchsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_ulsim.Rel15 .
|
/oai-ran/targets/bin/nr_pucchsim.Rel15 \
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/smallblocktest.Rel15 .
|
/oai-ran/targets/bin/nr_ulsim.Rel15 \
|
||||||
|
/oai-ran/targets/bin/smallblocktest.Rel15 \
|
||||||
|
./
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=phy-sim-build /oai-ran/targets/bin/libcoding.so .
|
COPY --from=phy-sim-build \
|
||||||
COPY --from=phy-sim-build /lib64/liblapacke.so.3 .
|
/oai-ran/targets/bin/libcoding.so \
|
||||||
COPY --from=phy-sim-build /lib64/libX11.so.6 .
|
/lib64/liblapacke.so.3 \
|
||||||
COPY --from=phy-sim-build /lib64/libXpm.so.4 .
|
/lib64/libX11.so.6 \
|
||||||
COPY --from=phy-sim-build /lib64/libxcb.so.1 .
|
/lib64/libXpm.so.4 \
|
||||||
COPY --from=phy-sim-build /lib64/libXau.so.6 .
|
/lib64/libxcb.so.1 \
|
||||||
COPY --from=phy-sim-build /lib64/libforms.so.2 .
|
/lib64/libXau.so.6 \
|
||||||
COPY --from=phy-sim-build /lib64/libblas.so.3 .
|
/lib64/libforms.so.2 \
|
||||||
COPY --from=phy-sim-build /lib64/liblapack.so.3 .
|
/lib64/libblas.so.3 \
|
||||||
COPY --from=phy-sim-build /lib64/libexslt.so.0 .
|
/lib64/liblapack.so.3 \
|
||||||
COPY --from=phy-sim-build /lib64/libxslt.so.1 .
|
/lib64/libexslt.so.0 \
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libdfts.so .
|
/lib64/libxslt.so.1 \
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libSIMU.so .
|
/oai-ran/cmake_targets/phy_simulators/build/libdfts.so \
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libldpc.so .
|
/oai-ran/cmake_targets/phy_simulators/build/libSIMU.so \
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libldpc_orig.so .
|
/oai-ran/cmake_targets/phy_simulators/build/libldpc.so \
|
||||||
|
/oai-ran/cmake_targets/phy_simulators/build/libldpc_orig.so \
|
||||||
|
./
|
||||||
|
|
||||||
RUN ldconfig
|
RUN ldconfig
|
||||||
|
|
||||||
#debug
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/dlsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/nr_dlsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/nr_prachsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/nr_ulschsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/polartest.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/ulsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/ldpctest.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/nr_dlschsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/nr_pbchsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/nr_pucchsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/nr_ulsim.Rel15
|
|
||||||
#RUN ldd /opt/oai-physim/targets/bin/smallblocktest.Rel15
|
|
||||||
|
|
||||||
# Copy some executables
|
# Copy some executables
|
||||||
WORKDIR /usr/bin/
|
WORKDIR /usr/bin/
|
||||||
|
|
||||||
COPY --from=phy-sim-build /usr/bin/killall .
|
COPY --from=phy-sim-build \
|
||||||
COPY --from=phy-sim-build /usr/bin/xmlstarlet .
|
/usr/bin/killall \
|
||||||
COPY --from=phy-sim-build /usr/bin/svn .
|
/usr/bin/xmlstarlet \
|
||||||
|
/usr/bin/svn \
|
||||||
|
./
|
||||||
|
|
||||||
# Copy the relevant configuration files for phySim
|
# Copy the relevant configuration files for phySim
|
||||||
WORKDIR /opt/oai-physim/
|
WORKDIR /opt/oai-physim/
|
||||||
|
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/autotests/run_exec_autotests.bash /opt/oai-physim/cmake_targets/autotests/
|
COPY --from=phy-sim-build \
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/autotests/test_case_list.xml /opt/oai-physim/cmake_targets/autotests/
|
/oai-ran/cmake_targets/autotests/run_exec_autotests.bash \
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/autotests/tools/free_mem.bash /opt/oai-physim/cmake_targets/autotests/tools/
|
/oai-ran/cmake_targets/autotests/test_case_list.xml \
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/tools/build_helper /opt/oai-physim/cmake_targets/tools/
|
/opt/oai-physim/cmake_targets/autotests/
|
||||||
COPY --from=phy-sim-build /oai-ran/cmake_targets/tools/test_helper /opt/oai-physim/cmake_targets/tools/
|
COPY --from=phy-sim-build \
|
||||||
|
/oai-ran/cmake_targets/autotests/tools/free_mem.bash \
|
||||||
|
/oai-ran/cmake_targets/tools/build_helper \
|
||||||
|
/oai-ran/cmake_targets/tools/test_helper \
|
||||||
|
/opt/oai-physim/cmake_targets/tools/
|
||||||
|
|
||||||
#CMD ["sleep", "infinity"]
|
#CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -28,6 +28,9 @@
|
|||||||
|
|
||||||
FROM registry.access.redhat.com/ubi8/ubi:latest AS ran-build
|
FROM registry.access.redhat.com/ubi8/ubi:latest AS ran-build
|
||||||
ARG NEEDED_GIT_PROXY
|
ARG NEEDED_GIT_PROXY
|
||||||
|
ENV TZ=Europe/Paris
|
||||||
|
ENV BUILD_UHD_FROM_SOURCE=True
|
||||||
|
ENV UHD_VERSION=3.15.0.0
|
||||||
|
|
||||||
COPY tmp/ca/redhat-uep.pem /etc/rhsm/ca
|
COPY tmp/ca/redhat-uep.pem /etc/rhsm/ca
|
||||||
COPY tmp/entitlement/*.pem /etc/pki/entitlement
|
COPY tmp/entitlement/*.pem /etc/pki/entitlement
|
||||||
@@ -63,6 +66,5 @@ COPY . .
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai -I -w USRP
|
./build_oai -I -w USRP && \
|
||||||
|
rm /etc/pki/entitlement/*pem
|
||||||
RUN rm /etc/pki/entitlement/*pem
|
|
||||||
|
|||||||
@@ -29,8 +29,9 @@
|
|||||||
FROM ubuntu:bionic AS ran-build
|
FROM ubuntu:bionic AS ran-build
|
||||||
ARG NEEDED_GIT_PROXY
|
ARG NEEDED_GIT_PROXY
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
ENV TZ=Europe
|
ENV TZ=Europe/Paris
|
||||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
ENV BUILD_UHD_FROM_SOURCE=True
|
||||||
|
ENV UHD_VERSION=3.15.0.0
|
||||||
|
|
||||||
#install developers pkg/repo
|
#install developers pkg/repo
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
|
|||||||
@@ -9,20 +9,28 @@ ENABLE_X2=${ENABLE_X2:-no}
|
|||||||
THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
|
THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
|
||||||
|
|
||||||
# Based another env var, pick one template to use
|
# Based another env var, pick one template to use
|
||||||
if [[ -v USE_FDD_CU ]]; then ln -s $PREFIX/etc/cu.fdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_FDD_CU ]]; then cp $PREFIX/etc/cu.fdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_FDD_DU ]]; then ln -s $PREFIX/etc/du.fdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_FDD_DU ]]; then cp $PREFIX/etc/du.fdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_FDD_MONO ]]; then ln -s $PREFIX/etc/enb.fdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_FDD_MONO ]]; then cp $PREFIX/etc/enb.fdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_TDD_MONO ]]; then ln -s $PREFIX/etc/enb.tdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_TDD_MONO ]]; then cp $PREFIX/etc/enb.tdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_FDD_FAPI_RCC ]]; then ln -s $PREFIX/etc/rcc.nfapi.fdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_FDD_FAPI_RCC ]]; then cp $PREFIX/etc/rcc.nfapi.fdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_FDD_IF4P5_RCC ]]; then ln -s $PREFIX/etc/rcc.if4p5.fdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_FDD_IF4P5_RCC ]]; then cp $PREFIX/etc/rcc.if4p5.fdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_TDD_IF4P5_RCC ]]; then ln -s $PREFIX/etc/rcc.if4p5.tdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_TDD_IF4P5_RCC ]]; then cp $PREFIX/etc/rcc.if4p5.tdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_FDD_RRU ]]; then ln -s $PREFIX/etc/rru.fdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_FDD_RRU ]]; then cp $PREFIX/etc/rru.fdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
if [[ -v USE_TDD_RRU ]]; then ln -s $PREFIX/etc/rru.tdd.conf $PREFIX/etc/enb.conf; fi
|
if [[ -v USE_TDD_RRU ]]; then cp $PREFIX/etc/rru.tdd.conf $PREFIX/etc/enb.conf; fi
|
||||||
|
# Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself.
|
||||||
|
if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/enb.conf; fi
|
||||||
|
|
||||||
# Only this template will be manipulated
|
# Only this template will be manipulated
|
||||||
CONFIG_FILES=`ls $PREFIX/etc/enb.conf || true`
|
CONFIG_FILES=`ls $PREFIX/etc/enb.conf || true`
|
||||||
|
|
||||||
for c in ${CONFIG_FILES}; do
|
for c in ${CONFIG_FILES}; do
|
||||||
|
# Sometimes templates have no pattern to be replaced.
|
||||||
|
if ! grep -oP '@[a-zA-Z0-9_]+@' ${c}; then
|
||||||
|
echo "Configuration is already set"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
# grep variable names (format: ${VAR}) from template to be rendered
|
# grep variable names (format: ${VAR}) from template to be rendered
|
||||||
VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
|
VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
|
||||||
|
|
||||||
@@ -46,11 +54,11 @@ done
|
|||||||
|
|
||||||
# Load the USRP binaries
|
# Load the USRP binaries
|
||||||
if [[ -v USE_B2XX ]]; then
|
if [[ -v USE_B2XX ]]; then
|
||||||
/usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
|
$PREFIX/bin/uhd_images_downloader.py -t b2xx
|
||||||
elif [[ -v USE_X3XX ]]; then
|
elif [[ -v USE_X3XX ]]; then
|
||||||
/usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
|
$PREFIX/bin/uhd_images_downloader.py -t x3xx
|
||||||
elif [[ -v USE_N3XX ]]; then
|
elif [[ -v USE_N3XX ]]; then
|
||||||
/usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
|
$PREFIX/bin/uhd_images_downloader.py -t n3xx
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "=================================="
|
echo "=================================="
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user