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.
18 This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 platform project (RICP).
21 ==================================================================================
31 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
33 "routing-manager/pkg/rpe"
34 "routing-manager/pkg/rtmgr"
35 "routing-manager/pkg/sbi"
36 "routing-manager/pkg/sdl"
45 var sbiEngine sbi.Engine
46 var sdlEngine sdl.Engine
47 var rpeEngine rpe.Engine
49 const INTERVAL time.Duration = 60
51 func NewControl() Control {
52 return Control{make(chan *xapp.RMRParams)}
56 rcChan chan *xapp.RMRParams
59 func (c *Control) Run() {
62 nbiEngine, sbiEngine, sdlEngine, rpeEngine, err = initRtmgr()
64 xapp.Logger.Error(err.Error())
68 xapp.Resource.InjectRoute("/ric/v1/symptomdata", c.SymptomDataHandler, "GET")
73 func (c *Control) SymptomDataHandler(w http.ResponseWriter, r *http.Request) {
74 resp, _ := dumpDebugData()
75 xapp.Resource.SendSymptomDataJson(w, r, resp, "platform/rttable.json")
78 func (c *Control) Consume(rp *xapp.RMRParams) (err error) {
83 func initRtmgr() (nbiEngine Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, err error) {
84 if nbiEngine, err = GetNbi(xapp.Config.GetString("nbi")); err == nil && nbiEngine != nil {
85 if sbiEngine, err = sbi.GetSbi(xapp.Config.GetString("sbi")); err == nil && sbiEngine != nil {
86 if sdlEngine, err = sdl.GetSdl(xapp.Config.GetString("sdl")); err == nil && sdlEngine != nil {
87 if rpeEngine, err = rpe.GetRpe(xapp.Config.GetString("rpe")); err == nil && rpeEngine != nil {
88 return nbiEngine, sbiEngine, sdlEngine, rpeEngine, nil
93 return nil, nil, nil, nil, err
96 func (c *Control) controlLoop() {
101 xapp_msg := sbi.RMRParams{msg}
103 case xapp.RICMessageTypes["RMRRM_REQ_TABLE"]:
104 if rtmgr.Rtmgr_ready == false {
105 xapp.Logger.Info("Update Route Table Request(RMR to RM), message discarded as routing manager is not ready")
107 xapp.Logger.Info("Update Route Table Request(RMR to RM)")
108 go c.handleUpdateToRoutingManagerRequest(msg)
110 case xapp.RICMessageTypes["RMRRM_TABLE_STATE"]:
111 xapp.Logger.Info("state of table to route mgr %s,payload %s", xapp_msg.String(), msg.Payload)
114 err := errors.New("Message Type " + strconv.Itoa(msg.Mtype) + " is discarded")
115 xapp.Logger.Error("Unknown message type: %v", err)
117 xapp.Rmr.Free(msg.Mbuf)*/
121 func (c *Control) recievermr(msg *xapp.RMRParams) {
122 xapp_msg := sbi.RMRParams{msg}
124 case xapp.RICMessageTypes["RMRRM_REQ_TABLE"]:
125 if rtmgr.Rtmgr_ready == false {
126 xapp.Logger.Info("Update Route Table Request(RMR to RM), message discarded as routing manager is not ready")
128 xapp.Logger.Info("Update Route Table Request(RMR to RM)")
129 go c.handleUpdateToRoutingManagerRequest(msg)
131 case xapp.RICMessageTypes["RMRRM_TABLE_STATE"]:
132 xapp.Logger.Info("state of table to route mgr %s,payload %s", xapp_msg.String(), msg.Payload)
134 err := errors.New("Message Type " + strconv.Itoa(msg.Mtype) + " is discarded")
135 xapp.Logger.Error("Unknown message type: %v", err)
137 xapp.Rmr.Free(msg.Mbuf)
140 func (c *Control) handleUpdateToRoutingManagerRequest(params *xapp.RMRParams) {
142 msg := sbi.RMRParams{params}
144 xapp.Logger.Info("Update Route Table Request, msg.String() : %s", msg.String())
145 xapp.Logger.Info("Update Route Table Request, params.Payload : %s", string(params.Payload))
148 data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
152 xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error())
155 xapp.Logger.Debug("Cannot get data from sdl interface")
160 ep := sbiEngine.CheckEndpoint(string(params.Payload))
162 xapp.Logger.Error("Update Routing Table Request can't handle due to end point %s is not avail in complete ep list: ", string(params.Payload))
165 epstr, whid := sbiEngine.CreateEndpoint(msg.String())
166 if epstr == nil || whid < 0 {
167 xapp.Logger.Error("Wormhole Id creation failed %d for %s", whid, msg.String())
171 /*This is to ensure the latest routes are sent.
172 Assumption is that in this time interval the routes are built for this endpoint */
173 time.Sleep(100 * time.Millisecond)
174 policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
175 err = sbiEngine.DistributeToEp(policies, *epstr, whid)
177 xapp.Logger.Error("Routing table cannot be published due to: " + err.Error())
182 func sendRoutesToAll() (err error) {
185 data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
186 //fmt.Printf("data = %v,%v,%v",data,sdlEngine,sbiEngine)
190 return errors.New("Cannot get data from sdl interface due to: " + err.Error())
192 xapp.Logger.Debug("Cannot get data from sdl interface, data is null")
193 return errors.New("Cannot get data from sdl interface")
197 /* if sbiEngine == nil {
198 fmt.Printf("SBI is nil")
200 sbiEngine.UpdateEndpoints(data)
201 policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
202 err = sbiEngine.DistributeAll(policies)
204 return errors.New("Routing table cannot be published due to: " + err.Error())
212 nbiErr := nbiEngine.Initialize(xapp.Config.GetString("xmurl"), xapp.Config.GetString("nbiurl"), xapp.Config.GetString("rtfile"), xapp.Config.GetString("cfgfile"), xapp.Config.GetString("e2murl"), sdlEngine, rpeEngine, &m)
214 xapp.Logger.Error("Failed to initialize nbi due to: " + nbiErr.Error())
218 err := sbiEngine.Initialize(xapp.Config.GetString("sbiurl"))
220 xapp.Logger.Info("Failed to open push socket due to: " + err.Error())
223 defer nbiEngine.Terminate()
224 defer sbiEngine.Terminate()
229 rtmgr.Rtmgr_ready = true
230 time.Sleep(INTERVAL * time.Second)
231 xapp.Logger.Debug("Periodic loop timed out. Setting triggerSBI flag to distribute updated routes.")