From: idanshal Date: Sun, 7 Jun 2020 09:52:57 +0000 (+0300) Subject: [RIC-436] Fix E2 Setup Response population X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=5772b9f7dde7bac867af32f439bae4078b052dca;p=ric-plt%2Fe2mgr.git [RIC-436] Fix E2 Setup Response population Change-Id: I8bf3009625433c068b9ea315ec37874a88842a6e Signed-off-by: idanshal --- diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go index 9d45c16..8712194 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -20,6 +20,7 @@ package rmrmsghandlers import ( + "bytes" "e2mgr/configuration" "e2mgr/managers" "e2mgr/mocks" @@ -27,9 +28,11 @@ import ( "e2mgr/rmrCgo" "e2mgr/services" "e2mgr/tests" + "encoding/xml" "errors" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" + "github.com/golang/protobuf/ptypes/wrappers" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "io/ioutil" @@ -45,6 +48,7 @@ const ( EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml" NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml" EnbSetupRequestXmlPath = "../../tests/resources/setupRequest_enb.xml" + GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb_without_functions.xml" ) func readXmlFile(t *testing.T, xmlPath string) []byte { @@ -127,8 +131,28 @@ func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) { var gnb *entities.NodebInfo readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} - setupRequest, e2tIpAddress, _ := handler.parseSetupRequest(notificationRequest.Payload) - nodebInfo, _ := handler.buildNodebInfo(nodebRanName, e2tIpAddress, setupRequest) + nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload) + writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil) + routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil) + writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) + e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) + var errEmpty error + rmrMessage := &rmrCgo.MBuf{} + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) + handler.Handle(notificationRequest) + writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) + assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) +} + +func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t *testing.T) { + xmlGnb := readXmlFile(t, GnbWithoutFunctionsSetupRequestXmlPath) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + var e2tInstance = &entities.E2TInstance{} + e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) + var gnb *entities.NodebInfo + readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} + nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload) writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil) routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil) writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) @@ -198,18 +222,81 @@ func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil) notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} - setupRequest, _, _ := handler.parseSetupRequest(notificationRequest.Payload) - _ = handler.setGnbFunctions(gnb, setupRequest) + gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload) + writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil) + e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) + var errEmpty error + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty) + handler.Handle(notificationRequest) + writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate) + assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) +} + +func TestE2SetupRequestNotificationHandler_HandleExistingGnbWithFunctionsSuccess(t *testing.T) { + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - writerMock.On("UpdateNodebInfo", gnb).Return(nil) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + var e2tInstance = &entities.E2TInstance{} + e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) + var gnb = &entities.NodebInfo{ + RanName: nodebRanName, + AssociatedE2TInstanceAddress: e2tInstanceFullAddress, + ConnectionStatus: entities.ConnectionStatus_CONNECTED, + NodeType: entities.Node_GNB, + Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{RanFunctions: []*entities.RanFunction{ + { + RanFunctionId: &wrappers.UInt32Value{Value:2}, + RanFunctionRevision: &wrappers.UInt32Value{Value:2}, + }, + }}}, + } + readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil) + routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil) + + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} + gnbToUpdate := getExpectedNodebWithFunctionsForExistingRan(*gnb, notificationRequest.Payload) + + writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil) e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) var errEmpty error rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty) handler.Handle(notificationRequest) - writerMock.AssertCalled(t, "UpdateNodebInfo", gnb) + writerMock.AssertCalled(t, "UpdateNodebInfo", gnbToUpdate) assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } +func getExpectedNodebWithFunctionsForExistingRan(nodeb entities.NodebInfo , payload []byte) *entities.NodebInfo { + pipInd := bytes.IndexByte(payload, '|') + setupRequest := &models.E2SetupRequestMessage{} + _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU) + nodeb.GetGnb().RanFunctions = setupRequest.ExtractRanFunctionsList() + return &nodeb +} + +func getExpectedNodebWithFunctionsForNewRan(payload []byte) *entities.NodebInfo { + pipInd := bytes.IndexByte(payload, '|') + setupRequest := &models.E2SetupRequestMessage{} + _ = xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU) + + nodeb := &entities.NodebInfo{ + AssociatedE2TInstanceAddress: e2tInstanceFullAddress, + ConnectionStatus: entities.ConnectionStatus_CONNECTED, + RanName: nodebRanName, + NodeType: entities.Node_GNB, + Configuration: &entities.NodebInfo_Gnb{ + Gnb: &entities.Gnb{ + RanFunctions: setupRequest.ExtractRanFunctionsList(), + }, + }, + GlobalNbId: &entities.GlobalNbId{ + PlmnId: setupRequest.GetPlmnId(), + NbId: setupRequest.GetNbId(), + }, + } + + return nodeb +} + func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) diff --git a/E2Manager/models/e2_setup_response_message.go b/E2Manager/models/e2_setup_response_message.go index f4e3d30..f689fb6 100644 --- a/E2Manager/models/e2_setup_response_message.go +++ b/E2Manager/models/e2_setup_response_message.go @@ -69,14 +69,22 @@ var timeToWaitMap = map[TimeToWait]interface{}{ func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage { outcome := SuccessfulOutcome{} - outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, 2) outcome.ProcedureCode = "1" + + e2SetupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs + + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, len(e2SetupRequestIes)) 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}} + + if len(e2SetupRequestIes) < 2 { + return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}} + } + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9" outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct { Text string `xml:",chardata"` diff --git a/E2Manager/tests/resources/setupRequest_gnb_without_functions.xml b/E2Manager/tests/resources/setupRequest_gnb_without_functions.xml new file mode 100644 index 0000000..db28387 --- /dev/null +++ b/E2Manager/tests/resources/setupRequest_gnb_without_functions.xml @@ -0,0 +1,34 @@ + + + 1 + + + + + + + + 3 + + + + + + + + 13 F1 84 + + + 00000000000000010000001000000001 + + + + + + + + + + + + \ No newline at end of file