---
# System prepended metadata

title: Configuration RIC

---

# Configuration RIC

## Environment
Hardware requests :
- RAM : 8G RAM
- CPU : 6 core
- Disk : 40G

Installation Environment：
- VM：Ubuntu 20.04 LTS (Focal Fossa)

Platform Environment：
- Kubernetes：1.16.0
- Helm：3.5.4
- Docker：20.10.

## 1. Install the Docker, Kubernetes and Helm 3
### 1.2 Become root user : 
```
## Become root user
sudo -i
```
output : 
```
root@teep-ric:~#
```

### 1.3 Install the Dependent Tools
```
apt-get update

## Install the Dependent Tools
apt-get install -y git vim curl net-tools openssh-server python3-pip nfs-common
```

output : 

```
root@teep-ric:~# apt-get install -y git vim curl net-tools openssh-server python3-pip nfs-common
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
net-tools is already the newest version (1.60+git20181103.0eebece-1ubuntu5).
curl is already the newest version (7.81.0-1ubuntu1.15).
curl set to manually installed.
git is already the newest version (1:2.34.1-1ubuntu1.10).
git set to manually installed.
openssh-server is already the newest version (1:8.9p1-3ubuntu0.6).
vim is already the newest version (2:8.2.3995-1ubuntu2.15).
vim set to manually installed.
.
.
.
Running kernel seems to be up-to-date.

Restarting services...
Service restarts being deferred:
 /etc/needrestart/restart.d/dbus.service
 systemctl restart networkd-dispatcher.service
 systemctl restart systemd-logind.service
 systemctl restart unattended-upgrades.service
 systemctl restart user@1000.service

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.
```

### 1.4 Download the source code of RIC Platform
```
cd ~
git clone https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep -b i-release
```
output : 
```
root@teep-ric:~# cd ~
git clone https://gerrit.o-ran-sc.org/r/ric-plt/ric-dep -b i-release
Cloning into 'ric-dep'...
remote: Total 2199 (delta 0), reused 2199 (delta 0)
Receiving objects: 100% (2199/2199), 879.62 KiB | 1.20 MiB/s, done.
Resolving deltas: 100% (906/906), done.
.
.
.
root@teep-ric:~# ll
total 32
drwx------  5 root root 4096 Mar 18 15:39 ./
drwxr-xr-x 19 root root 4096 Mar 15 08:22 ../
-rw-------  1 root root  210 Mar 17 03:33 .bash_history
-rw-r--r--  1 root root 3106 Oct 15  2021 .bashrc
-rw-r--r--  1 root root  161 Jul  9  2019 .profile
drwxr-xr-x 11 root root 4096 Mar 18 15:39 ric-dep/
drwx------  3 root root 4096 Mar 15 08:27 snap/
drwx------  2 root root 4096 Mar 15 08:27 .ssh/
-rw-r--r--  1 root root    0 Mar 15 14:27 .sudo_as_admin_successful
```

### 1.5 Execute the Installation Script of the Docker, Kubernetes and Helm 3


add repository alternative:
```
nano root/etc/apt/sources.list
```
adding to sources : ' deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main '

continue command : 
```
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | gpg --dearmor > /usr/share/keyrings/EXAMPLE.gpg
echo "deb [signed-by=/usr/share/keyrings/EXAMPLE.gpg] https://mirrors.aliyun.com/kubernetes/apt stable main" || sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

```
cd ric-dep/bin
./install_k8s_and_helm.sh
```

output : 
```
root@teep-ric:~# cd ric-dep/bin
./install_k8s_and_helm.sh
+ KUBEV=1.16.0
+ KUBECNIV=0.7.5
+ HELMV=3.5.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.5.4 == 2.* ]]
+ set -x
+ export DEBIAN_FRONTEND=noninteractive
+ DEBIAN_FRONTEND=noninteractive
++ hostname -I
++ hostname
+ echo '192.168.0.155  ubuntu'
+ printenv
SHELL=/bin/bash
SUDO_GID=1000
SUDO_COMMAND=/bin/bash
SUDO_USER=ubuntu
PWD=/root/ric-dep/bin
LOGNAME=root
HOME=/root
LANG=en_US.UTF-8
.
.
.
+ echo '> waiting for 0/8 pods running in namespace [kube-system] with keyword [Running]'
> waiting for 0/8 pods running in namespace [kube-system] with keyword [Running]
+ '[' 0 -lt 8 ']'
+ sleep 5
.
.
.
+ '[' '' == teep-ric ']'
+ echo 'Done with master node setup'
Done with master node setup
+ [[ ! -z '' ]]
+ [[ ! -z '' ]]
+ [[ ! -z '' ]]
+ [[ 1 -gt 100 ]]
+ [[ 1 -gt 100 ]]
```

### 1.6 Check the Status of Kubernetes deployment

```
kubectl get pods -A

```

output : 
```
root@teep-ric:~/ric-dep/bin# kubectl get pods -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-787d4945fb-5f5zs           1/1     Running   0          39s
kube-system   coredns-787d4945fb-fx56v           1/1     Running   0          39s
kube-system   etcd-teep-ric                      1/1     Running   4          53s
kube-system   kube-apiserver-teep-ric            1/1     Running   3          53s
kube-system   kube-controller-manager-teep-ric   1/1     Running   3          52s
kube-system   kube-flannel-ds-m6slx              1/1     Running   0          39s
kube-system   kube-proxy-7m487                   1/1     Running   0          39s
kube-system   kube-scheduler-teep-ric            1/1     Running   3          53s
```

## 2. Install the Near-RT RIC Platform
### 2.1 Add the ric-common templates
command:
```
./install_common_templates_to_helm.sh

```

output:

```
root@teep-ric:~/ric-dep/bin# ./install_common_templates_to_helm.sh
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  3460k      0  0:00:04  0:00:04 --:--:-- 4315k
linux-386/
linux-386/chartmuseum
linux-386/LICENSE
linux-386/README.md
servecm not yet running. sleeping for 2 seconds
nohup: appending output to 'nohup.out'
servcm up and running
/root/.cache/helm/repository
Successfully packaged chart and saved it to: /tmp/ric-common-3.3.2.tgz
Error: no repositories configured
"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
```

command:
```
./setup-ric-common-template
```

output:
```
root@teep-ric:~/ric-dep/bin# ./setup-ric-common-template
Cloning into '../dep'...
remote: Counting objects: 318, done
remote: Finding sources: 100% (6989/6989)
remote: Total 6989 (delta 2787), reused 6952 (delta 2787)
Receiving objects: 100% (6989/6989), 3.81 MiB | 20.00 KiB/s, done.
Resolving deltas: 100% (2787/2787), done.
.
.
.
+ NONRTRIC_COMMON_CHART_VERSION=2.0.0
+ helm package -d /tmp /root/ric-dep/dep/bin/../ric-common/Common-Template/helm/nonrtric-common
Successfully packaged chart and saved it to: /tmp/nonrtric-common-2.0.0.tgz
+ cp /tmp/nonrtric-common-2.0.0.tgz /root/.cache/helm/repository/local/
+ helm repo index /root/.cache/helm/repository/local/
+ helm repo remove local
"local" has been removed from your repositories
+ helm repo add local http://127.0.0.1:8879/charts
"local" has been added to your repositories
```

### 2.2 Edit Deployment Configuration
#### 2.2.1 Modify the code of xApp Manager
##### 2.2.1.1 Modify the Log-Level
command : 
```
sudo nano ~/ric-dep/helm/appmgr/resources/appmgr.yaml
```
Add loglevel “DEBUG”：
Add loglevel : 4

```
"xapp":
  #Namespace to install xAPPs
  "namespace": __XAPP_NAMESPACE__
  "tarDir": "/tmp"
  "schema": "descriptors/schema.json"
  "config": "config/config-file.json"
  "tmpConfig": "/tmp/config-file.json"
  "loglevel" :  4  
```

#### 2.2.2 Modify the code of A1 Mediator
##### 2.2.2.1 Modify the Log-Level
**Step 1：Modify the loglevel.txt section**

command : 
```
sudo nano ~/ric-dep/helm/a1mediator/templates/config.yaml
```

Change log-level: {{ .Values.loglevel }} to log-level: {{ .Values.a1mediator.loglevel }}

output : 
```
  loglevel.txt: |
    log-level: {{ .Values.a1mediator.loglevel }}
```

**Step 2：Change loglevel from INFO to DEBUG & change Component Connection**

command : 
```
sudo nano ~/ric-dep/helm/a1mediator/values.yaml
```
Change loglevel from INFO to DEBUG & add a1ei: ecs_ip_port: "http://<ecs_host>:<ecs_port>

output: 
```
  rmr_timeout_config:
    a1_rcv_retry_times: 20
    ins_del_no_resp_ttl: 5
    ins_del_resp_ttl: 10
  loglevel: "DEBUG"
  a1ei:
    ecs_ip_port: "http://<ecs_host>:<ecs_port>"
```
#### 2.2.2.2 Component Connection

**Step 1：Add ENV for A1EI**
```
sudo nano ~/ric-dep/helm/a1mediator/templates/env.yaml
```
Add ECS_SERVICE_HOST: {{ .Values.a1mediator.a1ei.ecs_ip_port }}

output: 
```
  INSTANCE_DELETE_NO_RESP_TTL: "{{ .Values.a1mediator.rmr_timeout_config.ins_del_no_resp_ttl }}"
  INSTANCE_DELETE_RESP_TTL: "{{ .Values.a1mediator.rmr_timeout_config.ins_del_resp_ttl }}"
  CONFIG_MAP_NAME: "/opt/route/loglevel.txt"
  ECS_SERVICE_HOST: {{ .Values.a1mediator.a1ei.ecs_ip_port }}
```

#### 2.2.3 Modify the code of E2 Termination(Error occurred, Skipped!!)

#### 2.2.4 Modify the code of Subscription Manager
##### 2.2.4.1 Modify the Log-Level
Change level from 3(Info) to 4(Debug)：
```
sudo nano ~/ric-dep/helm/submgr/templates/configmap.yaml
```

output:
```
 submgrcfg: |
    "local":
      "host": ":8080"
    "logger":
      "level": 4
    "rmr":
      "protPort" : "tcp:4560"
      "maxSize": 8192
      "numWorkers": 1
```

#### 2.2.4.2 Component Connection

Step 1：Add new port for subscription in service file

```
sudo nano ~/ric-dep/helm/submgr/templates/service-http.yaml
```

Add Line 11 to 14 
```
spec:
  selector:
    app: {{ include "common.namespace.platform" . }}-{{ include "common.name.submgr" . }}
    release: {{ .Release.Name }}
  clusterIP: None
  ports:
  - name: http
    port: {{ include "common.serviceport.submgr.http" . }}
    protocol: TCP
    targetPort: http
  - name: subscription
    port: 8088
    protocol: TCP
    targetPort: 8088
```

Step 2：Add new port for subscription in deployment file
```
sudo nano ~/ric-dep/helm/submgr/templates/deployment.yaml
```
Add Line from 9 to 11
```
containers:
          ...
          envFrom:
            - configMapRef:
                name: {{ include "common.configmapname.submgr" . }}-env
            - configMapRef:
                name: {{ include "common.configmapname.dbaas" . }}-appconfig
          ports:
            - name: subscription
              containerPort: 8088
              protocol: TCP
	    ...
```

#### 2.2.5 Modify the code of Routing Manager
##### 2.2.5.1 Routing Path Configuration
Add A1EI Msgtype and A1EI Routes：
```
sudo nano ~/ric-dep/helm/rtmgr/templates/config.yaml
```
Add Line from 3 to 7 & 12 to 13
```
       "messagetypes": [
          ...
          "A1_EI_QUERY_ALL=20013",
          "A1_EI_QUERY_ALL_RESP=20014",
          "A1_EI_CREATE_JOB=20015",
          "A1_EI_CREATE_JOB_RESP=20016",
          "A1_EI_DATA_DELIVERY=20017",
          ]
          ...
      "PlatformRoutes": [
         ...
         { 'messagetype': 'A1_EI_QUERY_ALL','senderendpoint': '', 'subscriptionid': -1, 'endpoint': 'A1MEDIATOR', 'meid': ''},
         { 'messagetype': 'A1_EI_CREATE_JOB','senderendpoint': '', 'subscriptionid': -1, 'endpoint': 'A1MEDIATOR', 'meid': ''},
          ]
```
#### 2.2.6 Modify the code of Alarm Manager
##### 2.2.6.1 Component Connection
Step 1：Change controls.promAlertManager.address
```
sudo nano ~/ric-dep/helm/alarmmanager/templates/configmap.yaml
```

change cpro-alertmanager:80 to r4-infrastructure-prometheus-alertmanager:80

```
controls": {
        "promAlertManager": {
          "address": "r4-infrastructure-prometheus-alertmanager:80",
          "baseUrl": "api/v2",
          "schemes": "http",
          "alertInterval": 30000
        },
```
Step 2：Add livenessProbe and readinessProbe

```
sudo nano ~/ric-dep/helm/alarmmanager/templates/deployment.yaml

```
Add Line from 10 to 25
```
    spec:
      hostname: {{ include "common.name.alarmmanager" . }}
      imagePullSecrets:
        - name: {{ include "common.dockerregistry.credential" $imagectx }}
      serviceAccountName: {{ include "common.serviceaccountname.alarmmanager" . }}
      containers:
        - name: {{ include "common.containername.alarmmanager" . }}
          image: {{ include "common.dockerregistry.url" $imagectx }}/{{ .Values.alarmmanager.image.name }}:{{ $imagetag }}
          imagePullPolicy: {{ include "common.dockerregistry.pullpolicy" $pullpolicyctx }}
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: ric/v1/health/ready
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 15
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: ric/v1/health/alive
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 15
          ...
```
#### 2.2.7 Modify the code of O1 Mediator
##### 2.2.7.1 Component Connection
Add livenessProbe and readinessProbe：
```
sudo nano ~/ric-dep/helm/o1mediator/templates/deployment.yaml
```

Add Line from 10 to 29

```
spec:
      hostname: {{ include "common.name.o1mediator" . }}
      imagePullSecrets:
        - name: {{ include "common.dockerregistry.credential" $imagectx }}
      serviceAccountName: {{ include "common.serviceaccountname.o1mediator" . }}
      containers:
        - name: {{ include "common.containername.o1mediator" . }}
          image: {{ include "common.dockerregistry.url" $imagectx }}/{{ .Values.o1mediator.image.name }}:{{ .Values.o1mediator.image.tag }}
          imagePullPolicy: {{ include "common.dockerregistry.pullpolicy" $pullpolicyctx }}
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: ric/v1/health/alive
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 15
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: ric/v1/health/ready
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 15
            successThreshold: 1
            timeoutSeconds: 1
          ...
```

### 2.3 Install nfs for InfluxDB

```
kubectl create ns ricinfra
helm repo add stable https://charts.helm.sh/stable
helm install nfs-release-1 stable/nfs-server-provisioner --namespace ricinfra 
kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
sudo apt install nfs-common
```
output : 
```
root@teep-ric:~# kubectl create ns ricinfra
all nfs-release-1 stable/nfs-server-provisioner --namespace ricinfra
kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
sudo apt install nfs-commonnamespace/ricinfra created
root@teep-ric:~# helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories
root@teep-ric:~# helm install nfs-release-1 stable/nfs-server-provisioner --namespace ricinfra
WARNING: This chart is deprecated
NAME: nfs-release-1
LAST DEPLOYED: Tue Apr  2 11:08:00 2024
.
.
.
root@teep-ric:~# kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/nfs patched
```

### 2.4 Execute the Installation Script of Near-RT RIC
Find your IP of VM：
```
ip a
```

output:

```
root@teep-ric:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether b6:64:fb:a9:11:fe brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.0.212/24 brd 192.168.0.255 scope global noprefixroute ens18
       valid_lft forever preferred_lft forever
    inet6 fe80::8afa:e23b:85c6:4d3e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:da:f3:d4:ee brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether ea:49:e0:af:53:f0 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::e849:e0ff:feaf:53f0/64 scope link
       valid_lft forever preferred_lft forever
```

Modify the IP of RIC and AUX：:
```
sudo nano ~/ric-dep/RECIPE_EXAMPLE/example_recipe_oran_i_release.yaml
```
output:
```
# Change the namespaces using the following options
#  namespace:
#    aux: ricaux
#    platform: ricplt
#    xapp: ricxapp
#    infra: ricinfra

# ricip should be the ingress controller listening IP for the platform cluster
# auxip should be the ingress controller listening IP for the AUX cluster
extsvcplt:
  ricip: "192.168.0.212"
  auxip: "192.168.0.212"

```
Deploy the RIC Platform：
```
cd ~/ric-dep/bin
./install -f ../RECIPE_EXAMPLE/example_recipe_oran_i_release.yaml -c "jaegeradapter influxdb"

```
output:
```
root@teep-ric:~/ric-dep/bin# ./install -f ../RECIPE_EXAMPLE/example_recipe_oran_i_release.yaml -c "jaegeradapter influxdb"
namespace/ricplt created
namespace/ricxapp created
nfs storage exist
Deploying RIC infra components [infrastructure dbaas appmgr rtmgr e2mgr e2term a1mediator submgr vespamgr o1mediator alarmmanager jaegeradapter influxdb]
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
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 7 charts
.
.
.
InfluxDB 2 is deployed as a StatefulSet on your cluster.

You can access it by using the service name: r4-influxdb-influxdb2

To retrieve the password for the 'admin' user:

  echo $(kubectl get secret r4-influxdb-influxdb2-auth -o "jsonpath={.data['admin-password']}" --namespace ricplt | base64 --decode)

Note: with enabled persistence, admin password is only set once during the initial deployment. The password is not changed when InfluxDB 2 is re-deployed with different password.
```

### 2.5. Check the Status of Near-RT RIC deployment

* Results similar to the output shown below indicate a complete and successful deployment, all are either “Completed” or “Running”, and that none are “Error”, “Pending”, “Evicted”,or “ImagePullBackOff”.
* The status of pods “PodInitializing” & “Init” & “ContainerCreating” mean that the pods are creating now, you need to wait for deploying.

```
kubectl get pods -A
```

Output:
```
root@teep-ric:~/ric-dep/bin# kubectl get pods -A
NAMESPACE     NAME                                                         READY   STATUS      RESTARTS   AGE
kube-system   coredns-5644d7b6d9-88pl2                                     1/1     Running     0          39m
kube-system   coredns-5644d7b6d9-v9pmm                                     1/1     Running     0          39m
kube-system   etcd-teep-ric                                                1/1     Running     0          37m
kube-system   kube-apiserver-teep-ric                                      1/1     Running     0          37m
kube-system   kube-controller-manager-teep-ric                             1/1     Running     0          38m
kube-system   kube-flannel-ds-dp2hm                                        1/1     Running     0          39m
kube-system   kube-proxy-6zz8v                                             1/1     Running     0          39m
kube-system   kube-scheduler-teep-ric                                      1/1     Running     0          38m
ricinfra      deployment-tiller-ricxapp-68f777c4d4-xw2m4                   1/1     Running     0          12m
ricinfra      nfs-release-1-nfs-server-provisioner-0                       1/1     Running     0          13m
ricinfra      tiller-secret-generator-hsttk                                0/1     Completed   0          12m
ricplt        deployment-ricplt-a1mediator-7d5b85ff7d-nnlmf                1/1     Running     0          10m
ricplt        deployment-ricplt-alarmmanager-5b797c9484-klnvj              1/1     Running     0          9m17s
ricplt        deployment-ricplt-appmgr-77986c9cbb-cxhcr                    1/1     Running     0          11m
ricplt        deployment-ricplt-e2mgr-78c987559f-pcz7j                     1/1     Running     0          10m
ricplt        deployment-ricplt-e2term-alpha-5dc768bcb7-smk8w              1/1     Running     0          10m
ricplt        deployment-ricplt-jaegeradapter-76ddbf9c9-ljhgp              1/1     Running     0          9m
ricplt        deployment-ricplt-rtmgr-78f768474-8bs4p                      1/1     Running     6          11m
ricplt        deployment-ricplt-submgr-547965db4c-7rhct                    1/1     Running     0          10m
ricplt        deployment-ricplt-vespamgr-84f7d87dfb-2tr2v                  1/1     Running     0          9m49s
ricplt        r4-influxdb-influxdb2-0                                      1/1     Running     0          8m52s
ricplt        r4-infrastructure-kong-7995f4679b-pcdkt                      2/2     Running     2          12m
ricplt        r4-infrastructure-prometheus-alertmanager-5798b78f48-5wssd   2/2     Running     0          12m
ricplt        r4-infrastructure-prometheus-server-c8ddcfdf5-bftkp          1/1     Running     0          12m
ricplt        statefulset-ricplt-dbaas-server-0                            1/1     Running     0          11m
```

## 3. Install the DMS Tool

### 3.1 Install the DMS tool

Prepare source code：
```
docker run --rm -u 0 -it -d -p 8090:8080 -e DEBUG=1 -e STORAGE=local -e STORAGE_LOCAL_ROOTDIR=/chart -v $(pwd)/charts:/charts chartmuseum/chartmuseum:latest
export CHART_REPO_URL=http://0.0.0.0:8090
git clone https://gerrit.o-ran-sc.org/r/ric-plt/appmgr -b i-release
```
output:
```
root@teep-ric:~/ric-dep/bin# docker run --rm -u 0 -it -d -p 8090:8080 -e DEBUG=1 -e STORAGE=local -e STORAGE_LOCAL_ROOTDIR=/chart -v $(pwd)/charts:/charts chartmuseum/chartmuseum:latest
Unable to find image 'chartmuseum/chartmuseum:latest' locally
latest: Pulling from chartmuseum/chartmuseum
596ba82af5aa: Pull complete
97cda76ac4f8: Pull complete
7cd1b4b8c77a: Pull complete
Digest: sha256:7fb4cd65d68978b1280f39cedc8c4db8c96efe6f622160a109b425a95098615f
Status: Downloaded newer image for chartmuseum/chartmuseum:latest
e9995461ba3d653d45f6c3ffd2dad079bc8c54edf3febd1aeafa9bdad0bed4c7
root@teep-ric:~/ric-dep/bin# export CHART_REPO_URL=http://0.0.0.0:8090
root@teep-ric:~/ric-dep/bin# cd ~
root@teep-ric:~# git clone https://gerrit.o-ran-sc.org/r/ric-plt/appmgr -b i-release
Cloning into 'appmgr'...
remote: Counting objects: 13, done
remote: Total 790 (delta 0), reused 790 (delta 0)
```

Install DMS tool：

```
cd appmgr/xapp_orchestrater/dev/xapp_onboarder
apt-get install python3-pip
pip3 uninstall xapp_onboarder
pip3 install ./
chmod 755 /usr/local/bin/dms_cli
ls -la /usr/local/lib/ptyhon3.8
chmod -R 755 /usr/local/lib/python3.8
```

output:
```
root@teep-ric:~# cd appmgr/xapp_orchestrater/dev/xapp_onboarder
root@teep-ric:~/appmgr/xapp_orchestrater/dev/xapp_onboarder# apt-get install python3-pip
Reading package lists... Done
Building dependency tree
Reading state information... Done
python3-pip is already the newest version (20.0.2-5ubuntu1.10).
0 upgraded, 0 newly installed, 0 to remove and 82 not upgraded.
root@teep-ric:~/appmgr/xapp_orchestrater/dev/xapp_onboarder# pip3 uninstall xapp_onboarder
WARNING: Skipping xapp-onboarder as it is not installed.
root@teep-ric:~/appmgr/xapp_orchestrater/dev/xapp_onboarder#
.
.
.
root@teep-ric:~/appmgr/xapp_orchestrater/dev/xapp_onboarder# pip3 install ./
Processing /root/appmgr/xapp_orchestrater/dev/xapp_onboarder
Requirement already satisfied: Click==7.0 in /usr/lib/python3/dist-packages (from xapp-onboarder==1.0.0) (7.0)
Collecting Flask==1.1.1
  Downloading Flask-1.1.1-py2.py3-none-any.whl (94 kB)
     |████████████████████████████████| 94 kB 2.7 MB/s
.
.
.
root@teep-ric:~/appmgr/xapp_orchestrater/dev/xapp_onboarder# pip3 install ./
Processing /root/appmgr/xapp_orchestrater/dev/xapp_onboarder
Requirement already satisfied: Click==7.0 in /usr/lib/python3/dist-packages (from xapp-onboarder==1.0.0) (7.0)
Requirement already satisfied: Flask==1.1.1 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (1.1.1)
Requirement already satisfied: Jinja2==2.11.1 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (2.11.1)
Requirement already satisfied: MarkupSafe==1.1.1 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (1.1.1)
Requirement already satisfied: PyYAML==5.3 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (5.3)
Requirement already satisfied: Werkzeug==0.16.1 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (0.16.1)
Requirement already satisfied: aniso8601==8.0.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (8.0.0)
Requirement already satisfied: attrs==19.3.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (19.3.0)
Requirement already satisfied: certifi==2019.11.28 in /usr/lib/python3/dist-packages (from xapp-onboarder==1.0.0) (2019.11.28)
Requirement already satisfied: chardet==3.0.4 in /usr/lib/python3/dist-packages (from xapp-onboarder==1.0.0) (3.0.4)
Requirement already satisfied: fire==0.2.1 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (0.2.1)
Requirement already satisfied: flask-restplus==0.13.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (0.13.0)
Requirement already satisfied: idna==2.9 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (2.9)
Requirement already satisfied: importlib-metadata==1.5.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (1.5.0)
Requirement already satisfied: itsdangerous==1.1.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (1.1.0)
Requirement already satisfied: jsonschema==3.2.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (3.2.0)
Requirement already satisfied: pyrsistent==0.15.7 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (0.15.7)
Requirement already satisfied: pytz==2019.3 in /usr/lib/python3/dist-packages (from xapp-onboarder==1.0.0) (2019.3)
Requirement already satisfied: requests==2.23.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (2.23.0)
Requirement already satisfied: six==1.14.0 in /usr/lib/python3/dist-packages (from xapp-onboarder==1.0.0) (1.14.0)
Requirement already satisfied: termcolor==1.1.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (1.1.0)
Requirement already satisfied: urllib3==1.25.8 in /usr/lib/python3/dist-packages (from xapp-onboarder==1.0.0) (1.25.8)
Requirement already satisfied: zipp==3.0.0 in /usr/local/lib/python3.8/dist-packages (from xapp-onboarder==1.0.0) (3.0.0)
Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from jsonschema==3.2.0->xapp-onboarder==1.0.0) (45.2.0)
```