"routing-manager/pkg/sdl"
"syscall"
"time"
+ "sync"
)
const SERVICENAME = "rtmgr"
return nil, nil, nil, nil, err
}
-func serveSBI(triggerSBI <-chan bool, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine) {
+
+
+func serveSBI(triggerSBI <-chan bool, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, m *sync.Mutex) {
for {
if <-triggerSBI {
+ m.Lock()
data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
+ m.Unlock()
if err != nil || data == nil {
xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error())
continue
}
sbiEngine.UpdateEndpoints(data)
- policies := rpeEngine.GeneratePolicies(rtmgr.Eps)
+ policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
err = sbiEngine.DistributeAll(policies)
if err != nil {
xapp.Logger.Error("Routing table cannot be published due to: " + err.Error())
}
}
-func serve(nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine) {
+func sendRoutesToAll(sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine) {
+
+ data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
+ if err != nil || data == nil {
+ xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error())
+ return
+ }
+ sbiEngine.UpdateEndpoints(data)
+ policies := rpeEngine.GeneratePolicies(rtmgr.Eps, data)
+ err = sbiEngine.DistributeAll(policies)
+ if err != nil {
+ xapp.Logger.Error("Routing table cannot be published due to: " + err.Error())
+ return
+ }
+}
+
+
+func serve(nbiEngine nbi.Engine, sbiEngine sbi.Engine, sdlEngine sdl.Engine, rpeEngine rpe.Engine, m *sync.Mutex) {
triggerSBI := make(chan bool)
- nbiErr := nbiEngine.Initialize(xapp.Config.GetString("xmurl"), xapp.Config.GetString("nbiurl"), xapp.Config.GetString("rtfile"), xapp.Config.GetString("cfgfile"),
- sdlEngine, rpeEngine, triggerSBI)
+ 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, triggerSBI, m)
if nbiErr != nil {
xapp.Logger.Error("Failed to initialize nbi due to: " + nbiErr.Error())
return
defer sbiEngine.Terminate()
// This SBI Go routine is trtiggered by periodic main loop and when data is recieved on REST interface.
- go serveSBI(triggerSBI, sbiEngine, sdlEngine, rpeEngine)
+ go serveSBI(triggerSBI, sbiEngine, sdlEngine, rpeEngine, m)
for {
if xapp.Config.GetString("nbi") == "httpGetter" {
}
}
- triggerSBI <- true
+ sendRoutesToAll(sbiEngine, sdlEngine, rpeEngine)
+ rtmgr.Rtmgr_ready = true
time.Sleep(INTERVAL * time.Second)
xapp.Logger.Debug("Periodic loop timed out. Setting triggerSBI flag to distribute updated routes.")
}
}
func main() {
+
nbiEngine, sbiEngine, sdlEngine, rpeEngine, err := initRtmgr()
if err != nil {
xapp.Logger.Error(err.Error())
os.Exit(1)
}
+
SetupCloseHandler()
+
xapp.Logger.Info("Start " + SERVICENAME + " service")
rtmgr.Eps = make(rtmgr.Endpoints)
- serve(nbiEngine, sbiEngine, sdlEngine, rpeEngine)
+ rtmgr.Rtmgr_ready = false
+
+ var m sync.Mutex
+
+// RMR thread is starting port: 4560
+ c := nbi.NewControl()
+ go c.Run(sbiEngine, sdlEngine, rpeEngine, &m)
+
+// Waiting for RMR to be ready
+ time.Sleep(time.Duration(2) * time.Second)
+ for xapp.Rmr.IsReady() == false {
+ time.Sleep(time.Duration(2) * time.Second)
+ }
+
+ dummy_whid := int(xapp.Rmr.Openwh("localhost:4560"))
+ xapp.Logger.Info("created dummy Wormhole ID for routingmanager and dummy_whid :%d", dummy_whid)
+
+ serve(nbiEngine, sbiEngine, sdlEngine, rpeEngine, &m)
os.Exit(0)
}