... representing an KeyCloak based identity service for centralized user
management. Please note that the implementation does not support IPv6.
Therefore, its own network is required called 'DMZ'.
- In this configuration the external https port is 8463.
* **Controller** single node instance
... representing the NETCONF consumer on the Service Management and
- Orchestration framework (SMO) for the O1 interface based on
- ODL.
- SDN-R comes with is own web-portal the external port is 8463.
+ Orchestration framework (SMO) for O-RAN O1 interface and/or O-RAN OpenFronthaul Management Plane and/or other NETCONF/YANG schemas implemented by the OpenDaylight project.
* **VES collector**
- ... representing the VES (REST) provider at SMO for all kind of events. In this configuration the external https port is 8443.
+ ... representing the VES (REST) provider at SMO for all kind of events.
* **Messages**
... representing SMO MessageRouter component, includes message-router
## Prerequisites
+### Resources
+
+The solution was tested on a VM with
+
+- 4x Core
+- 16 GBit RAM
+- 50 Gbit Storage
+
+### Operating (HOST) System
+
```
$ cat /etc/os-release | grep PRETTY_NAME
-PRETTY_NAME="Ubuntu 22.04.1 LTS"
+PRETTY_NAME="Ubuntu 22.04.2 LTS"
+```
+
+### Docker
+```
$ docker --version
-Docker version 20.10.12, build 20.10.12-0ubuntu4
+Docker version 23.0.1, build a5ee5b1
+```
+Please follow the required docker daemon configuration as documented in the following README.md:
+- [./smo/common/docker/README.md](./smo/common/docker/README.md)
+
+### Docker Compose
-$ docker-compose version
-docker-compose version 1.29.2, build unknown
-docker-py version: <module 'docker.version' from '/usr/local/lib/python3.10/dist-packages/docker/version.py'>
-CPython version: 3.10.6
-OpenSSL version: OpenSSL 3.0.2 15 Mar 2022
+```
+$ docker compose version
+Docker Compose version v2.17.2
+```
+### GIT
+```
$ git --version
git version 2.34.1
+```
+
+### Python
```
+$ python3 --version
+Python 3.10.6
+```
+
+A python parser package is required.
+```
+sudo apt install python3-pip
+pip install jproperties
+```
+
+It is beneficial (but not mandatory) adding the following line add the
+end of your ~/.bashrc file. I will suppress warnings when python script
+do not verify self signed certificates for HTTPS communication.
+
+```
+export PYTHONWARNINGS="ignore:Unverified HTTPS request"
+```
+
+### ETC Host (DNS function)
+
+Please change in the different .env files the environment variable 'HOST_IP'
+to the IP address of the system where you deploy the solution - search for
+'aaa.bbb.ccc.ddd' and replace it.
+
Please modify the /etc/hosts of your system.
* \<your-system>: is the hostname of the system, where the browser is started
# SMO OAM development system
<deployment-system-ipv4> smo.o-ran-sc.org
-<deployment-system-ipv4> gateway.smo.o-ran-sc.org
+<deployment-system-ipv4> gateway.smo.o-ran-sc.org
<deployment-system-ipv4> identity.smo.o-ran-sc.org
<deployment-system-ipv4> messages.smo.o-ran-sc.org
-<deployment-system-ipv4> ves-collector.oam.smo.o-ran-sc.org
+<deployment-system-ipv4> kafka-bridge.smo.o-ran-sc.org
<deployment-system-ipv4> odlux.oam.smo.o-ran-sc.org
-<deployment-system-ipv4> controller.oam.smo.o-ran-sc.org
+<deployment-system-ipv4> flows.oam.smo.o-ran-sc.org
+<deployment-system-ipv4> tests.oam.smo.o-ran-sc.org
+<deployment-system-ipv4> controller.dcn.smo.o-ran-sc.org
+<deployment-system-ipv4> ves-collector.dcn.smo.o-ran-sc.org
```
-It is beneficial (but not mandatory) adding the following line add the
-end of your ~/.bashrc file. I will suppress warnings when python script
-do not verify self signed certificates for HTTPS communication.
-
-```
-export PYTHONWARNINGS="ignore:Unverified HTTPS request"
-```
-
-Please ensure that you download and copy the required 3GPP OpenAPIs for VES-stndDefined
-message validation into the folder './solution/operation-and-maintenance/smo/oam/ves-collector/externalRepo'.
-
-Please follow the instructions in ./solution/operation-and-maintenance/smo/oam/ves-collector/externalRepo/3gpp/rep/sa5/MnS/blob/Rel16/OpenAPI/README.md.
-
-The following tree shows the successfully tested folder structure. It combines different versions of the schemas ('Rel16' and 'SA88-Rel16') using 3GPP branch names.
-
-```
-$ tree solution/operation-and-maintenance/smo/oam/ves-collector/externalRepo/
-solution/operation-and-maintenance/smo/oam/ves-collector/externalRepo/
-├── 3gpp
-│ └── rep
-│ └── sa5
-│ └── MnS
-│ └── blob
-│ ├── Rel16
-│ │ └── OpenAPI
-│ │ ├── README.md
-│ │ ├── TS28532_FaultMnS.yaml
-│ │ ├── TS28532_FileDataReportingMnS.yaml
-│ │ ├── TS28532_HeartbeatNtf.yaml
-│ │ ├── TS28532_PerfMnS.yaml
-│ │ ├── TS28532_ProvMnS.yaml
-│ │ ├── TS28532_StreamingDataMnS.yaml
-│ │ ├── TS28536_CoslaNrm.yaml
-│ │ ├── TS28541_5GcNrm.yaml
-│ │ ├── TS28541_NrNrm.yaml
-│ │ ├── TS28541_SliceNrm.yaml
-│ │ ├── TS28550_PerfMeasJobCtrlMnS.yaml
-│ │ ├── TS28623_ComDefs.yaml
-│ │ ├── TS28623_GenericNrm.yaml
-│ │ ├── TS29512_Npcf_SMPolicyControl.yaml
-│ │ ├── TS29514_Npcf_PolicyAuthorization.yaml
-│ │ └── TS29571_CommonData.yaml
-│ └── SA88-Rel16
-│ └── OpenAPI
-│ ├── 5gcNrm.yaml
-│ ├── PerDataFileReportMnS.yaml
-│ ├── PerMeasJobCtlMnS.yaml
-│ ├── PerThresMonMnS.yaml
-│ ├── PerfDataStreamingMnS.yaml
-│ ├── README.md
-│ ├── comDefs.yaml
-│ ├── coslaNrm.yaml
-│ ├── faultMnS.yaml
-│ ├── genericNrm.yaml
-│ ├── heartbeatNtf.yaml
-│ ├── nrNrm.yaml
-│ ├── provMnS.yaml
-│ ├── sliceNrm.yaml
-│ └── streamingDataMnS.yaml
-```
-
-## Expected Folder Structure
-
-The following figure show the expected folder structure for the different
-docker-compose file and its configurations.
-
-```
-├── network
-│ ├── .env
-│ ├── config.py
-│ ├── docker-compose.yml
-│ │
-│ ├── ntsim-ng-o-du
-│ └── ntsim-ng-o-ru
-└── smo
- ├── common
- │ ├── .env
- │ ├── docker-compose.yml
- │ │
- │ ├── messages
- │ ├── docker
- │ ├── identity
- │ ├── kafka
- │ └── zookeeper
- └── oam
- ├── .env
- ├── docker-compose.yml
- │
- ├── odlux
- ├── controller
- └── ves-collector
-```
-
## Usage
### Bring Up Solution
next chapters.
```
-docker-compose -f smo/common/docker-compose.yml up -d
-# wait until the cpu load is low again
+docker compose -f smo/common/docker-compose.yaml up -d
python smo/common/identity/config.py
-docker-compose -f smo/oam/docker-compose.yml up -d
+docker compose -f smo/oam/docker-compose.yaml up -d
+docker compose -f smo/apps/docker-compose.yaml up -d
+
# wait until the cpu load is low again
-docker-compose -f network/docker-compose.yml up -d
-# wait about 2min
-docker restart ntsim-ng-o-du-1122
+docker compose -f network/docker-compose.yaml up -d
+docker compose -f network/docker-compose.yaml restart ntsim-ng-o-du-1122 ntsim-ng-o-du-1123
python network/config.py
```
nano network/.env
```
-The tested configuration uses the following external https ports:
-
- * 8443 for the ves-collector
- * 8453 for web access to ODLUX (SDNC_WEB_PORT)
- * 8463 for the keyclock web administrator user interface.
-
#### Startup solution
Please note that it is necessary to configure first the identity service,
before starting further docker images.
-The several docker-compose yml files must be started in the right order as listed below:
+The several docker-compose yaml files must be started in the right order as listed below:
```
-docker-compose -f smo/common/docker-compose.yml up -d
+docker compose -f smo/common/docker-compose.yaml up -d
python smo/common/identity/config.py
```
```
-docker-compose -f smo/oam/docker-compose.yml up -d
+docker compose -f smo/oam/docker-compose.yaml up -d
```
Looking into the ONAP SDN-R logs will give you the startup procedure.
```
-docker logs -f sdnr
-```
-
-The startup was successful when you see the following line:
-
-```
-Everything OK in Certificate Installation
+docker logs -f controller
```
-If you see the login page (https://sdnc-web:8453) you are good to go and can start the (simulated) network.
+If you see the login page (https://odlux.oam.smo.o-ran-sc.org) you are good to go and can start the (simulated) network.
```
-docker-compose -f network/docker-compose.yml up -d
+docker compose -f network/docker-compose.yaml up -d
```
Usually the first ves:event gets lost. Please restart the O-DU docker container(s) to send a second ves:pnfRegistration.
```
-docker-compose -f network/docker-compose.yml restart ntsim-ng-o-du-1122
+docker compose -f network/docker-compose.yaml restart ntsim-ng-o-du-1122
python network/config.py
```
The python script configures the simulated O-DU and O-RU according to O-RAN hybrid architecture.
-O-DU - NETCONF Call HOME and NETCONF notifications
-O-RU - ves:pnfRegistration and ves:fault, ves:heartbeat
+O-RU - NETCONF Call HOME and NETCONF notifications
+O-DU - ves:pnfRegistration and ves:fault, ves:heartbeat
![ves:pnfRegistration in ODLUX](docs/nstim-ng-connected-after-ves-pnf-registration-in-odlux.png "ves:pnfRegistration in ODLUX")
#### ODL karaf.logs
```
-docker exec -it sdnr tail -f /opt/opendaylight/data/log/karaf.log
+docker exec -it controller tail -f /opt/opendaylight/data/log/karaf.log
```
#### ves-collector logs
#### Access to SDN-R ODLUX
-##### Login into SDN-R
+ https://odlux.oam.smo.o-ran-sc.org
- https://sdnc-web:8453
+ User: admin
- User: admin // see .env file
+ Password: // see .env file
- Password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+In case of trouble, please update the commands with your customized '.env' file.
+
+#### Access to Node Red Flows
+
+ https://flows.oam.smo.o-ran-sc.org
+
+ User: admin
+
+ Password: // see .env file
In case of trouble, please update the commands with your customized '.env' file.
To stop all container please respect the following order
```
-docker-compose -f network/docker-compose.yml down
-docker-compose -f smo/oam/docker-compose.yml down
-docker-compose -f smo/common/docker-compose.yml down
+docker compose -f network/docker-compose.yaml down
+docker compose -f smo/apps/docker-compose.yaml down
+docker compose -f smo/oam/docker-compose.yaml down
+docker compose -f smo/common/docker-compose.yaml down
```
### Cleanup
```
docker ps -a
docker-compose ps
+docker rm -f $(docker ps -aq)
+
+## Commands in action
+
+```
+$ docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
+NAMES IMAGE STATUS
+$ docker compose -f smo/common/docker-compose.yaml up -d
+[+] Running 9/9
+ ✔ Network smo Created 0.1s
+ ✔ Network dmz Created 0.1s
+ ✔ Container zookeeper Started 1.6s
+ ✔ Container persistence Started 1.5s
+ ✔ Container identitydb Started 1.2s
+ ✔ Container gateway Healthy 12.1s
+ ✔ Container kafka Started 2.2s
+ ✔ Container identity Started 13.4s
+ ✔ Container messages Started 13.4s
+$ python3 smo/common/identity/config.py
+Got token!
+User leia.organa created!
+User r2.d2 created!
+User luke.skywalker created!
+User jargo.fett created!
+User role jargo.fett supervision created!
+User role leia.organa administration created!
+User role luke.skywalker provision created!
+User role r2.d2 administration created!
+$ docker compose -f smo/oam/docker-compose.yaml up -d
+[+] Running 4/4
+ ✔ Network oam Created 0.1s
+ ✔ Container controller Healthy 83.4s
+ ✔ Container ves-collector Started 1.2s
+ ✔ Container odlux Started 84.0s
+$ docker compose -f smo/apps/docker-compose.yaml up -d
+WARN[0000] Found orphan containers ([odlux controller ves-collector]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
+[+] Running 1/1
+ ✔ Container flows Started 0.9s
+$ docker compose -f network/docker-compose.yaml up -d
+WARN[0000] Found orphan containers ([flows odlux controller ves-collector]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
+[+] Running 6/6
+ ✔ Container ntsim-ng-o-du-1123 Started 2.6s
+ ✔ Container ntsim-ng-o-ru-11223 Started 2.2s
+ ✔ Container ntsim-ng-o-ru-11221 Started 1.9s
+ ✔ Container ntsim-ng-o-ru-11224 Started 1.9s
+ ✔ Container ntsim-ng-o-du-1122 Started 2.4s
+ ✔ Container ntsim-ng-o-ru-11222 Started 2.3s
+$ docker compose -f network/docker-compose.yaml restart ntsim-ng-o-du-1122 ntsim-ng-o-du-1123
+[+] Running 2/2
+ ✔ Container ntsim-ng-o-du-1122 Started 2.8s
+ ✔ Container ntsim-ng-o-du-1123 Started 2.9s
+$ python3 network/config.py
+Set O-RU-11221 True
+Set O-RU-11224 True
+Set O-RU-11222 True
+Set O-DU-1123 True
+Set O-DU-1122 True
+Set O-RU-11223 True
+$ docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
+NAMES IMAGE STATUS
+ntsim-ng-o-ru-11221 nexus3.o-ran-sc.org:10004/o-ran-sc/nts-ng-o-ran-ru-fh:1.6.2 Up 4 minutes
+ntsim-ng-o-ru-11224 nexus3.o-ran-sc.org:10004/o-ran-sc/nts-ng-o-ran-ru-fh:1.6.2 Up 4 minutes
+ntsim-ng-o-ru-11222 nexus3.o-ran-sc.org:10004/o-ran-sc/nts-ng-o-ran-ru-fh:1.6.2 Up 4 minutes
+ntsim-ng-o-du-1123 o-ran-sc/nts-ng-o-ran-du-rel-18:1.6.2 Up 54 seconds
+ntsim-ng-o-du-1122 nexus3.o-ran-sc.org:10004/o-ran-sc/nts-ng-o-ran-du:1.6.2 Up About a minute
+ntsim-ng-o-ru-11223 nexus3.o-ran-sc.org:10004/o-ran-sc/nts-ng-o-ran-ru-fh:1.6.2 Up 4 minutes
+flows nodered/node-red:latest-configured Up 4 minutes (healthy)
+odlux nexus3.onap.org:10001/onap/sdnc-web-image:2.4.2 Up 7 minutes
+controller nexus3.onap.org:10001/onap/sdnc-image:2.4.2 Up 8 minutes (healthy)
+ves-collector nexus3.onap.org:10001/onap/org.onap.dcaegen2.collectors.ves.vescollector:1.10.1-configured Up 8 minutes (healthy)
+messages nexus3.onap.org:10001/onap/dmaap/dmaap-mr:1.1.18 Up 11 minutes
+identity bitnami/keycloak:18.0.2 Up 11 minutes
+kafka nexus3.onap.org:10001/onap/dmaap/kafka111:1.0.4 Up 11 minutes
+zookeeper nexus3.onap.org:10001/onap/dmaap/zookeeper:6.0.3 Up 11 minutes
+identitydb bitnami/postgresql:13 Up 11 minutes
+persistence docker.elastic.co/elasticsearch/elasticsearch-oss:7.9.3 Up 11 minutes
+gateway traefik:v2.9 Up 11 minutes (healthy)
+$
+```