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