- Created by Lusheng Ji, last modified on Jun 25, 2020
Overview |
---|
![]() |
Pre requisite |
---|
# kubectl get pods -n ricplt # There should be ~16 pods running in the ricplt namespace. |
Step 1: Prep Tasks (Preparing for xApp on-boarding) |
---|
Each xApp is required to provide a "descriptor". The descriptor is used by the Near RT RIC xApp On-boarder to generate a Helm chart and other deployment related artifacts for the xapp. At this step we are preparing for API calls into the xApp On-Boarder by providing thee locations of the xApp descriptors. Run ... $ sudo -i |
Step 2: Onboard xApps |
---|
Now we invoke API calls into the xApp On-boarder, providing it the locations of the xApp descripters. Run: $ curl --location --request POST "http://$(hostname):32080/onboard/api/v1/onboard/download" --header 'Content-Type: application/json' --data-binary "@./onboard.ts.url |
Step 3: Deploy xApp |
---|
At this step, we deploy the xApps by invoking the xApp Manager's API. Note that the names of the xApp to be deployed must match with what the on-boarder has. Once receiving the deploy API call, the xApp Manager will make API call into Helm/Kubernetes to deploy the xApp's Helm chart. The Routing Manager is also involved if the xApp is to process RMR messages, – it will compote the routes and send out route updates. Run ... $ curl --location --request POST "http://$(hostname):32080/appmgr/ric/v1/xapps" --header 'Content-Type: application/json' --data-raw '{"xappName": "qp"}' |
Step 4: Populate the Database with test RAN data |
---|
This step is needed for the phase one of the Traffic Steering use case. In phase one, the RAN data is artificial and the data points need to be injected into RNIB database. After these artificial data points are injected, we should see the Traffic Steering xApp starting to process these data, using the default threshold of 0. Run ... $ git clone http://gerrit.o-ran-sc.org/r/ric-app/ts -b bronze |
Step 5: Create a Policy Type |
---|
Here we define a new policy type and call the A1 mediator to create such a policy type. Run ... $ cd ~/dep/ |
Step 6: List Policy Types |
---|
We now should see the newly created policy type when querying the A1 mediator. Run ... $ curl -X GET --header "Content-Type: application/json" --header "accept: application/json" http://$(hostname):32080/a1mediator/a1-p/policytypes |
Step 7: Create a Policy Instance |
---|
Policy type is merely a declaration. Now we create a policy instance, filling the properties with actual values. This is also carried out by the A1 mediator. A1 mediator will distribute the new policy instance to the Traffic Steering xApp. And then we should see that the TS xApp receives this policy instancee and its behavior of "filtering RAN data by threshold" changing to using the new threshold value. Run... $ POLICY_ID="tsapolicy145" |
Tutorial Videos |
---|
Hello World xApp xapp-hw.mp4 |
Helpful Hints |
---|
Kubectl commads: kubectl get pods -n nampespace - gets a list of Pods running kubectl get logs -n namespace name_of_running_pod |
Complete these tasks to get started
Recent space activity
-
-
SMO Installation commented yesterday at 5:53 AM
Anonymous -
-
-
Hello World xApp Use Case Flows commented Feb 25, 2021
-
-
-
Running A1 and O1 Use Case Flows commented Feb 25, 2021
Anonymous -
-
-
Getting Started commented Feb 24, 2021
-
-
-
Hello World xApp Use Case Flows commented Feb 24, 2021
Anonymous -
Space contributors
- No labels
23 Comments
Gopalasingham Aravinthan
Hi Lusheng,
Thanks for the RIC XAPP deployment guide.
I was able to deploy all the xAPPs except QP driver.
I have the following error when I try to onboard using curl --location --request POST "http://$(hostname):32080/appmgr/ric/v1/xapps" --header 'Content-Type: application/json' --data-raw '{"xappName": "qpdriver"}'
{
"error_source": "config-file.json",
"error_message": "'__empty_control_section__' is a required property",
"status": "Input payload validation failed"
}
I think the error is from the descriptor of the version 1.0.9 located at onboard.qpd.url
But when I changed the qpdriver version to 1.0.0 it works
https://gerrit.o-ran-sc.org/r/gitweb?p=ric-app/qp-driver.git;a=blob_plain;f=xapp-descriptor/config.json;h=94582086d02df6299dd902556aa2e2111ed94268;hb=4074973dbbe90e11643c229fff39bb8a6f662dc8
Thanks
Balaji K
Thanks this helped...
Anonymous
Hello!
This can be resolved by deleting lines 38-41.
"controls": {
"example_int": 10000,
"example_str": "value"
}
--Cornellius Dagmang
Gautam Kumar
Hi Luseng,
I have created multiple policies while testing & want to delete those policies from Nonrt dashboard GUI. I have used below command to delete
curl -X DELETE --header "Content-Type: application/json" --header "accept: application/json" http://192.168.122.31:32080/a1mediator/a1-p/policytypes/20020
By using above command it is getting deleted from VM but not Nonrt dashboard GUI. Please guide me the command to delete policies from Nonrt dashboard GUI.
Thanks ,
Gautam
Babu Rajagopal
After onboarding all the xApps, there is a error sending message from ts-xapp
In get_sdl_ue_data()
message body {"UEPredictionSet": ["12345"]}
payload length 30
<SNDR> send failed: 2
Any known fixes/workarounds?
Mario Salinas
Same issue for me
Zhengwei Gao
Here is the normal output:
In get_sdl_ue_data()
message body {"UEPredictionSet": ["12345"]}
payload length 30
Prediction Callback got a message, type=30002 , length=182
payload is { "12345" : { "310-680-200-555001" : [ 2000000 , 1200000 ], "310-680-200-555002" : [ 800000 , 400000 ], "310-680-200-555003" : [ 800000 , 400000 ] } }
Prediction for 12345
from the source code:
void send_prediction_request(vector<string> ues_to_predict) {
int mtype = 30000;
// payload updated in place, nothing to copy from, so payload parm is nil
if ( ! msg->Send_msg( mtype, Message::NO_SUBID, strlen( (char *) send_payload.get() ), NULL )) {
fprintf( stderr, "<SNDR> send failed: %d\n", msg->Get_state() );
}
}
void prediction_callback( Message& mbuf, int mtype, int subid, int len, Msg_component payload, void* data ) {
cout << "Prediction Callback got a message, type=" << mtype << " , length=" << len << "\n";
cout << "payload is " << payload.get() << "\n";
}
which means that prediction_callback is not correctly called.
in tsxapp.main, prediction_callback is binded to MSG_ID=30002.
extern int main( int argc, char** argv ) {
xfw->Add_msg_cb( 20010, policy_callback, NULL );
xfw->Add_msg_cb( 30002, prediction_callback, NULL );
}
RMR will route msg with MSG_ID=30000 to qpdriver xapp. qpdriver will process it , and generate another msg with MSG_ID=30001
rmr_xapp.register_callback(steering_req_handler, 30000)
success = self.rmr_send(payload, 30001)
RMR will further route msg with MSG_ID=30001 to qp xapp. qp will process it, and generate another msg with MSG_ID=30002, which will be routed back to tsxapp by RMR.
qp_xapp.register_callback(qp_predict_handler, 30001)
success = self.rmr_send(mock_msg.encode(), 30002)
Based on above analysis, my best guess is that, qp-driver and qp xapp has not been deployed successfully.
Zhengwei Gao
Hi Experts,
I got RMR_ERR_NOENDPT after creating policy instance. Can you pls help? thanks
here is part of 'kubectl logs -f deployment-ricplt-a1mediator-66fcf76c66-8dxcj -n ricplt':
::ffff:10.244.0.53 - - [2020-08-07 07:41:28] "PUT /a1-p/policytypes/20008/policies/tsapolicy145 HTTP/1.1" 202 116 0.007207
{"ts": 1596786088608, "crit": "DEBUG", "id": "a1.a1rmr", "mdc": {}, "msg": "_send_msg: sending: {'payload': b'{\"operation\": \"CREATE\", \"policy_type_id\": 20008, \"policy_instance_id\": \"tsapolicy145\", \"payload\": {\"threshold\": 5}}', 'payload length': 115, 'message type': 20010, 'subscription id': 20008, 'transaction id': b'67712138d88111eab3bcd2cb2aea4bae', 'message state': 0, 'message status': 'RMR_OK', 'payload max size': 4096, 'meid': b'', 'message source': 'service-ricplt-a1mediator-rmr.ricplt:4562', 'errno': 0}"}
{"ts": 1596786088608, "crit": "WARNING", "id": "a1.a1rmr", "mdc": {}, "msg": "RMR send failed; pre-send summary: {'payload': b'{\"operation\": \"CREATE\", \"policy_type_id\": 20008, \"policy_instance_id\": \"tsapolicy145\", \"payload\": {\"threshold\": 5}}', 'payload length': 115, 'message type': 20010, 'subscription id': 20008, 'transaction id': b'67712138d88111eab3bcd2cb2aea4bae', 'message state': 0, 'message status': 'RMR_OK', 'payload max size': 4096, 'meid': b'', 'message source': 'service-ricplt-a1mediator-rmr.ricplt:4562', 'errno': 0}, post-send summary: {'payload': None, 'payload length': 115, 'message type': 20010, 'subscription id': 20008, 'transaction id': b'67712138d88111eab3bcd2cb2aea4bae', 'message state': 2, 'message status': 'RMR_ERR_NOENDPT', 'payload max size': 4096, 'meid': b'', 'message source': 'service-ricplt-a1mediator-rmr.ricplt:4562', 'errno': 6}"}
{"ts": 1596786088608, "crit": "DEBUG", "id": "a1.a1rmr", "mdc": {}, "msg": "_send_msg: result message state: 2"}
{"ts": 1596786088608, "crit": "WARNING", "id": "a1.a1rmr", "mdc": {}, "msg": "_send_msg: failed after 20 retries"}
Anonymous
hi all,
i rebuild the docker image from "ric-app-ts 1.0.11" of Gerrit, and re-deploy trafficxapp, there is no RMR_ERR_NOENDPT error now.
::ffff:10.244.0.61 - - [2020-08-07 14:12:02] "PUT /a1-p/policytypes/20008/policies/tsapolicy145 HTTP/1.1" 202 116 0.008321
{"ts": 1596809522972, "crit": "DEBUG", "id": "a1.a1rmr", "mdc": {}, "msg": "_send_msg: sending: {'payload': b'{\"operation\": \"CREATE\", \"policy_type_id\": 20008, \"policy_instance_id\": \"tsapolicy145\", \"payload\": {\"threshold\": 5}}', 'payload length': 115, 'message type': 20010, 'subscription id': 20008, 'transaction id': b'f769383ad8b711eaacd4cac483485e64', 'message state': 0, 'message status': 'RMR_OK', 'payload max size': 4096, 'meid': b'', 'message source': 'service-ricplt-a1mediator-rmr.ricplt:4562', 'errno': 0}"}
{"ts": 1596809522977, "crit": "DEBUG", "id": "a1.a1rmr", "mdc": {}, "msg": "_send_msg: result message state: 0"}
Anonymous
Would someone provide prerequisite and instructions to create the xApp??
Lusheng Ji
Please post after you log in to Confluence so people know who you are.
Anonymous
Can anyone let me know the same steps for Admission Control xAPP
Michael Duan
Was the image(nexus3.o-ran-sc.org:10004/o-ran-sc/bldr-ubuntu18-c-go:8-u18.04) used ts/test/Dockerfile removed in nexus?
I can't find it or its other version for ubuntu18 in nexus
Zhengwei Gao
pls refer to ORAN Base Docker Images for CI Builds#Imagebldr-ubuntu18-c-go
you need:
Michael Duan
I had tried it before and I could find bldr-ubuntu18-c-go:9-u18.04 in nexus at that time,
but there is not bldr-ubuntu18-c-go in nexus now.
Zhengwei Gao
Yeah, there is no bldr-ubuntu18-c-go image any more in the repository.
I propose two solutions:
(1) you can build the docker image manually and retag it:
https://gerrit.o-ran-sc.org/r/gitweb?p=it/dev.git;a=blob;f=bldr-imgs/bldr-ubuntu18-c-go/Dockerfile;h=c7be3e4a4456a74ddfa5e4e222b77d9fbdc03fec;hb=HEAD
(2) you may pull the image from my docker-hub and retag it:
Michael Duan
Thank for your help
stefan draškoci
Late response but the image is tagged as 1.9.0 rather than 9-u18.04
Anonymous
Can anyone help me why my pod is not running after running the script i.e populate_db.sh.
kubectl get pods -n ricplt
NAME READY STATUS RESTARTS AGE
dbprepopjob-ws99s 0/1 ImagePullBackOff 0 83s
Anonymous
Dear all:
I have a same problem, anyone help?
Anonymous
Hi everyone,
Thanks for the RIC XAPP deployment guide.
I was able to deploy all the xAPPs except QP driver.
I have the following error when I try to onboard using
curl --location --request POST "http://$(hostname):32080/onboard/api/v1/onboard/download" --header 'Content-Type: application/json' --data-binary "@./onboard.qpd.url"
error message:
{
"error_source": "config-file.json",
"error_message": "'__empty_control_section__' is a required property",
"status": "Input payload validation failed"
}
Anonymous
Hi everyone,
Thanks for the RIC XAPP deployment guide.
I was able to deploy all the xAPPs except QP driver.
I have the following error in this step:
root@near-VirtualBox:~/dep/ts/test/populatedb# ./populate_db.sh
release "dbprepop" deleted
Sending build context to Docker daemon 19.97kB
Step 1/17 : FROM nexus3.o-ran-sc.org:10004/o-ran-sc/bldr-ubuntu18-c-go:8-u18.04 as buildenv
manifest for nexus3.o-ran-sc.org:10004/o-ran-sc/bldr-ubuntu18-c-go:8-u18.04 not found: manifest unknown: manifest unknown
NAME: dbprepop
LAST DEPLOYED: Tue Feb 23 16:15:45 2021
NAMESPACE: ricplt
STATUS: DEPLOYED
RESOURCES:
==> v1/Job
NAME COMPLETIONS DURATION AGE
dbprepopjob 0/1 0s 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
dbprepopjob-667t5 0/1 ContainerCreating 0 0s
Cedric Morin
Hi,
I'm working with Bronze release.
I have a question regarding the use of private docker registries for xApp image hosting.
As far as I understand, in the hello world xApp scenario, the image is pulled from a public repository : nexus3.o-ran-sc.org:10002, which is specified in the config file.
I tried to use a private repository instead, so I replaced the "registry" name in the config file by my own registry : 10.0.0.1:5000 , which hosts my app : testApp
When I try to pull my image using :
docker pull 10.0.0.1:5000/testApp
the image is successfully pulled.
However, when I try to load the configuration using :
curl --location --request POST "http://$KONG_IP:32080/onboard/api/v1/onboard/download" --header 'Content-Type: application/json' --data-binary "@./onboard.hw.url"
I receive an error indicating :
10.0.0.1:5000 does not match ^[A-Za-z0-9\\\\.-]{1,}\\\\.[A-Za-z]{1,}(?:\\\\:\\\\d+)?$
I agree that my input does not match the required format, but I do not understand why this format is required. I cannot put at least one alphabetical letter between the IP address and the port, as required (at least I didn't find a way to do so, but I'm not a docker expert).
Do you know the reason for this format check ? Is there something that I am missing, or do I misuse the registry field ?
Thank you in advance,
Best regards,
Cedric
EDIT : I found a workaround : I edited the /etc/host file of the machine hosting the near RT RIC, and added an entry with a compliant name for the repo : 10.0.0.1 docker-repository.local
However this solution requires to have admin access to the near RT RIC machine, I think that the validity check of the config file should accept IP addresses, unless there is a reason not to do so.
Add Comment