+func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionResponse, error) {
+
+ restSubId := ksuid.New().String()
+ subResp := models.SubscriptionResponse{}
+ subResp.SubscriptionID = &restSubId
+ p := params.(*models.SubscriptionParams)
+
+ c.CntRecvMsg++
+
+ c.UpdateCounter(cRestSubReqFromXapp)
+
+ if p.ClientEndpoint == nil {
+ xapp.Logger.Error("ClientEndpoint == nil")
+ return nil, fmt.Errorf("")
+ }
+
+ _, xAppRmrEndpoint, err := ConstructEndpointAddresses(*p.ClientEndpoint)
+ if err != nil {
+ xapp.Logger.Error("%s", err.Error())
+ return nil, err
+ }
+
+ restSubscription, err := c.registry.CreateRESTSubscription(&restSubId, &xAppRmrEndpoint, p.Meid)
+ if err != nil {
+ xapp.Logger.Error("%s", err.Error())
+ return nil, err
+ }
+
+ subReqList := e2ap.SubscriptionRequestList{}
+ err = c.e2ap.FillSubscriptionReqMsgs(params, &subReqList, restSubscription)
+ if err != nil {
+ xapp.Logger.Error("%s", err.Error())
+ c.registry.DeleteRESTSubscription(&restSubId)
+ return nil, err
+ }
+
+ go c.processSubscriptionRequests(restSubscription, &subReqList, p.ClientEndpoint, p.Meid, &restSubId)
+
+ return &subResp, nil
+
+}
+
+//-------------------------------------------------------------------
+//
+//-------------------------------------------------------------------
+
+func (c *Control) processSubscriptionRequests(restSubscription *RESTSubscription, subReqList *e2ap.SubscriptionRequestList,
+ clientEndpoint *models.SubscriptionParamsClientEndpoint, meid *string, restSubId *string) {
+
+ xapp.Logger.Info("Subscription Request count=%v ", len(subReqList.E2APSubscriptionRequests))
+
+ _, xAppRmrEndpoint, err := ConstructEndpointAddresses(*clientEndpoint)
+ if err != nil {
+ xapp.Logger.Error("%s", err.Error())
+ return
+ }
+
+ var requestorID int64
+ var instanceId int64
+ for index := 0; index < len(subReqList.E2APSubscriptionRequests); index++ {
+ subReqMsg := subReqList.E2APSubscriptionRequests[index]
+
+ 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)
+ return
+ }
+
+ defer trans.Release()
+ 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)
+ resp := &models.SubscriptionResponse{
+ SubscriptionID: restSubId,
+ SubscriptionInstances: []*models.SubscriptionInstance{
+ &models.SubscriptionInstance{RequestorID: &requestorID, InstanceID: &instanceId},
+ },
+ }
+ // 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.Subscription.Notify(resp, *clientEndpoint)
+ c.UpdateCounter(cRestSubFailToXapp)
+ } else {
+ xapp.Logger.Info("SubscriptionRequest index=%v processed successfully. endpoint=%v, InstanceId=%v, %s", index, *clientEndpoint, instanceId, idstring(nil, trans))
+
+ // Store successfully processed InstanceId for deletion
+ restSubscription.AddInstanceId(subRespMsg.RequestId.InstanceId)
+
+ // 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},
+ },
+ }
+ // 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.Subscription.Notify(resp, *clientEndpoint)
+ c.UpdateCounter(cRestSubRespToXapp)
+
+ }
+ }