Try   HackMD

O-RAN C++ Hello World xApp Note

tags: ORAN

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
Table Of Contents

  • Hello World xApp General Introduction
  • Hello World xApp Deployment
  • Studying Hello World xApp To Understand How xApp Access DB
  • Studying Hello World xApp To Understand How xApp Handle E2SM + E2AP
  • Hello World xApp Unit Test Deployment
  • Hello World xApp Unit Test Complete Logs

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
Main Page


Hello World xApp General Introduction


The RIC platform provides set of functions that the xApps can use to accomplish their tasks. Hello World xApp is envisioned to provide xApp developers, examples of implementing these sets of functions.



Hello World xApp Deployment


1. First we have to pull Hello World xApp repository from github by using this command.

sudo -i
git clone "https://gerrit.o-ran-sc.org/r/ric-app/hw" -b master

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


2. After that, we have to build the dockerfile by using this command.

cd hw
docker build -t nexus3.o-ran-sc.org:10002/o-ran-sc/ric-app-hw:1.0.6 .

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


3. Then we can continue to the onboarding part by following these commands below and change the ip according to your own kong ip address result.

sudo kubectl get service -A | grep 32080
echo '{"config-file.json_url": "https://gerrit.o-ran-sc.org/r/gitweb?p=ric-app/hw.git;a=blob_plain;f=init/config-file.json;hb=refs/heads/master" }' > onboard.hw.url
curl --location --request POST "http://10.97.87.206:32080/onboard/api/v1/onboard/download"  --header 'Content-Type: application/json' --data-binary "@./onboard.hw.url"

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


4. If status is created already we can continue to deploy HW xApp by using.

curl --location --request POST "http://10.97.87.206:32080/appmgr/ric/v1/xapps"  --header 'Content-Type: application/json'  --data-raw '{"xappName": "hwxapp"}' -v 

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


5. To make sure our pod is deployed already we can take a look if there any ricxapp-hwxapp pod deployed by using

kubectl get pods -n ricxapp

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →



Studying Hello World xApp To Understand How xApp Access DB


Hello World xApp DB test is separated into two parts, the first one is to check if RNIB is working or not, and the second test is to check if SDL is working or not.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

For the first test the main job is to set gnblist to RNIB, there are two ids that will be used named as test1 and test2

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Fig.1. Data Sent By HW xApp To RNIB [1]

After HW xApp set some data, it will try to retrieve the data by using get gnblist and will print every gnb id stored on the RNIB side. If test1 and test2 are printed in means that RNIB is working fine.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Fig.2. Data Retrieved By HW xApp From RNIB [1]

For the second test it will try to set a data to Redis through SDL. HW xApp will set abc as a key and as e the value.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Fig.3. Data Sent By HW xApp Through SDL [1]

And after that HW xApp will try to get the value of abc key from Redis through SDL. If the result is equal to e it means SDL is working fine.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Fig.4. Data Retrieved By HW xApp Through SDL [1]


Hello World xApp Unit Test Deployment


1. First we have to pull Hello World xApp repository from github by using this command.

sudo -i
git clone "https://gerrit.o-ran-sc.org/r/ric-app/hw" -b master\

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


2. After that, we have to rename Dockerfile to another name and Dockerfile-Unit-Test To Dockerfile

cd hw
mv Dockerfile Docker1
mv Dockerfile-Unit-Tests Dockerfile
docker build --no-cache -t hw-xapp-test .

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


3. Make sure that we can see the image we made before by using.

docker images

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


4. After that, we have to run the docker image we made by using this command.

docker run --net host -it --rm -v "/root/hw/init:/opt/ric/config" --name "HW-xAPP" hw-xapp-test:latest

5. After we run the image a test should ran and if the test result is ok it will show RUN and then OK

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →



Studying Hello World xApp To Understand How xApp Handle E2SM + E2AP



In Hello World xApp unit test, they try to test E2AP Class 1 Procedure and Class 2 Procedure. All the procedure on E2AP could be seen on the image below.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Fig.5. E2AP Class 1 Elementary Procedures [2]

Fig.6. E2AP Class 2 Elementary Procedures [2]

Based on Hello World xApp Unit test for E2AP they ran several tests to check the functionality of E2AP. It is separated to several tests, the related test code could be seen on the image below.



First it will try to make a dummy xApp first using the flow below.






Unit Testing Function


test_cntrl.h

On this test they try to check E2AP class 1 elementary procedure called as RIC control request. This test has 1 test case named as :

  • ControlMessage



ControlMessage

RIC control request made, and the value for every message will be set for every variable to match the actual RIC control request message standard from E2AP.

Fig.7. E2AP RIC Control Request Message [2]


test_e2ap.h

On this test they try to check E2AP class 1 elementary procedures called as RIC Control, RIC Subscription Delete, and RIC Subscription. This test has 13 test cases named as :

  • ControlAcknowledgementEncode
  • ControlAcknowledgementDecode
  • ControlFailureEncode
  • ControlFailureDecode
  • SubscriptionDeleteRequest
  • SubDelResponseEncode
  • SubDelResponseDecode
  • SubDelFailureEncode
  • SubDelFailureDecode
  • SubResponseEncode
  • SubResponseDecode
  • SubFailureEncode
  • SubFailureDecode



ControlAcknowledgementEncode

RIC control acknowledgement file made and then it is written into controlack1.per with encoding function. Variable used is the same as the actual E2AP Control Acknowledgement Message.

Fig.8. E2AP RIC Control Acknowledge Message [2]


ControlAcknowledgementDecode

This test is made to decode the previous ControlAcknowledgementEncode message by reading the controlack1.per file





ControlFailureEncode

RIC control failure file made and then it is written into controlfail1.per with encoding function. Variable used is the same as the actual E2AP Control Failure Message.

Fig.9. E2AP RIC Control Failure Message [2]


ControlFailureDecode

This test is made to decode the previous ControlFailureEncode message by reading the controlfail1.per file





SubscriptionDeleteRequest

RIC delete request made in this function. Variable used is the same as the actual E2AP Subscription Delete Request.

Fig.10. E2AP RIC Subscription Delete Request Message [2]


SubDelResponseEncode

RIC subscription delete response file made and then it is written into subdelresponse1.per with encoding function. Variable used is the same as the actual E2AP Subscription Delete Response.

Fig.11. E2AP Subscription Delete Response Message [2]


SubDelResponseDecode

This test is made to decode the previous SubDelResponseEncode message by reading the subdelresponse1.per file





SubDelFailureEncode

RIC subscription delete response file made and then it is written into subdelfailure2.per with encoding function. Variable used is the same as the actual E2AP Subscription Delete Failure.

Fig.12. E2AP Subscription Delete Failure Message [2]


SubDelFailureDecode

This test is made to decode the previous SubDelFailureEncode message by reading the subdelfailure2.per file





SubResponseEncode

RIC subscription delete response file made and then it is written into subresponse1.per with encoding function. Variable used is the same as the actual E2AP Subscription Response.

Fig.13. E2AP Subscription Response Message [2]


SubResponseDecode

This test is made to decode the previous SubResponseEncode message by reading the subresponse1.per file





SubFailureEncode

RIC subscription delete response file made and then it is written into subfailure1.per with encoding function. Variable used is the same as the actual E2AP Subscription Failure.

Fig.14. E2AP Subscription Failure Message [2]


SubFailureDecode

This test is made to decode the previous SubFailureEncode message by reading the subfailure1.per file





test_indc.h

On this test they try to check E2AP class 1 and class 2 elementary procedures called as RIC Indication and RIC Subscription. This test has 2 test cases named as :

  • IndicationMessageEncode
  • IndicationMessageDecode



IndicationMessageEncode

RIC indication file made and then it is written into indication1.per with encoding function. Variable used is the same as the actual E2AP Indication Message.

Fig.15. E2AP Indication Message [2]


IndicationMessageDecode

This test is made to decode the previous IndicationMessageEncode message by reading the indication1.per file





test_subs.h

On this test they try to check E2AP class 1 elementary procedures called as RIC Subscription.




Hello World xApp Unit Test Complete Logs


xApp Creation



E2AP Control Acknowledgement Encode



E2AP Control Acknowledgement Decode



E2AP Control Failure Encode



E2AP Control Failure Decode



E2AP Subscription Delete Request



E2AP Subscription Delete Response Encode



E2AP Subscription Delete Response Decode



E2AP Subscription Delete Failure Encode




E2AP Subscription Delete Failure Decode



E2AP Subscription Response Encode




E2AP Subscription Response Decode



Complete Log

Xapp Name is: hwxapp
{"ts":1632483588312,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp Name set to hwxapp from environment varia                                                                                                                        ble"}
{"ts":1632483588312,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp ID set to hwxapp from environment variabl                                                                                                                        e"}
{"ts":1632483588312,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Ports set to 4560 from environment variable"}
1632483588 8/RMR [INFO] ric message routing library on SI95/g mv=3 flg=00 (84423e6 4.4.6 built: Dec  4 2020)
{"ts":1632483588314,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":">>> waiting for RMR, file= ../src/xapp-utils/x                                                                                                                        app_rmr.cc, line=59"}
{"ts":1632483589315,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"RMR Context is Ready, file= ../src/xapp-utils/                                                                                                                        xapp_rmr.cc, line=63"}
Note: Google Test filter = E2AP*
[==========] Running 13 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 13 tests from E2AP
[ RUN      ] E2AP.ControlAcknowledgementEncode
<E2AP-PDU>
    <successfulOutcome>
        <procedureCode>4</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICcontrolAcknowledge>
                <protocolIEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>24</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcontrolStatus><rejected/></RICcontrolStatus>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                </protocolIEs>
            </RICcontrolAcknowledge>
        </value>
    </successfulOutcome>
</E2AP-PDU>
1632483589 8/RMR [INFO] sends: ts=1632483589 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0                                                                                                                         succ=0 fail=0 (hard=0 soft=0)
1632483589 8/RMR [INFO] sends: ts=1632483589 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 su                                                                                                                        cc=0 fail=0 (hard=0 soft=0)
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlAcknowledgementEncode (2002 ms)
[ RUN      ] E2AP.ControlAcknowledgementDecode
e2ap buffer size: 64
{"ts":1632483591317,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message"                                                                                                                        }
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlAcknowledgementDecode (0 ms)
[ RUN      ] E2AP.ControlFailureEncode
<E2AP-PDU>
    <unsuccessfulOutcome>
        <procedureCode>4</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICcontrolFailure>
                <protocolIEs>
                    <RICcontrolFailure-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>1</id>
                        <criticality><ignore/></criticality>
                        <value>
                            <Cause>
                                <ricRequest><action-not-supported/></ricRequest>
                            </Cause>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
                        </value>
                    </RICcontrolFailure-IEs>
                </protocolIEs>
            </RICcontrolFailure>
        </value>
    </unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlFailureEncode (2001 ms)
[ RUN      ] E2AP.ControlFailureDecode
e2ap buffer size: 65
{"ts":1632483593318,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message"                                                                                                                        }
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlFailureDecode (0 ms)
[ RUN      ] E2AP.SubscriptionDeleteRequest
<E2AP-PDU>
    <initiatingMessage>
        <procedureCode>9</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionDeleteRequest>
                <protocolIEs>
                    <RICsubscriptionDeleteRequest-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>3</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionDeleteRequest-IEs>
                    <RICsubscriptionDeleteRequest-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionDeleteRequest-IEs>
                </protocolIEs>
            </RICsubscriptionDeleteRequest>
        </value>
    </initiatingMessage>
</E2AP-PDU>
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me                                                                                                                        mory"}
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo                                                                                                                        ry"}
[       OK ] E2AP.SubscriptionDeleteRequest (0 ms)
[ RUN      ] E2AP.SubDelResponseEncode
<E2AP-PDU>
    <successfulOutcome>
        <procedureCode>9</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionDeleteResponse>
                <protocolIEs>
                    <RICsubscriptionDeleteResponse-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionDeleteResponse-IEs>
                    <RICsubscriptionDeleteResponse-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionDeleteResponse-IEs>
                </protocolIEs>
            </RICsubscriptionDeleteResponse>
        </value>
    </successfulOutcome>
</E2AP-PDU>
{"ts":1632483595322,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me                                                                                                                        mory"}
{"ts":1632483595322,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo                                                                                                                        ry"}
[       OK ] E2AP.SubDelResponseEncode (2004 ms)
[ RUN      ] E2AP.SubDelResponseDecode
e2ap buffer size: 22
{"ts":1632483605323,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Subscription Delete                                                                                                                         Response"}
{"ts":1632483605323,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me                                                                                                                        mory"}
{"ts":1632483605323,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo                                                                                                                        ry"}
[       OK ] E2AP.SubDelResponseDecode (10001 ms)
[ RUN      ] E2AP.SubDelFailureEncode
<E2AP-PDU>
    <unsuccessfulOutcome>
        <procedureCode>9</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionDeleteFailure>
                <protocolIEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>102</ricRequestorID>
                                <ricInstanceID>101</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>1</id>
                        <criticality><ignore/></criticality>
                        <value>
                            <Cause>
                                <ricRequest><excessive-actions/></ricRequest>
                            </Cause>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>2</id>
                        <criticality><ignore/></criticality>
                        <value>
                            <CriticalityDiagnostics>
                                <procedureCode>10</procedureCode>
                                <triggeringMessage><successful-outcome/></triggeringMessage>
                                <procedureCriticality><reject/></procedureCriticality>
                                <ricRequestorID>
                                    <ricRequestorID>0</ricRequestorID>
                                    <ricInstanceID>0</ricInstanceID>
                                </ricRequestorID>
                                <iEsCriticalityDiagnostics>
                                    <CriticalityDiagnostics-IE-Item>
                                        <iECriticality><notify/></iECriticality>
                                        <iE-ID>1</iE-ID>
                                        <typeOfError><missing/></typeOfError>
                                    </CriticalityDiagnostics-IE-Item>
                                    <CriticalityDiagnostics-IE-Item>
                                        <iECriticality><ignore/></iECriticality>
                                        <iE-ID>1</iE-ID>
                                        <typeOfError><missing/></typeOfError>
                                    </CriticalityDiagnostics-IE-Item>
                                </iEsCriticalityDiagnostics>
                            </CriticalityDiagnostics>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                </protocolIEs>
            </RICsubscriptionDeleteFailure>
        </value>
    </unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483607334,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me                                                                                                                        mory"}
{"ts":1632483607334,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo                                                                                                                        ry"}
[       OK ] E2AP.SubDelFailureEncode (2011 ms)
[ RUN      ] E2AP.SubDelFailureDecode
e2ap buffer size: 47
{"ts":1632483617336,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Unsuccessfully decoded: RIC Subscription Delet                                                                                                                        e Failure"}
Procedure Code: 10
Procedure Criticality: 0
Size OF LIST :2
Typ Error:::1
iEcriticality:::2
ieID:::1
Typ Error:::1
iEcriticality:::1
ieID:::1
{"ts":1632483617336,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me                                                                                                                        mory"}
{"ts":1632483617336,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo                                                                                                                        ry"}
[       OK ] E2AP.SubDelFailureDecode (10002 ms)
[ RUN      ] E2AP.SubResponseEncode
<E2AP-PDU>
    <successfulOutcome>
        <procedureCode>8</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionResponse>
                <protocolIEs>
                    <RICsubscriptionResponse-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionResponse-IEs>
                    <RICsubscriptionResponse-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionResponse-IEs>
                    <RICsubscriptionResponse-IEs>
                        <id>17</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICaction-Admitted-List>
                                <ProtocolIE-SingleContainer>
                                    <id>14</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-Admitted-Item>
                                            <ricActionID>1</ricActionID>
                                        </RICaction-Admitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                                <ProtocolIE-SingleContainer>
                                    <id>14</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-Admitted-Item>
                                            <ricActionID>2</ricActionID>
                                        </RICaction-Admitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                            </RICaction-Admitted-List>
                        </value>
                    </RICsubscriptionResponse-IEs>
                    <RICsubscriptionResponse-IEs>
                        <id>18</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICaction-NotAdmitted-List>
                                <ProtocolIE-SingleContainer>
                                    <id>16</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-NotAdmitted-Item>
                                            <ricActionID>2</ricActionID>
                                            <cause>
                                                <ricRequest><duplicate-action/></ricRequest>
                                            </cause>
                                        </RICaction-NotAdmitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                                <ProtocolIE-SingleContainer>
                                    <id>16</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-NotAdmitted-Item>
                                            <ricActionID>2</ricActionID>
                                            <cause>
                                                <ricRequest><action-not-supported/></ricRequest>
                                            </cause>
                                        </RICaction-NotAdmitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                            </RICaction-NotAdmitted-List>
                        </value>
                    </RICsubscriptionResponse-IEs>
                </protocolIEs>
            </RICsubscriptionResponse>
        </value>
    </successfulOutcome>
</E2AP-PDU>
{"ts":1632483617336,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed Subscription Response Object memory"}
[       OK ] E2AP.SubResponseEncode (0 ms)
[ RUN      ] E2AP.SubResponseDecode
1632483620 8/RMR [INFO] sends: ts=1632483620 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0                                                                                                                         succ=0 fail=0 (hard=0 soft=0)
1632483620 8/RMR [INFO] sends: ts=1632483620 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 su                                                                                                                        cc=0 fail=0 (hard=0 soft=0)
subresponse2.per: No such file or directory
XaPP terminated via signal -1

root@ric:~/hw# docker run --net host -it --rm -v "/root/hw/init:/opt/ric/config" --name "HW-xAPP" hw-xapp-test:latest
Xapp Name is: hwxapp
{"ts":1632483756957,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp Name set to hwxapp from environment variable"}
{"ts":1632483756957,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp ID set to hwxapp from environment variable"}
{"ts":1632483756957,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Ports set to 4560 from environment variable"}
1632483756 8/RMR [INFO] ric message routing library on SI95/g mv=3 flg=00 (84423e6 4.4.6 built: Dec  4 2020)
{"ts":1632483756958,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":">>> waiting for RMR, file= ../src/xapp-utils/xapp_rmr.cc, line=59"}
{"ts":1632483757961,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"RMR Context is Ready, file= ../src/xapp-utils/xapp_rmr.cc, line=63"}
1632483757 8/RMR [INFO] sends: ts=1632483757 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1632483757 8/RMR [INFO] sends: ts=1632483757 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 succ=0 fail=0 (hard=0 soft=0)
Note: Google Test filter = E2AP*
[==========] Running 13 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 13 tests from E2AP
[ RUN      ] E2AP.ControlAcknowledgementEncode
<E2AP-PDU>
    <successfulOutcome>
        <procedureCode>4</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICcontrolAcknowledge>
                <protocolIEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>24</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcontrolStatus><rejected/></RICcontrolStatus>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                    <RICcontrolAcknowledge-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
                        </value>
                    </RICcontrolAcknowledge-IEs>
                </protocolIEs>
            </RICcontrolAcknowledge>
        </value>
    </successfulOutcome>
</E2AP-PDU>
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlAcknowledgementEncode (2000 ms)
[ RUN      ] E2AP.ControlAcknowledgementDecode
e2ap buffer size: 64
{"ts":1632483759961,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message"}
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlAcknowledgementDecode (0 ms)
[ RUN      ] E2AP.ControlFailureEncode
<E2AP-PDU>
    <unsuccessfulOutcome>
        <procedureCode>4</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICcontrolFailure>
                <protocolIEs>
                    <RICcontrolFailure-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>1</id>
                        <criticality><ignore/></criticality>
                        <value>
                            <Cause>
                                <ricRequest><action-not-supported/></ricRequest>
                            </Cause>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
                        </value>
                    </RICcontrolFailure-IEs>
                    <RICcontrolFailure-IEs>
                        <id>20</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
                        </value>
                    </RICcontrolFailure-IEs>
                </protocolIEs>
            </RICcontrolFailure>
        </value>
    </unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlFailureEncode (2001 ms)
[ RUN      ] E2AP.ControlFailureDecode
e2ap buffer size: 65
{"ts":1632483761962,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[       OK ] E2AP.ControlFailureDecode (0 ms)
[ RUN      ] E2AP.SubscriptionDeleteRequest
<E2AP-PDU>
    <initiatingMessage>
        <procedureCode>9</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionDeleteRequest>
                <protocolIEs>
                    <RICsubscriptionDeleteRequest-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>3</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionDeleteRequest-IEs>
                    <RICsubscriptionDeleteRequest-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionDeleteRequest-IEs>
                </protocolIEs>
            </RICsubscriptionDeleteRequest>
        </value>
    </initiatingMessage>
</E2AP-PDU>
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[       OK ] E2AP.SubscriptionDeleteRequest (0 ms)
[ RUN      ] E2AP.SubDelResponseEncode
<E2AP-PDU>
    <successfulOutcome>
        <procedureCode>9</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionDeleteResponse>
                <protocolIEs>
                    <RICsubscriptionDeleteResponse-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionDeleteResponse-IEs>
                    <RICsubscriptionDeleteResponse-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionDeleteResponse-IEs>
                </protocolIEs>
            </RICsubscriptionDeleteResponse>
        </value>
    </successfulOutcome>
</E2AP-PDU>
{"ts":1632483763963,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483763963,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[       OK ] E2AP.SubDelResponseEncode (2001 ms)
[ RUN      ] E2AP.SubDelResponseDecode
e2ap buffer size: 22
{"ts":1632483773964,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Subscription Delete Response"}
{"ts":1632483773964,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483773964,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[       OK ] E2AP.SubDelResponseDecode (10001 ms)
[ RUN      ] E2AP.SubDelFailureEncode
<E2AP-PDU>
    <unsuccessfulOutcome>
        <procedureCode>9</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionDeleteFailure>
                <protocolIEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>102</ricRequestorID>
                                <ricInstanceID>101</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>1</id>
                        <criticality><ignore/></criticality>
                        <value>
                            <Cause>
                                <ricRequest><excessive-actions/></ricRequest>
                            </Cause>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                    <RICsubscriptionDeleteFailure-IEs>
                        <id>2</id>
                        <criticality><ignore/></criticality>
                        <value>
                            <CriticalityDiagnostics>
                                <procedureCode>10</procedureCode>
                                <triggeringMessage><successful-outcome/></triggeringMessage>
                                <procedureCriticality><reject/></procedureCriticality>
                                <ricRequestorID>
                                    <ricRequestorID>0</ricRequestorID>
                                    <ricInstanceID>0</ricInstanceID>
                                </ricRequestorID>
                                <iEsCriticalityDiagnostics>
                                    <CriticalityDiagnostics-IE-Item>
                                        <iECriticality><notify/></iECriticality>
                                        <iE-ID>1</iE-ID>
                                        <typeOfError><missing/></typeOfError>
                                    </CriticalityDiagnostics-IE-Item>
                                    <CriticalityDiagnostics-IE-Item>
                                        <iECriticality><ignore/></iECriticality>
                                        <iE-ID>1</iE-ID>
                                        <typeOfError><missing/></typeOfError>
                                    </CriticalityDiagnostics-IE-Item>
                                </iEsCriticalityDiagnostics>
                            </CriticalityDiagnostics>
                        </value>
                    </RICsubscriptionDeleteFailure-IEs>
                </protocolIEs>
            </RICsubscriptionDeleteFailure>
        </value>
    </unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483775969,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483775969,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[       OK ] E2AP.SubDelFailureEncode (2005 ms)
[ RUN      ] E2AP.SubDelFailureDecode
e2ap buffer size: 47
{"ts":1632483785970,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Unsuccessfully decoded: RIC Subscription Delete Failure"}
Procedure Code: 10
Procedure Criticality: 0
Size OF LIST :2
Typ Error:::1
iEcriticality:::2
ieID:::1
Typ Error:::1
iEcriticality:::1
ieID:::1
{"ts":1632483785970,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483785970,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[       OK ] E2AP.SubDelFailureDecode (10001 ms)
[ RUN      ] E2AP.SubResponseEncode
<E2AP-PDU>
    <successfulOutcome>
        <procedureCode>8</procedureCode>
        <criticality><reject/></criticality>
        <value>
            <RICsubscriptionResponse>
                <protocolIEs>
                    <RICsubscriptionResponse-IEs>
                        <id>29</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICrequestID>
                                <ricRequestorID>1</ricRequestorID>
                                <ricInstanceID>1</ricInstanceID>
                            </RICrequestID>
                        </value>
                    </RICsubscriptionResponse-IEs>
                    <RICsubscriptionResponse-IEs>
                        <id>5</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RANfunctionID>1</RANfunctionID>
                        </value>
                    </RICsubscriptionResponse-IEs>
                    <RICsubscriptionResponse-IEs>
                        <id>17</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICaction-Admitted-List>
                                <ProtocolIE-SingleContainer>
                                    <id>14</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-Admitted-Item>
                                            <ricActionID>1</ricActionID>
                                        </RICaction-Admitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                                <ProtocolIE-SingleContainer>
                                    <id>14</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-Admitted-Item>
                                            <ricActionID>2</ricActionID>
                                        </RICaction-Admitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                            </RICaction-Admitted-List>
                        </value>
                    </RICsubscriptionResponse-IEs>
                    <RICsubscriptionResponse-IEs>
                        <id>18</id>
                        <criticality><reject/></criticality>
                        <value>
                            <RICaction-NotAdmitted-List>
                                <ProtocolIE-SingleContainer>
                                    <id>16</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-NotAdmitted-Item>
                                            <ricActionID>2</ricActionID>
                                            <cause>
                                                <ricRequest><duplicate-action/></ricRequest>
                                            </cause>
                                        </RICaction-NotAdmitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                                <ProtocolIE-SingleContainer>
                                    <id>16</id>
                                    <criticality><ignore/></criticality>
                                    <value>
                                        <RICaction-NotAdmitted-Item>
                                            <ricActionID>2</ricActionID>
                                            <cause>
                                                <ricRequest><action-not-supported/></ricRequest>
                                            </cause>
                                        </RICaction-NotAdmitted-Item>
                                    </value>
                                </ProtocolIE-SingleContainer>
                            </RICaction-NotAdmitted-List>
                        </value>
                    </RICsubscriptionResponse-IEs>
                </protocolIEs>
            </RICsubscriptionResponse>
        </value>
    </successfulOutcome>
</E2AP-PDU>
{"ts":1632483785971,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed Subscription Response Object memory"}
[       OK ] E2AP.SubResponseEncode (1 ms)
[ RUN      ] E2AP.SubResponseDecode
1632483788 8/RMR [INFO] sends: ts=1632483788 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1632483788 8/RMR [INFO] sends: ts=1632483788 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 succ=0 fail=0 (hard=0 soft=0)


References