X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=pkg%2Fcontrol%2Fregistry.go;h=9cacd9433333d8da7f528ad379097053533819b1;hb=f44377db11001585180cb1a41452a12bfd44546f;hp=e00062b7b4ea9140b7516ee90aa023ce4bc17fda;hpb=83ada00338d2c9fa47d48c406b4a46b9d7888aff;p=ric-plt%2Fsubmgr.git diff --git a/pkg/control/registry.go b/pkg/control/registry.go index e00062b..9cacd94 100644 --- a/pkg/control/registry.go +++ b/pkg/control/registry.go @@ -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 }