Fixed subs release to be more robust
[ric-plt/submgr.git] / pkg / control / registry.go
index e00062b..9cacd94 100644 (file)
@@ -112,8 +112,27 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.
        r.mutex.Lock()
        defer r.mutex.Unlock()
 
-       subs := r.findExistingSubs(trans, subReqMsg)
+       //
+       // Check validity of subscription action types
+       //
+       actionType, err := r.CheckActionTypes(subReqMsg)
+       if err != nil {
+               xapp.Logger.Debug("CREATE %s", err)
+               return nil, err
+       }
+
+       //
+       // Find possible existing Policy subscription
+       //
+       if actionType == e2ap.E2AP_ActionTypePolicy {
+               if subs, ok := r.register[subReqMsg.RequestId.Seq]; ok {
+                       xapp.Logger.Debug("CREATE %s. Existing subscription for Policy found", subs.String())
+                       subs.SetCachedResponse(nil, true)
+                       return subs, nil
+               }
+       }
 
+       subs := r.findExistingSubs(trans, subReqMsg)
        if subs == nil {
                subs, err = r.allocateSubs(trans, subReqMsg)
                if err != nil {
@@ -158,6 +177,30 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.
        return subs, nil
 }
 
+func (r *Registry) CheckActionTypes(subReqMsg *e2ap.E2APSubscriptionRequest) (uint64, error) {
+       var reportFound bool = false
+       var policyFound bool = false
+
+       for _, acts := range subReqMsg.ActionSetups {
+               if acts.ActionType == e2ap.E2AP_ActionTypeReport {
+                       reportFound = true
+               }
+               if acts.ActionType == e2ap.E2AP_ActionTypePolicy {
+                       policyFound = true
+               }
+       }
+       if reportFound == true && policyFound == true {
+               return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Report and Policy in same RICactions-ToBeSetup-List")
+       }
+       if reportFound == true {
+               return e2ap.E2AP_ActionTypeReport, nil
+       }
+       if policyFound == true {
+               return e2ap.E2AP_ActionTypePolicy, nil
+       }
+       return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Invalid action type in RICactions-ToBeSetup-List")
+}
+
 // TODO: Works with concurrent calls, but check if can be improved
 func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *TransactionXapp, waitRouteClean time.Duration) error {
 
@@ -174,44 +217,46 @@ func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *Transaction
                return nil
        }
 
-       r.mutex.Unlock()
+       go func() {
+               if waitRouteClean > 0 {
+                       time.Sleep(waitRouteClean)
+               }
 
-       //
-       // Wait some time before really do route updates
-       //
-       if waitRouteClean > 0 {
-               subs.mutex.Unlock()
-               time.Sleep(waitRouteClean)
                subs.mutex.Lock()
-       }
+               defer subs.mutex.Unlock()
+               xapp.Logger.Info("CLEAN %s", subs.String())
 
-       xapp.Logger.Info("CLEAN %s", subs.String())
+               if epamount == 0 {
+                       //
+                       // Subscription route delete
+                       //
+                       tmpList := RmrEndpointList{}
+                       tmpList.AddEndpoint(trans.GetEndpoint())
+                       subRouteAction := SubRouteInfo{tmpList, uint16(seqId)}
+                       r.rtmgrClient.SubscriptionRequestDelete(subRouteAction)
 
-       //
-       // Subscription route updates
-       //
-       if epamount == 0 {
-               tmpList := RmrEndpointList{}
-               tmpList.AddEndpoint(trans.GetEndpoint())
-               subRouteAction := SubRouteInfo{tmpList, uint16(seqId)}
-               r.rtmgrClient.SubscriptionRequestDelete(subRouteAction)
-       } else if subs.EpList.Size() > 0 {
-               subRouteAction := SubRouteInfo{subs.EpList, uint16(seqId)}
-               r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
-       }
+                       //
+                       // Subscription release
+                       //
+                       r.mutex.Lock()
+                       defer r.mutex.Unlock()
 
-       r.mutex.Lock()
-       //
-       // If last endpoint, release and free seqid
-       //
-       if epamount == 0 {
-               if _, ok := r.register[seqId]; ok {
-                       xapp.Logger.Debug("RELEASE %s", subs.String())
-                       delete(r.register, seqId)
-                       xapp.Logger.Debug("Registry: substable=%v", r.register)
+                       if _, ok := r.register[seqId]; ok {
+                               xapp.Logger.Debug("RELEASE %s", subs.String())
+                               delete(r.register, seqId)
+                               xapp.Logger.Debug("Registry: substable=%v", r.register)
+                       }
+                       r.subIds = append(r.subIds, seqId)
+
+               } else if subs.EpList.Size() > 0 {
+                       //
+                       // Subscription route updates
+                       //
+                       subRouteAction := SubRouteInfo{subs.EpList, uint16(seqId)}
+                       r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
                }
-               r.subIds = append(r.subIds, seqId)
-       }
+
+       }()
 
        return nil
 }