...
Table of Contents |
---|
minLevel | 1 |
---|
maxLevel | 6 |
---|
outline | false |
---|
style | default |
---|
type | list |
---|
printable | true |
---|
|
Requirements
Maven 3
Java 17
Docker and Docker Compose
The Code, which can be cloned here
Building
Once the code is cloned and requirements installed you should be able to start building TEIV and its components.
To build TEIV and its components with tests run the following command in the first /teiv
directory:
Code Block |
---|
|
mvn clean install |
Building with tests should provide with the following docker images:
o-ran-sc/smo-teiv-ingestion:0.1.0-SNAPSHOT
o-ran-sc/smo-teiv-ingestion:latest
o-ran-sc/smo-teiv-exposure:0.1.0-SNAPSHOT
o-ran-sc/smo-teiv-exposure :latest
postgis/postgis:13-3.4-alpine
debian:bullseye-slim
testcontainers/ryuk:0.5.1
To build without tests run the following command in the first /teiv
directory (significantly faster):
Code Block |
---|
mvn clean install -Dmaven.test.skip=true |
Building without tests should provide with the following docker images:
...
o-ran-sc/smo-teiv-ingestion:0.1.0-SNAPSHOT
...
o-ran-sc/smo-teiv-ingestion:latest
...
o-ran-sc/smo-teiv-exposure:0.1.0-SNAPSHOT
Running
To run TEIV with your models pgsql-schema-generator is provided to generate PostgresSQL schemes from the YANG models which can be used in TEIV.
First of all you need the pgsql-schema-generator which can be generated by the following:
Building is a far more time consuming process and may lead to errors.
TEIV with pgsql-schema-generator
Things you should know:
If using you own YANG models place them in a new directory generate-defaults
in docker-compose/
AND delete the default sql schemas in docker-compose/sql_scripts
if you are generating your own sql schemes with different YANG models, compared to the default YANG, the example events will not work, therefore kafka-producer
must be commented out in the docker-compose.yml OR you can replace the example events with your own data
the pgsql-schema-generator may fail due to a permission error if the docker-compose/sql_scripts
to fix this you can run sudo chmod -R 777 sql_scripts/
In the /teiv/docker-compose directory run the following code to bring TEIV up:
Code Block |
---|
docker-compose up |
Running 'docker ps -a’ should show the following docker containers:
kafka-producer confluentinc/cp-kafka:7.6.1 (optional - automatically populates TEIV)
pgsql-schema-generator o-ran-sc/smo-teiv-exposure:latestdebian:bullseye-slim
Running
...
...
TEIV
In the /teiv/docker-compose directory run the following code to bring TEIV up:
Code Block |
---|
docker-compose up |
Running 'docker ps -a’ should show the following docker containers:
kafka-producer confluentinc/cp-kafka:latest (optional - if you want to generate your own sql schemas)
kafka confluentinc/cp-kafka:7.6.1
kafka2 confluentinc/cp-kafka:7.6.1
kafka kafka3 confluentinc/cp-kafka:7.6.1kafka2
topology-ingestion-inventory o-ran-sc/smo-teiv-ingestion:latest
topology-exposure-inventory o-ran-sc/smo-teiv-exposure:latest
zookeeper confluentinc/cp-kafkazookeeper:76.62.1
kafka3 confluentinc/cp-kafka:7.6.1
topology-ingestion-inventory o-ran-sc/smo-teiv-ingestion:latest
topology-exposure-inventory o-ran-sc/smo-teiv-exposure:latest
zookeeper confluentinc/cp-zookeeper:6.2.1
dbpostgresql postgis/postgis:13-3.4-alpine
Once running there are some sample queries to try at Sample TEIV Queries
The /teiv/docker-compose
directory has everything needed to get TEIV up and running consisting of the following files and directories:
...
docker-compose.yml - contains all the services needed to run TEIV
sql_scripts - contains the sql scripts produced by the pgsql-schema-generator
cloudEventProducer - contains a cloudEventProducer script that will produce kafka events to populate TEIV by running locally, cloudEventProducerForDockerCompose used for the kafka-producer
service in docker-compomse.yml and the actual events are in the events directory
copySqlSchemaFromPgsqlGenerator.sh - copies the sql schema generated from pgsql-schema-generator to the sql_scripts directory, renaming and replacing placeholders.
In docker-compose.yml there is an optional kafka-producer
service which will automatically run the cloudEventProducerForDockerCompose script to populate TEIV. Can comment out if this is not desired.
pgsql-schema-generator
The default sql scripts in sql_scripts were built from TEIVs default yang models provided in /teiv/teiv/src/main/resources/models using the pgsql-schema-generator.
To run pgsql-schema-generator yourself, using the default YANG models or your own YANG models, copy YANG models into the /teiv/pgsql-schema-generator/src/main/resources/generate-defaults
directory and from /teiv/pgsql-schema-generator/
run:
Code Block |
---|
mvn exec:java -Dexec.mainClass="org.oran.smo.teiv.pgsqlgenerator.DatabaseSchemaGeneratorApplication" |
Once run successfully the sql schemas should be present in /teiv/pgsql-schema-generator/target
(highlighted in red below) and graphs representing the entities and relationships of the YANG models in /teiv/pgsql-schema-generator/target/graphs
(highlighted in blue below):
...
There is a script in /teiv/docker-compose
, copySqlSchemaFromPgsqlGenerator.sh that will copy the generated sql schemes to /teiv/docker-compose/sql_scripts
, rename them, and replace the placeholders.
...
dbpostgresql postgis/postgis:13-3.4-alpine
Once running there are some sample queries to try at Sample TEIV Queries
The /teiv/docker-compose
directory has everything needed to get TEIV up and running consisting of the following files and directories:
...
docker-compose.yml - contains all the services needed to run TEIV
sql_scripts - contains the sql scripts produced by the pgsql-schema-generator and a script used in the dbpostgresql container to check if the sql schemas are present
cloudEventProducer - contains a cloudEventProducer script that will produce kafka events to populate TEIV by running locally, cloudEventProducerForDockerCompose used for the kafka-producer
service in docker-compomse.yml and the actual events are in the events directory
generate-defaults - is an optional directory where you put your own YANG files to generate your own custom sql schemas from pgsql-schema-generator
copySqlSchemaFromPgsqlGenerator.sh - copies the sql schema generated from pgsql-schema-generator to the sql_scripts directory, renaming and replacing placeholders.
In docker-compose.yml there is an optional services:
kafka-producer
which will automatically run the cloudEventProducerForDockerCompose script to populate TEIV. Can comment out if this is not desired.
pgsql-schema-generator
which will generate sql schemas from your YANG files at docker-compose/generate-defaults
to docker-compose/sql_scripts
and use them automatically
...
pgsql-schema-generator locally
If successful built the files highlighted in green/yellow should be present.
The default sql scripts in /docker-compose/sql_scripts
were built from TEIVs default yang models provided in /teiv/teiv/src/main/resources/models
using the pgsql-schema-generator.
To run pgsql-schema-generator yourself, using the default YANG models or your own YANG models, copy YANG models into the /teiv/pgsql-schema-generator/src/main/resources/generate-defaults
directory and from /teiv/pgsql-schema-generator/
run:
Code Block |
---|
mvn exec:java -Dexec.mainClass="org.oran.smo.teiv.pgsqlgenerator.DatabaseSchemaGeneratorApplication" |
Once run successfully the sql schemas should be present in /teiv/pgsql-schema-generator/target
(highlighted in red below) and graphs representing the entities and relationships of the YANG models in /teiv/pgsql-schema-generator/target/graphs
(highlighted in blue below):
...
Example
Using data from the OAM network_generator and using the YANG changes below we can see how to do these steps in practise.
Expand |
---|
title | o-ran-smo-teiv-ran.yang changes to make |
---|
|
Code Block |
---|
module o-ran-smo-teiv-ran {
yang-version 1.1;
namespace "urn:o-ran:smo-teiv-ran";
prefix or-teiv-ran;
import o-ran-smo-teiv-common-yang-types {prefix or-teiv-types; }
import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }
import _3gpp-common-yang-types { prefix types3gpp; }
import ietf-geo-location {
prefix geo;
reference "RFC 9179: A YANG Grouping for Geographic Locations";
}
organization "ORAN";
contact "The Authors";
description
"RAN Logical topology model.
This model contains the topology entities and relations in the
RAN Logical domain, which represents the functional capability
of the deployed RAN that are relevant to rApps use cases.
Copyright (C) 2024 Ericsson
Modifications Copyright (C) 2024 OpenInfra Foundation Europe
Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
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.
SPDX-License-Identifier: Apache-2.0";
revision "2024-11-12" {
description "This revision introduces SMO and O1 interface";
or-teiv-yext:label 0.6.0;
}
revision "2024-11-08" {
description "This revision introduces E2 and Open Fronthaul interfaces";
or-teiv-yext:label 0.5.0;
}
revision "2024-10-08" {
description "Added range for azimuth attribute of Sector.";
or-teiv-yext:label 0.6.0;
}
revision "2024-10-04" {
description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp
to the corresponding topology object.";
or-teiv-yext:label 0.5.0;
}
revision "2024-07-15" {
description "This revision aligns O-RAN Work Group 10 Stage 2 Specification (O-RAN.WG10.TE&IV-CIMI.0-R004.v02.00)";
or-teiv-yext:label 0.4.0;
}
revision "2024-05-24" {
description "Initial revision.";
or-teiv-yext:label 0.3.0;
}
or-teiv-yext:domain RAN;
list SMO {
description "Service Management and Orchestration (SMO).
A centralized component responsible for the management, orchestration,
and automation of the entire RAN infrastructure. SMO enables flexible,
software-driven network control and is critical for enabling the open,
interoperable, and disaggregated approach that defines O-RAN.
In the O-RAN architecture, the SMO is part of the management and
orchestration layer, sitting above the RAN elements like the RU, DU,
and CU. It communicates with the RAN using open interfaces,
particularly O1 and A1 interfaces";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf smoName {
description "Name of the SMO";
type string;
}
}
}
list ORUFunction {
description "O-RAN Radio Unit (O-RU).
A logical node hosting Low-PHY layer and RF processing based on a
lower layer functional split. This is similar to 3GPP’s “TRP” or
“RRH” but more specific in including the Low-PHY layer (FFT/iFFT,
PRACH extraction). The O-RU terminates the Open Fronthaul interface
(also known as LLS interface) as well as Low-PHY functions of the
radio interface towards the UE. This is deployed as a PNF. The O-RU
terminates the Open Fronthaul M-Plane interface towards the O-DU
and SMO.
Note: In Topology, you can create, read, update, and delete
the O-RU object.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf oruId {
description "Unique identifier for the O-RU within a ORUFunction";
type int64;
}
}
}
list NearRTRICFunction {
description "Near-Real-Time RAN Intelligent Controller (Near-RT RIC).
An O-RAN Network Function (NF) that enables near-real-time control
and optimization of RAN elements and resources via fine-grained
data collection and actions over E2 interface. It may include
AI/ML (Artificial Intelligence / Machine Learning) workflow
including model training, inference, and updates.
Note: In Topology, you can create, read, update, and delete
the Near-RT RIC object.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf nearRtRicId {
description "Unique identifier for the Near-RT RIC within a NearRTRICFunction";
type int64;
}
container pLMNId {
description "PLMN identifier to be used as part of global RAN
node identity";
uses types3gpp:PLMNId;
}
}
}
list ODUFunction {
description "O-RAN Distributed Unit (O-DU).
The O-DU is an O-RAN NF in the O-RAN Architecture. An O-DU, combined
with one or more O-RU(s) connected to it, supports and is fully
compatible with the functions of a gNB-DU as defined by 3GPP TS 38.401.
The following is true for a O-DU:
Is connected to the O-CU-CP through the F1-C interface. Is
connected to the O-CU-UP through the F1-U interface. One O-DU is
connected to only one O-CU-CP. One O-DU can be connected to
multiple O-CU-UPs under the control of the same O-CU-CP.
Note: A gNB may consist of a O-CU-CP, multiple O-CU-UPs and
multiple O-DUs. O-DU is a concrete class that extends the NG-RAN
node object. In Topology, you can create, read, update, and delete
the gNB-DU object.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
container dUpLMNId {
description "PLMN identifier used as part of PM Events data";
uses types3gpp:PLMNId;
}
leaf gNBDUId {
description "Unique identifier for the DU within a gNodeB";
type int64;
}
leaf gNBId {
description "Identity of gNodeB within a PLMN";
type int64;
}
leaf gNBIdLength {
description "Length of gNBId bit string representation";
type int32;
}
}
}
list OCUCPFunction {
description "O-RAN Centralized Unit Control Plane (O-CU-CP)
This is a logical node hosting the Radio Resource Control (RRC) and
the control plane part of the Packet Data Convergence Protocol
(PDCP). The O-CU-CP terminates the E1 interface connected with
the O-CU-UP and the F1-C interface connected with the O-RAN
Distributed Unit (O-DU).
The following is true for a O-CU-CP:
Is connected to the O-DU through the F1-C interface. Is connected
to the O-CU-UP through the E1 interface. Only one O-CU-CP is
connected to one O-DU. Only one O-CU-CP is connected to one
O-CU-UP. One O-DU can be connected to multiple O-CU-UPs under
the control of the same O-CU-CP. One O-CU-UP can be connected to
multiple DUs under the control of the same O-CU-CP.
Note: A gNB may consist of a O-CU-CP, multiple O-CU-UPs and
multiple O-DUs. An O-CU-CP is a concrete class that extends the
NG-RAN node object. In Topology, you can create, read, update, and
delete the O-CU-CP object.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf gNBCUName {
description "Name of gNodeB-CU";
type string;
}
leaf gNBId {
description "Identity of gNodeB within a PLMN";
type int64;
}
leaf gNBIdLength {
description "Length of gNBId bit string representation";
type int32;
}
container pLMNId {
description "PLMN identifier to be used as part of global RAN
node identity";
uses types3gpp:PLMNId;
}
}
}
list OCUUPFunction {
description "O-RAN Centralized Unit User Plane (O-CU-UP)
An O-CU-UP is a logical node hosting the User Plane part of the
Packet Data Convergence Protocol (PDCP) and the Service Data
Adaptation Protocol (SDAP). The O-CU-UP terminates the E1 interface
connected with the O-CU-CP and the F1-U interface connected with
the O-RAN Distributed Unit (O-DU).
The following is true for a O-CU-UP:
Is connected to the O-DU through the F1-U interface. Is connected
to the O-CU-CP through the E1 interface. One O-CU-UP is
connected to only one O-CU-CP. One O-DU can be connected to
multiple O-CU-UPs under the control of the same O-CU-CP. One
O-CU-UP can be connected to multiple DUs under the control of the
same O-CU-CP.
Note: A gNB may consist of an O-CU-CP, multiple O-CU-UPs and
multiple O-DUs. An O-CU-UP is a concrete class that extends the
NG-RAN node object. In Topology, you can create, read, update, and
delete the O-CU-UP object.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf gNBId {
description "Identity of gNodeB within a PLMN";
type int64;
}
leaf gNBIdLength {
description "Length of gNBId bit string representation";
type int32;
}
list pLMNIdList {
description "List of PLMN identifier to be used as part of global RAN node identity";
uses types3gpp:PLMNId;
}
}
}
list NRCellCU {
description "Represents an NR Cell in gNodeB-CU.
5G NR is a new radio access technology (RAT) developed by 3GPP for
the 5G (fifth generation) mobile network. It is designed to be the
global standard for the air interface of 5G networks.
5G NR has synchronization signal that is known as Primary
Synchronization Signal (PSS) and Secondary Synchronization
Signal (SSS). These signals are specific to NR physical layer and
provide the following information required by UE for downlink
synchronization: PSS provides Radio Frame Boundary (Position of 1st
Symbol in a Radio frame) SSS provides Subframe Boundary (Position of
1st Symbol in a Subframe) Physical Layer Cell ID (PCI) information
using both PSS and SSS.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf cellLocalId {
description "Used together with gNodeB identifier to identify NR
cell in PLMN. Used together with gNBId to form NCI.";
type int32;
}
container plmnId {
description "PLMN ID for NR CGI. If empty,
GNBCUCPFunction::pLMNId is used for PLMN ID in NR CGI";
uses types3gpp:PLMNId;
}
leaf nCI {
description "NR Cell Identity";
type int64;
}
leaf nRTAC {
description "NR Tracking Area Code (TAC)";
type int32;
}
}
}
list NRCellDU {
description "Represents an NR Cell in gNodeB-DU.
5G NR is a new radio access technology (RAT) developed by 3GPP for
the 5G (fifth generation) mobile network. It is designed to be the
global standard for the air interface of 5G networks.
5G NR has synchronization signal that is known as Primary
Synchronization signal (PSS) and Secondary Synchronization signal
(SSS). These signals are specific to NR physical layer and provide
the following information required by UE for downlink
synchronization: PSS provides Radio Frame Boundary (Position of 1st
Symbol in a Radio frame) SSS provides Subframe Boundary (Position of
1st Symbol in a Subframe) Physical Layer Cell ID (PCI) information
using both PSS and SSS.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf cellLocalId {
description "Used together with gNodeB identifier to identify NR
cell in PLMN. Used together with gNBId to form NCI.";
type int32;
}
leaf nCI {
description "NR Cell Identity.";
type int64;
}
leaf nRPCI {
description "The Physical Cell Identity (PCI) of the NR cell.";
type int32;
}
leaf nRTAC {
description "NR Tracking Area Code (TAC).";
type int32;
}
}
}
list NRSectorCarrier {
description "The NR Sector Carrier object provides the attributes for
defining the logical characteristics of a carrier (cell) in a
sector. A sector is a coverage area associated with a base station
having its own antennas, radio ports, and control channels. The
concept of sectors was developed to improve co-channel interference
in cellular systems, and most wireless systems use three sector
cells.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf arfcnDL {
description "NR Absolute Radio Frequency Channel Number
(NR-ARFCN) for downlink";
type int32;
}
leaf arfcnUL {
description "NR Absolute Radio frequency Channel Number
(NR-ARFCN) for uplink.";
type int32;
}
leaf frequencyDL {
description "RF Reference Frequency of downlink channel";
type int32;
}
leaf frequencyUL {
description "RF Reference Frequency of uplink channel";
type int32;
}
leaf bSChannelBwDL {
description "BS Channel bandwidth in MHz for downlink.";
type int32;
}
}
}
list AntennaCapability {
description "This MO serves as a mapping between the cell and the RBS
equipment used to provide coverage in a certain geographical area.
The MO also controls the maximum output power of the sector.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf-list eUtranFqBands {
description "List of LTE frequency bands that associated
hardware supports";
type string;
}
leaf-list geranFqBands {
description "List of GERAN frequency bands that associated
hardware supports";
type string;
}
leaf-list nRFqBands {
description "List of NR frequency bands associated hardware
supports";
type string;
}
}
}
list Sector {
description "A group of co-located Cells that have a shared
coverage area.";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Entity_Mapping_Grp;
key id;
container attributes {
leaf sectorId {
description "Universally unique ID generated by the sector's
discovery mechanism.";
type uint64;
}
uses geo:geo-location;
leaf azimuth {
description "Average value of the azimuths of the cells
comprising the sector, determined during sector discovery.";
type decimal64{
fraction-digits 1;
range "0..360";
}
units "decimal degrees";
}
}
}
or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_PROVIDES_NRCELLDU { // 1 to 0..n
description
"The aSide of this relationship is an instance of the ODUFunction type.
The bSide of this relationship is an instance of the NRCellDU type.
The ODUFunction represents the DU component of a gNB that provides the NRCellDU.
A ODUFunction instance can provide many NRCellDUs.
An NRCellDU instance must be provided by an ODUFunction.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf-list provided-nrCellDu {
description "O-DU Function provides NR Cell-DU.";
or-teiv-yext:aSide ODUFunction;
type instance-identifier;
}
leaf provided-by-oduFunction {
description "NR Cell-DU provided by O-DU Function.";
or-teiv-yext:bSide NRCellDU;
type instance-identifier;
mandatory true;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_PROVIDES_NRSECTORCARRIER { // 1 to 0..n
description
"The aSide of this relationship is an instance of the ODUFunction type.
The bSide of this relationship is an instance of the NRSectorCarrier type.
The ODUFunction represents the DU component of a gNB that provides the NRSectorCarrier.
A ODUFunction instance can provide many NRSectorCarriers.
An NRSectorCarrier instance must be provided by an ODUFunction.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf-list provided-nrSectorCarrier {
description "O-DU Function provides NR Sector Carrier.";
or-teiv-yext:aSide ODUFunction;
type instance-identifier;
}
leaf provided-by-oduFunction {
description "NR Sector Carrier provided by O-DU Function.";
or-teiv-yext:bSide NRSectorCarrier;
type instance-identifier;
mandatory true;
}
}
or-teiv-yext:biDirectionalTopologyRelationship OCUCPFUNCTION_PROVIDES_NRCELLCU { // 1 to 0..n
description
"The aSide of this relationship is an instance of the OCUCPFunction type.
The bSide of this relationship is an instance of the NRCellCU type.
The OCUCPFunction represents the CU-CP component of a gNB that provides the NRCellCU.
A OCUCPFunction instance can provide many NRCellCU.
An NRCellCU instance must be provided by an OCUCPFunction.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf-list provided-nrCellCu {
description "O-CU-CP Function provides NR Cell-CU.";
or-teiv-yext:aSide OCUCPFunction;
type instance-identifier;
}
leaf provided-by-ocucpFunction {
description "NR Cell-CU provided by O-CU-CP Function.";
or-teiv-yext:bSide NRCellCU;
type instance-identifier;
mandatory true;
}
}
or-teiv-yext:biDirectionalTopologyRelationship NRCELLDU_USES_NRSECTORCARRIER { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the NRCellDU type.
The bSide of this relationship is an instance of the NRSectorCarrier type.
The NRCellDU represents the cell that uses the NRSectorCarrier.
An NRCellDU instance can use many NRSectorCarriers.
An NRSectorCarrier instance can only be used by one NRCellDU.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf-list used-nrSectorCarrier {
description "NR Cell-DU uses NR Sector Carrier.";
or-teiv-yext:aSide NRCellDU;
type instance-identifier;
}
leaf used-by-nrCellDu {
description "NR Sector Carrier used by NR Cell-DU.";
or-teiv-yext:bSide NRSectorCarrier;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship NRSECTORCARRIER_USES_ANTENNACAPABILITY { // 0..n to 0..1
description
"The aSide of this relationship is an instance of the NRSectorCarrier type.
The bSide of this relationship is an instance of the AntennaCapability type.
The NRSectorCarrier represents the carrier that uses the AntennaCapability.
An NRSectorCarrier instance can use only one AntennaCapability.
An AntennaCapability instance can be used by many NRSectorCarriers.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf used-antennaCapability {
description "NR Sector Carrier uses Antenna Capability.";
or-teiv-yext:aSide NRSectorCarrier;
type instance-identifier;
}
leaf-list used-by-nrSectorCarrier {
description "Antenna Capability used by NR Sector Carrier.";
or-teiv-yext:bSide AntennaCapability;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship SECTOR_GROUPS_NRCELLDU { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the Sector type.
The bSide of this relationship is an instance of the NRCellDU type.
The Sector represents the geographical area that groups the NRCellDUs.
A Sector instance can group many NRCellDUs.
An NRCellDU instance can only be grouped by one Sector.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf-list grouped-nrCellDu {
description "Sector groups NR Cell-DU.";
or-teiv-yext:aSide Sector;
type instance-identifier;
}
leaf grouped-by-sector {
description "NR Cell-DU grouped by Sector.";
or-teiv-yext:bSide NRCellDU;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_E2LINK_NEARRTRICFUNCTION { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ODUFunction type.
The bSide of this relationship is an instance of the NearRTRICFunction type.
The relationships defines an E2 link between the
aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oduFunction-e2-linked-nearRTRICFunction {
description "O-DU Function links Near RT RIC Function.";
or-teiv-yext:aSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
leaf-list nearRTRICFunction-e2-linked-by-oduFunction {
description "Near RT RIC Function linked by O-DU Function.";
or-teiv-yext:bSide or-teiv-ran:NearRTRICFunction;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ORUFUNCTION_OFHMLINK_SMO { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ORUFunction type.
The bSide of this relationship is an instance of the SMO type.
The relationships defines an Open FH (Fronthaul) M-Plane Interface between the
aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oruFunction-ofhm-linked-smo {
description "";
or-teiv-yext:aSide or-teiv-ran:ORUFunction;
type instance-identifier;
}
leaf-list smo-ofhm-linked-by-oruFunction {
description "";
or-teiv-yext:bSide or-teiv-ran:SMO;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ORUFUNCTION_OFHMLINK_ODUFUNCTION { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ORUFunction type.
The bSide of this relationship is an instance of the ODUFunction type.
The relationships defines an Open FH (Fronthaul) M-Plane Interface between
the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oruFunction-ofhm-linked-oduFunction {
description "O-RU Function links O-DU Function.";
or-teiv-yext:aSide or-teiv-ran:ORUFunction;
type instance-identifier;
}
leaf-list oduFunction-ofhm-linked-by-oruFunction {
description "O-DU Function linked by O-RU Function.";
or-teiv-yext:bSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ORUFUNCTION_OFHCLINK_ODUFUNCTION { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ORUFunction type.
The bSide of this relationship is an instance of the ODUFunction type.
The relationships defines an Open FH (Fronthaul) Control Interface between
the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oruFunction-ofhc-linked-oduFunction {
description "O-RU Function links O-DU Function.";
or-teiv-yext:aSide or-teiv-ran:ORUFunction;
type instance-identifier;
}
leaf-list oduFunction-ofhc-linked-by-oruFunction {
description "O-DU Function linked by O-RU Function.";
or-teiv-yext:bSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ORUFUNCTION_OFHULINK_ODUFUNCTION { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ORUFunction type.
The bSide of this relationship is an instance of the ODUFunction type.
The relationships defines an Open FH (Fronthaul) User Interface between
the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oruFunction-ofhu-linked-oduFunction {
description "O-RU Function links O-DU Function.";
or-teiv-yext:aSide or-teiv-ran:ORUFunction;
type instance-identifier;
}
leaf-list oduFunction-ofhu-linked-by-oruFunction {
description "O-DU Function linked by O-RU Function.";
or-teiv-yext:bSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ORUFUNCTION_OFHSLINK_ODUFUNCTION { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ORUFunction type.
The bSide of this relationship is an instance of the ODUFunction type.
The relationships defines an Open FH (Fronthaul) Synchronization Interface
between the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oruFunction-ofhs-linked-oduFunction {
description "O-RU Function links O-DU Function.";
or-teiv-yext:aSide or-teiv-ran:ORUFunction;
type instance-identifier;
}
leaf-list oduFunction-ofhs-linked-by-oruFunction {
description "O-DU Function linked by O-RU Function.";
or-teiv-yext:bSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_O1LINK_SMO { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ODUFunction type.
The bSide of this relationship is an instance of the SMO type.
The relationships defines an O1 Interface between the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oduFunction-o1-linked-smo {
description "";
or-teiv-yext:aSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
leaf-list smo-o1-linked-by-oduFunction {
description "";
or-teiv-yext:bSide or-teiv-ran:SMO;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship OCUCPFUNCTION_O1LINK_SMO { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the OCUCPFunction type.
The bSide of this relationship is an instance of the SMO type.
The relationships defines an O1 Interface between the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf ocucpFunction-o1-linked-smo {
description "";
or-teiv-yext:aSide or-teiv-ran:OCUCPFunction;
type instance-identifier;
}
leaf-list smo-o1-linked-by-ocucpFunction {
description "";
or-teiv-yext:bSide or-teiv-ran:SMO;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ORUFUNCTION_O1LINK_SMO { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ORUFunction type.
The bSide of this relationship is an instance of the SMO type.
The relationships defines an O1 Interface between the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oruFunction-o1-linked-smo {
description "";
or-teiv-yext:aSide or-teiv-ran:ORUFunction;
type instance-identifier;
}
leaf-list smo-o1-linked-by-oruFunction {
description "";
or-teiv-yext:bSide or-teiv-ran:SMO;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship NEARRTRICFUNCTION_O1LINK_SMO { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the NearRTRICFunction type.
The bSide of this relationship is an instance of the SMO type.
The relationships defines an O1 Interface between the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf nearRTRICFunction-o1-linked-smo {
description "";
or-teiv-yext:aSide or-teiv-ran:NearRTRICFunction;
type instance-identifier;
}
leaf-list smo-o1-linked-by-nearRTRICFunction {
description "";
or-teiv-yext:bSide or-teiv-ran:SMO;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_F1ULINK_OCUUPFUNCTION { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ODUFUNCTION type.
The bSide of this relationship is an instance of the OCUUPFUNCTION type.
The relationships defines an F1-u Interface between the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oduFunction-f1-u-linked-ocuupFunction {
description "";
or-teiv-yext:aSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
leaf-list ocuupFunction-f1-u-linked-by-oduFunction {
description "";
or-teiv-yext:bSide or-teiv-ran:OCUUPFunction;
type instance-identifier;
}
}
or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_F1CLINK_OCUCPFUNCTION { // 0..1 to 0..n
description
"The aSide of this relationship is an instance of the ODUFUNCTION type.
The bSide of this relationship is an instance of the OCUCPFUNCTION type.
The relationships defines an F1-c Interface between the aSide and bSide.
";
uses or-teiv-types:Top_Grp_Type;
uses or-teiv-types:Origin_Relationship_Mapping_Grp;
key id;
leaf oduFunction-f1-c-linked-ocucpFunction {
description "";
or-teiv-yext:aSide or-teiv-ran:ODUFunction;
type instance-identifier;
}
leaf-list ocucpFunction-f1-c-linked-by-oduFunction {
description "";
or-teiv-yext:bSide or-teiv-ran:OCUCPFunction;
type instance-identifier;
}
}
} |
|
Clone the repo from https://gerrit.o-ran-sc.org/r/admin/repos/smo/teiv,general
Get the images
by following the build steps at Release J - Build or
pulling the image directly from the Nexus Repository https://nexus3.o-ran-sc.org/#browse/browse:docker.snapshot:v2%2Fo-ran-sc%2Fsmo-teiv-pgsql-schema-generator%2Ftags%2Flatest
In teiv/teiv/src/main/resources/models change o-ran-smo-teiv-ran.yang to the yang provided above
Copy all files and folders from teiv/teiv/src/main/resources/models to teiv/docker-compose/generate-defaults
Image AddedPrepare docker compose
Delete the current sql schemas from teiv/docker-compose/sql_scripts. NB: make sure to not delete waitForFiles.sh
Uncomment pgsql-schema-generator from teiv/docker-compose/docker-compose.yml AND the depends on in dbpostgresql
Comment out kafka-producer OR you can replace the cloud event in teiv/docker-compose/cloudEventProducer/events with cloud events generated at OAM network_generator
From teiv/docker-compose run docker-compose up
teiv/docker-compose/sql_scripts should look like the image below
Image Added
Run docker ps -a
and you should see a similar output to the below. NB: pgsql-schema-generator might fail due to a permission error, you can run sudo chmod -R 777 sql_scripts/
to fix
Image AddedIf run with kafka-producer there will be another container present that will send the cloud events present in teiv/docker-compose/cloudEventProducer/events and will populate the TEIV database with the OAM transport topology
If you didn’t run with kafka-producer you can now replace the cloud event in teiv/docker-compose/cloudEventProducer/events with cloud events generated at OAM network_generator and run bash cloudEventProducer.sh
from teiv/docker-compose/cloudEventProducer
Once all the cloud events are finished you can run through some of the Sample TEIV Queries