RIC-1011: Not Removing Subscriptions For Policy Based Subscription Failure
Change-Id: I1d0c70efa12f98df095e71ffd7194dad8572bc27
Signed-off-by: aditverm <aditya.3.verma@nokia.com>
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 @@
}
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 @@
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 @@
} 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 @@
import (
"encoding/json"
+ "fmt"
"strings"
"testing"
"time"
@@ -5444,6 +5445,117 @@
}
//-----------------------------------------------------------------------------
+// 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
//
// stub stub