Child pages
  • O1 Simulator and lightweight ONAP based SMO deployment
Skip to end of metadata
Go to start of metadata

Table of Contents:


This describes how to deploy a lightweight version of an O-RAN Service Management and Orchestration (SMO) framework based on ONAP (excluding the Non-RT RIC for the moment), in preparation of developing rApps in the context of SMaRT 5G. It is based on the OAM and SIM projects inside the O-RAN Software Community. Current deployment is based on docker images and docker-compose is being used to start the solution.

Initial deployment consists of the following components (diagram available here):

  • Identity server (Keycloak) - for handling user management
  • Gateway server (Traefik) - reverse proxy, intermediating all requests
  • DMaaP - message bus 
  • SDN-R - OpenDaylight based SDN Controller for the O1 termination
  • SDN-R-DB - Database for SDN-R
  • VES-Collector - provides termination for the VES messages
  • O1 Simulators

This recipe for deployment is based on this guide here.



An Ubuntu machine with at least 4 cores (recommended 8), at least 8 GB of RAM (recommended 16GB) and at least 100GB of disk space (recommended 500GB).

$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Ubuntu 22.04.1 LTS"

$ docker --version
Docker version 23.0.1, build a5ee5b1

$ docker-compose version
Docker Compose version v2.16.0

$ git --version
git version 2.34.1

Guide for installing docker  for Ubuntu:

Guide for installing docker-compose :

The Docker daemon needs to be configured to include this configuration:

$ cat /etc/docker/daemon.json
  "registry-mirrors": [
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"

Please make sure to restart the Docker daemon in order for the changes to take effect:

systemctl reload docker

The /etc/hosts file of the Host machine where the solution will be accessed from needs to be changed in order to be able to access the GUI of the SDN Controller and the Identity server via a FQDN (Fully Qualified Domain Name):

Please modify the /etc/hosts of your system.

* \<your-system>: is the hostname of the system, where the browser is started

* \<deployment-system-ipv4>: is the IP address of the system where the solution will be deployed

For development purposes <your-system> and <deployment-system> may reference the same system.

$ cat /etc/hosts	               localhost	               <your-system>

# SMO OAM development system


All the below steps assume the commands are being ran in /home/smart5g folder.

The first step in the deployment process is cloning the gerrit repository containing the recipe:

git clone ""

All the subsequent commands are relative to the oam/solution folder.

cd oam/solution

Bringing up common infrastructure

$ docker-compose -f smo/common/docker-compose.yml up -d
[+] Running 9/9
 ⠿ Network dmz            Created                                                                                                                                 0.1s
 ⠿ Network smo            Created                                                                                                                                 0.1s
 ⠿ Container identitydb   Started                                                                                                                                 1.2s
 ⠿ Container gateway      Healthy                                                                                                                                11.9s
 ⠿ Container zookeeper    Started                                                                                                                                 1.3s
 ⠿ Container persistence  Started                                                                                                                                 1.0s
 ⠿ Container kafka        Started                                                                                                                                 2.0s
 ⠿ Container identity     Started                                                                                                                                12.9s
 ⠿ Container messages     Started                                                                                                                                12.8s

After processor utilisation stabilises (30-60 seconds), the Identity server needs to be configured.

$ python3 smo/common/identity/
Got token!
User leia.organa created!
User r2.d2 created!
User luke.skywalker created!
User jargo.fett created!
User martin.skorupski created!
User $USER created!
User role $USER administration created!
User role jargo.fett supervision created!
User role leia.organa administration created!
User role luke.skywalker provision created!
User role martin.skorupski administration created!
User role r2.d2 administration created!

Any of the above users can be used for logging in to the system. Their default password is Default4SDN! 

Bringing up OAM infrastructure

Changes to original recipe

There are some modifications needed to be done to the actual recipe.

  • Modify HOST_IP environment variable to smo/oam/.env to point to the IP address of the Host machine.
$ echo "HOST_IP=" >> smo/oam/.env 
$ git diff smo/oam/.env
diff --git a/solution/smo/oam/.env b/solution/smo/oam/.env
index 9ad6728..25e86e6 100644
--- a/solution/smo/oam/.env
+++ b/solution/smo/oam/.env
@@ -54,4 +54,4 @@ VES_ENDPOINT_AUTH_METHOD=basic-auth



$ docker-compose -f smo/oam/docker-compose.yml up -d
[+] Running 4/4
 ⠿ Network oam              Created                                                                                                                               0.1s
 ⠿ Container ves-collector  Started                                                                                                                               0.9s
 ⠿ Container controller     Healthy                                                                                                                              62.3s
 ⠿ Container odlux          Started                                                                                                                              62.8s

Verifying the deployment

Now, a browser can be opened and the GUI (ODLUX) of the SDN Controller can be accessed:

After proceeding without certificates, the login screen appears:

Clicking on "ONAP IDENTITY" redirects us to the Identity server:

Again, we need to proceed without certificates:

Now the system can be accessed with one of the users created by the  script, in an earlier step.

  • Example user: r2.d2
  • Default password: Default4SDN!

The infrastructure is now in place and ready for interacting with it.

Clicking on the user name in the top right corner (R2 in this example) and then Settings, shows the following screen, where we can enable notifications for the current user:

Clicking on "Connect" application on the left sidebar shows the current connected network functions (O1 NETCONF/YANG connections that are currently established):

Since we did not start any O1 Simulators yet, the table is empty.

Bringing up O1 Simulators

The current recipe starts 4 simulated Network Functions: 1 O-DU and 3 O-RUs. Only the O1 interface is being simulated.

Changes to original recipe

Some changes need to be done to the original recipe, until the modifications are upstreamed to the OAM repository.

  • in network/.env file, three more env variables need to be added:
    • CURL_CONNECTION_TIMEOUT=20 (the amount of seconds for a cURL connection to timeout)
    • CURL_OPERATION_TIMEOUT=20 (the amount of seconds for a cURL operation to timeout)
    • HOST_IP= (the IP address of the VM where this solution is being deployed)
$ git diff network/.env
diff --git a/solution/network/.env b/solution/network/.env
index 03600dd..0f295c0 100644
--- a/solution/network/.env
+++ b/solution/network/.env
@@ -57,4 +57,6 @@ VES_ENDPOINT_AUTH_METHOD=basic-auth

  • in network/docker-compose.yml extra environment variables need to be added, like in the diff below
$ git diff network/docker-compose.yml
diff --git a/solution/network/docker-compose.yml b/solution/network/docker-compose.yml
index 6a29fa3..0a3401f 100755
--- a/solution/network/docker-compose.yml
+++ b/solution/network/docker-compose.yml
@@ -44,6 +44,9 @@ x-common_env: &common_env

 x-du_env: &du_env
     # NTS_NF_STANDALONE_START_FEATURES: "datastore-populate ves-heartbeat ves-file-ready ves-pnf-registration web-cut-through"
     NTS_NF_STANDALONE_START_FEATURES: "datastore-populate ves-heartbeat ves-file-ready ves-pnf-registration ves-o1-pnf-registration web-cut-through"


$ docker-compose -f network/docker-compose.yml up -d
WARN[0000] network default: is deprecated. Please set with external: true
WARN[0000] Found orphan containers ([odlux ves-collector controller]) 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 4/4
 ⠿ Container ntsim-ng-o-ru-fh-11221  Started                                                                                                                      1.5s
 ⠿ Container ntsim-ng-o-ru-fh-11223  Started                                                                                                                      1.7s
 ⠿ Container ntsim-ng-o-du-1122      Started                                                                                                                      1.6s
 ⠿ Container ntsim-ng-o-ru-fh-11222  Started                                                                                                                      1.3s

Because of a ves-collector issue (the first message from a Topic is being lost), the O-DU will not be connected to the SDN Controller (the first pnfRegistration message is lost). In order for it to connect, we need to restart it such that a new VES pnfRegistration is being triggered.

$ docker restart ntsim-ng-o-du-1122

Verifying the deployment

If we return to ODLUX, we should see the 4 simulated network functions connected:

  • No labels