15 minute read

SDRAN-in-a-Box (RiaB) is an ONF project that consists in a SD-RAN cluster which is able to operate within a single host machine . It provides a development/test environment for developers/users in ONF SD-RAN community.

RiaB deploys the complete SD-RAN infrastructure over Kubernetes:

  • the EPC (OMEC)
  • an emulated RAN (CU/DU/UE)
  • the ONOS RAN Intelligent Controller (ONOS RIC)

Features

  • Installs Kubernetes and Helm
  • Provides one of three choices to emulate/simulate Radio Access Networks (RANs)
    • RAN-Simulator
    • OMEC / CU-CP / OAI nFAPI emulator for DU/UE
    • OMEC / CU-CP / OAI DU and UE with USRP hardware and/or LTE smartphones
  • Support End-to-End (E2E) connectivity test
    • User plane E2E tests
    • SD-RAN control plane E2E tests

Prerequisites

In order to run RiaB, we should prepare at least a single machine (any baremetal server or on premises/cloud VM) with the following minimum requirements:

  • CPU: Intel CPU and Haswell microarchitecture or beyond; at least 4 cores
  • OS: Ubuntu 18.04
  • RAM: At least 16GB
  • Storage: At least 50GB (recommendation: 100GB)

For this testing it was used a Ubuntu 18.04 t2.xlarge (4 vCPUs / 16 GB) instance on AWS.

Installation

Clone the RiaB repository:

$ git clone https://github.com/onosproject/sdran-in-a-box

Install the required dependencies:

$ sudo apt install -y make

Start the deployment procedure:

$ cd /path/to/sdran-in-a-box
$ make riab OPT=oai VER=stable

After a few minutes and if we don’t see any error or failure messages, check that everything is up and running:

$ kubectl get pods -A
NAMESPACE     NAME                                              READY   STATUS    RESTARTS   AGE
default       router                                            1/1     Running   0          30m
kube-system   atomix-controller-99f978c7d-7dngl                 1/1     Running   0          30m
kube-system   atomix-raft-storage-controller-75979cfff8-n2g7b   1/1     Running   0          29m
kube-system   calico-kube-controllers-7f9675c8b8-xgx4b          1/1     Running   0          31m
kube-system   calico-node-qfl9t                                 1/1     Running   0          31m
kube-system   coredns-dff8fc7d-x7927                            1/1     Running   0          31m
kube-system   dns-autoscaler-5d74bb9b8f-lwbxb                   1/1     Running   0          31m
kube-system   kube-apiserver-node1                              1/1     Running   0          32m
kube-system   kube-controller-manager-node1                     1/1     Running   0          32m
kube-system   kube-multus-ds-amd64-fj22t                        1/1     Running   0          31m
kube-system   kube-proxy-jr2c8                                  1/1     Running   0          32m
kube-system   kube-scheduler-node1                              1/1     Running   1          32m
kube-system   kubernetes-dashboard-667c4c65f8-v8tgk             1/1     Running   0          31m
kube-system   kubernetes-metrics-scraper-54fbb4d595-s7v8z       1/1     Running   0          31m
kube-system   nodelocaldns-2np2q                                1/1     Running   0          31m
kube-system   onos-operator-app-676674b79c-nl9gl                1/1     Running   0          29m
kube-system   onos-operator-topo-7698956594-2krs5               1/1     Running   0          29m
riab          cassandra-0                                       1/1     Running   0          29m
riab          hss-0                                             1/1     Running   0          29m
riab          mme-0                                             4/4     Running   0          29m
riab          oai-enb-cu-0                                      1/1     Running   0          26m
riab          oai-enb-du-0                                      1/1     Running   0          24m
riab          oai-ue-0                                          1/1     Running   0          23m
riab          onos-a1t-84db77df99-4zpsd                         2/2     Running   0          27m
riab          onos-cli-6b746874c8-njgn8                         1/1     Running   0          27m
riab          onos-config-7bd4b6f7f6-nb6c8                      4/4     Running   0          27m
riab          onos-consensus-store-0                            1/1     Running   0          27m
riab          onos-e2t-58b4cd867-f4xbb                          3/3     Running   0          27m
riab          onos-kpimon-966bdf77f-4ss4q                       2/2     Running   0          27m
riab          onos-rsm-86df4894bd-h49d9                         2/2     Running   0          27m
riab          onos-topo-7cc9d754d7-nbh9w                        3/3     Running   0          27m
riab          onos-uenib-779cb5dbd6-wsqzl                       3/3     Running   0          27m
riab          pcrf-0                                            1/1     Running   0          29m
riab          spgwc-0                                           2/2     Running   0          29m
riab          upf-0                                             4/4     Running   0          27m

Resource usage

For this particular t2.xlarge instance:

  • Load
     $ uptime
     17:16:22 up 56 min,  2 users,  load average: 4.27, 5.60, 5.49
    
  • Memory
     $ free -h
                   total        used        free      shared  buff/cache   available
     Mem:            15G        3.0G        228M        836M         12G         11G
     Swap:            0B          0B          0B
    
  • Disk
     $ df -h
     Filesystem      Size  Used Avail Use% Mounted on
     udev            7.9G     0  7.9G   0% /dev
     tmpfs           1.6G  4.7M  1.6G   1% /run
     /dev/xvda1       97G   15G   82G  16% /
     tmpfs           7.9G     0  7.9G   0% /dev/shm
     tmpfs           5.0M     0  5.0M   0% /run/lock
     tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
     /dev/loop0       43M   43M     0 100% /snap/snapd/14066
     /dev/loop1       56M   56M     0 100% /snap/core18/2253
     /dev/loop2       25M   25M     0 100% /snap/amazon-ssm-agent/4046
     tmpfs           1.6G     0  1.6G   0% /run/user/1000
    

End-to-End (E2E) tests for verification

In order to check whether everything is running, we should conduct some E2E tests and check their results. It is possible to do E2E tests on the user plane and SD-RAN control plane.

User plane

Type make test-user-plane on the prompt for the user plane verification. If the ping is working without any loss, the user plane is working well.

$ make test-user-plane
Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
*** T1: Internal network test: ping 192.168.250.1 (Internal router IP) ***
PING 192.168.250.1 (192.168.250.1) from 172.250.255.254 oaitun_ue1: 56(84) bytes of data.
64 bytes from 192.168.250.1: icmp_seq=1 ttl=64 time=38.9 ms
64 bytes from 192.168.250.1: icmp_seq=2 ttl=64 time=46.9 ms
64 bytes from 192.168.250.1: icmp_seq=3 ttl=64 time=33.1 ms

--- 192.168.250.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 33.168/39.706/46.976/5.660 ms
*** T2: Internet connectivity test: ping to 8.8.8.8 ***
PING 8.8.8.8 (8.8.8.8) from 172.250.255.254 oaitun_ue1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=41.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=50 time=41.0 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=50 time=49.0 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 41.047/43.850/49.062/3.688 ms
*** T3: DNS test: ping to google.com ***
PING google.com (172.253.115.139) from 172.250.255.254 oaitun_ue1: 56(84) bytes of data.
64 bytes from bg-in-f139.1e100.net (172.253.115.139): icmp_seq=1 ttl=99 time=34.4 ms
64 bytes from bg-in-f139.1e100.net (172.253.115.139): icmp_seq=2 ttl=99 time=43.0 ms
64 bytes from bg-in-f139.1e100.net (172.253.115.139): icmp_seq=3 ttl=99 time=42.4 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 34.461/39.955/43.000/3.892 ms

SD-RAN control plane

In order to verify the SD-RAN control plane:

  • make test-kpimon: to see the number of active UEs
     $ make test-kpimon
     Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
     HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
     HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
     *** Get KPIMON result through CLI ***
     Node ID          Cell Object ID       Cell Global ID            Time    RRC.ConnEstabAtt.sum    RRC.ConnEstabSucc.sum    RRC.ConnMax    RRC.ConnMean    RRC.ConnReEstabAtt.sum
     e2:4/e00/2/64                    1                e0000      17:03:42.0                       1                        1              1               1                         0
    
  • make test-e2-subscription: to see e2 connection and subscription
     $ make test-e2-subscription
     Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
     HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
     HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
     *** Get E2 subscriptions through CLI ***
     Subscription ID                                  Revision   Service Model ID   E2 NodeID       Encoding   Phase               State
     9a8f85fa67a6ef913ef4c0fa8f8fdee4:e2:4/e00/2/64   67         oran-e2sm-kpm:v2   e2:4/e00/2/64   ASN1_PER   SUBSCRIPTION_OPEN   SUBSCRIPTION_COMPLETE
     43aa0af7ce9a05142e5235c7a8efbd9b:e2:4/e00/2/64   73         oran-e2sm-rsm:v1   e2:4/e00/2/64   ASN1_PER   SUBSCRIPTION_OPEN   SUBSCRIPTION_COMPLETE
    
  • make test-rnib and make test-uenib: to check information in R-NIB and UE-NIB

     $ make test-rnib
     Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
     HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
     HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
     *** Get R-NIB result through CLI ***
     ID: e2:4/e00/3/c8
     Kind ID: e2node
     Labels: <None>
     Source Id's:
     Target Id's: uuid:bbe3703e-fc46-409c-92d3-6cf11aa65b07
     Aspects:
     - onos.topo.MastershipState={"term":"1","nodeId":"uuid:bbe3703e-fc46-409c-92d3-6cf11aa65b07"}
     - onos.topo.E2Node={"serviceModels":{"1.3.6.1.4.1.53148.1.1.2.102":{"oid":"1.3.6.1.4.1.53148.1.1.2.102","name":"ORAN-E2SM-RSM","ranFunctions":[{"@type":"type.googleapis.com/onos.topo.RSMRanFunction","ricSlicingNodeCapabilityList":[{"maxNumberOfSlicesDl":4,"maxNumberOfSlicesUl":4,"maxNumberOfUesPerSlice":4,"supportedConfig":[{},{"slicingConfigType":"E2_SM_RSM_COMMAND_SLICE_UPDATE"},{"slicingConfigType":"E2_SM_RSM_COMMAND_SLICE_DELETE"},{"slicingConfigType":"E2_SM_RSM_COMMAND_UE_ASSOCIATE"}]}]}],"ranFunctionIDs":[1]}}}
    
     ID: e2:4/e00/2/64/e0000
     Kind ID: e2cell
     Labels: <None>
     Source Id's:
     Target Id's: uuid:74c614b5-8666-67e9-d1a5-97d95ae83dcd
     Aspects:
     - onos.topo.E2Cell={"cellObjectId":"1","cellGlobalId":{"value":"e0000","type":"ECGI"},"kpiReports":{"RRC.ConnEstabAtt.sum":1,"RRC.ConnEstabSucc.sum":1,"RRC.ConnMax":1,"RRC.ConnMean":1,"RRC.ConnReEstabAtt.sum":0}}
    
     ID: gnmi:onos-config-7bd4b6f7f6-nb6c8
     Kind ID: onos-config
     Labels: <None>
     Source Id's:
     Target Id's:
     Aspects:
     - onos.topo.Lease={"expiration":"2022-03-24T17:04:21.115061844Z"}
    
     ID: e2:4/e00/2/64
     Kind ID: e2node
     Labels: <None>
     Source Id's: uuid:74c614b5-8666-67e9-d1a5-97d95ae83dcd
     Target Id's: uuid:077dca9f-a558-4728-8b6e-6160301a12be
     Aspects:
     - onos.topo.E2Node={"serviceModels":{"1.3.6.1.4.1.53148.1.1.2.102":{"oid":"1.3.6.1.4.1.53148.1.1.2.102","name":"ORAN-E2SM-RSM","ranFunctions":[{"@type":"type.googleapis.com/onos.topo.RSMRanFunction","ricSlicingNodeCapabilityList":[{"maxNumberOfSlicesDl":4,"maxNumberOfSlicesUl":4,"maxNumberOfUesPerSlice":4,"supportedConfig":[{"slicingConfigType":"E2_SM_RSM_COMMAND_EVENT_TRIGGERS"}]}]}],"ranFunctionIDs":[2]},"1.3.6.1.4.1.53148.1.2.2.2":{"oid":"1.3.6.1.4.1.53148.1.2.2.2","name":"ORAN-E2SM-KPM","ranFunctions":[{"@type":"type.googleapis.com/onos.topo.KPMRanFunction","reportStyles":[{"name":"O-CU-UP Measurement Container for the EPC connected deployment","type":6,"measurements":[{"id":"value:1","name":"RRC.ConnEstabAtt.sum"},{"id":"value:2","name":"RRC.ConnEstabSucc.sum"},{"id":"value:3","name":"RRC.ConnReEstabAtt.sum"},{"id":"value:4","name":"RRC.ConnMean"},{"id":"value:5","name":"RRC.ConnMax"}]}]}],"ranFunctionIDs":[1]}}}
     - onos.topo.MastershipState={"term":"1","nodeId":"uuid:077dca9f-a558-4728-8b6e-6160301a12be"}
    
     ID: a1:onos-a1t-84db77df99-4zpsd
     Kind ID: a1t
     Labels: <None>
     Source Id's:
     Target Id's:
     Aspects:
     - onos.topo.A1TInfo={"interfaces":[{"type":"INTERFACE_A1AP","ip":"192.168.84.22","port":9639}]}
    
     ID: e2:onos-e2t-58b4cd867-f4xbb
     Kind ID: e2t
     Labels: <None>
     Source Id's: uuid:077dca9f-a558-4728-8b6e-6160301a12be, uuid:bbe3703e-fc46-409c-92d3-6cf11aa65b07
     Target Id's:
     Aspects:
     - onos.topo.E2TInfo={"interfaces":[{"type":"INTERFACE_E2AP200","ip":"192.168.84.23","port":36421},{"type":"INTERFACE_E2T","ip":"192.168.84.23","port":5150}]}
     - onos.topo.Lease={"expiration":"2022-03-24T17:04:21.582768229Z"}
    
     $ make test-uenib
     Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
     HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
     HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
     *** Get UE-NIB result through CLI ***
     ID: ac303794-2745-4159-b86e-cc203aa3f6b1
     Aspects:
     - onos.uenib.RsmUeInfo={"globalUeId":"ac303794-2745-4159-b86e-cc203aa3f6b1","ueIdList":{"duUeF1apId":{"value":"9594"},"cuUeF1apId":{"value":"9594"},"ranUeNgapId":{},"enbUeS1apId":{"value":14951620},"amfUeNgapId":{}},"bearerIdList":[{"drbID":{"fourGDrbID":{"value":5,"qci":{"value":9}}}}],"cellGlobalId":"e_utra_cgi:{p_lmnidentity:{value:\"\\x02\\xf8\\x10\"}  e_utracell_identity:{value:{value:\"\\x00\\xe0\\x00\\x00\"  len:28}}}","cuE2NodeId":"e2:4/e00/2/64","duE2NodeId":"e2:4/e00/3/c8","sliceList":[]}
    
  • Run make test-kpimon before and after detaching the UE to check if the number of active UEs changes. RRC.ConnMean shows the number of active UEs changing from 1 to 0, since an emulated UE is detached.
     $ make test-kpimon
     Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
     HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
     HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
     *** Get KPIMON result through CLI ***
     Node ID          Cell Object ID       Cell Global ID            Time    RRC.ConnEstabAtt.sum    RRC.ConnEstabSucc.sum    RRC.ConnMax    RRC.ConnMean    RRC.ConnReEstabAtt.sum
     e2:4/e00/2/64                    1                e0000      17:04:24.0                       1                        1              1               1                         0
    
     $ make detach-ue
     Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
     HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
     HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
     echo -en "AT+CPIN=0000\r" | nc -u -w 1 localhost 10000
    
     OK
     echo -en "AT+CGATT=0\r" | nc -u -w 1 localhost 10000
    
     OK
    
     $ make test-kpimon
     Helm values.yaml file: /home/ubuntu/sdran-in-a-box//sdran-in-a-box-values-master-stable.yaml
     HEAD is now at 9f79ab8 Fix the default SRIOV resource name for UPF user plane interfaces
     HEAD is now at acb2f51 Bump up UE chart version - CI test again (#1105)
     *** Get KPIMON result through CLI ***
     Node ID          Cell Object ID       Cell Global ID            Time    RRC.ConnEstabAtt.sum    RRC.ConnEstabSucc.sum    RRC.ConnMax    RRC.ConnMean    RRC.ConnReEstabAtt.sum
     e2:4/e00/2/64                    1                e0000      17:04:35.0                       1                        1              1               0                         0
    

Radio Spectrum Management (RSM) tests

Create a slice:

$ kubectl exec -it deployment/onos-cli -n riab -- onos rsm create slice --e2NodeID e2:4/e00/3/c8 --scheduler RR --sliceID 1 --weight 30 --sliceType DL

Check onos-topo result:

$ kubectl exec -it deployment/onos-cli -n riab -- onos topo get entity e2:4/e00/3/c8 -v

ID: e2:4/e00/3/c8
Kind ID: e2node
Labels: <None>
Source Id's:
Target Id's: uuid:bbe3703e-fc46-409c-92d3-6cf11aa65b07
Aspects:
- onos.topo.E2Node={"serviceModels":{"1.3.6.1.4.1.53148.1.1.2.102":{"oid":"1.3.6.1.4.1.53148.1.1.2.102","name":"ORAN-E2SM-RSM","ranFunctions":[{"@type":"type.googleapis.com/onos.topo.RSMRanFunction","ricSlicingNodeCapabilityList":[{"maxNumberOfSlicesDl":4,"maxNumberOfSlicesUl":4,"maxNumberOfUesPerSlice":4,"supportedConfig":[{},{"slicingConfigType":"E2_SM_RSM_COMMAND_SLICE_UPDATE"},{"slicingConfigType":"E2_SM_RSM_COMMAND_SLICE_DELETE"},{"slicingConfigType":"E2_SM_RSM_COMMAND_UE_ASSOCIATE"}]}]}],"ranFunctionIDs":[1]}}}
- onos.topo.MastershipState={"term":"1","nodeId":"uuid:bbe3703e-fc46-409c-92d3-6cf11aa65b07"}
- onos.topo.RSMSliceItemList={"rsmSliceList":[{"id":"1","sliceDesc":"Slice created by onos-RSM xAPP","sliceParameters":{"weight":30},"ueIdList":[]}]}

Comments