1 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
2 .. SPDX-License-Identifier: CC-BY-4.0
3 .. Copyright (C) 2021 Wind River Systems, Inc.
16 This document describes how to install INF O2 service over O-RAN INF platform.
18 The audience of this document is assumed to have basic knowledge in kubernetes cli, helm chart cli.
24 Before starting the installation and deployment of O-RAN O2 service, you should have already deployed O-RAN INF platform, and you need to download the helm charts or build from source as described in developer-guide.
27 INF O2 Service in E Release
28 ===========================
30 1. Provision remote cli for kubernetes over INF platform
31 --------------------------------------------------------
34 1.1 Setup Service Account over O-RAN INF platform
35 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 The following instruction must be done over INF platform controller host (controller-0)
39 - Please see the O-RAN INF documentation to find out how to ssh to controller host of INF platform.
44 NAMESPACE="kube-system"
46 cat <<EOF > admin-login.yaml
51 namespace: kube-system
53 apiVersion: rbac.authorization.k8s.io/v1
54 kind: ClusterRoleBinding
58 apiGroup: rbac.authorization.k8s.io
62 - kind: ServiceAccount
64 namespace: kube-system
67 kubectl apply -f admin-login.yaml
68 TOKEN_DATA=$(kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep ${USER} | awk '{print $1}') | grep "token:" | awk '{print $2}')
72 1.2 Setup remote cli over another linux host (ubuntu as example)
73 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75 The following instruction should be done outside of INF platform controller host
79 sudo apt-get install -y apt-transport-https
80 echo "deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main" | \
81 sudo tee -a /etc/apt/sources.list.d/kubernetes.list
82 gpg --keyserver keyserver.ubuntu.com --recv-keys 836F4BEB
83 gpg --export --armor 836F4BEB | sudo apt-key add -
85 sudo apt-get install -y kubectl
87 source <(kubectl completion bash) # setup autocomplete in bash into the current shell, bash-completion package should be installed first.
88 echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.
90 curl -O https://get.helm.sh/helm-v3.5.3-linux-amd64.tar.gz
91 tar xvf helm-v3.5.3-linux-amd64.tar.gz
92 sudo cp linux-amd64/helm /usr/local/bin/
94 source <(helm completion bash)
95 echo "source <(helm completion bash)" >> ~/.bashrc
99 TOKEN_DATA=<TOKEN_DATA from INF>
103 kubectl config set-cluster inf-cluster --server=https://${OAM_IP}:6443 --insecure-skip-tls-verify
104 kubectl config set-credentials ${USER} --token=$TOKEN_DATA
105 kubectl config set-context ${USER}@inf-cluster --cluster=inf-cluster --user ${USER} --namespace=${NAMESPACE}
106 kubectl config use-context ${USER}@inf-cluster
111 2. Deploy INF O2 service
112 ------------------------
114 2.1 Retrieve Helm chart for deploying of INF O2 service
115 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119 git clone -b e-release "https://gerrit.o-ran-sc.org/r/pti/o2"
123 2.2 Prepare override yaml
124 ~~~~~~~~~~~~~~~~~~~~~~~~~
128 export NAMESPACE=oran-o2
129 kubectl create ns ${NAMESPACE}
131 # default kube config location is ~/.kube/config
132 cp ~/.kube/config o2/charts/resources/scripts/init/k8s_kube.conf
134 export OS_AUTH_URL=<INF OAM Auth URL e.g.: http://OAM_IP:5000/v3>
135 export OS_USERNAME=<INF username e.g.: admin>
136 export OS_PASSWORD=<INF password for user e.g.: adminpassword>
138 # If the external OAM IP same as OS_AUTH_URL's IP address, you can use the below command to set the environment
139 # export API_HOST_EXTERNAL_FLOATING=$(echo ${OS_AUTH_URL} | sed -e s,`echo ${OS_AUTH_URL} | grep :// | sed -e's,^\(.*//\).*,\1,g'`,,g | cut -d/ -f1 | sed -e 's,:.*,,g')
140 export API_HOST_EXTERNAL_FLOATING=<INF external_oam_floating_address e.g.: 128.10.10.10>
142 # please specify the smo service account yaml file
143 export SMO_SERVICEACCOUNT=<your input here eg.: smo>
144 # service account and binding for smo yaml file
146 cat <<EOF >smo-serviceaccount.yaml
147 apiVersion: rbac.authorization.k8s.io/v1
153 - apiGroups: [""] # "" indicates the core API group
155 verbs: ["get", "watch", "list"]
160 name: ${SMO_SERVICEACCOUNT}
163 apiVersion: rbac.authorization.k8s.io/v1
169 apiGroup: rbac.authorization.k8s.io
173 - kind: ServiceAccount
174 name: ${SMO_SERVICEACCOUNT}
179 kubectl apply -f smo-serviceaccount.yaml
181 #export the smo account token data
182 export SMO_TOKEN_DATA=$(kubectl -n default describe secret $(kubectl -n default get secret | grep ${SMO_SERVICEACCOUNT} | awk '{print $1}') | grep "token:" | awk '{print $2}')
184 #prepare the application config file
188 ocloud_global_id = 4e24b97c-8c49-4c4f-b53e-3de5235a4e37
189 smo_register_url = http://127.0.0.1:8090/register
190 smo_token_data = ${SMO_TOKEN_DATA}
201 #prepare the ssl cert files or generate with below command.
210 -keyout $PARENT.key \
212 -subj "/CN=${PARENT}" \
217 echo 'default_bits= 4096'; \
218 echo 'distinguished_name=req'; \
219 echo 'x509_extension = v3_ca'; \
220 echo 'req_extensions = v3_req'; \
222 echo 'basicConstraints = CA:FALSE'; \
223 echo 'keyUsage = nonRepudiation, digitalSignature, keyEncipherment'; \
224 echo 'subjectAltName = @alt_names'; \
225 echo '[ alt_names ]'; \
226 echo "DNS.1 = www.${PARENT}"; \
227 echo "DNS.2 = ${PARENT}"; \
229 echo 'subjectKeyIdentifier=hash'; \
230 echo 'authorityKeyIdentifier=keyid:always,issuer'; \
231 echo 'basicConstraints = critical, CA:TRUE, pathlen:0'; \
232 echo 'keyUsage = critical, cRLSign, keyCertSign'; \
233 echo 'extendedKeyUsage = serverAuth, clientAuth')
236 applicationconfig=`base64 app.conf -w 0`
237 caconfig=`base64 imsserver.crt -w 0`
238 serverkeyconfig=`base64 imsserver.key -w 0`
240 echo $applicationconfig
242 echo $serverkeyconfig
245 cat <<EOF>o2service-override.yaml
247 serviceaccountname: admin-oran-o2
249 repository: nexus3.o-ran-sc.org:10004/o-ran-sc/pti-o2imsdms
251 pullPolicy: IfNotPresent
252 logginglevel: "DEBUG"
255 OS_AUTH_URL: "${OS_AUTH_URL}"
256 OS_USERNAME: "${OS_USERNAME}"
257 OS_PASSWORD: "${OS_PASSWORD}"
258 API_HOST_EXTERNAL_FLOATING: "${API_HOST_EXTERNAL_FLOATING}"
260 applicationconfig: ${applicationconfig}
261 caconfig: ${caconfig}
262 serverkeyconfig: ${serverkeyconfig}
266 cat o2service-override.yaml
269 2.3 Deploy by helm cli
270 ~~~~~~~~~~~~~~~~~~~~~~
274 helm install o2service o2/charts -f o2service-override.yaml
275 helm list |grep o2service
276 kubectl -n ${NAMESPACE} get pods |grep o2api
277 kubectl -n ${NAMESPACE} get services |grep o2api
280 2.4 Verify INF O2 service
281 ~~~~~~~~~~~~~~~~~~~~~~~~~
285 curl -k http(s)://<OAM IP>:30205/o2ims_infrastructureInventory/v1/
288 2.5 INF O2 Service API Swagger
289 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
291 - Swagger UI can be found with URL: http(s)://<OAM IP>:30205
294 3. Register INF O2 Service to SMO
295 ---------------------------------
297 - assumed you have setup SMO O2 endpoint for registration
298 - INF O2 service will post the INF platform registration data to that SMO O2 endpoint
304 'http(s)://<OAM IP>:30205/provision/v1/smo-endpoint' \
305 -H 'accept: application/json'
308 'http(s)://<OAM IP>:30205/provision/v1/smo-endpoint' \
309 -H 'accept: application/json' \
310 -H 'Content-Type: application/json' \
311 -d '{"endpoint": "<SMO O2 endpoint for registration>"}'
313 # Confirm SMO endpoint provision status
315 'http(s)://<OAM IP>:30205/provision/v1/smo-endpoint' \
316 -H 'accept: application/json'
324 .. _`O-RAN-SC INF`: https://docs.o-ran-sc.org/en/latest/projects.html#infrastructure-inf