RIC-1011: Not Removing Subscriptions For Policy Based Subscription Failure 99/11799/9
authoraditverm <aditya.3.verma@nokia.com>
Wed, 20 Sep 2023 04:20:47 +0000 (09:50 +0530)
committerczichy <thoralf.czichy@nokia.com>
Wed, 20 Sep 2023 11:44:48 +0000 (14:44 +0300)
Change-Id: I1d0c70efa12f98df095e71ffd7194dad8572bc27
Signed-off-by: aditverm <aditya.3.verma@nokia.com>
container-tag.yaml
pkg/control/control.go
pkg/control/ut_messaging_test.go

index 62f46ef..d9974bf 100644 (file)
@@ -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"
index 227eb0c..5852121 100755 (executable)
@@ -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
        }
index c61a495..214cf43 100644 (file)
@@ -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
 //