From: Anssi Mannila Date: Tue, 11 Feb 2020 09:30:44 +0000 (+0200) Subject: Support for subscription action type Policy X-Git-Tag: 0.4.0~19 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=ric-plt%2Fsubmgr.git;a=commitdiff_plain;h=9bcb0a4620d71671f758dce029cb2e3da9ab9dbe Support for subscription action type Policy Change-Id: I91c0de12dc84dc51b040647c25c85d8b8d2a8130 Signed-off-by: Anssi Mannila --- diff --git a/e2ap/pkg/e2ap/msg_e2ap.go b/e2ap/pkg/e2ap/msg_e2ap.go index 7aaad0c..153f07b 100644 --- a/e2ap/pkg/e2ap/msg_e2ap.go +++ b/e2ap/pkg/e2ap/msg_e2ap.go @@ -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 --- 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= diff --git a/pkg/control/registry.go b/pkg/control/registry.go index e00062b..c9abdb8 100644 --- a/pkg/control/registry.go +++ b/pkg/control/registry.go @@ -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 { diff --git a/pkg/control/ut_messaging_test.go b/pkg/control/ut_messaging_test.go index 3054999..de2458a 100644 --- a/pkg/control/ut_messaging_test.go +++ b/pkg/control/ut_messaging_test.go @@ -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) +} diff --git a/pkg/teststube2ap/stubE2.go b/pkg/teststube2ap/stubE2.go index c7c09ab..dbd518b 100644 --- a/pkg/teststube2ap/stubE2.go +++ b/pkg/teststube2ap/stubE2.go @@ -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 - } //-----------------------------------------------------------------------------