Routing Manager is a basic platform service of RIC. It is responsible for distributing routing policies among the other platform components and xApps.


The architecture consists of the following five well defined functions:

  • NorthBound Interface (__NBI__): Maintains the communication channels towards RIC manager components
  • Routing Policy Engine (__RPE__): Provides the logic to calculate routing policies
  • Shared Data Layer (__SDL__): Provides access to different kind persistent data stores
  • SouthBound Interface (__SBI__): Maintains the communication channels towards RIC tenants and control components
  • Control Logic (__RTMGR__): Controls the operation of above functions

Configuration Settings for Routing Manager

The configuration related parameters for routing manager are provided in the following files -

ConfigMap: ric-dep/helm/rtmgr/config.yaml:

This file has the major configurations. The description for each of them is given below -

  • PlatformComponents : Represents the platform components that needs route table to be distributed. They usually contain the hard coded name(used internally by Routing Manager), the FQDN name and the port.
  • XMURL : The URL used by RM to query Appmgr to provide the Xapp list during start-up
  • EMURL : The URL used by RM to query E2Mgr to provide the E2Termination list during start-up
  • RTFILE: File based data store that RM uses to store the route table information and other internal details.
  • CFGFILE: Stores the path of config file in RTE. Mandatorily needed to start RM.
  • RPE/SBI/SBIURL/NBI/NBIURL/SDL : Derived from the RM helm chart and needed for respective module initialization.
  • logger : To change the log level setting
  • local : Http server that listens on the specified port. This port used for dumping RTFILE contains.
  • rmr : RMR messaging related attributes needed by xapp-framework.
    • protPort: RMR Listening Port
    • maxSize: Maximum Transmission Buffer size
    • threadType: Always set to 1 so that RM doesn’t wait for static Route table initialization.
  • PlatformRoutes: Static platform routes between the Platform Components. Based on these rules the routes wll get populated. The syntax is based on the RMR route table syntax.
    • messagetype: Message types as defined in mtypes.go(rmr.h) in xapp-framework(RMR)
    • senderendpoint: Message originating address in the form IP:PORT
    • subscriptionid: Subscription ID to be filled, mostlt “-1” for all static routes
    • endpoint: Message reception address in the form IP:PORT
    • meid: meid entry is required to be populated by “%meid”

Env File: ric-dep/helm/rtmgr/env.yaml:

This file contains attributes based that are required by RMR.

Installing RIC Platform - Routing Manager gets deployed automatically

Follow the procedure found in

This will be the best way to test the bugs and integrate new features.

Testing and Troubleshooting

  1. Routing Manager is in Continous Reboot loop.

    1a. Check if the appmgr POD is running by running the command. This command should show it as “Running” 1b. If appmgr is running as expected, check the logs of appmgr,if helm is properly initialised.

1a .#kubectl get pods -n ricplt | grep appmgr
deployment-ricplt-appmgr-77bcbb8886-p4zvq          2/2     Running   0          2d3h

2a .# kubectl logs  deployment-ricplt-appmgr-77bcbb8886-p4zvq -n ricplt container-ricplt-appmgr | grep "Helm init done successfully"
{"ts":1585551084410,"crit":"INFO","id":"appmgr","mdc":{"time":"2020-03-30T06:51:24Z","xm":"0.4.1"},"msg":"Helm init done successfully!"}
  1. Check the Routes generated by Routing Manager and its internal map.

    If this REST API is command fired, it should return the list of routes generated for platform components and the file contents. This should match with the user expectations while debugging.

curl -X GET "http://<KONGPROXY_IP>:3800/ric/v1/getdebuginfo" -H  "accept: application/json" | json_pp

# curl -X GET "" -H  "accept: application/json" | json_pp
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
100  3765    0  3765    0     0  71037      0 --:--:-- --:--:-- --:--:-- 71037
 "RouteConfigs" : "{\n\"XApps\": null,\n\"E2Ts\": {\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n},\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n},\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n},\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n},\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n},\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n},\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n},\n\"\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"\",\n\"ranlist\": []\n}\n},\n\"MeidMap\": [],\n\"Pcs\": [\n{\n\"name\": \"E2TERM\",\n\"fqdn\": \"service-ricplt-e2term-rmr.ricplt\",\n\"port\": 38000\n},\n{\n\"name\": \"SUBMAN\",\n\"fqdn\": \"service-ricplt-submgr-rmr.ricplt\",\n\"port\": 4560\n},\n{\n\"name\": \"E2MAN\",\n\"fqdn\": \"service-ricplt-e2mgr-rmr.ricplt\",\n\"port\": 3801\n},\n{\n\"name\": \"RSM\",\n\"fqdn\": \"service-ricplt-rsm-rmr.ricplt\",\n\"port\": 4801\n},\n{\n\"name\": \"A1MEDIATOR\",\n\"fqdn\": \"service-ricplt-a1mediator-rmr.ricplt\",\n\"port\": 4562\n}\n]\n}",
"RouteTable" : [
  1. Further debugging can be done by checking the logs of routing manager. Debug flag if enabled in config map will allow more logs to be printed on the console
#To enable debug logs, ensure this variable is as shown below in  ric-dep/helm/rtmgr/templates/config.yaml
              "level": 4
#Re-start rtmgr and check for the logs,
        kubectl logs <podname> -n ricplt

Executing unit tests

For running unit tests, execute the following command:
go test ./pkg/nbi (or any package - feel free to add your own parameters)

If you wish to execute the full UT set with coverage:

mkdir -p unit-test
go test ./pkg/sbi ./pkg/rpe ./pkg/nbi ./pkg/sdl -cover -race -coverprofile=$PWD/unit-test/c.out
go tool cover -html=$PWD/unit-test/c.out -o $PWD/unit-test/coverage.html