SDRAN-in-a-Box
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
andmake 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