.. .. Copyright (c) 2019 AT&T Intellectual Property. .. Copyright (c) 2019 Nokia. .. .. Licensed under the Creative Commons Attribution 4.0 International .. Public License (the "License"); you may not use this file except .. in compliance with the License. You may obtain a copy of the License at .. .. https://creativecommons.org/licenses/by/4.0/ .. .. Unless required by applicable law or agreed to in writing, documentation .. distributed under the License is distributed on an "AS IS" BASIS, .. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. .. .. See the License for the specific language governing permissions and .. limitations under the License. .. Developer-Guide =============== .. contents:: :depth: 3 :local: Overview -------- Routing Manager is a basic platform service of RIC. It is responsible for distributing routing policies among the other platform components and xApps. Architecture ------------ 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 https://docs.o-ran-sc.org/projects/o-ran-sc-ric-plt-ric-dep/en/latest/ 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. .. code:: bash 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!"} 2. 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. .. code:: bash curl -X GET "http://:3800/ric/v1/getdebuginfo" -H "accept: application/json" | json_pp # curl -X GET "http://10.101.18.182:3800/ric/v1/getdebuginfo" -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\"10.102.131.163:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.102.131.163:38000\",\n\"ranlist\": []\n},\n\"10.103.165.47:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.103.165.47:38000\",\n\"ranlist\": []\n},\n\"10.104.160.127:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.104.160.127:38000\",\n\"ranlist\": []\n},\n\"10.104.30.46:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.104.30.46:38000\",\n\"ranlist\": []\n},\n\"10.108.90.168:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.108.90.168:38000\",\n\"ranlist\": []\n},\n\"10.110.3.220:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.110.3.220:38000\",\n\"ranlist\": []\n},\n\"10.97.122.250:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.97.122.250:38000\",\n\"ranlist\": []\n},\n\"10.98.173.62:38000\": {\n\"name\": \"E2TERMINST\",\n\"fqdn\": \"10.98.173.62:38000\",\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" : [ "newrt|start\n", "mse|12010,service-ricplt-submgr-rmr.ricplt:4560|-1|%meid\n", "mse|12020,service-ricplt-submgr-rmr.ricplt:4560|-1|%meid\n", "mse|12011|-1|service-ricplt-submgr-rmr.ricplt:4560\n", "mse|12021|-1|service-ricplt-submgr-rmr.ricplt:4560\n", "mse|12012|-1|service-ricplt-submgr-rmr.ricplt:4560\n", "mse|12022|-1|service-ricplt-submgr-rmr.ricplt:4560\n", "mse|10060,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|10070,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|10071,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|10360,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|10081,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|10082,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|10371,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|10372,service-ricplt-e2mgr-rmr.ricplt:3801|-1|%meid\n", "mse|1100|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10061|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10062|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10070|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10071|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10361|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10362|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10370|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|1080|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10030|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10080|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|10020|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|1102|-1|service-ricplt-e2mgr-rmr.ricplt:3801\n", "mse|1200,service-ricplt-e2mgr-rmr.ricplt:3801|-1|\n", "mse|1210,service-ricplt-e2mgr-rmr.ricplt:3801|-1|\n", "mse|1220,service-ricplt-e2mgr-rmr.ricplt:3801|-1|\n", "mse|20012|-1|service-ricplt-a1mediator-rmr.ricplt:4562\n", "mse|20011|-1|service-ricplt-a1mediator-rmr.ricplt:4562\n", "mse|1090,service-ricplt-e2mgr-rmr.ricplt:3801|-1|10.104.160.127:38000;10.108.90.168:38000;10.102.131.163:38000;10.97.122.250:38000;10.98.173.62:38000;10.103.165.47:38000;10.110.3.220:38000;10.104.30.46:38000\n", "mse|1101,service-ricplt-e2mgr-rmr.ricplt:3801|-1|10.104.160.127:38000;10.108.90.168:38000;10.102.131.163:38000;10.97.122.250:38000;10.98.173.62:38000;10.103.165.47:38000;10.110.3.220:38000;10.104.30.46:38000\n", "newrt|end\n", "meid_map|start\nmeid_map|end|0\n" ] } 3. 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 .. code:: bash #To enable debug logs, ensure this variable is as shown below in ric-dep/helm/rtmgr/templates/config.yaml "logger": "level": 4 #Re-start rtmgr and check for the logs, kubectl logs -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: .. code:: bash 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