From: naman.gupta Date: Tue, 8 Nov 2022 14:22:05 +0000 (+0530) Subject: Implementation of A1-EI data delivery API X-Git-Tag: 3.0.0~20 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=159ddb7dd65305d364743d4728af35f84a6e1557;p=ric-plt%2Fa1.git Implementation of A1-EI data delivery API Implementation of A1-EI data delivery API which gets data related to ei job and sends to xapp Signed-off-by: naman.gupta Change-Id: I80c0f744519e29978c99262caaad6b5e968316e5 --- diff --git a/a1-go/pkg/restful/restful.go b/a1-go/pkg/restful/restful.go index b0663dd..d8d1e92 100644 --- a/a1-go/pkg/restful/restful.go +++ b/a1-go/pkg/restful/restful.go @@ -28,6 +28,7 @@ import ( "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/models" "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/restapi" "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/restapi/operations" + "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/restapi/operations/a1_e_i_data_delivery" "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/restapi/operations/a1_mediator" "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/resthooks" "github.com/go-openapi/loads" @@ -145,7 +146,15 @@ func (r *Restful) setupHandler() *operations.A1API { return a1_mediator.NewA1ControllerDeletePolicyInstanceAccepted() }) - + + api.A1eiDataDeliveryA1ControllerDataDeliveryHandler = a1_e_i_data_delivery.A1ControllerDataDeliveryHandlerFunc(func(params a1_e_i_data_delivery.A1ControllerDataDeliveryParams) middleware.Responder { + a1.Logger.Debug("handler for EI data delivery") + if err = r.rh.DataDelivery(params.Body); err != nil { + return a1_e_i_data_delivery.NewA1ControllerDataDeliveryNotFound() + } + return a1_e_i_data_delivery.NewA1ControllerDataDeliveryOK() + }) + return api } diff --git a/a1-go/pkg/resthooks/resthooks.go b/a1-go/pkg/resthooks/resthooks.go index e0060f1..c57c2e8 100644 --- a/a1-go/pkg/resthooks/resthooks.go +++ b/a1-go/pkg/resthooks/resthooks.go @@ -42,6 +42,8 @@ const ( a1InstancePrefix = "a1.policy_instance." a1InstanceMetadataPrefix = "a1.policy_inst_metadata." a1HandlerPrefix = "a1.policy_handler." + a1PolicyRequest = 20010 + a1EIDataDelivery = 20017 ) var typeAlreadyError = errors.New("Policy Type already exists") @@ -382,7 +384,7 @@ func (rh *Resthook) CreatePolicyInstance(policyTypeId models.PolicyTypeID, polic a1.Logger.Error("error : %v", err) return err } - isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage) + isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage, a1PolicyRequest) if isSent { a1.Logger.Debug("rmrSendToXapp : message sent") } else { @@ -671,7 +673,7 @@ func (rh *Resthook) DeletePolicyInstance(policyTypeId models.PolicyTypeID, polic a1.Logger.Error("error : %v", err) return err } - isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage) + isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage, a1PolicyRequest) if isSent { a1.Logger.Debug("rmrSendToXapp : message sent") } else { @@ -681,3 +683,22 @@ func (rh *Resthook) DeletePolicyInstance(policyTypeId models.PolicyTypeID, polic return nil } + +func (rh *Resthook) DataDelivery(httpBody interface{}) error { + a1.Logger.Debug("httpbody : %+v", httpBody) + mymap := httpBody.(map[string]interface{}) + message := rmr.Message{} + rmrMessage, err := message.A1EIMessage(mymap["job"].(string), mymap["payload"].(string)) + if err != nil { + a1.Logger.Error("error : %v", err) + return err + } + a1.Logger.Debug("rmrSendToXapp :rmrMessage %+v", rmrMessage) + isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage, a1EIDataDelivery) + if isSent { + a1.Logger.Debug("rmrSendToXapp : message sent") + } else { + a1.Logger.Error("rmrSendToXapp : message not sent") + } + return nil +} diff --git a/a1-go/pkg/resthooks/resthooks_test.go b/a1-go/pkg/resthooks/resthooks_test.go index deffc4b..8c6b59a 100644 --- a/a1-go/pkg/resthooks/resthooks_test.go +++ b/a1-go/pkg/resthooks/resthooks_test.go @@ -144,7 +144,7 @@ func TestCreatePolicyTypeInstance(t *testing.T) { a1.Logger.Debug("metadatainstancekey : %+v", metadatainstancekey) metadatainstancearr := []interface{}{metadatainstancekey, string(metadata)} sdlInst.On("Set", "A1m_ns", metadatainstancearr).Return(nil) - rmrSenderInst.On("RmrSendToXapp", "httpBodyString").Return(true) + rmrSenderInst.On("RmrSendToXapp", "httpBodyString", 20010).Return(true) errresp := rh.CreatePolicyInstance(policyTypeId, policyInstanceID, instancedata) @@ -287,13 +287,31 @@ func TestDeletePolicyInstance(t *testing.T) { httpBodyString := `{"operation":"DELETE","payload":"","policy_instance_id":"123456","policy_type_id":"20001"}` - rmrSenderInst.On("RmrSendToXapp", httpBodyString).Return(true) + rmrSenderInst.On("RmrSendToXapp", httpBodyString, 20010).Return(true) errresp := rh.DeletePolicyInstance(policyTypeId, policyInstanceID) assert.Nil(t, errresp) sdlInst.AssertExpectations(t) } +func TestDataDelivery(t *testing.T) { + + httpBody := `{ + "job":"1", + "payload":"payload" + } + ` + var instancedata interface{} + + json.Unmarshal([]byte(httpBody), &instancedata) + a1.Logger.Debug("Marshaled data : %+v", (instancedata)) + httpBodyString := `{"ei_job_id":"1","payload":"payload"}` + rmrSenderInst.On("RmrSendToXapp", httpBodyString, 20017).Return(true) + errresp := rh.DataDelivery(instancedata) + + assert.Nil(t, errresp) + sdlInst.AssertExpectations(t) +} type SdlMock struct { mock.Mock @@ -353,9 +371,15 @@ func (s *SdlMock) SetIf(ns string, key string, oldData, newData interface{}) (bo return args.Bool(0), args.Error(1) } -func (rmr *RmrSenderMock) RmrSendToXapp(httpBodyString string) bool { - args := rmr.MethodCalled("RmrSendToXapp", httpBodyString) - return args.Bool(0) +func (rmr *RmrSenderMock) RmrSendToXapp(httpBodyString string, mtype int) bool { + if httpBodyString == `{"blocking_rate":20,"enforce":true,"trigger_threshold":10,"window_length":20}` { + args := rmr.MethodCalled("RmrSendToXapp", httpBodyString, mtype) + return args.Bool(0) + } else if httpBodyString == `{"ei_job_id":"1","payload":"payload"}` { + args := rmr.MethodCalled("RmrSendToXapp", httpBodyString, mtype) + return args.Bool(0) + } + return true } func (s *SdlMock) Remove(ns string, keys []string) error { diff --git a/a1-go/pkg/rmr/messages.go b/a1-go/pkg/rmr/messages.go index af4e6c2..36771ef 100644 --- a/a1-go/pkg/rmr/messages.go +++ b/a1-go/pkg/rmr/messages.go @@ -43,3 +43,17 @@ func (m *Message) PolicyMessage(policyTypeId string, policyInstanceID string, ht } return string(data), nil } + +func (m *Message) A1EIMessage(eiJobId string, httpBody string) (string, error) { + var datajson interface{} + datajson = map[string]string{ + "ei_job_id": eiJobId, + "payload": httpBody} + data, err := json.Marshal(datajson) + + if err != nil { + a1.Logger.Error("marshal error : %v", err) + return "", err + } + return string(data), nil +} diff --git a/a1-go/pkg/rmr/rmr.go b/a1-go/pkg/rmr/rmr.go index 78adf46..660089b 100644 --- a/a1-go/pkg/rmr/rmr.go +++ b/a1-go/pkg/rmr/rmr.go @@ -27,8 +27,7 @@ import ( ) const ( - a1PolicyRequest = 20010 - a1SourceName = "service-ricplt-a1mediator-http" + a1SourceName = "service-ricplt-a1mediator-http" ) type RmrSender struct { @@ -36,7 +35,7 @@ type RmrSender struct { } type IRmrSender interface { - RmrSendToXapp(httpBodyString string) bool + RmrSendToXapp(httpBodyString string, messagetype int) bool } func NewRMRSender() IRmrSender { @@ -56,10 +55,10 @@ func NewRMRSender() IRmrSender { } } -func (rmr *RmrSender) RmrSendToXapp(httpBodyString string) bool { +func (rmr *RmrSender) RmrSendToXapp(httpBodyString string, messagetype int) bool { params := &xapp.RMRParams{} - params.Mtype = a1PolicyRequest + params.Mtype = messagetype params.SubId = -1 params.Xid = "" params.Meid = &xapp.RMRMeid{}