RIC-194 Setup from RAN: On Routing Manager Failure, return Setup Failure 55/3255/5
authorns019t <ns019t@intl.att.com>
Mon, 13 Apr 2020 13:57:59 +0000 (16:57 +0300)
committerns019t <ns019t@intl.att.com>
Thu, 16 Apr 2020 08:27:44 +0000 (11:27 +0300)
Change-Id: I6e1bd61d60336c8c19e805a80c234b971c55c967
Signed-off-by: ns019t <ns019t@intl.att.com>
34 files changed:
E2Manager/controllers/nodeb_controller_test.go
E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go
E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go
E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go
E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/enb_load_information_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/endc_configuration_update_handler.go
E2Manager/handlers/rmrmsghandlers/endc_configuration_update_handler_test.go
E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler.go
E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/x2enb_configuration_update_handler.go
E2Manager/handlers/rmrmsghandlers/x2enb_configuration_update_handler_test.go
E2Manager/managers/e2t_association_manager.go
E2Manager/managers/e2t_association_manager_test.go
E2Manager/managers/e2t_keep_alive_worker_test.go
E2Manager/managers/notificationmanager/notification_manager.go
E2Manager/managers/ran_setup_manager.go
E2Manager/managers/ran_setup_manager_test.go
E2Manager/managers/ran_status_change_manager.go
E2Manager/mocks/rmrMessengerMock.go
E2Manager/models/e2_setup_response_message.go [new file with mode: 0644]
E2Manager/models/e2_setup_success_response_message.go [deleted file]
E2Manager/models/notification_request.go
E2Manager/models/rmr_message.go
E2Manager/rmrCgo/rmrCgoApi.go
E2Manager/rmrCgo/rmrCgoApi_test.go
E2Manager/rmrCgo/rmrCgoTypes.go
E2Manager/rmrCgo/rmrCgoUtils.go
E2Manager/router.txt
E2Manager/services/rmrsender/rmr_sender.go
E2Manager/services/rmrsender/rmr_sender_test.go

index 47b4bc8..4716e75 100644 (file)
@@ -48,6 +48,7 @@ import (
        "net/http/httptest"
        "strings"
        "testing"
+       "unsafe"
 )
 
 const (
@@ -182,7 +183,8 @@ func TestX2SetupSuccess(t *testing.T) {
 
        payload := e2pdus.PackedX2setupRequest
        var xAction []byte
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
 
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
 
@@ -213,7 +215,8 @@ func TestEndcSetupSuccess(t *testing.T) {
 
        payload := e2pdus.PackedEndcX2setupRequest
        var xAction []byte
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
 
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
 
@@ -657,7 +660,7 @@ func parseJsonRequest(t *testing.T, r io.Reader) models.ErrorResponse {
        if err != nil {
                t.Errorf("Error cannot deserialize json request")
        }
-       json.Unmarshal(body, &errorResponse)
+       _ =json.Unmarshal(body, &errorResponse)
 
        return errorResponse
 }
@@ -676,7 +679,8 @@ func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) {
        ranName := "test1"
        payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40}
        var xAction []byte
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
 
        writer := httptest.NewRecorder()
@@ -702,7 +706,8 @@ func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) {
        // o&m intervention
        payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64}
        var xAction []byte
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", msg, true).Return(msg, nil)
 
        writer := httptest.NewRecorder()
index 9b8731c..a1cea80 100644 (file)
@@ -214,7 +214,7 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) {
        writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
 
        rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
-       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
+       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
        rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, e2managererrors.NewRmrError())
        _, err := h.Handle(nil)
        assert.IsType(t, &e2managererrors.RmrError{}, err)
@@ -242,7 +242,7 @@ func testTwoRansTryShuttingDownSucceedsClearSucceedsRmrSucceedsAllRansAreShutdow
        writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
 
        rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
-       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
+       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
        rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
        resp, err := h.Handle(nil)
        assert.Nil(t, err)
@@ -353,7 +353,7 @@ func testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttin
        writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
 
        rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
-       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
+       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
        rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
 
        readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
@@ -421,7 +421,7 @@ func TestSuccessTwoE2TInstancesSixRans(t *testing.T) {
        writerMock.On("SaveE2TInstance", &updatedE2tInstance2).Return(nil)
 
        rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL}
-       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
+       mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
        rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil)
 
        readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
index 9fc75fe..bbc5dff 100644 (file)
@@ -166,26 +166,42 @@ func TestSetupNewRanSelectE2TInstancesNoInstances(t *testing.T) {
        updatedNb := *nodebInfo
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
        ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
        _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
        assert.Nil(t, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       e2tInstancesManagerMock.AssertExpectations(t)
+       ranSetupManagerMock.AssertExpectations(t)
 }
 
 func TestSetupNewRanAssociateRanFailure(t *testing.T) {
-       readerMock, writerMock, handler, e2tInstancesManagerMock, _, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
        readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(""))
        e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
        e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError())
        setupRequest := &models.SetupRequest{"127.0.0.1", 8080, RanName,}
        nb, nbIdentity := createInitialNodeInfo(setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+       nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("SaveNodeb", nbIdentity, mock.Anything).Return(nil)
        writerMock.On("UpdateNodebInfo", nb).Return(nil)
        nb.AssociatedE2TInstanceAddress = E2TAddress
        nb.ConnectionAttempts = 0
        mockHttpClientAssociateRan(httpClientMock)
+       updatedNb := *nb
+       updatedNb.ConnectionAttempts = 0
+       updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+
        _, err := handler.Handle(*setupRequest)
+       assert.NotNil(t, err)
        assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       e2tInstancesManagerMock.AssertExpectations(t)
+       ranSetupManagerMock.AssertExpectations(t)
+       httpClientMock.AssertExpectations(t)
 }
 
 func TestSetupNewRanSaveNodebFailure(t *testing.T) {
@@ -212,8 +228,10 @@ func TestSetupNewRanSetupDbError(t *testing.T) {
        updatedNb := *nodebInfo
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
        _, err := handler.Handle(setupRequest)
+       assert.NotNil(t, err)
        assert.IsType(t, &e2managererrors.RnibDbError{}, err)
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
@@ -231,6 +249,7 @@ func TestSetupNewRanSetupRmrError(t *testing.T) {
        updatedNb := *nodebInfo
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
        ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRmrError())
        _, err := handler.Handle(setupRequest)
@@ -248,6 +267,7 @@ func TestSetupNewRanSetupSuccess(t *testing.T) {
        updatedNb := *nodebInfo
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
        ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
        _, err := handler.Handle(setupRequest)
@@ -330,63 +350,63 @@ func TestSetupExistingRanWithoutAssocE2TInstanceSelectErrorAlreadyDisconnected(t
        ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
 }
 
-func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanFailure(t *testing.T) {
-       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
-       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
-       readerMock.On("GetNodeb", RanName).Return(nb, nil)
-       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
-       e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError())
-       writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
-       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
-       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
-       writerMock.AssertNotCalled(t, "UpdateNodebInfo")
-       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
-}
-
-func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanSucceedsUpdateNodebFails(t *testing.T) {
-       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
-       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
-       readerMock.On("GetNodeb", RanName).Return(nb, nil)
-       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
-       e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
-       updatedNb := *nb
-       updatedNb.AssociatedE2TInstanceAddress = E2TAddress
-       updatedNb.ConnectionAttempts = 0
-       writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
-       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
-       assert.IsType(t, /* &e2managererrors.RnibDbError{} */&common.InternalError{}, err)
-       ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
-}
-
-func TestSetupExistingRanWithoutAssocE2TInstanceExecuteSetupFailure(t *testing.T) {
-       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
-       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
-       readerMock.On("GetNodeb", RanName).Return(nb, nil)
-       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
-       e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
-       updatedNb := *nb
-       updatedNb.AssociatedE2TInstanceAddress = E2TAddress
-       updatedNb.ConnectionAttempts = 0
-       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
-       ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRnibDbError())
-       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
-       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
-}
-
-func TestSetupExistingRanWithoutAssocE2TInstanceSuccess(t *testing.T) {
-       readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
-       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
-       readerMock.On("GetNodeb", RanName).Return(nb, nil)
-       e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
-       e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
-       updatedNb := *nb
-       updatedNb.AssociatedE2TInstanceAddress = E2TAddress
-       updatedNb.ConnectionAttempts = 0
-       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
-       ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
-       _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
-       assert.Nil(t, err)
-}
+//func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanFailure(t *testing.T) {
+//     readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+//     nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
+//     readerMock.On("GetNodeb", RanName).Return(nb, nil)
+//     e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+//     e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError())
+//     writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
+//     _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+//     assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+//     writerMock.AssertNotCalled(t, "UpdateNodebInfo")
+//     ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+//}
+
+//func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanSucceedsUpdateNodebFails(t *testing.T) {
+//     readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+//     nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
+//     readerMock.On("GetNodeb", RanName).Return(nb, nil)
+//     e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+//     e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
+//     updatedNb := *nb
+//     updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+//     updatedNb.ConnectionAttempts = 0
+//     writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf("")))
+//     _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+//     assert.IsType(t, /* &e2managererrors.RnibDbError{} */&common.InternalError{}, err)
+//     ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup")
+//}
+
+//func TestSetupExistingRanWithoutAssocE2TInstanceExecuteSetupFailure(t *testing.T) {
+//     readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+//     nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
+//     readerMock.On("GetNodeb", RanName).Return(nb, nil)
+//     e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+//     e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
+//     updatedNb := *nb
+//     updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+//     updatedNb.ConnectionAttempts = 0
+//     writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+//     ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRnibDbError())
+//     _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+//     assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+//}
+//
+//func TestSetupExistingRanWithoutAssocE2TInstanceSuccess(t *testing.T) {
+//     readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
+//     nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
+//     readerMock.On("GetNodeb", RanName).Return(nb, nil)
+//     e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil)
+//     e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil)
+//     updatedNb := *nb
+//     updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+//     updatedNb.ConnectionAttempts = 0
+//     writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+//     ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil)
+//     _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
+//     assert.Nil(t, err)
+//}
 
 func TestSetupExistingRanWithAssocE2TInstanceUpdateNodebFailure(t *testing.T) {
        readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST)
@@ -417,7 +437,7 @@ func TestSetupExistingRanWithAssocE2TInstanceExecuteSetupRmrError(t *testing.T)
        writerMock.On("UpdateNodebInfo", &updatedNb2).Return(nil)
        payload := e2pdus.PackedX2setupRequest
        xaction := []byte(RanName)
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction)
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction, nil)
        rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, e2managererrors.NewRmrError())
        writerMock.On("UpdateNodebInfo", &updatedNb3).Return(nil)
        _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,})
index 13a88ad..c8fd494 100644 (file)
@@ -30,6 +30,7 @@ import (
        "e2mgr/services/rmrsender"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       "unsafe"
 )
 
 const (
@@ -82,8 +83,8 @@ func (handler *X2ResetRequestHandler) Handle(request models.Request) (models.IRe
        }
 
        var xAction []byte
-
-       msg := models.NewRmrMessage(rmrCgo.RIC_X2_RESET, resetRequest.RanName, payload, xAction)
+       var msgSrc unsafe.Pointer
+       msg := models.NewRmrMessage(rmrCgo.RIC_X2_RESET, resetRequest.RanName, payload, xAction, msgSrc)
 
        err = handler.rmrSender.Send(msg)
 
index cb472bd..e8cdc4e 100644 (file)
@@ -32,6 +32,7 @@ import (
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
        "github.com/stretchr/testify/assert"
        "testing"
+       "unsafe"
 )
 
 func setupX2ResetRequestHandlerTest(t *testing.T) (*X2ResetRequestHandler, *mocks.RmrMessengerMock, *mocks.RnibReaderMock) {
@@ -53,7 +54,8 @@ func TestHandleSuccessfulDefaultCause(t *testing.T) {
        // o&m intervention
        payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64}
        var xAction[]byte
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
 
        rmrMessengerMock.On("SendMsg", msg, true).Return(msg, nil)
 
@@ -71,7 +73,8 @@ func TestHandleSuccessfulRequestedCause(t *testing.T) {
        ranName := "test1"
        payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40}
        var xAction[]byte
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", msg, true).Return(msg, nil)
 
        var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
@@ -138,7 +141,8 @@ func TestHandleFailureRmrError(t *testing.T) {
        // o&m intervention
        payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64}
        var xAction[]byte
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", msg, true).Return(&rmrCgo.MBuf{}, fmt.Errorf("rmr error"))
 
        var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
index 405d30d..b71129f 100644 (file)
@@ -22,6 +22,7 @@ package rmrmsghandlers
 import (
        "bytes"
        "e2mgr/configuration"
+       "e2mgr/e2managererrors"
        "e2mgr/logger"
        "e2mgr/managers"
        "e2mgr/models"
@@ -109,36 +110,69 @@ func (h E2SetupRequestNotificationHandler) Handle(request *models.NotificationRe
                        return
                }
        }
-       nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        err = h.e2tAssociationManager.AssociateRan(e2tIpAddress, nodebInfo)
        if err != nil{
                h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s - failed to associate E2T to nodeB entity. Error: %s", ranName, err)
+               if _, ok := err.(*e2managererrors.RoutingManagerError); ok{
+                       h.handleUnsuccessfulResponse(nodebInfo, request)
+               }
                return
        }
+       h.handleSuccessfulResponse(ranName, request, setupRequest)
+}
+
+func (h E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(nodebInfo *entities.NodebInfo, req *models.NotificationRequest){
+       failureResponse := models.NewE2SetupFailureResponseMessage(models.TimeToWaitEnum.V60s)
+       h.logger.Debugf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - E2_SETUP_RESPONSE has been built successfully %+v", failureResponse)
+
+       responsePayload, err := xml.Marshal(&failureResponse.E2APPDU)
+       if err != nil{
+               h.logger.Warnf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", nodebInfo.RanName, responsePayload)
+       }
+
+       responsePayload = replaceEmptyTagsWithSelfClosing(responsePayload)
+
+       msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_FAILURE, nodebInfo.RanName, responsePayload, req.TransactionId, req.GetMsgSrc())
+       h.logger.Infof("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - RAN name: %s - RIC_E2_SETUP_RESP message has been built successfully. Message: %x", nodebInfo.RanName, msg)
+       _ = h.rmrSender.WhSend(msg)
+
+}
+
+func (h E2SetupRequestNotificationHandler) handleSuccessfulResponse(ranName string, req *models.NotificationRequest, setupRequest *models.E2SetupRequestMessage){
 
        ricNearRtId, err := convertTo20BitString(h.config.GlobalRicId.RicNearRtId)
        if err != nil{
-               h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s - failed to convert RicNearRtId value %s to 20 bit string . Error: %s", ranName, h.config.GlobalRicId.RicNearRtId, err)
+               h.logger.Errorf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - failed to convert RicNearRtId value %s to 20 bit string . Error: %s", ranName, h.config.GlobalRicId.RicNearRtId, err)
                return
        }
        successResponse := models.NewE2SetupSuccessResponseMessage(h.config.GlobalRicId.PlmnId, ricNearRtId,setupRequest)
-       h.logger.Debugf("#E2SetupRequestNotificationHandler.Handle - E2_SETUP_RESPONSE has been built successfully %+v", successResponse)
+       h.logger.Debugf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - E2_SETUP_RESPONSE has been built successfully %+v", successResponse)
 
        responsePayload, err := xml.Marshal(&successResponse.E2APPDU)
        if err != nil{
-               h.logger.Warnf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", ranName, responsePayload)
+               h.logger.Warnf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", ranName, responsePayload)
        }
 
-       responsePayload = replaceCriticalityTagsWithSelfClosing(responsePayload)
+       responsePayload = replaceEmptyTagsWithSelfClosing(responsePayload)
 
-       msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_RESP, ranName, responsePayload, request.TransactionId)
-       h.logger.Infof("#E2SetupRequestNotificationHandler.Handle - RAN name: %s - RIC_E2_SETUP_RESP message has been built successfully. Message: %x", ranName, msg)
+       msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_RESP, ranName, responsePayload, req.TransactionId, req.GetMsgSrc())
+       h.logger.Infof("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - RIC_E2_SETUP_RESP message has been built successfully. Message: %x", ranName, msg)
        _ = h.rmrSender.Send(msg)
 }
 
-func replaceCriticalityTagsWithSelfClosing(responsePayload []byte) []byte {
-       responseString := strings.Replace(string(responsePayload), "<reject></reject>", "<reject/>", -1)
-       responseString = strings.Replace(responseString, "<ignore></ignore>", "<ignore/>", -1)
+
+func replaceEmptyTagsWithSelfClosing(responsePayload []byte) []byte {
+       responseString := strings.NewReplacer(
+               "<reject></reject>", "<reject/>",
+               "<ignore></ignore>", "<ignore/>",
+               "<transport-resource-unavailable></transport-resource-unavailable>", "<transport-resource-unavailable/>",
+               "<v60s></v60s>", "<v60s/>",
+               "<v20s></v20s>", "<v20s/>",
+               "<v10s></v10s>", "<v10s/>",
+               "<v5s></v5s>", "<v5s/>",
+               "<v2s></v2s>", "<v2s/>",
+               "<v1s></v1s>", "<v1s/>",
+               ).Replace(string(responsePayload))
        return []byte(responseString)
 }
 
index c689025..341bd43 100644 (file)
@@ -309,7 +309,7 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T)
        routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
        var errEmpty error
        rmrMessage := &rmrCgo.MBuf{}
-       rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
+       rmrMessengerMock.On("WhSendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)
 
        prefBytes := []byte(prefix)
        notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)}
@@ -319,8 +319,8 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T)
        writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything)
        routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything)
        writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything)
-       e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
-       rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything)
+       e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything)
+       rmrMessengerMock.AssertCalled(t, "WhSendMsg", mock.Anything, mock.Anything)
 }
 
 
index 8c5627a..a83c0f3 100644 (file)
@@ -43,7 +43,7 @@ func createNotificationRequest(ranName string, transactionId []byte, packedPdu s
                return nil, err
        }
 
-       return models.NewNotificationRequest(ranName, packedByteSlice, time.Now(), transactionId), nil
+       return models.NewNotificationRequest(ranName, packedByteSlice, time.Now(), transactionId, nil), nil
 }
 
 func createNotificationRequestAndHandle(ranName string, transactionId []byte, loadInformationHandler EnbLoadInformationNotificationHandler, pdu string) error {
index c460941..5a81916 100644 (file)
@@ -54,7 +54,7 @@ func (h EndcConfigurationUpdateHandler) Handle(request *models.NotificationReque
        if err != nil {
                h.logger.Errorf("#endc_configuration_update_handler.Handle - unpack failed. Error: %v", err)
 
-               msg := models.NewRmrMessage(rmrCgo.RIC_ENDC_CONF_UPDATE_FAILURE, request.RanName, e2pdus.PackedEndcConfigurationUpdateFailure, request.TransactionId)
+               msg := models.NewRmrMessage(rmrCgo.RIC_ENDC_CONF_UPDATE_FAILURE, request.RanName, e2pdus.PackedEndcConfigurationUpdateFailure, request.TransactionId, request.GetMsgSrc())
                _ = h.rmrSender.Send(msg)
 
                h.logger.Infof("#EndcConfigurationUpdateHandler.Handle - Summary: elapsed time for receiving and handling endc configuration update initiating message from E2 terminator: %f ms", utils.ElapsedTime(request.StartTime))
@@ -63,7 +63,7 @@ func (h EndcConfigurationUpdateHandler) Handle(request *models.NotificationReque
 
        h.logger.Infof("#endc_configuration_update_handler.Handle - Endc configuration update initiating message received")
        h.logger.Debugf("#endc_configuration_update_handler.Handle - Endc configuration update initiating message payload: %s", refinedMessage.PduPrint)
-       msg := models.NewRmrMessage(rmrCgo.RIC_ENDC_CONF_UPDATE_ACK, request.RanName, e2pdus.PackedEndcConfigurationUpdateAck, request.TransactionId)
+       msg := models.NewRmrMessage(rmrCgo.RIC_ENDC_CONF_UPDATE_ACK, request.RanName, e2pdus.PackedEndcConfigurationUpdateAck, request.TransactionId, request.GetMsgSrc())
        _ = h.rmrSender.Send(msg)
 
        h.logger.Infof("#EndcConfigurationUpdateHandler.Handle - Summary: elapsed time for receiving and handling endc configuration update initiating message from E2 terminator: %f ms", utils.ElapsedTime(request.StartTime))
index 1c2afe9..6400cf3 100644 (file)
@@ -26,6 +26,7 @@ import (
        "fmt"
        "testing"
        "time"
+       "unsafe"
 )
 
 const PackedEndcConfigurationUpdateAck = "2025000a00000100f70003000000"
@@ -47,8 +48,9 @@ func TestHandleEndcConfigUpdateSuccess(t *testing.T) {
 
        var payload []byte
        _, _ = fmt.Sscanf(PackedEndcConfigurationUpdateAck, "%x", &payload)
+       var msgSrc unsafe.Pointer
 
-       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_CONF_UPDATE_ACK, len(payload), ranName, &payload, &xAction)
+       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_CONF_UPDATE_ACK, len(payload), ranName, &payload, &xAction, msgSrc)
        notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(),
                TransactionId: *mBuf.XAction}
        var err error
@@ -65,8 +67,9 @@ func TestHandleEndcConfigUpdateFailure(t *testing.T) {
 
        var payload []byte
        _, _ = fmt.Sscanf(PackedEndcConfigurationUpdateFailure, "%x", &payload)
+       var msgSrc unsafe.Pointer
 
-       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_CONF_UPDATE_FAILURE, len(payload), ranName, &payload, &xAction)
+       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_CONF_UPDATE_FAILURE, len(payload), ranName, &payload, &xAction, msgSrc)
        notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: 0, Payload: []byte{0}, StartTime: time.Now(),
                TransactionId: *mBuf.XAction}
        rmrMessengerMock.On("SendMsg", mBuf, true).Return(&rmrCgo.MBuf{}, fmt.Errorf("send failure"))
index f4bfd63..d52181c 100644 (file)
@@ -40,6 +40,7 @@ import (
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/mock"
        "testing"
+       "unsafe"
 )
 
 const (
@@ -160,7 +161,8 @@ func getRanConnectedMbuf(nodeType entities.Node_Type) *rmrCgo.MBuf {
        var xAction []byte
        resourceStatusPayload := models.NewResourceStatusPayload(nodeType, enums.RIC_TO_RAN)
        resourceStatusJson, _ := json.Marshal(resourceStatusPayload)
-       return rmrCgo.NewMBuf(rmrCgo.RAN_CONNECTED, len(resourceStatusJson), RanName, &resourceStatusJson, &xAction)
+       var msgSrc unsafe.Pointer
+       return rmrCgo.NewMBuf(rmrCgo.RAN_CONNECTED, len(resourceStatusJson), RanName, &resourceStatusJson, &xAction, msgSrc)
 }
 
 func executeHandleSetupFailureResponse(t *testing.T, tc setupFailureResponseTestCase) (*setupResponseTestContext, *entities.NodebInfo) {
index 164984a..85255eb 100644 (file)
@@ -79,7 +79,7 @@ func (h X2ResetRequestNotificationHandler) Handle(request *models.NotificationRe
                return
        }
 
-       msg := models.NewRmrMessage(rmrCgo.RIC_X2_RESET_RESP, request.RanName, e2pdus.PackedX2ResetResponse, request.TransactionId)
+       msg := models.NewRmrMessage(rmrCgo.RIC_X2_RESET_RESP, request.RanName, e2pdus.PackedX2ResetResponse, request.TransactionId, request.GetMsgSrc())
 
        _ = h.rmrSender.Send(msg)
        h.logger.Infof("#X2ResetRequestNotificationHandler.Handle - Summary: elapsed time for receiving and handling reset request message from E2 terminator: %f ms", utils.ElapsedTime(request.StartTime))
index 6b6f00c..73d3a56 100644 (file)
@@ -35,6 +35,7 @@ import (
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
        "testing"
        "time"
+       "unsafe"
 )
 
 func initX2ResetRequestNotificationHandlerTest(t *testing.T) (X2ResetRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RmrMessengerMock) {
@@ -55,19 +56,21 @@ func getRanRestartedMbuf(nodeType entities.Node_Type, messageDirection enums.Mes
        var xAction []byte
        resourceStatusPayload := models.NewResourceStatusPayload(nodeType, messageDirection)
        resourceStatusJson, _ := json.Marshal(resourceStatusPayload)
-       return rmrCgo.NewMBuf(rmrCgo.RAN_RESTARTED, len(resourceStatusJson), RanName, &resourceStatusJson, &xAction)
+       var msgSrc unsafe.Pointer
+       return rmrCgo.NewMBuf(rmrCgo.RAN_RESTARTED, len(resourceStatusJson), RanName, &resourceStatusJson, &xAction, msgSrc)
 }
 
 func TestHandleX2ResetRequestNotificationSuccess(t *testing.T) {
        h, readerMock, rmrMessengerMock := initX2ResetRequestNotificationHandlerTest(t)
        ranName := "test"
        xAction := []byte("123456aa")
-       notificationRequest := models.NewNotificationRequest(ranName, []byte{}, time.Now(), xAction)
+       notificationRequest := models.NewNotificationRequest(ranName, []byte{}, time.Now(), xAction, nil)
 
        nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, NodeType: entities.Node_ENB}
        var err error
        readerMock.On("GetNodeb", ranName).Return(nb, err)
-       resetResponseMbuf := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET_RESP, len(e2pdus.PackedX2ResetResponse), ranName, &e2pdus.PackedX2ResetResponse, &xAction)
+       var msgSrc unsafe.Pointer
+       resetResponseMbuf := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET_RESP, len(e2pdus.PackedX2ResetResponse), ranName, &e2pdus.PackedX2ResetResponse, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", resetResponseMbuf, true).Return(&rmrCgo.MBuf{}, err)
        ranRestartedMbuf := getRanRestartedMbuf(nb.NodeType, enums.RAN_TO_RIC)
        rmrMessengerMock.On("SendMsg", ranRestartedMbuf, true).Return(&rmrCgo.MBuf{}, err)
@@ -81,7 +84,8 @@ func TestHandleX2ResetRequestNotificationShuttingDownStatus(t *testing.T) {
        var payload []byte
 
        xAction := []byte("123456aa")
-       mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xAction, msgSrc)
        notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload,
                StartTime: time.Now(), TransactionId: xAction}
 
@@ -98,7 +102,8 @@ func TestHandleX2ResetRequestNotificationDisconnectStatus(t *testing.T) {
        h, readerMock, rmrMessengerMock := initX2ResetRequestNotificationHandlerTest(t)
        var payload []byte
        xAction := []byte("123456aa")
-       mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xAction, msgSrc)
        notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), TransactionId: xAction}
        nb := &entities.NodebInfo{RanName: mBuf.Meid, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
        var rnibErr error
@@ -113,7 +118,8 @@ func TestHandleX2ResetRequestNotificationGetNodebFailed(t *testing.T) {
         h, readerMock, rmrMessengerMock := initX2ResetRequestNotificationHandlerTest(t)
        var payload []byte
        var xAction []byte
-       mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xAction, msgSrc)
        notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload,
                StartTime: time.Now(), TransactionId: xAction}
 
index 591acff..c9efe0d 100644 (file)
@@ -54,7 +54,7 @@ func (h X2EnbConfigurationUpdateHandler) Handle(request *models.NotificationRequ
        if err != nil {
                h.logger.Errorf("#x2enb_configuration_update_handler.Handle - unpack failed. Error: %v", err)
 
-               msg := models.NewRmrMessage(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_FAILURE, request.RanName, e2pdus.PackedX2EnbConfigurationUpdateFailure, request.TransactionId)
+               msg := models.NewRmrMessage(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_FAILURE, request.RanName, e2pdus.PackedX2EnbConfigurationUpdateFailure, request.TransactionId, request.GetMsgSrc())
                _ = h.rmrSender.Send(msg)
 
                h.logger.Infof("#X2EnbConfigurationUpdateHandler.Handle - Summary: elapsed time for receiving and handling enb configuration update initiating message from E2 terminator: %f ms", utils.ElapsedTime(request.StartTime))
@@ -64,7 +64,7 @@ func (h X2EnbConfigurationUpdateHandler) Handle(request *models.NotificationRequ
        h.logger.Infof("#x2enb_configuration_update_handler.Handle - Enb configuration update initiating message received")
        h.logger.Debugf("#x2enb_configuration_update_handler.Handle - Enb configuration update initiating message payload: %s", refinedMessage.PduPrint)
 
-       msg := models.NewRmrMessage(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_ACK, request.RanName, e2pdus.PackedX2EnbConfigurationUpdateAck,request.TransactionId)
+       msg := models.NewRmrMessage(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_ACK, request.RanName, e2pdus.PackedX2EnbConfigurationUpdateAck,request.TransactionId, request.GetMsgSrc())
        _ = h.rmrSender.Send(msg)
 
        h.logger.Infof("#X2EnbConfigurationUpdateHandler.Handle - Summary: elapsed time for receiving and handling enb configuration update initiating message from E2 terminator: %f ms", utils.ElapsedTime(request.StartTime))
index c29d21b..5a48a8d 100644 (file)
@@ -26,6 +26,7 @@ import (
        "fmt"
        "testing"
        "time"
+       "unsafe"
 )
 
 const PackedX2EnbConfigurationUpdateAck = "200800080000010011400100"
@@ -46,8 +47,9 @@ func TestHandleX2EnbConfigUpdateSuccess(t *testing.T) {
        xAction := []byte("123456aa")
        var payload []byte
        _, _ = fmt.Sscanf(PackedX2EnbConfigurationUpdateAck, "%x", &payload)
+       var msgSrc unsafe.Pointer
 
-       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_ACK, len(payload), ranName, &payload, &xAction)
+       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_ACK, len(payload), ranName, &payload, &xAction, msgSrc)
        notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload,
                StartTime: time.Now(), TransactionId:xAction}
        var err error
@@ -64,8 +66,9 @@ func TestHandleX2EnbConfigUpdateFailure(t *testing.T) {
 
        var payload []byte
        _, _ = fmt.Sscanf(PackedX2EnbConfigurationUpdateFailure, "%x", &payload)
+       var msgSrc unsafe.Pointer
 
-       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_FAILURE, len(payload), ranName, &payload, &xAction)
+       mBuf := rmrCgo.NewMBuf(rmrCgo.RIC_ENB_CONFIGURATION_UPDATE_FAILURE, len(payload), ranName, &payload, &xAction, msgSrc)
        notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: 0, Payload: []byte{0},
                StartTime: time.Now(), TransactionId:xAction}
        rmrMessengerMock.On("SendMsg", mBuf, true).Return(&rmrCgo.MBuf{}, fmt.Errorf("send failure"))
index 855ac05..3afba25 100644 (file)
@@ -21,6 +21,7 @@ package managers
 
 import (
        "e2mgr/clients"
+       "e2mgr/e2managererrors"
        "e2mgr/logger"
        "e2mgr/services"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
@@ -46,28 +47,43 @@ func (m *E2TAssociationManager) AssociateRan(e2tAddress string, nodebInfo *entit
        ranName := nodebInfo.RanName
        m.logger.Infof("#E2TAssociationManager.AssociateRan - Associating RAN %s to E2T Instance address: %s", ranName, e2tAddress)
 
-       nodebInfo.AssociatedE2TInstanceAddress = e2tAddress
-       nodebInfo.ConnectionAttempts = 0
-
-       rnibErr := m.rnibDataService.UpdateNodebInfo(nodebInfo)
-       if rnibErr != nil {
-               m.logger.Errorf("#E2TAssociationManager.AssociateRan - RAN name: %s - Failed to update RAN.AssociatedE2TInstanceAddress in rNib. Error: %s", ranName, rnibErr)
-               return rnibErr
-       }
-
-       err := m.e2tInstanceManager.AddRansToInstance(e2tAddress, []string{ranName})
+       err := m.associateRanAndUpdateNodeb(e2tAddress, nodebInfo)
        if err != nil {
-               m.logger.Errorf("#E2TAssociationManager.AssociateRan - RAN name: %s - Failed to add RAN to E2T instance %s. Error: %s", ranName, e2tAddress, err)
+               m.logger.Errorf("#E2TAssociationManager.AssociateRan - RoutingManager failure: Failed to associate RAN %s to E2T %s. Error: %s", nodebInfo, e2tAddress, err)
                return err
        }
-       err = m.rmClient.AssociateRanToE2TInstance(e2tAddress, ranName)
+       err = m.e2tInstanceManager.AddRansToInstance(e2tAddress, []string{ranName})
        if err != nil {
-               m.logger.Errorf("#E2TAssociationManager.AssociateRan - RoutingManager failure: Failed to associate RAN %s to E2T %s. Error: %s", ranName, e2tAddress, err)
+               m.logger.Errorf("#E2TAssociationManager.AssociateRan - RAN name: %s - Failed to add RAN to E2T instance %s. Error: %s", ranName, e2tAddress, err)
+               return e2managererrors.NewRnibDbError()
        }
        m.logger.Infof("#E2TAssociationManager.AssociateRan - successfully associated RAN %s with E2T %s", ranName, e2tAddress)
        return nil
 }
 
+func (m *E2TAssociationManager) associateRanAndUpdateNodeb(e2tAddress string, nodebInfo *entities.NodebInfo) error {
+
+       rmErr := m.rmClient.AssociateRanToE2TInstance(e2tAddress, nodebInfo.RanName)
+       if rmErr != nil {
+               nodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       } else {
+               nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
+               nodebInfo.AssociatedE2TInstanceAddress = e2tAddress
+               nodebInfo.ConnectionAttempts = 0
+       }
+       rNibErr := m.rnibDataService.UpdateNodebInfo(nodebInfo)
+       if rNibErr != nil {
+               m.logger.Errorf("#E2TAssociationManager.associateRanAndUpdateNodeb - RAN name: %s - Failed to update nodeb entity in rNib. Error: %s", nodebInfo.RanName, rNibErr)
+       }
+       var err error
+       if rmErr != nil {
+               err = e2managererrors.NewRoutingManagerError()
+       } else if rNibErr != nil{
+               err = e2managererrors.NewRnibDbError()
+       }
+       return err
+}
+
 func (m *E2TAssociationManager) DissociateRan(e2tAddress string, ranName string) error {
        m.logger.Infof("#E2TAssociationManager.DissociateRan - Dissociating RAN %s from E2T Instance address: %s", ranName, e2tAddress)
 
index 994dd40..7b412d4 100644 (file)
@@ -31,7 +31,6 @@ import (
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
        "github.com/pkg/errors"
        "github.com/stretchr/testify/assert"
-       "github.com/stretchr/testify/mock"
        "io/ioutil"
        "net/http"
        "testing"
@@ -76,6 +75,7 @@ func TestAssociateRanSuccess(t *testing.T) {
        updatedNb := *nb
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
        e2tInstance := &entities.E2TInstance{Address: E2TAddress}
        readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
@@ -92,28 +92,27 @@ func TestAssociateRanSuccess(t *testing.T) {
 }
 
 func TestAssociateRanRoutingManagerError(t *testing.T) {
-       manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
+       manager, _, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
        mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, false)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        writerMock.On("UpdateNodebInfo", nb).Return(nil)
-       e2tInstance := &entities.E2TInstance{Address: E2TAddress}
-       readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
-       writerMock.On("SaveE2TInstance", mock.Anything).Return(nil)
+
        err := manager.AssociateRan(E2TAddress, nb)
 
-       assert.Nil(t, err)
-       readerMock.AssertExpectations(t)
+       assert.NotNil(t, err)
+       assert.IsType(t, &e2managererrors.RoutingManagerError{}, err)
        writerMock.AssertExpectations(t)
        httpClientMock.AssertExpectations(t)
 }
 
 func TestAssociateRanUpdateNodebError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       //mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        updatedNb := *nb
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
 
        err := manager.AssociateRan(E2TAddress, nb)
@@ -127,11 +126,12 @@ func TestAssociateRanUpdateNodebError(t *testing.T) {
 
 func TestAssociateRanGetE2tInstanceError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       //mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        updatedNb := *nb
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
        var e2tInstance *entities.E2TInstance
        readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, errors.New("test"))
@@ -147,11 +147,12 @@ func TestAssociateRanGetE2tInstanceError(t *testing.T) {
 
 func TestAssociateRanSaveE2tInstanceError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       //mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        updatedNb := *nb
        updatedNb.ConnectionAttempts = 0
        updatedNb.AssociatedE2TInstanceAddress = E2TAddress
+       updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
        writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
        e2tInstance := &entities.E2TInstance{Address: E2TAddress}
        readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
index 21d26b7..c15aedb 100644 (file)
@@ -32,6 +32,7 @@ import (
        "github.com/stretchr/testify/mock"
        "testing"
        "time"
+       "unsafe"
 )
 
 func initE2TKeepAliveTest(t *testing.T) (*mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.E2TShutdownManagerMock, *E2TKeepAliveWorker) {
@@ -64,7 +65,8 @@ func TestSendKeepAliveRequest(t *testing.T) {
        e2tKeepAliveWorker.SendKeepAliveRequest()
 
        var payload, xAction []byte
-       req := rmrCgo.NewMBuf(rmrCgo.E2_TERM_KEEP_ALIVE_REQ, 0, "", &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       req := rmrCgo.NewMBuf(rmrCgo.E2_TERM_KEEP_ALIVE_REQ, 0, "", &payload, &xAction, msgSrc)
 
        rmrMessengerMock.AssertCalled(t, "SendMsg", req, false)
 }
@@ -195,7 +197,8 @@ func TestExecute_Two_E2TExpired(t *testing.T) {
        time.Sleep(time.Duration(500) * time.Millisecond)
 
        var payload, xAction []byte
-       req := rmrCgo.NewMBuf(rmrCgo.E2_TERM_KEEP_ALIVE_REQ, 0, "", &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       req := rmrCgo.NewMBuf(rmrCgo.E2_TERM_KEEP_ALIVE_REQ, 0, "", &payload, &xAction, msgSrc)
 
        rmrMessengerMock.AssertCalled(t, "SendMsg", req, false)
        e2tShutdownManagerMock.AssertCalled(t, "Shutdown", e2tInstance1)
index a44608b..cd284d5 100644 (file)
@@ -49,7 +49,7 @@ func (m NotificationManager) HandleMessage(mbuf *rmrCgo.MBuf) error {
                return err
        }
 
-       notificationRequest := models.NewNotificationRequest(mbuf.Meid, *mbuf.Payload, time.Now(), *mbuf.XAction)
+       notificationRequest := models.NewNotificationRequest(mbuf.Meid, *mbuf.Payload, time.Now(), *mbuf.XAction, mbuf.GetMsgSrc())
        go notificationHandler.Handle(notificationRequest)
        return nil
 }
index de54308..ac24e05 100644 (file)
@@ -29,6 +29,7 @@ import (
        "e2mgr/services"
        "e2mgr/services/rmrsender"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       "unsafe"
 )
 
 type RanSetupManager struct {
@@ -110,7 +111,8 @@ func (m *RanSetupManager) ExecuteSetup(nodebInfo *entities.NodebInfo, status ent
 
        // Send the endc/x2 setup request
        var xAction []byte
-       msg := models.NewRmrMessage(rmrMsgType, nodebInfo.RanName, request.GetMessageAsBytes(m.logger), xAction)
+       var msgSrc unsafe.Pointer
+       msg := models.NewRmrMessage(rmrMsgType, nodebInfo.RanName, request.GetMessageAsBytes(m.logger), xAction, msgSrc)
 
        err = m.rmrSender.Send(msg)
 
index 4178062..7f40131 100644 (file)
@@ -34,6 +34,7 @@ import (
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/mock"
        "testing"
+       "unsafe"
 )
 
 func initRanSetupManagerTest(t *testing.T) (*mocks.RmrMessengerMock, *mocks.RnibWriterMock, *RanSetupManager) {
@@ -66,8 +67,9 @@ func TestExecuteSetupConnectingX2Setup(t *testing.T) {
        writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
 
        payload := e2pdus.PackedX2setupRequest
-       xaction := []byte(ranName)
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
+       xAction := []byte(ranName)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
 
        if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil {
@@ -89,8 +91,9 @@ func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) {
        writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
 
        payload := e2pdus.PackedEndcX2setupRequest
-       xaction := []byte(ranName)
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
+       xAction := []byte(ranName)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
 
        if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil {
@@ -114,8 +117,9 @@ func TestExecuteSetupDisconnected(t *testing.T) {
        writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(rnibErr)
 
        payload := []byte{0}
-       xaction := []byte(ranName)
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
+       xAction := []byte(ranName)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, fmt.Errorf("send failure"))
 
        if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
@@ -139,8 +143,9 @@ func TestExecuteSetupConnectingRnibError(t *testing.T) {
        writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(rnibErr)
 
        payload := []byte{0}
-       xaction := []byte(ranName)
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
+       xAction := []byte(ranName)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, fmt.Errorf("send failure"))
 
        if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
@@ -166,8 +171,9 @@ func TestExecuteSetupDisconnectedRnibError(t *testing.T) {
        writerMock.On("UpdateNodebInfo", argNodebDisconnected).Return(common.NewInternalError(fmt.Errorf("DB error")))
 
        payload := []byte{0}
-       xaction := []byte(ranName)
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
+       xAction := []byte(ranName)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, fmt.Errorf("send failure"))
 
        if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
@@ -191,8 +197,9 @@ func TestExecuteSetupUnsupportedProtocol(t *testing.T) {
        writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
 
        payload := e2pdus.PackedX2setupRequest
-       xaction := []byte(ranName)
-       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
+       xAction := []byte(ranName)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil)
 
        if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
index dc150c7..95c6003 100644 (file)
@@ -26,6 +26,7 @@ import (
        "e2mgr/services/rmrsender"
        "encoding/json"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       "unsafe"
 )
 
 type RanStatusChangeManager struct {
@@ -55,6 +56,7 @@ func (m *RanStatusChangeManager) Execute(msgType int, msgDirection enums.Message
        }
 
        var xAction []byte
-       rmrMessage := models.NewRmrMessage(msgType, nodebInfo.RanName, resourceStatusJson, xAction)
+       var msgSrc unsafe.Pointer
+       rmrMessage := models.NewRmrMessage(msgType, nodebInfo.RanName, resourceStatusJson, xAction, msgSrc)
        return m.rmrSender.Send(rmrMessage)
 }
index b517fe9..732f696 100644 (file)
@@ -40,6 +40,11 @@ func (m *RmrMessengerMock) SendMsg(msg *rmrCgo.MBuf, printLogs bool) (*rmrCgo.MB
        return args.Get(0).(*rmrCgo.MBuf), args.Error(1)
 }
 
+func (m *RmrMessengerMock) WhSendMsg(msg *rmrCgo.MBuf, printLogs bool) (*rmrCgo.MBuf, error){
+       args := m.Called(msg, printLogs)
+       return args.Get(0).(*rmrCgo.MBuf), args.Error(1)
+}
+
 func (m *RmrMessengerMock) RecvMsg() (*rmrCgo.MBuf, error){
        args := m.Called()
        return args.Get(0).(*rmrCgo.MBuf), args.Error(1)
diff --git a/E2Manager/models/e2_setup_response_message.go b/E2Manager/models/e2_setup_response_message.go
new file mode 100644 (file)
index 0000000..62c733d
--- /dev/null
@@ -0,0 +1,233 @@
+//
+// Copyright 2019 AT&T Intellectual Property
+// Copyright 2019 Nokia
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//  This source code is part of the near-RT RIC (RAN Intelligent Controller)
+//  platform project (RICP).
+
+package models
+import (
+       "encoding/xml"
+)
+
+
+type TimeToWait = int
+
+var TimeToWaitEnum = struct{
+       V60s TimeToWait
+       V20s TimeToWait
+       V10s TimeToWait
+       V5s TimeToWait
+       V2s TimeToWait
+       V1s TimeToWait
+}{60, 20, 10, 5, 2, 1}
+
+var timeToWaitMap = map[TimeToWait]interface{}{
+       TimeToWaitEnum.V60s  : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V60s string `xml:"v60s"`
+       }{},
+       TimeToWaitEnum.V20s  : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V20s string `xml:"v20s"`
+       }{},
+       TimeToWaitEnum.V10s  : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V10s string `xml:"v10s"`
+       }{},
+       TimeToWaitEnum.V5s   : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V5s string `xml:"v5s"`
+       }{},
+       TimeToWaitEnum.V2s   : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V2s string `xml:"v2s"`
+       }{},
+       TimeToWaitEnum.V1s   : struct {
+               XMLName xml.Name `xml:"TimeToWait"`
+               Text string `xml:",chardata"`
+               V1s string `xml:"v1s"`
+       }{},
+}
+
+func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage{
+       outcome := SuccessfulOutcome{}
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, 2)
+       outcome.ProcedureCode = "1"
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].ID = "4"
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].Value = GlobalRICID{GlobalRICID: struct {
+               Text         string `xml:",chardata"`
+               PLMNIdentity string `xml:"pLMN-Identity"`
+               RicID        string `xml:"ric-ID"`
+       }{PLMNIdentity:plmnId, RicID:ricId}}
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
+               Text                      string `xml:",chardata"`
+               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+       }{ProtocolIESingleContainer:extractRanFunctionsIDList(request)}}
+       return E2SetupResponseMessage{E2APPDU:E2APPDU{Outcome:outcome}}
+}
+
+func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage{
+       outcome := UnsuccessfulOutcome{}
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2)
+       outcome.ProcedureCode = "1"
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = "1"
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = Cause{}
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = "31"
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = timeToWaitMap[timeToWait]
+       return E2SetupResponseMessage{E2APPDU:E2APPDU{Outcome:outcome}}
+}
+
+type E2SetupResponseMessage struct {
+       XMLName xml.Name `xml:"E2SetupSuccessResponseMessage"`
+       Text    string   `xml:",chardata"`
+       E2APPDU E2APPDU
+}
+
+type E2APPDU struct {
+       XMLName xml.Name `xml:"E2AP-PDU"`
+       Text    string `xml:",chardata"`
+       Outcome interface{}
+}
+
+type SuccessfulOutcome struct {
+       XMLName xml.Name        `xml:"successfulOutcome"`
+       Text          string `xml:",chardata"`
+       ProcedureCode string `xml:"procedureCode"`
+       Criticality   struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value struct {
+               Text            string `xml:",chardata"`
+               E2setupResponse struct {
+                       Text        string `xml:",chardata"`
+                       ProtocolIEs struct {
+                               Text               string `xml:",chardata"`
+                               E2setupResponseIEs []E2setupResponseIEs`xml:"E2setupResponseIEs"`
+                       } `xml:"protocolIEs"`
+               } `xml:"E2setupResponse"`
+       } `xml:"value"`
+}
+
+type E2setupResponseIEs struct {
+       Text        string `xml:",chardata"`
+       ID          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value interface{}`xml:"value"`
+}
+
+type GlobalRICID struct {
+       Text        string `xml:",chardata"`
+       GlobalRICID struct {
+               Text         string `xml:",chardata"`
+               PLMNIdentity string `xml:"pLMN-Identity"`
+               RicID        string `xml:"ric-ID"`
+       } `xml:"GlobalRIC-ID"`
+}
+
+type RANfunctionsIDList struct {
+       Text        string `xml:",chardata"`
+       RANfunctionsIDList struct {
+               Text                      string `xml:",chardata"`
+               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+       } `xml:"RANfunctionsID-List"`
+}
+
+type ProtocolIESingleContainer struct {
+       Text        string `xml:",chardata"`
+       ID          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Ignore string `xml:"ignore"`
+       } `xml:"criticality"`
+       Value struct {
+               Text              string `xml:",chardata"`
+               RANfunctionIDItem struct {
+                       Text                string `xml:",chardata"`
+                       RanFunctionID       string `xml:"ranFunctionID"`
+                       RanFunctionRevision string `xml:"ranFunctionRevision"`
+               } `xml:"RANfunctionID-Item"`
+       } `xml:"value"`
+}
+
+
+type UnsuccessfulOutcome struct {
+       XMLName xml.Name        `xml:"unsuccessfulOutcome"`
+       Text          string `xml:",chardata"`
+       ProcedureCode string `xml:"procedureCode"`
+       Criticality   struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value struct {
+               Text            string `xml:",chardata"`
+               E2setupFailure struct {
+                       Text        string `xml:",chardata"`
+                       ProtocolIEs struct {
+                               Text               string `xml:",chardata"`
+                               E2setupFailureIEs []E2setupFailureIEs`xml:"E2setupFailureIEs"`
+                       } `xml:"protocolIEs"`
+               } `xml:"E2setupFailure"`
+       } `xml:"value"`
+}
+
+type E2setupFailureIEs struct {
+       Text        string `xml:",chardata"`
+       ID          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Ignore string `xml:"ignore"`
+       } `xml:"criticality"`
+       Value struct {
+               Text  string `xml:",chardata"`
+               Value interface{}
+       } `xml:"value"`
+}
+
+type Cause struct {
+       XMLName xml.Name        `xml:"Cause"`
+       Text      string `xml:",chardata"`
+       Transport struct {
+               Text                         string `xml:",chardata"`
+               TransportResourceUnavailable string `xml:"transport-resource-unavailable"`
+       } `xml:"transport"`
+}
+
+func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer{
+       list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
+       ids := make([]ProtocolIESingleContainer,len(list.ProtocolIESingleContainer))
+       for i := 0; i< len(ids); i++{
+               ids[i] = convertToRANfunctionID(list, i)
+       }
+       return ids
+}
+
+func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer{
+       id := ProtocolIESingleContainer{}
+       id.ID = "6"
+       id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
+       id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision
+       return id
+}
\ No newline at end of file
diff --git a/E2Manager/models/e2_setup_success_response_message.go b/E2Manager/models/e2_setup_success_response_message.go
deleted file mode 100644 (file)
index 68c97a3..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-// Copyright 2019 AT&T Intellectual Property
-// Copyright 2019 Nokia
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//  This source code is part of the near-RT RIC (RAN Intelligent Controller)
-//  platform project (RICP).
-
-package models
-import (
-       "encoding/xml"
-)
-
-type E2SetupSuccessResponseMessage struct {
-       XMLName xml.Name `xml:"E2SetupSuccessResponseMessage"`
-       Text    string   `xml:",chardata"`
-       E2APPDU E2APPDU  `xml:"E2AP-PDU"`
-}
-
-type E2APPDU struct {
-       XMLName xml.Name `xml:"E2AP-PDU"`
-       Text              string `xml:",chardata"`
-       SuccessfulOutcome struct {
-               Text          string `xml:",chardata"`
-               ProcedureCode string `xml:"procedureCode"`
-               Criticality   struct {
-                       Text   string `xml:",chardata"`
-                       Reject string `xml:"reject"`
-               } `xml:"criticality"`
-               Value struct {
-                       Text            string `xml:",chardata"`
-                       E2setupResponse struct {
-                               Text        string `xml:",chardata"`
-                               ProtocolIEs struct {
-                                       Text               string `xml:",chardata"`
-                                       E2setupResponseIEs []E2setupResponseIEs`xml:"E2setupResponseIEs"`
-                               } `xml:"protocolIEs"`
-                       } `xml:"E2setupResponse"`
-               } `xml:"value"`
-       } `xml:"successfulOutcome"`
-}
-
-type E2setupResponseIEs struct {
-       Text        string `xml:",chardata"`
-       ID          string `xml:"id"`
-       Criticality struct {
-               Text   string `xml:",chardata"`
-               Reject string `xml:"reject"`
-       } `xml:"criticality"`
-       Value interface{}`xml:"value"`
-}
-
-type GlobalRICID struct {
-       Text        string `xml:",chardata"`
-       GlobalRICID struct {
-               Text         string `xml:",chardata"`
-               PLMNIdentity string `xml:"pLMN-Identity"`
-               RicID        string `xml:"ric-ID"`
-       } `xml:"GlobalRIC-ID"`
-}
-
-type RANfunctionsIDList struct {
-       Text        string `xml:",chardata"`
-       RANfunctionsIDList struct {
-               Text                      string `xml:",chardata"`
-               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
-       } `xml:"RANfunctionsID-List"`
-}
-
-type ProtocolIESingleContainer struct {
-       Text        string `xml:",chardata"`
-       ID          string `xml:"id"`
-       Criticality struct {
-               Text   string `xml:",chardata"`
-               Ignore string `xml:"ignore"`
-       } `xml:"criticality"`
-       Value struct {
-               Text              string `xml:",chardata"`
-               RANfunctionIDItem struct {
-                       Text                string `xml:",chardata"`
-                       RanFunctionID       string `xml:"ranFunctionID"`
-                       RanFunctionRevision string `xml:"ranFunctionRevision"`
-               } `xml:"RANfunctionID-Item"`
-       } `xml:"value"`
-}
-
-func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupSuccessResponseMessage{
-       msg := E2SetupSuccessResponseMessage{}
-       msg.E2APPDU.SuccessfulOutcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, 2)
-       msg.E2APPDU.SuccessfulOutcome.ProcedureCode = "1"
-       msg.E2APPDU.SuccessfulOutcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].ID = "4"
-       msg.E2APPDU.SuccessfulOutcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].Value = GlobalRICID{GlobalRICID: struct {
-               Text         string `xml:",chardata"`
-               PLMNIdentity string `xml:"pLMN-Identity"`
-               RicID        string `xml:"ric-ID"`
-       }{PLMNIdentity:plmnId, RicID:ricId}}
-       msg.E2APPDU.SuccessfulOutcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
-       msg.E2APPDU.SuccessfulOutcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
-               Text                      string `xml:",chardata"`
-               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
-       }{ProtocolIESingleContainer:extractRanFunctionsIDList(request)}}
-       return msg
-}
-
-func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer{
-       list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
-       ids := make([]ProtocolIESingleContainer,len(list.ProtocolIESingleContainer))
-       for i := 0; i< len(ids); i++{
-               ids[i] = convertToRANfunctionID(list, i)
-       }
-       return ids
-}
-
-func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer{
-       id := ProtocolIESingleContainer{}
-       id.ID = "6"
-       id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
-       id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision
-       return id
-}
\ No newline at end of file
index b275587..73ee06b 100644 (file)
 
 package models
 
-import "time"
+import (
+       "time"
+       "unsafe"
+)
 
 type NotificationRequest struct {
        RanName       string
@@ -28,14 +31,20 @@ type NotificationRequest struct {
        Payload       []byte
        StartTime     time.Time
        TransactionId []byte
+       msgSrc unsafe.Pointer
 }
 
-func NewNotificationRequest(ranName string, payload []byte, startTime time.Time, transactionId []byte) *NotificationRequest {
+func NewNotificationRequest(ranName string, payload []byte, startTime time.Time, transactionId []byte, msgSrc unsafe.Pointer) *NotificationRequest {
        return &NotificationRequest{
                ranName,
                len(payload),
                payload,
                startTime,
                transactionId,
+               msgSrc,
        }
 }
+
+func (r NotificationRequest) GetMsgSrc() unsafe.Pointer{
+       return r.msgSrc
+}
index 1971b1e..905823e 100644 (file)
 
 package models
 
+import "unsafe"
+
 type RmrMessage struct {
        MsgType int
        RanName string
        Payload []byte
        XAction []byte
+       msgSrc unsafe.Pointer
 }
 
-func NewRmrMessage(msgType int, ranName string, payload []byte, xAction []byte) *RmrMessage {
+func NewRmrMessage(msgType int, ranName string, payload []byte, xAction []byte, msgSrc unsafe.Pointer) *RmrMessage {
        return &RmrMessage{
-               MsgType: msgType,
-               RanName: ranName,
-               Payload: payload,
-               XAction: xAction,
+               msgType,
+               ranName,
+               payload,
+               xAction,
+               msgSrc,
        }
 }
+
+func (m RmrMessage) GetMsgSrc() unsafe.Pointer{
+       return m.msgSrc
+}
index d247efb..5ec09b9 100644 (file)
@@ -87,6 +87,41 @@ func (ctx *Context) SendMsg(msg *MBuf, printLogs bool) (*MBuf, error) {
        return convertToMBuf(ctx.Logger, currCMBuf), nil
 }
 
+func (ctx *Context) WhSendMsg(msg *MBuf, printLogs bool) (*MBuf, error) {
+       ctx.checkContextInitialized()
+       ctx.Logger.Debugf("#rmrCgoApi.WhSendMsg - Going to wormhole send message. MBuf: %v", *msg)
+
+       whid := C.rmr_wh_open(ctx.RmrCtx, (*C.char)(msg.GetMsgSrc()))           // open direct connection, returns wormhole ID
+       ctx.Logger.Infof("#rmrCgoApi.WhSendMsg - The wormhole id %v has been received", whid)
+       defer C.rmr_wh_close(ctx.RmrCtx, whid)
+
+       allocatedCMBuf := ctx.getAllocatedCRmrMBuf(ctx.Logger, msg, ctx.MaxMsgSize)
+       state := allocatedCMBuf.state
+       if state != RMR_OK {
+               errorMessage := fmt.Sprintf("#rmrCgoApi.WhSendMsg - Failed to get allocated message. state: %v - %s", state, states[int(state)])
+               return nil, errors.New(errorMessage)
+       }
+
+       if printLogs {
+               transactionId := string(*msg.XAction)
+               tmpTid := strings.TrimSpace(transactionId)
+               ctx.Logger.Infof("[E2 Manager -> RMR] #rmrCgoApi.WhSendMsg - Going to send message %v for transaction id: %s", *msg, tmpTid)
+       }
+
+       currCMBuf := C.rmr_wh_send_msg(ctx.RmrCtx, whid, allocatedCMBuf)
+       defer C.rmr_free_msg(currCMBuf)
+
+       state = currCMBuf.state
+
+       if state != RMR_OK {
+               errorMessage := fmt.Sprintf("#rmrCgoApi.WhSendMsg - Failed to send message. state: %v - %s", state, states[int(state)])
+               return nil, errors.New(errorMessage)
+       }
+
+       return convertToMBuf(ctx.Logger, currCMBuf), nil
+}
+
+
 func (ctx *Context) RecvMsg() (*MBuf, error) {
        ctx.checkContextInitialized()
        ctx.Logger.Debugf("#rmrCgoApi.RecvMsg - Going to receive message")
index 5d226a8..77ccb33 100644 (file)
@@ -29,6 +29,7 @@ import (
        "github.com/stretchr/testify/assert"
        "io/ioutil"
        "testing"
+       "unsafe"
 )
 
 var (
@@ -47,7 +48,8 @@ func TestLogger(t *testing.T) {
 }
 
 func TestNewMBufSuccess(t *testing.T) {
-       msg := rmrCgo.NewMBuf(tests.MessageType, len(tests.DummyPayload), "RanName", &tests.DummyPayload, &tests.DummyXAction)
+       var msgSrc unsafe.Pointer
+       msg := rmrCgo.NewMBuf(tests.MessageType, len(tests.DummyPayload), "RanName", &tests.DummyPayload, &tests.DummyXAction, msgSrc)
        assert.NotNil(t, msg)
        assert.NotEmpty(t, msg.Payload)
        assert.NotEmpty(t, msg.XAction)
index d7dcbef..13bfa16 100644 (file)
@@ -31,13 +31,14 @@ import (
        "unsafe"
 )
 
-func NewMBuf(mType int, len int, meid string, payload *[]byte, xAction *[]byte) *MBuf {
+func NewMBuf(mType int, len int, meid string, payload *[]byte, xAction *[]byte, msgSrc unsafe.Pointer) *MBuf {
        return &MBuf{
-               MType:   mType,
-               Len:     len,
-               Meid:    meid,
-               Payload: payload,
-               XAction: xAction,
+               mType,
+               len,
+               meid,
+               payload,
+               xAction,
+               msgSrc,
        }
 }
 
@@ -84,6 +85,7 @@ const (
 const (
        RMR_MAX_XACTION_LEN = int(C.RMR_MAX_XID)
        RMR_MAX_MEID_LEN    = int(C.RMR_MAX_MEID)
+       RMR_MAX_SRC_LEN                 = int(C.RMR_MAX_SRC)
 
        //states
        RMR_OK             = C.RMR_OK
@@ -129,12 +131,17 @@ type MBuf struct {
        Meid    string //Managed entity id (RAN name)
        Payload *[]byte
        XAction *[]byte
+       msgSrc  unsafe.Pointer
 }
 
 func (m MBuf) String() string {
        return fmt.Sprintf("{ MType: %d, Len: %d, Meid: %q, Xaction: %q, Payload: [%x] }", m.MType, m.Len, m.Meid, m.XAction, m.Payload)
 }
 
+func (m MBuf) GetMsgSrc() unsafe.Pointer {
+       return m.msgSrc
+}
+
 type Context struct {
        MaxMsgSize int
        Flags      int
@@ -145,6 +152,7 @@ type Context struct {
 type RmrMessenger interface {
        Init(port string, maxMsgSize int, flags int, logger *logger.Logger) RmrMessenger
        SendMsg(msg *MBuf, printLogs bool) (*MBuf, error)
+       WhSendMsg(msg *MBuf, printLogs bool) (*MBuf, error)
        RecvMsg() (*MBuf, error)
        IsReady() bool
        Close()
index 8b895c0..f26d168 100644 (file)
@@ -45,8 +45,11 @@ func convertToMBuf(logger *logger.Logger, m *C.rmr_mbuf_t) *MBuf {
                Len:   int(m.len),
                Payload: &payloadArr,
                XAction: &xActionArr,
+               msgSrc: C.CBytes(make([]byte, RMR_MAX_SRC_LEN)),
        }
 
+       C.rmr_get_src(m, (*C.uchar)(mbuf.msgSrc)) // Capture message source
+
        meidBuf := make([]byte, RMR_MAX_MEID_LEN)
        if meidCstr := C.rmr_get_meid(m, (*C.uchar)(unsafe.Pointer(&meidBuf[0]))); meidCstr != nil {
                mbuf.Meid =     strings.TrimRight(string(meidBuf), "\000")
index 99478c2..6f54f44 100644 (file)
@@ -24,4 +24,5 @@ rte|1101|10.0.2.15:38000
 rte|12002|10.0.2.15:38000
 rte|12003|10.0.2.15:38000
 mse|12002,10.0.2.15:38000|-1|gnb:208-092-303030
+mse|12003,10.0.2.15:38000|-1|gnb:208-092-303030
 newrt|end
index 10e6a42..5df261d 100644 (file)
@@ -38,8 +38,22 @@ func NewRmrSender(logger *logger.Logger, messenger rmrCgo.RmrMessenger) *RmrSend
        }
 }
 
+func (r *RmrSender) WhSend(rmrMessage *models.RmrMessage) error {
+       msg := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
+
+       _, err := r.messenger.WhSendMsg(msg, true)
+
+       if err != nil {
+               r.logger.Errorf("#RmrSender.WhSend - RAN name: %s , Message type: %d - Failed sending message. Error: %v", rmrMessage.RanName, rmrMessage.MsgType, err)
+               return err
+       }
+
+       r.logger.Infof("#RmrSender.WhSend - RAN name: %s , Message type: %d - Successfully sent RMR message", rmrMessage.RanName, rmrMessage.MsgType)
+       return nil
+}
+
 func (r *RmrSender) Send(rmrMessage *models.RmrMessage) error {
-       msg := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
+       msg := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
 
        _, err := r.messenger.SendMsg(msg, true)
 
@@ -53,7 +67,7 @@ func (r *RmrSender) Send(rmrMessage *models.RmrMessage) error {
 }
 
 func (r *RmrSender) SendWithoutLogs(rmrMessage *models.RmrMessage) error {
-       msg := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction)
+       msg := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc())
 
        _, err := r.messenger.SendMsg(msg, false)
 
index bc45307..0c0129c 100644 (file)
@@ -28,6 +28,7 @@ import (
        "fmt"
        "github.com/stretchr/testify/assert"
        "testing"
+       "unsafe"
 )
 
 func initRmrSenderTest(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock) {
@@ -54,9 +55,10 @@ func TestRmrSenderSendSuccess(t *testing.T) {
        ranName := "test"
        payload := []byte("some payload")
        var xAction []byte
-       mbuf := rmrCgo.NewMBuf(123, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       mbuf := rmrCgo.NewMBuf(123, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil)
-       rmrMsg := models.NewRmrMessage(123, ranName, payload, xAction)
+       rmrMsg := models.NewRmrMessage(123, ranName, payload, xAction, nil)
        rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
        rmrSender := NewRmrSender(logger, rmrMessenger)
        err := rmrSender.Send(rmrMsg)
@@ -71,9 +73,10 @@ func TestRmrSenderSendFailure(t *testing.T) {
        ranName := "test"
        payload := []byte("some payload")
        var xAction []byte
-       mbuf := rmrCgo.NewMBuf(123, len(payload), ranName, &payload, &xAction)
+       var msgSrc unsafe.Pointer
+       mbuf := rmrCgo.NewMBuf(123, len(payload), ranName, &payload, &xAction, msgSrc)
        rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, fmt.Errorf("rmr send failure"))
-       rmrMsg := models.NewRmrMessage(123, ranName, payload, xAction)
+       rmrMsg := models.NewRmrMessage(123, ranName, payload, xAction, nil)
        rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
        rmrSender := NewRmrSender(logger, rmrMessenger)
        err := rmrSender.Send(rmrMsg)