Merge "Support for handling unordered IEs in RIC Subscription Response messgae"
authorThoralf Czichy <thoralf.czichy@nokia.com>
Thu, 7 Dec 2023 08:57:35 +0000 (08:57 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Thu, 7 Dec 2023 08:57:35 +0000 (08:57 +0000)
.readthedocs.yaml
container-tag.yaml
docs/index.rst
pkg/control/control.go
pkg/control/ut_messaging_test.go
tox.ini

index 095222a..864f935 100644 (file)
@@ -1,14 +1,19 @@
 ---
+# .readthedocs.yml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+# Required
 version: 2
 
 formats:
   - htmlzip
 
 build:
-  image: latest
+  os: "ubuntu-22.04"
+  tools: 
+    python: "3.7"
 
 python:
-  version: 3.7
   install:
     - requirements: docs/requirements-docs.txt
 
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 1eaa283..45182e9 100644 (file)
@@ -30,3 +30,4 @@ Welcome to O-RAN Subscription Manager Documentation
 * :ref:`genindex`
 * :ref:`modindex`
 * :ref:`search`
+
index b4667e0..1f769e1 100755 (executable)
@@ -696,7 +696,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
 }
@@ -1132,7 +1136,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
@@ -1156,6 +1166,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 3d0b448..8bc9c0a 100644 (file)
@@ -21,6 +21,7 @@ package control
 
 import (
        "encoding/json"
+       "fmt"
        "strings"
        "testing"
        "time"
@@ -5537,6 +5538,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
 //
diff --git a/tox.ini b/tox.ini
index 8a8d0a4..92341f9 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -18,11 +18,12 @@ deps =
     sphinxcontrib-httpdomain
     recommonmark
     lfdocs-conf
+    urllib3~=1.26.15
 
 commands =
     sphinx-build -W -b html -n -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/html
     echo "Generated docs available in {toxinidir}/docs/_build/html"
-whitelist_externals = echo
+allowlist_externals = echo
 
 [testenv:docs-linkcheck]
 passenv =
@@ -35,4 +36,5 @@ deps = sphinx
        sphinxcontrib-httpdomain
        recommonmark
        lfdocs-conf
+       urllib3~=1.26.15
 commands = sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/linkcheck