From 323c77e80c7b73dbbe60971fd0d2475d856a98e5 Mon Sep 17 00:00:00 2001 From: aditverm Date: Wed, 20 Sep 2023 09:50:47 +0530 Subject: [PATCH] RIC-1011: Not Removing Subscriptions For Policy Based Subscription Failure Change-Id: I1d0c70efa12f98df095e71ffd7194dad8572bc27 Signed-off-by: aditverm --- container-tag.yaml | 2 +- pkg/control/control.go | 17 +++++- pkg/control/ut_messaging_test.go | 112 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 3 deletions(-) diff --git a/container-tag.yaml b/container-tag.yaml index 62f46ef..d9974bf 100644 --- a/container-tag.yaml +++ b/container-tag.yaml @@ -2,4 +2,4 @@ # By default this file is in the docker build directory, # but the location can configured in the JJB template. --- -tag: "0.9.6" +tag: "0.9.7" diff --git a/pkg/control/control.go b/pkg/control/control.go index 227eb0c..5852121 100755 --- a/pkg/control/control.go +++ b/pkg/control/control.go @@ -690,7 +690,11 @@ func (c *Control) handleSubscriptionRequest(trans *TransactionXapp, subReqMsg *e } xapp.Logger.Error("XAPP-SubReq E2 subscription failed: %s", idstring(err, trans, subs)) - c.registry.RemoveFromSubscription(subs, trans, waitRouteCleanup_ms, c) + // If policy type subscription fails we cannot remove it only internally. Once subscription has been created + // successfully, it must be deleted on both sides. + if subs.PolicyUpdate == false { + c.registry.RemoveFromSubscription(subs, trans, waitRouteCleanup_ms, c) + } return nil, &errorInfo, err } @@ -1126,7 +1130,13 @@ func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *Tran subRfMsg, valid = subs.SetCachedResponse(event, true) subs.SubRespRcvd = true case *e2ap.E2APSubscriptionFailure: - subRfMsg, valid = subs.SetCachedResponse(event, false) + if subs.PolicyUpdate == false { + subRfMsg, valid = subs.SetCachedResponse(event, false) + } else { + // In policy update case where subscription has already been created successfully in Gnb + // we cannot delete subscription internally in submgr + subRfMsg, valid = subs.SetCachedResponse(event, true) + } xapp.Logger.Debug("SUBS-SubReq: internal delete due failure event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans)) case *SubmgrRestartTestEvent: // This is used to simulate that no response has been received and after restart, subscriptions are restored from db @@ -1150,6 +1160,9 @@ func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *Tran } else { xapp.Logger.Debug("SUBS-SubReq: Handling (cached response %s) %s", typeofSubsMessage(subRfMsg), idstring(nil, trans, subs, parentTrans)) } + xapp.Logger.Debug("subs.PolicyUpdate: %v", subs.PolicyUpdate) + xapp.Logger.Debug("subs: %v", subs) + if valid == false { removeSubscriptionFromDb = true } diff --git a/pkg/control/ut_messaging_test.go b/pkg/control/ut_messaging_test.go index c61a495..214cf43 100644 --- a/pkg/control/ut_messaging_test.go +++ b/pkg/control/ut_messaging_test.go @@ -21,6 +21,7 @@ package control import ( "encoding/json" + "fmt" "strings" "testing" "time" @@ -5443,6 +5444,117 @@ func TestRESTSubReqPolicyChangeAndSubDelOk(t *testing.T) { mainCtrl.VerifyAllClean(t) } +//----------------------------------------------------------------------------- +// TestRESTSubReqPolicyChangeNokAndSubDelOk +// +// stub stub +// +-------+ +---------+ +---------+ +// | xapp | | submgr | | e2term | +// +-------+ +---------+ +---------+ +// | | | +// | RESTSubReq | | +// |---------------->| | +// | | | +// | RESTSubResp | | +// |<----------------| | +// | | SubReq | +// | |------------->| +// | | | +// | | SubResp | +// | |<-------------| +// | | | +// | RESTNotif | | +// |<----------------| | +// | | | +// | RESTSubReq | | +// |---------------->| | +// | | | +// | RESTSubResp | | +// |<----------------| | +// | | SubReq | +// | |------------->| +// | | | +// | | SubFail | +// | |<-------------| +// | | | +// | RESTNotif | | +// |<----------------| | +// | | | +// | RESTSubDelReq | | +// |---------------->| | +// | | | +// | | SubDelReq | +// | |------------->| +// | | | +// | | SubDelResp | +// | |<-------------| +// | | | +// | RESTSubDelResp | | +// |<----------------| | +// +//----------------------------------------------------------------------------- + +func TestRESTSubReqPolicyChangeNokAndSubDelOk(t *testing.T) { + + mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{ + Counter{cRestSubReqFromXapp, 2}, + Counter{cRestSubRespToXapp, 2}, + Counter{cSubReqToE2, 2}, + Counter{cSubRespFromE2, 1}, + Counter{cSubFailFromE2, 1}, + Counter{cRestSubNotifToXapp, 1}, + Counter{cRestSubFailNotifToXapp, 1}, + Counter{cRestSubDelReqFromXapp, 1}, + Counter{cSubDelReqToE2, 1}, + Counter{cSubDelRespFromE2, 1}, + Counter{cRestSubDelRespToXapp, 1}, + }) + + const subReqCount int = 1 + const e2Timeout int64 = 1 + const e2RetryCount int64 = 0 + const routingNeeded bool = false + + // Req + params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) + restSubId, e2SubsId := createSubscription(t, xappConn1, e2termConn1, params) + fmt.Printf("restSubId: %v", restSubId) + + // Policy change + // GetRESTSubsReqPolicyParams sets some counters on tc side. + params = xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) + params.SetSubscriptionID(&restSubId) + params.SetTimeToWait("w200ms") + + restSubId = xappConn1.SendRESTSubsReq(t, params) + fmt.Printf("restSubId: %v", restSubId) + + crereq, cremsg := e2termConn1.RecvSubsReq(t) + xappConn1.ExpectRESTNotificationNok(t, restSubId, "allFail") + + // Gnb sends RICSubscriptionFailure + fparams := &teststube2ap.E2StubSubsFailParams{} + fparams.Set(crereq) + fparams.SetCauseVal(0, 1, 5) // CauseRIC / function-resource-limit + e2termConn1.SendSubsFail(t, fparams, cremsg) + + instanceId := xappConn1.WaitRESTNotification(t, restSubId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) + + // Del + xappConn1.SendRESTSubsDelReq(t, &restSubId) + + delreq, delmsg := e2termConn1.RecvSubsDelReq(t) + e2termConn1.SendSubsDelResp(t, delreq, delmsg) + + // Wait that subs is cleaned + waitSubsCleanup(t, e2SubsId, 10) + mainCtrl.VerifyCounterValues(t) + mainCtrl.VerifyAllClean(t) +} + //----------------------------------------------------------------------------- // TestRESTSubReqPolicyChangeNOk // -- 2.16.6