LTE eNB and 5G NR gNB produce data that can be monitored and analyzed to measure the system’s effectiveness. The near Real-Time RIC can gather the radio and system Key Performance Indicators (KPI) from E2 Nodes and can utilize the metrics for closed-loop control. The KPI includes but not limited following; UE measurement, E2 Node Measurement, E2 Node Load-related measurement. The KPIMON xApp provides the first step towards the successful closed-loop control, through the monitoring E2 Node’s performance metrics, and writing it into Redis DB. With the near real-time reporting KPIs, the near Real-Time RIC can immediately control E2 Nodes.
When using the dms-cli commands, we need to set up the environment variable "CHART_REPO_URL"
#Create a local helm repository with a port other than 8080 on host
docker run --rm -u 0 -it -d -p 8090:8080 -e DEBUG=1 -e STORAGE=local -e STORAGE_LOCAL_ROOTDIR=/charts -v $(pwd)/charts:/charts chartmuseum/chartmuseum:latest
Set up the environment variables for CLI connection using the same port as used above.
#Set CHART_REPO_URL env variable
export CHART_REPO_URL=http://0.0.0.0:8090
dms_cli onboard --config_file_path=<CONFIG_FILE_PATH> --shcema_file_path=<SCHEMA_FILE_PATH>
dms_cli download_helm_chart --xapp_chart_name=<XAPP_CHART_NAME> --version=<VERSION> --output_path=<OUTPUT_PATH>
to check version xapp:
head <CONFIG_FILE_PATH>
dms_cli install --xapp_chart_name=<XAPP_CHART_NAME> --version=<VERSION> --namespace=<NAMESPACE>
dms_cli uninstall --xapp_chart_name=<XAPP_CHART_NAME> --namespace=<NAMESPACE>
dms_cli upgrade --xapp_chart_name=<XAPP_CHART_NAME> --old_version=<OLD_VERSION> --new_version=<NEW_VERSION> --namespace=<NAMESPACE>
dms_cli rollback --xapp_chart_name=<XAPP_CHART_NAME> --new_version=<NEW_VERSION> --old_version=<OLD_VERSION> --namespace=<NAMESPACE>
dms_cli health_check --xapp_chart_name=<XAPP_CHART_NAME> --namespace=<NAMESPACE>
if you dont have file schema for xApp, you can follow this default configuration:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "#/controls",
"type": "object",
"title": "Controls Section Schema",
"required": [
],
"properties": {
}
}
Have install OSC RIC [I-Release] and Depedency Library, you can follow this guide: https://hackmd.io/@abdfikih/ByaUJytwR
If you want to use code i have edited for this configuration works because in I-Release some component have upgrade and we need to change code in xApp, you can clone from my repository:
E2SIM :
git clone https://github.com/Abdfikih/e2sim-version.git -b v2
KPIMON :
git clone https://github.com/Abdfikih/kpimon-version.git
TS xApp :
git clone https://github.com/Abdfikih/trafficxapp-version.git
QP xApp :
git clone https://github.com/Abdfikih/qp-version.git
AD xApp :
git clone https://github.com/Abdfikih/ad-version.git
RC xApp :
git clone https://github.com/Abdfikih/rc-version.git
git clone https://github.com/o-ran-sc/ric-app-kpimon-go.git
cd ric-app-kpimon-go
docker run -d -p 5000:5000 --name my_registry registry:latest
docker build . -t 127.0.0.1:5000/o-ran-sc/ric-app-kpimon-go:latest
docker push 127.0.0.1:5000/o-ran-sc/ric-app-kpimon-go:latest
then modified config-file.json:
(
"xapp_name": "kpimon-go",
"version": "2.0.2",
"containers": [
{
"name": "kpimon-go",
"image": {
"registry": "127.0.0.1:5000",
"name": "o-ran-sc/ric-app-kpimon-go",
"tag": "latest"
})
cd deploy
dms_cli onboard --config_file_path=config.json --shcema_file_path=schema.json
output
root@ubuntu:~/ric-app-kpimon-go/deploy# dms_cli onboard --config_file_path=config.json --shcema_file_path=schema.json
{
"status": "Created"
}
dms_cli download_helm_chart kpimon-go 2.0.1 --output_path=/files/helm_xapp
root@ubuntu:~/ric-app-kpimon-go/deploy# dms_cli download_helm_chart kpimon-go 2.0.1 --output_path=/files/helm_xapp
status: OK
dms_cli install --xapp_chart_name=kpimon-go --version=2.0.1 --namespace=ricxapp
root@ubuntu:~/ric-app-kpimon-go/deploy# dms_cli install --xapp_chart_name=kpimon-go --version=2.0.1 --namespace=ricxapp
status: OK
cd ~
git clone "https://gerrit.o-ran-sc.org/r/ric-app/hw-go"
git clone "https://gerrit.o-ran-sc.org/r/ric-app/ts"
git clone "https://gerrit.o-ran-sc.org/r/ric-app/ad"
git clone "https://gerrit.o-ran-sc.org/r/ric-app/qp"
cd ~/ric-app-hw-go/config
dms_cli onboard --config_file_path=../../hw-go/config/config-file.json --shcema_file_path=../../hw-go/config/schema.json
root@ubuntu:~/ric-dep/bin# dms_cli onboard --config_file_path=../../hw-go/config/config-file.json --sh
cema_file_path=../../hw-go/config/schema.json
httpGet:
path: '{{ index .Values "readinessProbe" "httpGet" "path" | toJson }}'
port: '{{ index .Values "readinessProbe" "httpGet" "port" | toJson }}'
initialDelaySeconds: '{{ index .Values "readinessProbe" "initialDelaySeconds" | toJson }}'
periodSeconds: '{{ index .Values "readinessProbe" "periodSeconds" | toJson }}'
httpGet:
path: '{{ index .Values "livenessProbe" "httpGet" "path" | toJson }}'
port: '{{ index .Values "livenessProbe" "httpGet" "port" | toJson }}'
initialDelaySeconds: '{{ index .Values "livenessProbe" "initialDelaySeconds" | toJson }}'
periodSeconds: '{{ index .Values "livenessProbe" "periodSeconds" | toJson }}'
{
"status": "Created"
}
dms_cli download_helm_chart hw-go 1.0.0 --output_path=/files/helm_xapp
root@ubuntu:~/ric-dep/bin# dms_cli download_helm_chart hw-go 1.0.0 --output_path=/files/helm_xapp
status: OK
You can use : head config.json to see version from xapp when to configuration.
dms_cli install --xapp_chart_name=hw-go --version=1.0.0 --namespace=ricxapp
root@ubuntu:~/ric-dep/bin# dms_cli install --xapp_chart_name=hw-go --version=1.0.0 --namespace=ricxapp
status: OK
Build ts, ad, and qp with command above like build hw-go.
You can follow this section:
kubectl get deploy -A
kubectl edit deploy <name-deploy-hw-go> -n <namespace>
after this edit version HW-GO to 1.1.2 from 1.1.1
cd ~/ts
docker build . -t 127.0.0.1:5000/o-ran-sc/ric-app-ts:latest
output:
root@ubuntu:~/ts# docker build .
Sending build context to Docker daemon 770.6kB
Step 1/27 : FROM nexus3.o-ran-sc.org:10002/o-ran-sc/bldr-ubuntu20-c-go:1.0.0 as buildenv
1.0.0: Pulling from o-ran-sc/bldr-ubuntu20-c-go
7b1a6ab2e44d: Pull complete
fa71893429cb: Pull complete
04d0e85b5cd0: Pull complete
.
.
.
Step 27/27 : CMD [ "/usr/local/bin/ts_xapp" ]
---> Running in 43da0fb4492d
Removing intermediate container 43da0fb4492d
---> 76bfe8867640
Successfully built 76bfe8867640
docker push 127.0.0.1:5000/o-ran-sc/ric-app-ts:latest
root@ubuntu:~/ts# docker push 127.0.0.1:5000/o-ran-sc/ric-app-ts:latest
The push refers to repository [127.0.0.1:5000/o-ran-sc/ric-app-ts]
531eb0557c30: Pushed
73c9feaa2c7e: Pushed
70323cf7da8f: Pushed
4c0912ab2806: Pushed
dbd6a6b3f0ef: Pushed
3f9a114a572d: Pushed
3ec3ded77c0c: Pushed
latest: digest: sha256:dacda165621b198ef62bf0f3412c03893bc359da0157eaa731ea8af005385874 size: 1783
cd xapp_descriptor
nano config-file.json
change to this:
dms_cli onboard --config_file_path=config-file.json --shcema_file_path=schema.json
root@ubuntu:~/ts/xapp-descriptor# dms_cli onboard --config_file_path=config-file.json --shcema_file_path=schema.json
{
"status": "Created"
}
dms_cli download_helm_chart trafficxapp 1.2.5 --output_path=/files/helm_xapp
root@ubuntu:~/ts/xapp-descriptor# dms_cli download_helm_chart trafficxapp 1.2.5 --output_path=/files/helm_xapp
status: OK
dms_cli install --xapp_chart_name=trafficxapp --version=1.2.5 --namespace=ricxapp
root@ubuntu:~/ts/xapp-descriptor# dms_cli install --xapp_chart_name=trafficxapp --version=1.2.5 --name
space=ricxapp
status: OK
cd ~/ad
docker build . -t 127.0.0.1:5000/o-ran-sc/ric-app-ad:latest
output:
root@ubuntu:~/ad# docker build -t ad:v1 .
Sending build context to Docker daemon 18.55MB
Step 1/19 : FROM continuumio/miniconda3:23.10.0-1
23.10.0-1: Pulling from continuumio/miniconda3
0bc8ff246cb8: Pull complete
e87dc284eda5: Pull complete
f1fbf9532e5b: Pull complete
.
.
.
Step 18/19 : COPY src/ /src
---> 0e4945b7eab0
Step 19/19 : CMD PYTHONPATH=/src:/usr/lib/python3.11/site-packages/:$PYTHONPATH run-src.py
---> Running in 22d35f7ee2a7
Removing intermediate container 22d35f7ee2a7
---> 97691144716d
Successfully built 97691144716d
Successfully tagged ad:v1
docker run 127.0.0.1:5000/o-ran-sc/ric-app-ts:latest
root@ubuntu:~/ad# docker run ad:v1
1720494772966 7/RMR [INFO] ric message routing library on SI95 p=4560 mv=3 flg=02 id=a (a1be12a 4.9.0 built: Feb 14 2023)
{"ts": 1720494772967, "crit": "DEBUG", "id": "ricxappframe.xapp_rmr", "mdc": {}, "msg": "Waiting for rmr to init on port 4560.."}
{"ts": 1720494773067, "crit": "DEBUG", "id": "ricxappframe.xapp_rmr", "mdc": {}, "msg": "Starting loop thread"}
{"ts": 1720494773068, "crit": "DEBUG", "id": "ricxappframe.xapp_rmr", "mdc": {}, "msg": "Work loop starts"}
{"ts": 1720494773094, "crit": "WARNING", "id": "ricxappframe.xapp_frame", "mdc": {}, "msg": "init: NOT watching any config file"}
{"ts": 1720494773095, "crit": "ERROR", "id": "ricxappframe.xapp_frame", "mdc": {}, "msg": "init: Cannot Read config file for xapp Registration"}
{"ts": 1720494773095, "crit": "DEBUG", "id": "src.main", "mdc": {}, "msg": "AD xApp starting"}
{"ts": 1720494773100, "crit": "ERROR", "id": "database", "mdc": {}, "msg": "Failed to establish a new connection with InflulxDB, Please check your url/hostname"}
1720494773981 7/RMR [INFO] sends: ts=1720494773 src=8e2451ef41c5:4560 target=service-ricxapp-trafficxapp-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720494773981 7/RMR [INFO] sends: ts=1720494773 src=8e2451ef41c5:4560 target=service-ricplt-a1mediator-rmr.ricplt:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720494804984 7/RMR [INFO] sends: ts=1720494804 src=8e2451ef41c5:4560 target=service-ricxapp-trafficxapp-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720494804984 7/RMR [INFO] sends: ts=1720494804 src=8e2451ef41c5:4560 target=service-ricplt-a1mediator-rmr.ricplt:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720494835987 7/RMR [INFO] sends: ts=1720494835 src=8e2451ef41c5:4560 target=service-ricxapp-trafficxapp-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720494835987 7/RMR [INFO] sends: ts=1720494835 src=8e2451ef41c5:4560 target=service-ricplt-a1mediator-rmr.ricplt:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720494866989 7/RMR [INFO] sends: ts=1720494866 src=8e2451ef41c5:4560 target=service-ricxapp-trafficxapp-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720494866990 7/RMR [INFO] sends: ts=1720494866 src=8e2451ef41c5:4560 target=service-ricplt-a1mediator-rmr.ricplt:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
docker push 127.0.0.1:5000/o-ran-sc/ric-app-ts:latest
change the config file :
dms_cli onboard --config_file_path=config.json --shcema_file_path=embedded-schema.json
output:
root@ubuntu:~/ad/xapp-descriptor# dms_cli onboard --config_file_path=config.json --shcema_file_path=em
bedded-schema.json
{
"status": "Created"
}
dms_cli download_helm_chart ad 1.0.2 --output_path=/files/helm_xapp
root@ubuntu:~/ad/xapp-descriptor# dms_cli download_helm_chart ad 1.0.2 --output_path=/files/helm_xapp
status: OK
head config.json
dms_cli install ad 1.0.2 ricxapp
root@ubuntu:~/ad/xapp-descriptor# head config.json
{
"name": "ad",
"version": "1.0.2",
"containers": [
{
"name": "ad",
"image": {
"registry": "nexus3.o-ran-sc.org:10002",
"name": "o-ran-sc/ric-app-ad",
"tag": "1.0.0"
root@ubuntu:~/ad/xapp-descriptor# dms_cli install ad 1.0.2 ricxapp
status: OK
cd ~/qp
docker build . -t 127.0.0.1:5000/o-ran-sc/ric-app-qp:latest
root@ubuntu:~/qp# docker build -t qp:v1 .
Sending build context to Docker daemon 1.307MB
Step 1/16 : FROM continuumio/miniconda3:23.10.0-1
---> 6d17b7c0d4a8
Step 2/16 : RUN mkdir -p /opt/route/
---> Using cache
---> ceb6cae73deb
Step 3/16 : RUN apt update && apt install -y gcc musl-dev
---> Using cache
.
.
.
Step 15/16 : ENV PYTHONUNBUFFERED 1
---> Running in e970f2a9b8b0
Removing intermediate container e970f2a9b8b0
---> 684992075ff9
Step 16/16 : CMD PYTHONPATH=/src:/usr/lib/python3.11/site-packages/:$PYTHONPATH run-qp.py
---> Running in dcee19012ee3
Removing intermediate container dcee19012ee3
---> aca7876c5e53
Successfully built aca7876c5e53
Successfully tagged qp:v1
docker push 127.0.0.1:5000/o-ran-sc/ric-app-qp:latest
root@ubuntu:~/ric-app-qp# docker push 127.0.0.1:5000/o-ran-sc/ric-app-qp:latest
The push refers to repository [127.0.0.1:5000/o-ran-sc/ric-app-qp]
85f179adb420: Pushed
ad35c6d6f1c2: Pushed
1561063d0327: Pushed
e481de449145: Pushed
522777a86dad: Pushed
80090e457115: Pushed
d439a57c1d4e: Pushed
fe6451826393: Pushed
3223e4260bc7: Pushed
1b4cc32a5b9d: Pushed d917f59154bf: Pushed
2274c4bfd58e: Pushed
74c0af6e0227: Pushed
latest: digest: sha256:7ce6dcf2a9e586b3c44a03236e7fd84fd56f3b4fd99c905e909318cbfd51e4fa size: 3043
dms_cli onboard --config_file_path=config.json --shcema_file_path=embedded-schema-copy.json
root@ubuntu:~/qp/xapp-descriptor# dms_cli onboard --config_file_path=config.json --shcema_file_path=embedded-schema-copy.json
{
"status": "Created"
}
dms_cli download_helm_chart qp 0.0.6 --output_path=/files/helm_xapp
root@ubuntu:~/ad/xapp-descriptor# dms_cli download_helm_chart qp 0.0.6 --output_path=/files/helm_xapp
status: OK
dms_cli install qp 0.0.6 ricxapp
root@ubuntu:~/qp/xapp-descriptor# dms_cli install qp 0.0.6 ricxapp
status: OK
kubectl get pods -A
ricxapp ricxapp-ad-75b784b46c-8v7ql 1/1 Running 0 2m24s
ricxapp ricxapp-hw-go-7d6c6cb7f4-gvd2j 1/1 Running 0 22h
ricxapp ricxapp-kpimon-go-6b45897558-fvjgg 1/1 Running 0 52m
ricxapp ricxapp-qp-569f895f65-vlbgz 1/1 Running 0 5m2s
ricxapp ricxapp-trafficxapp-5c4894cd5f-4l9v7 1/1 Running 0 43m
kubectl logs -f ricxapp-kpimon-go-df64648bb-hw66b -n ricxapp
service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1720581104165 8/RMR [INFO] sends: ts=1720581104 src=service-ricxapp-kpimon-go-rmr.ricxapp:4560 target=service-ricplt-submgr-rmr.ricplt:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
1720581104165 8/RMR [INFO] sends: ts=1720581104 src=service-ricxapp-kpimon-go-rmr.ricxapp:4560 target=service-ricplt-e2mgr-rmr.ricplt:3801 open=0 succ=0 fail=0 (hard=0 soft=0)
1720581104165 8/RMR [INFO] sends: ts=1720581104 src=service-ricxapp-kpimon-go-rmr.ricxapp:4560 target=10.110.221.177:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1720581104165 8/RMR [INFO] sends: ts=1720581104 src=service-ricxapp-kpimon-go-rmr.ricxapp:4560 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 succ=0 fail=0 (hard=0 soft=0)
{"ts":1720581113957,"crit":"DEBUG","id":"kpimon","mdc":{"CONTAINER_NAME":"","HOST_NAME":"","PID":"8","POD_NAME":"","SERVICE_NAME":"","SYSTEM_NAME":"","time":"2024-07-10T03:11:53"},"msg":"restapi: method=GET url=/ric/v1/health/alive"}
{"ts":1720581113957,"crit":"DEBUG","id":"kpimon","mdc":{"CONTAINER_NAME":"","HOST_NAME":"","PID":"8","POD_NAME":"","SERVICE_NAME":"","SYSTEM_NAME":"","time":"2024-07-10T03:11:53"},"msg":"restapi: method=GET url=/ric/v1/health/ready"}
{"ts":1720581128958,"crit":"DEBUG","id":"kpimon","mdc":{"CONTAINER_NAME":"","HOST_NAME":"","PID":"8","POD_NAME":"","SERVICE_NAME":"","SYSTEM_NAME":"","time":"2024-07-10T03:12:08"},"msg":"restapi: method=GET url=/ric/v1/health/ready"}
{"ts":1720581128958,"crit":"DEBUG","id":"kpimon","mdc":{"CONTAINER_NAME":"","HOST_NAME":"","PID":"8","POD_NAME":"","SERVICE_NAME":"","SYSTEM_NAME":"","time":"2024-07-10T03:12:08"},"msg":"restapi: method=GET url=/ric/v1/health/alive"}
kubectl logs -f deployment-ricplt-submgr-599754c984-f466m -n ricplt
1720582492204 1/RMR [INFO] sends: ts=1720582492 src=service-ricplt-submgr-rmr.ricplt:4560 target=service-ricxapp-kpimon-go-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
kubectl logs -f deployment-ricplt-e2mgr-b988db566-nkzjp -n ricplt
1720582452200 7/RMR [INFO] sends: ts=1720582452 src=service-ricplt-e2mgr-rmr.ricplt:3801 target=service-ricxapp-kpimon-go-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
kubectl logs -f deployment-ricplt-e2term-alpha-75d8ccb646-m45xp -n ricplt
1720581307174 22/RMR [INFO] sends: ts=1720581307 src=service-ricplt-e2term-rmr-alpha.ricplt:38000 target=10.244.0.24:43534 open=0 succ=5 fail=0 (hard=0 soft=0)
1720581307174 22/RMR [INFO] sends: ts=1720581307 src=service-ricplt-e2term-rmr-alpha.ricplt:38000 target=10.244.0.24:43978 open=0 succ=9 fail=0 (hard=0 soft=0)
1720581307174 22/RMR [INFO] sends: ts=1720581307 src=service-ricplt-e2term-rmr-alpha.ricplt:38000 target=10.244.0.24:43978 open=0 succ=0 fail=0 (hard=0 soft=0)
{"ts":1720579760123,"crit":"DEBUG","id":"kpimon","mdc":{"CONTAINER_NAME":"","HOST_NAME":"","PID":"8","POD_NAME":"","SERVICE_NAME":"","SYSTEM_NAME":"","time":"2024-07-10T02:49:20"},"msg":"App registration is not done yet, sleep 5s and check again"}
You can add this section to config.json
"livenessProbe": {
"httpGet": {
"path": "ric/v1/health/alive",
"port": 8080
},
"initialDelaySeconds": 5,
"periodSeconds": 15
},
"readinessProbe": {
"httpGet": {
"path": "ric/v1/health/ready",
"port": 8080
},
"initialDelaySeconds": 5,
"periodSeconds": 15
},
kubectl logs -f ricxapp-hw-go-7d6c6cb7f4-gvd2j -n ricxapp
1720582412201 7/RMR [INFO] sends: ts=1720582412 src=service-ricxapp-hw-go-rmr.ricxapp:4560 target=localhost:4591 open=0 succ=0 fail=0 (hard=0 soft=0)
1720582412201 7/RMR [INFO] sends: ts=1720582412 src=service-ricxapp-hw-go-rmr.ricxapp:4560 target=service-ricxapp-kpimon-go-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
kubectl logs -f deployment-ricplt-submgr-599754c984-f466m -n ricplt
1720581589179 1/RMR [INFO] sends: ts=1720581589 src=service-ricplt-submgr-rmr.ricplt:4560 target=service-ricxapp-hw-go-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
kubectl logs -f deployment-ricplt-e2mgr-b988db566-nkzjp -n ricplt
1720583054220 7/RMR [INFO] sends: ts=1720583054 src=service-ricplt-e2mgr-rmr.ricplt:3801 target=service-ricxapp-hw-go-rmr.ricxapp:4560 open=0 succ=0 fail=0 (hard=0 soft=0)
kubectl logs -f deployment-ricplt-e2term-alpha-75d8ccb646-m45xp -n ricplt
1720583113227 22/RMR [INFO] sends: ts=1720583113 src=service-ricplt-e2term-rmr-alpha.ricplt:38000 target=10.244.0.24:43574 open=0 succ=15 fail=0 (hard=0 soft=0)
nano ts-policy-type-20008.json
{
"name": "tspolicy",
"description": "tsa parameters",
"policy_type_id": 20008,
"create_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TS Policy",
"description": "TS policy type",
"type": "object",
"properties": {
"threshold": {
"type": "integer",
"default": 0
}
},
"additionalProperties": false
}
}
curl -v -X PUT "http://${Your_KONG_IP}:32080/a1mediator/A1-P/v2/policytypes/20008" -H "accept: application/json" -H "Content-Type: application/json" -d @./ts-policy-type-20008.json
curl -X PUT --header "Content-Type: application/json" --data "{\"threshold\" : 5}" http://10.109.206.158:32080/a1mediator/A1-P/v2/policytypes/20008/poli
cies/"tsapolicy145"