2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
19 This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 platform project (RICP).
23 ==================================================================================
27 Abstract: Routing Manager Main file. Implemets the following functions:
28 - parseArgs: reading command line arguments
29 - init:Rtmgr initializing the service modules
30 - serve: running the loop
35 //TODO: change flag to pflag (won't need any argument parse)
38 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
41 "routing-manager/pkg/nbi"
42 "routing-manager/pkg/rpe"
43 "routing-manager/pkg/rtmgr"
44 "routing-manager/pkg/sbi"
45 "routing-manager/pkg/sdl"
51 const SERVICENAME = "rtmgr"
52 const INTERVAL time.Duration = 60
54 func initRtmgr() (nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, err error) {
55 if nbiEngine, err = nbi.GetNbi(xapp.Config.GetString("nbi")); err == nil && nbiEngine != nil {
56 if sbiEngine, err = sbi.GetSbi(xapp.Config.GetString("sbi")); err == nil && sbiEngine != nil {
57 if sdlEngine, err = sdl.GetSdl(xapp.Config.GetString("sdl")); err == nil && sdlEngine != nil {
58 if rpeEngine, err = rpe.GetRpe(xapp.Config.GetString("rpe")); err == nil && rpeEngine != nil {
59 return nbiEngine, sbiEngine, sdlEngine, rpeEngine, nil
64 return nil, nil, nil, nil, err
69 func serveSBI(triggerSBI <-chan bool, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, m *sync.Mutex) {
73 data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
75 if err != nil || data == nil {
76 xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error())
79 sbiEngine.UpdateEndpoints(data)
80 policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
81 err = sbiEngine.DistributeAll(policies)
83 xapp.Logger.Error("Routing table cannot be published due to: " + err.Error())
89 func sendRoutesToAll(sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine) {
91 data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
92 if err != nil || data == nil {
93 xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error())
96 sbiEngine.UpdateEndpoints(data)
97 policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
98 err = sbiEngine.DistributeAll(policies)
100 xapp.Logger.Error("Routing table cannot be published due to: " + err.Error())
106 func serve(nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, m *sync.Mutex) {
108 triggerSBI := make(chan bool)
110 nbiErr := nbiEngine.Initialize(xapp.Config.GetString("xmurl"), xapp.Config.GetString("nbiurl"), xapp.Config.GetString("rtfile"), xapp.Config.GetString("cfgfile"), xapp.Config.GetString("e2murl"),
111 sdlEngine, rpeEngine, triggerSBI, m)
113 xapp.Logger.Error("Failed to initialize nbi due to: " + nbiErr.Error())
117 err := sbiEngine.Initialize(xapp.Config.GetString("sbiurl"))
119 xapp.Logger.Info("Failed to open push socket due to: " + err.Error())
122 defer nbiEngine.Terminate()
123 defer sbiEngine.Terminate()
125 // This SBI Go routine is trtiggered by periodic main loop and when data is recieved on REST interface.
126 go serveSBI(triggerSBI, sbiEngine, sdlEngine, rpeEngine, m)
129 if xapp.Config.GetString("nbi") == "httpGetter" {
130 data, err := nbiEngine.(*nbi.HttpGetter).FetchAllXApps(xapp.Config.GetString("xmurl"))
132 xapp.Logger.Error("Cannot fetch xapp data due to: " + err.Error())
133 } else if data != nil {
134 sdlEngine.WriteXApps(xapp.Config.GetString("rtfile"), data)
138 sendRoutesToAll(sbiEngine, sdlEngine, rpeEngine)
140 rtmgr.Rtmgr_ready = true
141 time.Sleep(INTERVAL * time.Second)
142 xapp.Logger.Debug("Periodic loop timed out. Setting triggerSBI flag to distribute updated routes.")
146 func SetupCloseHandler() {
147 c := make(chan os.Signal, 2)
148 signal.Notify(c, os.Interrupt, syscall.SIGTERM)
151 xapp.Logger.Info("\r- Ctrl+C pressed in Terminal")
158 nbiEngine, sbiEngine, sdlEngine, rpeEngine, err := initRtmgr()
160 xapp.Logger.Error(err.Error())
166 xapp.Logger.Info("Start " + SERVICENAME + " service")
167 rtmgr.Eps = make(rtmgr.Endpoints)
168 rtmgr.Rtmgr_ready = false
172 // RMR thread is starting port: 4560
173 c := nbi.NewControl()
174 go c.Run(sbiEngine, sdlEngine, rpeEngine, &m)
176 // Waiting for RMR to be ready
177 time.Sleep(time.Duration(2) * time.Second)
178 for xapp.Rmr.IsReady() == false {
179 time.Sleep(time.Duration(2) * time.Second)
182 dummy_whid := int(xapp.Rmr.Openwh("localhost:4560"))
183 xapp.Logger.Info("created dummy Wormhole ID for routingmanager and dummy_whid :%d", dummy_whid)
185 serve(nbiEngine, sbiEngine, sdlEngine, rpeEngine, &m)