Commit ce487326 authored by sagar arora's avatar sagar arora

Merge branch 'releasev1.4.0' into 'master'

Release v1.4.0

See merge request oai/cn5g/oai-cn5g-nrf!29
parents 2621c6e2 e9af95b7
# RELEASE NOTES: # # RELEASE NOTES: #
## v1.4.0 -- July 2022 ##
* Remove unused packages
* Add NF profile handling for PCF
* HTTP/2 support for SBI interface
* Official images produced by CI are pushed to `oaisoftwarealliance` Docker-Hub Team account
* Reduce image size
## v1.3.0 -- January 2022 ## ## v1.3.0 -- January 2022 ##
* NF profile update * NF profile update
......
...@@ -175,7 +175,9 @@ pipeline { ...@@ -175,7 +175,9 @@ pipeline {
success { success {
script { script {
sh 'echo "DEPLOYMENT: OK" > archives/deployment_status.log' sh 'echo "DEPLOYMENT: OK" > archives/deployment_status.log'
sh 'python3 ./ci-scripts/routeCheck.py --mode=Add --userName=' + dsT_host_user + ' --hostName=' + dsT_host if (dsT_host_flag) {
sh 'python3 ./ci-scripts/routeCheck.py --mode=Add --userName=' + dsT_host_user + ' --hostName=' + dsT_host
}
} }
} }
unsuccessful { unsuccessful {
...@@ -235,7 +237,9 @@ pipeline { ...@@ -235,7 +237,9 @@ pipeline {
steps { steps {
script { script {
echo '\u2705 \u001B[32mUn-Deploy NRF\u001B[0m' echo '\u2705 \u001B[32mUn-Deploy NRF\u001B[0m'
sh 'python3 ./ci-scripts/routeCheck.py --mode=Delete --userName=' + dsT_host_user + ' --hostName=' + dsT_host if (dsT_host_flag) {
sh 'python3 ./ci-scripts/routeCheck.py --mode=Delete --userName=' + dsT_host_user + ' --hostName=' + dsT_host
}
dir('ci-scripts/dsTesterDockerCompose') { dir('ci-scripts/dsTesterDockerCompose') {
sh 'docker-compose down > ../../archives/compose_normal_down.log 2>&1' sh 'docker-compose down > ../../archives/compose_normal_down.log 2>&1'
} }
...@@ -252,7 +256,9 @@ pipeline { ...@@ -252,7 +256,9 @@ pipeline {
sh 'docker logs cicd-oai-nrf > archives/logs/oai_nrf.log' sh 'docker logs cicd-oai-nrf > archives/logs/oai_nrf.log'
} }
// Remove any leftover containers/networks // Remove any leftover containers/networks
sh 'python3 ./ci-scripts/routeCheck.py --mode=Delete --userName=' + dsT_host_user + ' --hostName=' + dsT_host if (dsT_host_flag) {
sh 'python3 ./ci-scripts/routeCheck.py --mode=Delete --userName=' + dsT_host_user + ' --hostName=' + dsT_host
}
dir('ci-scripts/dsTesterDockerCompose') { dir('ci-scripts/dsTesterDockerCompose') {
sh 'docker-compose down > ../../archives/compose_l_down.log 2>&1' sh 'docker-compose down > ../../archives/compose_l_down.log 2>&1'
} }
......
...@@ -50,6 +50,9 @@ def NRF_BASE_IMAGE_TAG = params.NrfBaseImageTag ...@@ -50,6 +50,9 @@ def NRF_BASE_IMAGE_TAG = params.NrfBaseImageTag
// Merge Request Link // Merge Request Link
def gitlabMergeRequestLink def gitlabMergeRequestLink
// Docker Hub account to push to
def DH_Account = "oaisoftwarealliance"
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// Pipeline start // Pipeline start
pipeline { pipeline {
...@@ -107,7 +110,7 @@ pipeline { ...@@ -107,7 +110,7 @@ pipeline {
if ("MERGE".equals(env.gitlabActionType)) { if ("MERGE".equals(env.gitlabActionType)) {
try { try {
myShCmd('docker image inspect --format=\'Size = {{.Size}} bytes\' oai-nrf-base:' + NRF_BASE_IMAGE_TAG, rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmdNoDir('docker image inspect --format=\'Size = {{.Size}} bytes\' oai-nrf-base:' + NRF_BASE_IMAGE_TAG, rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
} catch (Exception e) { } catch (Exception e) {
currentBuild.result = 'FAILURE' currentBuild.result = 'FAILURE'
echo '\u26D4 \u001B[31mBase Image does not exist\u001B[0m' echo '\u26D4 \u001B[31mBase Image does not exist\u001B[0m'
...@@ -134,7 +137,6 @@ pipeline { ...@@ -134,7 +137,6 @@ pipeline {
echo "MR TITLE is ${env.gitlabMergeRequestTitle}" echo "MR TITLE is ${env.gitlabMergeRequestTitle}"
gitCommitAuthorEmailAddr = env.gitlabUserEmail gitCommitAuthorEmailAddr = env.gitlabUserEmail
echo "GitLab Usermail is ${gitCommitAuthorEmailAddr}" echo "GitLab Usermail is ${gitCommitAuthorEmailAddr}"
sh "git fetch --prune --unshallow"
shortenShaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%h" ' + env.gitlabMergeRequestLastCommit shortenShaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%h" ' + env.gitlabMergeRequestLastCommit
shortenShaOne = shortenShaOne.trim() shortenShaOne = shortenShaOne.trim()
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}" sh "./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
...@@ -185,7 +187,7 @@ pipeline { ...@@ -185,7 +187,7 @@ pipeline {
echo "Maybe a previous build went wrong" echo "Maybe a previous build went wrong"
} }
// In case of push to `develop` branch we build from scratch // In case of push to `develop` branch we build from scratch
myShCmd('docker build --no-cache --target oai-nrf --tag oai-nrf:' + nrf_tag + ' --file docker/Dockerfile.nrf.ubuntu18 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > archives/nrf_docker_image_build.log 2>&1', rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd('docker build --no-cache --target oai-nrf --tag oai-nrf:' + nrf_tag + ' --file docker/Dockerfile.nrf.ubuntu18 . > archives/nrf_docker_image_build.log 2>&1', rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
} }
if ("MERGE".equals(env.gitlabActionType)) { if ("MERGE".equals(env.gitlabActionType)) {
try { try {
...@@ -200,6 +202,9 @@ pipeline { ...@@ -200,6 +202,9 @@ pipeline {
myShCmd('docker image tag oai-nrf-base:' + NRF_BASE_IMAGE_TAG + ' oai-nrf-base:latest', rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd('docker image tag oai-nrf-base:' + NRF_BASE_IMAGE_TAG + ' oai-nrf-base:latest', rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
myShCmd('docker build --no-cache --target oai-nrf --tag oai-nrf:' + nrf_tag + ' --file ci-scripts/docker/Dockerfile.ci.ubuntu.18.04 . > archives/nrf_docker_image_build.log 2>&1', rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd('docker build --no-cache --target oai-nrf --tag oai-nrf:' + nrf_tag + ' --file ci-scripts/docker/Dockerfile.ci.ubuntu.18.04 . > archives/nrf_docker_image_build.log 2>&1', rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
} }
// Putting a place holder to try out on the flattening of image.
// If not satisfactory, we can remove it.
myShCmd('python3 ./ci-scripts/flatten_image.py --tag oai-nrf:' + nrf_tag, rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
myShCmd('docker image ls >> archives/nrf_docker_image_build.log', rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd('docker image ls >> archives/nrf_docker_image_build.log', rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
// We will keep also the TMP image in U18 case. // We will keep also the TMP image in U18 case.
if ("MERGE".equals(env.gitlabActionType)) { if ("MERGE".equals(env.gitlabActionType)) {
...@@ -243,10 +248,14 @@ pipeline { ...@@ -243,10 +248,14 @@ pipeline {
} }
myShCmd('sudo podman image prune --force', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host) myShCmd('sudo podman image prune --force', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
// Copy the RHEL Host certificates for building // Copy the RHEL Host certificates for building
myShCmd('mkdir -p tmp/ca tmp/entitlement', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host) myShCmd('mkdir -p ./etc-pki-entitlement ./rhsm-conf ./rhsm-ca', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
myShCmd('cp /etc/pki/entitlement/*pem tmp/entitlement', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host) myShCmd('cp /etc/pki/entitlement/*pem ./etc-pki-entitlement', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
myShCmd('sudo cp /etc/rhsm/ca/redhat-uep.pem tmp/ca', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host) myShCmd('sudo cp /etc/rhsm/rhsm.conf ./rhsm-conf', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
myShCmd('sudo podman build --no-cache --target oai-nrf --tag oai-nrf:' + nrf_tag + ' --file docker/Dockerfile.nrf.rhel8 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > archives/nrf_podman_image_build.log 2>&1', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host) myShCmd('sudo cp /etc/rhsm/ca/*pem ./rhsm-ca', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
myShCmd('sudo podman build --no-cache --target oai-nrf --tag oai-nrf:' + nrf_tag + ' --file docker/Dockerfile.nrf.rhel8 . > archives/nrf_podman_image_build.log 2>&1', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
// Putting a place holder to try out on the flattening of image.
// If not satisfactory, we can remove it.
myShCmd('python3 ./ci-scripts/flatten_image.py --tag oai-nrf:' + nrf_tag, rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
myShCmd('sudo podman image ls >> archives/nrf_podman_image_build.log', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host) myShCmd('sudo podman image ls >> archives/nrf_podman_image_build.log', rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
if ("MERGE".equals(env.gitlabActionType)) { if ("MERGE".equals(env.gitlabActionType)) {
myShCmd('sudo podman image tag oai-nrf:' + nrf_tag + ' oai-nrf:' + rhel_nrf_tag, rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host) myShCmd('sudo podman image tag oai-nrf:' + nrf_tag + ' oai-nrf:' + rhel_nrf_tag, rem_rhel_host_flag, rem_rhel_host_user, rem_rhel_host)
...@@ -439,6 +448,36 @@ pipeline { ...@@ -439,6 +448,36 @@ pipeline {
} }
} }
} }
stage ('Testing the tutorials') {
steps {
script {
gitlabCommitStatus(name: "Test tutorials") {
localStatus = build job: 'OAI-CN5G-Tutorials-Check',
parameters: [
string(name: 'NRF_TAG', value: String.valueOf(nrf_tag)),
string(name: 'NRF_BRANCH', value: String.valueOf(nrf_branch))
], propagate: false
localResult = localStatus.getResult()
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
echo "Tutorials Test Job is OK"
} else {
echo "Tutorials Test Job is KO"
sh "ci-scripts/fail.sh"
}
}
}
}
post {
always {
script {
copyArtifacts(projectName: 'OAI-CN5G-Tutorials-Check',
filter: '*_results_oai_cn5g*.html',
selector: lastCompleted())
}
}
}
}
} }
} }
// For the moment it is Docker-Hub, but we might have a new one internally. // For the moment it is Docker-Hub, but we might have a new one internally.
...@@ -451,9 +490,9 @@ pipeline { ...@@ -451,9 +490,9 @@ pipeline {
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DockerHubCredentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password'] [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DockerHubCredentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password']
]) { ]) {
myShCmd("echo ${DH_Password} | docker login --username ${DH_Username} --password-stdin", rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd("echo ${DH_Password} | docker login --username ${DH_Username} --password-stdin", rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
myShCmd("docker image tag oai-nrf:develop ${DH_Username}/oai-nrf:develop", rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd("docker image tag oai-nrf:develop ${DH_Account}/oai-nrf:develop", rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
myShCmd("docker push ${DH_Username}/oai-nrf:develop", rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd("docker push ${DH_Account}/oai-nrf:develop", rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
myShCmd("docker rmi ${DH_Username}/oai-nrf:develop", rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd("docker rmi ${DH_Account}/oai-nrf:develop", rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
myShCmd("docker logout", rem_u18_host_flag, rem_u18_host_user, rem_u18_host) myShCmd("docker logout", rem_u18_host_flag, rem_u18_host_user, rem_u18_host)
} }
} }
...@@ -587,6 +626,14 @@ def myShCmd(cmd, flag, user, host) { ...@@ -587,6 +626,14 @@ def myShCmd(cmd, flag, user, host) {
} }
} }
def myShCmdNoDir(cmd, flag, user, host) {
if (flag) {
sh "ssh -t -t ${user}@${host} '${cmd}'"
} else {
sh "${cmd}"
}
}
def myShRetCmd(cmd, flag, user, host) { def myShRetCmd(cmd, flag, user, host) {
if (flag) { if (flag) {
ret = sh returnStdout: true, script: "ssh -t -t ${user}@${host} 'cd /tmp/CI-CN-NRF && ${cmd}'" ret = sh returnStdout: true, script: "ssh -t -t ${user}@${host} 'cd /tmp/CI-CN-NRF && ${cmd}'"
......
...@@ -176,8 +176,14 @@ class HtmlReport(): ...@@ -176,8 +176,14 @@ class HtmlReport():
self.file.write(' </tr>\n') self.file.write(' </tr>\n')
def testSummaryHeader(self): def testSummaryHeader(self):
self.file.write(' <h2>DS Tester Summary</h2>\n')
cwd = os.getcwd() cwd = os.getcwd()
if not os.path.isfile(cwd + '/DS-TEST-RESULTS/dsTester_Summary.txt'):
self.file.write(' <br>\n')
self.file.write(' <div class="alert alert-warning">\n')
self.file.write(' <strong>NO TESTING DONE BEFORE MIGRATION TO NEW RAN EMULATOR <span class="glyphicon glyphicon-warning-sign"></span></strong>\n')
self.file.write(' </div>\n')
return True
self.file.write(' <h2>DS Tester Summary</h2>\n')
finalStatusOK = False finalStatusOK = False
if os.path.isfile(cwd + '/DS-TEST-RESULTS/dcnrf2.yaml'): if os.path.isfile(cwd + '/DS-TEST-RESULTS/dcnrf2.yaml'):
cmd = f'egrep -c "final-result: pass" DS-TEST-RESULTS/dcnrf2.yaml || true' cmd = f'egrep -c "final-result: pass" DS-TEST-RESULTS/dcnrf2.yaml || true'
...@@ -204,6 +210,9 @@ class HtmlReport(): ...@@ -204,6 +210,9 @@ class HtmlReport():
def testSummaryDetails(self): def testSummaryDetails(self):
self.file.write(' <br>\n') self.file.write(' <br>\n')
cwd = os.getcwd()
if not os.path.isfile(cwd + '/DS-TEST-RESULTS/dsTester_Summary.txt'):
return
self.file.write(' <button data-toggle="collapse" data-target="#ds-tester-details">More details on DsTester results</button>\n') self.file.write(' <button data-toggle="collapse" data-target="#ds-tester-details">More details on DsTester results</button>\n')
self.file.write(' <div id="ds-tester-details" class="collapse">\n') self.file.write(' <div id="ds-tester-details" class="collapse">\n')
self.file.write(' <table class="table-bordered" width = "60%" align = "center" border = 1>\n') self.file.write(' <table class="table-bordered" width = "60%" align = "center" border = 1>\n')
...@@ -212,7 +221,6 @@ class HtmlReport(): ...@@ -212,7 +221,6 @@ class HtmlReport():
self.file.write(' <th>Test Status</th>\n') self.file.write(' <th>Test Status</th>\n')
self.file.write(' <th>Test Details</th>\n') self.file.write(' <th>Test Details</th>\n')
self.file.write(' </tr>\n') self.file.write(' </tr>\n')
cwd = os.getcwd()
if os.path.isfile(cwd + '/DS-TEST-RESULTS/dcnrf2.yaml'): if os.path.isfile(cwd + '/DS-TEST-RESULTS/dcnrf2.yaml'):
with open(cwd + '/DS-TEST-RESULTS/dcnrf2.yaml') as f: with open(cwd + '/DS-TEST-RESULTS/dcnrf2.yaml') as f:
data = yaml.load(f) data = yaml.load(f)
......
...@@ -139,6 +139,16 @@ then ...@@ -139,6 +139,16 @@ then
exit 1 exit 1
fi fi
# When running in a container, in /home folder
IS_CONTAINER=`egrep -c "docker|kubepods|podman|buildah|libpod" /proc/self/cgroup || true`
if [ $IS_CONTAINER -ne 0 ]
then
if [ $PWD = "/home/src" ]
then
git config --global --add safe.directory /home
fi
fi
# Merge request scenario # Merge request scenario
MERGE_COMMMIT=`git log -n1 --pretty=format:%H` MERGE_COMMMIT=`git log -n1 --pretty=format:%H`
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
# #
# Dockerfile for the Open-Air-Interface NRF service # Dockerfile for the Open-Air-Interface NRF service
# Valid for Ubuntu-18.04 (bionic) # Valid for Ubuntu-18.04 (bionic)
# The port exposed by container are 8080/tcp , 9090/tcp change it according to your setup
# #
#--------------------------------------------------------------------- #---------------------------------------------------------------------
...@@ -37,6 +38,7 @@ RUN cp -Rf /openair-nrf-ext-ref /openair-nrf/build/ext ...@@ -37,6 +38,7 @@ RUN cp -Rf /openair-nrf-ext-ref /openair-nrf/build/ext
# Building NRF # Building NRF
WORKDIR /openair-nrf/build/scripts WORKDIR /openair-nrf/build/scripts
RUN ./build_nrf --clean --Verbose --build-type Release --jobs && \ RUN ./build_nrf --clean --Verbose --build-type Release --jobs && \
ldd /openair-nrf/build/nrf/build/nrf && \
mv /openair-nrf/build/nrf/build/nrf /openair-nrf/build/nrf/build/oai_nrf mv /openair-nrf/build/nrf/build/nrf /openair-nrf/build/nrf/build/oai_nrf
#--------------------------------------------------------------------- #---------------------------------------------------------------------
...@@ -55,12 +57,13 @@ RUN apt-get update && \ ...@@ -55,12 +57,13 @@ RUN apt-get update && \
iputils-ping \ iputils-ping \
bc \ bc \
tzdata \ tzdata \
tshark \
libasan4 \ libasan4 \
libgoogle-glog0v5 \ libgoogle-glog0v5 \
libdouble-conversion1 \ libdouble-conversion1 \
libconfig++9v5 \ libconfig++9v5 \
libldap-2.4-2 \ libldap-2.4-2 \
libkrb5-3 \
libgssapi-krb5-2 \
librtmp1 \ librtmp1 \
libpsl5 \ libpsl5 \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
...@@ -73,6 +76,7 @@ COPY --from=oai-nrf-builder \ ...@@ -73,6 +76,7 @@ COPY --from=oai-nrf-builder \
./ ./
COPY --from=oai-nrf-builder \ COPY --from=oai-nrf-builder \
/usr/local/lib/libpistache.so \ /usr/local/lib/libpistache.so \
/usr/local/lib/libnghttp2.so.14 \
/usr/local/lib/libnghttp2_asio.so.1 \ /usr/local/lib/libnghttp2_asio.so.1 \
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 \ /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 \
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \ /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \
......
...@@ -7,8 +7,7 @@ services: ...@@ -7,8 +7,7 @@ services:
- 80 - 80
- 9090 - 9090
command: > command: >
bash -c "nohup tshark -i eth0 -w /tmp/nrf.pcap 2>&1 > /dev/null & bash -c "/openair-nrf/bin/oai_nrf -c /openair-nrf/etc/nrf.conf -o | tee /tmp/nrf.log 2>&1
/openair-nrf/bin/oai_nrf -c /openair-nrf/etc/nrf.conf -o | tee /tmp/nrf.log 2>&1
" "
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
......
"""
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
"""
import argparse
import re
import subprocess
import sys
def main() -> None:
args = _parse_args()
status = perform_flattening(args.tag)
sys.exit(status)
def _parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description='Flattening Image')
parser.add_argument(
'--tag', '-t',
action='store',
required=True,
help='Image Tag in image-name:image tag format',
)
return parser.parse_args()
def perform_flattening(tag):
# First detect which docker/podman command to use
cli = ''
image_prefix = ''
cmd = 'which podman || true'
podman_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
if re.search('podman', podman_check.strip()):
cli = 'sudo podman'
image_prefix = 'localhost/'
if cli == '':
cmd = 'which docker || true'
docker_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
if re.search('docker', docker_check.strip()):
cli = 'docker'
image_prefix = ''
if cli == '':
print ('No docker / podman installed: quitting')
return -1
print (f'Flattening {tag}')
# Creating a container
cmd = cli + ' run --name test-flatten --entrypoint /bin/true -d ' + tag
print (cmd)
subprocess.check_output(cmd, shell=True, universal_newlines=True)
# Export / Import trick
cmd = cli + ' export test-flatten | ' + cli + ' import '
# Bizarro syntax issue with podman
if cli == 'docker':
cmd += ' --change "ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
else:
cmd += ' --change "ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
cmd += ' --change "WORKDIR /openair-nrf" '
cmd += ' --change "EXPOSE 80/tcp" '
cmd += ' --change "EXPOSE 9090/tcp" '
cmd += ' --change "CMD [\\"/openair-nrf/bin/oai_nrf\\", \\"-c\\", \\"/openair-nrf/etc/nrf.conf\\", \\"-o\\"]" '
cmd += ' --change "ENTRYPOINT [\\"/bin/bash\\", \\"/openair-nrf/bin/entrypoint.sh\\"]" '
cmd += ' - ' + image_prefix + tag
print (cmd)
subprocess.check_output(cmd, shell=True, universal_newlines=True)
# Remove container
cmd = cli + ' rm -f test-flatten'
print (cmd)
subprocess.check_output(cmd, shell=True, universal_newlines=True)
# At this point the original image is a dangling image.
# CI pipeline will clean up (`image prune --force`)
return 0
if __name__ == '__main__':
main()
...@@ -618,7 +618,7 @@ class HtmlReport(): ...@@ -618,7 +618,7 @@ class HtmlReport():
status = False status = False
if nfType == 'NRF': if nfType == 'NRF':
section_start_pattern = 'build_nrf --clean --Verbose --build-type Release --jobs' section_start_pattern = 'build_nrf --clean --Verbose --build-type Release --jobs'
section_end_pattern = 'FROM ubuntu:bionic as oai-nrf$' section_end_pattern = 'FROM .* as oai-nrf$'
pass_pattern = 'nrf installed' pass_pattern = 'nrf installed'
section_status = False section_status = False
with open(cwd + '/archives/' + logFileName, 'r') as logfile: with open(cwd + '/archives/' + logFileName, 'r') as logfile:
...@@ -666,7 +666,7 @@ class HtmlReport(): ...@@ -666,7 +666,7 @@ class HtmlReport():
if os.path.isfile(cwd + '/archives/' + logFileName): if os.path.isfile(cwd + '/archives/' + logFileName):
if nfType == 'NRF': if nfType == 'NRF':
section_start_pattern = 'build_nrf --clean --Verbose --build-type Release --jobs' section_start_pattern = 'build_nrf --clean --Verbose --build-type Release --jobs'
section_end_pattern = 'FROM ubuntu:bionic as oai-nrf$' section_end_pattern = 'FROM .* as oai-nrf$'
section_status = False section_status = False
with open(cwd + '/archives/' + logFileName, 'r') as logfile: with open(cwd + '/archives/' + logFileName, 'r') as logfile:
for line in logfile: for line in logfile:
...@@ -727,23 +727,31 @@ class HtmlReport(): ...@@ -727,23 +727,31 @@ class HtmlReport():
for variant in variants: for variant in variants:
logFileName = 'nrf_' + variant + '_image_build.log' logFileName = 'nrf_' + variant + '_image_build.log'
if os.path.isfile(cwd + '/archives/' + logFileName): if os.path.isfile(cwd + '/archives/' + logFileName):
section_start_pattern = 'FROM ubuntu:bionic as oai-nrf$' section_start_pattern = 'FROM .* as oai-nrf$'
section_end_pattern = 'COPY --from=oai-nrf-builder /openair-nrf/scripts/entrypoint.sh entrypoint.sh' section_end_pattern = 'COPY --from=oai-nrf-builder /openair-nrf/etc/nrf.conf '
section_status = False section_status = False
status = False status = False
noPbInLDD = True
with open(cwd + '/archives/' + logFileName, 'r') as logfile: with open(cwd + '/archives/' + logFileName, 'r') as logfile:
for line in logfile: for line in logfile:
result = re.search(section_start_pattern, line) result = re.search(section_start_pattern, line)
if result is not None: if result is not None:
section_status = True section_status = True
result = re.search('not found', line)
if section_status and result is not None:
noPbInLDD = False
result = re.search(section_end_pattern, line) result = re.search(section_end_pattern, line)
if result is not None: if result is not None:
section_status = False section_status = False
status = True status = True
logfile.close() logfile.close()
if status: if status and noPbInLDD:
cell_msg = ' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>' cell_msg = ' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg += 'OK:\n' cell_msg += 'OK:\n'
elif noPbInLDD:
cell_msg = ' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg += 'KO:\n'
cell_msg += ' Some libraries were not copied from builder image\n'
else: else:
cell_msg = ' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>' cell_msg = ' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg += 'KO:\n' cell_msg += 'KO:\n'
...@@ -841,7 +849,7 @@ class HtmlReport(): ...@@ -841,7 +849,7 @@ class HtmlReport():
result = re.search(section_end_pattern, line) result = re.search(section_end_pattern, line)
if result is not None: if result is not None:
section_status = False section_status = False
if section_status: if section_status and not status:
if nfType == 'NRF': if nfType == 'NRF':
if self.git_pull_request: if self.git_pull_request:
result = re.search('oai-nrf *ci-tmp', line) result = re.search('oai-nrf *ci-tmp', line)
......
...@@ -33,8 +33,12 @@ FROM registry.access.redhat.com/ubi8/ubi:latest AS oai-nrf-builder ...@@ -33,8 +33,12 @@ FROM registry.access.redhat.com/ubi8/ubi:latest AS oai-nrf-builder
ARG NEEDED_GIT_PROXY ARG NEEDED_GIT_PROXY
COPY tmp/ca/redhat-uep.pem /etc/rhsm/ca # Copy the entitlements
COPY tmp/entitlement/*.pem /etc/pki/entitlement COPY ./etc-pki-entitlement /etc/pki/entitlement
# Copy the subscription manager configurations
COPY ./rhsm-conf /etc/rhsm
COPY ./rhsm-ca /etc/rhsm/ca
RUN rm -f /etc/rhsm-host && \ RUN rm -f /etc/rhsm-host && \
yum repolist --disablerepo=* && \ yum repolist --disablerepo=* && \
...@@ -78,7 +82,8 @@ RUN yum update -y && \ ...@@ -78,7 +82,8 @@ RUN yum update -y && \
net-tools \ net-tools \
procps-ng\ procps-ng\
libevent && \ libevent && \
rm -rf /var/lib/apt/lists/* yum clean all -y && \
rm -rf /var/cache/yum /var/cache/dnf
# Copying executable and generated libraries # Copying executable and generated libraries
WORKDIR /openair-nrf/bin WORKDIR /openair-nrf/bin
...@@ -103,7 +108,8 @@ COPY --from=oai-nrf-builder \ ...@@ -103,7 +108,8 @@ COPY --from=oai-nrf-builder \
/usr/lib64/libboost_regex.so.1.66.0 \ /usr/lib64/libboost_regex.so.1.66.0 \
/usr/lib64/ /usr/lib64/
RUN ldconfig RUN ldconfig && \
ldd /openair-nrf/bin/oai_nrf
# Copying template configuration files # Copying template configuration files
# The configuration folder will be flat # The configuration folder will be flat
......
#/*
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# * contributor license agreements. See the NOTICE file distributed with
# * this work for additional information regarding copyright ownership.
# * The OpenAirInterface Software Alliance licenses this file to You under
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
# * except in compliance with the License.
# * You may obtain a copy of the License at
# *
# * http://www.openairinterface.org/?page_id=698
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# * contact@openairinterface.org
# */
#--------------------------------------------------------------------- #---------------------------------------------------------------------
# #
# Dockerfile for the Open-Air-Interface NRF service # Dockerfile for the Open-Air-Interface NRF service
...@@ -34,6 +54,7 @@ WORKDIR /openair-nrf ...@@ -34,6 +54,7 @@ WORKDIR /openair-nrf
WORKDIR /openair-nrf/build/scripts WORKDIR /openair-nrf/build/scripts
RUN ./build_nrf --install-deps --force RUN ./build_nrf --install-deps --force
RUN ./build_nrf --clean --Verbose --build-type Release --jobs && \ RUN ./build_nrf --clean --Verbose --build-type Release --jobs && \
ldd /openair-nrf/build/nrf/build/nrf && \
mv /openair-nrf/build/nrf/build/nrf /openair-nrf/build/nrf/build/oai_nrf mv /openair-nrf/build/nrf/build/nrf /openair-nrf/build/nrf/build/oai_nrf
#--------------------------------------------------------------------- #---------------------------------------------------------------------
...@@ -52,12 +73,13 @@ RUN apt-get update && \ ...@@ -52,12 +73,13 @@ RUN apt-get update && \
iputils-ping \ iputils-ping \
bc \ bc \
tzdata \ tzdata \
tshark \
libasan4 \ libasan4 \
libgoogle-glog0v5 \ libgoogle-glog0v5 \
libdouble-conversion1 \ libdouble-conversion1 \
libconfig++9v5 \ libconfig++9v5 \
libldap-2.4-2 \ libldap-2.4-2 \
libkrb5-3 \
libgssapi-krb5-2 \
librtmp1 \ librtmp1 \
libpsl5 \ libpsl5 \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
...@@ -70,6 +92,7 @@ COPY --from=oai-nrf-builder \ ...@@ -70,6 +92,7 @@ COPY --from=oai-nrf-builder \
./ ./
COPY --from=oai-nrf-builder \ COPY --from=oai-nrf-builder \
/usr/local/lib/libpistache.so \ /usr/local/lib/libpistache.so \
/usr/local/lib/libnghttp2.so.14 \
/usr/local/lib/libnghttp2_asio.so.1 \ /usr/local/lib/libnghttp2_asio.so.1 \
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 \ /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 \
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \ /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 \
......
...@@ -12,62 +12,63 @@ ...@@ -12,62 +12,63 @@
*/ */
#include "NFProfile.h" #include "NFProfile.h"
#include <iostream>
namespace oai { namespace oai {
namespace nrf { namespace nrf {
namespace model { namespace model {
NFProfile::NFProfile() { NFProfile::NFProfile() {
m_NfInstanceId = ""; m_NfInstanceId = "";
m_NfInstanceName = ""; m_NfInstanceName = "";
m_NfInstanceNameIsSet = false; m_NfInstanceNameIsSet = false;
m_HeartBeatTimer = 0; m_HeartBeatTimer = 0;
m_HeartBeatTimerIsSet = false; m_HeartBeatTimerIsSet = false;
m_PlmnListIsSet = false; m_PlmnListIsSet = false;
m_SNssaisIsSet = false; m_SNssaisIsSet = false;
m_PerPlmnSnssaiListIsSet = false; m_PerPlmnSnssaiListIsSet = false;
m_NsiListIsSet = false; m_NsiListIsSet = false;
m_Fqdn = ""; m_Fqdn = "";
m_FqdnIsSet = false; m_FqdnIsSet = false;
m_InterPlmnFqdn = ""; m_InterPlmnFqdn = "";
m_InterPlmnFqdnIsSet = false; m_InterPlmnFqdnIsSet = false;
m_Ipv4AddressesIsSet = false; m_Ipv4AddressesIsSet = false;
m_Ipv6AddressesIsSet = false; m_Ipv6AddressesIsSet = false;
m_AllowedPlmnsIsSet = false; m_AllowedPlmnsIsSet = false;
m_AllowedNfTypesIsSet = false; m_AllowedNfTypesIsSet = false;
m_AllowedNfDomainsIsSet = false; m_AllowedNfDomainsIsSet = false;
m_AllowedNssaisIsSet = false; m_AllowedNssaisIsSet = false;
m_Priority = 0; m_Priority = 0;
m_PriorityIsSet = false; m_PriorityIsSet = false;
m_Capacity = 0; m_Capacity = 0;
m_CapacityIsSet = false; m_CapacityIsSet = false;
m_Load = 0; m_Load = 0;
m_LoadIsSet = false; m_LoadIsSet = false;
m_Locality = ""; m_Locality = "";
m_LocalityIsSet = false; m_LocalityIsSet = false;
m_Priority = 0; m_Priority = 0;
m_PriorityIsSet = false; m_PriorityIsSet = false;
m_UdrInfoIsSet = false; m_UdrInfoIsSet = false;
m_UdrInfoExtIsSet = false; m_UdrInfoExtIsSet = false;
m_UdmInfoIsSet = false; m_UdmInfoIsSet = false;
m_UdmInfoExtIsSet = false; m_UdmInfoExtIsSet = false;
m_AusfInfoIsSet = false; m_AusfInfoIsSet = false;
m_AusfInfoExtIsSet = false; m_AusfInfoExtIsSet = false;
m_AmfInfoIsSet = false; m_AmfInfoIsSet = false;
m_AmfInfoExtIsSet = false; m_AmfInfoExtIsSet = false;
m_SmfInfoIsSet = false; m_SmfInfoIsSet = false;
m_SmfInfoExtIsSet = false; m_SmfInfoExtIsSet = false;
m_UpfInfoIsSet = false; m_UpfInfoIsSet = false;
m_UpfInfoExtIsSet = false; m_UpfInfoExtIsSet = false;
m_PcfInfoIsSet = false; m_PcfInfoIsSet = false;
m_PcfInfoExtIsSet = false; m_PcfInfoExtIsSet = false;
m_BsfInfoIsSet = false; m_BsfInfoIsSet = false;
m_BsfInfoExtIsSet = false; m_BsfInfoExtIsSet = false;
m_ChfInfoIsSet = false; m_ChfInfoIsSet = false;
m_ChfInfoExtIsSet = false; m_ChfInfoExtIsSet = false;
m_NrfInfoIsSet = false; m_NrfInfoIsSet = false;
m_NwdafInfoIsSet = false; m_NwdafInfoIsSet = false;
// m_CustomInfoIsSet = false; m_CustomInfoIsSet = false;
m_RecoveryTime = ""; m_RecoveryTime = "";
m_RecoveryTimeIsSet = false; m_RecoveryTimeIsSet = false;
m_NfServicePersistence = false; m_NfServicePersistence = false;
...@@ -146,8 +147,7 @@ void to_json(nlohmann::json& j, const NFProfile& o) { ...@@ -146,8 +147,7 @@ void to_json(nlohmann::json& j, const NFProfile& o) {
j["chfInfoExt"] = o.m_ChfInfoExt; j["chfInfoExt"] = o.m_ChfInfoExt;
if (o.nrfInfoIsSet()) j["nrfInfo"] = o.m_NrfInfo; if (o.nrfInfoIsSet()) j["nrfInfo"] = o.m_NrfInfo;
if (o.nwdafInfoIsSet()) j["nwdafInfo"] = o.m_NwdafInfo; if (o.nwdafInfoIsSet()) j["nwdafInfo"] = o.m_NwdafInfo;
// if(o.customInfoIsSet()) if (o.customInfoIsSet()) j["customInfo"] = o.m_CustomInfo;
// j["customInfo"] = o.m_CustomInfo;
if (o.recoveryTimeIsSet()) j["recoveryTime"] = o.m_RecoveryTime; if (o.recoveryTimeIsSet()) j["recoveryTime"] = o.m_RecoveryTime;
if (o.nfServicePersistenceIsSet()) if (o.nfServicePersistenceIsSet())
j["nfServicePersistence"] = o.m_NfServicePersistence; j["nfServicePersistence"] = o.m_NfServicePersistence;
...@@ -323,11 +323,10 @@ void from_json(const nlohmann::json& j, NFProfile& o) { ...@@ -323,11 +323,10 @@ void from_json(const nlohmann::json& j, NFProfile& o) {
j.at("nwdafInfo").get_to(o.m_NwdafInfo); j.at("nwdafInfo").get_to(o.m_NwdafInfo);
o.m_NwdafInfoIsSet = true; o.m_NwdafInfoIsSet = true;
} }
/*if(j.find("customInfo") != j.end()) if (j.find("customInfo") != j.end()) {
{ j.at("customInfo").get_to(o.m_CustomInfo);
j.at("customInfo").get_to(o.m_CustomInfo); o.m_CustomInfoIsSet = true;
o.m_CustomInfoIsSet = true; }
} */
if (j.find("recoveryTime") != j.end()) { if (j.find("recoveryTime") != j.end()) {
j.at("recoveryTime").get_to(o.m_RecoveryTime); j.at("recoveryTime").get_to(o.m_RecoveryTime);
o.m_RecoveryTimeIsSet = true; o.m_RecoveryTimeIsSet = true;
...@@ -867,26 +866,21 @@ bool NFProfile::nwdafInfoIsSet() const { ...@@ -867,26 +866,21 @@ bool NFProfile::nwdafInfoIsSet() const {
void NFProfile::unsetNwdafInfo() { void NFProfile::unsetNwdafInfo() {
m_NwdafInfoIsSet = false; m_NwdafInfoIsSet = false;
} }
/*Object NFProfile::getCustomInfo() const nlohmann::json NFProfile::getCustomInfo() const {
{ return m_CustomInfo;
return m_CustomInfo; }
}
*/ void NFProfile::setCustomInfo(nlohmann::json const& value) {
/* m_CustomInfo = value;
void NFProfile::setCustomInfo(Object const& value) m_CustomInfoIsSet = true;
{ }
m_CustomInfo = value; bool NFProfile::customInfoIsSet() const {
m_CustomInfoIsSet = true; return m_CustomInfoIsSet;
}*/ }
/* bool NFProfile::customInfoIsSet() const
{ void NFProfile::unsetCustomInfo() {
return m_CustomInfoIsSet; m_CustomInfoIsSet = false;
}*/ }
/*
void NFProfile::unsetCustomInfo()
{
m_CustomInfoIsSet = false;
}*/
std::string NFProfile::getRecoveryTime() const { std::string NFProfile::getRecoveryTime() const {
return m_RecoveryTime; return m_RecoveryTime;
......
...@@ -345,10 +345,10 @@ class NFProfile { ...@@ -345,10 +345,10 @@ class NFProfile {
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
// Object getCustomInfo() const; nlohmann::json getCustomInfo() const;
// void setCustomInfo(Object const& value); void setCustomInfo(nlohmann::json const& value);
// bool customInfoIsSet() const; bool customInfoIsSet() const;
// void unsetCustomInfo(); void unsetCustomInfo();
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
...@@ -480,8 +480,8 @@ class NFProfile { ...@@ -480,8 +480,8 @@ class NFProfile {
bool m_NrfInfoIsSet; bool m_NrfInfoIsSet;
NwdafInfo m_NwdafInfo; NwdafInfo m_NwdafInfo;
bool m_NwdafInfoIsSet; bool m_NwdafInfoIsSet;
// Object m_CustomInfo; nlohmann::json m_CustomInfo;
// bool m_CustomInfoIsSet; bool m_CustomInfoIsSet;
std::string m_RecoveryTime; std::string m_RecoveryTime;
bool m_RecoveryTimeIsSet; bool m_RecoveryTimeIsSet;
bool m_NfServicePersistence; bool m_NfServicePersistence;
......
...@@ -148,10 +148,4 @@ typedef struct guami_s { ...@@ -148,10 +148,4 @@ typedef struct guami_s {
std::string amf_id; std::string amf_id;
} guami_t; } guami_t;
typedef struct supi_range_s {
std::string start;
std::string end;
std::string pattern;
} supi_range_t;
#endif #endif
...@@ -87,16 +87,67 @@ typedef struct upf_info_s { ...@@ -87,16 +87,67 @@ typedef struct upf_info_s {
std::vector<interface_upf_info_item_t> interface_upf_info_list; std::vector<interface_upf_info_item_t> interface_upf_info_list;
} upf_info_t; } upf_info_t;
typedef struct supi_range_ausf_info_item_s { typedef struct supi_range_s {
std::string start;
std::string end;
std::string pattern;
} supi_range_t;
typedef struct supi_range_info_item_s {
supi_range_t supi_range; supi_range_t supi_range;
} supi_range_ausf_info_item_t; } supi_range_info_item_t;
typedef struct identity_range_s {
std::string start;
std::string end;
std::string pattern;
} identity_range_t;
typedef struct identity_range_info_item_s {
identity_range_t identity_range;
} identity_range_info_item_t;
typedef struct internal_grpid_range_s {
std::string start;
std::string end;
std::string pattern;
} internal_grpid_range_t;
typedef struct internal_grpid_range_info_item_s {
internal_grpid_range_t int_grpid_range;
} internal_grpid_range_info_item_t;
typedef struct ausf_info_s { typedef struct ausf_info_s {
std::string groupid; std::string groupid;
std::vector<supi_range_ausf_info_item_t> supi_ranges; std::vector<supi_range_info_item_t> supi_ranges;
std::vector<std::string> routing_indicator; std::vector<std::string> routing_indicator;
} ausf_info_t; } ausf_info_t;
typedef struct udm_info_s {
std::string groupid;
std::vector<supi_range_info_item_t> supi_ranges;
std::vector<identity_range_info_item_t> gpsi_ranges;
std::vector<identity_range_info_item_t> ext_grp_id_ranges;
std::vector<std::string> routing_indicator;
std::vector<internal_grpid_range_info_item_t> int_grp_id_ranges;
} udm_info_t;
typedef struct udr_info_s {
std::string groupid;
std::vector<supi_range_info_item_t> supi_ranges;
std::vector<identity_range_info_item_t> gpsi_ranges;
std::vector<identity_range_info_item_t> ext_grp_id_ranges;
std::vector<std::string> data_set_id;
} udr_info_t;
typedef struct pcf_info_s {
std::string groupid;
std::vector<std::string> dnn_list;
std::vector<supi_range_info_item_t> supi_ranges;
std::vector<identity_range_info_item_t> gpsi_ranges;
// ToDo: rxDiamHost, rxDiamRealm, v2xSupportInd.
} pcf_info_t;
enum subscr_condition_type_e { // TODO: use enum class enum subscr_condition_type_e { // TODO: use enum class
UNKNOWN_CONDITION = 0, UNKNOWN_CONDITION = 0,
NF_INSTANCE_ID_COND = 1, NF_INSTANCE_ID_COND = 1,
......
...@@ -28,32 +28,33 @@ ...@@ -28,32 +28,33 @@
typedef enum nf_type_s { typedef enum nf_type_s {
NF_TYPE_NRF = 0, NF_TYPE_NRF = 0,
NF_TYPE_AMF = 1, NF_TYPE_UDM = 1,
NF_TYPE_SMF = 2, NF_TYPE_AMF = 2,
NF_TYPE_AUSF = 3, NF_TYPE_SMF = 3,
NF_TYPE_NEF = 4, NF_TYPE_AUSF = 4,
NF_TYPE_PCF = 5, NF_TYPE_NEF = 5,
NF_TYPE_SMSF = 6, NF_TYPE_PCF = 6,
NF_TYPE_NSSF = 7, NF_TYPE_SMSF = 7,
NF_TYPE_UDR = 8, NF_TYPE_NSSF = 8,
NF_TYPE_LMF = 9, NF_TYPE_UDR = 9,
NF_TYPE_GMLC = 10, NF_TYPE_LMF = 10,
NF_TYPE_5G_EIR = 11, NF_TYPE_GMLC = 11,
NF_TYPE_SEPP = 12, NF_TYPE_5G_EIR = 12,
NF_TYPE_UPF = 13, NF_TYPE_SEPP = 13,
NF_TYPE_N3IWF = 14, NF_TYPE_UPF = 14,
NF_TYPE_AF = 15, NF_TYPE_N3IWF = 15,
NF_TYPE_UDSF = 16, NF_TYPE_AF = 16,
NF_TYPE_BSF = 17, NF_TYPE_UDSF = 17,
NF_TYPE_CHF = 18, NF_TYPE_BSF = 18,
NF_TYPE_NWDAF = 19, NF_TYPE_CHF = 19,
NF_TYPE_UNKNOWN = 20 NF_TYPE_NWDAF = 20,
NF_TYPE_UNKNOWN = 21
} nf_type_t; } nf_type_t;
static const std::vector<std::string> nf_type_e2str = { static const std::vector<std::string> nf_type_e2str = {
"NRF", "AMF", "SMF", "AUSF", "NEF", "PCF", "SMSF", "NRF", "UDM", "AMF", "SMF", "AUSF", "NEF", "PCF", "SMSF",
"NSSF", "UDR", "LMF", "GMLC", "5G_EIR", "SEPP", "UPF", "NSSF", "UDR", "LMF", "GMLC", "5G_EIR", "SEPP", "UPF", "N3IWF",
"N3IWF", "AF", "UDSF", "BSF", "CHF", "NWDAF", "UNKNOWN"}; "AF", "UDSF", "BSF", "CHF", "NWDAF", "UNKNOWN"};
typedef enum patch_op_type_s { typedef enum patch_op_type_s {
PATCH_OP_ADD = 0, PATCH_OP_ADD = 0,
......
This diff is collapsed.
...@@ -140,6 +140,18 @@ void nrf_app::handle_register_nf_instance( ...@@ -140,6 +140,18 @@ void nrf_app::handle_register_nf_instance(
sn = std::make_shared<ausf_profile>(m_event_sub); sn = std::make_shared<ausf_profile>(m_event_sub);
} break; } break;
case NF_TYPE_UDM: {
sn = std::make_shared<udm_profile>(m_event_sub);
} break;
case NF_TYPE_UDR: {
sn = std::make_shared<udr_profile>(m_event_sub);
} break;
case NF_TYPE_PCF: {
sn = std::make_shared<pcf_profile>(m_event_sub);
} break;
default: { default: {
sn = std::make_shared<nrf_profile>(m_event_sub); sn = std::make_shared<nrf_profile>(m_event_sub);
} }
......
This diff is collapsed.
...@@ -68,6 +68,7 @@ class nrf_profile : public std::enable_shared_from_this<nrf_profile> { ...@@ -68,6 +68,7 @@ class nrf_profile : public std::enable_shared_from_this<nrf_profile> {
nf_instance_name = ""; nf_instance_name = "";
nf_status = ""; nf_status = "";
json_data = {}; json_data = {};
custom_info = {};
first_update = true; first_update = true;
is_updated = false; is_updated = false;
} }
...@@ -365,6 +366,20 @@ class nrf_profile : public std::enable_shared_from_this<nrf_profile> { ...@@ -365,6 +366,20 @@ class nrf_profile : public std::enable_shared_from_this<nrf_profile> {
*/ */
void get_json_data(nlohmann::json& data) const; void get_json_data(nlohmann::json& data) const;
/*
* Set custom info
* @param [const nlohmann::json &] c: custom info to be set
* @return void
*/
void set_custom_info(const nlohmann::json& c);
/*
* Get custom info
* @param [nlohmann::json &] c: Store custom info
* @return void
*/
void get_custom_info(nlohmann::json& c) const;
/* /*
* Set NF instance services * Set NF instance services
* @param [std::vector<nf_service_t> &] n: nf_service * @param [std::vector<nf_service_t> &] n: nf_service
...@@ -507,6 +522,7 @@ class nrf_profile : public std::enable_shared_from_this<nrf_profile> { ...@@ -507,6 +522,7 @@ class nrf_profile : public std::enable_shared_from_this<nrf_profile> {
uint16_t capacity; uint16_t capacity;
nlohmann::json json_data; // store extra json data nlohmann::json json_data; // store extra json data
std::vector<nf_service_t> nf_services; std::vector<nf_service_t> nf_services;
nlohmann::json custom_info; // store extra json data
/* /*
std::vector<PlmnId> m_PlmnList; std::vector<PlmnId> m_PlmnList;
...@@ -847,6 +863,207 @@ class ausf_profile : public nrf_profile { ...@@ -847,6 +863,207 @@ class ausf_profile : public nrf_profile {
ausf_info_t ausf_info; ausf_info_t ausf_info;
}; };
class udm_profile : public nrf_profile {
public:
udm_profile(nrf_event& ev) : nrf_profile(ev, NF_TYPE_UDM) { udm_info = {}; }
udm_profile(nrf_event& ev, const std::string& id) : nrf_profile(ev, id) {
nf_type = NF_TYPE_UDM;
udm_info = {};
}
udm_profile(udm_profile& b) = delete;
/*
* Add a UDM info
* @param [const udm_info_t &] info: UDM info
* @return void
*/
void add_udm_info(const udm_info_t& info);
/*
* Get list of UDM infos a UDM info
* @param [const udm_info_t &] info: UDM info
* @return void
*/
void get_udm_info(udm_info_t& infos) const;
/*
* Print related-information for a UDM profile
* @param void
* @return void:
*/
void display();
/*
* Update a new value for a member of UDM profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return void
*/
bool replace_profile_info(const std::string& path, const std::string& value);
/*
* Add a new value for a member of UDM profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return true if success, otherwise false
*/
bool add_profile_info(const std::string& path, const std::string& value);
/*
* Remove value of a member of UDM profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return true if success, otherwise false
*/
bool remove_profile_info(const std::string& path);
/*
* Represent UDM profile as json object
* @param [nlohmann::json &] data: Json data
* @return void
*/
void to_json(nlohmann::json& data) const;
private:
udm_info_t udm_info;
};
class udr_profile : public nrf_profile {
public:
udr_profile(nrf_event& ev) : nrf_profile(ev, NF_TYPE_UDR) { udr_info = {}; }
udr_profile(nrf_event& ev, const std::string& id) : nrf_profile(ev, id) {
nf_type = NF_TYPE_UDR;
udr_info = {};
}
udr_profile(udr_profile& b) = delete;
/*
* Add a UDR info
* @param [const udr_info_t &] info: UDR info
* @return void
*/
void add_udr_info(const udr_info_t& info);
/*
* Get list of UDR infos a UDR info
* @param [const udr_info_t &] info: UDR info
* @return void
*/
void get_udr_info(udr_info_t& infos) const;
/*
* Print related-information for a UDR profile
* @param void
* @return void:
*/
void display();
/*
* Update a new value for a member of UDR profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return void
*/
bool replace_profile_info(const std::string& path, const std::string& value);
/*
* Add a new value for a member of UDR profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return true if success, otherwise false
*/
bool add_profile_info(const std::string& path, const std::string& value);
/*
* Remove value of a member of UDR profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return true if success, otherwise false
*/
bool remove_profile_info(const std::string& path);
/*
* Represent UDR profile as json object
* @param [nlohmann::json &] data: Json data
* @return void
*/
void to_json(nlohmann::json& data) const;
private:
udr_info_t udr_info;
};
class pcf_profile : public nrf_profile {
public:
pcf_profile(nrf_event& ev) : nrf_profile(ev, NF_TYPE_PCF) { pcf_info = {}; }
pcf_profile(nrf_event& ev, const std::string& id) : nrf_profile(ev, id) {
nf_type = NF_TYPE_PCF;
pcf_info = {};
}
pcf_profile(pcf_profile& b) = delete;
/*
* Add a PCF info
* @param [const pcf_info_t &] info: PCF info
* @return void
*/
void add_pcf_info(const pcf_info_t& info);
/*
* Get list of PCF infos a PCF info
* @param [const pcf_info_t &] info: pcf info
* @return void
*/
void get_pcf_info(pcf_info_t& infos) const;
/*
* Print related-information for a PCF profile
* @param void
* @return void:
*/
void display();
/*
* Update a new value for a member of PCF profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return void
*/
bool replace_profile_info(const std::string& path, const std::string& value);
/*
* Add a new value for a member of PCF profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return true if success, otherwise false
*/
bool add_profile_info(const std::string& path, const std::string& value);
/*
* Remove value of a member of PCF profile
* @param [const std::string &] path: member name
* @param [const std::string &] value: new value
* @return true if success, otherwise false
*/
bool remove_profile_info(const std::string& path);
/*
* Represent PCF profile as json object
* @param [nlohmann::json &] data: Json data
* @return void
*/
void to_json(nlohmann::json& data) const;
private:
pcf_info_t pcf_info;
};
} // namespace app } // namespace app
} // namespace nrf } // namespace nrf
} // namespace oai } // namespace oai
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment