Support for subscription action type Policy 67/2467/2
authorAnssi Mannila <anssi.mannila@nokia.com>
Tue, 11 Feb 2020 09:30:44 +0000 (11:30 +0200)
committerAnssi Mannila <anssi.mannila@nokia.com>
Wed, 12 Feb 2020 07:49:26 +0000 (09:49 +0200)
Change-Id: I91c0de12dc84dc51b040647c25c85d8b8d2a8130
Signed-off-by: Anssi Mannila <anssi.mannila@nokia.com>
e2ap/pkg/e2ap/msg_e2ap.go
go.sum
pkg/control/registry.go
pkg/control/ut_messaging_test.go
pkg/teststube2ap/stubE2.go

index 7aaad0c..153f07b 100644 (file)
@@ -108,9 +108,10 @@ const (
 //
 //-----------------------------------------------------------------------------
 const (
-       E2AP_ActionTypeReport uint64 = 0
-       E2AP_ActionTypeInsert uint64 = 1
-       E2AP_ActionTypePolicy uint64 = 2
+       E2AP_ActionTypeReport  uint64 = 0
+       E2AP_ActionTypeInsert  uint64 = 1
+       E2AP_ActionTypePolicy  uint64 = 2
+       E2AP_ActionTypeInvalid uint64 = 99 // For RIC internal usage only
 )
 
 //-----------------------------------------------------------------------------
diff --git a/go.sum b/go.sum
index 2666194..369d3a9 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -11,6 +11,7 @@ gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0 h1:7edCLIQtk9xCwxTtLRUlXr8wQ6nmr/
 gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0/go.mod h1:2Y8gw2jqj9urI8VFqFQn7BX0J3A852+YrXVV9V8gOt4=
 gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.0.23 h1:T8Q6dtYFsTXg60Xyz4GhsmEHsi9TdPbgc44caQpVgXY=
 gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.0.23/go.mod h1:WHzMFLWFYnKZzAT76Lu8wXqcM9MQ9hHM0sxlV45icSw=
+gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.0.25 h1:wRu8Cn1pP0+YKp1L8pa3rAD1oNqJZwCK57tcyFHi4yA=
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
index e00062b..c9abdb8 100644 (file)
@@ -112,8 +112,27 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.
        r.mutex.Lock()
        defer r.mutex.Unlock()
 
-       subs := r.findExistingSubs(trans, subReqMsg)
+       //
+       // Check validity of subscription action types
+       //
+       actionType, err := r.CheckActionTypes(subReqMsg)
+       if err != nil {
+               xapp.Logger.Debug("CREATE %s", err)
+               return nil, err
+       }
+
+       //
+       // Find possible existing Policy subscription
+       //
+       if actionType == e2ap.E2AP_ActionTypePolicy {
+               if subs, ok := r.register[subReqMsg.RequestId.Seq]; ok {
+                       xapp.Logger.Debug("CREATE %s. Existing subscription for Policy found", subs.String())
+                       subs.SetCachedResponse(nil, true)
+                       return subs, nil
+               }
+       }
 
+       subs := r.findExistingSubs(trans, subReqMsg)
        if subs == nil {
                subs, err = r.allocateSubs(trans, subReqMsg)
                if err != nil {
@@ -158,6 +177,30 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.
        return subs, nil
 }
 
+func (r *Registry) CheckActionTypes(subReqMsg *e2ap.E2APSubscriptionRequest) (uint64, error) {
+       var reportFound bool = false
+       var policyFound bool = false
+
+       for _, acts := range subReqMsg.ActionSetups {
+               if acts.ActionType == e2ap.E2AP_ActionTypeReport {
+                       reportFound = true
+               }
+               if acts.ActionType == e2ap.E2AP_ActionTypePolicy {
+                       policyFound = true
+               }
+       }
+       if reportFound == true && policyFound == true {
+               return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Report and Policy in same RICactions-ToBeSetup-List")
+       }
+       if reportFound == true {
+               return e2ap.E2AP_ActionTypeReport, nil
+       }
+       if policyFound == true {
+               return e2ap.E2AP_ActionTypePolicy, nil
+       }
+       return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Invalid action type in RICactions-ToBeSetup-List")
+}
+
 // TODO: Works with concurrent calls, but check if can be improved
 func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *TransactionXapp, waitRouteClean time.Duration) error {
 
index 3054999..de2458a 100644 (file)
@@ -20,6 +20,7 @@
 package control
 
 import (
+       "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
        "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststube2ap"
        "testing"
 )
@@ -1163,3 +1164,151 @@ func TestSubReqAndSubDelNoAnswerSameActionParallel(t *testing.T) {
        e2termConn.TestMsgChanEmpty(t)
        mainCtrl.wait_registry_empty(t, 15)
 }
+
+//-----------------------------  Policy cases ---------------------------------
+//-----------------------------------------------------------------------------
+// TestSubReqPolicyAndSubDelOk
+//
+//   stub                          stub
+// +-------+     +---------+    +---------+
+// | xapp  |     | submgr  |    | e2term  |
+// +-------+     +---------+    +---------+
+//     |              |              |
+//     | SubReq       |              |
+//     |------------->|              |
+//     |              |              |
+//     |              | SubReq       |
+//     |              |------------->|
+//     |              |              |
+//     |              |      SubResp |
+//     |              |<-------------|
+//     |              |              |
+//     |      SubResp |              |
+//     |<-------------|              |
+//     |              |              |
+//     |              |              |
+//     | SubDelReq    |              |
+//     |------------->|              |
+//     |              |              |
+//     |              | SubDelReq    |
+//     |              |------------->|
+//     |              |              |
+//     |              |   SubDelResp |
+//     |              |<-------------|
+//     |              |              |
+//     |   SubDelResp |              |
+//     |<-------------|              |
+//
+//-----------------------------------------------------------------------------
+func TestSubReqPolicyAndSubDelOk(t *testing.T) {
+       CaseBegin("TestSubReqAndSubDelOk")
+
+       rparams1 := &teststube2ap.E2StubSubsReqParams{}
+       rparams1.Init()
+       rparams1.Req.ActionSetups[0].ActionType = e2ap.E2AP_ActionTypePolicy
+       cretrans := xappConn1.SendSubsReq(t, rparams1, nil)
+
+       crereq, cremsg := e2termConn.RecvSubsReq(t)
+       e2termConn.SendSubsResp(t, crereq, cremsg)
+       e2SubsId := xappConn1.RecvSubsResp(t, cretrans)
+       deltrans := xappConn1.SendSubsDelReq(t, nil, e2SubsId)
+       delreq, delmsg := e2termConn.RecvSubsDelReq(t)
+
+       waiter := rtmgrHttp.AllocNextEvent(true)
+       e2termConn.SendSubsDelResp(t, delreq, delmsg)
+       xappConn1.RecvSubsDelResp(t, deltrans)
+       waiter.WaitResult(t)
+
+       //Wait that subs is cleaned
+       mainCtrl.wait_subs_clean(t, e2SubsId, 10)
+
+       xappConn1.TestMsgChanEmpty(t)
+       xappConn2.TestMsgChanEmpty(t)
+       e2termConn.TestMsgChanEmpty(t)
+       mainCtrl.wait_registry_empty(t, 10)
+}
+
+//-----------------------------------------------------------------------------
+// TestSubReqPolicyChangeAndSubDelOk
+//
+//   stub                          stub
+// +-------+     +---------+    +---------+
+// | xapp  |     | submgr  |    | e2term  |
+// +-------+     +---------+    +---------+
+//     |              |              |
+//     | SubReq       |              |
+//     |------------->|              |
+//     |              |              |
+//     |              | SubReq       |
+//     |              |------------->|
+//     |              |              |
+//     |              |      SubResp |
+//     |              |<-------------|
+//     |              |              |
+//     |      SubResp |              |
+//     |<-------------|              |
+//     |              |              |
+//     | SubReq       |              |
+//     |------------->|              |
+//     |              |              |
+//     |              | SubReq       |
+//     |              |------------->|
+//     |              |              |
+//     |              |      SubResp |
+//     |              |<-------------|
+//     |              |              |
+//     |      SubResp |              |
+//     |<-------------|              |
+//     |              |              |
+//     | SubDelReq    |              |
+//     |------------->|              |
+//     |              |              |
+//     |              | SubDelReq    |
+//     |              |------------->|
+//     |              |              |
+//     |              |   SubDelResp |
+//     |              |<-------------|
+//     |              |              |
+//     |   SubDelResp |              |
+//     |<-------------|              |
+//
+//-----------------------------------------------------------------------------
+
+func TestSubReqPolicyChangeAndSubDelOk(t *testing.T) {
+       CaseBegin("TestSubReqAndSubDelOk")
+
+       waiter := rtmgrHttp.AllocNextEvent(true)
+       rparams1 := &teststube2ap.E2StubSubsReqParams{}
+       rparams1.Init()
+       rparams1.Req.ActionSetups[0].ActionType = e2ap.E2AP_ActionTypePolicy
+       cretrans := xappConn1.SendSubsReq(t, rparams1, nil)
+       waiter.WaitResult(t)
+
+       crereq, cremsg := e2termConn.RecvSubsReq(t)
+       e2termConn.SendSubsResp(t, crereq, cremsg)
+       e2SubsId := xappConn1.RecvSubsResp(t, cretrans)
+
+       //Policy change
+       rparams1.Req.RequestId.Seq = e2SubsId
+       rparams1.Req.ActionSetups[0].SubsequentAction.TimetoWait = e2ap.E2AP_TimeToWaitW200ms
+       xappConn1.SendSubsReq(t, rparams1, cretrans)
+
+       crereq, cremsg = e2termConn.RecvSubsReq(t)
+       e2termConn.SendSubsResp(t, crereq, cremsg)
+       e2SubsId = xappConn1.RecvSubsResp(t, cretrans)
+       deltrans := xappConn1.SendSubsDelReq(t, nil, e2SubsId)
+       delreq, delmsg := e2termConn.RecvSubsDelReq(t)
+
+       waiter = rtmgrHttp.AllocNextEvent(true)
+       e2termConn.SendSubsDelResp(t, delreq, delmsg)
+       xappConn1.RecvSubsDelResp(t, deltrans)
+       waiter.WaitResult(t)
+
+       //Wait that subs is cleaned
+       mainCtrl.wait_subs_clean(t, e2SubsId, 10)
+
+       xappConn1.TestMsgChanEmpty(t)
+       xappConn2.TestMsgChanEmpty(t)
+       e2termConn.TestMsgChanEmpty(t)
+       mainCtrl.wait_registry_empty(t, 10)
+}
index c7c09ab..dbd518b 100644 (file)
@@ -116,15 +116,15 @@ func (p *E2StubSubsReqParams) Init() {
        p.Req.EventTriggerDefinition.TypeOfMessage = e2ap.E2AP_InitiatingMessage
 
        p.Req.ActionSetups = make([]e2ap.ActionToBeSetupItem, 1)
+
        p.Req.ActionSetups[0].ActionId = 0
        p.Req.ActionSetups[0].ActionType = e2ap.E2AP_ActionTypeReport
-       p.Req.ActionSetups[0].ActionDefinition.Present = false
+       p.Req.ActionSetups[0].ActionDefinition.Present = false // Not supported
        //p.Req.ActionSetups[index].ActionDefinition.StyleId = 255
        //p.Req.ActionSetups[index].ActionDefinition.ParamId = 222
        p.Req.ActionSetups[0].SubsequentAction.Present = true
        p.Req.ActionSetups[0].SubsequentAction.Type = e2ap.E2AP_SubSeqActionTypeContinue
        p.Req.ActionSetups[0].SubsequentAction.TimetoWait = e2ap.E2AP_TimeToWaitZero
-
 }
 
 //-----------------------------------------------------------------------------