From: idanshal Date: Sun, 31 May 2020 07:55:45 +0000 (+0300) Subject: [RIC-384] Final changes X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=776a6bf3ebfdac738b282a5409bee567118fb1ed;hp=3e56457a6f08b1d3b89836ed7782cf3744a29ba6;p=ric-plt%2Fe2mgr.git [RIC-384] Final changes Change-Id: I82f5aa2c64230d8ddf064efb8b369e08279034ed Signed-off-by: idanshal --- diff --git a/Automation/Tests/Resource/resource.robot b/Automation/Tests/Resource/resource.robot index 29e15f8..dcfe8d5 100644 --- a/Automation/Tests/Resource/resource.robot +++ b/Automation/Tests/Resource/resource.robot @@ -28,7 +28,7 @@ Documentation Resource file ${docker_number} 5 ${docker_number-1} 4 ${url} http://localhost:3800 -${ranName} gnb:208-092-303030 +${ranName} gnb_208_092_303030 ${getNodeb} /v1/nodeb/${ranName} ${update_gnb_url} /v1/nodeb/${ranName}/update ${update_gnb_body} {"servedNrCells":[{"servedNrCellInformation":{"cellId":"abcd","choiceNrMode":{"fdd":{}},"nrMode":1,"nrPci":1,"servedPlmns":["whatever"]},"nrNeighbourInfos":[{"nrCgi":"one","choiceNrMode":{"fdd":{}},"nrMode":1,"nrPci":1}]}]} diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go index 3e58c31..e50829d 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go @@ -133,14 +133,12 @@ func (h E2SetupRequestNotificationHandler) handleNewRan(ranName string, e2tIpAdd } func (h E2SetupRequestNotificationHandler) setGnbFunctions(nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) error { - ranFunctions, err := setupRequest.ExtractRanFunctionsList() + ranFunctions := setupRequest.ExtractRanFunctionsList() - if err != nil { - h.logger.Errorf("#E2SetupRequestNotificationHandler.setGnbFunctions - RAN name: %s - failed to update nodebInfo entity. Error: %s", nodebInfo.GetRanName(), err) - return err + if ranFunctions != nil { + nodebInfo.GetGnb().RanFunctions = ranFunctions } - nodebInfo.GetGnb().RanFunctions = ranFunctions return nil } @@ -231,22 +229,20 @@ func (h E2SetupRequestNotificationHandler) parseSetupRequest(payload []byte) (*m h.logger.Infof("#E2SetupRequestNotificationHandler.parseSetupRequest - payload: %s", payload[pipInd+1:]) setupRequest := &models.E2SetupRequestMessage{} - err := xml.Unmarshal(payload[pipInd+1:], &setupRequest.E2APPDU) + err := xml.Unmarshal(normalizeXml(payload[pipInd+1:]), &setupRequest.E2APPDU) if err != nil { return nil, "", errors.New(fmt.Sprintf("#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: %x", payload)) } - ranFunctionsList := setupRequest.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList.ProtocolIESingleContainer - - for i := 0; i < len(ranFunctionsList); i++ { - def := models.E2smGnbNrtRanFunctionDefinition{} - err = xml.Unmarshal([]byte(ranFunctionsList[i].Value.RANfunctionItem.RanFunctionDefinition.Text), &def) - ranFunctionsList[i].Value.RANfunctionItem.RanFunctionDefinition.E2smGnbNrtRanFunctionDefinition = def - } - return setupRequest, e2tIpAddress, nil } +func normalizeXml(payload []byte) []byte { + xmlStr := string(payload) + normalized := strings.NewReplacer("<", "<", ">", ">").Replace(xmlStr) + return []byte(normalized) +} + func (h E2SetupRequestNotificationHandler) buildNodebInfo(ranName string, e2tAddress string, request *models.E2SetupRequestMessage) (*entities.NodebInfo, error) { var err error 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 22d8d45..9d45c16 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -65,8 +65,8 @@ func TestParseGnbSetupRequest_Success(t *testing.T) { handler, _, _, _, _, _ := initMocks(t) prefBytes := []byte(prefix) request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...)) - assert.Equal(t, "131014", request.GetPlmnId()) - assert.Equal(t, "10011001101010101011", request.GetNbId()) + assert.Equal(t, "02F829", request.GetPlmnId()) + assert.Equal(t, "001100000011000000110000", request.GetNbId()) assert.Nil(t, err) } @@ -126,16 +126,18 @@ func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) { e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) var gnb *entities.NodebInfo readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) - writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} + setupRequest, e2tIpAddress, _ := handler.parseSetupRequest(notificationRequest.Payload) + nodebInfo, _ := handler.buildNodebInfo(nodebRanName, e2tIpAddress, setupRequest) + 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) - prefBytes := []byte(prefix) - notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)} handler.Handle(notificationRequest) + writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } @@ -194,14 +196,17 @@ func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T } readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil) routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil) - writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) + + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} + setupRequest, _, _ := handler.parseSetupRequest(notificationRequest.Payload) + _ = handler.setGnbFunctions(gnb, setupRequest) + + writerMock.On("UpdateNodebInfo", gnb).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) - prefBytes := []byte(prefix) - notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)} + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty) handler.Handle(notificationRequest) + writerMock.AssertCalled(t, "UpdateNodebInfo", gnb) assertExistingNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } diff --git a/E2Manager/models/e2_setup_request_message.go b/E2Manager/models/e2_setup_request_message.go index 0515298..e61d498 100644 --- a/E2Manager/models/e2_setup_request_message.go +++ b/E2Manager/models/e2_setup_request_message.go @@ -263,21 +263,29 @@ type RANfunctionsList struct { } `xml:"ProtocolIE-SingleContainer"` } -func (m *E2SetupRequestMessage) ExtractRanFunctionsList() ([]*entities.RanFunction, error) { - list := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList.ProtocolIESingleContainer - funcs := make([]*entities.RanFunction, len(list)) +func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction { + // TODO: verify e2SetupRequestIEs structure with Adi + e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs + if len(e2SetupRequestIes) < 2 { + return nil + } + + ranFunctionsListContainer := e2SetupRequestIes[1].Value.RANfunctionsList.ProtocolIESingleContainer + funcs := make([]*entities.RanFunction, len(ranFunctionsListContainer)) for i := 0; i < len(funcs); i++ { - funcs[i] = &entities.RanFunction{} - funcs[i].RanFunctionId = &wrappers.UInt32Value{Value: list[i].Value.RANfunctionItem.RanFunctionID} - def, _ := m.buildRanFunctionDefinitionProto(&list[i].Value.RANfunctionItem.RanFunctionDefinition) - funcs[i].RanFunctionDefinition = def - funcs[i].RanFunctionRevision = &wrappers.UInt32Value{Value: list[i].Value.RANfunctionItem.RanFunctionRevision} + ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem + + funcs[i] = &entities.RanFunction{ + RanFunctionId: &wrappers.UInt32Value{Value: ranFunctionItem.RanFunctionID}, + RanFunctionDefinition: m.buildRanFunctionDefinitionProto(&ranFunctionItem.RanFunctionDefinition), + RanFunctionRevision: &wrappers.UInt32Value{Value: ranFunctionItem.RanFunctionRevision}, + } } - return funcs, nil + return funcs } -func (m *E2SetupRequestMessage) buildRanFunctionDefinitionProto(def *RanFunctionDefinition) (*entities.RanFunctionDefinition, error) { - defProto := &entities.RanFunctionDefinition{ +func (m *E2SetupRequestMessage) buildRanFunctionDefinitionProto(def *RanFunctionDefinition) *entities.RanFunctionDefinition { + return &entities.RanFunctionDefinition{ E2SmGnbNrtRanFunctionDefinition: &entities.E2SmGnbNrtRanFunctionDefinition{ RanFunctionName: buildRanFunctionNameProto(def), RicEventTriggerStyles: buildRicEventTriggerStylesProto(def), @@ -287,8 +295,6 @@ func (m *E2SetupRequestMessage) buildRanFunctionDefinitionProto(def *RanFunction RicPolicyStyles: buildRicPolicyStylesProto(def), }, } - - return defProto, nil } func buildRanFunctionNameProto(def *RanFunctionDefinition) *entities.RanFunctionName { @@ -313,10 +319,11 @@ func buildRicEventTriggerStylesProto(def *RanFunctionDefinition) []*entities.Ric ricEventTriggerStyles := make([]*entities.RicEventTriggerStyle, len(defRicEventTriggerStyleList)) for i, v := range defRicEventTriggerStyleList { - ricEventTriggerStyles[i] = &entities.RicEventTriggerStyle{} - ricEventTriggerStyles[i].RicEventTriggerStyleType = &wrappers.UInt32Value{Value: v.RicEventTriggerStyleType} - ricEventTriggerStyles[i].RicEventTriggerStyleName = &wrappers.StringValue{Value: v.RicEventTriggerStyleName} - ricEventTriggerStyles[i].RicEventTriggerFormatType = &wrappers.UInt32Value{Value: v.RicEventTriggerFormatType} + ricEventTriggerStyles[i] = &entities.RicEventTriggerStyle{ + RicEventTriggerStyleType: &wrappers.UInt32Value{Value: v.RicEventTriggerStyleType}, + RicEventTriggerStyleName: &wrappers.StringValue{Value: v.RicEventTriggerStyleName}, + RicEventTriggerFormatType: &wrappers.UInt32Value{Value: v.RicEventTriggerFormatType}, + } } return ricEventTriggerStyles @@ -327,13 +334,14 @@ func buildRicReportStylesProto(def *RanFunctionDefinition) []*entities.RicReport ricReportStyles := make([]*entities.RicReportStyle, len(defRicReportStyleList)) for i, v := range defRicReportStyleList { - ricReportStyles[i] = &entities.RicReportStyle{} - ricReportStyles[i].RicReportStyleType = &wrappers.UInt32Value{Value: v.RicReportStyleType} - ricReportStyles[i].RicReportStyleName = &wrappers.StringValue{Value: v.RicReportStyleName} - ricReportStyles[i].RicReportActionFormatType = &wrappers.UInt32Value{Value: v.RicReportActionFormatType} - ricReportStyles[i].RicReportRanParameterDefs = buildRicReportRanParameterDefsProto(v) - ricReportStyles[i].RicIndicationHeaderFormatType = &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType} - ricReportStyles[i].RicIndicationMessageFormatType = &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType} + ricReportStyles[i] = &entities.RicReportStyle{ + RicReportStyleType: &wrappers.UInt32Value{Value: v.RicReportStyleType}, + RicReportStyleName: &wrappers.StringValue{Value: v.RicReportStyleName}, + RicReportActionFormatType: &wrappers.UInt32Value{Value: v.RicReportActionFormatType}, + RicReportRanParameterDefs: buildRicReportRanParameterDefsProto(v), + RicIndicationHeaderFormatType: &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType}, + RicIndicationMessageFormatType: &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType}, + } } return ricReportStyles @@ -344,10 +352,11 @@ func buildRicReportRanParameterDefsProto(ricReportStyleList RicReportStyleList) ranParameterDefs := make([]*entities.RanParameterDef, len(ricReportRanParameterDefList)) for i, v := range ricReportRanParameterDefList { - ranParameterDefs[i] = &entities.RanParameterDef{} - ranParameterDefs[i].RanParameterId = &wrappers.UInt32Value{Value: v.RanParameterID} - ranParameterDefs[i].RanParameterName = &wrappers.StringValue{Value: v.RanParameterName} - ranParameterDefs[i].RanParameterType = getRanParameterTypeEnumValue(v.RanParameterType) + ranParameterDefs[i] = &entities.RanParameterDef{ + RanParameterId: &wrappers.UInt32Value{Value: v.RanParameterID}, + RanParameterName: &wrappers.StringValue{Value: v.RanParameterName}, + RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType), + } } return ranParameterDefs @@ -386,14 +395,15 @@ func buildRicInsertStylesProto(def *RanFunctionDefinition) []*entities.RicInsert ricInsertStyles := make([]*entities.RicInsertStyle, len(defRicInsertStyleList)) for i, v := range defRicInsertStyleList { - ricInsertStyles[i] = &entities.RicInsertStyle{} - ricInsertStyles[i].RicInsertStyleType = &wrappers.UInt32Value{Value: v.RicInsertStyleType} - ricInsertStyles[i].RicInsertStyleName = &wrappers.StringValue{Value: v.RicInsertStyleName} - ricInsertStyles[i].RicInsertActionFormatType = &wrappers.UInt32Value{Value: v.RicInsertActionFormatType} - ricInsertStyles[i].RicInsertRanParameterDefs = buildRicInsertRanParameterDefsProto(v) - ricInsertStyles[i].RicIndicationHeaderFormatType = &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType} - ricInsertStyles[i].RicIndicationMessageFormatType = &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType} - ricInsertStyles[i].RicCallProcessIdFormatType = &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType} + ricInsertStyles[i] = &entities.RicInsertStyle{ + RicInsertStyleType: &wrappers.UInt32Value{Value: v.RicInsertStyleType}, + RicInsertStyleName: &wrappers.StringValue{Value: v.RicInsertStyleName}, + RicInsertActionFormatType: &wrappers.UInt32Value{Value: v.RicInsertActionFormatType}, + RicInsertRanParameterDefs: buildRicInsertRanParameterDefsProto(v), + RicIndicationHeaderFormatType: &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType}, + RicIndicationMessageFormatType: &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType}, + RicCallProcessIdFormatType: &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType}, + } } return ricInsertStyles @@ -404,10 +414,11 @@ func buildRicInsertRanParameterDefsProto(ricInsertStyleList RicInsertStyleList) ranParameterDefs := make([]*entities.RanParameterDef, len(ricInsertRanParameterDefList)) for i, v := range ricInsertRanParameterDefList { - ranParameterDefs[i] = &entities.RanParameterDef{} - ranParameterDefs[i].RanParameterId = &wrappers.UInt32Value{Value: v.RanParameterID} - ranParameterDefs[i].RanParameterName = &wrappers.StringValue{Value: v.RanParameterName} - ranParameterDefs[i].RanParameterType = getRanParameterTypeEnumValue(v.RanParameterType) + ranParameterDefs[i] = &entities.RanParameterDef{ + RanParameterId: &wrappers.UInt32Value{Value: v.RanParameterID}, + RanParameterName: &wrappers.StringValue{Value: v.RanParameterName}, + RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType), + } } return ranParameterDefs @@ -418,12 +429,13 @@ func buildRicControlStylesProto(def *RanFunctionDefinition) []*entities.RicContr ricControlStyles := make([]*entities.RicControlStyle, len(defRicControlStyleList)) for i, v := range defRicControlStyleList { - ricControlStyles[i] = &entities.RicControlStyle{} - ricControlStyles[i].RicControlStyleType = &wrappers.UInt32Value{Value: v.RicControlStyleType} - ricControlStyles[i].RicControlStyleName = &wrappers.StringValue{Value: v.RicControlStyleName} - ricControlStyles[i].RicControlHeaderFormatType = &wrappers.UInt32Value{Value: v.RicControlHeaderFormatType} - ricControlStyles[i].RicControlMessageFormatType = &wrappers.UInt32Value{Value: v.RicControlMessageFormatType} - ricControlStyles[i].RicCallProcessIdFormatType = &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType} + ricControlStyles[i] = &entities.RicControlStyle{ + RicControlStyleType: &wrappers.UInt32Value{Value: v.RicControlStyleType}, + RicControlStyleName: &wrappers.StringValue{Value: v.RicControlStyleName}, + RicControlHeaderFormatType: &wrappers.UInt32Value{Value: v.RicControlHeaderFormatType}, + RicControlMessageFormatType: &wrappers.UInt32Value{Value: v.RicControlMessageFormatType}, + RicCallProcessIdFormatType: &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType}, + } } return ricControlStyles @@ -434,10 +446,11 @@ func buildRicPolicyRanParameterDefsProto(ricPolicyStyleList RicPolicyStyleList) ranParameterDefs := make([]*entities.RanParameterDef, len(ricPolicyRanParameterDefList)) for i, v := range ricPolicyRanParameterDefList { - ranParameterDefs[i] = &entities.RanParameterDef{} - ranParameterDefs[i].RanParameterId = &wrappers.UInt32Value{Value: v.RanParameterID} - ranParameterDefs[i].RanParameterName = &wrappers.StringValue{Value: v.RanParameterName} - ranParameterDefs[i].RanParameterType = getRanParameterTypeEnumValue(v.RanParameterType) + ranParameterDefs[i] = &entities.RanParameterDef{ + RanParameterId: &wrappers.UInt32Value{Value: v.RanParameterID}, + RanParameterName: &wrappers.StringValue{Value: v.RanParameterName}, + RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType), + } } return ranParameterDefs @@ -448,11 +461,12 @@ func buildRicPolicyStylesProto(def *RanFunctionDefinition) []*entities.RicPolicy ricPolicyStyles := make([]*entities.RicPolicyStyle, len(defRicPolicyStyleList)) for i, v := range defRicPolicyStyleList { - ricPolicyStyles[i] = &entities.RicPolicyStyle{} - ricPolicyStyles[i].RicPolicyStyleType = &wrappers.UInt32Value{Value: v.RicPolicyStyleType} - ricPolicyStyles[i].RicPolicyStyleName = &wrappers.StringValue{Value: v.RicPolicyStyleName} - ricPolicyStyles[i].RicPolicyActionFormatType = &wrappers.UInt32Value{Value: v.RicPolicyActionFormatType} - ricPolicyStyles[i].RicPolicyRanParameterDefs = buildRicPolicyRanParameterDefsProto(v) + ricPolicyStyles[i] = &entities.RicPolicyStyle{ + RicPolicyStyleType: &wrappers.UInt32Value{Value: v.RicPolicyStyleType}, + RicPolicyStyleName: &wrappers.StringValue{Value: v.RicPolicyStyleName}, + RicPolicyActionFormatType: &wrappers.UInt32Value{Value: v.RicPolicyActionFormatType}, + RicPolicyRanParameterDefs: buildRicPolicyRanParameterDefsProto(v), + } } return ricPolicyStyles diff --git a/E2Manager/tests/resources/setupRequest_gnb.xml b/E2Manager/tests/resources/setupRequest_gnb.xml index b947ae2..faf4fc2 100644 --- a/E2Manager/tests/resources/setupRequest_gnb.xml +++ b/E2Manager/tests/resources/setupRequest_gnb.xml @@ -1,68 +1 @@ - - - 1 - - - - - - - - 3 - - - - - - - - 13 10 14 - - 10011001101010101011 - - - - - - - - 10 - - - - - - - 8 - - - - - - 1 - 334455 - 0 - - - - - 8 - - - - - - 7 - 334455 - 0 - - - - - - - - - - - \ No newline at end of file +1302 F8 29 001100000011000000110000 1081 gNB-X2 1.3.6.1.4.1.28458.99.0.21.3.3.1.2 gNB X2 Network Interface 0 1 Message Type only 1 1 Complete message 1 1 AddTimestamp 1 1 1 Complete message 1 1 AddTimestamp 1 1 1 1 Complete message 1 1 1 182 gNB-NRT 1.3.6.1.4.1.28458.99.0.21.3.3.3.3 gNB Neighbour Relation Table 1 Notification 1 1 Complete table 1 1 AddTimestamp 1 1 1 NRT modification 1 1 0 183 gNB-X2 1.3.6.1.4.1.28458.99.0.21.3.3.1.2 gNB X2 Network Interface 1 1 Message Type only 1 1 Message Admission 2 1 QCI1 2 ARP1 3 SPID 4 U-TEID1 10 Load_offset 1 \ No newline at end of file