xapp-frame v0.8.2 integration to submgr
[ric-plt/submgr.git] / pkg / control / control.go
index bf3ca83..325427b 100755 (executable)
@@ -70,14 +70,14 @@ var readSubsFromDb string
 
 type Control struct {
        *xapp.RMRClient
-       e2ap     *E2ap
-       registry *Registry
-       tracker  *Tracker
-       db       Sdlnterface
-       //subscriber *xapp.Subscriber
+       e2ap          *E2ap
+       registry      *Registry
+       tracker       *Tracker
+       db            Sdlnterface
        CntRecvMsg    uint64
        ResetTestFlag bool
        Counters      map[string]xapp.Counter
+       LoggerLevel   uint32
 }
 
 type RMRMeid struct {
@@ -109,11 +109,11 @@ func NewControl() *Control {
        tracker.Init()
 
        c := &Control{e2ap: new(E2ap),
-               registry: registry,
-               tracker:  tracker,
-               db:       CreateSdl(),
-               //subscriber: subscriber,
-               Counters: xapp.Metric.RegisterCounterGroup(GetMetricsOpts(), "SUBMGR"),
+               registry:    registry,
+               tracker:     tracker,
+               db:          CreateSdl(),
+               Counters:    xapp.Metric.RegisterCounterGroup(GetMetricsOpts(), "SUBMGR"),
+               LoggerLevel: 3,
        }
        c.ReadConfigParameters("")
 
@@ -192,6 +192,10 @@ func (c *Control) ReadConfigParameters(f string) {
                readSubsFromDb = "true"
        }
        xapp.Logger.Info("readSubsFromDb %v", readSubsFromDb)
+       c.LoggerLevel = viper.GetUint32("logger.level")
+       if c.LoggerLevel == 0 {
+               c.LoggerLevel = 3
+       }
 }
 
 //-------------------------------------------------------------------
@@ -229,11 +233,13 @@ func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionR
        c.CntRecvMsg++
        c.UpdateCounter(cRestSubReqFromXapp)
 
-       restSubId := ksuid.New().String()
        subResp := models.SubscriptionResponse{}
-       subResp.SubscriptionID = &restSubId
        p := params.(*models.SubscriptionParams)
 
+       if c.LoggerLevel > 2 {
+               c.PrintRESTSubscriptionRequest(p)
+       }
+
        if p.ClientEndpoint == nil {
                xapp.Logger.Error("ClientEndpoint == nil")
                c.UpdateCounter(cRestSubFailToXapp)
@@ -246,14 +252,28 @@ func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionR
                c.UpdateCounter(cRestSubFailToXapp)
                return nil, err
        }
+       var restSubId string
+       var restSubscription *RESTSubscription
+       if p.SubscriptionID == "" {
+               restSubId = ksuid.New().String()
+               restSubscription, err = c.registry.CreateRESTSubscription(&restSubId, &xAppRmrEndpoint, p.Meid)
+               if err != nil {
+                       xapp.Logger.Error("%s", err.Error())
+                       c.UpdateCounter(cRestSubFailToXapp)
+                       return nil, err
+               }
 
-       restSubscription, err := c.registry.CreateRESTSubscription(&restSubId, &xAppRmrEndpoint, p.Meid)
-       if err != nil {
-               xapp.Logger.Error("%s", err.Error())
-               c.UpdateCounter(cRestSubFailToXapp)
-               return nil, err
+       } else {
+               restSubId = p.SubscriptionID
+               restSubscription, err = c.registry.GetRESTSubscription(restSubId, false)
+               if err != nil {
+                       xapp.Logger.Error("%s", err.Error())
+                       c.UpdateCounter(cRestSubFailToXapp)
+                       return nil, err
+               }
        }
 
+       subResp.SubscriptionID = &restSubId
        subReqList := e2ap.SubscriptionRequestList{}
        err = c.e2ap.FillSubscriptionReqMsgs(params, &subReqList, restSubscription)
        if err != nil {
@@ -284,14 +304,12 @@ func (c *Control) processSubscriptionRequests(restSubscription *RESTSubscription
                return
        }
 
-       var requestorID int64
-       var instanceId int64
+       var xAppEventInstanceID int64
+       var e2EventInstanceID int64
        for index := 0; index < len(subReqList.E2APSubscriptionRequests); index++ {
                subReqMsg := subReqList.E2APSubscriptionRequests[index]
 
-               xid := *restSubId + "_" + strconv.FormatUint(uint64(subReqMsg.RequestId.InstanceId), 10)
-               trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(xAppRmrEndpoint), xid, subReqMsg.RequestId, &xapp.RMRMeid{RanName: *meid})
-               //trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(xAppRmrEndpoint), *restSubId, subReqMsg.RequestId, &xapp.RMRMeid{RanName: *meid})
+               trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(xAppRmrEndpoint), *restSubId, subReqMsg.RequestId, &xapp.RMRMeid{RanName: *meid})
                if trans == nil {
                        c.registry.DeleteRESTSubscription(restSubId)
                        xapp.Logger.Error("XAPP-SubReq transaction not created. RESTSubId=%s, EndPoint=%s, Meid=%s", *restSubId, xAppRmrEndpoint, *meid)
@@ -302,39 +320,47 @@ func (c *Control) processSubscriptionRequests(restSubscription *RESTSubscription
                xapp.Logger.Info("Handle SubscriptionRequest index=%v, %s", index, idstring(nil, trans))
                subRespMsg, err := c.handleSubscriptionRequest(trans, &subReqMsg, meid, restSubId)
                if err != nil {
-                       // Send notification to xApp that prosessing of a Subscription Request has failed. Currently it is not possible
-                       // to indicate error. Such possibility should be added. As a workaround requestorID and instanceId are set to zero value
-                       requestorID = (int64)(0)
-                       instanceId = (int64)(0)
+                       // Send notification to xApp that prosessing of a Subscription Request has failed.
+                       xAppEventInstanceID = (int64)(subReqMsg.RequestId.Id)
+                       e2EventInstanceID = (int64)(0)
                        resp := &models.SubscriptionResponse{
                                SubscriptionID: restSubId,
                                SubscriptionInstances: []*models.SubscriptionInstance{
-                                       &models.SubscriptionInstance{RequestorID: &requestorID, InstanceID: &instanceId},
+                                       &models.SubscriptionInstance{E2EventInstanceID: &e2EventInstanceID,
+                                               ErrorCause:          nil, //TODO: Suitable Error cause.
+                                               XappEventInstanceID: &xAppEventInstanceID},
                                },
                        }
                        // Mark REST subscription request processed.
                        restSubscription.SetProcessed()
-                       xapp.Logger.Info("Sending unsuccessful REST notification to endpoint=%v:%v, InstanceId=%v, %s", clientEndpoint.Host, clientEndpoint.HTTPPort, instanceId, idstring(nil, trans))
+                       xapp.Logger.Info("Sending unsuccessful REST notification to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s",
+                               clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans))
                        xapp.Subscription.Notify(resp, *clientEndpoint)
                        c.UpdateCounter(cRestSubFailNotifToXapp)
                } else {
-                       xapp.Logger.Info("SubscriptionRequest index=%v processed successfully. endpoint=%v, InstanceId=%v, %s", index, *clientEndpoint, instanceId, idstring(nil, trans))
+                       xAppEventInstanceID = (int64)(subRespMsg.RequestId.Id)
+                       e2EventInstanceID = (int64)(subRespMsg.RequestId.InstanceId)
+
+                       xapp.Logger.Info("SubscriptionRequest index=%v processed successfully. endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s",
+                               index, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans))
 
                        // Store successfully processed InstanceId for deletion
-                       restSubscription.AddInstanceId(subRespMsg.RequestId.InstanceId)
+                       restSubscription.AddE2InstanceId(subRespMsg.RequestId.InstanceId)
+                       restSubscription.AddXappIdToE2Id(xAppEventInstanceID, e2EventInstanceID)
 
                        // Send notification to xApp that a Subscription Request has been processed.
-                       requestorID = (int64)(subRespMsg.RequestId.Id)
-                       instanceId = (int64)(subRespMsg.RequestId.InstanceId)
                        resp := &models.SubscriptionResponse{
                                SubscriptionID: restSubId,
                                SubscriptionInstances: []*models.SubscriptionInstance{
-                                       &models.SubscriptionInstance{RequestorID: &requestorID, InstanceID: &instanceId},
+                                       &models.SubscriptionInstance{E2EventInstanceID: &e2EventInstanceID,
+                                               ErrorCause:          nil,
+                                               XappEventInstanceID: &xAppEventInstanceID},
                                },
                        }
                        // Mark REST subscription request processesd.
                        restSubscription.SetProcessed()
-                       xapp.Logger.Info("Sending successful REST notification to endpoint=%v, InstanceId=%v, %s", *clientEndpoint, instanceId, idstring(nil, trans))
+                       xapp.Logger.Info("Sending successful REST notification to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s",
+                               clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans))
                        xapp.Subscription.Notify(resp, *clientEndpoint)
                        c.UpdateCounter(cRestSubNotifToXapp)
 
@@ -397,7 +423,7 @@ func (c *Control) SubscriptionDeleteHandlerCB(restSubId string) error {
 
        xapp.Logger.Info("SubscriptionDeleteRequest from XAPP")
 
-       restSubscription, err := c.registry.GetRESTSubscription(restSubId)
+       restSubscription, err := c.registry.GetRESTSubscription(restSubId, true)
        if err != nil {
                xapp.Logger.Error("%s", err.Error())
                if restSubscription == nil {
@@ -418,13 +444,15 @@ func (c *Control) SubscriptionDeleteHandlerCB(restSubId string) error {
        xAppRmrEndPoint := restSubscription.xAppRmrEndPoint
        go func() {
                for _, instanceId := range restSubscription.InstanceIds {
-                       err := c.SubscriptionDeleteHandler(&restSubId, &xAppRmrEndPoint, &restSubscription.Meid, instanceId)
+                       xAppEventInstanceID, err := c.SubscriptionDeleteHandler(&restSubId, &xAppRmrEndPoint, &restSubscription.Meid, instanceId)
+
                        if err != nil {
                                xapp.Logger.Error("%s", err.Error())
                                //return err
                        }
                        xapp.Logger.Info("Deleteting instanceId = %v", instanceId)
-                       restSubscription.DeleteInstanceId(instanceId)
+                       restSubscription.DeleteXappIdToE2Id(xAppEventInstanceID)
+                       restSubscription.DeleteE2InstanceId(instanceId)
                }
                c.registry.DeleteRESTSubscription(&restSubId)
        }()
@@ -437,29 +465,29 @@ func (c *Control) SubscriptionDeleteHandlerCB(restSubId string) error {
 //-------------------------------------------------------------------
 //
 //-------------------------------------------------------------------
-func (c *Control) SubscriptionDeleteHandler(restSubId *string, endPoint *string, meid *string, instanceId uint32) error {
+func (c *Control) SubscriptionDeleteHandler(restSubId *string, endPoint *string, meid *string, instanceId uint32) (int64, error) {
 
-       xid := *restSubId + "_" + strconv.FormatUint(uint64(instanceId), 10)
-       trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(*endPoint), xid, e2ap.RequestId{0, 0}, &xapp.RMRMeid{RanName: *meid})
-       //trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(*endPoint), *restSubId, e2ap.RequestId{0, 0}, &xapp.RMRMeid{RanName: *meid})
+       var xAppEventInstanceID int64
+       subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{instanceId})
+       if err != nil {
+               xapp.Logger.Info("Subscription Delete Handler subscription for restSubId=%v, E2EventInstanceID=%v not found %s",
+                       restSubId, instanceId, idstring(err, nil))
+               return xAppEventInstanceID, nil
+       }
+
+       xAppEventInstanceID = int64(subs.ReqId.Id)
+       trans := c.tracker.NewXappTransaction(xapp.NewRmrEndpoint(*endPoint), *restSubId, e2ap.RequestId{subs.ReqId.Id, 0}, &xapp.RMRMeid{RanName: *meid})
        if trans == nil {
                err := fmt.Errorf("XAPP-SubDelReq transaction not created. restSubId %s, endPoint %s, meid %s, instanceId %v", *restSubId, *endPoint, *meid, instanceId)
                xapp.Logger.Error("%s", err.Error())
        }
        defer trans.Release()
 
-       err := c.tracker.Track(trans)
-       if err != nil {
-               err := fmt.Errorf("XAPP-SubDelReq %s:", idstring(err, trans))
-               xapp.Logger.Error("%s", err.Error())
-               return &time.ParseError{}
-       }
-
-       subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{instanceId})
+       err = c.tracker.Track(trans)
        if err != nil {
                err := fmt.Errorf("XAPP-SubDelReq %s:", idstring(err, trans))
                xapp.Logger.Error("%s", err.Error())
-               return err
+               return xAppEventInstanceID, &time.ParseError{}
        }
        //
        // Wake subs delete
@@ -471,7 +499,7 @@ func (c *Control) SubscriptionDeleteHandler(restSubId *string, endPoint *string,
 
        c.registry.RemoveFromSubscription(subs, trans, waitRouteCleanup_ms, c)
 
-       return nil
+       return xAppEventInstanceID, nil
 }
 
 //-------------------------------------------------------------------
@@ -1097,3 +1125,54 @@ func (c *Control) SendSubscriptionDeleteReq(subs *Subscription) {
                c.handleXAPPSubscriptionDeleteRequest(params)
        }
 }
+
+func (c *Control) PrintRESTSubscriptionRequest(p *models.SubscriptionParams) {
+
+       fmt.Println("CRESTSubscriptionRequest")
+       fmt.Printf("  ClientEndpoint.Host = %s\n", p.ClientEndpoint.Host)
+
+       if p.ClientEndpoint.HTTPPort != nil {
+               fmt.Printf("  ClientEndpoint.HTTPPort = %v\n", *p.ClientEndpoint.HTTPPort)
+       } else {
+               fmt.Println("  ClientEndpoint.HTTPPort = nil")
+       }
+
+       if p.ClientEndpoint.RMRPort != nil {
+               fmt.Printf("  ClientEndpoint.RMRPort = %v\n", *p.ClientEndpoint.RMRPort)
+       } else {
+               fmt.Println("  ClientEndpoint.RMRPort = nil")
+       }
+
+       if p.Meid != nil {
+               fmt.Printf("  Meid = %s\n", *p.Meid)
+       } else {
+               fmt.Println("  Meid = nil")
+       }
+
+       for _, subscriptionDetail := range p.SubscriptionDetails {
+               if p.RANFunctionID != nil {
+                       fmt.Printf("  RANFunctionID = %v\n", *p.RANFunctionID)
+               } else {
+                       fmt.Println("  RANFunctionID = nil")
+               }
+               fmt.Printf("  SubscriptionDetail.XappEventInstanceID = %v\n", *subscriptionDetail.XappEventInstanceID)
+               fmt.Printf("  SubscriptionDetail.EventTriggers.OctetString = %X\n", subscriptionDetail.EventTriggers.OctetString)
+
+               for _, actionToBeSetup := range subscriptionDetail.ActionToBeSetupList {
+                       fmt.Printf("  SubscriptionDetail.ActionToBeSetup.ActionID = %v\n", *actionToBeSetup.ActionID)
+                       fmt.Printf("  SubscriptionDetail.ActionToBeSetup.ActionType = %s\n", *actionToBeSetup.ActionType)
+                       if actionToBeSetup.ActionDefinition != nil {
+                               fmt.Printf("  SubscriptionDetail.ActionToBeSetup.ActionDefinition.OctetString = %X\n", actionToBeSetup.ActionDefinition.OctetString)
+                       } else {
+                               fmt.Println("  SubscriptionDetail.ActionToBeSetup.ActionDefinition = nil")
+
+                       }
+                       if actionToBeSetup.SubsequentAction != nil {
+                               fmt.Printf("  SubscriptionDetail.ActionToBeSetup.SubsequentAction.SubsequentActionType = %s\n", *actionToBeSetup.SubsequentAction.SubsequentActionType)
+                               fmt.Printf("  SubscriptionDetail.ActionToBeSetup..SubsequentAction.TimeToWait = %s\n", *actionToBeSetup.SubsequentAction.TimeToWait)
+                       } else {
+                               fmt.Println("  SubscriptionDetail.ActionToBeSetup.SubsequentAction = nil")
+                       }
+               }
+       }
+}