From: Thoralf Czichy Date: Thu, 7 Dec 2023 08:57:35 +0000 (+0000) Subject: Merge "Support for handling unordered IEs in RIC Subscription Response messgae" X-Git-Tag: 0.10.0~1 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=bf583163d3f26548dbeafd5631f83a403313d52f;hp=84662c4f3e2273152fc849f74880108b6346bcad;p=ric-plt%2Fsubmgr.git Merge "Support for handling unordered IEs in RIC Subscription Response messgae" --- diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 095222a..864f935 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -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 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/docs/index.rst b/docs/index.rst index 1eaa283..45182e9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,3 +30,4 @@ Welcome to O-RAN Subscription Manager Documentation * :ref:`genindex` * :ref:`modindex` * :ref:`search` + diff --git a/pkg/control/control.go b/pkg/control/control.go index b4667e0..1f769e1 100755 --- a/pkg/control/control.go +++ b/pkg/control/control.go @@ -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 } diff --git a/pkg/control/ut_messaging_test.go b/pkg/control/ut_messaging_test.go index 3d0b448..8bc9c0a 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" @@ -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 --- 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