# Installation OSC RIC (Near RT) & E2SIM Guide ![O-RAN Architechture Diagram RT Lab](https://hackmd.io/_uploads/H1t6wItvC.png) :::info ## Background Knowledge A **RAN Intelligent Controller (RIC)** is a crucial software-defined component within the Open Radio Access Network (Open RAN) architecture, designed to manage and enhance RAN functions. It promotes multivendor interoperability, intelligence, agility, and programmability, enabling the integration of third-party applications to automate and optimize RAN operations at scale. This results in reduced total cost of ownership (TCO) for mobile operators and improved quality of experience (QoE) for users, making the RIC a key element in the Open RAN strategy to create flexible, efficient, and cost-effective networks. The **near-RT RIC** is a logical function that optimizes and controls O-CU and O-DU nodes in near-real-time (10 ms to 1 s), guided by policies and models from the non-RT RIC. It manages RAN infrastructure at the cloud edge, hosting cloud-native, microservice-based applications called xApps. The **E2 interface** facilitates the RAN closed-loop control by enabling the RIC to enforce control and policy decisions towards the RAN. It also supports data collection and feedback mechanisms, providing critical information to the near-RT RIC for real-time optimization and management of the network. **E2SIM** is a simulation tool used of Open Radio Access Networks (Open RAN) to emulate the E2 interface, which is essential for interactions between the RAN Intelligent Controller (RIC) and the underlying radio access network components, such as O-CU and O-DU nodes. E2sim allows developers and researchers to test, validate, and optimize the behavior of RAN functions and RIC applications (xApps) in a controlled and virtual environment. ::: ## Prerequisites The steps below assume a clean installation of Ubuntu 20.04 (no k8s, no docker, no helm) ## Installing Near Realtime RIC in RIC Cluster You can Install [Kubernetes](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/) cluster is installed, the next step is to install the (Near Realtime) RIC Platform. ### Deployment Script To access Root: ``` sudo -i ``` Clone the repository : ``` git clone "https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep" -b i-release ``` ### Deployment Infrastructure #### Install kubernetes, kubernetes-CNI, helm and docker Change mirror repository ``` cd ric-dep/bin nano install_k8s_and_helm.sh ### Insert this code curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF ``` ![image-2024-7-17_10-43-5](https://hackmd.io/_uploads/SkN38a3u0.png) ``` cd ric-dep/bin ./install_k8s_and_helm.sh ``` :::success output: ``` root@ubuntu:~/ric-dep/bin# ./install_k8s_and_helm.sh + KUBEV=1.28.11 + KUBECNIV=0.7.5 + HELMV=3.14.4 + DOCKERV=20.10.21 + echo running ./install_k8s_and_helm.sh running ./install_k8s_and_helm.sh + getopts :k:d:e:n:c o + [[ 3.14.4 == 2.* ]] + set -x + export DEBIAN_FRONTEND=noninteractive + DEBIAN_FRONTEND=noninteractive ++ hostname -I ++ hostname . . . ++ hostname + '[' '' == ubuntu ']' + echo 'Done with master node setup' Done with master node setup + [[ ! -z '' ]] + [[ ! -z '' ]] + [[ ! -z '' ]] + [[ 1 -gt 100 ]] + [[ 1 -gt 100 ]] ``` ::: #### Install chartmuseum into helm and add ric-common templates ``` ./install_common_templates_to_helm.sh ``` :::success output: ``` Installing servecm (Chart Manager) and common templates to helm3 Installed plugin: servecm /root/.cache/helm/repository % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 15.0M 100 15.0M 0 0 11.4M 0 0:00:01 0:00:01 --:--:-- 11.4M . . . "local" has been added to your repositories checking that ric-common templates were added NAME CHART VERSION APP VERSION DESCRIPTION local/ric-common 3.3.2 Common templates for inclusion in other charts ``` ::: ### Modify the deployment recipe #### Edit the recipe files ./RECIPE_EXAMPLE/example_recipe_latest_stable.yaml ``` nano ./RECIPE_EXAMPLE/example_recipe_oran_i_release.yaml ``` You can specify which docker registry will be used for each component. If the docker registry requires login credential, you can add the credential in the following section. Extsvcplt can fill your server IP. :::success ![image](https://hackmd.io/_uploads/r1bH7ytvC.png) ![image](https://hackmd.io/_uploads/S1T9XktwR.png) ::: ### Installing the RIC In this section we use [I release] because latest release have error in installations. ``` cd ric-dep/bin ./install -f ../RECIPE_EXAMPLE/example_recipe_oran_i_release.yaml ``` :::success ``` configmap "ricplt-recipe" deleted configmap/ricplt-recipe created Add cluster roles Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "local" chart repository Update Complete. ⎈Happy Helming!⎈ . . . Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "local" chart repository Update Complete. ⎈Happy Helming!⎈ Saving 1 charts Downloading ric-common from repo http://127.0.0.1:8879/charts Deleting outdated charts NAME: r4-jaegeradapter LAST DEPLOYED: Mon Jul 8 04:11:17 2024 NAMESPACE: ricplt STATUS: deployed REVISION: 1 TEST SUITE: None ``` ::: #### Check installation platform ``` kubectl get pods -n ricplt ``` :::success output: ``` root@ubuntu:~# kubectl get pods -n ricplt NAME READY STATUS RESTARTS AGE deployment-ricplt-a1mediator-7d5b85ff7d-5xkmw 1/1 Running 0 13h deployment-ricplt-alarmmanager-6bd5fccfc8-7hx8m 1/1 Running 0 13h deployment-ricplt-appmgr-77986c9cbb-n9hh4 1/1 Running 0 13h deployment-ricplt-e2mgr-78c987559f-xx6l6 1/1 Running 0 13h deployment-ricplt-e2term-alpha-5dc768bcb7-k9dr4 1/1 Running 0 13h deployment-ricplt-jaegeradapter-76ddbf9c9-8hkz7 1/1 Running 0 13h deployment-ricplt-o1mediator-97fb6759b-zcgsw 1/1 Running 0 13h deployment-ricplt-rtmgr-78f768474-vgkkh 1/1 Running 3 13h deployment-ricplt-submgr-56bb776b68-88fzw 1/1 Running 0 13h deployment-ricplt-vespamgr-84f7d87dfb-jdvtr 1/1 Running 0 13h r4-influxdb-influxdb2-0 1/1 Running 0 13h r4-infrastructure-kong-7995f4679b-7x2lk 2/2 Running 2 13h r4-infrastructure-prometheus-alertmanager-5798b78f48-xfcfr 2/2 Running 0 13h r4-infrastructure-prometheus-server-c8ddcfdf5-szkc6 1/1 Running 0 13h statefulset-ricplt-dbaas-server-0 1/1 Running 0 13h ``` ::: :::danger ##### Problem Influxdb not running because PVC ``` nano pv-ricplt.yaml ``` fill this file with : ``` apiVersion: v1 kind: PersistentVolume metadata: name: pv-ricplt-influxdb labels: type: local spec: storageClassName: "manual" capacity: storage: 50Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data" ``` then create file pvc ``` nano pvc-ricplt.yaml ``` fill this file with : ``` apiVersion: v1 kind: PersistentVolumeClaim metadata: name: r4-influxdb-influxdb2 namespace: ricplt spec: storageClassName: "manual" # Empty string must be explicitly set otherwise default StorageClass will be set accessModes: - ReadWriteOnce resources: requests: storage: 30Gi ``` after that build pv and pvc : ``` kubectl apply -f pv-ricplt.yaml kubectl apply -f pvc-ricplt.yaml ``` After this you can see your influxdb running. ::: ##### Add User for database ``` kubectl exec -it r4-influxdb-influxdb2-0 -n ricplt -- /bin/sh ``` ``` root@ubuntu:~# kubectl exec -it r4-influxdb-influxdb2-0 -n ricplt -- /bin/sh / # env | grep INFLUXDB R4_INFLUXDB_INFLUXDB2_PORT_80_TCP_ADDR=10.103.101.32 R4_INFLUXDB_INFLUXDB2_PORT_80_TCP_PORT=80 R4_INFLUXDB_INFLUXDB2_PORT_80_TCP_PROTO=tcp DOCKER_INFLUXDB_INIT_BUCKET=default DOCKER_INFLUXDB_INIT_MODE=setup DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=NFmbiS66DaV9fIoTYTJFqxfveUO4RJzU R4_INFLUXDB_INFLUXDB2_PORT_80_TCP=tcp://10.103.101.32:80 DOCKER_INFLUXDB_INIT_USERNAME=admin R4_INFLUXDB_INFLUXDB2_SERVICE_PORT_HTTP=80 DOCKER_INFLUXDB_INIT_RETENTION=0s R4_INFLUXDB_INFLUXDB2_SERVICE_HOST=10.103.101.32 DOCKER_INFLUXDB_INIT_ORG=influxdata DOCKER_INFLUXDB_INIT_CLI_CONFIG_NAME=default DOCKER_INFLUXDB_INIT_PASSWORD=64VrxG940K0Npg1bEFUAVSuaZCMnQWO6 R4_INFLUXDB_INFLUXDB2_SERVICE_PORT=80 R4_INFLUXDB_INFLUXDB2_PORT=tcp://10.103.101.32:80 INFLUXDB_VERSION=2.2.0 ``` ``` influx config create --active \ -n config-name \ -u http://localhost:8086 \ -t <token admin> \ -o influxdata ``` #### Check installation infrastructure ``` kubectl get pods -n ricinfra ``` :::success ``` root@ubuntu:~/ric-dep/bin# kubectl get pods -n ricinfra NAME READY STATUS RESTARTS AGE deployment-tiller-ricxapp-676dfd8664-lscnb 1/1 Running 0 43m tiller-secret-generator-mlml7 0/1 Completed 0 43m ``` ::: ## Installation E2SIM ![image](https://hackmd.io/_uploads/rk263ZI-R.png) ### Flow Function * Upon startup, Simulator generates E2 Setup Request * For each E2SM that is registered, include RAN function definition * Upon receiving incoming requests, decode * Identify RAN function ID * Call appropriate callback function for RAN function ID and request type * Provide entire encoded request * If no callback is provided, we return an error response * Upon receiving responses, decode: * Identify RAN function ID * If a callback is registered for this message type, call it based on RAN function ID and request type * Provide entire encoded response * If no callback is registered, no action is taken ### Components Function E2 Simulator enables a specific E2SM to be supported by the calling application in the following way: * E2SM must be registered by the calling application * E2SM-specific code uses callbacks to handle interaction from xApp * E2SM-specific code must continuously implement simulation logic Registration of an E2SM with the E2 Simulator entails the following: * RAN function definition * Callback functions for any of the following: 1. Subscription 2. Control 3. Any Responses * Callback functions are responsible for sending responses * They may also need to set up ongoing simulation messaging * REPORT Service sends back periodic Indication messages containing REPORT * INSERT Service sends back periodic Indication messages containing INSERT * They may need to associate incoming messages with existing service invocation * Modify Subscription * CONTROL message associated with INSERT * Base E2 simulator should not be concerned with these details; only specific E2SM code should be responsible for any messaging ## Install E2SIM ### Clone Repo: ``` git clone -b https://github.com/o-ran-sc/sim-e2-interface.git ``` :::success output: ``` root@ubuntu:~# git clone -b https://gerrit.o-ran-sc.org/r/sim/e2-interface.git sc.org/r/sim/e2-interface"Cloning into 'e2-interface'... remote: Total 4964 (delta 0), reused 4964 (delta 0) Receiving objects: 100% (4964/4964), 4.49 MiB | 880.00 KiB/s, done. Resolving deltas: 100% (3911/3911), done. ``` ::: ### Install dependencies: ``` sudo apt-get install -y build-essential git cmake libsctp-dev lksctp-tools autoconf automake libtool bison flex libboost-all-dev sudo apt-get clean ``` :::success Output: ``` Reading package lists... Done Building dependency tree Reading state information... Done libtool is already the newest version (2.4.6-14). 0 upgraded, 0 newly installed, 0 to remove and 72 not upgraded. ``` ::: ### Build the official e2sim: ``` cd ~/e2-interface/e2sim/ mkdir build cd build cmake .. make package ``` :::success Output: ``` root@ubuntu:~/e2-interface/e2sim# mkdir build root@ubuntu:~/e2-interface/e2sim# cd build root@ubuntu:~/e2-interface/e2sim/build# cmake .. -- The C compiler identification is GNU 9.4.0 -- The CXX compiler identification is GNU 9.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done . . . root@ubuntu:~/e2-interface/e2sim/build# make package Scanning dependencies of target encoding_objects [ 0%] Building CXX object src/encoding/CMakeFiles/encoding_objects.dir/encode_e2apv1.cpp.o /root/e2-interface/e2sim/src/encoding/encode_e2apv1.cpp: In function ‘long int encoding::get_function_id_from_subscription(E2AP_PDU_t*)’: . . . [100%] Built target asn1_objects Run CPack packaging tool... CPack: Create package using DEB CPack: Install projects CPack: - Run preinstall target for: e2sim CPack: - Install project: e2sim [] CPack: Create package -- CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies. CPack: - package: /root/e2-interface/e2sim/build/e2sim_1.0.0_amd64.deb generated. . . . root@ubuntu:~/e2-interface/e2sim/build# cmake .. -DDEV_PKG=1 +++ pkg name: e2sim-dev_1.0.0_amd64.deb ### make package will generate only deb package; cannot find support to generate rpm packages +++ profiling is off -- Configuring done -- Generating done -- Build files have been written to: /root/e2-interface/e2sim/build . . . root@ubuntu:~/e2-interface/e2sim/build# make package [ 0%] Built target encoding_objects [ 0%] Built target def_objects [ 1%] Built target sctp_objects [ 1%] Built target messagerouting_objects [ 1%] Built target base_objects Scanning dependencies of target e2sim_static [ 2%] Linking CXX static library libe2sim.a [ 2%] Built target e2sim_static [ 2%] Built target e2sim_shared [100%] Built target asn1_objects Run CPack packaging tool... CPack: Create package using DEB CPack: Install projects CPack: - Run preinstall target for: e2sim CPack: - Install project: e2sim [] CPack: Create package -- CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies. CPack: - package: /root/e2-interface/e2sim/build/e2sim-dev_1.0.0_amd64.deb generated. ``` ::: ### Generate .deb packages and move it: * On plain Ubuntu you might need to install apt install cmake c++ libsctp-dev * To start building docker image one should generate the .deb packages using following * Generate .deb packages and move it to e2sm_examples/kpm_e2sm folder : ``` cmake .. && make package cp *.deb ../e2sm_examples/kpm_e2sm/ ``` :::success output: ``` root@ubuntu:~/e2-interface/e2sim/build# cmake .. && make package && cmake .. -DDEV_PKG=1 && make package +++ pkg name: e2sim_1.0.0_amd64.deb ### make package will generate only deb package; cannot find support to generate rpm packages +++ profiling is off -- Configuring done -- Generating done -- Build files have been written to: /root/e2-interface/e2sim/build [ 0%] Built target encoding_objects [ 0%] Built target def_objects . . . root@ubuntu:~/e2-interface/e2sim/build# cp *.deb ../e2sm_examples/kpm_e2sm/ ``` ::: ### Change the e2tern-sctp-alpha address to connect if you wish to change the e2t address to connect then modify the Dockerfile in e2sm_examples/kpm_e2sm/ path. #### View E2term SCTP IP ``` kubectl get service -n ricplt ``` :::success output: ``` root@ubuntu:~# kubectl get service -n ricplt NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE aux-entry ClusterIP 10.104.205.40 <none> 80/TCP,443/TCP 119m r4-infrastructure-kong-manager NodePort 10.97.41.103 <none> 8002:31384/TCP,8445:31954/TCP 119m r4-infrastructure-kong-proxy LoadBalancer 10.104.247.169 <pending> 80:32080/TCP,443:32443/TCP 119m r4-infrastructure-kong-validation-webhook ClusterIP 10.108.111.106 <none> 443/TCP 119m r4-infrastructure-prometheus-alertmanager ClusterIP 10.101.42.179 <none> 80/TCP 119m r4-infrastructure-prometheus-server ClusterIP 10.96.156.175 <none> 80/TCP 119m service-ricplt-a1mediator-http ClusterIP 10.111.141.65 <none> 10000/TCP 118m service-ricplt-a1mediator-rmr ClusterIP 10.103.222.251 <none> 4561/TCP,4562/TCP 118m service-ricplt-alarmmanager-http ClusterIP 10.107.254.187 <none> 8080/TCP 117m service-ricplt-alarmmanager-rmr ClusterIP 10.103.145.41 <none> 4560/TCP,4561/TCP 117m service-ricplt-appmgr-http ClusterIP 10.107.105.148 <none> 8080/TCP 119m service-ricplt-appmgr-rmr ClusterIP 10.109.187.173 <none> 4561/TCP,4560/TCP 119m service-ricplt-dbaas-tcp ClusterIP None <none> 6379/TCP 119m service-ricplt-e2mgr-http ClusterIP 10.99.1.23 <none> 3800/TCP 118m service-ricplt-e2mgr-rmr ClusterIP 10.107.185.182 <none> 4561/TCP,3801/TCP 118m service-ricplt-e2term-prometheus-alpha ClusterIP 10.106.81.203 <none> 8088/TCP 118m service-ricplt-e2term-rmr-alpha ClusterIP 10.110.221.177 <none> 4561/TCP,38000/TCP 118m service-ricplt-e2term-sctp-alpha NodePort 10.110.72.147 <none> 36422:32222/SCTP 118m service-ricplt-o1mediator-http ClusterIP 10.96.147.72 <none> 9001/TCP,8080/TCP,3000/TCP 117m service-ricplt-o1mediator-tcp-netconf NodePort 10.107.202.218 <none> 830:30830/TCP 117m service-ricplt-rtmgr-http ClusterIP 10.96.141.107 <none> 3800/TCP 119m service-ricplt-rtmgr-rmr ClusterIP 10.100.163.198 <none> 4561/TCP,4560/TCP 119m service-ricplt-submgr-http ClusterIP None <none> 3800/TCP 118m service-ricplt-submgr-rmr ClusterIP None <none> 4560/TCP,4561/TCP 118m service-ricplt-vespamgr-http ClusterIP 10.97.31.72 <none> 8080/TCP,9095/TCP 117m ``` ::: ### Edit file with address to connect ``` nano Dockerfile ``` ![image](https://hackmd.io/_uploads/Hy2TsfFvR.png) ### Ready to build the docker image ``` cd ../e2sm_examples/kpm_e2sm/ docker build -t e2simul:0.0.2 . ``` :::success output: ``` root@ubuntu:~/e2-interface/e2sim/e2sm_examples/kpm_e2sm# root@ubuntu:~/e2-interface/e2sim/e2sm_examples/kpm_e2sm# root@ubuntu:~/e2-interface/e2sim/e2sm_examples/kpm_e2sm# docker build -t e2simul:0.0.2 . Sending build context to Docker daemon 1.172MB Step 1/17 : ARG CONTAINER_PULL_REGISTRY=nexus3.o-ran-sc.org:10002 Step 2/17 : FROM ${CONTAINER_PULL_REGISTRY}/o-ran-sc/bldr-ubuntu18-c-go:1.9.0 as buildenv 1.9.0: Pulling from o-ran-sc/bldr-ubuntu18-c-go f22ccc0b8772: Pull complete 3cf8fb62ba5f: Pull complete e80c964ece6a: Pull complete d4194511dbdc: Pull complete 2d489c440bae: Pull complete 33ee3c77506b: Pull complete 7cdf3f1d17d0: Pull complete cf153de296b0: Pull complete e1920709a3af: Pull complete 6cdcae3380c6: Pull complete 6dbdb1c3e5fd: Pull complete 1710cd1faa0e: Pull complete d44308ed4b3e: Extracting [======= ``` ::: ## Run docker container ### docker run <simulator-image-name> ``` docker run e2simul:0.0.2 ``` :::success output: ``` root@ubuntu:~/sim-e2-interface/e2sim/e2sm_examples/kpm_e2sm# docker run e2simul:0.0.2 [kpm_callbacks.cpp:65] [INFO] Starting KPM simulator [encode_kpm.cpp:49] [INFO] short_name: ORAN-E2SM-KPM, func_desc: KPM Monitor, e2sm_odi: OID123 [encode_kpm.cpp:72] [INFO] Initialize event trigger style list structure [encode_kpm.cpp:91] [INFO] Initialize report style structure [e2sim.cpp:65] [INFO] About to register E2SM RAN function description with ID 2 [e2sim.cpp:43] [INFO] About to register callback for subscription for RAN function with ID 2 [e2sim.cpp:104] [INFO] Start E2 Agent (E2 Simulator) [e2sim.cpp:125] [INFO] After reading input options [e2sim_sctp.cpp:180] [INFO] [SCTP] Binding client socket to source port 36422 [e2sim_sctp.cpp:187] [INFO] [SCTP] Connecting to server at 10.109.135.184:36422 ... [e2sim_sctp.cpp:194] [INFO] [SCTP] Connection established [e2sim.cpp:133] [INFO] SCTP client has been started [e2sim.cpp:143] [INFO] Constructing a list of RAN functions based on registered information [e2sim.cpp:149] [INFO] Adding RAN function ID 2, description: h0ORAN-E2SM-KPM to the list [e2sim.cpp:161] [INFO] Generate E2AP v1 setup request for all registered RAN functions . . . [kpm_callbacks.cpp:651] [INFO] Encode and sending E2AP subscription success response via SCTP [e2ap_asn1c_codec.c:175] [DEBUG] [E2AP ASN] Encoded succesfully, encoded size = 33 [kpm_callbacks.cpp:654] [INFO] Now generating data for subscription request [kpm_callbacks.cpp:167] [INFO] Current line: {"ueMeasReport":{"du-id":1002,"measTimeStampRf":"2020-11-05T15:39:58.858734","ueMeasReportList":[{"ue-id":"Pedestrian-11","nrCellIdentity":2,"targetTput":0.3,"servingCellRfReport":{"rsrp":74,"rsrq":65,"rssinr":113},"neighbourCellList":[{"nbCellIdentity":8,"nbCellRfReport":{"rsrp":67,"rsrq":65,"rssinr":112}},{"nbCellIdentity":7,"nbCellRfReport":{"rsrp":65,"rsrq":65,"rssinr":107}},{"nbCellIdentity":9,"nbCellRfReport":{"rsrp":64,"rsrq":65,"rssinr":106}},{"nbCellIdentity":1,"nbCellRfReport":{"rsrp":63,"rsrq":65,"rssinr":104}},{"nbCellIdentity":3,"nbCellRfReport":{"rsrp":62,"rsrq":65,"rssinr":101}},{"nbCellIdentity":10,"nbCellRfReport":{"rsrp":61,"rsrq":65,"rssinr":100}},{"nbCellIdentity":6,"nbCellRfReport":{"rsrp":59,"rsrq":65,"rssinr":95}}],"throughput":0.3,"prb_usage":23}]}} [kpm_callbacks.cpp:182] [INFO] First key is ueMeasReport [kpm_callbacks.cpp:189] [INFO] Start sending UE measurement reports with DU id 1002 [kpm_callbacks.cpp:205] [INFO] Preparing report data for UE 0 with id P:�� [kpm_callbacks.cpp:297] [INFO] This is neighbor str [{"CID" : "37343722511136087", "Cell-RF" : {"rsrp": 67, "rsrq": 65, "rssinr": 112}},{"CID" : "37343722511136077", "Cell-RF" : {"rsrp": 65, "rsrq": 65, "rssinr": 107}},{"CID" : "37343722511136097", "Cell-RF" : {"rsrp": 64, "rsrq": 65, "rssinr": 106}},{"CID" : "37343722511136017", "Cell-RF" : {"rsrp": 63, "rsrq": 65, "rssinr": 104}},{"CID" : "37343722511136037", "Cell-RF" : {"rsrp": 62, "rsrq": 65, "rssinr": 101}},{"CID" : "373437225111360107", "Cell-RF" : {"rsrp": 61, "rsrq": 65, "rssinr": 100}},{"CID" : "37343722511136067", "Cell-RF" : {"rsrp": 59, "rsrq": 65, "rssinr": 95}}] ``` ::: ## Build pods with helm you can build e2sim to ricplt with this command: ``` helm install e2sim ./helm -n ricplt ``` and e2sim will show in your pods ricplt