blob: 63b67b739cb85b647e0a486adbd0f41b7b1f5a2f [file] [log] [blame]
Balint Uveges871fa392019-04-02 20:31:11 +00001/*
2==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
5
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
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
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.
wahidw761934a2019-11-27 06:07:26 +000017
18
19 This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 platform project (RICP).
21
22
Balint Uveges871fa392019-04-02 20:31:11 +000023==================================================================================
24*/
25/*
26 Mnemonic: rtmgr.go
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
31 Date: 12 March 2019
32*/
33package main
34
zkoczkaeb2ff0d2019-09-26 16:59:54 +020035//TODO: change flag to pflag (won't need any argument parse)
wahidwa8596ec2019-12-05 06:30:42 +000036
Balint Uveges871fa392019-04-02 20:31:11 +000037import (
wahidwa8596ec2019-12-05 06:30:42 +000038 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
Balint Uveges871fa392019-04-02 20:31:11 +000039 "os"
kalnagy92162652019-07-02 15:15:49 +020040 "os/signal"
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"
46 "syscall"
Balint Uveges871fa392019-04-02 20:31:11 +000047 "time"
prabhukaliswamye110ee02019-12-23 09:51:01 +000048 "sync"
Balint Uveges871fa392019-04-02 20:31:11 +000049)
50
51const SERVICENAME = "rtmgr"
prabhukaliswamyb47d12d2019-12-03 15:06:30 +000052const INTERVAL time.Duration = 60
Balint Uveges871fa392019-04-02 20:31:11 +000053
zkoczkaaaf8d392019-10-02 17:16:06 +020054func initRtmgr() (nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, err error) {
wahidwa8596ec2019-12-05 06:30:42 +000055 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 {
zkoczkaaaf8d392019-10-02 17:16:06 +020059 return nbiEngine, sbiEngine, sdlEngine, rpeEngine, nil
Balint Uveges871fa392019-04-02 20:31:11 +000060 }
61 }
62 }
63 }
64 return nil, nil, nil, nil, err
65}
66
wahidwdd6b0562020-03-31 03:09:45 +000067
68
prabhukaliswamye110ee02019-12-23 09:51:01 +000069func serveSBI(triggerSBI <-chan bool, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, m *sync.Mutex) {
kalnagy92162652019-07-02 15:15:49 +020070 for {
71 if <-triggerSBI {
prabhukaliswamye110ee02019-12-23 09:51:01 +000072 m.Lock()
wahidwa8596ec2019-12-05 06:30:42 +000073 data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
prabhukaliswamye110ee02019-12-23 09:51:01 +000074 m.Unlock()
kalnagy92162652019-07-02 15:15:49 +020075 if err != nil || data == nil {
wahidwa8596ec2019-12-05 06:30:42 +000076 xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error())
kalnagy92162652019-07-02 15:15:49 +020077 continue
78 }
79 sbiEngine.UpdateEndpoints(data)
prabhukaliswamye110ee02019-12-23 09:51:01 +000080 policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
kalnagy92162652019-07-02 15:15:49 +020081 err = sbiEngine.DistributeAll(policies)
82 if err != nil {
wahidwa8596ec2019-12-05 06:30:42 +000083 xapp.Logger.Error("Routing table cannot be published due to: " + err.Error())
kalnagy92162652019-07-02 15:15:49 +020084 }
85 }
86 }
87}
88
wahidwdd6b0562020-03-31 03:09:45 +000089func sendRoutesToAll(sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine) {
90
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())
94 return
95 }
96 sbiEngine.UpdateEndpoints(data)
97 policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
98 err = sbiEngine.DistributeAll(policies)
99 if err != nil {
100 xapp.Logger.Error("Routing table cannot be published due to: " + err.Error())
101 return
102 }
103}
104
105
prabhukaliswamye110ee02019-12-23 09:51:01 +0000106func serve(nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, m *sync.Mutex) {
kalnagy92162652019-07-02 15:15:49 +0200107
108 triggerSBI := make(chan bool)
109
rangajalcb93dbf2020-02-13 11:06:11 +0000110 nbiErr := nbiEngine.Initialize(xapp.Config.GetString("xmurl"), xapp.Config.GetString("nbiurl"), xapp.Config.GetString("rtfile"), xapp.Config.GetString("cfgfile"), xapp.Config.GetString("e2murl"),
prabhukaliswamye110ee02019-12-23 09:51:01 +0000111 sdlEngine, rpeEngine, triggerSBI, m)
kalnagy92162652019-07-02 15:15:49 +0200112 if nbiErr != nil {
wahidwa8596ec2019-12-05 06:30:42 +0000113 xapp.Logger.Error("Failed to initialize nbi due to: " + nbiErr.Error())
kalnagy92162652019-07-02 15:15:49 +0200114 return
115 }
116
wahidwa8596ec2019-12-05 06:30:42 +0000117 err := sbiEngine.Initialize(xapp.Config.GetString("sbiurl"))
Balint Uveges871fa392019-04-02 20:31:11 +0000118 if err != nil {
wahidwa8596ec2019-12-05 06:30:42 +0000119 xapp.Logger.Info("Failed to open push socket due to: " + err.Error())
Balint Uveges871fa392019-04-02 20:31:11 +0000120 return
121 }
kalnagy92162652019-07-02 15:15:49 +0200122 defer nbiEngine.Terminate()
123 defer sbiEngine.Terminate()
124
125 // This SBI Go routine is trtiggered by periodic main loop and when data is recieved on REST interface.
prabhukaliswamye110ee02019-12-23 09:51:01 +0000126 go serveSBI(triggerSBI, sbiEngine, sdlEngine, rpeEngine, m)
kalnagy92162652019-07-02 15:15:49 +0200127
Balint Uveges871fa392019-04-02 20:31:11 +0000128 for {
wahidwa8596ec2019-12-05 06:30:42 +0000129 if xapp.Config.GetString("nbi") == "httpGetter" {
130 data, err := nbiEngine.(*nbi.HttpGetter).FetchAllXApps(xapp.Config.GetString("xmurl"))
kalnagy92162652019-07-02 15:15:49 +0200131 if err != nil {
wahidwa8596ec2019-12-05 06:30:42 +0000132 xapp.Logger.Error("Cannot fetch xapp data due to: " + err.Error())
kalnagy92162652019-07-02 15:15:49 +0200133 } else if data != nil {
wahidwa8596ec2019-12-05 06:30:42 +0000134 sdlEngine.WriteXApps(xapp.Config.GetString("rtfile"), data)
kalnagy92162652019-07-02 15:15:49 +0200135 }
Balint Uveges871fa392019-04-02 20:31:11 +0000136 }
kalnagy92162652019-07-02 15:15:49 +0200137
wahidwdd6b0562020-03-31 03:09:45 +0000138 sendRoutesToAll(sbiEngine, sdlEngine, rpeEngine)
prabhukaliswamyb47d12d2019-12-03 15:06:30 +0000139
wahidwdd6b0562020-03-31 03:09:45 +0000140 rtmgr.Rtmgr_ready = true
prabhukaliswamyb47d12d2019-12-03 15:06:30 +0000141 time.Sleep(INTERVAL * time.Second)
wahidwa8596ec2019-12-05 06:30:42 +0000142 xapp.Logger.Debug("Periodic loop timed out. Setting triggerSBI flag to distribute updated routes.")
Balint Uveges871fa392019-04-02 20:31:11 +0000143 }
144}
145
kalnagy92162652019-07-02 15:15:49 +0200146func SetupCloseHandler() {
147 c := make(chan os.Signal, 2)
148 signal.Notify(c, os.Interrupt, syscall.SIGTERM)
149 go func() {
150 <-c
wahidwa8596ec2019-12-05 06:30:42 +0000151 xapp.Logger.Info("\r- Ctrl+C pressed in Terminal")
kalnagy92162652019-07-02 15:15:49 +0200152 os.Exit(0)
153 }()
154}
155
Balint Uveges871fa392019-04-02 20:31:11 +0000156func main() {
wahidwdd6b0562020-03-31 03:09:45 +0000157
kalnagy92162652019-07-02 15:15:49 +0200158 nbiEngine, sbiEngine, sdlEngine, rpeEngine, err := initRtmgr()
Balint Uveges871fa392019-04-02 20:31:11 +0000159 if err != nil {
wahidwa8596ec2019-12-05 06:30:42 +0000160 xapp.Logger.Error(err.Error())
Balint Uveges871fa392019-04-02 20:31:11 +0000161 os.Exit(1)
162 }
wahidwdd6b0562020-03-31 03:09:45 +0000163
kalnagy92162652019-07-02 15:15:49 +0200164 SetupCloseHandler()
wahidwdd6b0562020-03-31 03:09:45 +0000165
wahidwa8596ec2019-12-05 06:30:42 +0000166 xapp.Logger.Info("Start " + SERVICENAME + " service")
Peter Szilagyi16d84d62019-04-24 14:51:02 +0000167 rtmgr.Eps = make(rtmgr.Endpoints)
wahidwdd6b0562020-03-31 03:09:45 +0000168 rtmgr.Rtmgr_ready = false
prabhukaliswamye110ee02019-12-23 09:51:01 +0000169
170 var m sync.Mutex
171
wahidwdd6b0562020-03-31 03:09:45 +0000172// RMR thread is starting port: 4560
173 c := nbi.NewControl()
174 go c.Run(sbiEngine, sdlEngine, rpeEngine, &m)
175
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)
180 }
181
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)
wahidwcd7867c2020-02-05 10:01:12 +0000184
prabhukaliswamye110ee02019-12-23 09:51:01 +0000185 serve(nbiEngine, sbiEngine, sdlEngine, rpeEngine, &m)
Balint Uveges871fa392019-04-02 20:31:11 +0000186 os.Exit(0)
187}