+ restDuplicateCtrl := new(DuplicateCtrl)
+ restDuplicateCtrl.Init()
+
+ e2IfState := new(E2IfState)
+
+ c := &Control{e2ap: new(E2ap),
+ registry: registry,
+ tracker: tracker,
+ restDuplicateCtrl: restDuplicateCtrl,
+ e2IfState: e2IfState,
+ e2IfStateDb: CreateXappRnibIfInstance(),
+ e2SubsDb: CreateSdl(),
+ restSubsDb: CreateRESTSdl(),
+ Counters: xapp.Metric.RegisterCounterGroup(GetMetricsOpts(), "SUBMGR"),
+ LoggerLevel: 1,
+ }
+
+ e2IfState.Init(c)
+ c.ReadConfigParameters("")
+
+ // Register REST handler for testing support
+ xapp.Resource.InjectRoute("/ric/v1/symptomdata", c.SymptomDataHandler, "GET")
+ xapp.Resource.InjectRoute("/ric/v1/test/{testId}", c.TestRestHandler, "POST")
+ xapp.Resource.InjectRoute("/ric/v1/restsubscriptions", c.GetAllRestSubscriptions, "GET")
+
+ xapp.Resource.InjectRoute("/ric/v1/get_all_e2nodes", c.GetAllE2Nodes, "GET")
+ xapp.Resource.InjectRoute("/ric/v1/get_e2node_rest_subscriptions/{ranName}", c.GetAllE2NodeRestSubscriptions, "GET")
+
+ xapp.Resource.InjectRoute("/ric/v1/get_all_xapps", c.GetAllXapps, "GET")
+ xapp.Resource.InjectRoute("/ric/v1/get_xapp_rest_restsubscriptions/{xappServiceName}", c.GetAllXappRestSubscriptions, "GET")
+ xapp.Resource.InjectRoute("/ric/v1/get_e2subscriptions/{restId}", c.GetE2Subscriptions, "GET")
+
+ xapp.Resource.InjectRoute("/ric/v1/delete_all_e2node_subscriptions/{ranName}", c.DeleteAllE2nodeSubscriptions, "DELETE")
+ xapp.Resource.InjectRoute("/ric/v1/delete_all_xapp_subscriptions/{xappServiceName}", c.DeleteAllXappSubscriptions, "DELETE")
+
+ if readSubsFromDb == "true" {
+ // Read subscriptions from db
+ c.ReadE2Subscriptions()
+ c.ReadRESTSubscriptions()
+ }
+
+ go xapp.Subscription.Listen(c.RESTSubscriptionHandler, c.RESTQueryHandler, c.RESTSubscriptionDeleteHandler)
+ return c
+}
+
+func (c *Control) SymptomDataHandler(w http.ResponseWriter, r *http.Request) {
+ subscriptions, _ := c.registry.QueryHandler()
+ xapp.Resource.SendSymptomDataJson(w, r, subscriptions, "platform/subscriptions.json")
+}
+
+//-------------------------------------------------------------------
+//
+//-------------------------------------------------------------------
+func (c *Control) RESTQueryHandler() (models.SubscriptionList, error) {
+ xapp.Logger.Debug("RESTQueryHandler() called")
+
+ c.CntRecvMsg++
+
+ return c.registry.QueryHandler()
+}
+
+//-------------------------------------------------------------------
+//
+//-------------------------------------------------------------------
+func (c *Control) ReadE2Subscriptions() error {
+ var err error
+ var subIds []uint32
+ var register map[uint32]*Subscription
+ for i := 0; dbRetryForever == "true" || i < dbTryCount; i++ {
+ xapp.Logger.Debug("Reading E2 subscriptions from db")
+ subIds, register, err = c.ReadAllSubscriptionsFromSdl()
+ if err != nil {
+ xapp.Logger.Error("%v", err)
+ <-time.After(1 * time.Second)
+ } else {
+ c.registry.subIds = subIds
+ c.registry.register = register
+ go c.HandleUncompletedSubscriptions(register)
+ return nil
+ }
+ }
+ xapp.Logger.Debug("Continuing without retring")
+ return err
+}
+
+//-------------------------------------------------------------------
+//
+//-------------------------------------------------------------------
+func (c *Control) ReadRESTSubscriptions() error {
+
+ xapp.Logger.Debug("ReadRESTSubscriptions()")
+ var err error
+ var restSubscriptions map[string]*RESTSubscription
+ for i := 0; dbRetryForever == "true" || i < dbTryCount; i++ {
+ xapp.Logger.Debug("Reading REST subscriptions from db")
+ restSubscriptions, err = c.ReadAllRESTSubscriptionsFromSdl()
+ if err != nil {
+ xapp.Logger.Error("%v", err)
+ <-time.After(1 * time.Second)
+ } else {
+ // Fix REST subscriptions ongoing status after restart
+ for restSubId, restSubscription := range restSubscriptions {
+ restSubscription.SubReqOngoing = false
+ restSubscription.SubDelReqOngoing = false
+ c.WriteRESTSubscriptionToSdl(restSubId, restSubscription)
+ }
+ c.registry.restSubscriptions = restSubscriptions
+ return nil
+ }
+ }
+ xapp.Logger.Debug("Continuing without retring")
+ return err
+}
+
+//-------------------------------------------------------------------
+//
+//-------------------------------------------------------------------
+func (c *Control) ReadConfigParameters(f string) {
+
+ xapp.Logger.Debug("ReadConfigParameters")
+
+ c.LoggerLevel = int(xapp.Logger.GetLevel())
+ xapp.Logger.Info("LoggerLevel = %v", c.LoggerLevel)
+ c.e2ap.SetASN1DebugPrintStatus(c.LoggerLevel)
+
+ // viper.GetDuration returns nanoseconds
+ e2tSubReqTimeout = viper.GetDuration("controls.e2tSubReqTimeout_ms") * 1000000
+ if e2tSubReqTimeout == 0 {
+ e2tSubReqTimeout = 2000 * 1000000
+ xapp.Logger.Debug("WARNING: Using hard coded default value for e2tSubReqTimeout")
+ }
+ xapp.Logger.Debug("e2tSubReqTimeout= %v", e2tSubReqTimeout)
+
+ e2tSubDelReqTime = viper.GetDuration("controls.e2tSubDelReqTime_ms") * 1000000
+ if e2tSubDelReqTime == 0 {
+ e2tSubDelReqTime = 2000 * 1000000
+ xapp.Logger.Debug("WARNING: Using hard coded default value for e2tSubDelReqTime")
+ }
+ xapp.Logger.Debug("e2tSubDelReqTime= %v", e2tSubDelReqTime)
+
+ e2tRecvMsgTimeout = viper.GetDuration("controls.e2tRecvMsgTimeout_ms") * 1000000
+ if e2tRecvMsgTimeout == 0 {
+ e2tRecvMsgTimeout = 2000 * 1000000
+ xapp.Logger.Debug("WARNING: Using hard coded default value for e2tRecvMsgTimeout")
+ }
+ xapp.Logger.Debug("e2tRecvMsgTimeout= %v", e2tRecvMsgTimeout)
+
+ e2tMaxSubReqTryCount = viper.GetUint64("controls.e2tMaxSubReqTryCount")
+ if e2tMaxSubReqTryCount == 0 {
+ e2tMaxSubReqTryCount = 1
+ xapp.Logger.Debug("WARNING: Using hard coded default value for e2tMaxSubReqTryCount")
+ }
+ xapp.Logger.Debug("e2tMaxSubReqTryCount= %v", e2tMaxSubReqTryCount)
+
+ e2tMaxSubDelReqTryCount = viper.GetUint64("controls.e2tMaxSubDelReqTryCount")
+ if e2tMaxSubDelReqTryCount == 0 {
+ e2tMaxSubDelReqTryCount = 1
+ xapp.Logger.Debug("WARNING: Using hard coded default value for e2tMaxSubDelReqTryCount")
+ }
+ xapp.Logger.Debug("e2tMaxSubDelReqTryCount= %v", e2tMaxSubDelReqTryCount)
+
+ checkE2State = viper.GetString("controls.checkE2State")
+ if checkE2State == "" {
+ checkE2State = "true"
+ xapp.Logger.Debug("WARNING: Using hard coded default value for checkE2State")
+ }
+ xapp.Logger.Debug("checkE2State= %v", checkE2State)
+
+ readSubsFromDb = viper.GetString("controls.readSubsFromDb")
+ if readSubsFromDb == "" {
+ readSubsFromDb = "true"
+ xapp.Logger.Debug("WARNING: Using hard coded default value for readSubsFromDb")
+ }
+ xapp.Logger.Debug("readSubsFromDb= %v", readSubsFromDb)