Compare commits
13
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02dc8dadd4 | ||
|
|
63d2238429 | ||
|
|
524e26ede5 | ||
|
|
01db9857c4 | ||
|
|
aa353fdcff | ||
|
|
bdfe516aa7 | ||
|
|
f8f10665e7 | ||
|
|
ee3e027041 | ||
|
|
7aca2a5fdf | ||
|
|
636c124596 | ||
|
|
7a18e84f1b | ||
|
|
b30f738b01 | ||
|
|
ac4dbff76e |
@@ -5,3 +5,4 @@ common/utils/T/T_IDs.h
|
|||||||
common/utils/T/T_messages.txt.h
|
common/utils/T/T_messages.txt.h
|
||||||
common/utils/T/genids
|
common/utils/T/genids
|
||||||
common/utils/T/genids.o
|
common/utils/T/genids.o
|
||||||
|
artifacts
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ cmake_targets/*/build/
|
|||||||
cmake_targets/ran_build/
|
cmake_targets/ran_build/
|
||||||
log/
|
log/
|
||||||
lte_build_oai/
|
lte_build_oai/
|
||||||
build*
|
|
||||||
|
|
||||||
# IDE files
|
# IDE files
|
||||||
.vscode
|
.vscode
|
||||||
@@ -21,14 +20,6 @@ GRTAGS
|
|||||||
GTAGS
|
GTAGS
|
||||||
tags
|
tags
|
||||||
|
|
||||||
# Package conffiles
|
|
||||||
|
|
||||||
tools/packages/oai-lte/conffiles
|
|
||||||
tools/packages/oai-nr/conffiles
|
|
||||||
tools/packages/liboai-common/conffiles
|
|
||||||
tools/packages/liboai-usrp/conffiles
|
|
||||||
|
|
||||||
|
|
||||||
# others
|
# others
|
||||||
nfapi_nr_interface_scf
|
nfapi_nr_interface_scf
|
||||||
*.log
|
*.log
|
||||||
|
|||||||
@@ -1,73 +1,5 @@
|
|||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
# RELEASE NOTES: #
|
# RELEASE NOTES: #
|
||||||
|
|
||||||
## [v2.4.0](https://gitlab.eurecom.fr/oai/openairinterface5g/-/tags/v2.4.0) -> December 2025. ##
|
|
||||||
|
|
||||||
General new features and improvements (both RAN and UE):
|
|
||||||
- Rework LDPC BBdev/AAL interface and support both AMD T2/Intel vRAN Boost
|
|
||||||
(VRB) 1 accelerators
|
|
||||||
- Add a taps client for vrtsim real-time simulator (check: vrtsim release?)
|
|
||||||
- Add new RFemulator virtual radio driver to emulate radio (including noise
|
|
||||||
generation) for gNB/UE standalone operation
|
|
||||||
- RLC AM reception improvements for high-throughput scenarios (!3512)
|
|
||||||
- Small NTN fixes (!3659, !3666, !3581, !3652)
|
|
||||||
- Improvements to imScope
|
|
||||||
|
|
||||||
Stability and bug fixes:
|
|
||||||
- RFsimulator: fix concurrency problems during multi-client connection
|
|
||||||
- USRP driver: support synchronization of USRP B200
|
|
||||||
- MAC scheduler improvements
|
|
||||||
- General L1 improvements for efficiency and stability
|
|
||||||
- Correct PRS bug and test in CI
|
|
||||||
- Upgrade Ubuntu container images to Ubuntu 24.04
|
|
||||||
- All build system targets compile (`make/ninja all`)
|
|
||||||
- Minor cleanup, harmonization, and performance improvements all over the stack
|
|
||||||
- Simplify CI code
|
|
||||||
|
|
||||||
RAN changes (gNB/CU/CU-CP/CU-UP/DU/DU-high/DU-low):
|
|
||||||
- Support of N2 handover
|
|
||||||
- Support of "UL-heavy" TDD patterns, e.g., DSUUU
|
|
||||||
- Open Fronthaul M-plane: CM improvements, PM implementation, and additional
|
|
||||||
v16.01 support
|
|
||||||
- Improve interoperability with Nvidia Aerial L1 to support 2 layer UL
|
|
||||||
- Add O-RAN OSC WLS library as FAPI transport and enable L1/L2 shared memory
|
|
||||||
split
|
|
||||||
- Implement FAPI Stop exchange
|
|
||||||
- Improve interoperability with srsRAN_Project DU
|
|
||||||
- Add new synchronized real-time data recording application (!3462)
|
|
||||||
- Support for measurement gaps and general handover fixes
|
|
||||||
- Support of RRC PDU session release procedure
|
|
||||||
- Add CU-UP load tester
|
|
||||||
- Correct BWP scheduling and support multiple BWPs per UE
|
|
||||||
|
|
||||||
nrUE changes:
|
|
||||||
- Support one additional PDU session (see !3486)
|
|
||||||
- L3 measurements for A2 measurement reports
|
|
||||||
- Support for type0 PDSCH frequency allocation
|
|
||||||
- UE symbol based PDCCH receiver
|
|
||||||
|
|
||||||
Regression or removals:
|
|
||||||
- No known regressions
|
|
||||||
- Unused L2 simulator code has been removed
|
|
||||||
- Unused Benetel radio driver code (not FHI 7.2!) has been removed
|
|
||||||
|
|
||||||
Configuration file changes:
|
|
||||||
- `gNBs.[0].servingCellConfigCommon.[0].ra_ResponseWindow` is automatically
|
|
||||||
computed and can be removed
|
|
||||||
- `gNBs.[0].bwp_list` has been added (moved from entries in
|
|
||||||
`gNBs.[0].servingCellConfigDedicated`)
|
|
||||||
- `gNBs.[0].phaseTrackingRS` has been added (moved from entries in
|
|
||||||
`gNBs.[0].servingCellConfigDedicated`)
|
|
||||||
- `gNBs.[0].local_s_portc` and `gNBs.[0].remote_s_portc` have no effect and
|
|
||||||
should be removed
|
|
||||||
- `gNBs.[0].CSI_report_type` has been added
|
|
||||||
- `MACRLCs.[0].ulsch_max_frame_inactivity` is automatically computed and can be
|
|
||||||
removed
|
|
||||||
- `MACRLCs.[0].local_n_portc` and `MACRLCs.[0].remote_n_portc` have no effect and
|
|
||||||
should be removed
|
|
||||||
- `MACRLCs.[0].stats_max_ue` has been added
|
|
||||||
|
|
||||||
## [v2.3.0](https://gitlab.eurecom.fr/oai/openairinterface5g/-/tags/v2.3.0) -> July 2025. ##
|
## [v2.3.0](https://gitlab.eurecom.fr/oai/openairinterface5g/-/tags/v2.3.0) -> July 2025. ##
|
||||||
|
|
||||||
General new features and improvements (both RAN and UE):
|
General new features and improvements (both RAN and UE):
|
||||||
|
|||||||
+182
-266
@@ -1,41 +1,27 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
cmake_minimum_required (VERSION 3.19)
|
cmake_minimum_required (VERSION 3.16)
|
||||||
project (OpenAirInterface LANGUAGES C CXX)
|
project (OpenAirInterface LANGUAGES C CXX)
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(OAI_VERSION 2.4.0)
|
|
||||||
|
|
||||||
option(CUDA_ENABLE "Enable CUDA accelerated channel simulation" OFF)
|
|
||||||
if(CUDA_ENABLE)
|
|
||||||
find_package(CUDA REQUIRED)
|
|
||||||
find_package(CUDAToolkit REQUIRED)
|
|
||||||
message(STATUS "CUDA explicitly enabled, building with GPU acceleration support.")
|
|
||||||
|
|
||||||
enable_language(CUDA)
|
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
|
|
||||||
set(CMAKE_CUDA_ARCHITECTURES 90)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(USE_UNIFIED_MEMORY "Enable CUDA Unified Memory path" OFF)
|
|
||||||
option(USE_ATS_MEMORY "Enable ATS Hybrid Memory path" ON)
|
|
||||||
|
|
||||||
if(USE_UNIFIED_MEMORY AND USE_ATS_MEMORY)
|
|
||||||
message(FATAL_ERROR "Cannot enable both USE_UNIFIED_MEMORY and USE_ATS_MEMORY at the same time.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(USE_UNIFIED_MEMORY)
|
|
||||||
add_compile_definitions(USE_UNIFIED_MEMORY)
|
|
||||||
message(STATUS "CUDA Unified Memory path enabled.")
|
|
||||||
elseif(USE_ATS_MEMORY)
|
|
||||||
add_compile_definitions(USE_ATS_MEMORY)
|
|
||||||
message(STATUS "CUDA ATS Hybrid Memory path enabled.")
|
|
||||||
else()
|
|
||||||
message(STATUS "CUDA Explicit Copy path enabled (default ATS was overridden).")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_compile_definitions(ENABLE_CUDA)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#########################################################
|
#########################################################
|
||||||
# Base directories, compatible with legacy OAI building #
|
# Base directories, compatible with legacy OAI building #
|
||||||
@@ -75,48 +61,24 @@ endif()
|
|||||||
###################################
|
###################################
|
||||||
include(FindPkgConfig)
|
include(FindPkgConfig)
|
||||||
|
|
||||||
|
|
||||||
option(PACKAGING_RPM "By default will create debian packages, with this option willl create rpm packages" OFF)
|
|
||||||
option(PACKAGING_NR "Will produce a package containing nr target, configuration files and docs" OFF)
|
|
||||||
option(PACKAGING_LTE "Will produce a package containing lte target, configuration files and docs" OFF)
|
|
||||||
option(PACKAGING_COMMON "Will produce a package containing common target, configuration files and docs" OFF)
|
|
||||||
option(PACKAGING_USRP "Will produce a package containing usrp target, configuration files and docs" OFF)
|
|
||||||
option(PACKAGING_PHYSIM "Will produce a package containing physim target, configuration files and docs" OFF)
|
|
||||||
|
|
||||||
# Check if asn1c is installed, and check if it supports all options we need
|
# Check if asn1c is installed, and check if it supports all options we need
|
||||||
# a user can provide ASN1C_EXEC to override an asn1c to use (e.g., parallel
|
# a user can provide ASN1C_EXEC to override an asn1c to use (e.g., parallel
|
||||||
# installation)
|
# installation)
|
||||||
find_program(ASN1C_EXEC_PATH asn1c HINTS /opt/asn1c/bin)
|
find_program(ASN1C_EXEC_PATH asn1c HINTS /opt/asn1c/bin)
|
||||||
set(ASN1C_EXEC ${ASN1C_EXEC_PATH} CACHE FILEPATH "path to asn1c executable")
|
set(ASN1C_EXEC ${ASN1C_EXEC_PATH} CACHE FILEPATH "path to asn1c executable")
|
||||||
option(AUTO_DOWNLOAD_ASN1C "Automatically download asn1c if not found" OFF)
|
if(NOT ASN1C_EXEC)
|
||||||
if (ASN1C_EXEC)
|
message(FATAL_ERROR "No asn1c found!
|
||||||
check_option(${ASN1C_EXEC} -gen-APER ASN1C_EXEC)
|
You might want to re-run ./build_oai -I
|
||||||
check_option(${ASN1C_EXEC} -no-gen-UPER ASN1C_EXEC)
|
Or provide a path to asn1c using
|
||||||
check_option(${ASN1C_EXEC} -no-gen-JER ASN1C_EXEC)
|
./build_oai ... --cmake-opt -DASN1C_EXEC=/path/to/asn1c
|
||||||
check_option(${ASN1C_EXEC} -no-gen-BER ASN1C_EXEC)
|
")
|
||||||
check_option(${ASN1C_EXEC} -no-gen-OER ASN1C_EXEC)
|
|
||||||
add_custom_target(asn1c DEPENDS ${ASN1C_EXEC})
|
|
||||||
else ()
|
|
||||||
if (NOT AUTO_DOWNLOAD_ASN1C)
|
|
||||||
message(FATAL_ERROR "asn1c not found. Install it globally or activate AUTO_DOWNLOAD_ASN1C")
|
|
||||||
endif()
|
|
||||||
message(STATUS "Downloading and compile asn1c local in this build tree")
|
|
||||||
include(ExternalProject)
|
|
||||||
ExternalProject_Add(
|
|
||||||
asn1c_gen
|
|
||||||
GIT_REPOSITORY https://github.com/mouse07410/asn1c
|
|
||||||
GIT_TAG 940dd5fa9f3917913fd487b13dfddfacd0ded06e
|
|
||||||
GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
|
|
||||||
BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/bin/asn1c
|
|
||||||
BUILD_IN_SOURCE True
|
|
||||||
CONFIGURE_COMMAND autoreconf -i
|
|
||||||
BUILD_COMMAND ./configure --prefix ${CMAKE_BINARY_DIR}
|
|
||||||
COMMAND make -j8 CFLAGS=-fno-strict-aliasing -Wmisleading-indentation
|
|
||||||
STEP_TARGETS build
|
|
||||||
)
|
|
||||||
set(ASN1C_EXEC ${CMAKE_BINARY_DIR}/bin/asn1c)
|
|
||||||
add_custom_target(asn1c DEPENDS asn1c_gen)
|
|
||||||
endif()
|
endif()
|
||||||
|
check_option(${ASN1C_EXEC} -gen-APER ASN1C_EXEC)
|
||||||
|
check_option(${ASN1C_EXEC} -no-gen-UPER ASN1C_EXEC)
|
||||||
|
check_option(${ASN1C_EXEC} -no-gen-JER ASN1C_EXEC)
|
||||||
|
check_option(${ASN1C_EXEC} -no-gen-BER ASN1C_EXEC)
|
||||||
|
check_option(${ASN1C_EXEC} -no-gen-OER ASN1C_EXEC)
|
||||||
|
|
||||||
#########################################################
|
#########################################################
|
||||||
# Base directories, compatible with legacy OAI building #
|
# Base directories, compatible with legacy OAI building #
|
||||||
#########################################################
|
#########################################################
|
||||||
@@ -125,6 +87,8 @@ set (NFAPI_USER_DIR ${OPENAIR_DIR}/nfapi/oai_integration)
|
|||||||
set (OPENAIR1_DIR ${OPENAIR_DIR}/openair1)
|
set (OPENAIR1_DIR ${OPENAIR_DIR}/openair1)
|
||||||
set (OPENAIR2_DIR ${OPENAIR_DIR}/openair2)
|
set (OPENAIR2_DIR ${OPENAIR_DIR}/openair2)
|
||||||
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||||
|
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||||
|
set (OPENAIR_CMAKE ${OPENAIR_DIR}/cmake_targets)
|
||||||
|
|
||||||
project (OpenAirInterface)
|
project (OpenAirInterface)
|
||||||
|
|
||||||
@@ -194,8 +158,6 @@ elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
|
|||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mcpu=neoverse-n1 -lgcc -lrt")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mcpu=neoverse-n1 -lgcc -lrt")
|
||||||
elseif (CPUPART MATCHES "0xd49") # Neoverse-N2
|
elseif (CPUPART MATCHES "0xd49") # Neoverse-N2
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mcpu=neoverse-n2 -ftree-vectorize -lgcc -lrt")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mcpu=neoverse-n2 -ftree-vectorize -lgcc -lrt")
|
||||||
elseif (CPUPART MATCHES "0xd03") # Cortex-A53
|
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mcpu=cortex-a53 -lgcc -lrt")
|
|
||||||
else ()
|
else ()
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mcpu=native -lgcc -lrt")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mcpu=native -lgcc -lrt")
|
||||||
endif()
|
endif()
|
||||||
@@ -204,12 +166,7 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT CROSS_COMPILE)
|
if (NOT CROSS_COMPILE)
|
||||||
if (CPUPART MATCHES "0xd03")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
|
||||||
# Cortex-A53 does not support ARMv8.2-A extensions
|
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8-a+simd")
|
|
||||||
else()
|
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
|
|
||||||
endif()
|
|
||||||
else ()
|
else ()
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8.2-a")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8.2-a")
|
||||||
endif()
|
endif()
|
||||||
@@ -265,16 +222,9 @@ endif()
|
|||||||
|
|
||||||
add_definitions("-DASN_DISABLE_OER_SUPPORT -DHAVE_CONFIG_H -DHAVE_CONFIG_H_")
|
add_definitions("-DASN_DISABLE_OER_SUPPORT -DHAVE_CONFIG_H -DHAVE_CONFIG_H_")
|
||||||
|
|
||||||
set(CMAKE_SKIP_BUILD_RPATH FALSE)
|
#########################
|
||||||
set(CMAKE_BUILD_RPATH ${CMAKE_CURRENT_BINARY_DIR})
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ggdb2 -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
#########################
|
||||||
set(CMAKE_INSTALL_RPATH "")
|
|
||||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
|
|
||||||
|
|
||||||
if(PACKAGING_LTE OR PACKAGING_NR OR PACKAGING_COMMON OR PACKAGING_USRP OR PACKAGING_PHYSIM)
|
|
||||||
set(CMAKE_SKIP_INSTALL_RPATH TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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 "-ggdb2 -DMALLOC_CHECK_=3 -fno-delete-null-pointer-checks")
|
set(debugOpt "-ggdb2 -DMALLOC_CHECK_=3 -fno-delete-null-pointer-checks")
|
||||||
@@ -317,22 +267,6 @@ if(GIT_FOUND)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(USE_UNIFIED_MEMORY "Enable CUDA Unified Memory path instead of explicit copies" OFF)
|
|
||||||
|
|
||||||
option(USE_ATS_MEMORY "Enable Hybrid ATS (CPU->GPU) and Explicit Copy (GPU->CPU) path" OFF)
|
|
||||||
|
|
||||||
if(USE_UNIFIED_MEMORY AND USE_ATS_MEMORY)
|
|
||||||
message(FATAL_ERROR "Cannot enable both USE_UNIFIED_MEMORY and USE_ATS_MEMORY at the same time.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(USE_UNIFIED_MEMORY)
|
|
||||||
add_compile_definitions(USE_UNIFIED_MEMORY)
|
|
||||||
message(STATUS "CUDA Unified Memory path enabled.")
|
|
||||||
elseif(USE_ATS_MEMORY)
|
|
||||||
add_compile_definitions(USE_ATS_MEMORY)
|
|
||||||
message(STATUS "CUDA ATS Hybrid Memory path enabled.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Debug related options
|
# Debug related options
|
||||||
#########################################
|
#########################################
|
||||||
# asn1c skeletons have hardcoded this flag to make customized debug logs
|
# asn1c skeletons have hardcoded this flag to make customized debug logs
|
||||||
@@ -348,7 +282,7 @@ add_boolean_option(TRACY_ENABLE OFF "Enable tracy instrumentation" ON)
|
|||||||
if (TRACY_ENABLE)
|
if (TRACY_ENABLE)
|
||||||
# the tracy version here should match the tracy server version
|
# the tracy version here should match the tracy server version
|
||||||
# below is latest release as of this commit
|
# below is latest release as of this commit
|
||||||
CPMAddPackage("gh:wolfpld/tracy#v0.13.1")
|
CPMAddPackage("gh:wolfpld/tracy#0.12.2")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
|
set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
|
||||||
@@ -393,7 +327,7 @@ target_link_libraries(lte_rrc PRIVATE nr_rrc)
|
|||||||
#NR RRC
|
#NR RRC
|
||||||
#######
|
#######
|
||||||
add_library(nr_rrc ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1_msg.c)
|
add_library(nr_rrc ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1_msg.c)
|
||||||
target_link_libraries(nr_rrc PUBLIC asn1_nr_rrc asn1_lte_rrc rrc_cell_management)
|
target_link_libraries(nr_rrc PUBLIC asn1_nr_rrc asn1_lte_rrc)
|
||||||
|
|
||||||
# S1AP
|
# S1AP
|
||||||
##############
|
##############
|
||||||
@@ -430,19 +364,14 @@ add_library(ngap
|
|||||||
${NGAP_DIR}/ngap_gNB_handlers.c
|
${NGAP_DIR}/ngap_gNB_handlers.c
|
||||||
${NGAP_DIR}/ngap_gNB_itti_messaging.c
|
${NGAP_DIR}/ngap_gNB_itti_messaging.c
|
||||||
${NGAP_DIR}/ngap_gNB_management_procedures.c
|
${NGAP_DIR}/ngap_gNB_management_procedures.c
|
||||||
${NGAP_DIR}/ngap_gNB_paging.c
|
|
||||||
${NGAP_DIR}/ngap_gNB_nas_procedures.c
|
${NGAP_DIR}/ngap_gNB_nas_procedures.c
|
||||||
${NGAP_DIR}/ngap_gNB_pdu_session_management.c
|
|
||||||
${NGAP_DIR}/ngap_gNB_nnsf.c
|
${NGAP_DIR}/ngap_gNB_nnsf.c
|
||||||
${NGAP_DIR}/ngap_gNB_overload.c
|
${NGAP_DIR}/ngap_gNB_overload.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_trace.c
|
||||||
${NGAP_DIR}/ngap_gNB_ue_context.c
|
${NGAP_DIR}/ngap_gNB_ue_context.c
|
||||||
${NGAP_DIR}/ngap_gNB_NRPPa_transport_procedures.c
|
|
||||||
)
|
)
|
||||||
target_link_libraries(ngap PUBLIC asn1_ngap)
|
target_link_libraries(ngap PUBLIC asn1_ngap)
|
||||||
target_link_libraries(ngap PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
target_link_libraries(ngap PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||||
if(ENABLE_TESTS)
|
|
||||||
target_compile_definitions(ngap PRIVATE ENABLE_TESTS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#M2AP
|
#M2AP
|
||||||
##############
|
##############
|
||||||
@@ -533,11 +462,8 @@ add_library(f1ap
|
|||||||
${F1AP_DIR}/f1ap_itti_messaging.c)
|
${F1AP_DIR}/f1ap_itti_messaging.c)
|
||||||
target_include_directories(f1ap PUBLIC F1AP_DIR)
|
target_include_directories(f1ap PUBLIC F1AP_DIR)
|
||||||
target_link_libraries(f1ap PUBLIC asn1_f1ap GTPV1U)
|
target_link_libraries(f1ap PUBLIC asn1_f1ap GTPV1U)
|
||||||
target_link_libraries(f1ap PRIVATE ngap nr_rrc ds f1ap_lib)
|
target_link_libraries(f1ap PRIVATE ngap nr_rrc HASHTABLE f1ap_lib)
|
||||||
target_include_directories(f1ap PRIVATE ${F1AP_DIR}/lib)
|
target_include_directories(f1ap PRIVATE ${F1AP_DIR}/lib)
|
||||||
if(E2_AGENT)
|
|
||||||
target_compile_definitions(f1ap PRIVATE E2_AGENT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# LPP
|
# LPP
|
||||||
##############
|
##############
|
||||||
@@ -545,10 +471,8 @@ endif()
|
|||||||
|
|
||||||
# Hardware dependant options
|
# Hardware dependant options
|
||||||
###################################
|
###################################
|
||||||
set(NB_ANTENNAS_RX "4" CACHE STRING "Number of antennas in reception")
|
add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4")
|
||||||
set_property(CACHE NB_ANTENNAS_RX PROPERTY STRINGS "1" "2" "4" "8")
|
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
|
||||||
set(NB_ANTENNAS_TX "4" CACHE STRING "Number of antennas in transmission")
|
|
||||||
set_property(CACHE NB_ANTENNAS_TX PROPERTY STRINGS "1" "2" "4" "8")
|
|
||||||
|
|
||||||
set (CONFIG_ROOTDIR ${OPENAIR_DIR}/common/config)
|
set (CONFIG_ROOTDIR ${OPENAIR_DIR}/common/config)
|
||||||
add_library(config_internals OBJECT
|
add_library(config_internals OBJECT
|
||||||
@@ -573,6 +497,8 @@ target_link_libraries(params_libconfig PRIVATE config_internals ${libconfig_LIBR
|
|||||||
add_library(shlib_loader OBJECT common/utils/load_module_shlib.c)
|
add_library(shlib_loader OBJECT common/utils/load_module_shlib.c)
|
||||||
target_link_libraries(shlib_loader PRIVATE CONFIG_LIB)
|
target_link_libraries(shlib_loader PRIVATE CONFIG_LIB)
|
||||||
|
|
||||||
|
include_directories ("${OPENAIR_DIR}/radio/COMMON")
|
||||||
|
|
||||||
##############################################################
|
##############################################################
|
||||||
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
|
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
|
||||||
##############################################################
|
##############################################################
|
||||||
@@ -651,6 +577,7 @@ include_directories("${OPENAIR3_DIR}/S1AP")
|
|||||||
include_directories("${OPENAIR2_DIR}/X2AP")
|
include_directories("${OPENAIR2_DIR}/X2AP")
|
||||||
include_directories("${OPENAIR2_DIR}/M2AP")
|
include_directories("${OPENAIR2_DIR}/M2AP")
|
||||||
include_directories("${OPENAIR2_DIR}/F1AP")
|
include_directories("${OPENAIR2_DIR}/F1AP")
|
||||||
|
include_directories("${OPENAIR3_DIR}/ocp-gtpu")
|
||||||
include_directories("${OPENAIR3_DIR}/M3AP")
|
include_directories("${OPENAIR3_DIR}/M3AP")
|
||||||
include_directories("${OPENAIR3_DIR}/MME_APP")
|
include_directories("${OPENAIR3_DIR}/MME_APP")
|
||||||
include_directories("${OPENAIR_DIR}/radio/COMMON")
|
include_directories("${OPENAIR_DIR}/radio/COMMON")
|
||||||
@@ -672,6 +599,12 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common/utils/T
|
|||||||
# set the T_LIB name to T if the target exists, otherwise leave empty
|
# set the T_LIB name to T if the target exists, otherwise leave empty
|
||||||
set(T_LIB $<TARGET_NAME_IF_EXISTS:T>)
|
set(T_LIB $<TARGET_NAME_IF_EXISTS:T>)
|
||||||
|
|
||||||
|
add_library(HASHTABLE
|
||||||
|
${OPENAIR_DIR}/common/utils/hashtable/hashtable.c
|
||||||
|
${OPENAIR_DIR}/common/utils/hashtable/obj_hashtable.c
|
||||||
|
)
|
||||||
|
include_directories(${OPENAIR_DIR}/common/utils/hashtable)
|
||||||
|
|
||||||
add_library(UTIL
|
add_library(UTIL
|
||||||
${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c
|
${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c
|
||||||
${OPENAIR2_DIR}/UTIL/OPT/probe.c
|
${OPENAIR2_DIR}/UTIL/OPT/probe.c
|
||||||
@@ -688,8 +621,6 @@ target_link_libraries(UTIL PUBLIC instrumentation)
|
|||||||
|
|
||||||
set(SECURITY_SRC
|
set(SECURITY_SRC
|
||||||
${OPENAIR3_DIR}/SECU/secu_defs.c
|
${OPENAIR3_DIR}/SECU/secu_defs.c
|
||||||
${OPENAIR3_DIR}/SECU/curve_25519.c
|
|
||||||
${OPENAIR3_DIR}/SECU/x963_kdf.c
|
|
||||||
${OPENAIR3_DIR}/SECU/kdf.c
|
${OPENAIR3_DIR}/SECU/kdf.c
|
||||||
${OPENAIR3_DIR}/SECU/aes_128_ctr.c
|
${OPENAIR3_DIR}/SECU/aes_128_ctr.c
|
||||||
${OPENAIR3_DIR}/SECU/aes_128_cbc_cmac.c
|
${OPENAIR3_DIR}/SECU/aes_128_cbc_cmac.c
|
||||||
@@ -723,15 +654,14 @@ target_link_libraries(SCHED_LIB PRIVATE asn1_lte_rrc_hdrs)
|
|||||||
set(SCHED_NR_SRC
|
set(SCHED_NR_SRC
|
||||||
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_gNB.c
|
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_gNB.c
|
||||||
${OPENAIR1_DIR}/SCHED_NR/nr_prach_procedures.c
|
${OPENAIR1_DIR}/SCHED_NR/nr_prach_procedures.c
|
||||||
${OPENAIR1_DIR}/SCHED_NR/nr_ru_procedures.c
|
|
||||||
${OPENAIR1_DIR}/SCHED_NR/phy_frame_config_nr.c
|
${OPENAIR1_DIR}/SCHED_NR/phy_frame_config_nr.c
|
||||||
)
|
)
|
||||||
add_library(SCHED_NR_LIB ${SCHED_NR_SRC})
|
add_library(SCHED_NR_LIB ${SCHED_NR_SRC})
|
||||||
target_link_libraries(SCHED_NR_LIB PRIVATE asn1_nr_rrc_hdrs UTIL)
|
target_link_libraries(SCHED_NR_LIB PRIVATE asn1_nr_rrc_hdrs UTIL)
|
||||||
target_link_libraries(SCHED_NR_LIB PRIVATE NFAPI_LIB) # some FAPI messages pack "subPDUs"
|
|
||||||
|
|
||||||
set(SCHED_SRC_RU
|
set(SCHED_SRC_RU
|
||||||
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
||||||
|
${OPENAIR1_DIR}/SCHED_NR/nr_ru_procedures.c
|
||||||
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
||||||
)
|
)
|
||||||
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
||||||
@@ -767,7 +697,6 @@ set(NFAPI_SRC
|
|||||||
add_library(NFAPI_LIB ${NFAPI_SRC})
|
add_library(NFAPI_LIB ${NFAPI_SRC})
|
||||||
target_link_libraries(NFAPI_LIB PUBLIC nfapi_common)
|
target_link_libraries(NFAPI_LIB PUBLIC nfapi_common)
|
||||||
target_link_libraries(NFAPI_LIB PUBLIC nr_fapi_p5 nr_fapi_p7)
|
target_link_libraries(NFAPI_LIB PUBLIC nr_fapi_p5 nr_fapi_p7)
|
||||||
target_link_libraries(NFAPI_LIB PRIVATE z)
|
|
||||||
|
|
||||||
if(OAI_WLS)
|
if(OAI_WLS)
|
||||||
target_compile_definitions(NFAPI_LIB PRIVATE ENABLE_WLS)
|
target_compile_definitions(NFAPI_LIB PRIVATE ENABLE_WLS)
|
||||||
@@ -833,6 +762,24 @@ include_directories(${NFAPI_USER_DIR})
|
|||||||
|
|
||||||
# Layer 1
|
# Layer 1
|
||||||
#############################
|
#############################
|
||||||
|
set(PHY_POLARSRC
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_init.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_crc_byte.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kernal_operation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_sequence_pattern.c
|
||||||
|
)
|
||||||
|
set(PHY_SMALLBLOCKSRC
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrSmallBlock/encodeSmallBlock.c
|
||||||
|
${OPENAIR1_DIR}/PHY/CODING/nrSmallBlock/decodeSmallBlock.c
|
||||||
|
)
|
||||||
set(PHY_TURBOIF
|
set(PHY_TURBOIF
|
||||||
${OPENAIR1_DIR}/PHY/CODING/coding_load.c
|
${OPENAIR1_DIR}/PHY/CODING/coding_load.c
|
||||||
)
|
)
|
||||||
@@ -843,6 +790,8 @@ set(PHY_NRLDPC_CODINGIF
|
|||||||
|
|
||||||
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts_neon.c)
|
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts_neon.c)
|
||||||
|
|
||||||
|
add_library(crc_byte OBJECT ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c)
|
||||||
|
|
||||||
set(PHY_SRC_COMMON
|
set(PHY_SRC_COMMON
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
||||||
@@ -882,6 +831,7 @@ set(PHY_SRC_COMMON
|
|||||||
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
|
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/get_sin_cos.c
|
${OPENAIR1_DIR}/PHY/TOOLS/get_sin_cos.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/oai_arith_operations.c
|
${OPENAIR1_DIR}/PHY/TOOLS/oai_arith_operations.c
|
||||||
|
${OPENAIR1_DIR}/PHY/log_tools.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC
|
set(PHY_SRC
|
||||||
@@ -892,10 +842,6 @@ set(PHY_SRC
|
|||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c
|
||||||
@@ -912,22 +858,22 @@ set(PHY_SRC
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC_RU
|
set(PHY_SRC_RU
|
||||||
${OPENAIR1_DIR}/PHY/if4_tools.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/drs_modulation.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/drs_modulation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
||||||
|
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_nr.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
|
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/gen_75KHz.cpp
|
${OPENAIR1_DIR}/PHY/MODULATION/gen_75KHz.cpp
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
|
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
|
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
|
${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
|
|
||||||
)
|
|
||||||
|
|
||||||
set(NR_PHY_SRC_RU
|
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/nr_beamforming.c
|
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_nr.c
|
|
||||||
${OPENAIR1_DIR}/PHY/INIT/nr_init_ru.c
|
${OPENAIR1_DIR}/PHY/INIT/nr_init_ru.c
|
||||||
${OPENAIR1_DIR}/PHY/if4_tools.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC_UE
|
set(PHY_SRC_UE
|
||||||
@@ -935,6 +881,7 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
|
||||||
@@ -978,8 +925,6 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/nr_phy_common/src/nr_phy_common_srs.c
|
${OPENAIR1_DIR}/PHY/nr_phy_common/src/nr_phy_common_srs.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/refsig.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/refsig.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_antenna_state.c
|
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_antenna_control.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_NR_SRC
|
set(PHY_NR_SRC
|
||||||
@@ -1015,6 +960,8 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
|
${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
|
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/oai_arith_operations.c
|
${OPENAIR1_DIR}/PHY/TOOLS/oai_arith_operations.c
|
||||||
|
${PHY_POLARSRC}
|
||||||
|
${PHY_SMALLBLOCKSRC}
|
||||||
${PHY_NRLDPC_CODINGIF}
|
${PHY_NRLDPC_CODINGIF}
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/pucch_rx.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/pucch_rx.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/srs_rx.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/srs_rx.c
|
||||||
@@ -1029,7 +976,6 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/cic_filter_nr.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/cic_filter_nr.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_initial_sync_sl.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_initial_sync_sl.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ntn_l1.c
|
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_pbch.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_pbch.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_psbch_rx.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_psbch_rx.c
|
||||||
@@ -1064,6 +1010,8 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
|
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/oai_arith_operations.c
|
${OPENAIR1_DIR}/PHY/TOOLS/oai_arith_operations.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/nr_init_ue.c
|
${OPENAIR1_DIR}/PHY/INIT/nr_init_ue.c
|
||||||
|
${PHY_POLARSRC}
|
||||||
|
${PHY_SMALLBLOCKSRC}
|
||||||
${PHY_NRLDPC_CODINGIF}
|
${PHY_NRLDPC_CODINGIF}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1082,27 +1030,33 @@ add_dependencies(PHY_COMMON dfts)
|
|||||||
add_library(PHY ${PHY_SRC})
|
add_library(PHY ${PHY_SRC})
|
||||||
target_link_libraries(PHY PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
target_link_libraries(PHY PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||||
|
|
||||||
|
pkg_check_modules(blas REQUIRED blas)
|
||||||
|
pkg_check_modules(lapacke REQUIRED lapacke)
|
||||||
|
|
||||||
add_library(PHY_UE ${PHY_SRC_UE})
|
add_library(PHY_UE ${PHY_SRC_UE})
|
||||||
target_link_libraries(PHY_UE PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL)
|
target_link_libraries(PHY_UE PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL)
|
||||||
|
# RHEL needs also cblas, but Ubuntu does not have it. So `cblas_LIBRARIES` will
|
||||||
|
# be empty for Ubuntu, a no-op
|
||||||
|
pkg_check_modules(cblas cblas)
|
||||||
|
target_link_libraries(PHY_UE PRIVATE ${blas_LIBRARIES} ${cblas_LIBRARIES} ${lapacke_LIBRARIES})
|
||||||
|
target_include_directories(PHY_UE PRIVATE ${blas_INCLUDE_DIRS} ${lapacke_INCLUDE_DIRS})
|
||||||
|
|
||||||
add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
|
add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
|
||||||
target_link_libraries(PHY_NR_COMMON PUBLIC UTIL)
|
target_link_libraries(PHY_NR_COMMON PUBLIC UTIL)
|
||||||
|
|
||||||
add_library(PHY_NR ${PHY_NR_SRC})
|
add_library(PHY_NR ${PHY_NR_SRC})
|
||||||
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5 polar smallblock ds)
|
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5)
|
||||||
|
|
||||||
add_library(PHY_NR_NO_AVX_256 ${PHY_NR_SRC})
|
add_library(PHY_NR_NO_AVX_256 ${PHY_NR_SRC})
|
||||||
target_link_libraries(PHY_NR_NO_AVX_256 nr_phy_common nr_common)
|
target_link_libraries(PHY_NR_NO_AVX_256 nr_phy_common nr_common)
|
||||||
target_compile_definitions(PHY_NR_NO_AVX_256 PUBLIC USE_128BIT)
|
target_compile_definitions(PHY_NR_NO_AVX_256 PUBLIC USE_128BIT)
|
||||||
|
|
||||||
add_library(PHY_NR_UE ${PHY_NR_UE_SRC})
|
add_library(PHY_NR_UE ${PHY_NR_UE_SRC})
|
||||||
target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs nr_phy_common nr_common UTIL polar smallblock)
|
target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs nr_phy_common nr_common UTIL)
|
||||||
|
|
||||||
add_library(PHY_RU ${PHY_SRC_RU})
|
add_library(PHY_RU ${PHY_SRC_RU})
|
||||||
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
|
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
|
||||||
|
|
||||||
add_library(NR_PHY_RU ${NR_PHY_SRC_RU})
|
|
||||||
|
|
||||||
#Layer 2 library
|
#Layer 2 library
|
||||||
#####################
|
#####################
|
||||||
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
||||||
@@ -1162,7 +1116,7 @@ set(L2_SRC
|
|||||||
${RRC_DIR}/rrc_eNB_S1AP.c
|
${RRC_DIR}/rrc_eNB_S1AP.c
|
||||||
${RRC_DIR}/rrc_eNB_M2AP.c
|
${RRC_DIR}/rrc_eNB_M2AP.c
|
||||||
${RRC_DIR}/rrc_eNB_UE_context.c
|
${RRC_DIR}/rrc_eNB_UE_context.c
|
||||||
${RRC_DIR}/rrc_eNB_GTPV1U.c
|
${NR_RRC_DIR}/rrc_gNB_UE_context.c
|
||||||
${RRC_DIR}/rrc_common.c
|
${RRC_DIR}/rrc_common.c
|
||||||
${RRC_DIR}/L2_interface.c
|
${RRC_DIR}/L2_interface.c
|
||||||
${RRC_DIR}/L2_interface_common.c
|
${RRC_DIR}/L2_interface_common.c
|
||||||
@@ -1228,7 +1182,6 @@ set(NR_L2_SRC_UE
|
|||||||
${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
|
||||||
${NR_UE_RRC_DIR}/verify_RRC.c
|
|
||||||
${NR_UE_RRC_DIR}/rrc_timers_and_constants.c
|
${NR_UE_RRC_DIR}/rrc_timers_and_constants.c
|
||||||
${NR_UE_RRC_DIR}/rrc_sl_preconfig.c
|
${NR_UE_RRC_DIR}/rrc_sl_preconfig.c
|
||||||
)
|
)
|
||||||
@@ -1315,8 +1268,6 @@ set (GNB_APP_SRC
|
|||||||
${OPENAIR2_DIR}/GNB_APP/gnb_app.c
|
${OPENAIR2_DIR}/GNB_APP/gnb_app.c
|
||||||
${OPENAIR2_DIR}/E1AP/e1ap_setup.c
|
${OPENAIR2_DIR}/E1AP/e1ap_setup.c
|
||||||
${OPENAIR2_DIR}/GNB_APP/gnb_config.c
|
${OPENAIR2_DIR}/GNB_APP/gnb_config.c
|
||||||
${OPENAIR2_DIR}/GNB_APP/gnb_config_common.c
|
|
||||||
${OPENAIR2_DIR}/GNB_APP/gnb_config_ng.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set (MCE_APP_SRC
|
set (MCE_APP_SRC
|
||||||
@@ -1337,9 +1288,6 @@ add_library(L2
|
|||||||
)
|
)
|
||||||
target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
|
target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
|
||||||
target_link_libraries(L2 PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
target_link_libraries(L2 PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||||
if(E2_AGENT)
|
|
||||||
target_compile_definitions(L2 PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library(MAC_UE_NR ${MAC_NR_SRC_UE})
|
add_library(MAC_UE_NR ${MAC_NR_SRC_UE})
|
||||||
target_link_libraries(MAC_UE_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs PUBLIC nr_ue_power_procedures nr_ue_ra_procedures)
|
target_link_libraries(MAC_UE_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs PUBLIC nr_ue_power_procedures nr_ue_ra_procedures)
|
||||||
@@ -1355,9 +1303,6 @@ add_library(L2_NR
|
|||||||
target_link_libraries(L2_NR PRIVATE ds alg)
|
target_link_libraries(L2_NR PRIVATE ds alg)
|
||||||
target_link_libraries(L2_NR PRIVATE f1ap_lib)
|
target_link_libraries(L2_NR PRIVATE f1ap_lib)
|
||||||
target_include_directories(L2_NR PRIVATE ${F1AP_DIR}/lib)
|
target_include_directories(L2_NR PRIVATE ${F1AP_DIR}/lib)
|
||||||
if(E2_AGENT)
|
|
||||||
target_compile_definitions(L2_NR PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library(e1_if
|
add_library(e1_if
|
||||||
${NR_RRC_DIR}/cucp_cuup_direct.c
|
${NR_RRC_DIR}/cucp_cuup_direct.c
|
||||||
@@ -1411,6 +1356,15 @@ include_directories("${OPENAIR1_DIR}/SCHED_NR_UE")
|
|||||||
# CN libs
|
# CN libs
|
||||||
##########################
|
##########################
|
||||||
|
|
||||||
|
add_library (GTPV1U
|
||||||
|
${RRC_DIR}/rrc_eNB_GTPV1U.c
|
||||||
|
${OPENAIR3_DIR}/ocp-gtpu/gtp_itf.cpp
|
||||||
|
${OPENAIR3_DIR}/ocp-gtpu/gtpu_extensions.c
|
||||||
|
)
|
||||||
|
target_link_libraries(GTPV1U PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
target_link_libraries(GTPV1U PRIVATE SIMU ds)
|
||||||
|
include_directories(${OPENAIR3_DIR}/ocp-gtp)
|
||||||
|
|
||||||
set (MME_APP_SRC
|
set (MME_APP_SRC
|
||||||
${OPENAIR3_DIR}/MME_APP/mme_app.c
|
${OPENAIR3_DIR}/MME_APP/mme_app.c
|
||||||
${OPENAIR3_DIR}/MME_APP/mme_config.c
|
${OPENAIR3_DIR}/MME_APP/mme_config.c
|
||||||
@@ -1708,17 +1662,6 @@ set (SIMUSRC
|
|||||||
add_library(SIMU STATIC ${SIMUSRC} )
|
add_library(SIMU STATIC ${SIMUSRC} )
|
||||||
target_include_directories(SIMU PUBLIC ${OPENAIR1_DIR}/SIMULATION/TOOLS ${OPENAIR1_DIR}/SIMULATION/RF)
|
target_include_directories(SIMU PUBLIC ${OPENAIR1_DIR}/SIMULATION/TOOLS ${OPENAIR1_DIR}/SIMULATION/RF)
|
||||||
|
|
||||||
option(CHANNEL_SSE "Enable SSE optimizations for channel simulation" OFF)
|
|
||||||
if(CHANNEL_SSE)
|
|
||||||
message(STATUS "SSE-optimized channel simulation enabled.")
|
|
||||||
target_compile_definitions(SIMU PRIVATE CHANNEL_SSE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CUDA_FOUND)
|
|
||||||
set_property(TARGET SIMU PROPERTY CUDA_ARCHITECTURES ${CMAKE_CUDA_ARCHITECTURES})
|
|
||||||
set_property(TARGET SIMU PROPERTY LINKER_LANGUAGE CXX)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories("${NFAPI_DIR}/nfapi/public_inc")
|
include_directories("${NFAPI_DIR}/nfapi/public_inc")
|
||||||
include_directories("${NFAPI_DIR}/common/public_inc")
|
include_directories("${NFAPI_DIR}/common/public_inc")
|
||||||
include_directories("${NFAPI_DIR}/pnf/public_inc")
|
include_directories("${NFAPI_DIR}/pnf/public_inc")
|
||||||
@@ -1749,9 +1692,12 @@ add_executable(lte-softmodem
|
|||||||
${OPENAIR_DIR}/executables/lte-ru.c
|
${OPENAIR_DIR}/executables/lte-ru.c
|
||||||
${OPENAIR_DIR}/executables/ru_control.c
|
${OPENAIR_DIR}/executables/ru_control.c
|
||||||
${OPENAIR_DIR}/executables/lte-softmodem.c
|
${OPENAIR_DIR}/executables/lte-softmodem.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
||||||
${OPENAIR_DIR}/executables/create_tasks.c
|
${OPENAIR_DIR}/executables/create_tasks.c
|
||||||
${OPENAIR_DIR}/executables/create_tasks_mbms.c
|
${OPENAIR_DIR}/executables/create_tasks_mbms.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/common_lib.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/record_player.c
|
||||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
${PHY_INTERFACE_DIR}/queue_t.c
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
@@ -1762,14 +1708,15 @@ add_dependencies(lte-softmodem oai_iqplayer)
|
|||||||
|
|
||||||
target_link_libraries(lte-softmodem PRIVATE
|
target_link_libraries(lte-softmodem PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U SECURITY UTIL SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB
|
lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U SECURITY UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB
|
||||||
PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
||||||
${NAS_UE_LIB} ITTI SIMU radio_common softmodem_common
|
${NAS_UE_LIB} ITTI SIMU shlib_loader
|
||||||
-Wl,--end-group dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
target_link_libraries(lte-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
target_link_libraries(lte-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||||
target_link_libraries(lte-softmodem PRIVATE ${T_LIB})
|
target_link_libraries(lte-softmodem PRIVATE ${T_LIB})
|
||||||
target_link_libraries(lte-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(lte-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
target_link_libraries(lte-softmodem PRIVATE ${blas_LIBRARIES} ${cblas_LIBRARIES} ${lapacke_LIBRARIES} ${lapack_LIBRARIES})
|
||||||
|
|
||||||
if(E2_AGENT)
|
if(E2_AGENT)
|
||||||
target_link_libraries(lte-softmodem PUBLIC e2_agent e2_agent_arg e2_ran_func_du_cucp_cuup)
|
target_link_libraries(lte-softmodem PUBLIC e2_agent e2_agent_arg e2_ran_func_du_cucp_cuup)
|
||||||
@@ -1779,18 +1726,17 @@ endif()
|
|||||||
add_executable(oairu
|
add_executable(oairu
|
||||||
${OPENAIR_DIR}/executables/lte-ru.c
|
${OPENAIR_DIR}/executables/lte-ru.c
|
||||||
${OPENAIR_DIR}/executables/ru_control.c
|
${OPENAIR_DIR}/executables/ru_control.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/common_lib.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/record_player.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
|
|
||||||
${OPENAIR_DIR}/executables/main_ru.c
|
${OPENAIR_DIR}/executables/main_ru.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
)
|
)
|
||||||
target_link_libraries(oairu PRIVATE
|
target_link_libraries(oairu PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
SCHED_RU_LIB PHY_COMMON PHY_RU UTIL radio_common softmodem_common
|
SCHED_RU_LIB PHY_COMMON PHY_RU UTIL shlib_loader
|
||||||
-Wl,--end-group dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
target_link_libraries(oairu PRIVATE pthread m CONFIG_LIB rt ${T_LIB})
|
target_link_libraries(oairu PRIVATE pthread m CONFIG_LIB rt ${T_LIB})
|
||||||
target_link_libraries(oairu PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(oairu PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
@@ -1806,7 +1752,10 @@ target_link_libraries(lte-softmodem PRIVATE
|
|||||||
add_executable(lte-uesoftmodem
|
add_executable(lte-uesoftmodem
|
||||||
${OPENAIR_DIR}/executables/lte-ue.c
|
${OPENAIR_DIR}/executables/lte-ue.c
|
||||||
${OPENAIR_DIR}/executables/lte-uesoftmodem.c
|
${OPENAIR_DIR}/executables/lte-uesoftmodem.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${OPENAIR_DIR}/executables/create_tasks_ue.c
|
${OPENAIR_DIR}/executables/create_tasks_ue.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/common_lib.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/record_player.c
|
||||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
@@ -1816,36 +1765,20 @@ add_executable(lte-uesoftmodem
|
|||||||
target_link_libraries(lte-uesoftmodem PRIVATE
|
target_link_libraries(lte-uesoftmodem PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
lte_rrc nr_rrc s1ap x2ap m2ap m3ap
|
lte_rrc nr_rrc s1ap x2ap m2ap m3ap
|
||||||
SECURITY UTIL SCTP_CLIENT MME_APP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
|
SECURITY UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
|
||||||
PHY_UE PHY_RU L2_UE L2_LTE SIMU NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
PHY_UE PHY_RU L2_UE L2_LTE SIMU NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
||||||
${NAS_UE_LIB} ITTI radio_common softmodem_common
|
${NAS_UE_LIB} ITTI shlib_loader
|
||||||
-Wl,--end-group dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
target_link_libraries(lte-uesoftmodem PRIVATE pthread m CONFIG_LIB rt)
|
target_link_libraries(lte-uesoftmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||||
target_link_libraries(lte-uesoftmodem PRIVATE ${T_LIB})
|
target_link_libraries(lte-uesoftmodem PRIVATE ${T_LIB})
|
||||||
target_link_libraries(lte-uesoftmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(lte-uesoftmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
target_link_libraries(lte-uesoftmodem PRIVATE ${blas_LIBRARIES} ${cblas_LIBRARIES} ${lapacke_LIBRARIES} ${lapack_LIBRARIES})
|
||||||
|
|
||||||
# force the generation of ASN.1 so that we don't need to wait during the build
|
# force the generation of ASN.1 so that we don't need to wait during the build
|
||||||
target_link_libraries(lte-uesoftmodem PRIVATE
|
target_link_libraries(lte-uesoftmodem PRIVATE
|
||||||
asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap)
|
asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap)
|
||||||
|
|
||||||
# nr RRU
|
|
||||||
add_executable(nr-oru
|
|
||||||
${OPENAIR_DIR}/executables/nr-ru.c
|
|
||||||
${OPENAIR_DIR}/openair1/PHY/INIT/nr_parms.c
|
|
||||||
${OPENAIR_DIR}/openair1/SCHED_NR/phy_frame_config_nr.c
|
|
||||||
${OPENAIR_DIR}/openair1/SCHED_NR/nr_prach_procedures.c
|
|
||||||
${OPENAIR_DIR}/openair1/SCHED_NR/nr_ru_procedures.c
|
|
||||||
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
|
||||||
${OPENAIR_DIR}/executables/main_nr_ru.c
|
|
||||||
)
|
|
||||||
target_link_libraries(nr-oru PRIVATE
|
|
||||||
UTIL NR_PHY_RU PHY_NR shlib_loader dl
|
|
||||||
radio_common softmodem_common)
|
|
||||||
target_link_libraries(nr-oru PRIVATE pthread m CONFIG_LIB rt ${T_LIB} utils
|
|
||||||
barrier actor)
|
|
||||||
target_link_libraries(nr-oru PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs nr_phy_common time_management)
|
|
||||||
|
|
||||||
# nr-softmodem
|
# nr-softmodem
|
||||||
###################################################
|
###################################################
|
||||||
|
|
||||||
@@ -1856,6 +1789,9 @@ add_executable(nr-softmodem
|
|||||||
${OPENAIR_DIR}/executables/nr-gnb.c
|
${OPENAIR_DIR}/executables/nr-gnb.c
|
||||||
${OPENAIR_DIR}/executables/nr-ru.c
|
${OPENAIR_DIR}/executables/nr-ru.c
|
||||||
${OPENAIR_DIR}/executables/nr-softmodem.c
|
${OPENAIR_DIR}/executables/nr-softmodem.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/common_lib.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/record_player.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
${PHY_INTERFACE_DIR}/queue_t.c
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
@@ -1864,12 +1800,12 @@ add_executable(nr-softmodem
|
|||||||
|
|
||||||
target_link_libraries(nr-softmodem PRIVATE
|
target_link_libraries(nr-softmodem PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
UTIL SCTP_CLIENT SCHED_LIB SCHED_NR_LIB PHY_NR PHY PHY_NR_COMMON NR_PHY_RU GTPV1U SECURITY
|
UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECURITY
|
||||||
ITTI ${NAS_UE_LIB} nr_rrc
|
ITTI ${NAS_UE_LIB} lte_rrc nr_rrc
|
||||||
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
|
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
|
||||||
x2ap f1ap m2ap m3ap e1ap radio_common
|
x2ap f1ap m2ap m3ap e1ap shlib_loader
|
||||||
time_management softmodem_common
|
time_management
|
||||||
-Wl,--end-group dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||||
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
|
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
|
||||||
@@ -1898,6 +1834,7 @@ target_link_libraries(nr-softmodem PRIVATE
|
|||||||
|
|
||||||
add_executable(nr-cuup
|
add_executable(nr-cuup
|
||||||
executables/nr-cuup.c
|
executables/nr-cuup.c
|
||||||
|
executables/softmodem-common.c
|
||||||
${NR_RRC_DIR}/rrc_gNB_UE_context.c
|
${NR_RRC_DIR}/rrc_gNB_UE_context.c
|
||||||
${OPENAIR2_DIR}/E1AP/e1ap_setup.c
|
${OPENAIR2_DIR}/E1AP/e1ap_setup.c
|
||||||
${NR_PDCP_SRC}
|
${NR_PDCP_SRC}
|
||||||
@@ -1907,9 +1844,9 @@ add_executable(nr-cuup
|
|||||||
target_link_libraries(nr-cuup PRIVATE
|
target_link_libraries(nr-cuup PRIVATE
|
||||||
CONFIG_LIB ITTI SCTP_CLIENT
|
CONFIG_LIB ITTI SCTP_CLIENT
|
||||||
GTPV1U e1ap f1ap
|
GTPV1U e1ap f1ap
|
||||||
time_management softmodem_common
|
time_management
|
||||||
alg
|
alg
|
||||||
dl pthread ${T_LIB})
|
z dl pthread shlib_loader ${T_LIB})
|
||||||
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||||
if(E2_AGENT)
|
if(E2_AGENT)
|
||||||
target_link_libraries(nr-cuup PRIVATE e2_agent e2_agent_arg e2_ran_func_cuup)
|
target_link_libraries(nr-cuup PRIVATE e2_agent e2_agent_arg e2_ran_func_cuup)
|
||||||
@@ -1925,7 +1862,11 @@ add_executable(nr-uesoftmodem
|
|||||||
${OPENAIR_DIR}/executables/nr-uesoftmodem.c
|
${OPENAIR_DIR}/executables/nr-uesoftmodem.c
|
||||||
${OPENAIR_DIR}/executables/position_interface.c
|
${OPENAIR_DIR}/executables/position_interface.c
|
||||||
${OPENAIR_DIR}/executables/nr-ue.c
|
${OPENAIR_DIR}/executables/nr-ue.c
|
||||||
${OPENAIR_DIR}/executables/nr-ue-ru.c
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/common_lib.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/record_player.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common_tdd.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/phy_scope_interface.c
|
${OPENAIR1_DIR}/PHY/TOOLS/phy_scope_interface.c
|
||||||
${NFAPI_USER_DIR}/nfapi.c
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
${PHY_INTERFACE_DIR}/queue_t.c
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
@@ -1933,15 +1874,15 @@ add_executable(nr-uesoftmodem
|
|||||||
|
|
||||||
target_link_libraries(nr-uesoftmodem PRIVATE
|
target_link_libraries(nr-uesoftmodem PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
nr_rrc SECURITY UTIL SCHED_NR_UE_LIB
|
nr_rrc SECURITY UTIL HASHTABLE SCHED_RU_LIB SCHED_NR_UE_LIB
|
||||||
PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
|
PHY_COMMON PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
|
||||||
ITTI SIMU radio_common
|
ITTI SIMU shlib_loader
|
||||||
time_management softmodem_common
|
time_management
|
||||||
-Wl,--end-group dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
target_link_libraries(nr-uesoftmodem PRIVATE pthread m CONFIG_LIB rt nr_ue_phy_meas)
|
target_link_libraries(nr-uesoftmodem PRIVATE pthread m CONFIG_LIB rt nr_ue_phy_meas)
|
||||||
target_link_libraries(nr-uesoftmodem PRIVATE ${T_LIB})
|
target_link_libraries(nr-uesoftmodem PRIVATE ${T_LIB})
|
||||||
target_link_libraries(nr-uesoftmodem PRIVATE nr_nas lib_uicc usim_lib SECURITY)
|
target_link_libraries(nr-uesoftmodem PRIVATE nr_nas lib_uicc usim_lib)
|
||||||
target_link_libraries(nr-uesoftmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr-uesoftmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
# force the generation of ASN.1 so that we don't need to wait during the build
|
# force the generation of ASN.1 so that we don't need to wait during the build
|
||||||
@@ -1969,10 +1910,10 @@ target_link_libraries(nr-uesoftmodem PRIVATE
|
|||||||
add_executable(rftest
|
add_executable(rftest
|
||||||
${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_test.c
|
${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_test.c
|
||||||
${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_scope.c
|
${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_scope.c
|
||||||
|
${OPENAIR_DIR}/radio/COMMON/common_lib.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
)
|
)
|
||||||
target_link_libraries(rftest PRIVATE
|
target_link_libraries(rftest PRIVATE minimal_lib PHY_NR_COMMON UTIL forms pthread dl m ${T_LIB} shlib_loader)
|
||||||
minimal_lib PHY_NR_COMMON UTIL forms pthread dl m ${T_LIB}
|
|
||||||
radio_common softmodem_common)
|
|
||||||
target_link_libraries(rftest PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
target_link_libraries(rftest PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(polartest
|
add_executable(polartest
|
||||||
@@ -1989,7 +1930,7 @@ add_executable(smallblocktest
|
|||||||
|
|
||||||
target_link_libraries(smallblocktest PRIVATE
|
target_link_libraries(smallblocktest PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR PHY_COMMON PHY_NR_COMMON -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_NR PHY_COMMON PHY_NR_COMMON -Wl,--end-group
|
||||||
m pthread dl ${T_LIB}
|
m pthread dl shlib_loader ${T_LIB}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -1999,7 +1940,7 @@ add_executable(ldpctest
|
|||||||
)
|
)
|
||||||
target_link_libraries(ldpctest PRIVATE
|
target_link_libraries(ldpctest PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON -Wl,--end-group
|
||||||
m pthread dl ${T_LIB}
|
m pthread dl shlib_loader ${T_LIB}
|
||||||
# link 'check_crc' to make it resolved in the LDPC coding libraries
|
# link 'check_crc' to make it resolved in the LDPC coding libraries
|
||||||
# 'check_crc' is not used in ldpctest so it is not linked in the executable by default
|
# 'check_crc' is not used in ldpctest so it is not linked in the executable by default
|
||||||
# --whole-archive links 'check_crc' in the executable even though it is note used, see 'man ld'
|
# --whole-archive links 'check_crc' in the executable even though it is note used, see 'man ld'
|
||||||
@@ -2011,99 +1952,85 @@ target_link_libraries(physim_common PRIVATE UTIL)
|
|||||||
|
|
||||||
add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c)
|
add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c)
|
||||||
target_link_libraries(nr_dlschsim PRIVATE
|
target_link_libraries(nr_dlschsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common
|
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_dlschsim PRIVATE asn1_nr_rrc_hdrs)
|
target_link_libraries(nr_dlschsim PRIVATE asn1_nr_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c)
|
add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c)
|
||||||
target_link_libraries(nr_pbchsim PRIVATE
|
target_link_libraries(nr_pbchsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common
|
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_psbchsim
|
add_executable(nr_psbchsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/psbchsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/psbchsim.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${NFAPI_USER_DIR}/nfapi.c
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
|
${NFAPI_USER_DIR}/gnb_ind_vars.c
|
||||||
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_psbchsim PRIVATE
|
target_link_libraries(nr_psbchsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON CONFIG_LIB -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON CONFIG_LIB L2_NR -lz -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common softmodem_common
|
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_psbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_psbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_pucchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c)
|
add_executable(nr_pucchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c)
|
||||||
target_link_libraries(nr_pucchsim PRIVATE
|
target_link_libraries(nr_pucchsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common
|
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_dlsim
|
add_executable(nr_dlsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${NFAPI_USER_DIR}/nfapi.c
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
${NFAPI_USER_DIR}/gnb_ind_vars.c
|
${NFAPI_USER_DIR}/gnb_ind_vars.c
|
||||||
${PHY_INTERFACE_DIR}/queue_t.c
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_dlsim PRIVATE
|
target_link_libraries(nr_dlsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON CONFIG_LIB L2_NR -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common NR_L2_UE
|
m pthread ${T_LIB} ITTI dl shlib_loader nr_ue_phy_meas physim_common
|
||||||
softmodem_common
|
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_prachsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c)
|
add_executable(nr_prachsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c)
|
||||||
target_link_libraries(nr_prachsim PRIVATE
|
target_link_libraries(nr_prachsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR NR_PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB CONFIG_LIB -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB CONFIG_LIB -lz -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common)
|
m pthread ${T_LIB} ITTI dl shlib_loader physim_common)
|
||||||
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_ulschsim
|
add_executable(nr_ulschsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||||
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_ulschsim PRIVATE
|
target_link_libraries(nr_ulschsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common
|
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_ulsim
|
add_executable(nr_ulsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${NFAPI_USER_DIR}/nfapi.c
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
${NFAPI_USER_DIR}/gnb_ind_vars.c
|
${NFAPI_USER_DIR}/gnb_ind_vars.c
|
||||||
${PHY_INTERFACE_DIR}/queue_t.c
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(nr_ulsim PRIVATE
|
target_link_libraries(nr_ulsim PRIVATE
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON CONFIG_LIB L2_NR -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common softmodem_common NR_L2_UE
|
m pthread ${T_LIB} ITTI dl shlib_loader nr_ue_phy_meas physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
add_executable(nr_srssim
|
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/srssim.c
|
|
||||||
${NFAPI_USER_DIR}/nfapi.c
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(nr_srssim PRIVATE
|
|
||||||
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON -Wl,--end-group
|
|
||||||
m pthread ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
|
||||||
)
|
|
||||||
|
|
||||||
if(CUDA_ENABLE)
|
|
||||||
if (TARGET oai_cuda_lib)
|
|
||||||
target_link_libraries(nr_dlsim PRIVATE oai_cuda_lib)
|
|
||||||
target_link_libraries(nr_ulsim PRIVATE oai_cuda_lib)
|
|
||||||
|
|
||||||
target_compile_definitions(nr_dlsim PRIVATE ENABLE_CUDA)
|
|
||||||
target_compile_definitions(nr_ulsim PRIVATE ENABLE_CUDA)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# these simulators do not compile:
|
# these simulators do not compile:
|
||||||
# dlsim_tm7 pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim
|
# dlsim_tm7 pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim
|
||||||
foreach(myExe dlsim ulsim)
|
foreach(myExe dlsim ulsim)
|
||||||
|
|
||||||
add_executable(${myExe}
|
add_executable(${myExe}
|
||||||
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
|
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||||
@@ -2113,7 +2040,7 @@ foreach(myExe dlsim ulsim)
|
|||||||
)
|
)
|
||||||
target_link_libraries (${myExe} PRIVATE
|
target_link_libraries (${myExe} PRIVATE
|
||||||
-Wl,--start-group SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU ITTI -Wl,--end-group
|
-Wl,--start-group SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU ITTI -Wl,--end-group
|
||||||
pthread m rt CONFIG_LIB ${T_LIB} dl
|
pthread m rt CONFIG_LIB ${T_LIB} dl shlib_loader
|
||||||
)
|
)
|
||||||
target_link_libraries(${myExe} PRIVATE asn1_lte_rrc_hdrs)
|
target_link_libraries(${myExe} PRIVATE asn1_lte_rrc_hdrs)
|
||||||
add_dependencies(${myExe} coding)
|
add_dependencies(${myExe} coding)
|
||||||
@@ -2148,15 +2075,15 @@ if (${T_TRACER})
|
|||||||
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
|
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
|
||||||
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
||||||
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
||||||
nr_ulschsim ldpctest polartest smallblocktest nr_srssim
|
nr_ulschsim ldpctest polartest smallblocktest
|
||||||
#all "add_library" definitions
|
#all "add_library" definitions
|
||||||
ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap
|
ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap
|
||||||
params_libconfig
|
params_libconfig
|
||||||
oai_eth_transpro UTIL
|
oai_eth_transpro HASHTABLE UTIL
|
||||||
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
||||||
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
||||||
MISC_NFAPI_LTE_LIB
|
MISC_NFAPI_LTE_LIB
|
||||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU NR_PHY_RU
|
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU
|
||||||
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_UE_NR ngap
|
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_UE_NR ngap
|
||||||
GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE SIMU
|
GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE SIMU
|
||||||
dfts config_internals nr_common crc_byte)
|
dfts config_internals nr_common crc_byte)
|
||||||
@@ -2205,7 +2132,6 @@ if(ENABLE_TESTS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(common)
|
add_subdirectory(common)
|
||||||
add_subdirectory(executables)
|
|
||||||
add_subdirectory(doc)
|
add_subdirectory(doc)
|
||||||
add_subdirectory(nfapi)
|
add_subdirectory(nfapi)
|
||||||
add_subdirectory(openair1)
|
add_subdirectory(openair1)
|
||||||
@@ -2213,13 +2139,3 @@ add_subdirectory(openair2)
|
|||||||
add_subdirectory(openair3)
|
add_subdirectory(openair3)
|
||||||
add_subdirectory(radio)
|
add_subdirectory(radio)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
|
|
||||||
if(TARGET oai_cuda_lib)
|
|
||||||
message(STATUS "CUDA library 'oai_cuda_lib' found, linking to targets...")
|
|
||||||
target_link_libraries(nr_dlsim PRIVATE oai_cuda_lib)
|
|
||||||
target_link_libraries(nr_ulsim PRIVATE oai_cuda_lib)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(PACKAGING_LTE OR PACKAGING_NR OR PACKAGING_COMMON OR PACKAGING_USRP OR PACKAGING_PHYSIM)
|
|
||||||
include("tools/packages/packages.cmake")
|
|
||||||
endif()
|
|
||||||
|
|||||||
+2
-12
@@ -1,5 +1,3 @@
|
|||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
# Contributing to OpenAirInterface #
|
# Contributing to OpenAirInterface #
|
||||||
|
|
||||||
We want to make contributing to this project as easy and transparent as possible.
|
We want to make contributing to this project as easy and transparent as possible.
|
||||||
@@ -28,13 +26,5 @@ Please refer to the steps described on our website: [How to contribute to OAI](h
|
|||||||
# License #
|
# License #
|
||||||
|
|
||||||
By contributing to OpenAirInterface, you agree that your contributions will be
|
By contributing to OpenAirInterface, you agree that your contributions will be
|
||||||
licensed under
|
licensed under the license described in the file [`LICENSE`](./LICENSE) in the
|
||||||
|
root directory of this source tree.
|
||||||
1. [CSSL v1.0 license](LICENSES/preferred/CSSL-v1.0.txt): for RAN and UE
|
|
||||||
related source code and test scripts
|
|
||||||
2. [CC-BY-4.0](LICENSES/preferred/CC-BY-4.0.txt): All the documentation
|
|
||||||
3. [MIT](LICENSES/preferred/MIT.txt): Orchestration (helm-charts, docker
|
|
||||||
compose)
|
|
||||||
|
|
||||||
Certain files are using different licenses; you can read about them in
|
|
||||||
[NOTICE](NOTICE).
|
|
||||||
|
|||||||
@@ -1,223 +1,200 @@
|
|||||||
Collaborative Standards Software License v1.0 (CSSL)
|
The OpenAirInterface Software Alliance (OSA)
|
||||||
|
OAI Public License (Version 1.1)
|
||||||
|
|
||||||
LICENSE TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION OF
|
LICENSE TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION OF OPENAIR 5G SOFTWARE.
|
||||||
OPENAIRINTERFACE. The pdf version of this document can be downloaded from
|
|
||||||
https://openairinterface.org/oai-cssl/.
|
|
||||||
|
|
||||||
1. Definitions.
|
1. Definitions.
|
||||||
|
|
||||||
“License” shall mean the terms and conditions for use, reproduction, and
|
“License” shall mean the terms and conditions for use, reproduction, and distribution set forth
|
||||||
distribution set forth in this document.
|
in this document.
|
||||||
|
|
||||||
“Licensor” shall mean the copyright owner or entity authorized by the copyright
|
“Licensor” shall mean the OpenAirInterface Software Alliance.
|
||||||
owner that is granting the License.
|
|
||||||
|
|
||||||
“Legal Entity” shall mean the union of the acting entity and all other entities
|
“Legal Entity” shall mean the union, at the time an acting entity joins the Alliance, of the
|
||||||
that control, are controlled by, or are under common control with that entity.
|
acting entity and all other entities that control, are controlled by, or are under common control
|
||||||
For the purposes of this definition, “control” means (i) the power, direct or
|
with that entity. For the purposes of this definition, “control” means (i) the power, direct or
|
||||||
indirect, to cause the direction or management of such entity, whether by
|
indirect, to cause the direction or management of such entity, whether by contract or
|
||||||
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii)
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
beneficial ownership of such entity.
|
||||||
|
|
||||||
“You” (or “Your”) shall mean an individual or Legal Entity exercising
|
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by
|
||||||
permissions granted by this License.
|
this License.
|
||||||
|
|
||||||
“Source” form shall mean the preferred form for making modifications, including
|
“Source” form shall mean the preferred form for making modifications, including but not
|
||||||
but not limited to software source code, documentation source, and configuration
|
limited to software source code, documentation source, and configuration files.
|
||||||
files.
|
|
||||||
|
|
||||||
“Object” form shall mean any form resulting from mechanical transformation or
|
“Object” form shall mean any form resulting from mechanical transformation or translation of
|
||||||
translation of a Source form, including but not limited to compiled object code,
|
a Source form, including but not limited to compiled object code, generated documentation,
|
||||||
generated documentation, and conversions to other media types.
|
and conversions to other media types.
|
||||||
|
|
||||||
“Work” shall mean the work of authorship, whether in Source or Object form, made
|
“OpenAirInterface Software Alliance” shall mean the endowment fund established at the
|
||||||
available under the License, as indicated by a copyright notice that is included
|
initiative of Eurecom, an educational and research establishment located at Campus Sophia
|
||||||
in or attached to the work (an example is provided in the Appendix below).
|
Tech, 450 Route des Chappes, 06410 Biot, France, which statutes were signed on 18
|
||||||
|
November 2014.
|
||||||
|
|
||||||
“Derivative Works” shall mean any work, whether in Source or Object form, that
|
“Work” shall mean the work of authorship, whether in Source or Object form, made available
|
||||||
is based on (or derived from) the Work and for which the editorial revisions,
|
under the License, as indicated by a copyright notice that is included in or attached to the
|
||||||
annotations, elaborations, or other modifications represent, as a whole, an
|
work (an example is provided in the Appendix below).
|
||||||
original work of authorship. For the purposes of this License, Derivative Works
|
|
||||||
shall not include works that remain separable from, or merely link (or bind by
|
|
||||||
name) to the interfaces of, the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
“Contribution” shall mean any work of authorship that is intentionally submitted
|
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on
|
||||||
to Licensor for inclusion in the Work by the copyright owner or by an individual
|
(or derived from) the Work and for which the editorial revisions, annotations, elaborations, or
|
||||||
or Legal Entity authorized to submit on behalf of the copyright owner. For the
|
other modifications represent, as a whole, an original work of authorship. For the purposes of
|
||||||
purposes of this definition, “submitted” means any form of electronic, or
|
this License, Derivative Works shall not include works that remain separable from, or merely
|
||||||
written communication sent to the Licensor or its representatives, including but
|
link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||||
not limited to communication on electronic mailing lists, source code control
|
|
||||||
systems, and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work but excluding
|
|
||||||
communication that is conspicuously marked or otherwise designated in writing by
|
|
||||||
the copyright owner or entity authorized by the copyright owner as "Not a
|
|
||||||
Contribution."
|
|
||||||
|
|
||||||
“Contributor License Agreement” shall mean the agreement signed by any
|
“Contribution” shall mean any work of authorship that is intentionally submitted to Licensor
|
||||||
Contributor setting forth the terms and conditions applicable to its
|
for inclusion in the Work by the copyright owner or by an individual or Legal Entity
|
||||||
Contribution.
|
authorized to submit on behalf of the copyright owner. For the purposes of this definition,
|
||||||
|
“submitted” means any form of electronic, , or written communication sent to the Licensor or
|
||||||
|
its representatives, including but not limited to communication on electronic mailing lists,
|
||||||
|
source code control systems, and issue tracking systems that are managed by, or on behalf of,
|
||||||
|
the Licensor for the purpose of discussing and improving the Work
|
||||||
|
|
||||||
“Contributor” shall mean any individual or Legal Entity on behalf of whom a
|
“Contributor License Agreement” shall mean the agreement signed by any Contributor setting
|
||||||
Contribution has been received by Licensor and subsequently incorporated within
|
forth the terms and conditions applicable to its Contribution.
|
||||||
the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License.
|
“Contributor” shall mean any individual or Legal Entity on behalf of whom a Contribution
|
||||||
|
has been received by Licensor and subsequently incorporated within the Work.
|
||||||
|
|
||||||
Subject to the terms and conditions of this License, Licensor and each
|
2. Grant of Copyright License.
|
||||||
Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
Subject to the terms and conditions of this License, Licensor and each Contributor hereby
|
||||||
no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
|
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
Derivative Works of, publicly display, publicly perform, and distribute the Work
|
copyright license to reproduce, prepare Derivative Works of, publicly display, publicly
|
||||||
and such Derivative Works in Source or Object form.
|
perform, and distribute the Work and such Derivative Works in Source or Object form
|
||||||
|
|
||||||
3. Grant of Patent License.
|
3. Grant of Patent License.
|
||||||
|
|
||||||
3.1 Grant of Patent License for study, testing and research purposes:
|
3.1 Grant of Patent License for study, testing and research purposes:
|
||||||
|
Subject to the terms and conditions of this License, Licensor and each Contributor hereby
|
||||||
|
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made, use, and otherwise
|
||||||
|
transfer (excluding selling) the Work, solely for study, testing and research purposes, where
|
||||||
|
such license applies only to those patent claims licensable by Licensor or such Contributor
|
||||||
|
that are necessarily infringed respectively by the Work and/or the said Contributor
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s) with the Work to which
|
||||||
|
such Contribution(s) was submitted (“Essential Patents”).
|
||||||
|
|
||||||
Subject to the terms and conditions of this License, Licensor and each
|
3.2 Grant of Patent License for purposes other than study and research:
|
||||||
Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
For purposes other than study, testing and research, and subject to the terms and conditions of
|
||||||
no-charge, royalty-free, irrevocable (except as stated in this section) patent
|
this License, You commit to be prepared to negotiate a non-exclusive, non-transferable, non-
|
||||||
license to make, have made, use, and otherwise transfer (excluding selling) the
|
assignable license of Essential Patents with each Contributor and/or the Licensor on Fair,
|
||||||
Work, solely for study, testing and research purposes, where such license
|
Reasonable and Non-Discriminatory (“FRAND”) terms and conditions for the use of the
|
||||||
applies only to those patent claims licensable by Licensor or such Contributor
|
Work or Contribution(s) incorporated within the Work.
|
||||||
that are necessarily infringed respectively by the Work and/or the said
|
Licensor and/or each Contributor, by submitting a Contribution, will identify any of its known
|
||||||
Contributor Contribution(s) alone or by combination of their Contribution(s)
|
Essential Patent it owns related to the Work and/or its Contribution.
|
||||||
with the Work to which such Contribution(s) was submitted (“Essential Patents”).
|
|
||||||
|
|
||||||
3.2 Grant of Patent License for purposes other than study, testing and research:
|
|
||||||
|
|
||||||
For purposes other than study, testing and research, and subject to the terms
|
|
||||||
and conditions of this License, You commit to be prepared to negotiate, in good
|
|
||||||
faith, a non-exclusive, nontransferable, non-assignable license of Essential
|
|
||||||
Patents with each Contributor and/or the Licensor on Fair, Reasonable and
|
|
||||||
Non-Discriminatory (“FRAND”) terms and conditions for the use of the Work or
|
|
||||||
Contribution(s) incorporated within the Work.
|
|
||||||
|
|
||||||
3.3 Patent Litigation
|
3.3 Patent Litigation
|
||||||
|
If You institute patent litigation against any entity making use of the Work solely for study,
|
||||||
If You institute patent litigation against any entity making use of the Work
|
testing and research purposes (including a cross-claim or counterclaim in a lawsuit) alleging
|
||||||
solely for study, testing and research purposes (including a cross-claim or
|
that the Work or a Contribution incorporated within the Work constitutes direct or
|
||||||
counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated
|
contributory patent infringement, then the patent licenses granted to You under section 3.1 of
|
||||||
within the Work constitutes direct or contributory patent infringement, then the
|
this License for that Work shall terminate as of the date such litigation is filed.
|
||||||
patent licenses granted to You under section 3.1 of this License for that Work
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Sublicensing
|
4. Sublicensing
|
||||||
|
You may grant sublicenses under the licenses granted under sections 2 and 3.1 provided that
|
||||||
You may grant sublicenses under the licenses granted under sections 2 and 3.1
|
the sublicense is subject to and inclusive of all the terms of and rights under this License to
|
||||||
provided that the sublicense is subject to and inclusive of all the terms of and
|
which the Work is or was distributed by the OpenAirInterface Software Alliance.
|
||||||
rights under this License to which the Work is or was distributed.
|
|
||||||
|
|
||||||
5. Redistribution
|
5. Redistribution
|
||||||
|
Subject to terms and conditions set forth in sections 2 and 3, You may reproduce and
|
||||||
|
distribute copies of the Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You meet the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
Subject to terms and conditions set forth in sections 2 and 3, You may reproduce
|
1. You must give any other recipients of the Work or Derivative Works a copy of this
|
||||||
and distribute copies of the Work or Derivative Works thereof in any medium,
|
License; and
|
||||||
with or without modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
1. You must give any other recipients of the Work or Derivative Works a copy of
|
2. You must cause any modified files by You to carry prominent notices stating that You
|
||||||
this License; and
|
changed the files; and
|
||||||
|
|
||||||
2. You must cause any modified files by You to carry prominent notices stating
|
3. You must retain, in the Source form of any Derivative Works that You distribute, all
|
||||||
that You changed the files; and
|
copyright, patent, trademark, and attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of the Derivative Works; and
|
||||||
|
|
||||||
3. You must retain, in the Source form of any Derivative Works that You
|
4. If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative
|
||||||
distribute, all copyright, patent, trademark, and attribution notices from the
|
Works that You distribute must include a readable copy of the attribution notices contained
|
||||||
Source form of the Work, excluding those notices that do not pertain to any part
|
within such NOTICE file, excluding those notices that do not pertain to any part of the
|
||||||
of the Derivative Works; and
|
Derivative Works, in at least one of the following places: within a NOTICE text file
|
||||||
|
distributed as part of the Derivative Works; within the Source form or documentation, if
|
||||||
|
provided along with the Derivative Works; or, within a display generated by the Derivative
|
||||||
|
Works, if and wherever such third-party notices normally appear. The contents of the
|
||||||
|
NOTICE file are for informational purposes only and do not modify the License. You may
|
||||||
|
add Your own attribution notices within Derivative Works that You distribute, alongside or as
|
||||||
|
an addendum to the NOTICE text from the Work, provided that such additional attribution
|
||||||
|
notices cannot be construed as modifying the License.
|
||||||
|
You may add Your own copyright statement to Your modifications and may provide
|
||||||
|
additional or different license terms and conditions for use, reproduction, or distribution of
|
||||||
|
Your modifications, or for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with the conditions stated in
|
||||||
|
this License.
|
||||||
|
|
||||||
4. If the Work includes a “NOTICE” text file as part of its distribution, then
|
6. Submission of Contributions.
|
||||||
any Derivative Works that You distribute must include a readable copy of the
|
Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be
|
||||||
attribution notices contained within such NOTICE file, excluding those notices
|
under the terms and conditions of this License, without any additional terms or conditions.
|
||||||
that do not pertain to any part of the Derivative Works, in at least one of the
|
Notwithstanding the above, nothing herein shall supersede or modify the terms of any
|
||||||
following places: within a NOTICE text file distributed as part of the
|
separate license agreement such as the Contributor License Agreement You may have
|
||||||
Derivative Works; within the Source form or documentation, if provided along
|
executed with Licensor regarding such Contributions.
|
||||||
with the Derivative Works; or, within a display generated by the Derivative
|
|
||||||
Works, if and wherever such third-party notices normally appear. The contents of
|
|
||||||
the NOTICE file are for informational purposes only and do not modify the
|
|
||||||
License. You may add Your own attribution notices within Derivative Works that
|
|
||||||
You distribute, alongside or as an addendum to the NOTICE text from the Work,
|
|
||||||
provided that such additional attribution notices cannot be construed as
|
|
||||||
modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and may provide
|
7. Trademarks.
|
||||||
additional or different license terms and conditions for use, reproduction, or
|
This License does not grant permission to use the trade names, trademarks, service marks, or
|
||||||
distribution of Your modifications, or for any such Derivative Works as a whole,
|
product names of the Licensor, except as required for reasonable and customary use in
|
||||||
provided Your use, reproduction, and distribution of the Work otherwise complies
|
describing the origin of the Work and reproducing the content of the NOTICE file.
|
||||||
with the conditions stated in this License.
|
|
||||||
|
|
||||||
6. Submission of Contributions.
|
8. Disclaimer of Warranty.
|
||||||
|
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and
|
||||||
|
each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including,
|
||||||
|
without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
|
||||||
|
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
|
||||||
|
responsible for determining the appropriateness of using or redistributing the Work and
|
||||||
|
assume any risks associated with your exercise of permissions under this License.
|
||||||
|
|
||||||
Any contribution intentionally submitted for inclusion in the Work by You to the
|
9. Limitation of Liability.
|
||||||
Licensor shall be under the terms and conditions of this License, without any
|
In no event and under no legal theory, whether in tort (including negligence), contract, or
|
||||||
additional terms or conditions. Notwithstanding the above, nothing herein shall
|
otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or
|
||||||
supersede or modify the terms of any separate license agreement such as the
|
agreed to in writing, shall Licensor and any Contributor, as such, be liable to You for
|
||||||
Contributor License Agreement You may have executed with Licensor regarding such
|
damages, including any direct, indirect, special, incidental, or consequential damages of any
|
||||||
Contributions.
|
character arising as a result of this License or out of Your use or inability to use the Work
|
||||||
|
(including but not limited to damages for loss of goodwill, work stoppage, computer failure or
|
||||||
|
malfunction, or any and all other commercial damages or losses), even if such Contributor has
|
||||||
|
been advised of the possibility of such damages.
|
||||||
|
|
||||||
7. Trademarks.
|
10. Accepting Warranty or Additional Liability.
|
||||||
|
While redistributing the Work or Derivative Works thereof, You may choose to offer, and
|
||||||
|
charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations
|
||||||
|
and/or rights consistent with this License. However, in accepting such obligations, You may
|
||||||
|
act only on Your own behalf and on Your sole responsibility, not on behalf of any other
|
||||||
|
Contributor and/or the Licensor, and only if You agree to indemnify, defend, and hold each
|
||||||
|
Contributor and/or the Licensor harmless for any liability incurred by, or claims asserted
|
||||||
|
against, such Contributor and/or Licensor by reason of Your accepting any such warranty or
|
||||||
|
additional liability.
|
||||||
|
|
||||||
This License does not grant permission to use the trade names, trademarks,
|
11. Applicable law.
|
||||||
service marks, or product names of the Licensor, except as required for
|
The present license shall be governed by the laws of France.
|
||||||
reasonable and customary use in describing the origin of the Work and
|
|
||||||
reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
8. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, Licensor provides the
|
|
||||||
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
|
|
||||||
including, without limitation, any warranties or conditions of TITLE,
|
|
||||||
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
|
|
||||||
solely responsible for determining the appropriateness of using or
|
|
||||||
redistributing the Work and assume any risks associated with your exercise of
|
|
||||||
permissions under this License.
|
|
||||||
|
|
||||||
9. Limitation of Liability.
|
|
||||||
|
|
||||||
In no event and under no legal theory, whether in tort (including negligence),
|
|
||||||
contract, or otherwise, unless required by applicable law (such as deliberate
|
|
||||||
and grossly negligent acts) or agreed to in writing, shall Licensor and any
|
|
||||||
Contributor, as such, be liable to You for damages, including any direct,
|
|
||||||
indirect, special, incidental, or consequential damages of any character arising
|
|
||||||
as a result of this License or out of Your use or inability to use the Work
|
|
||||||
(including but not limited to damages for loss of goodwill, work stoppage,
|
|
||||||
computer failure or malfunction, or any and all other commercial damages or
|
|
||||||
losses), even if such Contributor has been advised of the possibility of such
|
|
||||||
damages.
|
|
||||||
|
|
||||||
10. Accepting Warranty or Additional Liability.
|
|
||||||
|
|
||||||
While redistributing the Work or Derivative Works thereof, You may choose to
|
|
||||||
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
|
|
||||||
other liability obligations and/or rights consistent with this License. However,
|
|
||||||
in accepting such obligations, You may act only on Your own behalf and on Your
|
|
||||||
sole responsibility, not on behalf of any other Contributor and/or the Licensor,
|
|
||||||
and only if You agree to indemnify, defend, and hold each Contributor and/or the
|
|
||||||
Licensor harmless for any liability incurred by, or claims asserted against,
|
|
||||||
such Contributor and/or Licensor by reason of Your accepting any such warranty
|
|
||||||
or additional liability obligations.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
1. APPENDIX: How to apply the PRESENT License to your work
|
1. APPENDIX: How to apply the PRESENT OPENAIR 5G License to your work
|
||||||
|
To apply the present License to your work, attach the following boilerplate notice, with the
|
||||||
To apply the present License to your work, attach the following boilerplate
|
fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t
|
||||||
notice, with the fields enclosed by brackets “[]” replaced with your own
|
include the brackets!) The text should be enclosed in the appropriate comment syntax for the
|
||||||
identifying information. (Don’t include the brackets!) The text should be
|
file format. We also recommend that a file or class name and description of purpose be
|
||||||
enclosed in the appropriate comment syntax for the file format. We also
|
included on the same “printed page” as the copyright notice for easier identification within
|
||||||
recommend that a file or class name and description of purpose be included on
|
|
||||||
the same “printed page” as the copyright notice for easier identification within
|
|
||||||
third-party archives.
|
third-party archives.
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
Licensed under the Standards Software License, version 1.0, terms and conditions
|
Licensed under the License terms and conditions for use, reproduction, and distribution of
|
||||||
(the “License”); you may not use this file except in compliance with the
|
OPENAIR 5G software (the “License”);
|
||||||
License. You may obtain a copy of the License at [URL link]
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software distributed
|
you may not use this file except in compliance with the License. You may obtain a copy of
|
||||||
under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR
|
the License at
|
||||||
CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
|
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.
|
||||||
|
|
||||||
See the License for the specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
|
|||||||
@@ -1,201 +0,0 @@
|
|||||||
Valid-License-Identifier: OAI-PL-v1.1
|
|
||||||
URL: https://openairinterface.org/oai-public-license-v1-1/
|
|
||||||
Usage-Guide:
|
|
||||||
To use the OAI-PL-v1.1 License put the following text in the header
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
OAI Public License (Version 1.1)
|
|
||||||
|
|
||||||
LICENSE TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION OF OPENAIR 5G SOFTWARE.
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
“License” shall mean the terms and conditions for use, reproduction, and distribution set forth
|
|
||||||
in this document.
|
|
||||||
|
|
||||||
“Licensor” shall mean the OpenAirInterface Software Alliance.
|
|
||||||
|
|
||||||
“Legal Entity” shall mean the union, at the time an acting entity joins the Alliance, of the
|
|
||||||
acting entity and all other entities that control, are controlled by, or are under common control
|
|
||||||
with that entity. For the purposes of this definition, “control” means (i) the power, direct or
|
|
||||||
indirect, to cause the direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii)
|
|
||||||
beneficial ownership of such entity.
|
|
||||||
|
|
||||||
“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by
|
|
||||||
this License.
|
|
||||||
|
|
||||||
“Source” form shall mean the preferred form for making modifications, including but not
|
|
||||||
limited to software source code, documentation source, and configuration files.
|
|
||||||
|
|
||||||
“Object” form shall mean any form resulting from mechanical transformation or translation of
|
|
||||||
a Source form, including but not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
“OpenAirInterface Software Alliance” shall mean the endowment fund established at the
|
|
||||||
initiative of Eurecom, an educational and research establishment located at Campus Sophia
|
|
||||||
Tech, 450 Route des Chappes, 06410 Biot, France, which statutes were signed on 18
|
|
||||||
November 2014.
|
|
||||||
|
|
||||||
“Work” shall mean the work of authorship, whether in Source or Object form, made available
|
|
||||||
under the License, as indicated by a copyright notice that is included in or attached to the
|
|
||||||
work (an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
“Derivative Works” shall mean any work, whether in Source or Object form, that is based on
|
|
||||||
(or derived from) the Work and for which the editorial revisions, annotations, elaborations, or
|
|
||||||
other modifications represent, as a whole, an original work of authorship. For the purposes of
|
|
||||||
this License, Derivative Works shall not include works that remain separable from, or merely
|
|
||||||
link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
“Contribution” shall mean any work of authorship that is intentionally submitted to Licensor
|
|
||||||
for inclusion in the Work by the copyright owner or by an individual or Legal Entity
|
|
||||||
authorized to submit on behalf of the copyright owner. For the purposes of this definition,
|
|
||||||
“submitted” means any form of electronic, , or written communication sent to the Licensor or
|
|
||||||
its representatives, including but not limited to communication on electronic mailing lists,
|
|
||||||
source code control systems, and issue tracking systems that are managed by, or on behalf of,
|
|
||||||
the Licensor for the purpose of discussing and improving the Work
|
|
||||||
|
|
||||||
“Contributor License Agreement” shall mean the agreement signed by any Contributor setting
|
|
||||||
forth the terms and conditions applicable to its Contribution.
|
|
||||||
|
|
||||||
“Contributor” shall mean any individual or Legal Entity on behalf of whom a Contribution
|
|
||||||
has been received by Licensor and subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License.
|
|
||||||
Subject to the terms and conditions of this License, Licensor and each Contributor hereby
|
|
||||||
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of, publicly display, publicly
|
|
||||||
perform, and distribute the Work and such Derivative Works in Source or Object form
|
|
||||||
|
|
||||||
3. Grant of Patent License.
|
|
||||||
|
|
||||||
3.1 Grant of Patent License for study, testing and research purposes:
|
|
||||||
Subject to the terms and conditions of this License, Licensor and each Contributor hereby
|
|
||||||
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made, use, and otherwise
|
|
||||||
transfer (excluding selling) the Work, solely for study, testing and research purposes, where
|
|
||||||
such license applies only to those patent claims licensable by Licensor or such Contributor
|
|
||||||
that are necessarily infringed respectively by the Work and/or the said Contributor
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s) with the Work to which
|
|
||||||
such Contribution(s) was submitted (“Essential Patents”).
|
|
||||||
|
|
||||||
3.2 Grant of Patent License for purposes other than study and research:
|
|
||||||
For purposes other than study, testing and research, and subject to the terms and conditions of
|
|
||||||
this License, You commit to be prepared to negotiate a non-exclusive, non-transferable, non-
|
|
||||||
assignable license of Essential Patents with each Contributor and/or the Licensor on Fair,
|
|
||||||
Reasonable and Non-Discriminatory (“FRAND”) terms and conditions for the use of the
|
|
||||||
Work or Contribution(s) incorporated within the Work.
|
|
||||||
Licensor and/or each Contributor, by submitting a Contribution, will identify any of its known
|
|
||||||
Essential Patent it owns related to the Work and/or its Contribution.
|
|
||||||
|
|
||||||
3.3 Patent Litigation
|
|
||||||
If You institute patent litigation against any entity making use of the Work solely for study,
|
|
||||||
testing and research purposes (including a cross-claim or counterclaim in a lawsuit) alleging
|
|
||||||
that the Work or a Contribution incorporated within the Work constitutes direct or
|
|
||||||
contributory patent infringement, then the patent licenses granted to You under section 3.1 of
|
|
||||||
this License for that Work shall terminate as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Sublicensing
|
|
||||||
You may grant sublicenses under the licenses granted under sections 2 and 3.1 provided that
|
|
||||||
the sublicense is subject to and inclusive of all the terms of and rights under this License to
|
|
||||||
which the Work is or was distributed by the OpenAirInterface Software Alliance.
|
|
||||||
|
|
||||||
5. Redistribution
|
|
||||||
Subject to terms and conditions set forth in sections 2 and 3, You may reproduce and
|
|
||||||
distribute copies of the Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You meet the following
|
|
||||||
conditions:
|
|
||||||
|
|
||||||
1. You must give any other recipients of the Work or Derivative Works a copy of this
|
|
||||||
License; and
|
|
||||||
|
|
||||||
2. You must cause any modified files by You to carry prominent notices stating that You
|
|
||||||
changed the files; and
|
|
||||||
|
|
||||||
3. You must retain, in the Source form of any Derivative Works that You distribute, all
|
|
||||||
copyright, patent, trademark, and attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of the Derivative Works; and
|
|
||||||
|
|
||||||
4. If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative
|
|
||||||
Works that You distribute must include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not pertain to any part of the
|
|
||||||
Derivative Works, in at least one of the following places: within a NOTICE text file
|
|
||||||
distributed as part of the Derivative Works; within the Source form or documentation, if
|
|
||||||
provided along with the Derivative Works; or, within a display generated by the Derivative
|
|
||||||
Works, if and wherever such third-party notices normally appear. The contents of the
|
|
||||||
NOTICE file are for informational purposes only and do not modify the License. You may
|
|
||||||
add Your own attribution notices within Derivative Works that You distribute, alongside or as
|
|
||||||
an addendum to the NOTICE text from the Work, provided that such additional attribution
|
|
||||||
notices cannot be construed as modifying the License.
|
|
||||||
You may add Your own copyright statement to Your modifications and may provide
|
|
||||||
additional or different license terms and conditions for use, reproduction, or distribution of
|
|
||||||
Your modifications, or for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with the conditions stated in
|
|
||||||
this License.
|
|
||||||
|
|
||||||
6. Submission of Contributions.
|
|
||||||
Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be
|
|
||||||
under the terms and conditions of this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify the terms of any
|
|
||||||
separate license agreement such as the Contributor License Agreement You may have
|
|
||||||
executed with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
7. Trademarks.
|
|
||||||
This License does not grant permission to use the trade names, trademarks, service marks, or
|
|
||||||
product names of the Licensor, except as required for reasonable and customary use in
|
|
||||||
describing the origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
8. Disclaimer of Warranty.
|
|
||||||
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and
|
|
||||||
each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT
|
|
||||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including,
|
|
||||||
without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
|
|
||||||
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
|
|
||||||
responsible for determining the appropriateness of using or redistributing the Work and
|
|
||||||
assume any risks associated with your exercise of permissions under this License.
|
|
||||||
|
|
||||||
9. Limitation of Liability.
|
|
||||||
In no event and under no legal theory, whether in tort (including negligence), contract, or
|
|
||||||
otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or
|
|
||||||
agreed to in writing, shall Licensor and any Contributor, as such, be liable to You for
|
|
||||||
damages, including any direct, indirect, special, incidental, or consequential damages of any
|
|
||||||
character arising as a result of this License or out of Your use or inability to use the Work
|
|
||||||
(including but not limited to damages for loss of goodwill, work stoppage, computer failure or
|
|
||||||
malfunction, or any and all other commercial damages or losses), even if such Contributor has
|
|
||||||
been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
10. Accepting Warranty or Additional Liability.
|
|
||||||
While redistributing the Work or Derivative Works thereof, You may choose to offer, and
|
|
||||||
charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations
|
|
||||||
and/or rights consistent with this License. However, in accepting such obligations, You may
|
|
||||||
act only on Your own behalf and on Your sole responsibility, not on behalf of any other
|
|
||||||
Contributor and/or the Licensor, and only if You agree to indemnify, defend, and hold each
|
|
||||||
Contributor and/or the Licensor harmless for any liability incurred by, or claims asserted
|
|
||||||
against, such Contributor and/or Licensor by reason of Your accepting any such warranty or
|
|
||||||
additional liability.
|
|
||||||
|
|
||||||
11. Applicable law.
|
|
||||||
The present license shall be governed by the laws of France.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
Valid-License-Identifier: Apache-2.0
|
|
||||||
SPDX-URL: https://spdx.org/licenses/Apache-2.0.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use the Apache License version 2.0 put the following SPDX tag/value
|
|
||||||
pair into a comment according to the placement guidelines in the
|
|
||||||
licensing rules documentation:
|
|
||||||
SPDX-License-Identifier: Apache-2.0
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
Apache License
|
|
||||||
|
|
||||||
Version 2.0, January 2004
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction, and
|
|
||||||
distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by the
|
|
||||||
copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all other
|
|
||||||
entities that control, are controlled by, or are under common control with
|
|
||||||
that entity. For the purposes of this definition, "control" means (i) the
|
|
||||||
power, direct or indirect, to cause the direction or management of such
|
|
||||||
entity, whether by contract or otherwise, or (ii) ownership of fifty
|
|
||||||
percent (50%) or more of the outstanding shares, or (iii) beneficial
|
|
||||||
ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity exercising
|
|
||||||
permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation source,
|
|
||||||
and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical transformation
|
|
||||||
or translation of a Source form, including but not limited to compiled
|
|
||||||
object code, generated documentation, and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or Object form,
|
|
||||||
made available under the License, as indicated by a copyright notice that
|
|
||||||
is included in or attached to the work (an example is provided in the
|
|
||||||
Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object form,
|
|
||||||
that is based on (or derived from) the Work and for which the editorial
|
|
||||||
revisions, annotations, elaborations, or other modifications represent, as
|
|
||||||
a whole, an original work of authorship. For the purposes of this License,
|
|
||||||
Derivative Works shall not include works that remain separable from, or
|
|
||||||
merely link (or bind by name) to the interfaces of, the Work and Derivative
|
|
||||||
Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including the original
|
|
||||||
version of the Work and any modifications or additions to that Work or
|
|
||||||
Derivative Works thereof, that is intentionally submitted to Licensor for
|
|
||||||
inclusion in the Work by the copyright owner or by an individual or Legal
|
|
||||||
Entity authorized to submit on behalf of the copyright owner. For the
|
|
||||||
purposes of this definition, "submitted" means any form of electronic,
|
|
||||||
verbal, or written communication sent to the Licensor or its
|
|
||||||
representatives, including but not limited to communication on electronic
|
|
||||||
mailing lists, source code control systems, and issue tracking systems that
|
|
||||||
are managed by, or on behalf of, the Licensor for the purpose of discussing
|
|
||||||
and improving the Work, but excluding communication that is conspicuously
|
|
||||||
marked or otherwise designated in writing by the copyright owner as "Not a
|
|
||||||
Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity on
|
|
||||||
behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of this
|
|
||||||
License, each Contributor hereby grants to You a perpetual, worldwide,
|
|
||||||
non-exclusive, no-charge, royalty-free, irrevocable copyright license to
|
|
||||||
reproduce, prepare Derivative Works of, publicly display, publicly
|
|
||||||
perform, sublicense, and distribute the Work and such Derivative Works
|
|
||||||
in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of this
|
|
||||||
License, each Contributor hereby grants to You a perpetual, worldwide,
|
|
||||||
non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
|
|
||||||
this section) patent license to make, have made, use, offer to sell,
|
|
||||||
sell, import, and otherwise transfer the Work, where such license
|
|
||||||
applies only to those patent claims licensable by such Contributor that
|
|
||||||
are necessarily infringed by their Contribution(s) alone or by
|
|
||||||
combination of their Contribution(s) with the Work to which such
|
|
||||||
Contribution(s) was submitted. If You institute patent litigation
|
|
||||||
against any entity (including a cross-claim or counterclaim in a
|
|
||||||
lawsuit) alleging that the Work or a Contribution incorporated within
|
|
||||||
the Work constitutes direct or contributory patent infringement, then
|
|
||||||
any patent licenses granted to You under this License for that Work
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the Work or
|
|
||||||
Derivative Works thereof in any medium, with or without modifications,
|
|
||||||
and in Source or Object form, provided that You meet the following
|
|
||||||
conditions:
|
|
||||||
|
|
||||||
a. You must give any other recipients of the Work or Derivative Works a
|
|
||||||
copy of this License; and
|
|
||||||
|
|
||||||
b. You must cause any modified files to carry prominent notices stating
|
|
||||||
that You changed the files; and
|
|
||||||
|
|
||||||
c. You must retain, in the Source form of any Derivative Works that You
|
|
||||||
distribute, all copyright, patent, trademark, and attribution notices
|
|
||||||
from the Source form of the Work, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works; and
|
|
||||||
|
|
||||||
d. If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained within
|
|
||||||
such NOTICE file, excluding those notices that do not pertain to any
|
|
||||||
part of the Derivative Works, in at least one of the following
|
|
||||||
places: within a NOTICE text file distributed as part of the
|
|
||||||
Derivative Works; within the Source form or documentation, if
|
|
||||||
provided along with the Derivative Works; or, within a display
|
|
||||||
generated by the Derivative Works, if and wherever such third-party
|
|
||||||
notices normally appear. The contents of the NOTICE file are for
|
|
||||||
informational purposes only and do not modify the License. You may
|
|
||||||
add Your own attribution notices within Derivative Works that You
|
|
||||||
distribute, alongside or as an addendum to the NOTICE text from the
|
|
||||||
Work, provided that such additional attribution notices cannot be
|
|
||||||
construed as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and may
|
|
||||||
provide additional or different license terms and conditions for use,
|
|
||||||
reproduction, or distribution of Your modifications, or for any such
|
|
||||||
Derivative Works as a whole, provided Your use, reproduction, and
|
|
||||||
distribution of the Work otherwise complies with the conditions stated
|
|
||||||
in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise, any
|
|
||||||
Contribution intentionally submitted for inclusion in the Work by You to
|
|
||||||
the Licensor shall be under the terms and conditions of this License,
|
|
||||||
without any additional terms or conditions. Notwithstanding the above,
|
|
||||||
nothing herein shall supersede or modify the terms of any separate
|
|
||||||
license agreement you may have executed with Licensor regarding such
|
|
||||||
Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or agreed to
|
|
||||||
in writing, Licensor provides the Work (and each Contributor provides
|
|
||||||
its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
|
|
||||||
OF ANY KIND, either express or implied, including, without limitation,
|
|
||||||
any warranties or conditions of TITLE, NON-INFRINGEMENT,
|
|
||||||
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
|
|
||||||
responsible for determining the appropriateness of using or
|
|
||||||
redistributing the Work and assume any risks associated with Your
|
|
||||||
exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory, whether
|
|
||||||
in tort (including negligence), contract, or otherwise, unless required
|
|
||||||
by applicable law (such as deliberate and grossly negligent acts) or
|
|
||||||
agreed to in writing, shall any Contributor be liable to You for
|
|
||||||
damages, including any direct, indirect, special, incidental, or
|
|
||||||
consequential damages of any character arising as a result of this
|
|
||||||
License or out of the use or inability to use the Work (including but
|
|
||||||
not limited to damages for loss of goodwill, work stoppage, computer
|
|
||||||
failure or malfunction, or any and all other commercial damages or
|
|
||||||
losses), even if such Contributor has been advised of the possibility of
|
|
||||||
such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing the
|
|
||||||
Work or Derivative Works thereof, You may choose to offer, and charge a
|
|
||||||
fee for, acceptance of support, warranty, indemnity, or other liability
|
|
||||||
obligations and/or rights consistent with this License. However, in
|
|
||||||
accepting such obligations, You may act only on Your own behalf and on
|
|
||||||
Your sole responsibility, not on behalf of any other Contributor, and
|
|
||||||
only if You agree to indemnify, defend, and hold each Contributor
|
|
||||||
harmless for any liability incurred by, or claims asserted against, such
|
|
||||||
Contributor by reason of your accepting any such warranty or additional
|
|
||||||
liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
Valid-License-Identifier: BSD-2-Clause
|
|
||||||
SPDX-URL: https://spdx.org/licenses/BSD-2-Clause.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use the BSD 2-clause "Simplified" License put the following SPDX
|
|
||||||
tag/value pair into a comment according to the placement guidelines in
|
|
||||||
the licensing rules documentation:
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
Valid-License-Identifier: BSD-3-Clause
|
|
||||||
SPDX-URL: https://spdx.org/licenses/BSD-3-Clause.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use the BSD 3-clause "New" or "Revised" License put the following SPDX
|
|
||||||
tag/value pair into a comment according to the placement guidelines in
|
|
||||||
the licensing rules documentation:
|
|
||||||
SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation and/or
|
|
||||||
other materials provided with the distribution.
|
|
||||||
|
|
||||||
3. Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
may be used to endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
@@ -1,404 +0,0 @@
|
|||||||
Valid-License-Identifier: CC-BY-4.0
|
|
||||||
SPDX-URL: https://spdx.org/licenses/CC-BY-4.0.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use the CC-BY-4.0 License put the following SPDX tag/value pair into a
|
|
||||||
comment according to the placement guidelines in the licensing rules
|
|
||||||
documentation:
|
|
||||||
SPDX-License-Identifier: CC-BY-4.0
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
Attribution 4.0 International
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
|
||||||
does not provide legal services or legal advice. Distribution of
|
|
||||||
Creative Commons public licenses does not create a lawyer-client or
|
|
||||||
other relationship. Creative Commons makes its licenses and related
|
|
||||||
information available on an "as-is" basis. Creative Commons gives no
|
|
||||||
warranties regarding its licenses, any material licensed under their
|
|
||||||
terms and conditions, or any related information. Creative Commons
|
|
||||||
disclaims all liability for damages resulting from their use to the
|
|
||||||
fullest extent possible.
|
|
||||||
|
|
||||||
Using Creative Commons Public Licenses
|
|
||||||
|
|
||||||
Creative Commons public licenses provide a standard set of terms and
|
|
||||||
conditions that creators and other rights holders may use to share
|
|
||||||
original works of authorship and other material subject to copyright
|
|
||||||
and certain other rights specified in the public license below. The
|
|
||||||
following considerations are for informational purposes only, are not
|
|
||||||
exhaustive, and do not form part of our licenses.
|
|
||||||
|
|
||||||
Considerations for licensors: Our public licenses are
|
|
||||||
intended for use by those authorized to give the public
|
|
||||||
permission to use material in ways otherwise restricted by
|
|
||||||
copyright and certain other rights. Our licenses are
|
|
||||||
irrevocable. Licensors should read and understand the terms
|
|
||||||
and conditions of the license they choose before applying it.
|
|
||||||
Licensors should also secure all rights necessary before
|
|
||||||
applying our licenses so that the public can reuse the
|
|
||||||
material as expected. Licensors should clearly mark any
|
|
||||||
material not subject to the license. This includes other CC-
|
|
||||||
licensed material, or material used under an exception or
|
|
||||||
limitation to copyright. More considerations for licensors:
|
|
||||||
wiki.creativecommons.org/Considerations_for_licensors
|
|
||||||
|
|
||||||
Considerations for the public: By using one of our public
|
|
||||||
licenses, a licensor grants the public permission to use the
|
|
||||||
licensed material under specified terms and conditions. If
|
|
||||||
the licensor's permission is not necessary for any reason--for
|
|
||||||
example, because of any applicable exception or limitation to
|
|
||||||
copyright--then that use is not regulated by the license. Our
|
|
||||||
licenses grant only permissions under copyright and certain
|
|
||||||
other rights that a licensor has authority to grant. Use of
|
|
||||||
the licensed material may still be restricted for other
|
|
||||||
reasons, including because others have copyright or other
|
|
||||||
rights in the material. A licensor may make special requests,
|
|
||||||
such as asking that all changes be marked or described.
|
|
||||||
Although not required by our licenses, you are encouraged to
|
|
||||||
respect those requests where reasonable. More considerations
|
|
||||||
for the public:
|
|
||||||
wiki.creativecommons.org/Considerations_for_licensees
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Creative Commons Attribution 4.0 International Public License
|
|
||||||
|
|
||||||
By exercising the Licensed Rights (defined below), You accept and agree
|
|
||||||
to be bound by the terms and conditions of this Creative Commons
|
|
||||||
Attribution 4.0 International Public License ("Public License"). To the
|
|
||||||
extent this Public License may be interpreted as a contract, You are
|
|
||||||
granted the Licensed Rights in consideration of Your acceptance of
|
|
||||||
these terms and conditions, and the Licensor grants You such rights in
|
|
||||||
consideration of benefits the Licensor receives from making the
|
|
||||||
Licensed Material available under these terms and conditions.
|
|
||||||
|
|
||||||
|
|
||||||
Section 1 -- Definitions.
|
|
||||||
|
|
||||||
a. Adapted Material means material subject to Copyright and Similar
|
|
||||||
Rights that is derived from or based upon the Licensed Material
|
|
||||||
and in which the Licensed Material is translated, altered,
|
|
||||||
arranged, transformed, or otherwise modified in a manner requiring
|
|
||||||
permission under the Copyright and Similar Rights held by the
|
|
||||||
Licensor. For purposes of this Public License, where the Licensed
|
|
||||||
Material is a musical work, performance, or sound recording,
|
|
||||||
Adapted Material is always produced where the Licensed Material is
|
|
||||||
synched in timed relation with a moving image.
|
|
||||||
|
|
||||||
b. Adapter's License means the license You apply to Your Copyright
|
|
||||||
and Similar Rights in Your contributions to Adapted Material in
|
|
||||||
accordance with the terms and conditions of this Public License.
|
|
||||||
|
|
||||||
c. Copyright and Similar Rights means copyright and/or similar rights
|
|
||||||
closely related to copyright including, without limitation,
|
|
||||||
performance, broadcast, sound recording, and Sui Generis Database
|
|
||||||
Rights, without regard to how the rights are labeled or
|
|
||||||
categorized. For purposes of this Public License, the rights
|
|
||||||
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
|
||||||
Rights.
|
|
||||||
|
|
||||||
d. Effective Technological Measures means those measures that, in the
|
|
||||||
absence of proper authority, may not be circumvented under laws
|
|
||||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
|
||||||
Treaty adopted on December 20, 1996, and/or similar international
|
|
||||||
agreements.
|
|
||||||
|
|
||||||
e. Exceptions and Limitations means fair use, fair dealing, and/or
|
|
||||||
any other exception or limitation to Copyright and Similar Rights
|
|
||||||
that applies to Your use of the Licensed Material.
|
|
||||||
|
|
||||||
f. Licensed Material means the artistic or literary work, database,
|
|
||||||
or other material to which the Licensor applied this Public
|
|
||||||
License.
|
|
||||||
|
|
||||||
g. Licensed Rights means the rights granted to You subject to the
|
|
||||||
terms and conditions of this Public License, which are limited to
|
|
||||||
all Copyright and Similar Rights that apply to Your use of the
|
|
||||||
Licensed Material and that the Licensor has authority to license.
|
|
||||||
|
|
||||||
h. Licensor means the individual(s) or entity(ies) granting rights
|
|
||||||
under this Public License.
|
|
||||||
|
|
||||||
i. Share means to provide material to the public by any means or
|
|
||||||
process that requires permission under the Licensed Rights, such
|
|
||||||
as reproduction, public display, public performance, distribution,
|
|
||||||
dissemination, communication, or importation, and to make material
|
|
||||||
available to the public including in ways that members of the
|
|
||||||
public may access the material from a place and at a time
|
|
||||||
individually chosen by them.
|
|
||||||
|
|
||||||
j. Sui Generis Database Rights means rights other than copyright
|
|
||||||
resulting from Directive 96/9/EC of the European Parliament and of
|
|
||||||
the Council of 11 March 1996 on the legal protection of databases,
|
|
||||||
as amended and/or succeeded, as well as other essentially
|
|
||||||
equivalent rights anywhere in the world.
|
|
||||||
|
|
||||||
k. You means the individual or entity exercising the Licensed Rights
|
|
||||||
under this Public License. Your has a corresponding meaning.
|
|
||||||
|
|
||||||
|
|
||||||
Section 2 -- Scope.
|
|
||||||
|
|
||||||
a. License grant.
|
|
||||||
|
|
||||||
1. Subject to the terms and conditions of this Public License,
|
|
||||||
the Licensor hereby grants You a worldwide, royalty-free,
|
|
||||||
non-sublicensable, non-exclusive, irrevocable license to
|
|
||||||
exercise the Licensed Rights in the Licensed Material to:
|
|
||||||
|
|
||||||
a. reproduce and Share the Licensed Material, in whole or
|
|
||||||
in part; and
|
|
||||||
|
|
||||||
b. produce, reproduce, and Share Adapted Material.
|
|
||||||
|
|
||||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
|
||||||
Exceptions and Limitations apply to Your use, this Public
|
|
||||||
License does not apply, and You do not need to comply with
|
|
||||||
its terms and conditions.
|
|
||||||
|
|
||||||
3. Term. The term of this Public License is specified in Section
|
|
||||||
6(a).
|
|
||||||
|
|
||||||
4. Media and formats; technical modifications allowed. The
|
|
||||||
Licensor authorizes You to exercise the Licensed Rights in
|
|
||||||
all media and formats whether now known or hereafter created,
|
|
||||||
and to make technical modifications necessary to do so. The
|
|
||||||
Licensor waives and/or agrees not to assert any right or
|
|
||||||
authority to forbid You from making technical modifications
|
|
||||||
necessary to exercise the Licensed Rights, including
|
|
||||||
technical modifications necessary to circumvent Effective
|
|
||||||
Technological Measures. For purposes of this Public License,
|
|
||||||
simply making modifications authorized by this Section 2(a)
|
|
||||||
(4) never produces Adapted Material.
|
|
||||||
|
|
||||||
5. Downstream recipients.
|
|
||||||
|
|
||||||
a. Offer from the Licensor -- Licensed Material. Every
|
|
||||||
recipient of the Licensed Material automatically
|
|
||||||
receives an offer from the Licensor to exercise the
|
|
||||||
Licensed Rights under the terms and conditions of this
|
|
||||||
Public License.
|
|
||||||
|
|
||||||
b. No downstream restrictions. You may not offer or impose
|
|
||||||
any additional or different terms or conditions on, or
|
|
||||||
apply any Effective Technological Measures to, the
|
|
||||||
Licensed Material if doing so restricts exercise of the
|
|
||||||
Licensed Rights by any recipient of the Licensed
|
|
||||||
Material.
|
|
||||||
|
|
||||||
6. No endorsement. Nothing in this Public License constitutes or
|
|
||||||
may be construed as permission to assert or imply that You
|
|
||||||
are, or that Your use of the Licensed Material is, connected
|
|
||||||
with, or sponsored, endorsed, or granted official status by,
|
|
||||||
the Licensor or others designated to receive attribution as
|
|
||||||
provided in Section 3(a)(1)(A)(i).
|
|
||||||
|
|
||||||
b. Other rights.
|
|
||||||
|
|
||||||
1. Moral rights, such as the right of integrity, are not
|
|
||||||
licensed under this Public License, nor are publicity,
|
|
||||||
privacy, and/or other similar personality rights; however, to
|
|
||||||
the extent possible, the Licensor waives and/or agrees not to
|
|
||||||
assert any such rights held by the Licensor to the limited
|
|
||||||
extent necessary to allow You to exercise the Licensed
|
|
||||||
Rights, but not otherwise.
|
|
||||||
|
|
||||||
2. Patent and trademark rights are not licensed under this
|
|
||||||
Public License.
|
|
||||||
|
|
||||||
3. To the extent possible, the Licensor waives any right to
|
|
||||||
collect royalties from You for the exercise of the Licensed
|
|
||||||
Rights, whether directly or through a collecting society
|
|
||||||
under any voluntary or waivable statutory or compulsory
|
|
||||||
licensing scheme. In all other cases the Licensor expressly
|
|
||||||
reserves any right to collect such royalties.
|
|
||||||
|
|
||||||
|
|
||||||
Section 3 -- License Conditions.
|
|
||||||
|
|
||||||
Your exercise of the Licensed Rights is expressly made subject to the
|
|
||||||
following conditions.
|
|
||||||
|
|
||||||
a. Attribution.
|
|
||||||
|
|
||||||
1. If You Share the Licensed Material (including in modified
|
|
||||||
form), You must:
|
|
||||||
|
|
||||||
a. retain the following if it is supplied by the Licensor
|
|
||||||
with the Licensed Material:
|
|
||||||
|
|
||||||
i. identification of the creator(s) of the Licensed
|
|
||||||
Material and any others designated to receive
|
|
||||||
attribution, in any reasonable manner requested by
|
|
||||||
the Licensor (including by pseudonym if
|
|
||||||
designated);
|
|
||||||
|
|
||||||
ii. a copyright notice;
|
|
||||||
|
|
||||||
iii. a notice that refers to this Public License;
|
|
||||||
|
|
||||||
iv. a notice that refers to the disclaimer of
|
|
||||||
warranties;
|
|
||||||
|
|
||||||
v. a URI or hyperlink to the Licensed Material to the
|
|
||||||
extent reasonably practicable;
|
|
||||||
|
|
||||||
b. indicate if You modified the Licensed Material and
|
|
||||||
retain an indication of any previous modifications; and
|
|
||||||
|
|
||||||
c. indicate the Licensed Material is licensed under this
|
|
||||||
Public License, and include the text of, or the URI or
|
|
||||||
hyperlink to, this Public License.
|
|
||||||
|
|
||||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
|
||||||
reasonable manner based on the medium, means, and context in
|
|
||||||
which You Share the Licensed Material. For example, it may be
|
|
||||||
reasonable to satisfy the conditions by providing a URI or
|
|
||||||
hyperlink to a resource that includes the required
|
|
||||||
information.
|
|
||||||
|
|
||||||
3. If requested by the Licensor, You must remove any of the
|
|
||||||
information required by Section 3(a)(1)(A) to the extent
|
|
||||||
reasonably practicable.
|
|
||||||
|
|
||||||
4. If You Share Adapted Material You produce, the Adapter's
|
|
||||||
License You apply must not prevent recipients of the Adapted
|
|
||||||
Material from complying with this Public License.
|
|
||||||
|
|
||||||
|
|
||||||
Section 4 -- Sui Generis Database Rights.
|
|
||||||
|
|
||||||
Where the Licensed Rights include Sui Generis Database Rights that
|
|
||||||
apply to Your use of the Licensed Material:
|
|
||||||
|
|
||||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
|
||||||
to extract, reuse, reproduce, and Share all or a substantial
|
|
||||||
portion of the contents of the database;
|
|
||||||
|
|
||||||
b. if You include all or a substantial portion of the database
|
|
||||||
contents in a database in which You have Sui Generis Database
|
|
||||||
Rights, then the database in which You have Sui Generis Database
|
|
||||||
Rights (but not its individual contents) is Adapted Material; and
|
|
||||||
|
|
||||||
c. You must comply with the conditions in Section 3(a) if You Share
|
|
||||||
all or a substantial portion of the contents of the database.
|
|
||||||
|
|
||||||
For the avoidance of doubt, this Section 4 supplements and does not
|
|
||||||
replace Your obligations under this Public License where the Licensed
|
|
||||||
Rights include other Copyright and Similar Rights.
|
|
||||||
|
|
||||||
|
|
||||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
|
||||||
|
|
||||||
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
|
||||||
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
|
||||||
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
|
||||||
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
|
||||||
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
|
||||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
|
||||||
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
|
||||||
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
|
||||||
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
|
||||||
|
|
||||||
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
|
||||||
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
|
||||||
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
|
||||||
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
|
||||||
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
|
||||||
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
|
||||||
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
|
||||||
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
|
||||||
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
|
||||||
|
|
||||||
c. The disclaimer of warranties and limitation of liability provided
|
|
||||||
above shall be interpreted in a manner that, to the extent
|
|
||||||
possible, most closely approximates an absolute disclaimer and
|
|
||||||
waiver of all liability.
|
|
||||||
|
|
||||||
|
|
||||||
Section 6 -- Term and Termination.
|
|
||||||
|
|
||||||
a. This Public License applies for the term of the Copyright and
|
|
||||||
Similar Rights licensed here. However, if You fail to comply with
|
|
||||||
this Public License, then Your rights under this Public License
|
|
||||||
terminate automatically.
|
|
||||||
|
|
||||||
b. Where Your right to use the Licensed Material has terminated under
|
|
||||||
Section 6(a), it reinstates:
|
|
||||||
|
|
||||||
1. automatically as of the date the violation is cured, provided
|
|
||||||
it is cured within 30 days of Your discovery of the
|
|
||||||
violation; or
|
|
||||||
|
|
||||||
2. upon express reinstatement by the Licensor.
|
|
||||||
|
|
||||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
|
||||||
right the Licensor may have to seek remedies for Your violations
|
|
||||||
of this Public License.
|
|
||||||
|
|
||||||
c. For the avoidance of doubt, the Licensor may also offer the
|
|
||||||
Licensed Material under separate terms or conditions or stop
|
|
||||||
distributing the Licensed Material at any time; however, doing so
|
|
||||||
will not terminate this Public License.
|
|
||||||
|
|
||||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
|
||||||
License.
|
|
||||||
|
|
||||||
|
|
||||||
Section 7 -- Other Terms and Conditions.
|
|
||||||
|
|
||||||
a. The Licensor shall not be bound by any additional or different
|
|
||||||
terms or conditions communicated by You unless expressly agreed.
|
|
||||||
|
|
||||||
b. Any arrangements, understandings, or agreements regarding the
|
|
||||||
Licensed Material not stated herein are separate from and
|
|
||||||
independent of the terms and conditions of this Public License.
|
|
||||||
|
|
||||||
|
|
||||||
Section 8 -- Interpretation.
|
|
||||||
|
|
||||||
a. For the avoidance of doubt, this Public License does not, and
|
|
||||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
|
||||||
conditions on any use of the Licensed Material that could lawfully
|
|
||||||
be made without permission under this Public License.
|
|
||||||
|
|
||||||
b. To the extent possible, if any provision of this Public License is
|
|
||||||
deemed unenforceable, it shall be automatically reformed to the
|
|
||||||
minimum extent necessary to make it enforceable. If the provision
|
|
||||||
cannot be reformed, it shall be severed from this Public License
|
|
||||||
without affecting the enforceability of the remaining terms and
|
|
||||||
conditions.
|
|
||||||
|
|
||||||
c. No term or condition of this Public License will be waived and no
|
|
||||||
failure to comply consented to unless expressly agreed to by the
|
|
||||||
Licensor.
|
|
||||||
|
|
||||||
d. Nothing in this Public License constitutes or may be interpreted
|
|
||||||
as a limitation upon, or waiver of, any privileges and immunities
|
|
||||||
that apply to the Licensor or You, including from the legal
|
|
||||||
processes of any jurisdiction or authority.
|
|
||||||
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Creative Commons is not a party to its public
|
|
||||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
|
||||||
its public licenses to material it publishes and in those instances
|
|
||||||
will be considered the “Licensor.” The text of the Creative Commons
|
|
||||||
public licenses is dedicated to the public domain under the CC0 Public
|
|
||||||
Domain Dedication. Except for the limited purpose of indicating that
|
|
||||||
material is shared under a Creative Commons public license or as
|
|
||||||
otherwise permitted by the Creative Commons policies published at
|
|
||||||
creativecommons.org/policies, Creative Commons does not authorize the
|
|
||||||
use of the trademark "Creative Commons" or any other trademark or logo
|
|
||||||
of Creative Commons without its prior written consent including,
|
|
||||||
without limitation, in connection with any unauthorized modifications
|
|
||||||
to any of its public licenses or any other arrangements,
|
|
||||||
understandings, or agreements concerning use of licensed material. For
|
|
||||||
the avoidance of doubt, this paragraph does not form part of the
|
|
||||||
public licenses.
|
|
||||||
|
|
||||||
Creative Commons may be contacted at creativecommons.org.
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
Collaborative Standards Software License v1.0 (CSSL)
|
|
||||||
|
|
||||||
LICENSE TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION OF
|
|
||||||
OPENAIRINTERFACE. The pdf version of this document can be downloaded from
|
|
||||||
https://openairinterface.org/oai-cssl/.
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
“License” shall mean the terms and conditions for use, reproduction, and
|
|
||||||
distribution set forth in this document.
|
|
||||||
|
|
||||||
“Licensor” shall mean the copyright owner or entity authorized by the copyright
|
|
||||||
owner that is granting the License.
|
|
||||||
|
|
||||||
“Legal Entity” shall mean the union of the acting entity and all other entities
|
|
||||||
that control, are controlled by, or are under common control with that entity.
|
|
||||||
For the purposes of this definition, “control” means (i) the power, direct or
|
|
||||||
indirect, to cause the direction or management of such entity, whether by
|
|
||||||
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
“You” (or “Your”) shall mean an individual or Legal Entity exercising
|
|
||||||
permissions granted by this License.
|
|
||||||
|
|
||||||
“Source” form shall mean the preferred form for making modifications, including
|
|
||||||
but not limited to software source code, documentation source, and configuration
|
|
||||||
files.
|
|
||||||
|
|
||||||
“Object” form shall mean any form resulting from mechanical transformation or
|
|
||||||
translation of a Source form, including but not limited to compiled object code,
|
|
||||||
generated documentation, and conversions to other media types.
|
|
||||||
|
|
||||||
“Work” shall mean the work of authorship, whether in Source or Object form, made
|
|
||||||
available under the License, as indicated by a copyright notice that is included
|
|
||||||
in or attached to the work (an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
“Derivative Works” shall mean any work, whether in Source or Object form, that
|
|
||||||
is based on (or derived from) the Work and for which the editorial revisions,
|
|
||||||
annotations, elaborations, or other modifications represent, as a whole, an
|
|
||||||
original work of authorship. For the purposes of this License, Derivative Works
|
|
||||||
shall not include works that remain separable from, or merely link (or bind by
|
|
||||||
name) to the interfaces of, the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
“Contribution” shall mean any work of authorship that is intentionally submitted
|
|
||||||
to Licensor for inclusion in the Work by the copyright owner or by an individual
|
|
||||||
or Legal Entity authorized to submit on behalf of the copyright owner. For the
|
|
||||||
purposes of this definition, “submitted” means any form of electronic, or
|
|
||||||
written communication sent to the Licensor or its representatives, including but
|
|
||||||
not limited to communication on electronic mailing lists, source code control
|
|
||||||
systems, and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work but excluding
|
|
||||||
communication that is conspicuously marked or otherwise designated in writing by
|
|
||||||
the copyright owner or entity authorized by the copyright owner as "Not a
|
|
||||||
Contribution."
|
|
||||||
|
|
||||||
“Contributor License Agreement” shall mean the agreement signed by any
|
|
||||||
Contributor setting forth the terms and conditions applicable to its
|
|
||||||
Contribution.
|
|
||||||
|
|
||||||
“Contributor” shall mean any individual or Legal Entity on behalf of whom a
|
|
||||||
Contribution has been received by Licensor and subsequently incorporated within
|
|
||||||
the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License.
|
|
||||||
|
|
||||||
Subject to the terms and conditions of this License, Licensor and each
|
|
||||||
Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
||||||
no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
|
|
||||||
Derivative Works of, publicly display, publicly perform, and distribute the Work
|
|
||||||
and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License.
|
|
||||||
|
|
||||||
3.1 Grant of Patent License for study, testing and research purposes:
|
|
||||||
|
|
||||||
Subject to the terms and conditions of this License, Licensor and each
|
|
||||||
Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
||||||
no-charge, royalty-free, irrevocable (except as stated in this section) patent
|
|
||||||
license to make, have made, use, and otherwise transfer (excluding selling) the
|
|
||||||
Work, solely for study, testing and research purposes, where such license
|
|
||||||
applies only to those patent claims licensable by Licensor or such Contributor
|
|
||||||
that are necessarily infringed respectively by the Work and/or the said
|
|
||||||
Contributor Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted (“Essential Patents”).
|
|
||||||
|
|
||||||
3.2 Grant of Patent License for purposes other than study, testing and research:
|
|
||||||
|
|
||||||
For purposes other than study, testing and research, and subject to the terms
|
|
||||||
and conditions of this License, You commit to be prepared to negotiate, in good
|
|
||||||
faith, a non-exclusive, nontransferable, non-assignable license of Essential
|
|
||||||
Patents with each Contributor and/or the Licensor on Fair, Reasonable and
|
|
||||||
Non-Discriminatory (“FRAND”) terms and conditions for the use of the Work or
|
|
||||||
Contribution(s) incorporated within the Work.
|
|
||||||
|
|
||||||
3.3 Patent Litigation
|
|
||||||
|
|
||||||
If You institute patent litigation against any entity making use of the Work
|
|
||||||
solely for study, testing and research purposes (including a cross-claim or
|
|
||||||
counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated
|
|
||||||
within the Work constitutes direct or contributory patent infringement, then the
|
|
||||||
patent licenses granted to You under section 3.1 of this License for that Work
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Sublicensing
|
|
||||||
|
|
||||||
You may grant sublicenses under the licenses granted under sections 2 and 3.1
|
|
||||||
provided that the sublicense is subject to and inclusive of all the terms of and
|
|
||||||
rights under this License to which the Work is or was distributed.
|
|
||||||
|
|
||||||
5. Redistribution
|
|
||||||
|
|
||||||
Subject to terms and conditions set forth in sections 2 and 3, You may reproduce
|
|
||||||
and distribute copies of the Work or Derivative Works thereof in any medium,
|
|
||||||
with or without modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
1. You must give any other recipients of the Work or Derivative Works a copy of
|
|
||||||
this License; and
|
|
||||||
|
|
||||||
2. You must cause any modified files by You to carry prominent notices stating
|
|
||||||
that You changed the files; and
|
|
||||||
|
|
||||||
3. You must retain, in the Source form of any Derivative Works that You
|
|
||||||
distribute, all copyright, patent, trademark, and attribution notices from the
|
|
||||||
Source form of the Work, excluding those notices that do not pertain to any part
|
|
||||||
of the Derivative Works; and
|
|
||||||
|
|
||||||
4. If the Work includes a “NOTICE” text file as part of its distribution, then
|
|
||||||
any Derivative Works that You distribute must include a readable copy of the
|
|
||||||
attribution notices contained within such NOTICE file, excluding those notices
|
|
||||||
that do not pertain to any part of the Derivative Works, in at least one of the
|
|
||||||
following places: within a NOTICE text file distributed as part of the
|
|
||||||
Derivative Works; within the Source form or documentation, if provided along
|
|
||||||
with the Derivative Works; or, within a display generated by the Derivative
|
|
||||||
Works, if and wherever such third-party notices normally appear. The contents of
|
|
||||||
the NOTICE file are for informational purposes only and do not modify the
|
|
||||||
License. You may add Your own attribution notices within Derivative Works that
|
|
||||||
You distribute, alongside or as an addendum to the NOTICE text from the Work,
|
|
||||||
provided that such additional attribution notices cannot be construed as
|
|
||||||
modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and may provide
|
|
||||||
additional or different license terms and conditions for use, reproduction, or
|
|
||||||
distribution of Your modifications, or for any such Derivative Works as a whole,
|
|
||||||
provided Your use, reproduction, and distribution of the Work otherwise complies
|
|
||||||
with the conditions stated in this License.
|
|
||||||
|
|
||||||
6. Submission of Contributions.
|
|
||||||
|
|
||||||
Any contribution intentionally submitted for inclusion in the Work by You to the
|
|
||||||
Licensor shall be under the terms and conditions of this License, without any
|
|
||||||
additional terms or conditions. Notwithstanding the above, nothing herein shall
|
|
||||||
supersede or modify the terms of any separate license agreement such as the
|
|
||||||
Contributor License Agreement You may have executed with Licensor regarding such
|
|
||||||
Contributions.
|
|
||||||
|
|
||||||
7. Trademarks.
|
|
||||||
|
|
||||||
This License does not grant permission to use the trade names, trademarks,
|
|
||||||
service marks, or product names of the Licensor, except as required for
|
|
||||||
reasonable and customary use in describing the origin of the Work and
|
|
||||||
reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
8. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, Licensor provides the
|
|
||||||
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
|
|
||||||
including, without limitation, any warranties or conditions of TITLE,
|
|
||||||
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
|
|
||||||
solely responsible for determining the appropriateness of using or
|
|
||||||
redistributing the Work and assume any risks associated with your exercise of
|
|
||||||
permissions under this License.
|
|
||||||
|
|
||||||
9. Limitation of Liability.
|
|
||||||
|
|
||||||
In no event and under no legal theory, whether in tort (including negligence),
|
|
||||||
contract, or otherwise, unless required by applicable law (such as deliberate
|
|
||||||
and grossly negligent acts) or agreed to in writing, shall Licensor and any
|
|
||||||
Contributor, as such, be liable to You for damages, including any direct,
|
|
||||||
indirect, special, incidental, or consequential damages of any character arising
|
|
||||||
as a result of this License or out of Your use or inability to use the Work
|
|
||||||
(including but not limited to damages for loss of goodwill, work stoppage,
|
|
||||||
computer failure or malfunction, or any and all other commercial damages or
|
|
||||||
losses), even if such Contributor has been advised of the possibility of such
|
|
||||||
damages.
|
|
||||||
|
|
||||||
10. Accepting Warranty or Additional Liability.
|
|
||||||
|
|
||||||
While redistributing the Work or Derivative Works thereof, You may choose to
|
|
||||||
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
|
|
||||||
other liability obligations and/or rights consistent with this License. However,
|
|
||||||
in accepting such obligations, You may act only on Your own behalf and on Your
|
|
||||||
sole responsibility, not on behalf of any other Contributor and/or the Licensor,
|
|
||||||
and only if You agree to indemnify, defend, and hold each Contributor and/or the
|
|
||||||
Licensor harmless for any liability incurred by, or claims asserted against,
|
|
||||||
such Contributor and/or Licensor by reason of Your accepting any such warranty
|
|
||||||
or additional liability obligations.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
1. APPENDIX: How to apply the PRESENT License to your work
|
|
||||||
|
|
||||||
To apply the present License to your work, attach the following boilerplate
|
|
||||||
notice, with the fields enclosed by brackets “[]” replaced with your own
|
|
||||||
identifying information. (Don’t include the brackets!) The text should be
|
|
||||||
enclosed in the appropriate comment syntax for the file format. We also
|
|
||||||
recommend that a file or class name and description of purpose be included on
|
|
||||||
the same “printed page” as the copyright notice for easier identification within
|
|
||||||
third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Standards Software License, version 1.0, terms and conditions
|
|
||||||
(the “License”); you may not use this file except in compliance with the
|
|
||||||
License. You may obtain a copy of the License at [URL link]
|
|
||||||
|
|
||||||
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.
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
Valid-License-Identifier: MIT
|
|
||||||
SPDX-URL: https://spdx.org/licenses/MIT.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use the MIT License put the following SPDX tag/value pair into a
|
|
||||||
comment according to the placement guidelines in the licensing rules
|
|
||||||
documentation:
|
|
||||||
SPDX-License-Identifier: MIT
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
copy of this software and associated documentation files (the "Software"),
|
|
||||||
to deal in the Software without restriction, including without limitation
|
|
||||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
DEALINGS IN THE SOFTWARE.
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
The source code is distributed under Collaborative Standards Software License
|
|
||||||
(CSSL) v1.0. Some files, such as for orchestration, are distributed under MIT
|
|
||||||
license. Documentation is distributed under Creative Commons Attribution 4.0
|
|
||||||
International license. All the files without an explicit copyright header have
|
|
||||||
an implicit "Copyright of OpenAirInterface Authors".
|
|
||||||
|
|
||||||
For more details of the license, refer to the `LICENSES` directory for a list
|
|
||||||
of preferred and exceptionally-applied licenses.
|
|
||||||
|
|
||||||
However, the source code also contains third party software that is
|
|
||||||
acknowledged here for reference.
|
|
||||||
|
|
||||||
Credits for source code https://github.com/mouse07410/asn1c:
|
|
||||||
Github ID mouse07410: BSD-2-Clause License
|
|
||||||
|
|
||||||
Credits for https://github.com/simd-everywhere/simde-no-tests.git:
|
|
||||||
Github ID simd-everywhere: MIT License
|
|
||||||
|
|
||||||
Credits for source code common/utils/collection/queue.h:
|
|
||||||
The Regents of the University of California: BSD 3-Clause Licence
|
|
||||||
|
|
||||||
Credits for source code common/utils/collection/tree.h:
|
|
||||||
Niels Provos provos@citi.umich.edu: BSD 2-Clause Licence
|
|
||||||
|
|
||||||
Credits for openair2/UTIL/OPT/packet-rohc.h:
|
|
||||||
Anders Broman <anders.broman@ericsson.com>: GPL-2.0-or-later
|
|
||||||
|
|
||||||
Credits for openair3/NAS/COMMON/milenage.h
|
|
||||||
Jouni Malinen <j@w1.fi>: BSD 2-Clause License
|
|
||||||
|
|
||||||
Credits for source code at:
|
|
||||||
- openair1/PHY/CODING/crc.h
|
|
||||||
- openair1/PHY/CODING/crcext.h
|
|
||||||
- openair1/PHY/CODING/types.h
|
|
||||||
- openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_aal/nrLDPC_coding_aal.c
|
|
||||||
- openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_aal/nrLDPC_coding_aal.h
|
|
||||||
Intel Corporation SPDX-License-Identifier: BSD-3-Clause Licence
|
|
||||||
|
|
||||||
Credits for source code nFAPI/open-nFAPI:
|
|
||||||
- Most of the files are from CISCO: Apache 2.0 License
|
|
||||||
- FAPI/*: CSSL v1.0
|
|
||||||
- utils/nfapi_hex_parser.c: CSSL v1.0
|
|
||||||
- nfapi/public_inc/nfapi_common_interface.h: CSSL v1.0
|
|
||||||
- nfapi/public_inc/nr_nfapi_p7.h: CSSL v1.0
|
|
||||||
- nfapi/public_inc/fapi_nr_ue_interface.h: CSSL v1.0
|
|
||||||
|
|
||||||
Optional software downloaded on demand/if requested by user:
|
|
||||||
|
|
||||||
Credits for Yang model radio/fhi_72/mplane/yang/models:
|
|
||||||
O-RAN Alliance: BSD 3-Clause License
|
|
||||||
IETF Trust and the persons identified as authors of the code: BSD 2-Clause Licence
|
|
||||||
|
|
||||||
Credits for https://github.com/CESNET/libyang:
|
|
||||||
Czech Educational and Research Network: BSD-3-Clause License
|
|
||||||
|
|
||||||
Credits for https://github.com/CESNET/libnetconf2:
|
|
||||||
Czech Educational and Research Network: BSD-3-Clause License
|
|
||||||
|
|
||||||
Credits for https://github.com/google/googletest used for unit test:
|
|
||||||
Google: BSD 3-Clause License
|
|
||||||
|
|
||||||
Credits for https://github.com/google/benchmark used for unit test:
|
|
||||||
Google: Apache 2.0 License
|
|
||||||
|
|
||||||
Credits for https://github.com/google/sanitizers used for the address sanitizer:
|
|
||||||
Google: Apache 2.0 License
|
|
||||||
|
|
||||||
Credits for https://github.com/krallin/tini used for init in containers:
|
|
||||||
Github ID krallin: MIT License
|
|
||||||
|
|
||||||
Credits for https://github.com/EttusResearch/uhd.git:
|
|
||||||
EttusResearch: GPLv3 License
|
|
||||||
|
|
||||||
Credits for https://github.com/mikefarah/yq used for parsing YAML in Docker images:
|
|
||||||
Github ID mikefarah: MIT License
|
|
||||||
|
|
||||||
Credits for https://github.com/intel/pf-bb-config:
|
|
||||||
Intel: Apache 2.0 License
|
|
||||||
|
|
||||||
Credits for https://github.com/Nuand/bladeRF:
|
|
||||||
Nuand: https://github.com/Nuand/bladeRF/tree/master?tab=License-1-ov-file
|
|
||||||
|
|
||||||
Credits for https://github.com/pothosware/SoapySDR
|
|
||||||
Pothosware: BSL 1.0 License
|
|
||||||
|
|
||||||
Credits for https://github.com/zeromq/libzmq
|
|
||||||
ZeroMQ authors: Mozilla Public License Version 2.0
|
|
||||||
|
|
||||||
Credits for source code:
|
|
||||||
- radio/zmq/zmq_imported.cpp
|
|
||||||
- radio/zmq/zmq_imported.h
|
|
||||||
Software Radio Systems Limited: BSD-3-Clause-Open-MPI
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
The source code of openairinterface5g is distributed under **OAI Public License V1.1**.
|
||||||
|
|
||||||
|
For more details of the license, refer to [LICENSE](LICENSE) file in the same directory.
|
||||||
|
|
||||||
|
However, the source code also contains third party software that is acknowledged here for reference.
|
||||||
|
|
||||||
|
## Credits for source code common/utils/collection/queue.h: ##
|
||||||
|
|
||||||
|
The Regents of the University of California: BSD 3-Clause Licence.
|
||||||
|
|
||||||
|
## Credits for source code common/utils/collection/tree.h: ##
|
||||||
|
|
||||||
|
Niels Provos <provos@citi.umich.edu>: BSD 2-Clause Licence.
|
||||||
|
|
||||||
|
## Credits for source code openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c and nrLDPC_offload.h: ##
|
||||||
|
|
||||||
|
Intel Corporation SPDX-License-Identifier: BSD-3-Clause Licence
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
<h1 align="center">
|
<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>
|
<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>
|
</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-CSSL--v1.0-blue" alt="License"></a>
|
<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/22.04/"><img src="https://img.shields.io/badge/OS-Ubuntu22-Green" alt="Supported OS Ubuntu 22"></a>
|
<a href="https://releases.ubuntu.com/22.04/"><img src="https://img.shields.io/badge/OS-Ubuntu22-Green" alt="Supported OS Ubuntu 22"></a>
|
||||||
<a href="https://releases.ubuntu.com/24.04/"><img src="https://img.shields.io/badge/OS-Ubuntu24-Green" alt="Supported OS Ubuntu 24"></a>
|
<a href="https://releases.ubuntu.com/24.04/"><img src="https://img.shields.io/badge/OS-Ubuntu24-Green" alt="Supported OS Ubuntu 24"></a>
|
||||||
<a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux"><img src="https://img.shields.io/badge/OS-RHEL9-Green" alt="Supported OS RHEL9"></a>
|
<a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux"><img src="https://img.shields.io/badge/OS-RHEL9-Green" alt="Supported OS RHEL9"></a>
|
||||||
<a href="https://getfedora.org/en/workstation/"><img src="https://img.shields.io/badge/OS-Fedore41-Green" alt="Supported OS Fedora 43"></a>
|
<a href="https://getfedora.org/en/workstation/"><img src="https://img.shields.io/badge/OS-Fedore41-Green" alt="Supported OS Fedora 41"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -33,25 +31,13 @@
|
|||||||
# OpenAirInterface License #
|
# OpenAirInterface License #
|
||||||
|
|
||||||
* [OAI License Model](http://www.openairinterface.org/?page_id=101)
|
* [OAI License Model](http://www.openairinterface.org/?page_id=101)
|
||||||
* [CSSL v1.0](http://www.openairinterface.org/?page_id=698)
|
* [OAI License v1.1 on our website](http://www.openairinterface.org/?page_id=698)
|
||||||
|
|
||||||
The source code is distributed under [**CSSL v1.0**](LICENSE).
|
It is distributed under **OAI Public License V1.1**.
|
||||||
Some files, such as for orchestration, are distributed under
|
|
||||||
[MIT license](preferred)(MIT.txt). Documentation is distributed under
|
|
||||||
[Creative Commons Attribution 4.0 International license](LICENSES/preferred/CC-BY-4.0.txt).
|
|
||||||
|
|
||||||
All the files without an explicit copyright header have an implicit "Copyright
|
The license information is distributed under [LICENSE](LICENSE) file in the same directory.
|
||||||
of OpenAirInterface Authors".
|
|
||||||
|
|
||||||
Please see [NOTICE](NOTICE) for other licenses which are used in the software.
|
Please see [NOTICE](NOTICE.md) file for third party software that is included in the sources.
|
||||||
|
|
||||||
In the past OAI source code has been re-licensed sometimes, here is the
|
|
||||||
history:
|
|
||||||
|
|
||||||
1. CSSL v1.0 starting tag 2026.w14
|
|
||||||
2. OAI Public License v1.1 starting tag v1.0 till af4b0d53
|
|
||||||
3. OAI Public License v1.0: starting tag v.04 till v1.0
|
|
||||||
4. GPL 3: starting tag v.0 till v.04 (only initial implementation of 4G)
|
|
||||||
|
|
||||||
# Where to Start #
|
# Where to Start #
|
||||||
|
|
||||||
|
|||||||
Executable
+15
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
||||||
|
echo "Not running as root"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd openair2/E2AP/flexric/
|
||||||
|
rm -rf build && mkdir build && \
|
||||||
|
cd build && cmake -DE2AP_VERSION=E2AP_V2 -DKPM_VERSION=KPM_V2_03 .. && make -j16 && sudo make install
|
||||||
|
|
||||||
|
cd ~/OAI/openairinterface5g/
|
||||||
|
|
||||||
|
cp -r /usr/local/etc/flexric/ flexric/etc/
|
||||||
|
cp -r /usr/local/lib/flexric/ flexric/lib/
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
name: oai-physim
|
name: oai-physim
|
||||||
description: A Helm chart for physical simulators network function
|
description: A Helm chart for physical simulators network function
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
name: oai-physims-4g
|
name: oai-physims-4g
|
||||||
description: A Helm subchart for 4G physims network function
|
description: A Helm subchart for 4G physims network function
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{{/* vim: set filetype=mustache: */}}
|
{{/* vim: set filetype=mustache: */}}
|
||||||
{{/* SPDX-License-Identifier: MIT */}}
|
|
||||||
{{/*
|
{{/*
|
||||||
Expand the name of the chart.
|
Expand the name of the chart.
|
||||||
*/}}
|
*/}}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: batch/v1
|
apiVersion: batch/v1
|
||||||
kind: Job
|
kind: Job
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
# Default values for oai-physims-4g
|
# Default values for oai-physims-4g
|
||||||
# This is a YAML-formatted file.
|
# This is a YAML-formatted file.
|
||||||
# Declare variables to be passed into your templates.
|
# Declare variables to be passed into your templates.
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
kind: Role
|
kind: Role
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ServiceAccount
|
kind: ServiceAccount
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
# Default values for oai-physim.
|
# Default values for oai-physim.
|
||||||
# This is a YAML-formatted file.
|
# This is a YAML-formatted file.
|
||||||
# Declare variables to be passed into your templates.
|
# Declare variables to be passed into your templates.
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
name: oai-physim
|
name: oai-physim
|
||||||
description: A Helm chart for physical simulators network function
|
description: A Helm chart for physical simulators network function
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
name: oai-physims-5g
|
name: oai-physims-5g
|
||||||
description: A Helm subchart for 5G physims network function
|
description: A Helm subchart for 5G physims network function
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{{/* vim: set filetype=mustache: */}}
|
{{/* vim: set filetype=mustache: */}}
|
||||||
{{/* SPDX-License-Identifier: MIT */}}
|
|
||||||
{{/*
|
{{/*
|
||||||
Expand the name of the chart.
|
Expand the name of the chart.
|
||||||
*/}}
|
*/}}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: batch/v1
|
apiVersion: batch/v1
|
||||||
kind: Job
|
kind: Job
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
# Default values for oai-physims-5g
|
# Default values for oai-physims-5g
|
||||||
# This is a YAML-formatted file.
|
# This is a YAML-formatted file.
|
||||||
# Declare variables to be passed into your templates.
|
# Declare variables to be passed into your templates.
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
kind: Role
|
kind: Role
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ServiceAccount
|
kind: ServiceAccount
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
# Default values for oai-physim.
|
# Default values for oai-physim.
|
||||||
# This is a YAML-formatted file.
|
# This is a YAML-formatted file.
|
||||||
# Declare variables to be passed into your templates.
|
# Declare variables to be passed into your templates.
|
||||||
|
|||||||
Vendored
+18
-1
@@ -1,6 +1,23 @@
|
|||||||
#!/bin/groovy
|
#!/bin/groovy
|
||||||
/*
|
/*
|
||||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
def pythonExecutor = params.pythonExecutor
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|||||||
@@ -1,6 +1,23 @@
|
|||||||
#!/bin/groovy
|
#!/bin/groovy
|
||||||
/*
|
/*
|
||||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Location of the executor node
|
// Location of the executor node
|
||||||
@@ -34,7 +51,9 @@ pipeline {
|
|||||||
stage ("Verify Parameters") {
|
stage ("Verify Parameters") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
env.JOB_TIMESTAMP = sh(returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"').trim()
|
JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
|
||||||
|
JOB_TIMESTAMP = JOB_TIMESTAMP.trim()
|
||||||
|
|
||||||
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
def allParametersPresent = true
|
def allParametersPresent = true
|
||||||
|
|
||||||
@@ -110,23 +129,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Local-Repo-Push") {
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
|
|
||||||
triggerSlaveJob ('RAN-Local-Repo-Push', 'Local-Repo-Push')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
echo "Push to local repository KO"
|
|
||||||
failingStages += '\n * RAN-Local-Repo-Push'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Build Stages are Mandatory
|
// Build Stages are Mandatory
|
||||||
stage ("Image Building Processes") {
|
stage ("Image Building Processes") {
|
||||||
when { expression {doBuild} }
|
when { expression {doBuild} }
|
||||||
@@ -219,6 +221,28 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("cppcheck") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-cppcheck', 'cppcheck')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||||
|
// due to parallel-time concurrency
|
||||||
|
cppcheckStatus = finalizeSlaveJob('RAN-cppcheck')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
failingStages += cppcheckStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage ("ARM-Cross-Compile") {
|
stage ("ARM-Cross-Compile") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
@@ -310,29 +334,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Channel-Simulation") {
|
|
||||||
when { expression {do5Gtest || do5GUeTest} }
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
triggerSlaveJob ('RAN-Channel-Simulation', 'Channel-Simulation')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
always {
|
|
||||||
script {
|
|
||||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
|
||||||
// due to parallel-time concurrency
|
|
||||||
channelSimStatus = finalizeSlaveJob('RAN-Channel-Simulation')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
currentBuild.result = 'FAILURE'
|
|
||||||
failingStages += channelSimStatus
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("PhySim-Cluster-4G") {
|
stage ("PhySim-Cluster-4G") {
|
||||||
when { expression {do4Gtest} }
|
when { expression {do4Gtest} }
|
||||||
steps {
|
steps {
|
||||||
@@ -379,29 +380,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("VRT-Sim-Test-5G") {
|
|
||||||
when { expression {do5Gtest || do5GUeTest} }
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
triggerSlaveJob ('RAN-VRT-Sim-Test-5G', 'VRT-Sim-Test-5G')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
always {
|
|
||||||
script {
|
|
||||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
|
||||||
// due to parallel-time concurrency
|
|
||||||
vrtSim5GStatus = finalizeSlaveJob('RAN-VRT-Sim-Test-5G')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
currentBuild.result = 'FAILURE'
|
|
||||||
failingStages += vrtSim5GStatus
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("RF-Sim-Test-5G") {
|
stage ("RF-Sim-Test-5G") {
|
||||||
when { expression {do5Gtest || do5GUeTest} }
|
when { expression {do5Gtest || do5GUeTest} }
|
||||||
steps {
|
steps {
|
||||||
@@ -702,11 +680,11 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("SA-Multi-Antenna-CN5G") {
|
stage ("SA-2x2-Module-CN5G") {
|
||||||
when { expression {do5Gtest} }
|
when { expression {do5Gtest} }
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
triggerSlaveJob ('RAN-SA-Multi-Antenna-CN5G', 'SA-Multi-Antenna-CN5G')
|
triggerSlaveJob ('RAN-SA-2x2-Module-CN5G', 'SA-2x2-Module-CN5G')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
@@ -714,13 +692,13 @@ pipeline {
|
|||||||
script {
|
script {
|
||||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||||
// due to parallel-time concurrency
|
// due to parallel-time concurrency
|
||||||
saMultiAntennaStatus = finalizeSlaveJob('RAN-SA-Multi-Antenna-CN5G')
|
saTDD2x2Status = finalizeSlaveJob('RAN-SA-2x2-Module-CN5G')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
script {
|
script {
|
||||||
currentBuild.result = 'FAILURE'
|
currentBuild.result = 'FAILURE'
|
||||||
failingStages += saMultiAntennaStatus
|
failingStages += saTDD2x2Status
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -771,29 +749,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("SA-AERIAL-OAIUE-CN5G") {
|
|
||||||
when { expression {do5Gtest || do5GUeTest} }
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
triggerSlaveJob ('RAN-SA-AERIAL-OAIUE-CN5G', 'SA-AERIAL-OAIUE-CN5G')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
always {
|
|
||||||
script {
|
|
||||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
|
||||||
// due to parallel-time concurrency
|
|
||||||
saAERIALOAIUEStatus = finalizeSlaveJob('RAN-SA-AERIAL-OAIUE-CN5G')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
currentBuild.result = 'FAILURE'
|
|
||||||
failingStages += saAERIALOAIUEStatus
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("SA-OAIUE-CN5G") {
|
stage ("SA-OAIUE-CN5G") {
|
||||||
when { expression {do5Gtest || do5GUeTest} }
|
when { expression {do5Gtest || do5GUeTest} }
|
||||||
steps {
|
steps {
|
||||||
@@ -848,22 +803,25 @@ pipeline {
|
|||||||
// ---- Slave Job functions
|
// ---- Slave Job functions
|
||||||
|
|
||||||
def triggerSlaveJob (jobName, gitlabStatusName) {
|
def triggerSlaveJob (jobName, gitlabStatusName) {
|
||||||
def MR_NUMBER = "MERGE".equals(env.gitlabActionType) ? env.gitlabMergeRequestIid : 'develop'
|
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
|
||||||
// localStatus variable MUST be analyzed to properly assess the status
|
// localStatus variable MUST be analyzed to properly assess the status
|
||||||
def localStatus = build job: jobName,
|
localStatus = build job: jobName,
|
||||||
parameters: [
|
parameters: [
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
string(name: 'SourceRepo', value: String.valueOf(env.gitlabSourceRepoHttpUrl)),
|
|
||||||
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)),
|
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
|
||||||
def localResult = localStatus.getResult()
|
localResult = localStatus.getResult()
|
||||||
echo "${jobName} Slave Job status is ${localResult}"
|
echo "${jobName} Slave Job status is ${localResult}"
|
||||||
gitlabCommitStatus(name: gitlabStatusName) {
|
gitlabCommitStatus(name: gitlabStatusName) {
|
||||||
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
|
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
|
||||||
@@ -889,11 +847,11 @@ def triggerCN5GSlaveJob (jobName, gitlabStatusName) {
|
|||||||
// 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
|
||||||
// localStatus variable MUST be analyzed to properly assess the status
|
// localStatus variable MUST be analyzed to properly assess the status
|
||||||
def localStatus = build job: jobName,
|
localStatus = build job: jobName,
|
||||||
parameters: [
|
parameters: [
|
||||||
string(name: 'FULL_RAN_TAG', value: String.valueOf(fullRanTag))
|
string(name: 'FULL_RAN_TAG', value: String.valueOf(fullRanTag))
|
||||||
], propagate: false
|
], propagate: false
|
||||||
def localResult = localStatus.getResult()
|
localResult = localStatus.getResult()
|
||||||
echo "${jobName} Slave Job status is ${localResult}"
|
echo "${jobName} Slave Job status is ${localResult}"
|
||||||
gitlabCommitStatus(name: gitlabStatusName) {
|
gitlabCommitStatus(name: gitlabStatusName) {
|
||||||
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
|
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
|
||||||
@@ -904,6 +862,34 @@ def triggerCN5GSlaveJob (jobName, gitlabStatusName) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def triggerSlaveJobNoGitLab (jobName) {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
MR_NUMBER = env.gitlabMergeRequestIid
|
||||||
|
} else {
|
||||||
|
MR_NUMBER = 'develop'
|
||||||
|
}
|
||||||
|
// Workaround for the "cancelled" GitLab pipeline notification
|
||||||
|
// 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
|
||||||
|
// localStatus variable MUST be analyzed to properly assess the status
|
||||||
|
localStatus = build job: jobName,
|
||||||
|
parameters: [
|
||||||
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
||||||
|
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)),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
||||||
|
], propagate: false
|
||||||
|
localResult = localStatus.getResult()
|
||||||
|
echo "${jobName} Slave Job status is ${localResult}"
|
||||||
|
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
|
||||||
|
echo "${jobName} Slave Job is OK"
|
||||||
|
} else {
|
||||||
|
error "${jobName} Slave Job is KO"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def finalizeSlaveJob(jobName) {
|
def finalizeSlaveJob(jobName) {
|
||||||
lock ('Parent-Lock') {
|
lock ('Parent-Lock') {
|
||||||
// In case of any non-success, we are retrieving the HTML report of the last completed
|
// In case of any non-success, we are retrieving the HTML report of the last completed
|
||||||
@@ -919,7 +905,7 @@ def finalizeSlaveJob(jobName) {
|
|||||||
filter: 'test_results*.html',
|
filter: 'test_results*.html',
|
||||||
selector: lastCompleted())
|
selector: lastCompleted())
|
||||||
if (fileExists(fileName)) {
|
if (fileExists(fileName)) {
|
||||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${env.JOB_TIMESTAMP}#' ${fileName}"
|
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}"
|
||||||
} else {
|
} else {
|
||||||
sh "echo \"could not copy results from ${jobName}, please check pipeline ${BUILD_URL}\" > ${fileName}"
|
sh "echo \"could not copy results from ${jobName}, please check pipeline ${BUILD_URL}\" > ${fileName}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,228 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Location of the executor node
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Name of the resource
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
def directoryExistsGlob(fileNameWithGlob) {
|
||||||
|
/* if multiple directories match, will join their names and call fileExists() on that */
|
||||||
|
def dir = sh returnStdout: true, script: 'find . -name \'' + fileNameWithGlob + '\' -type d'
|
||||||
|
dir = dir.replaceAll("\n", "").trim()
|
||||||
|
echo "matching '" + fileNameWithGlob + "' found: '" + dir + "'"
|
||||||
|
if (dir == "")
|
||||||
|
return false
|
||||||
|
return fileExists(dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
// Pipeline start
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
timestamps()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ('Verify Parameters') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
|
||||||
|
JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
|
||||||
|
JOB_TIMESTAMP = JOB_TIMESTAMP.trim()
|
||||||
|
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
echo "no eNB_SourceCodePath given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// the following 4 parameters should be pushed by the master trigger
|
||||||
|
// if not present, take the job GIT variables (used for developing)
|
||||||
|
if (params.eNB_Repository == null) {
|
||||||
|
eNB_Repository = env.GIT_URL
|
||||||
|
} else {
|
||||||
|
eNB_Repository = params.eNB_Repository
|
||||||
|
}
|
||||||
|
echo "eNB_Repository : ${eNB_Repository}"
|
||||||
|
if (params.eNB_Branch == null) {
|
||||||
|
eNB_Branch = env.GIT_BRANCH
|
||||||
|
} else {
|
||||||
|
eNB_Branch = params.eNB_Branch
|
||||||
|
}
|
||||||
|
echo "eNB_Branch : ${eNB_Branch}"
|
||||||
|
if (params.eNB_CommitID == null) {
|
||||||
|
eNB_CommitID = env.GIT_COMMIT
|
||||||
|
} else {
|
||||||
|
eNB_CommitID = params.eNB_CommitID
|
||||||
|
}
|
||||||
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
|
if (params.eNB_mergeRequest != null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_mergeRequest
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
if (params.eNB_TargetBranch != null) {
|
||||||
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
} else {
|
||||||
|
eNB_TargetBranch = 'develop'
|
||||||
|
}
|
||||||
|
echo "eNB_TargetBranch : ${eNB_TargetBranch}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "no eNB_mergeRequest given - not merging develop"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.OC_Credentials == null) {
|
||||||
|
echo "no OC_Credentials given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.OC_ProjectName == null) {
|
||||||
|
echo "no OC_ProjectName given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
echo "no pythonTestXmlFile given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Deploy and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
} else {
|
||||||
|
echo "Test XML file ${xmlFile}: no such file"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
timeout (time: 60, unit: 'MINUTES') {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile} --OCUserName=${OC_Username} --OCPassword=${OC_Password} --OCProjectName=${OC_ProjectName}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Log Collection") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
if (directoryExistsGlob("build_log_*")) {
|
||||||
|
sh "zip -r -qq build_log_${env.BUILD_ID}.zip build_log_*/*"
|
||||||
|
sh "rm -rf build_log_*/"
|
||||||
|
archiveArtifacts artifacts: "build_log_${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if (directoryExistsGlob("test_log_*")) {
|
||||||
|
sh "zip -r -qq test_log_${env.BUILD_ID}.zip test_log_*/*"
|
||||||
|
sh "rm -rf test_log_*/"
|
||||||
|
archiveArtifacts artifacts: "test_log_${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if (fileExists("test_results.html")) {
|
||||||
|
sh "mv test_results.html test_results-${env.JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts artifacts: "test_results-${env.JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,23 @@
|
|||||||
#!/bin/groovy
|
#!/bin/groovy
|
||||||
/*
|
/*
|
||||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
def node = "${params.JenkinsNode}"
|
def node = "${params.JenkinsNode}"
|
||||||
|
|||||||
@@ -0,0 +1,223 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Location of the executor node
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Name of the resource
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
// Flags
|
||||||
|
def scmEvent = false
|
||||||
|
def upstreamEvent = false
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
// Pipeline start
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
timestamps()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ('Verify Parameters') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
|
||||||
|
JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
|
||||||
|
JOB_TIMESTAMP = JOB_TIMESTAMP.trim()
|
||||||
|
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == 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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.OC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.OC_ProjectName == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Deploy and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
} else {
|
||||||
|
echo "Test XML file ${xmlFile}: no such file"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
timeout (time: 60, unit: 'MINUTES') {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile} --OCUserName=${OC_Username} --OCPassword=${OC_Password} --OCProjectName=${OC_ProjectName}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Log Collection") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
// Zipping all archived log files
|
||||||
|
sh "mkdir test_logs"
|
||||||
|
sh "mv *.log* test_logs || true"
|
||||||
|
// Zip all log files matching cmake_targets/{*.log*,log/*} into test_logs_XXXX.zip
|
||||||
|
if (fileExists('../cmake_targets/log')) {
|
||||||
|
sh "mv ../cmake_targets/log/* test_logs || true"
|
||||||
|
}
|
||||||
|
sh "zip -r -qq test_logs_${env.BUILD_ID}.zip *test_log*/"
|
||||||
|
sh "rm -rf *test_log*/"
|
||||||
|
if (fileExists("test_logs_${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts artifacts: "test_logs_${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if (fileExists("test_results.html")) {
|
||||||
|
sh "mv test_results.html test_results-${env.JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts artifacts: "test_results-${env.JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Location of the executor node
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Name of the resource
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
// Flags
|
||||||
|
def scmEvent = false
|
||||||
|
def upstreamEvent = false
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------
|
||||||
|
// Pipeline start
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
timestamps()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ('Verify Parameters') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
|
||||||
|
JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
|
||||||
|
JOB_TIMESTAMP = JOB_TIMESTAMP.trim()
|
||||||
|
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == 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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.OC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.OC_ProjectName == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Deploy and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
} else {
|
||||||
|
echo "Test XML file ${xmlFile}: no such file"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
timeout (time: 60, unit: 'MINUTES') {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile} --OCUserName=${OC_Username} --OCPassword=${OC_Password} --OCProjectName=${OC_ProjectName}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Log Collection") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
// Zipping all archived log files
|
||||||
|
sh "mkdir test_logs"
|
||||||
|
sh "mv *.log* test_logs || true"
|
||||||
|
// Zip all log files matching cmake_targets/{*.log*,log/*} into test_logs_XXXX.zip
|
||||||
|
if (fileExists('../cmake_targets/log')) {
|
||||||
|
sh "mv ../cmake_targets/log/* test_logs || true"
|
||||||
|
}
|
||||||
|
sh "zip -r -qq test_logs_${env.BUILD_ID}.zip *test_log*/"
|
||||||
|
sh "rm -rf *test_log*/"
|
||||||
|
if (fileExists("test_logs_${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts artifacts: "test_logs_${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if (fileExists("test_results.html")) {
|
||||||
|
sh "mv test_results.html test_results-${env.JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts artifacts: "test_results-${env.JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
#!/bin/groovy
|
|
||||||
/*
|
|
||||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Location of the python executor node shall be in the same subnet as the others servers
|
|
||||||
def nodeExecutor = params.nodeExecutor
|
|
||||||
|
|
||||||
// SSH URL of the internal git repository
|
|
||||||
def internalRepoURL = params.internalRepoURL
|
|
||||||
|
|
||||||
// Name of the resource
|
|
||||||
def lockResources = []
|
|
||||||
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
|
||||||
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
|
||||||
|
|
||||||
pipeline {
|
|
||||||
agent {
|
|
||||||
label nodeExecutor
|
|
||||||
}
|
|
||||||
options {
|
|
||||||
ansiColor('xterm')
|
|
||||||
lock(extra: lockResources)
|
|
||||||
}
|
|
||||||
stages {
|
|
||||||
stage('Verify parameters') {
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
def missingParams = []
|
|
||||||
if (!params.SourceRepo?.trim()) { missingParams << 'SourceRepo' }
|
|
||||||
if (!params.eNB_Branch?.trim()) { missingParams << 'eNB_Branch' }
|
|
||||||
if (!params.eNB_CommitID?.trim()) { missingParams << 'eNB_CommitID' }
|
|
||||||
if (!params.eNB_TargetBranch?.trim()) { missingParams << 'eNB_TargetBranch' }
|
|
||||||
if (!params.eNB_Repository?.trim()) { missingParams << 'eNB_Repository' }
|
|
||||||
|
|
||||||
if (missingParams) {
|
|
||||||
error "Missing required parameters: ${missingParams.join(', ')}"
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "Source Repo : ${params.SourceRepo}"
|
|
||||||
echo "Source Branch : ${params.eNB_Branch}"
|
|
||||||
echo "Source Commit : ${params.eNB_CommitID}"
|
|
||||||
echo "Target Branch : ${params.eNB_TargetBranch}"
|
|
||||||
echo "Target Repo : ${params.eNB_Repository}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Prepare workspace') {
|
|
||||||
steps {
|
|
||||||
sh """
|
|
||||||
git config user.email "jenkins@openairinterface.org"
|
|
||||||
git config user.name "OAI Jenkins"
|
|
||||||
git remote remove source || true
|
|
||||||
git remote remove internal-repo || true
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Add source repo & fetch branches') {
|
|
||||||
steps {
|
|
||||||
sh """
|
|
||||||
git remote add source ${params.SourceRepo} || true
|
|
||||||
git fetch source ${params.eNB_Branch}
|
|
||||||
git fetch origin ${params.eNB_TargetBranch}
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Create temporary branch for CI') {
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
def shortCommit = params.eNB_CommitID.take(8)
|
|
||||||
env.NEW_BRANCH = "${params.eNB_Branch}-${shortCommit}"
|
|
||||||
echo "New branch: ${env.NEW_BRANCH}"
|
|
||||||
}
|
|
||||||
sh """
|
|
||||||
# Checkout source commit
|
|
||||||
git checkout -B ${env.NEW_BRANCH} ${params.eNB_CommitID}
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Merge target into source') {
|
|
||||||
steps {
|
|
||||||
sh """
|
|
||||||
echo "Merging target branch ${params.eNB_TargetBranch} into source branch ${env.NEW_BRANCH}"
|
|
||||||
if ! git merge --ff origin/${params.eNB_TargetBranch} \
|
|
||||||
-m "Merge ${params.eNB_TargetBranch} into ${params.eNB_Branch} for CI"; then
|
|
||||||
echo "Merge conflicts detected. Aborting."
|
|
||||||
git merge --abort || true
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Push merged branch to internal repository') {
|
|
||||||
steps {
|
|
||||||
sh """
|
|
||||||
git remote add internal-repo ${internalRepoURL} || true
|
|
||||||
echo "Pushing ${env.NEW_BRANCH} to internal repo"
|
|
||||||
git push --force internal-repo ${env.NEW_BRANCH}
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,23 @@
|
|||||||
#!/bin/groovy
|
#!/bin/groovy
|
||||||
/*
|
/*
|
||||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Location of the python executor node shall be in the same subnet as the others servers
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
|||||||
@@ -0,0 +1,250 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Terminate Status
|
||||||
|
def termENB = 0
|
||||||
|
def termStatusArray = new Boolean[termENB + 1]
|
||||||
|
termStatusArray[termENB] = false
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
def doEpcLogCollection = true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == 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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
|
currentBuild.result = 'ABORTED'
|
||||||
|
error('Stopping early because some parameters are missing')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
} else {
|
||||||
|
echo "Test XML file ${xmlFile}: no such file"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
timeout (time: 60, unit: 'MINUTES') {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate eNB') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate eNB\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB"
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termENB] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
|
||||||
|
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
|
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Making sure that we really shutdown every thing before leaving
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
if (!termStatusArray[termENB]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,225 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == 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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
} else {
|
||||||
|
echo "Test XML file ${xmlFile}: no such file"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
timeout (time: 60, unit: 'MINUTES') {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate eNB') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate eNB\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
|
||||||
|
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
|
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,216 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
//Status fed to the database
|
||||||
|
def StatusForDb = ""
|
||||||
|
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {label pythonExecutor}
|
||||||
|
options {
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == 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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
} else {
|
||||||
|
echo "Test XML file ${xmlFile}: no such file"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
timeout (time: 60, unit: 'MINUTES') {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,260 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
def lockResources = []
|
||||||
|
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||||
|
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||||
|
|
||||||
|
// Terminate Status
|
||||||
|
def termUE = 0
|
||||||
|
def termENB = 1
|
||||||
|
def termSPGW = 2
|
||||||
|
def termMME = 3
|
||||||
|
def termHSS = 4
|
||||||
|
def termStatusArray = new Boolean[termHSS + 1]
|
||||||
|
termStatusArray[termUE] = false
|
||||||
|
termStatusArray[termENB] = false
|
||||||
|
termStatusArray[termSPGW] = false
|
||||||
|
termStatusArray[termMME] = false
|
||||||
|
termStatusArray[termHSS] = false
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
def flexricOption = ""
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: lockResources)
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.LockResources == null) {
|
||||||
|
echo "no LockResources given"
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == 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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.Flexric_Tag != null) {
|
||||||
|
echo "This pipeline is configured to run with a FlexRIC deployment."
|
||||||
|
echo "Appending FlexRicTag option to the list of options"
|
||||||
|
flexricOption = "--FlexRicTag=${params.Flexric_Tag}"
|
||||||
|
echo "Using new Flexric option: ${flexricOption}"
|
||||||
|
}
|
||||||
|
|
||||||
|
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 if (eNB_CommitID != 'develop') {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error "Some parameters are missing"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
} else {
|
||||||
|
echo "Test XML file ${xmlFile}: no such file"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${flexricOption} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
timeout (time: 60, unit: 'MINUTES') {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${flexricOption} --eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate eNB') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate eNB\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB"
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termENB] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
|
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Making sure that we really shutdown every thing before leaving
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
if (!termStatusArray[termENB]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
This document outlines how to use the OAI CI framework and gives a quickstart.
|
This document outlines how to use the OAI CI framework and gives a quickstart.
|
||||||
|
|
||||||
[[_TOC_]]
|
[[_TOC_]]
|
||||||
|
|||||||
@@ -1,5 +1,23 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
# Python for CI of OAI-eNB + COTS-UE
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
#
|
#
|
||||||
@@ -15,6 +33,7 @@
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
import sys # arg
|
import sys # arg
|
||||||
import re # reg
|
import re # reg
|
||||||
|
import yaml
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -22,10 +41,9 @@ import constants as CONST
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
||||||
|
|
||||||
force_local = False
|
force_local = False
|
||||||
date_fmt = None
|
|
||||||
while len(argvs) > 1:
|
while len(argvs) > 1:
|
||||||
myArgv = argvs.pop(1) # 0th is this file's name
|
myArgv = argvs.pop(1) # 0th is this file's name
|
||||||
|
|
||||||
@@ -38,9 +56,6 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
|
|
||||||
|
|
||||||
#consider inline parameters
|
#consider inline parameters
|
||||||
elif re.match(r'^\-\-datefmt=(.+)$', myArgv, re.IGNORECASE):
|
|
||||||
matchReg = re.match(r'^\-\-datefmt=(.+)$', myArgv, re.IGNORECASE)
|
|
||||||
date_fmt = matchReg.group(1)
|
|
||||||
elif re.match(r'^\-\-mode=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-mode=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match(r'^\-\-mode=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match(r'^\-\-mode=(.+)$', myArgv, re.IGNORECASE)
|
||||||
mode = matchReg.group(1)
|
mode = matchReg.group(1)
|
||||||
@@ -53,6 +68,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
RAN.ranRepository=matchReg.group(1)
|
RAN.ranRepository=matchReg.group(1)
|
||||||
HTML.ranRepository=matchReg.group(1)
|
HTML.ranRepository=matchReg.group(1)
|
||||||
CONTAINERS.ranRepository=matchReg.group(1)
|
CONTAINERS.ranRepository=matchReg.group(1)
|
||||||
|
SCA.ranRepository=matchReg.group(1)
|
||||||
CLUSTER.ranRepository=matchReg.group(1)
|
CLUSTER.ranRepository=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
@@ -65,6 +81,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
RAN.ranAllowMerge=True
|
RAN.ranAllowMerge=True
|
||||||
HTML.ranAllowMerge=True
|
HTML.ranAllowMerge=True
|
||||||
CONTAINERS.ranAllowMerge=True
|
CONTAINERS.ranAllowMerge=True
|
||||||
|
SCA.ranAllowMerge=True
|
||||||
CLUSTER.ranAllowMerge=True
|
CLUSTER.ranAllowMerge=True
|
||||||
elif re.match(r'^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
@@ -75,6 +92,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
RAN.ranBranch=matchReg.group(1)
|
RAN.ranBranch=matchReg.group(1)
|
||||||
HTML.ranBranch=matchReg.group(1)
|
HTML.ranBranch=matchReg.group(1)
|
||||||
CONTAINERS.ranBranch=matchReg.group(1)
|
CONTAINERS.ranBranch=matchReg.group(1)
|
||||||
|
SCA.ranBranch=matchReg.group(1)
|
||||||
CLUSTER.ranBranch=matchReg.group(1)
|
CLUSTER.ranBranch=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
@@ -85,6 +103,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
RAN.ranCommitID=matchReg.group(1)
|
RAN.ranCommitID=matchReg.group(1)
|
||||||
HTML.ranCommitID=matchReg.group(1)
|
HTML.ranCommitID=matchReg.group(1)
|
||||||
CONTAINERS.ranCommitID=matchReg.group(1)
|
CONTAINERS.ranCommitID=matchReg.group(1)
|
||||||
|
SCA.ranCommitID=matchReg.group(1)
|
||||||
CLUSTER.ranCommitID=matchReg.group(1)
|
CLUSTER.ranCommitID=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
@@ -95,6 +114,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
RAN.ranTargetBranch=matchReg.group(1)
|
RAN.ranTargetBranch=matchReg.group(1)
|
||||||
HTML.ranTargetBranch=matchReg.group(1)
|
HTML.ranTargetBranch=matchReg.group(1)
|
||||||
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
||||||
|
SCA.ranTargetBranch=matchReg.group(1)
|
||||||
CLUSTER.ranTargetBranch=matchReg.group(1)
|
CLUSTER.ranTargetBranch=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
print("parameters --eNB*IPAddress ignored")
|
print("parameters --eNB*IPAddress ignored")
|
||||||
@@ -107,6 +127,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
matchReg = re.match(r'^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match(r'^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNBSourceCodePath=matchReg.group(1)
|
RAN.eNBSourceCodePath=matchReg.group(1)
|
||||||
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
||||||
|
SCA.eNBSourceCodePath=matchReg.group(1)
|
||||||
CLUSTER.eNBSourceCodePath=matchReg.group(1)
|
CLUSTER.eNBSourceCodePath=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
print("parameter --eNB1SourceCodePath ignored")
|
print("parameter --eNB1SourceCodePath ignored")
|
||||||
@@ -137,6 +158,9 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
elif re.match(r'^\-\-OCRegistry=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-OCRegistry=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match(r'^\-\-OCRegistry=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match(r'^\-\-OCRegistry=(.+)$', myArgv, re.IGNORECASE)
|
||||||
CLUSTER.OCRegistry = matchReg.group(1)
|
CLUSTER.OCRegistry = matchReg.group(1)
|
||||||
|
elif re.match(r'^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE):
|
||||||
|
matchReg = re.match(r'^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE)
|
||||||
|
RAN.BuildId = matchReg.group(1)
|
||||||
elif re.match(r'^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match(r'^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match(r'^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE)
|
||||||
CONTAINERS.flexricTag = matchReg.group(1)
|
CONTAINERS.flexricTag = matchReg.group(1)
|
||||||
@@ -144,4 +168,4 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
|||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Invalid Parameter: ' + myArgv)
|
sys.exit('Invalid Parameter: ' + myArgv)
|
||||||
|
|
||||||
return mode, force_local, date_fmt
|
return mode, force_local
|
||||||
|
|||||||
Executable
+18
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ue_id="$1" # UE id
|
||||||
|
duration="$2" # Sim duration
|
||||||
|
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
|
||||||
|
function end
|
||||||
|
{
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
trap end INT TERM
|
||||||
|
|
||||||
|
echo "ip netns exec $ue_id $@ > /tmp/test_${ue_id}.log"
|
||||||
|
ip netns exec $ue_id $@ > /tmp/test_$ue_id.log
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
|||||||
@@ -1,8 +1,28 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
echo "OAI Warning Check script"
|
echo "OAI Warning Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Usage:"
|
echo "Usage:"
|
||||||
echo "------"
|
echo "------"
|
||||||
|
|||||||
@@ -1,8 +1,28 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
echo "OAI Coding / Formatting Guideline Check script"
|
echo "OAI Coding / Formatting Guideline Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
echo ""
|
echo ""
|
||||||
echo " By default (no options) the complete repository will be checked"
|
echo " By default (no options) the complete repository will be checked"
|
||||||
echo " In case of merge request, provided source and target branch,"
|
echo " In case of merge request, provided source and target branch,"
|
||||||
@@ -52,9 +72,9 @@ then
|
|||||||
for FILE in $LIST_OF_FILES_W_BANNER
|
for FILE in $LIST_OF_FILES_W_BANNER
|
||||||
do
|
do
|
||||||
IS_NFAPI=`echo $FILE | grep -E -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
IS_NFAPI=`echo $FILE | grep -E -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
||||||
IS_OAI_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: LicenseRef-CSSL-1.0" $FILE || true`
|
IS_OAI_LICENCE_PRESENT=`grep -E -c "OAI Public License" $FILE || true`
|
||||||
IS_BSD_LICENCE_PRESENT=`grep -E -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause|License-Identifier: BSD-3-Clause" $FILE || true`
|
IS_BSD_LICENCE_PRESENT=`grep -E -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause|License-Identifier: BSD-3-Clause" $FILE || true`
|
||||||
IS_MIT_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: MIT" $FILE || true`
|
IS_MIT_LICENCE_PRESENT=`grep -E -c "MIT License" $FILE || true`
|
||||||
IS_EXCEPTION=`echo $FILE | grep -E -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h" || true`
|
IS_EXCEPTION=`echo $FILE | grep -E -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h" || true`
|
||||||
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ]
|
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ]
|
||||||
then
|
then
|
||||||
@@ -163,9 +183,9 @@ do
|
|||||||
if [ $IS_BANNER -ne 0 ]
|
if [ $IS_BANNER -ne 0 ]
|
||||||
then
|
then
|
||||||
IS_NFAPI=`echo $FULLFILE | grep -E -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
IS_NFAPI=`echo $FULLFILE | grep -E -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true`
|
||||||
IS_OAI_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: LicenseRef-CSSL-1.0" $FULLFILE || true`
|
IS_OAI_LICENCE_PRESENT=`grep -E -c "OAI Public License" $FULLFILE || true`
|
||||||
IS_BSD_LICENCE_PRESENT=`grep -E -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause|License-Identifier: BSD-3-Clause" $FULLFILE || true`
|
IS_BSD_LICENCE_PRESENT=`grep -E -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause|License-Identifier: BSD-3-Clause" $FULLFILE || true`
|
||||||
IS_MIT_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: MIT" $FULLFILE || true`
|
IS_MIT_LICENCE_PRESENT=`grep -E -c "MIT License" $FULLFILE || true`
|
||||||
IS_EXCEPTION=`echo $FULLFILE | grep -E -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h" || true`
|
IS_EXCEPTION=`echo $FULLFILE | grep -E -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h" || true`
|
||||||
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ]
|
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ]
|
||||||
then
|
then
|
||||||
|
|||||||
@@ -1,8 +1,28 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
echo "OAI GitLab merge request applying script"
|
echo "OAI GitLab merge request applying script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Usage:"
|
echo "Usage:"
|
||||||
echo "------"
|
echo "------"
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "usage: $0 <command> <id>"
|
echo "usage: $0 <command> <id>"
|
||||||
|
|||||||
@@ -1,5 +1,22 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Required Python Version
|
# Required Python Version
|
||||||
|
|||||||
+11
-23
@@ -79,11 +79,11 @@ oc-cn5g:
|
|||||||
|
|
||||||
oc-cn5g-20897:
|
oc-cn5g-20897:
|
||||||
Host: cacofonix
|
Host: cacofonix
|
||||||
NetworkScript: echo "inet 172.21.6.115"
|
NetworkScript: echo "inet 172.21.6.105"
|
||||||
RunIperf3Server: False
|
RunIperf3Server: False
|
||||||
Deploy: "! scripts/oc-cn5g-deploy.sh /opt/oai-cn5g-fed-develop-2026-apr oaicicd-core-for-fhi72"
|
Deploy: "! scripts/oc-cn5g-deploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-fhi72"
|
||||||
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-2026-apr oaicicd-core-for-fhi72"
|
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-fhi72"
|
||||||
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-2026-apr oaicicd-core-for-fhi72 %%log_dir%%"
|
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-fhi72 %%log_dir%%"
|
||||||
|
|
||||||
oc-cn5g-00103-ho:
|
oc-cn5g-00103-ho:
|
||||||
Host: groot
|
Host: groot
|
||||||
@@ -101,14 +101,6 @@ oc-cn5g-20897-aerial:
|
|||||||
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-nvidia-aerial"
|
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-nvidia-aerial"
|
||||||
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-nvidia-aerial %%log_dir%%"
|
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-nvidia-aerial %%log_dir%%"
|
||||||
|
|
||||||
oc-cn5g-00104:
|
|
||||||
Host: gracehopper1-oai
|
|
||||||
NetworkScript: echo "inet 172.21.6.105"
|
|
||||||
RunIperf3Server: False
|
|
||||||
Deploy: "! scripts/oc-cn5g-deploy.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial"
|
|
||||||
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial"
|
|
||||||
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial %%log_dir%%"
|
|
||||||
|
|
||||||
matix-cn5g:
|
matix-cn5g:
|
||||||
Host: matix
|
Host: matix
|
||||||
NetworkScript: docker exec prod-trf-gen ip a show dev eth0
|
NetworkScript: docker exec prod-trf-gen ip a show dev eth0
|
||||||
@@ -143,7 +135,7 @@ ltebox-nano:
|
|||||||
- "sudo su -c 'screen -dm -S simulated_hss /opt/hss_sim0609/starthss'"
|
- "sudo su -c 'screen -dm -S simulated_hss /opt/hss_sim0609/starthss'"
|
||||||
- "sleep 1"
|
- "sleep 1"
|
||||||
- "sudo /opt/ltebox/tools/start_mme && sudo /opt/ltebox/tools/start_xGw &"
|
- "sudo /opt/ltebox/tools/start_mme && sudo /opt/ltebox/tools/start_xGw &"
|
||||||
- "sleep 2"
|
- "sleep 1"
|
||||||
Undeploy: "sudo /opt/ltebox/tools/stop_xGw; sudo /opt/ltebox/tools/stop_mme; sudo killall screen"
|
Undeploy: "sudo /opt/ltebox/tools/stop_xGw; sudo /opt/ltebox/tools/stop_mme; sudo killall screen"
|
||||||
LogCollect: "cp /opt/hss_sim0609/hss.log /opt/ltebox/var/log/{mmeLog.0,s1apcLog.0,s1apsLog.0,s11cLog.0,libLog.0,xGwLog.0} %%log_dir%%"
|
LogCollect: "cp /opt/hss_sim0609/hss.log /opt/ltebox/var/log/{mmeLog.0,s1apcLog.0,s1apsLog.0,s11cLog.0,libLog.0,xGwLog.0} %%log_dir%%"
|
||||||
|
|
||||||
@@ -154,7 +146,7 @@ sabox-nepes:
|
|||||||
- "sudo su -c 'screen -dm -S simulated_5g_hss /opt/hss_sim0609/start_5g_hss'"
|
- "sudo su -c 'screen -dm -S simulated_5g_hss /opt/hss_sim0609/start_5g_hss'"
|
||||||
- "sleep 1"
|
- "sleep 1"
|
||||||
- "sudo /opt/ltebox/tools/start_sabox < /dev/null &> /dev/null"
|
- "sudo /opt/ltebox/tools/start_sabox < /dev/null &> /dev/null"
|
||||||
- "sleep 2"
|
- "sleep 1"
|
||||||
LogCollect: "cp /opt/hss_sim0609/hss.log /opt/ltebox/var/log/{amfLog.0,ngapcLog.0,ngapcommonLog.0,ngapsLog.0,xGwLog.0,upfLog.0} %%log_dir%%"
|
LogCollect: "cp /opt/hss_sim0609/hss.log /opt/ltebox/var/log/{amfLog.0,ngapcLog.0,ngapcommonLog.0,ngapsLog.0,xGwLog.0,upfLog.0} %%log_dir%%"
|
||||||
Undeploy: "sudo /opt/ltebox/tools/stop_sabox; sudo killall screen"
|
Undeploy: "sudo /opt/ltebox/tools/stop_sabox; sudo killall screen"
|
||||||
|
|
||||||
@@ -165,7 +157,7 @@ ltebox-nepes:
|
|||||||
- "sudo su -c 'screen -dm -S simulated_hss /opt/hss_sim0609/starthss'"
|
- "sudo su -c 'screen -dm -S simulated_hss /opt/hss_sim0609/starthss'"
|
||||||
- "sleep 1"
|
- "sleep 1"
|
||||||
- "sudo /opt/ltebox/tools/start_mme && sudo /opt/ltebox/tools/start_xGw &"
|
- "sudo /opt/ltebox/tools/start_mme && sudo /opt/ltebox/tools/start_xGw &"
|
||||||
- "sleep 2"
|
- "sleep 1"
|
||||||
Undeploy: "sudo /opt/ltebox/tools/stop_xGw; sudo /opt/ltebox/tools/stop_mme; sudo killall screen"
|
Undeploy: "sudo /opt/ltebox/tools/stop_xGw; sudo /opt/ltebox/tools/stop_mme; sudo killall screen"
|
||||||
LogCollect: "cp /opt/hss_sim0609/hss.log /opt/ltebox/var/log/{mmeLog.0,s1apcLog.0,s1apsLog.0,s11cLog.0,libLog.0,xGwLog.0} %%log_dir%%"
|
LogCollect: "cp /opt/hss_sim0609/hss.log /opt/ltebox/var/log/{mmeLog.0,s1apcLog.0,s1apsLog.0,s11cLog.0,libLog.0,xGwLog.0} %%log_dir%%"
|
||||||
|
|
||||||
@@ -183,6 +175,10 @@ amarisoft_ue_2x2:
|
|||||||
InitScript: /root/lteue-linux-2025-03-15/lteue /root/oaicicd/ran_sa_aw2s_asue_20MHz_2x2/aw2s-multi-00102-2x2-v2.cfg &
|
InitScript: /root/lteue-linux-2025-03-15/lteue /root/oaicicd/ran_sa_aw2s_asue_20MHz_2x2/aw2s-multi-00102-2x2-v2.cfg &
|
||||||
TermScript: /root/lteue-linux-2025-03-15/ws.js -t 10 127.0.0.1:9002 '{"message":"quit"}' || killall -KILL lteue-avx2
|
TermScript: /root/lteue-linux-2025-03-15/ws.js -t 10 127.0.0.1:9002 '{"message":"quit"}' || killall -KILL lteue-avx2
|
||||||
NetworkScript: ip netns exec ue1 ip a show dev pdn0
|
NetworkScript: ip netns exec ue1 ip a show dev pdn0
|
||||||
|
amarisoft_ue_fhi72:
|
||||||
|
Host: amariue
|
||||||
|
InitScript: /root/lteue-linux-2025-03-15/lteue /root/oaicicd/ran_sa_fhi72_asue_2x2_benetel550/fhi72-multi-20897-2x2.cfg &
|
||||||
|
TermScript: /root/lteue-linux-2025-03-15/ws.js -t 10 127.0.0.1:9002 '{"message":"quit"}' || killall -KILL lteue-avx2
|
||||||
amarisoft_ue_1:
|
amarisoft_ue_1:
|
||||||
Host: amariue
|
Host: amariue
|
||||||
AttachScript: /root/lteue-linux-2025-03-15/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":1}'
|
AttachScript: /root/lteue-linux-2025-03-15/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":1}'
|
||||||
@@ -304,14 +300,6 @@ oai_ue_caracal:
|
|||||||
IF: oaitun_ue1
|
IF: oaitun_ue1
|
||||||
MTU: 1500
|
MTU: 1500
|
||||||
|
|
||||||
oai_ue_jetson2:
|
|
||||||
Host: jetson2-oai
|
|
||||||
AttachScript: 'docker start oai-nr-ue'
|
|
||||||
DetachScript: 'docker stop oai-nr-ue'
|
|
||||||
NetworkScript: ip a show dev oaitun_ue1
|
|
||||||
IF: oaitun_ue1
|
|
||||||
MTU: 1500
|
|
||||||
|
|
||||||
lte_oai_ue_carabe:
|
lte_oai_ue_carabe:
|
||||||
Host: carabe
|
Host: carabe
|
||||||
NetworkScript: docker exec lte-b200-ue-fdd-10Mhz-tm1 ip a show dev oaitun_ue1
|
NetworkScript: docker exec lte-b200-ue-fdd-10Mhz-tm1 ip a show dev oaitun_ue1
|
||||||
|
|||||||
+21
-137
@@ -1,16 +1,31 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import logging
|
|
||||||
import yaml
|
|
||||||
import signal
|
|
||||||
|
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
import json
|
import json
|
||||||
|
|
||||||
import importlib, inspect
|
|
||||||
|
|
||||||
class Analysis():
|
class Analysis():
|
||||||
|
|
||||||
def _get_test_description(properties):
|
def _get_test_description(properties):
|
||||||
@@ -94,134 +109,3 @@ class Analysis():
|
|||||||
test_summary['Nbpass'] = nb_tests - nb_failed
|
test_summary['Nbpass'] = nb_tests - nb_failed
|
||||||
test_summary['Nbfail'] = nb_failed
|
test_summary['Nbfail'] = nb_failed
|
||||||
return nb_failed == 0, test_summary, test_result
|
return nb_failed == 0, test_summary, test_result
|
||||||
|
|
||||||
def analyze_rt_stats(thresholds, L1_stats, MAC_stats):
|
|
||||||
with open(thresholds, 'r') as f:
|
|
||||||
datalog_rt_stats = yaml.load(f, Loader=yaml.FullLoader)
|
|
||||||
|
|
||||||
rt_keys = datalog_rt_stats['Ref']
|
|
||||||
real_time_stats = {}
|
|
||||||
for sf in [L1_stats, MAC_stats]:
|
|
||||||
with open(sf, 'r') as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
for k in rt_keys:
|
|
||||||
result = re.search(k, line)
|
|
||||||
if result is not None:
|
|
||||||
tmp = re.match(rf'^.*?(\b{k}\b.*)', line.rstrip())
|
|
||||||
if tmp is not None:
|
|
||||||
real_time_stats[k] = tmp.group(1)
|
|
||||||
|
|
||||||
# datalog_rt_stats format must align with HTML.CreateHtmlDataLogTable()
|
|
||||||
datalog_rt_stats['Data']={}
|
|
||||||
for k in real_time_stats:
|
|
||||||
tmp = re.match(r'^(?P<metric>.*):\s+(?P<avg>\d+\.\d+) us;\s+(?P<count>\d+);\s+(?P<max>\d+\.\d+) us;', real_time_stats[k])
|
|
||||||
if tmp is not None:
|
|
||||||
metric = tmp.group('metric')
|
|
||||||
avg = float(tmp.group('avg'))
|
|
||||||
max = float(tmp.group('max'))
|
|
||||||
count = int(tmp.group('count'))
|
|
||||||
datalog_rt_stats['Data'][metric] = ["{:.0f}".format(avg),"{:.0f}".format(max),"{:d}".format(count),"{:.2f}".format(avg / datalog_rt_stats['Ref'][metric])]
|
|
||||||
|
|
||||||
success = True
|
|
||||||
for k in datalog_rt_stats['Data']:
|
|
||||||
valnorm = float(datalog_rt_stats['Data'][k][3])
|
|
||||||
dev = datalog_rt_stats['DeviationThreshold'][k]
|
|
||||||
if valnorm > 1.0 + dev or valnorm < 1.0 - dev: # condition for fail: avg/ref deviates by more than "deviation threshold"
|
|
||||||
logging.debug(f'\u001B[1;30;43m normalized metric {k}={valnorm} deviates by more than {dev}\u001B[0m')
|
|
||||||
success = False
|
|
||||||
return success, datalog_rt_stats
|
|
||||||
|
|
||||||
|
|
||||||
# returns tuple of (service, analyzer, option string)
|
|
||||||
def _lookupServiceAnalyzerOpt(s, analyzers):
|
|
||||||
res = s.split("=", 2)
|
|
||||||
name = res[0]
|
|
||||||
if len(res) == 1:
|
|
||||||
return res[0], analyzers["Default"], None
|
|
||||||
opt = res[2] if len(res) > 2 else None
|
|
||||||
func = res[1]
|
|
||||||
a = analyzers[func] if func in analyzers else None
|
|
||||||
return name, a, opt
|
|
||||||
|
|
||||||
# groups requested service analysis (service=func[=option]) on per service
|
|
||||||
# basis and looks up analyzer func. If log analysis is requested, will always
|
|
||||||
# run Default log analysis
|
|
||||||
def _groupServices(to_analyze):
|
|
||||||
req_analysis = {}
|
|
||||||
# get content of cls_loganalysis module, then get all analyzers (classes) in this module
|
|
||||||
mod = importlib.import_module("cls_loganalysis")
|
|
||||||
analyzers = {name:cl for name, cl in inspect.getmembers(mod, inspect.isclass)}
|
|
||||||
for req in to_analyze:
|
|
||||||
s, func, opt = _lookupServiceAnalyzerOpt(req, analyzers)
|
|
||||||
logging.debug(f"requested check '{req}' => service {s}, function {func.__name__}, options '{opt}'")
|
|
||||||
# always put default analyzer first
|
|
||||||
l = req_analysis[s] if s in req_analysis else [(analyzers["Default"], None, "default")]
|
|
||||||
if func is not analyzers["Default"]:
|
|
||||||
l.append((func, opt, req))
|
|
||||||
req_analysis[s] = l
|
|
||||||
return req_analysis
|
|
||||||
|
|
||||||
def _describe_exit_code(code):
|
|
||||||
if code > 128:
|
|
||||||
sig = code - 128
|
|
||||||
try:
|
|
||||||
return f"terminated by signal {sig} ({signal.Signals(sig).name})"
|
|
||||||
except ValueError:
|
|
||||||
return f"terminated by unknown signal {sig}"
|
|
||||||
else:
|
|
||||||
return f"custom exit code"
|
|
||||||
|
|
||||||
def AnalyzeServices(HTML, service_desc, to_analyze):
|
|
||||||
success = True
|
|
||||||
# hack: we want to give as a description "log analysis", but the description
|
|
||||||
# is set outside, so retain what was set before
|
|
||||||
orig_html_desc = HTML.desc
|
|
||||||
# group analysis on a per-service basis, then iterate
|
|
||||||
for serv, list_analysis in _groupServices(to_analyze).items():
|
|
||||||
HTML.desc = f"Log analysis for service {serv}"
|
|
||||||
if serv not in service_desc:
|
|
||||||
success = False
|
|
||||||
logging.error(f"requested service {serv} not in list of services")
|
|
||||||
HTML.CreateHtmlTestRowQueue("N/A", 'KO', ["service not detected"])
|
|
||||||
continue
|
|
||||||
# pre-initialize with return code
|
|
||||||
rc = service_desc[serv]["returncode"]
|
|
||||||
logging.info(f"analyze service {serv}: return code {rc}")
|
|
||||||
service_success = True # TODO rc == 0: too many functions (eNB, lteUE, RIC, nrUE) fail non-zero
|
|
||||||
logs = []
|
|
||||||
if rc != 0:
|
|
||||||
logs.append(f"=> return code {rc}, likely " + _describe_exit_code(rc) + " [ignored by CI]")
|
|
||||||
# skip if the file is too big
|
|
||||||
logfile = service_desc[serv]["logfile"]
|
|
||||||
filename = os.path.basename(logfile)
|
|
||||||
b = os.path.getsize(logfile)
|
|
||||||
logging.debug(f"using logfile {logfile} of size {b} bytes")
|
|
||||||
if b > 10 * 1024 * 1024:
|
|
||||||
success = False
|
|
||||||
logs.append(f"logfile too big (>10MB)")
|
|
||||||
logging.error(logs)
|
|
||||||
HTML.CreateHtmlTestRowQueue(filename, 'KO', ["\n".join(logs)])
|
|
||||||
continue
|
|
||||||
# run each analyzer with its options on the logfile
|
|
||||||
for (func, opt, desc) in list_analysis:
|
|
||||||
if func is None:
|
|
||||||
service_success = False
|
|
||||||
logging.error(f"request analysis function for desc {desc} not found")
|
|
||||||
HTML.CreateHtmlTestRowQueue(serv, 'KO', [f"no analysis function for {desc}"])
|
|
||||||
continue
|
|
||||||
result, l = func.run(logfile, opt)
|
|
||||||
logging.info(f"service {serv}: analysis with func {func}, result {result}, logs '{l}'")
|
|
||||||
service_success = service_success and result
|
|
||||||
if not result:
|
|
||||||
logs.append(f"=> {func.__name__} check (options '{opt}') FAILED")
|
|
||||||
logs.append(l)
|
|
||||||
logs = '\n'.join(logs)
|
|
||||||
if not service_success:
|
|
||||||
logging.error(l)
|
|
||||||
else:
|
|
||||||
logging.info(l)
|
|
||||||
all_funcs = ", ".join([f.__name__ for (f, _, _) in list_analysis])
|
|
||||||
HTML.CreateHtmlTestRowQueue(f"Check {all_funcs} on {filename}", 'OK' if service_success else 'KO', [logs])
|
|
||||||
success = success and service_success
|
|
||||||
HTML.desc = orig_html_desc
|
|
||||||
return success
|
|
||||||
|
|||||||
@@ -1,18 +1,38 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from typing import NamedTuple
|
from typing import NamedTuple
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
class TestCaseCtx(NamedTuple):
|
class TestCaseCtx(NamedTuple):
|
||||||
test_idx: int
|
count: int
|
||||||
|
test_id: int
|
||||||
logPath: str
|
logPath: str
|
||||||
|
|
||||||
def Default(logPath):
|
def Default(logPath):
|
||||||
return TestCaseCtx(112233, logPath)
|
return TestCaseCtx(123, 112233, logPath)
|
||||||
def baseFilename(self):
|
def baseFilename(self):
|
||||||
# typically, the test ID is of form 001234 (6 digits)
|
# typically, the test ID is of form 001234 (6 digits)
|
||||||
return f"{self.logPath}/{self.test_idx:06d}"
|
return f"{self.logPath}/{self.count}-{self.test_id:06d}"
|
||||||
|
|
||||||
def archiveArtifact(cmd, ctx, remote_path):
|
def archiveArtifact(cmd, ctx, remote_path):
|
||||||
base = os.path.basename(remote_path)
|
base = os.path.basename(remote_path)
|
||||||
|
|||||||
@@ -1,5 +1,23 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Required Python Version
|
# Required Python Version
|
||||||
@@ -146,6 +164,7 @@ class Cluster:
|
|||||||
|
|
||||||
def PullClusterImage(self, HTML, node, images, tag_prefix):
|
def PullClusterImage(self, HTML, node, images, tag_prefix):
|
||||||
logging.debug(f'Pull OC image {images} to server {node}')
|
logging.debug(f'Pull OC image {images} to server {node}')
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
with cls_cmd.getConnection(node) as cmd:
|
with cls_cmd.getConnection(node) as cmd:
|
||||||
succeeded = OC_login(cmd, self.OCUserName, self.OCPassword, CI_OC_RAN_NAMESPACE)
|
succeeded = OC_login(cmd, self.OCUserName, self.OCPassword, CI_OC_RAN_NAMESPACE)
|
||||||
if not succeeded:
|
if not succeeded:
|
||||||
@@ -192,6 +211,8 @@ class Cluster:
|
|||||||
logging.debug(f'Building on cluster triggered from server: {node}')
|
logging.debug(f'Building on cluster triggered from server: {node}')
|
||||||
self.cmd = cls_cmd.RemoteCmd(node)
|
self.cmd = cls_cmd.RemoteCmd(node)
|
||||||
|
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
|
||||||
# Workaround for some servers, we need to erase completely the workspace
|
# Workaround for some servers, we need to erase completely the workspace
|
||||||
self.cmd.cd(lSourcePath)
|
self.cmd.cd(lSourcePath)
|
||||||
# to reduce the amount of data send to OpenShift, we
|
# to reduce the amount of data send to OpenShift, we
|
||||||
@@ -391,7 +412,7 @@ class Cluster:
|
|||||||
# the groovy scripts expects all logs in
|
# the groovy scripts expects all logs in
|
||||||
# <jenkins-workspace>/<pipeline>/ci-scripts, so copy it there
|
# <jenkins-workspace>/<pipeline>/ci-scripts, so copy it there
|
||||||
with cls_cmd.LocalCmd() as c:
|
with cls_cmd.LocalCmd() as c:
|
||||||
c.run(f'mkdir -p {os.getcwd()}/test_log_{ctx.test_idx}/')
|
c.run(f'mkdir -p {os.getcwd()}/test_log_{ctx.test_id}/')
|
||||||
c.run(f'cp -r {ctx.logPath} {os.getcwd()}/test_log_{ctx.test_idx}/')
|
c.run(f'cp -r {ctx.logPath} {os.getcwd()}/test_log_{ctx.test_id}/')
|
||||||
|
|
||||||
return status
|
return status
|
||||||
|
|||||||
+20
-2
@@ -1,5 +1,23 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Required Python Version
|
# Required Python Version
|
||||||
|
|||||||
+167
-93
@@ -1,5 +1,23 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
# Python for CI of OAI-eNB + COTS-UE
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
#
|
#
|
||||||
@@ -13,17 +31,23 @@
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Import
|
# Import
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
import sys # arg
|
||||||
import re # reg
|
import re # reg
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import shutil
|
||||||
|
import time
|
||||||
|
from zipfile import ZipFile
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# OAI Testing modules
|
# OAI Testing modules
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
import cls_cmd
|
import cls_cmd
|
||||||
|
import helpreadme as HELP
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
import cls_analysis
|
import cls_oaicitest
|
||||||
from cls_ci_helper import archiveArtifact
|
from cls_ci_helper import archiveArtifact
|
||||||
|
from collections import deque
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Helper functions used here and in other classes
|
# Helper functions used here and in other classes
|
||||||
@@ -162,9 +186,62 @@ def GetDeployedServices(ssh, file):
|
|||||||
else:
|
else:
|
||||||
c = ret.stdout
|
c = ret.stdout
|
||||||
logging.info(f'service {s} with container id {c}')
|
logging.info(f'service {s} with container id {c}')
|
||||||
deployed_services.append((s, c))
|
deployed_services.append(s)
|
||||||
return deployed_services
|
return deployed_services
|
||||||
|
|
||||||
|
def CheckLogs(self, filename, HTML, RAN):
|
||||||
|
success = True
|
||||||
|
name = os.path.basename(filename)
|
||||||
|
if (any(sub in name for sub in ['oai_ue','oai-nr-ue','lte_ue'])):
|
||||||
|
logging.debug(f'\u001B[1m Analyzing UE logfile {filename} \u001B[0m')
|
||||||
|
logStatus = cls_oaicitest.OaiCiTest().AnalyzeLogFile_UE(filename, HTML, RAN)
|
||||||
|
opt = f"UE log analysis ({name})"
|
||||||
|
# usage of htmlUEFailureMsg/htmleNBFailureMsg is because Analyze log files
|
||||||
|
# abuse HTML to store their reports, and we here want to put custom options,
|
||||||
|
# which is not possible with CreateHtmlTestRow
|
||||||
|
# solution: use HTML templates, where we don't need different HTML write funcs
|
||||||
|
if (logStatus < 0):
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'KO', [HTML.htmlUEFailureMsg])
|
||||||
|
success = False
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'OK', [HTML.htmlUEFailureMsg])
|
||||||
|
HTML.htmlUEFailureMsg = ""
|
||||||
|
elif 'nv-cubb' in name:
|
||||||
|
msg = 'Undeploy PNF/Nvidia CUBB'
|
||||||
|
HTML.CreateHtmlTestRow(msg, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
elif (any(sub in name for sub in ['enb','rru','rcc','cu','du','gnb'])):
|
||||||
|
logging.debug(f'\u001B[1m Analyzing XnB logfile {filename}\u001B[0m')
|
||||||
|
logStatus = RAN.AnalyzeLogFile_eNB(filename, HTML, self.ran_checkers)
|
||||||
|
opt = f"xNB log analysis ({name})"
|
||||||
|
if (logStatus < 0):
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'KO', [HTML.htmleNBFailureMsg])
|
||||||
|
success = False
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'OK', [HTML.htmleNBFailureMsg])
|
||||||
|
HTML.htmleNBFailureMsg = ""
|
||||||
|
elif 'xapp' in name:
|
||||||
|
opt = f"Undeploy {name}"
|
||||||
|
with open(f'{filename}', "r") as f:
|
||||||
|
last_line = deque(f, maxlen=1).pop()
|
||||||
|
if ('Test xApp run SUCCESSFULLY' in last_line):
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'OK', ["xApp run successfully"])
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'KO', ["xApp didn't run successfully"])
|
||||||
|
success = False
|
||||||
|
elif 'RIC' in name:
|
||||||
|
opt = f"Undeploy {name}"
|
||||||
|
with open(f'{filename}', 'r') as f:
|
||||||
|
last_line = deque(f, maxlen=1).pop()
|
||||||
|
if ('Removing E2 Node' in last_line):
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'OK', ["nearRT-RIC run successfully"])
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRowQueue(opt, 'KO', ["nearRT-RIC didn't run successfully"])
|
||||||
|
success = False
|
||||||
|
else:
|
||||||
|
logging.info(f"Skipping analysis of log '{filename}': no submatch for xNB/UE")
|
||||||
|
logging.debug(f"log check: file {filename} passed analysis {success}")
|
||||||
|
return success
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Class Declaration
|
# Class Declaration
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -184,6 +261,13 @@ class Containerize():
|
|||||||
self.services = ''
|
self.services = ''
|
||||||
self.deploymentTag = ''
|
self.deploymentTag = ''
|
||||||
|
|
||||||
|
self.cli = ''
|
||||||
|
self.cliBuildOptions = ''
|
||||||
|
self.dockerfileprefix = ''
|
||||||
|
self.host = ''
|
||||||
|
|
||||||
|
#checkers from xml
|
||||||
|
self.ran_checkers={}
|
||||||
self.num_attempts = 1
|
self.num_attempts = 1
|
||||||
|
|
||||||
self.flexricTag = ''
|
self.flexricTag = ''
|
||||||
@@ -198,7 +282,18 @@ class Containerize():
|
|||||||
cmd = cls_cmd.getConnection(node)
|
cmd = cls_cmd.getConnection(node)
|
||||||
log_files = []
|
log_files = []
|
||||||
|
|
||||||
dockerfileprefix = '.ubuntu'
|
# Checking the hostname to get adapted on cli and dockerfileprefixes
|
||||||
|
cmd.run('hostnamectl')
|
||||||
|
result = re.search('Ubuntu|Red Hat', cmd.getBefore())
|
||||||
|
self.host = result.group(0)
|
||||||
|
if self.host == 'Ubuntu':
|
||||||
|
self.cli = 'docker'
|
||||||
|
self.dockerfileprefix = '.ubuntu'
|
||||||
|
self.cliBuildOptions = ''
|
||||||
|
elif self.host == 'Red Hat':
|
||||||
|
self.cli = 'sudo podman'
|
||||||
|
self.dockerfileprefix = '.rhel9'
|
||||||
|
self.cliBuildOptions = '--disable-compression'
|
||||||
|
|
||||||
# we always build the ran-build image with all targets
|
# we always build the ran-build image with all targets
|
||||||
# Creating a tupple with the imageName, the DockerFile prefix pattern, targetName and sanitized option
|
# Creating a tupple with the imageName, the DockerFile prefix pattern, targetName and sanitized option
|
||||||
@@ -209,27 +304,30 @@ class Containerize():
|
|||||||
result = re.search('gNB', self.imageKind)
|
result = re.search('gNB', self.imageKind)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||||
result = re.search('x86', self.imageKind)
|
result = re.search('all', self.imageKind)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
imageNames.append(('oai-enb', 'eNB', 'oai-enb', ''))
|
imageNames.append(('oai-enb', 'eNB', 'oai-enb', ''))
|
||||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
||||||
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue', ''))
|
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue', ''))
|
||||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||||
imageNames.append(('oai-lte-ru', 'lteRU', 'oai-lte-ru', ''))
|
if self.host == 'Red Hat':
|
||||||
# Building again the 5G images with Address Sanitizer
|
imageNames.append(('oai-physim', 'phySim', 'oai-physim', ''))
|
||||||
imageNames.append(('ran-build', 'build', 'ran-build-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
if self.host == 'Ubuntu':
|
||||||
imageNames.append(('oai-enb', 'eNB', 'oai-enb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-lte-ru', 'lteRU', 'oai-lte-ru', ''))
|
||||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-gnb-aerial', 'gNB.aerial', 'oai-gnb-aerial', ''))
|
||||||
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
# Building again the 5G images with Address Sanitizer
|
||||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('ran-build', 'build', 'ran-build-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-enb', 'eNB', 'oai-enb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('ran-build-fhi72', 'build.fhi72', 'ran-build-fhi72', ''))
|
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('oai-gnb', 'gNB.fhi72', 'oai-gnb-fhi72', ''))
|
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('oai-nr-oru', 'nrORU.fhi72', 'oai-nr-oru', ''))
|
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
|
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
|
imageNames.append(('ran-build-fhi72', 'build.fhi72', 'ran-build-fhi72', ''))
|
||||||
|
imageNames.append(('oai-gnb', 'gNB.fhi72', 'oai-gnb-fhi72', ''))
|
||||||
result = re.search('build_cross_arm64', self.imageKind)
|
result = re.search('build_cross_arm64', self.imageKind)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
dockerfileprefix = '.ubuntu.cross-arm64'
|
self.dockerfileprefix = '.ubuntu.cross-arm64'
|
||||||
result = re.search('native_armv9', self.imageKind)
|
result = re.search('native_armv9', self.imageKind)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||||
@@ -244,6 +342,10 @@ class Containerize():
|
|||||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||||
|
|
||||||
cmd.cd(lSourcePath)
|
cmd.cd(lSourcePath)
|
||||||
|
# if asterix, copy the entitlement and subscription manager configurations
|
||||||
|
if self.host == 'Red Hat':
|
||||||
|
cmd.run('mkdir -p ./etc-pki-entitlement')
|
||||||
|
cmd.run('cp /etc/pki/entitlement/*.pem ./etc-pki-entitlement/')
|
||||||
|
|
||||||
baseImage = 'ran-base'
|
baseImage = 'ran-base'
|
||||||
baseTag = 'develop'
|
baseTag = 'develop'
|
||||||
@@ -252,7 +354,7 @@ class Containerize():
|
|||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
imageTag = 'ci-temp'
|
imageTag = 'ci-temp'
|
||||||
if self.ranTargetBranch == 'develop':
|
if self.ranTargetBranch == 'develop':
|
||||||
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base{dockerfileprefix} | grep --colour=never -i INDEX')
|
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base{self.dockerfileprefix} | grep --colour=never -i INDEX')
|
||||||
result = re.search('index', cmd.getBefore())
|
result = re.search('index', cmd.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
forceBaseImageBuild = True
|
forceBaseImageBuild = True
|
||||||
@@ -266,30 +368,27 @@ class Containerize():
|
|||||||
forceBaseImageBuild = True
|
forceBaseImageBuild = True
|
||||||
|
|
||||||
# Let's remove any previous run artifacts if still there
|
# Let's remove any previous run artifacts if still there
|
||||||
cmd.run(f"docker image prune --force")
|
cmd.run(f"{self.cli} image prune --force")
|
||||||
for image,pattern,name,option in imageNames:
|
for image,pattern,name,option in imageNames:
|
||||||
cmd.run(f"docker image rm {name}:{imageTag}", reportNonZero=False)
|
cmd.run(f"{self.cli} image rm {name}:{imageTag}", reportNonZero=False)
|
||||||
|
|
||||||
cmd.run(f'docker login -u oaicicd -p oaicicd {DEFAULT_REGISTRY}')
|
|
||||||
ubuntuImage = "ubuntu:noble"
|
|
||||||
# Build the base image only on Push Events (not on Merge Requests)
|
# Build the base image only on Push Events (not on Merge Requests)
|
||||||
# On when the base image docker file is being modified.
|
# On when the base image docker file is being modified.
|
||||||
if forceBaseImageBuild:
|
if forceBaseImageBuild:
|
||||||
cmd.run(f"docker image rm {baseImage}:{baseTag}")
|
cmd.run(f"{self.cli} image rm {baseImage}:{baseTag}")
|
||||||
logfile = f'{lSourcePath}/cmake_targets/log/ran-base.docker.log'
|
logfile = f'{lSourcePath}/cmake_targets/log/ran-base.docker.log'
|
||||||
option = f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
cmd.run(f"{self.cli} build {self.cliBuildOptions} --target {baseImage} --tag {baseImage}:{baseTag} --file docker/Dockerfile.base{self.dockerfileprefix} . &> {logfile}", timeout=1600)
|
||||||
cmd.run(f"docker build --target {baseImage} --tag {baseImage}:{baseTag} --file docker/Dockerfile.base{dockerfileprefix} {option} . &> {logfile}", timeout=1600)
|
|
||||||
t = ("ran-base", archiveArtifact(cmd, ctx, logfile))
|
t = ("ran-base", archiveArtifact(cmd, ctx, logfile))
|
||||||
log_files.append(t)
|
log_files.append(t)
|
||||||
|
|
||||||
# First verify if the base image was properly created.
|
# First verify if the base image was properly created.
|
||||||
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
||||||
allImagesSize = {}
|
allImagesSize = {}
|
||||||
if ret.returncode != 0:
|
if ret.returncode != 0:
|
||||||
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
||||||
# Recover the name of the failed container?
|
# Recover the name of the failed container?
|
||||||
cmd.run(f"docker ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty docker rm -f")
|
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
||||||
cmd.run(f"docker image prune --force")
|
cmd.run(f"{self.cli} image prune --force")
|
||||||
cmd.close()
|
cmd.close()
|
||||||
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
@@ -309,31 +408,30 @@ class Containerize():
|
|||||||
for image,pattern,name,option in imageNames:
|
for image,pattern,name,option in imageNames:
|
||||||
# the archived Dockerfiles have "ran-base:latest" as base image
|
# the archived Dockerfiles have "ran-base:latest" as base image
|
||||||
# we need to update them with proper tag
|
# we need to update them with proper tag
|
||||||
cmd.run(f'git checkout -- docker/Dockerfile.{pattern}{dockerfileprefix}')
|
cmd.run(f'git checkout -- docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||||
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||||
# target images should use the proper ran-build image
|
# target images should use the proper ran-build image
|
||||||
if image != 'ran-build' and "-asan" in name:
|
if image != 'ran-build' and "-asan" in name:
|
||||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build-asan:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build-asan:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||||
elif "fhi72" in name or name == "oai-nr-oru":
|
elif "fhi72" in name:
|
||||||
cmd.run(f'sed -i -e "s#ran-build-fhi72:latest#ran-build-fhi72:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#ran-build-fhi72:latest#ran-build-fhi72:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||||
elif image != 'ran-build':
|
elif image != 'ran-build':
|
||||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||||
if image == 'oai-gnb-aerial':
|
if image == 'oai-gnb-aerial':
|
||||||
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2026.01.07.tar.gz .')
|
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2025.10.09.tar.gz .')
|
||||||
logfile = f'{lSourcePath}/cmake_targets/log/{name}.docker.log'
|
logfile = f'{lSourcePath}/cmake_targets/log/{name}.docker.log'
|
||||||
option = option + f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
ret = cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} {option} . > {logfile} 2>&1', timeout=1200)
|
||||||
ret = cmd.run(f'docker build --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{dockerfileprefix} {option} . > {logfile} 2>&1', timeout=1200)
|
|
||||||
t = (name, archiveArtifact(cmd, ctx, logfile))
|
t = (name, archiveArtifact(cmd, ctx, logfile))
|
||||||
log_files.append(t)
|
log_files.append(t)
|
||||||
if image == 'oai-gnb-aerial':
|
if image == 'oai-gnb-aerial':
|
||||||
cmd.run('rm -f nvipc_src.2026.01.07.tar.gz')
|
cmd.run('rm -f nvipc_src.2025.10.09.tar.gz')
|
||||||
# check the status of the build
|
# check the status of the build
|
||||||
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
|
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
|
||||||
if ret.returncode != 0:
|
if ret.returncode != 0:
|
||||||
logging.error('\u001B[1m Could not build properly ' + name + '\u001B[0m')
|
logging.error('\u001B[1m Could not build properly ' + name + '\u001B[0m')
|
||||||
status = False
|
status = False
|
||||||
# Here we should check if the last container corresponds to a failed command and destroy it
|
# Here we should check if the last container corresponds to a failed command and destroy it
|
||||||
cmd.run(f"docker ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty docker rm -f")
|
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
||||||
allImagesSize[name] = 'N/A -- Build Failed'
|
allImagesSize[name] = 'N/A -- Build Failed'
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
@@ -347,16 +445,16 @@ class Containerize():
|
|||||||
logging.debug(f'{name} size is unknown')
|
logging.debug(f'{name} size is unknown')
|
||||||
allImagesSize[name] = 'unknown'
|
allImagesSize[name] = 'unknown'
|
||||||
# Now pruning dangling images in between target builds
|
# Now pruning dangling images in between target builds
|
||||||
cmd.run(f"docker image prune --force")
|
cmd.run(f"{self.cli} image prune --force")
|
||||||
cmd.run(f'docker logout {DEFAULT_REGISTRY}')
|
|
||||||
# Remove all intermediate build images and clean up
|
# Remove all intermediate build images and clean up
|
||||||
cmd.run(f"docker image rm ran-build:{imageTag} ran-build-asan:{imageTag} ran-build-fhi72:{imageTag} || true")
|
cmd.run(f"{self.cli} image rm ran-build:{imageTag} ran-build-asan:{imageTag} ran-build-fhi72:{imageTag} || true")
|
||||||
cmd.run(f"docker volume prune --force")
|
cmd.run(f"{self.cli} volume prune --force")
|
||||||
|
|
||||||
# Remove some cached artifacts to prevent out of diskspace problem
|
# Remove some cached artifacts to prevent out of diskspace problem
|
||||||
logging.debug(cmd.run("df -h").stdout)
|
logging.debug(cmd.run("df -h").stdout)
|
||||||
logging.debug(cmd.run("docker system df").stdout)
|
logging.debug(cmd.run("docker system df").stdout)
|
||||||
cmd.run(f"docker buildx prune --filter until=1h --force")
|
cmd.run(f"{self.cli} buildx prune --filter until=1h --force")
|
||||||
logging.debug(cmd.run("df -h").stdout)
|
logging.debug(cmd.run("df -h").stdout)
|
||||||
logging.debug(cmd.run("docker system df").stdout)
|
logging.debug(cmd.run("docker system df").stdout)
|
||||||
|
|
||||||
@@ -458,31 +556,39 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def BuildRunTests(self, ctx, node, dockerfile, runtime_opt, ctest_opt, HTML):
|
def BuildRunTests(self, ctx, node, HTML):
|
||||||
lSourcePath = self.eNBSourceCodePath
|
lSourcePath = self.eNBSourceCodePath
|
||||||
logging.debug('Building on server: ' + node)
|
logging.debug('Building on server: ' + node)
|
||||||
cmd = cls_cmd.getConnection(node)
|
cmd = cls_cmd.RemoteCmd(node)
|
||||||
cmd.cd(lSourcePath)
|
cmd.cd(lSourcePath)
|
||||||
|
|
||||||
|
ret = cmd.run('hostnamectl')
|
||||||
|
result = re.search('Ubuntu', ret.stdout)
|
||||||
|
host = result.group(0)
|
||||||
|
if host != 'Ubuntu':
|
||||||
|
cmd.close()
|
||||||
|
raise Exception("Can build unit tests only on Ubuntu server")
|
||||||
|
logging.debug('running on Ubuntu as expected')
|
||||||
|
|
||||||
# check that ran-base image exists as we expect it
|
# check that ran-base image exists as we expect it
|
||||||
baseImage = 'ran-base'
|
baseImage = 'ran-base'
|
||||||
baseTag = 'develop'
|
baseTag = 'develop'
|
||||||
if self.ranAllowMerge:
|
if self.ranAllowMerge:
|
||||||
if self.ranTargetBranch == 'develop':
|
if self.ranTargetBranch == 'develop':
|
||||||
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base.ubuntu | grep --colour=never -i INDEX')
|
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base{self.dockerfileprefix} | grep --colour=never -i INDEX')
|
||||||
result = re.search('index', cmd.getBefore())
|
result = re.search('index', cmd.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
baseTag = 'ci-temp'
|
baseTag = 'ci-temp'
|
||||||
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
||||||
if ret.returncode != 0:
|
if ret.returncode != 0:
|
||||||
logging.error(f'No {baseImage} image present, cannot build tests')
|
logging.error(f'No {baseImage} image present, cannot build tests')
|
||||||
HTML.CreateHtmlTestRow("Unit test build failed", 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# build ran-unittests image
|
# build ran-unittests image
|
||||||
|
dockerfile = "ci-scripts/docker/Dockerfile.unittest.ubuntu"
|
||||||
logfile = f'{lSourcePath}/cmake_targets/log/unittest-build.log'
|
logfile = f'{lSourcePath}/cmake_targets/log/unittest-build.log'
|
||||||
ret = cmd.run(f'docker build --progress=plain --tag ran-unittests:{baseTag} --file ci-scripts/{dockerfile} . &> {logfile}')
|
ret = cmd.run(f'docker build --progress=plain --tag ran-unittests:{baseTag} --file {dockerfile} . &> {logfile}')
|
||||||
|
|
||||||
archiveArtifact(cmd, ctx, logfile)
|
archiveArtifact(cmd, ctx, logfile)
|
||||||
if ret.returncode != 0:
|
if ret.returncode != 0:
|
||||||
logging.error(f'Cannot build unit tests')
|
logging.error(f'Cannot build unit tests')
|
||||||
@@ -495,7 +601,7 @@ class Containerize():
|
|||||||
# I would like to run it with --rm and mount the ctest result directory to avoid 'docker cp'
|
# I would like to run it with --rm and mount the ctest result directory to avoid 'docker cp'
|
||||||
# below, but then permissions are messed up and we can't remove the directory without sudo
|
# below, but then permissions are messed up and we can't remove the directory without sudo
|
||||||
# making the next pipeline fail
|
# making the next pipeline fail
|
||||||
ret = cmd.run(f'docker run -a STDOUT {runtime_opt} --workdir /oai-ran/build/ --env LD_LIBRARY_PATH=/oai-ran/build/ --name ran-unittests ran-unittests:{baseTag} ctest --no-label-summary -j$(nproc) {ctest_opt}')
|
ret = cmd.run(f'docker run -a STDOUT --workdir /oai-ran/build/ --env LD_LIBRARY_PATH=/oai-ran/build/ --name ran-unittests ran-unittests:{baseTag} ctest --no-label-summary -j$(nproc)')
|
||||||
cmd.run('docker cp ran-unittests:/oai-ran/build/Testing/Temporary/LastTest.log .')
|
cmd.run('docker cp ran-unittests:/oai-ran/build/Testing/Temporary/LastTest.log .')
|
||||||
archiveArtifact(cmd, ctx, f'{lSourcePath}/LastTest.log')
|
archiveArtifact(cmd, ctx, f'{lSourcePath}/LastTest.log')
|
||||||
cmd.run('docker cp ran-unittests:/oai-ran/build/Testing/Temporary/LastTestsFailed.log .')
|
cmd.run('docker cp ran-unittests:/oai-ran/build/Testing/Temporary/LastTestsFailed.log .')
|
||||||
@@ -684,7 +790,7 @@ class Containerize():
|
|||||||
wd_yaml = f'{wd}/docker-compose.y*ml'
|
wd_yaml = f'{wd}/docker-compose.y*ml'
|
||||||
with cls_cmd.getConnection(node) as ssh:
|
with cls_cmd.getConnection(node) as ssh:
|
||||||
ExistEnvFilePrint(ssh, wd)
|
ExistEnvFilePrint(ssh, wd)
|
||||||
services = [s for s, _ in GetDeployedServices(ssh, wd_yaml)]
|
services = GetDeployedServices(ssh, wd_yaml)
|
||||||
success = []
|
success = []
|
||||||
fail = []
|
fail = []
|
||||||
for s in reqServices:
|
for s in reqServices:
|
||||||
@@ -702,7 +808,7 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.services, 'KO', [f'Failed stopping {" ".join(fail)}, succeeded {" ".join(success)}'])
|
HTML.CreateHtmlTestRowQueue(self.services, 'KO', [f'Failed stopping {" ".join(fail)}, succeeded {" ".join(success)}'])
|
||||||
return success
|
return success
|
||||||
|
|
||||||
def UndeployObject(self, ctx, node, HTML, to_analyze):
|
def UndeployObject(self, ctx, node, HTML, RAN):
|
||||||
lSourcePath = self.eNBSourceCodePath
|
lSourcePath = self.eNBSourceCodePath
|
||||||
logging.info(f'\u001B[1m Undeploying all objects from server {node}\u001B[0m')
|
logging.info(f'\u001B[1m Undeploying all objects from server {node}\u001B[0m')
|
||||||
yaml = self.yamlPath.strip('/')
|
yaml = self.yamlPath.strip('/')
|
||||||
@@ -711,55 +817,23 @@ class Containerize():
|
|||||||
with cls_cmd.getConnection(node) as ssh:
|
with cls_cmd.getConnection(node) as ssh:
|
||||||
ExistEnvFilePrint(ssh, wd)
|
ExistEnvFilePrint(ssh, wd)
|
||||||
services = GetDeployedServices(ssh, wd_yaml)
|
services = GetDeployedServices(ssh, wd_yaml)
|
||||||
all_logs = True
|
copyin_res = None
|
||||||
ssh.run(f'docker compose -f {wd_yaml} stop')
|
ssh.run(f'docker compose -f {wd_yaml} stop')
|
||||||
if services is not None:
|
if services is not None:
|
||||||
service_desc = {}
|
copyin_res = [CopyinServiceLog(ssh, lSourcePath, s, wd_yaml, ctx) for s in services]
|
||||||
for s, c in services:
|
|
||||||
ret = ssh.run(f'docker inspect {c} --format="{{{{.State.ExitCode}}}}"')
|
|
||||||
rc = int(ret.stdout.strip())
|
|
||||||
f = CopyinServiceLog(ssh, lSourcePath, s, wd_yaml, ctx)
|
|
||||||
all_logs = all_logs and f is not None
|
|
||||||
service_desc[s] = {'returncode': rc, 'logfile': f}
|
|
||||||
else:
|
else:
|
||||||
logging.warning('could not identify services to stop => no log file')
|
logging.warning('could not identify services to stop => no log file')
|
||||||
ssh.run(f'docker compose -f {wd_yaml} down -v')
|
ssh.run(f'docker compose -f {wd_yaml} down -v')
|
||||||
HTML.CreateHtmlTestRowQueue(node, 'OK', ['Undeployment successful'])
|
|
||||||
ssh.run(f'rm {wd}/.env')
|
ssh.run(f'rm {wd}/.env')
|
||||||
if not all_logs:
|
if not copyin_res:
|
||||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ['Could not copy logfile(s)'])
|
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ['Could not copy logfile(s)'])
|
||||||
logging.error(f"could not copy all files: {all_logs=} {services=}")
|
logging.error(f"could not copy all files: {copyin_res=} {services=}")
|
||||||
success = False
|
success = False
|
||||||
else:
|
else:
|
||||||
success = cls_analysis.AnalyzeServices(HTML, service_desc, to_analyze)
|
log_results = [CheckLogs(self, f, HTML, RAN) for f in copyin_res]
|
||||||
|
success = all(log_results)
|
||||||
if success:
|
if success:
|
||||||
logging.info('\u001B[1m Undeploying objects Pass\u001B[0m')
|
logging.info('\u001B[1m Undeploying objects Pass\u001B[0m')
|
||||||
else:
|
else:
|
||||||
logging.error('\u001B[1m Undeploying objects Failed\u001B[0m')
|
logging.error('\u001B[1m Undeploying objects Failed\u001B[0m')
|
||||||
return success
|
return success
|
||||||
|
|
||||||
def AnalyzeRTStatsObject(self, HTML, node, ctx, thresholds, service=None):
|
|
||||||
logging.info(f'Analyzing realtime stats from server: {node}')
|
|
||||||
yaml = self.yamlPath.strip('/')
|
|
||||||
wd = f'{self.eNBSourceCodePath}/{yaml}'
|
|
||||||
wd_yaml = f'{wd}/docker-compose.y*ml'
|
|
||||||
|
|
||||||
with cls_cmd.getConnection(node) as cmd:
|
|
||||||
services = GetDeployedServices(cmd, wd_yaml)
|
|
||||||
if not services:
|
|
||||||
raise RuntimeError("No deployed docker compose services found")
|
|
||||||
deployed_services = [s for s, _ in services]
|
|
||||||
s = service or deployed_services[0] # choose first service if not provided
|
|
||||||
if s not in deployed_services:
|
|
||||||
raise RuntimeError(f"Requested service {s} not found among services: {deployed_services}")
|
|
||||||
logging.info(f"Analyzing deployed service '{s}'")
|
|
||||||
# similar to BuildRunTests(), use docker cp to avoid problems with permissions
|
|
||||||
cmd.run(f'docker compose -f {wd_yaml} cp {s}:/opt/oai-gnb/nrL1_stats.log {wd}/')
|
|
||||||
l1_file = archiveArtifact(cmd, ctx, f"{wd}/nrL1_stats.log")
|
|
||||||
cmd.run(f'docker compose -f {wd_yaml} cp {s}:/opt/oai-gnb/nrMAC_stats.log {wd}/')
|
|
||||||
mac_file = archiveArtifact(cmd, ctx, f"{wd}/nrMAC_stats.log")
|
|
||||||
|
|
||||||
logging.info(f"check against thresholds from {thresholds}")
|
|
||||||
success, datalog_rt_stats = cls_analysis.Analysis.analyze_rt_stats(thresholds, l1_file, mac_file)
|
|
||||||
HTML.CreateHtmlDataLogTable(datalog_rt_stats)
|
|
||||||
return success
|
|
||||||
|
|||||||
@@ -1,5 +1,22 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Required Python Version
|
# Required Python Version
|
||||||
|
|||||||
@@ -1,141 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
import re
|
|
||||||
import os
|
|
||||||
import logging
|
|
||||||
from collections import deque
|
|
||||||
|
|
||||||
class Default:
|
|
||||||
def run(file, opt=None):
|
|
||||||
success = True
|
|
||||||
logs = []
|
|
||||||
with open(file, "r") as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
result = re.search('[Aa]ssertion', line)
|
|
||||||
if result:
|
|
||||||
logs.append(line)
|
|
||||||
success = False
|
|
||||||
return success, "\n".join(logs)
|
|
||||||
|
|
||||||
class ContainsString:
|
|
||||||
def run(file, needle):
|
|
||||||
with open(file, "r") as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
if re.search(needle, line):
|
|
||||||
return True, ""
|
|
||||||
return False, f"could not find '{needle}' in logs"
|
|
||||||
|
|
||||||
class LastLineContains:
|
|
||||||
def run(file, string):
|
|
||||||
with open(file, "r") as f:
|
|
||||||
last_line = deque(f, maxlen=1).pop()
|
|
||||||
success = string in last_line
|
|
||||||
log = "" if success else f"could not find '{string}' in last line"
|
|
||||||
return success, log
|
|
||||||
|
|
||||||
class EndsWithBye:
|
|
||||||
def run(file, option):
|
|
||||||
# no option: we ignore any
|
|
||||||
with open(file, "r") as f:
|
|
||||||
n = 0
|
|
||||||
for line in reversed(f.readlines()):
|
|
||||||
if re.search(r'^Bye.\n', line, re.MULTILINE) is not None:
|
|
||||||
return True, ""
|
|
||||||
n = n + 1
|
|
||||||
if n > 50: # if not found in last 50 lines, assume it does not exist
|
|
||||||
break
|
|
||||||
return False, "No Bye. message found, did not stop properly"
|
|
||||||
|
|
||||||
class RetxCheck():
|
|
||||||
def _parseList(s):
|
|
||||||
if not s:
|
|
||||||
return []
|
|
||||||
return [int(n) for n in s.split(",")]
|
|
||||||
|
|
||||||
def _get_ul_dl(s):
|
|
||||||
dl, ul = (None, None)
|
|
||||||
for o in s.split(";", 1):
|
|
||||||
if o.startswith("dl="):
|
|
||||||
dl = o[3:]
|
|
||||||
elif o.startswith("ul="):
|
|
||||||
ul = o[3:]
|
|
||||||
else:
|
|
||||||
raise ValueError(f"unrecognized option {s}: needs format '[ul=,dl=]X,Y,...[;ul=Z,V,...]'")
|
|
||||||
return dl, ul
|
|
||||||
|
|
||||||
def _parseRetxCheckers(options):
|
|
||||||
if not "=" in options:
|
|
||||||
dlul = RetxCheck._parseList(options)
|
|
||||||
return dlul, dlul
|
|
||||||
dl, ul = RetxCheck._get_ul_dl(options)
|
|
||||||
return RetxCheck._parseList(dl), RetxCheck._parseList(ul)
|
|
||||||
|
|
||||||
def _analyzeUeRetx(rounds, checkers, regex):
|
|
||||||
perc = list(0 for i in checkers) # results in %
|
|
||||||
stats = list(False for i in checkers) # status if succeeded
|
|
||||||
tmp = re.match(regex, rounds)
|
|
||||||
if tmp is None:
|
|
||||||
logging.error('_analyzeUeRetx: did not match regex for DL retx analysis')
|
|
||||||
return stats
|
|
||||||
retx_data = [float(x) for x in tmp.groups()]
|
|
||||||
for i in range(0, len(perc)):
|
|
||||||
#case where numerator > denumerator with denum ==0 is disregarded, cannot hapen in principle, will lead to 0%
|
|
||||||
perc[i] = 0 if (retx_data[i] == 0) else 100 * retx_data[i + 1] / retx_data[i]
|
|
||||||
#treating % > 100 , % > requirement
|
|
||||||
stats[i] = perc[i] <= 100 and perc[i] <= checkers[i]
|
|
||||||
return stats
|
|
||||||
|
|
||||||
def _filter_retx_rounds(l):
|
|
||||||
# map to round number if False, else None
|
|
||||||
l = [i+1 if x is False else None for i, x in enumerate(l)]
|
|
||||||
# filter out None
|
|
||||||
return [x for x in l if x is not None]
|
|
||||||
|
|
||||||
def run(file, options):
|
|
||||||
# aggregate statistics per UE
|
|
||||||
dlsch_ulsch_stats = {}
|
|
||||||
status = True
|
|
||||||
with open(file, "r") as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
keys = {'dlsch_rounds','ulsch_rounds'}
|
|
||||||
for k in keys:
|
|
||||||
result = re.search(k, line)
|
|
||||||
if result is None:
|
|
||||||
continue
|
|
||||||
result = re.search('UE (?:RNTI )?([0-9a-f]{4})', line)
|
|
||||||
if result is None:
|
|
||||||
logging.error(f'did not find RNTI while matching key {k}')
|
|
||||||
status = False
|
|
||||||
continue
|
|
||||||
rnti = result.group(1)
|
|
||||||
if not rnti in dlsch_ulsch_stats:
|
|
||||||
dlsch_ulsch_stats[rnti] = {}
|
|
||||||
dlsch_ulsch_stats[rnti][k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
|
||||||
|
|
||||||
dl, ul = RetxCheck._parseRetxCheckers(options)
|
|
||||||
msgs = []
|
|
||||||
for ue in dlsch_ulsch_stats:
|
|
||||||
dlulstat = dlsch_ulsch_stats[ue]
|
|
||||||
|
|
||||||
for key in dlulstat:
|
|
||||||
msgs.append(dlulstat[key])
|
|
||||||
|
|
||||||
retx_dl = RetxCheck._analyzeUeRetx(dlulstat['dlsch_rounds'], dl, r'^.*dlsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+dlsch_errors\s+(\d+)')
|
|
||||||
retx_ul = RetxCheck._analyzeUeRetx(dlulstat['ulsch_rounds'], ul, r'^.*ulsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+ulsch_errors\s+(\d+)')
|
|
||||||
|
|
||||||
if False in retx_dl or False in retx_ul:
|
|
||||||
dlstr = RetxCheck._filter_retx_rounds(retx_dl)
|
|
||||||
ulstr = RetxCheck._filter_retx_rounds(retx_ul)
|
|
||||||
msg = f"UE {ue}: retx rounds"
|
|
||||||
if dlstr:
|
|
||||||
msg = f"{msg} DL {dlstr}"
|
|
||||||
if ulstr:
|
|
||||||
msg = f"{msg} UL {ulstr}"
|
|
||||||
msg = f"{msg} exceeded threshold"
|
|
||||||
msgs.append('!!! Failure: ' + msg)
|
|
||||||
logging.error(f'\u001B[1;37;41m {msg}\u001B[0m')
|
|
||||||
status = False
|
|
||||||
else:
|
|
||||||
msg = f"UE {ue} retransmissions within bounds"
|
|
||||||
logging.debug(msg)
|
|
||||||
return status, "\n".join(msgs)
|
|
||||||
@@ -1,5 +1,22 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Required Python Version
|
# Required Python Version
|
||||||
@@ -94,10 +111,11 @@ class Module_UE:
|
|||||||
return self._collectTrace(ctx)
|
return self._collectTrace(ctx)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def attach(self, attach_tries = 3, attach_timeout = 40):
|
def attach(self, attach_tries = 3, attach_timeout = 0):
|
||||||
ip = None
|
ip = None
|
||||||
while attach_tries > 0:
|
while attach_tries > 0:
|
||||||
self._command(self.cmd_dict["attach"])
|
self._command(self.cmd_dict["attach"])
|
||||||
|
attach_timeout += 20
|
||||||
timeout = attach_timeout
|
timeout = attach_timeout
|
||||||
logging.debug("Waiting for IP address to be assigned")
|
logging.debug("Waiting for IP address to be assigned")
|
||||||
ip = self.getIP(silent=False, reportNonZero=True)
|
ip = self.getIP(silent=False, reportNonZero=True)
|
||||||
@@ -108,7 +126,6 @@ class Module_UE:
|
|||||||
if ip:
|
if ip:
|
||||||
break
|
break
|
||||||
logging.warning(f"UE did not receive IP address after {attach_timeout} s, detaching")
|
logging.warning(f"UE did not receive IP address after {attach_timeout} s, detaching")
|
||||||
attach_timeout += 20
|
|
||||||
attach_tries -= 1
|
attach_tries -= 1
|
||||||
self._command(self.cmd_dict["detach"])
|
self._command(self.cmd_dict["detach"])
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
|||||||
@@ -1,4 +1,24 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
@@ -14,8 +34,9 @@ DPDK_PATH = '/opt/dpdk-t2-22.11.0'
|
|||||||
|
|
||||||
class Native():
|
class Native():
|
||||||
|
|
||||||
def Build(ctx, node, HTML, directory, options):
|
def Build(ctx, node, test_case, HTML, directory, options):
|
||||||
logging.debug(f'Building on server: {node}')
|
logging.debug(f'Building on server: {node}')
|
||||||
|
HTML.testCase_id = test_case
|
||||||
|
|
||||||
with cls_cmd.getConnection(node) as ssh:
|
with cls_cmd.getConnection(node) as ssh:
|
||||||
base = f"{directory}/cmake_targets"
|
base = f"{directory}/cmake_targets"
|
||||||
|
|||||||
+110
-8
@@ -1,5 +1,23 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
# Python for CI of OAI-eNB + COTS-UE
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
#
|
#
|
||||||
@@ -49,7 +67,7 @@ class HTMLManagement():
|
|||||||
self.htmlUEFailureMsg = ''
|
self.htmlUEFailureMsg = ''
|
||||||
|
|
||||||
self.startTime = int(round(time.time() * 1000))
|
self.startTime = int(round(time.time() * 1000))
|
||||||
self.testCaseIdx = ''
|
self.testCase_id = ''
|
||||||
self.desc = ''
|
self.desc = ''
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -173,7 +191,7 @@ class HTMLManagement():
|
|||||||
self.htmlFile.write(' <table class="table" border = "1">\n')
|
self.htmlFile.write(' <table class="table" border = "1">\n')
|
||||||
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
|
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
|
||||||
self.htmlFile.write(' <th style="width:5%">Relative Time (s)</th>\n')
|
self.htmlFile.write(' <th style="width:5%">Relative Time (s)</th>\n')
|
||||||
self.htmlFile.write(' <th style="width:5%">Test Index</th>\n')
|
self.htmlFile.write(' <th style="width:5%">Test Id</th>\n')
|
||||||
self.htmlFile.write(' <th>Test Desc</th>\n')
|
self.htmlFile.write(' <th>Test Desc</th>\n')
|
||||||
self.htmlFile.write(' <th>Test Options</th>\n')
|
self.htmlFile.write(' <th>Test Options</th>\n')
|
||||||
self.htmlFile.write(' <th style="width:5%">Test Status</th>\n')
|
self.htmlFile.write(' <th style="width:5%">Test Status</th>\n')
|
||||||
@@ -200,7 +218,7 @@ class HTMLManagement():
|
|||||||
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__//' test_results.html"
|
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__//' test_results.html"
|
||||||
subprocess.run(cmd, shell=True)
|
subprocess.run(cmd, shell=True)
|
||||||
else:
|
else:
|
||||||
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + r"__/<span class=\"glyphicon glyphicon-remove\"><\/span>/' test_results.html"
|
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-remove\"><\/span>/' test_results.html"
|
||||||
subprocess.run(cmd, shell=True)
|
subprocess.run(cmd, shell=True)
|
||||||
self.htmlFooterCreated = False
|
self.htmlFooterCreated = False
|
||||||
|
|
||||||
@@ -229,7 +247,7 @@ class HTMLManagement():
|
|||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' </table>\n')
|
self.htmlFile.write(' </table>\n')
|
||||||
self.htmlFile.write(' <p></p>\n')
|
self.htmlFile.write(' <p></p>\n')
|
||||||
self.htmlFile.write(' <div class="well well-lg">End of Test Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2026 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
|
self.htmlFile.write(' <div class="well well-lg">End of Test Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2025 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
|
||||||
self.htmlFile.write('</div></body>\n')
|
self.htmlFile.write('</div></body>\n')
|
||||||
self.htmlFile.write('</html>\n')
|
self.htmlFile.write('</html>\n')
|
||||||
self.htmlFile.close()
|
self.htmlFile.close()
|
||||||
@@ -241,7 +259,7 @@ class HTMLManagement():
|
|||||||
currentTime = int(round(time.time() * 1000)) - self.startTime
|
currentTime = int(round(time.time() * 1000)) - self.startTime
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + format(currentTime / 1000, '.1f') + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + format(currentTime / 1000, '.1f') + '</td>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCaseIdx + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCase_id + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
||||||
if (str(status) == 'OK'):
|
if (str(status) == 'OK'):
|
||||||
@@ -356,7 +374,7 @@ class HTMLManagement():
|
|||||||
addOrangeBK = False
|
addOrangeBK = False
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + format(currentTime / 1000, '.1f') + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + format(currentTime / 1000, '.1f') + '</td>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCaseIdx + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCase_id + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
||||||
if (str(status) == 'OK'):
|
if (str(status) == 'OK'):
|
||||||
@@ -379,6 +397,90 @@ class HTMLManagement():
|
|||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.close()
|
self.htmlFile.close()
|
||||||
|
|
||||||
|
def CreateHtmlTestRowCppCheckResults(self, CCR):
|
||||||
|
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
||||||
|
return
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
vId = 0
|
||||||
|
for version in CCR.versions:
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
||||||
|
self.htmlFile.write(' <td colspan="6"><b> Results for cppcheck v ' + version + ' </b></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> NB ERRORS</b></td>\n')
|
||||||
|
if CCR.nbErrors[vId] == 0:
|
||||||
|
myColor = 'lightgreen'
|
||||||
|
elif CCR.nbErrors[vId] < 20:
|
||||||
|
myColor = 'orange'
|
||||||
|
else:
|
||||||
|
myColor = 'lightcoral'
|
||||||
|
self.htmlFile.write(' <td colspan="3" bgcolor = "' + myColor + '"><b>' + str(CCR.nbErrors[vId]) + '</b></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> NB WARNINGS</b></td>\n')
|
||||||
|
if CCR.nbWarnings[vId] == 0:
|
||||||
|
myColor = 'lightgreen'
|
||||||
|
elif CCR.nbWarnings[vId] < 20:
|
||||||
|
myColor = 'orange'
|
||||||
|
else:
|
||||||
|
myColor = 'lightcoral'
|
||||||
|
self.htmlFile.write(' <td colspan="3" bgcolor = "' + myColor + '"><b>' + str(CCR.nbWarnings[vId]) + '</b></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
||||||
|
self.htmlFile.write(' <td colspan="6"> ----------------- </td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Memory leak</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbMemLeaks[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Possible null pointer deference</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbNullPtrs[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Uninitialized variable</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbUninitVars[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Undefined behaviour shifting</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbTooManyBitsShift[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Signed integer overflow</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbIntegerOverflow[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
||||||
|
self.htmlFile.write(' <td colspan="6"> </td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Printf formatting issues</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbInvalidPrintf[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Modulo result is predetermined</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbModuloAlways[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Opposite Condition -> dead code</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbOppoInnerCondition[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Wrong Scanf Nb Args</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbWrongScanfArg[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
vId += 1
|
||||||
|
|
||||||
def CreateHtmlTestRowPhySimTestResult(self, testSummary, testResult):
|
def CreateHtmlTestRowPhySimTestResult(self, testSummary, testResult):
|
||||||
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
||||||
return
|
return
|
||||||
|
|||||||
+295
-3
@@ -1,5 +1,23 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@@ -14,6 +32,7 @@
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Import Libs
|
# Import Libs
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
import sys # arg
|
||||||
import re # reg
|
import re # reg
|
||||||
import time # sleep
|
import time # sleep
|
||||||
import os
|
import os
|
||||||
@@ -22,6 +41,7 @@ import concurrent.futures
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
#import our libs
|
#import our libs
|
||||||
|
import helpreadme as HELP
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
|
|
||||||
import cls_module
|
import cls_module
|
||||||
@@ -235,7 +255,7 @@ def Deploy_Physim(ctx, HTML, node, workdir, script, options):
|
|||||||
logging.debug(f'Running physims on server {node} workdir {workdir}')
|
logging.debug(f'Running physims on server {node} workdir {workdir}')
|
||||||
with cls_cmd.getConnection(node) as c:
|
with cls_cmd.getConnection(node) as c:
|
||||||
sys_info = c.exec_script("scripts/sys-info.sh", 5)
|
sys_info = c.exec_script("scripts/sys-info.sh", 5)
|
||||||
ret = c.exec_script(script, 1500, options)
|
ret = c.exec_script(script, 1000, options)
|
||||||
logging.debug(f'"{script}" finished with code {ret.returncode}, output:\n{ret.stdout}')
|
logging.debug(f'"{script}" finished with code {ret.returncode}, output:\n{ret.stdout}')
|
||||||
HTML.CreateHtmlTestRowQueue('Query system info', 'OK', [sys_info.stdout])
|
HTML.CreateHtmlTestRowQueue('Query system info', 'OK', [sys_info.stdout])
|
||||||
with cls_cmd.getConnection(node) as ssh:
|
with cls_cmd.getConnection(node) as ssh:
|
||||||
@@ -281,6 +301,7 @@ class OaiCiTest():
|
|||||||
self.iperf_profile = ''
|
self.iperf_profile = ''
|
||||||
self.iperf_tcp_rate_target = ''
|
self.iperf_tcp_rate_target = ''
|
||||||
self.finalStatus = False
|
self.finalStatus = False
|
||||||
|
self.air_interface=''
|
||||||
self.ue_ids = []
|
self.ue_ids = []
|
||||||
self.svr_node = None
|
self.svr_node = None
|
||||||
self.svr_id = None
|
self.svr_id = None
|
||||||
@@ -558,6 +579,277 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', [f'{ue_header}\n{msg}'])
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', [f'{ue_header}\n{msg}'])
|
||||||
return success
|
return success
|
||||||
|
|
||||||
|
def AnalyzeLogFile_UE(self, UElogFile,HTML,RAN):
|
||||||
|
if (not os.path.isfile(f'{UElogFile}')):
|
||||||
|
return -1
|
||||||
|
ue_log_file = open(f'{UElogFile}', 'r')
|
||||||
|
exitSignalReceived = False
|
||||||
|
foundAssertion = False
|
||||||
|
msgAssertion = ''
|
||||||
|
msgLine = 0
|
||||||
|
foundSegFault = False
|
||||||
|
foundRealTimeIssue = False
|
||||||
|
uciStatMsgCount = 0
|
||||||
|
pdcpDataReqFailedCount = 0
|
||||||
|
badDciCount = 0
|
||||||
|
f1aRetransmissionCount = 0
|
||||||
|
fatalErrorCount = 0
|
||||||
|
macBsrTimerExpiredCount = 0
|
||||||
|
rrcConnectionRecfgComplete = 0
|
||||||
|
no_cell_sync_found = False
|
||||||
|
mib_found = False
|
||||||
|
frequency_found = False
|
||||||
|
plmn_found = False
|
||||||
|
nrUEFlag = False
|
||||||
|
nrDecodeMib = 0
|
||||||
|
nrFoundDCI = 0
|
||||||
|
nrCRCOK = 0
|
||||||
|
mbms_messages = 0
|
||||||
|
nbPduSessAccept = 0
|
||||||
|
nbPduDiscard = 0
|
||||||
|
HTML.htmlUEFailureMsg=''
|
||||||
|
global_status = CONST.ALL_PROCESSES_OK
|
||||||
|
for line in ue_log_file.readlines():
|
||||||
|
result = re.search('nr_synchro_time|Starting NR UE soft modem', str(line))
|
||||||
|
sidelink = re.search('sl-mode', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nrUEFlag = True
|
||||||
|
if sidelink is not None:
|
||||||
|
nrUEFlag = False
|
||||||
|
if nrUEFlag:
|
||||||
|
result = re.search('decode mib', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nrDecodeMib += 1
|
||||||
|
result = re.search('found 1 DCIs', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nrFoundDCI += 1
|
||||||
|
result = re.search('CRC OK', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nrCRCOK += 1
|
||||||
|
result = re.search('Received PDU Session Establishment Accept', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nbPduSessAccept += 1
|
||||||
|
result = re.search('warning: discard PDU, sn out of window', str(line))
|
||||||
|
if result is not None:
|
||||||
|
nbPduDiscard += 1
|
||||||
|
result = re.search('--nfapi STANDALONE_PNF --node-number 2', str(line))
|
||||||
|
if result is not None:
|
||||||
|
frequency_found = True
|
||||||
|
result = re.search('Exiting OAI softmodem', str(line))
|
||||||
|
if result is not None:
|
||||||
|
exitSignalReceived = True
|
||||||
|
result = re.search('System error|[Ss]egmentation [Ff]ault|======= Backtrace: =========|======= Memory map: ========', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundSegFault = True
|
||||||
|
result = re.search('[Cc]ore [dD]ump', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundSegFault = True
|
||||||
|
result = re.search('[Aa]ssertion', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundAssertion = True
|
||||||
|
result = re.search('LLL', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
foundRealTimeIssue = True
|
||||||
|
if foundAssertion and (msgLine < 3):
|
||||||
|
msgLine += 1
|
||||||
|
msgAssertion += str(line)
|
||||||
|
result = re.search('uci->stat', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
uciStatMsgCount += 1
|
||||||
|
result = re.search('PDCP data request failed', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
pdcpDataReqFailedCount += 1
|
||||||
|
result = re.search('bad DCI 1', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
badDciCount += 1
|
||||||
|
result = re.search('Format1A Retransmission but TBS are different', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
f1aRetransmissionCount += 1
|
||||||
|
result = re.search('FATAL ERROR', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
fatalErrorCount += 1
|
||||||
|
result = re.search('MAC BSR Triggered ReTxBSR Timer expiry', str(line))
|
||||||
|
if result is not None and not exitSignalReceived:
|
||||||
|
macBsrTimerExpiredCount += 1
|
||||||
|
result = re.search('Generating RRCConnectionReconfigurationComplete', str(line))
|
||||||
|
if result is not None:
|
||||||
|
rrcConnectionRecfgComplete += 1
|
||||||
|
# No cell synchronization found, abandoning
|
||||||
|
result = re.search('No cell synchronization found, abandoning', str(line))
|
||||||
|
if result is not None:
|
||||||
|
no_cell_sync_found = True
|
||||||
|
if RAN.eNBmbmsEnables[0]:
|
||||||
|
result = re.search('TRIED TO PUSH MBMS DATA', str(line))
|
||||||
|
if result is not None:
|
||||||
|
mbms_messages += 1
|
||||||
|
result = re.search(r"MIB Information => ([a-zA-Z]{1,10}), ([a-zA-Z]{1,10}), NidCell (?P<nidcell>\d{1,3}), N_RB_DL (?P<n_rb_dl>\d{1,3}), PHICH DURATION (?P<phich_duration>\d), PHICH RESOURCE (?P<phich_resource>.{1,4}), TX_ANT (?P<tx_ant>\d)", str(line))
|
||||||
|
if result is not None and (not mib_found):
|
||||||
|
try:
|
||||||
|
mibMsg = "MIB Information: " + result.group(1) + ', ' + result.group(2)
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + '\n'
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
mibMsg = " nidcell = " + result.group('nidcell')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
mibMsg = " n_rb_dl = " + result.group('n_rb_dl')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + '\n'
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
mibMsg = " phich_duration = " + result.group('phich_duration')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
mibMsg = " phich_resource = " + result.group('phich_resource')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + '\n'
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
mibMsg = " tx_ant = " + result.group('tx_ant')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + '\n'
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
mib_found = True
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'\033[91m MIB marker was not found \033[0m')
|
||||||
|
result = re.search("Initial sync: pbch decoded sucessfully", str(line))
|
||||||
|
if result is not None and (not frequency_found):
|
||||||
|
try:
|
||||||
|
mibMsg = f"UE decoded PBCH successfully"
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + '\n'
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
frequency_found = True
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'\033[91m UE did not find PBCH\033[0m')
|
||||||
|
result = re.search(r"PLMN MCC (?P<mcc>\d{1,3}), MNC (?P<mnc>\d{1,3}), TAC", str(line))
|
||||||
|
if result is not None and (not plmn_found):
|
||||||
|
try:
|
||||||
|
mibMsg = f"PLMN MCC = {result.group('mcc')} MNC = {result.group('mnc')}"
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + '\n'
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
plmn_found = True
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'\033[91m PLMN not found \033[0m')
|
||||||
|
result = re.search(r"Found (?P<operator>[\w,\s]{1,15}) \(name from internal table\)", str(line))
|
||||||
|
if result is not None:
|
||||||
|
try:
|
||||||
|
mibMsg = f"The operator is: {result.group('operator')}"
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + '\n'
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'\033[91m Operator name not found \033[0m')
|
||||||
|
result = re.search("SIB5 InterFreqCarrierFreq element (.{1,4})/(.{1,4})", str(line))
|
||||||
|
if result is not None:
|
||||||
|
try:
|
||||||
|
mibMsg = f'SIB5 InterFreqCarrierFreq element {result.group(1)}/{result.group(2)}'
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + mibMsg + ' -> '
|
||||||
|
logging.debug(f'\033[94m{mibMsg}\033[0m')
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'\033[91m SIB5 InterFreqCarrierFreq element not found \033[0m')
|
||||||
|
result = re.search(r"DL Carrier Frequency/ARFCN : \-*(?P<carrier_frequency>\d{1,15}/\d{1,4})", str(line))
|
||||||
|
if result is not None:
|
||||||
|
try:
|
||||||
|
freq = result.group('carrier_frequency')
|
||||||
|
new_freq = re.sub('/[0-9]+','',freq)
|
||||||
|
float_freq = float(new_freq) / 1000000
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + 'DL Freq: ' + ('%.1f' % float_freq) + ' MHz'
|
||||||
|
logging.debug(f'\033[94m DL Carrier Frequency is: {freq}\033[0m')
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'\033[91m DL Carrier Frequency not found \033[0m')
|
||||||
|
result = re.search(r"AllowedMeasBandwidth : (?P<allowed_bandwidth>\d{1,7})", str(line))
|
||||||
|
if result is not None:
|
||||||
|
try:
|
||||||
|
prb = result.group('allowed_bandwidth')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + ' -- PRB: ' + prb + '\n'
|
||||||
|
logging.debug(f'\033[94m AllowedMeasBandwidth: {prb}\033[0m')
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f'\033[91m AllowedMeasBandwidth not found \033[0m')
|
||||||
|
ue_log_file.close()
|
||||||
|
if rrcConnectionRecfgComplete > 0:
|
||||||
|
statMsg = f'UE connected to eNB ({rrcConnectionRecfgComplete}) RRCConnectionReconfigurationComplete message(s) generated)'
|
||||||
|
logging.debug(f'\033[94m{statMsg}\033[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if nrUEFlag:
|
||||||
|
if nrDecodeMib > 0:
|
||||||
|
statMsg = f'UE showed {nrDecodeMib} "MIB decode" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if nrFoundDCI > 0:
|
||||||
|
statMsg = f'UE showed {nrFoundDCI} "DCI found" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if nrCRCOK > 0:
|
||||||
|
statMsg = f'UE showed {nrCRCOK} "PDSCH decoding" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if not frequency_found:
|
||||||
|
statMsg = 'NR-UE could NOT synch!'
|
||||||
|
logging.error(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if nbPduSessAccept > 0:
|
||||||
|
statMsg = f'UE showed {nbPduSessAccept} "Received PDU Session Establishment Accept" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if nbPduDiscard > 0:
|
||||||
|
statMsg = f'UE showed {nbPduDiscard} "warning: discard PDU, sn out of window" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if uciStatMsgCount > 0:
|
||||||
|
statMsg = f'UE showed {uciStatMsgCount} "uci->stat" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if pdcpDataReqFailedCount > 0:
|
||||||
|
statMsg = f'UE showed {pdcpDataReqFailedCount} "PDCP data request failed" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if badDciCount > 0:
|
||||||
|
statMsg = f'UE showed {badDciCount} "bad DCI 1(A)" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if f1aRetransmissionCount > 0:
|
||||||
|
statMsg = f'UE showed {f1aRetransmissionCount} "Format1A Retransmission but TBS are different" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if fatalErrorCount > 0:
|
||||||
|
statMsg = f'UE showed {fatalErrorCount} "FATAL ERROR:" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if macBsrTimerExpiredCount > 0:
|
||||||
|
statMsg = f'UE showed {fatalErrorCount} "MAC BSR Triggered ReTxBSR Timer expiry" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if RAN.eNBmbmsEnables[0]:
|
||||||
|
if mbms_messages > 0:
|
||||||
|
statMsg = f'UE showed {mbms_messages} "TRIED TO PUSH MBMS DATA" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;43m{statMsg}\u001B[0m')
|
||||||
|
else:
|
||||||
|
statMsg = 'UE did NOT SHOW "TRIED TO PUSH MBMS DATA" message(s)'
|
||||||
|
logging.debug(f'\u001B[1;30;41m{statMsg}\u001B[0m')
|
||||||
|
global_status = CONST.OAI_UE_PROCESS_NO_MBMS_MSGS
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
|
||||||
|
if foundSegFault:
|
||||||
|
logging.debug('\u001B[1;37;41m UE ended with a Segmentation Fault! \u001B[0m')
|
||||||
|
if not nrUEFlag:
|
||||||
|
global_status = CONST.OAI_UE_PROCESS_SEG_FAULT
|
||||||
|
else:
|
||||||
|
if not frequency_found:
|
||||||
|
global_status = CONST.OAI_UE_PROCESS_SEG_FAULT
|
||||||
|
if foundAssertion:
|
||||||
|
logging.debug('\u001B[1;30;43m UE showed an assertion! \u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + 'UE showed an assertion!\n'
|
||||||
|
if not nrUEFlag:
|
||||||
|
if not mib_found or not frequency_found:
|
||||||
|
global_status = CONST.OAI_UE_PROCESS_ASSERTION
|
||||||
|
else:
|
||||||
|
if not frequency_found:
|
||||||
|
global_status = CONST.OAI_UE_PROCESS_ASSERTION
|
||||||
|
if foundRealTimeIssue:
|
||||||
|
logging.debug('\u001B[1;37;41m UE faced real time issues! \u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + 'UE faced real time issues!\n'
|
||||||
|
if nrUEFlag:
|
||||||
|
if not frequency_found:
|
||||||
|
global_status = CONST.OAI_UE_PROCESS_COULD_NOT_SYNC
|
||||||
|
else:
|
||||||
|
if no_cell_sync_found and not mib_found:
|
||||||
|
logging.debug('\u001B[1;37;41m UE could not synchronize ! \u001B[0m')
|
||||||
|
HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + 'UE could not synchronize!\n'
|
||||||
|
global_status = CONST.OAI_UE_PROCESS_COULD_NOT_SYNC
|
||||||
|
return global_status
|
||||||
|
|
||||||
def TerminateUE(self, ctx, node, HTML):
|
def TerminateUE(self, ctx, node, HTML):
|
||||||
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
|
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
|
||||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||||
|
|||||||
@@ -1,5 +1,23 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
# Python for CI of OAI-eNB + COTS-UE
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
#
|
#
|
||||||
@@ -27,30 +45,163 @@ import constants as CONST
|
|||||||
import cls_cmd
|
import cls_cmd
|
||||||
from cls_ci_helper import archiveArtifact
|
from cls_ci_helper import archiveArtifact
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Class Declaration
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
class CppCheckResults():
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
self.variants = ['bionic', 'focal']
|
||||||
|
self.versions = ['','']
|
||||||
|
self.nbErrors = [0,0]
|
||||||
|
self.nbWarnings = [0,0]
|
||||||
|
self.nbNullPtrs = [0,0]
|
||||||
|
self.nbMemLeaks = [0,0]
|
||||||
|
self.nbUninitVars = [0,0]
|
||||||
|
self.nbInvalidPrintf = [0,0]
|
||||||
|
self.nbModuloAlways = [0,0]
|
||||||
|
self.nbTooManyBitsShift = [0,0]
|
||||||
|
self.nbIntegerOverflow = [0,0]
|
||||||
|
self.nbWrongScanfArg = [0,0]
|
||||||
|
self.nbPtrAddNotNull = [0,0]
|
||||||
|
self.nbOppoInnerCondition = [0,0]
|
||||||
|
|
||||||
class StaticCodeAnalysis():
|
class StaticCodeAnalysis():
|
||||||
|
|
||||||
def LicenceAndFormattingCheck(ctx, node, HTML, d, branch, allowMerge, targetBranch):
|
def __init__(self):
|
||||||
|
|
||||||
|
self.ranRepository = ''
|
||||||
|
self.ranBranch = ''
|
||||||
|
self.ranAllowMerge = False
|
||||||
|
self.ranCommitID = ''
|
||||||
|
self.ranTargetBranch = ''
|
||||||
|
self.eNBSourceCodePath = ''
|
||||||
|
|
||||||
|
def CppCheckAnalysis(self, ctx, node, HTML):
|
||||||
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
|
||||||
|
if not lSourcePath or not node:
|
||||||
|
raise ValueError(f"{lSourcePath=} {node=}")
|
||||||
|
logging.debug('Building on server: ' + node)
|
||||||
|
cmd = cls_cmd.getConnection(node)
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
# 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'
|
||||||
|
|
||||||
|
cmd.cd(lSourcePath)
|
||||||
|
logDir = f'{lSourcePath}/cmake_targets/log'
|
||||||
|
cmd.run(f'mkdir -p {logDir}')
|
||||||
|
cmd.run('docker image rm oai-cppcheck:bionic oai-cppcheck:focal')
|
||||||
|
cmd.run(f'sed -e "s@xenial@bionic@" {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.xenial > {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.bionic')
|
||||||
|
cmd.run(f'docker build --tag oai-cppcheck:bionic --file {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.bionic . > {logDir}/cppcheck-bionic.txt 2>&1')
|
||||||
|
cmd.run(f'sed -e "s@xenial@focal@" {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.xenial > {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.focal')
|
||||||
|
cmd.run(f'docker build --tag oai-cppcheck:focal --file {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.focal . > {logDir}/cppcheck-focal.txt 2>&1')
|
||||||
|
cmd.run('docker image rm oai-cppcheck:bionic oai-cppcheck:focal')
|
||||||
|
|
||||||
|
bionic = archiveArtifact(cmd, ctx, f'{logDir}/cppcheck-bionic.txt')
|
||||||
|
focal = archiveArtifact(cmd, ctx, f'{logDir}/cppcheck-focal.txt')
|
||||||
|
cmd.close()
|
||||||
|
|
||||||
|
CCR = CppCheckResults()
|
||||||
|
CCR_ref = CppCheckResults()
|
||||||
|
vId = 0
|
||||||
|
for variant in CCR.variants:
|
||||||
|
filename = ctx.baseFilename() + '-cppcheck-'+ variant + '.txt'
|
||||||
|
logging.info(f"will check file '{filename}'")
|
||||||
|
if not os.path.isfile(filename):
|
||||||
|
raise FileNotFoundError(f"{filename} is not a file")
|
||||||
|
else:
|
||||||
|
xmlStart = False
|
||||||
|
with open(filename, 'r') as logfile:
|
||||||
|
for line in logfile:
|
||||||
|
ret = re.search('cppcheck version="(?P<version>[0-9\.]+)"', str(line))
|
||||||
|
if ret is not None:
|
||||||
|
CCR.versions[vId] = ret.group('version')
|
||||||
|
if re.search('RUN cat cmake_targets/log/cppcheck.xml', str(line)) is not None:
|
||||||
|
xmlStart = True
|
||||||
|
if xmlStart:
|
||||||
|
if re.search('severity="error"', str(line)) is not None:
|
||||||
|
CCR.nbErrors[vId] += 1
|
||||||
|
if re.search('severity="warning"', str(line)) is not None:
|
||||||
|
CCR.nbWarnings[vId] += 1
|
||||||
|
if re.search('id="memleak"', str(line)) is not None:
|
||||||
|
CCR.nbMemLeaks[vId] += 1
|
||||||
|
if re.search('id="nullPointer"', str(line)) is not None:
|
||||||
|
CCR.nbNullPtrs[vId] += 1
|
||||||
|
if re.search('id="uninitvar"', str(line)) is not None:
|
||||||
|
CCR.nbUninitVars[vId] += 1
|
||||||
|
if re.search('id="invalidPrintfArgType_sint"|id="invalidPrintfArgType_uint"', str(line)) is not None:
|
||||||
|
CCR.nbInvalidPrintf[vId] += 1
|
||||||
|
if re.search('id="moduloAlwaysTrueFalse"', str(line)) is not None:
|
||||||
|
CCR.nbModuloAlways[vId] += 1
|
||||||
|
if re.search('id="shiftTooManyBitsSigned"', str(line)) is not None:
|
||||||
|
CCR.nbTooManyBitsShift[vId] += 1
|
||||||
|
if re.search('id="integerOverflow"', str(line)) is not None:
|
||||||
|
CCR.nbIntegerOverflow[vId] += 1
|
||||||
|
if re.search('id="wrongPrintfScanfArgNum"|id="invalidScanfArgType_int"', str(line)) is not None:
|
||||||
|
CCR.nbWrongScanfArg[vId] += 1
|
||||||
|
if re.search('id="pointerAdditionResultNotNull"', str(line)) is not None:
|
||||||
|
CCR.nbPtrAddNotNull[vId] += 1
|
||||||
|
if re.search('id="oppositeInnerCondition"', str(line)) is not None:
|
||||||
|
CCR.nbOppoInnerCondition[vId] += 1
|
||||||
|
vMsg = ''
|
||||||
|
vMsg += '======== Variant ' + variant + ' - ' + CCR.versions[vId] + ' ========\n'
|
||||||
|
vMsg += ' ' + str(CCR.nbErrors[vId]) + ' errors\n'
|
||||||
|
vMsg += ' ' + str(CCR.nbWarnings[vId]) + ' warnings\n'
|
||||||
|
vMsg += ' -- Details --\n'
|
||||||
|
vMsg += ' Memory leak: ' + str(CCR.nbMemLeaks[vId]) + '\n'
|
||||||
|
vMsg += ' Possible null pointer deference: ' + str(CCR.nbNullPtrs[vId]) + '\n'
|
||||||
|
vMsg += ' Uninitialized variable: ' + str(CCR.nbUninitVars[vId]) + '\n'
|
||||||
|
vMsg += ' Undefined behaviour shifting: ' + str(CCR.nbTooManyBitsShift[vId]) + '\n'
|
||||||
|
vMsg += ' Signed integer overflow: ' + str(CCR.nbIntegerOverflow[vId]) + '\n'
|
||||||
|
vMsg += '\n'
|
||||||
|
vMsg += ' Printf formatting issue: ' + str(CCR.nbInvalidPrintf[vId]) + '\n'
|
||||||
|
vMsg += ' Modulo result is predetermined: ' + str(CCR.nbModuloAlways[vId]) + '\n'
|
||||||
|
vMsg += ' Opposite Condition -> dead code: ' + str(CCR.nbOppoInnerCondition[vId]) + '\n'
|
||||||
|
vMsg += ' Wrong Scanf Nb Args: ' + str(CCR.nbWrongScanfArg[vId]) + '\n'
|
||||||
|
for vLine in vMsg.split('\n'):
|
||||||
|
logging.debug(vLine)
|
||||||
|
vId += 1
|
||||||
|
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTestRowCppCheckResults(CCR)
|
||||||
|
logging.info('\u001B[1m Static Code Analysis Pass\u001B[0m')
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def LicenceAndFormattingCheck(self, ctx, node, HTML):
|
||||||
# Workspace is no longer recreated from scratch.
|
# Workspace is no longer recreated from scratch.
|
||||||
# It implies that this method shall be called last within a build pipeline
|
# It implies that this method shall be called last within a build pipeline
|
||||||
# where workspace is already created
|
# where workspace is already created
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
|
||||||
if not node or not d:
|
if not node or not lSourcePath:
|
||||||
raise ValueError(f"{d=} {node=}")
|
raise ValueError(f"{lSourcePath=} {node=}")
|
||||||
logging.debug('Building on server: ' + node)
|
logging.debug('Building on server: ' + node)
|
||||||
cmd = cls_cmd.getConnection(node)
|
cmd = cls_cmd.getConnection(node)
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
|
||||||
check_options = ''
|
check_options = ''
|
||||||
if allowMerge:
|
if self.ranAllowMerge:
|
||||||
check_options = f'--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH={branch}'
|
check_options = f'--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH={self.ranBranch}'
|
||||||
if targetBranch == '':
|
if self.ranTargetBranch == '':
|
||||||
if branch != 'develop' and branch != 'origin/develop':
|
if self.ranBranch != 'develop' and self.ranBranch != 'origin/develop':
|
||||||
check_options += ' --build-arg TARGET_BRANCH=develop'
|
check_options += ' --build-arg TARGET_BRANCH=develop'
|
||||||
else:
|
else:
|
||||||
check_options += f' --build-arg TARGET_BRANCH={targetBranch}'
|
check_options += f' --build-arg TARGET_BRANCH={self.ranTargetBranch}'
|
||||||
|
|
||||||
logDir = f'{d}/cmake_targets/log/'
|
logDir = f'{lSourcePath}/cmake_targets/log/'
|
||||||
cmd.run(f'mkdir -p {logDir}')
|
cmd.run(f'mkdir -p {logDir}')
|
||||||
cmd.run('docker image rm oai-formatting-check:latest')
|
cmd.run('docker image rm oai-formatting-check:latest')
|
||||||
cmd.run(f'docker build --target oai-formatting-check --tag oai-formatting-check:latest {check_options} --file {d}/ci-scripts/docker/Dockerfile.formatting.ubuntu {d} > {logDir}/oai-formatting-check.txt 2>&1')
|
cmd.run(f'docker build --target oai-formatting-check --tag oai-formatting-check:latest {check_options} --file {lSourcePath}/ci-scripts/docker/Dockerfile.formatting.ubuntu {lSourcePath} > {logDir}/oai-formatting-check.txt 2>&1')
|
||||||
|
|
||||||
cmd.run('docker image rm oai-formatting-check:latest')
|
cmd.run('docker image rm oai-formatting-check:latest')
|
||||||
cmd.run('docker image prune --force')
|
cmd.run('docker image prune --force')
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
# Colosseum Automated Testing
|
# Colosseum Automated Testing
|
||||||
|
|
||||||
These scripts are used by a Jenkins [job](../Jenkinsfile-colosseum) to trigger automated testing of OpenAirInterface (OAI) gNB and softUE on the [Colosseum](https://www.northeastern.edu/colosseum/) Open RAN digital twin.
|
These scripts are used by a Jenkins [job](../Jenkinsfile-colosseum) to trigger automated testing of OpenAirInterface (OAI) gNB and softUE on the [Colosseum](https://www.northeastern.edu/colosseum/) Open RAN digital twin.
|
||||||
|
|||||||
@@ -1,5 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
set -xeu
|
set -xeu
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
# Configuration files: naming style guide
|
# Configuration files: naming style guide
|
||||||
|
|
||||||
The configuration files should have the following name format:
|
The configuration files should have the following name format:
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
#/* configuration for channel modelisation */
|
#/* configuration for channel modelisation */
|
||||||
#/* To be included in main config file when */
|
#/* To be included in main config file when */
|
||||||
#/* channel modelisation is used (rfsimulator with chanmod options enabled) */
|
#/* channel modelisation is used (rfsimulator with chanmod options enabled) */
|
||||||
@@ -11,20 +9,29 @@ channelmod = {
|
|||||||
model_name = "rfsimu_channel_enB0"
|
model_name = "rfsimu_channel_enB0"
|
||||||
type = "AWGN";
|
type = "AWGN";
|
||||||
ploss_dB = 0;
|
ploss_dB = 0;
|
||||||
noise_power_dB = -10;
|
noise_power_dB = -60;
|
||||||
forgetfact = 0;
|
# forgetfact = 0;
|
||||||
offset = 0;
|
# offset = 0;
|
||||||
ds_tdl = 0;
|
# ds_tdl = 0;
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
model_name = "rfsimu_channel_ue0"
|
model_name = "rfsimu_channel_ue0"
|
||||||
type = "AWGN";
|
type = "AWGN";
|
||||||
ploss_dB = 0;
|
# ploss_dB = 0;
|
||||||
noise_power_dB = 0;
|
# noise_power_dB = -30;
|
||||||
forgetfact = 0;
|
# forgetfact = 0;
|
||||||
offset = 0;
|
# offset = 0;
|
||||||
ds_tdl = 0;
|
# ds_tdl = 0;
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
model_name = "rfsimu_channel_ue2"
|
||||||
|
type = "AWGN";
|
||||||
|
# ploss_dB = 0;
|
||||||
|
# noise_power_dB = 0;
|
||||||
|
# forgetfact = 0;
|
||||||
|
# offset = 0;
|
||||||
|
# ds_tdl = 0;
|
||||||
|
}
|
||||||
);
|
);
|
||||||
modellist_rfsimu_2 = (
|
modellist_rfsimu_2 = (
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "rcc-in-docker");
|
Active_eNBs = ( "rcc-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "rcc-in-docker");
|
Active_eNBs = ( "rcc-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
RUs =
|
RUs =
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
RUs =
|
RUs =
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -202,11 +200,9 @@ RUs = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
rfsimulator = (
|
rfsimulator: {
|
||||||
{
|
|
||||||
serveraddr = "server";
|
serveraddr = "server";
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
THREAD_STRUCT = (
|
THREAD_STRUCT = (
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-B38");
|
Active_eNBs = ( "eNB-Eurecom-B38");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-B38");
|
Active_eNBs = ( "eNB-Eurecom-B38");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
-2
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-B38");
|
Active_eNBs = ( "eNB-Eurecom-B38");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-in-docker");
|
Active_eNBs = ( "eNB-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom_LTEBox");
|
Active_eNBs = ( "eNB-Eurecom_LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -235,11 +233,9 @@ RUs =
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
rfsimulator = (
|
rfsimulator: {
|
||||||
{
|
|
||||||
serveraddr = "server";
|
serveraddr = "server";
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
THREAD_STRUCT =
|
THREAD_STRUCT =
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-in-docker");
|
Active_eNBs = ( "eNB-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "enb-l2sim-vnf");
|
Active_eNBs = ( "enb-l2sim-vnf");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -235,11 +233,9 @@ RUs =
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
rfsimulator = (
|
rfsimulator: {
|
||||||
{
|
|
||||||
serveraddr = "server";
|
serveraddr = "server";
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
THREAD_STRUCT =
|
THREAD_STRUCT =
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -235,11 +233,9 @@ RUs =
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
rfsimulator = (
|
rfsimulator: {
|
||||||
{
|
|
||||||
serveraddr = "server";
|
serveraddr = "server";
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
THREAD_STRUCT =
|
THREAD_STRUCT =
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-in-docker");
|
Active_eNBs = ( "eNB-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-in-docker");
|
Active_eNBs = ( "eNB-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-in-docker");
|
Active_eNBs = ( "eNB-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -235,11 +233,9 @@ RUs =
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
rfsimulator = (
|
rfsimulator: {
|
||||||
{
|
|
||||||
serveraddr = "server";
|
serveraddr = "server";
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
THREAD_STRUCT =
|
THREAD_STRUCT =
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-in-docker");
|
Active_eNBs = ( "eNB-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -364,11 +362,9 @@ RUs = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
rfsimulator = (
|
rfsimulator: {
|
||||||
{
|
|
||||||
serveraddr = "server";
|
serveraddr = "server";
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
THREAD_STRUCT = (
|
THREAD_STRUCT = (
|
||||||
{
|
{
|
||||||
|
|||||||
-2
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_eNBs = ( "eNB-in-docker");
|
Active_eNBs = ( "eNB-in-docker");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -215,7 +213,6 @@ L1s =
|
|||||||
(
|
(
|
||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
prach_dtx_threshold = 200;
|
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_gNBs = ( "cu-rfsim");
|
Active_gNBs = ( "cu-rfsim");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
@@ -17,7 +15,6 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
||||||
cu_sibs = ( 2, 3, 4 );
|
|
||||||
@include "neighbour-config.conf"
|
@include "neighbour-config.conf"
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
@@ -43,7 +40,6 @@ gNBs =
|
|||||||
|
|
||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
|
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.150";
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.150";
|
||||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.71.150";
|
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.71.150";
|
||||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
Active_gNBs = ( "gNB-Eurecom-CU");
|
Active_gNBs = ( "gNB-Eurecom-CU");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user