From 0823945d1b5a326844833187a36bea669752be93 Mon Sep 17 00:00:00 2001 From: idanshal Date: Thu, 30 Apr 2020 17:41:39 +0300 Subject: [PATCH] [RIC-346] update ng-eNB and eNB node types and add tests Change-Id: If50ea7229c05bdeda080512d08d3a266faea88e5 Signed-off-by: idanshal --- .../e2_setup_request_notification_handler.go | 43 +++-- .../e2_setup_request_notification_handler_test.go | 192 ++++++++------------- E2Manager/models/e2_setup_request_message.go | 109 ++++++++---- E2Manager/models/e2_setup_response_message.go | 105 ++++++----- E2Manager/tests/resources/setupRequest_enb.xml | 68 ++++++++ E2Manager/tests/resources/setupRequest_ng-eNB.xml | 6 +- 6 files changed, 305 insertions(+), 218 deletions(-) create mode 100644 E2Manager/tests/resources/setupRequest_enb.xml diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go index d71810e..9ea0ef5 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go @@ -132,16 +132,11 @@ func (h E2SetupRequestNotificationHandler) handleNewRan(ranName string, e2tIpAdd return nodebInfo, nil } -func (h E2SetupRequestNotificationHandler) handleExistingRan(ranName string, nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) error { - if nodebInfo.GetConnectionStatus() == entities.ConnectionStatus_SHUTTING_DOWN { - h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s, connection status: %s - nodeB entity in incorrect state", ranName, nodebInfo.ConnectionStatus) - return errors.New("nodeB entity in incorrect state") - } - +func (h E2SetupRequestNotificationHandler) setGnbFunctions(nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) error { ranFunctions, err := setupRequest.ExtractRanFunctionsList() if err != nil { - h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s - failed to update nodebInfo entity. Error: %s", ranName, err) + h.logger.Errorf("#E2SetupRequestNotificationHandler.setGnbFunctions - RAN name: %s - failed to update nodebInfo entity. Error: %s", nodebInfo.GetRanName(), err) return err } @@ -149,6 +144,16 @@ func (h E2SetupRequestNotificationHandler) handleExistingRan(ranName string, nod return nil } +func (h E2SetupRequestNotificationHandler) handleExistingRan(ranName string, nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) error { + if nodebInfo.GetConnectionStatus() == entities.ConnectionStatus_SHUTTING_DOWN { + h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s, connection status: %s - nodeB entity in incorrect state", ranName, nodebInfo.ConnectionStatus) + return errors.New("nodeB entity in incorrect state") + } + + err := h.setGnbFunctions(nodebInfo, setupRequest) + return err +} + 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) @@ -222,6 +227,9 @@ func (h E2SetupRequestNotificationHandler) parseSetupRequest(payload []byte) (*m if len(e2tIpAddress) == 0 { return nil, "", errors.New("#E2SetupRequestNotificationHandler.parseSetupRequest - Empty E2T Address received") } + + h.logger.Infof("#E2SetupRequestNotificationHandler.parseSetupRequest - payload: %s", payload[pipInd+1:]) + setupRequest := &models.E2SetupRequestMessage{} err := xml.Unmarshal(payload[pipInd+1:], &setupRequest.E2APPDU) if err != nil { @@ -232,6 +240,7 @@ func (h E2SetupRequestNotificationHandler) parseSetupRequest(payload []byte) (*m } func (h E2SetupRequestNotificationHandler) buildNodebInfo(ranName string, e2tAddress string, request *models.E2SetupRequestMessage) (*entities.NodebInfo, error) { + var err error nodebInfo := &entities.NodebInfo{ AssociatedE2TInstanceAddress: e2tAddress, @@ -239,21 +248,23 @@ func (h E2SetupRequestNotificationHandler) buildNodebInfo(ranName string, e2tAdd RanName: ranName, NodeType: entities.Node_GNB, Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}}, - GlobalNbId: &entities.GlobalNbId{ - PlmnId: request.GetPlmnId(), - NbId: request.GetNbId(), - }, + GlobalNbId: h.buildGlobalNbId(request), } - nodebInfo.GetGnb().RanFunctions, err = request.ExtractRanFunctionsList() + + err = h.setGnbFunctions(nodebInfo, request) return nodebInfo, err } +func (h E2SetupRequestNotificationHandler) buildGlobalNbId(setupRequest *models.E2SetupRequestMessage) *entities.GlobalNbId { + return &entities.GlobalNbId{ + PlmnId: setupRequest.GetPlmnId(), + NbId: setupRequest.GetNbId(), + } +} + func (h E2SetupRequestNotificationHandler) buildNbIdentity(ranName string, setupRequest *models.E2SetupRequestMessage) *entities.NbIdentity { return &entities.NbIdentity{ InventoryName: ranName, - GlobalNbId: &entities.GlobalNbId{ - PlmnId: setupRequest.GetPlmnId(), - NbId: setupRequest.GetNbId(), - }, + GlobalNbId: h.buildGlobalNbId(setupRequest), } } 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 341bd43..22d8d45 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -38,36 +38,70 @@ import ( ) const ( - prefix = "10.0.2.15:9999|" - e2tInstanceFullAddress = "10.0.2.15:9999" - nodebRanName = "gnb:310-410-b5c67788" + prefix = "10.0.2.15:9999|" + e2tInstanceFullAddress = "10.0.2.15:9999" + nodebRanName = "gnb:310-410-b5c67788" + GnbSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb.xml" + EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml" + NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml" + EnbSetupRequestXmlPath = "../../tests/resources/setupRequest_enb.xml" ) -func TestParseSetupRequest_Success(t *testing.T){ - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") +func readXmlFile(t *testing.T, xmlPath string) []byte { + path, err := filepath.Abs(xmlPath) if err != nil { t.Fatal(err) } - xmlGnb, err := ioutil.ReadFile(path) + xmlAsBytes, err := ioutil.ReadFile(path) if err != nil { t.Fatal(err) } + + return xmlAsBytes +} + +func TestParseGnbSetupRequest_Success(t *testing.T) { + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) handler, _, _, _, _, _ := initMocks(t) prefBytes := []byte(prefix) request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...)) - assert.Equal(t, request.GetPlmnId(), "131014") - assert.Equal(t, request.GetNbId(), "10011001101010101011") + assert.Equal(t, "131014", request.GetPlmnId()) + assert.Equal(t, "10011001101010101011", request.GetNbId()) + assert.Nil(t, err) } -func TestParseSetupRequest_PipFailure(t *testing.T){ - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } +func TestParseEnGnbSetupRequest_Success(t *testing.T) { + enGnbXml := readXmlFile(t, EnGnbSetupRequestXmlPath) + handler, _, _, _, _, _ := initMocks(t) + prefBytes := []byte(prefix) + request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...)) + assert.Equal(t, "131014", request.GetPlmnId()) + assert.Equal(t, "11000101110001101100011111111000", request.GetNbId()) + assert.Nil(t, err) +} + +func TestParseNgEnbSetupRequest_Success(t *testing.T) { + ngEnbXml := readXmlFile(t, NgEnbSetupRequestXmlPath) + handler, _, _, _, _, _ := initMocks(t) + prefBytes := []byte(prefix) + request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...)) + assert.Equal(t, "131014", request.GetPlmnId()) + assert.Equal(t, "101010101010101010", request.GetNbId()) + assert.Nil(t, err) +} + +func TestParseEnbSetupRequest_Success(t *testing.T) { + enbXml := readXmlFile(t, EnbSetupRequestXmlPath) + handler, _, _, _, _, _ := initMocks(t) + prefBytes := []byte(prefix) + request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...)) + assert.Equal(t, "6359AB", request.GetPlmnId()) + assert.Equal(t, "101010101010101010", request.GetNbId()) + assert.Nil(t, err) +} + +func TestParseSetupRequest_PipFailure(t *testing.T) { + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) handler, _, _, _, _, _ := initMocks(t) prefBytes := []byte("10.0.2.15:9999") request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...)) @@ -76,25 +110,17 @@ func TestParseSetupRequest_PipFailure(t *testing.T){ assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error parsing E2 Setup Request failed extract Payload: no | separator found") } -func TestParseSetupRequest_UnmarshalFailure(t *testing.T){ +func TestParseSetupRequest_UnmarshalFailure(t *testing.T) { handler, _, _, _, _, _ := initMocks(t) prefBytes := []byte(prefix) - request, _, err := handler.parseSetupRequest(append(prefBytes, 1,2,3)) + request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3)) assert.Nil(t, request) assert.NotNil(t, err) assert.EqualError(t, err, "#E2SetupRequestNotificationHandler.parseSetupRequest - Error unmarshalling E2 Setup Request payload: 31302e302e322e31353a393939397c010203") } func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } - + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) var e2tInstance = &entities.E2TInstance{} e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) @@ -114,15 +140,7 @@ func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) { } func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_en-gNB.xml") - if err != nil { - t.Fatal(err) - } - xmlEnGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } - + xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath) handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) var e2tInstance = &entities.E2TInstance{} e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) @@ -142,15 +160,7 @@ func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) { } func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_ng-eNB.xml") - if err != nil { - t.Fatal(err) - } - xmlEnGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } - + xmlNgEnb := readXmlFile(t, NgEnbSetupRequestXmlPath) handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) var e2tInstance = &entities.E2TInstance{} e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) @@ -164,30 +174,23 @@ func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) { rmrMessage := &rmrCgo.MBuf{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) prefBytes := []byte(prefix) - notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)} + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlNgEnb...)} handler.Handle(notificationRequest) assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) 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, + RanName: nodebRanName, AssociatedE2TInstanceAddress: e2tInstanceFullAddress, - ConnectionStatus: entities.ConnectionStatus_CONNECTED, - NodeType: entities.Node_GNB, - Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}}, + ConnectionStatus: entities.ConnectionStatus_CONNECTED, + NodeType: entities.Node_GNB, + Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}}, } readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil) routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil) @@ -203,14 +206,7 @@ func TestE2SetupRequestNotificationHandler_HandleExistingGnbSuccess(t *testing.T } func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) prefBytes := []byte("invalid_prefix") @@ -238,17 +234,9 @@ func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) { } func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } - + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) - var e2tInstance * entities.E2TInstance + var e2tInstance *entities.E2TInstance e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, common.NewResourceNotFoundError("Not found")) prefBytes := []byte(prefix) notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)} @@ -263,14 +251,8 @@ func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing. } func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) + handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t) var e2tInstance = &entities.E2TInstance{} e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) @@ -289,14 +271,7 @@ func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) { } func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) var e2tInstance = &entities.E2TInstance{} @@ -323,22 +298,13 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) rmrMessengerMock.AssertCalled(t, "WhSendMsg", mock.Anything, mock.Anything) } - -func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T){ - - path, err :=filepath.Abs("../../tests/resources/setupRequest_en-gNB.xml") - if err != nil { - t.Fatal(err) - } - xmlEnGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } +func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) { + xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath) logger := tests.InitLog(t) config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct { PlmnId string RicNearRtId string - }{PlmnId : "131014", RicNearRtId: "10011001101010101011"}} + }{PlmnId: "131014", RicNearRtId: "10011001101010101011"}} rmrMessengerMock := &mocks.RmrMessengerMock{} rmrSender := tests.InitRmrSender(rmrMessengerMock, logger) readerMock := &mocks.RnibReaderMock{} @@ -373,17 +339,9 @@ func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing. } func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t *testing.T) { - path, err :=filepath.Abs("../../tests/resources/setupRequest_gnb.xml") - if err != nil { - t.Fatal(err) - } - xmlGnb, err := ioutil.ReadFile(path) - if err != nil { - t.Fatal(err) - } - + xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t) - var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN} + var gnb = &entities.NodebInfo{RanName: nodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} readerMock.On("GetNodeb", mock.Anything).Return(gnb, nil) var e2tInstance = &entities.E2TInstance{} e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(e2tInstance, nil) @@ -404,7 +362,7 @@ func initMocks(t *testing.T) (E2SetupRequestNotificationHandler, *mocks.RnibRead config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct { PlmnId string RicNearRtId string - }{PlmnId : "131014", RicNearRtId: "556670"}} + }{PlmnId: "131014", RicNearRtId: "556670"}} rmrMessengerMock := &mocks.RmrMessengerMock{} rmrSender := tests.InitRmrSender(rmrMessengerMock, logger) readerMock := &mocks.RnibReaderMock{} @@ -435,4 +393,4 @@ func assertExistingNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testin writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything) e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything) rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything) -} \ No newline at end of file +} diff --git a/E2Manager/models/e2_setup_request_message.go b/E2Manager/models/e2_setup_request_message.go index 8193b17..44fe5f8 100644 --- a/E2Manager/models/e2_setup_request_message.go +++ b/E2Manager/models/e2_setup_request_message.go @@ -52,27 +52,36 @@ type EnGnb struct { } `xml:"global-gNB-ID"` } +type NgEnbId struct { + Text string `xml:",chardata"` + EnbIdMacro string `xml:"enb-ID-macro"` + EnbIdShortMacro string `xml:"enb-ID-shortmacro"` + EnbIdLongMacro string `xml:"enb-ID-longmacro"` +} + type NgEnb struct { Text string `xml:",chardata"` GlobalNgENBID struct { - Text string `xml:",chardata"` - PlmnID string `xml:"plmn-id"` - GnbID struct { - Text string `xml:",chardata"` - GnbID string `xml:"gnb-ID"` - } `xml:"gnb-id"` + Text string `xml:",chardata"` + PlmnID string `xml:"plmn-id"` + EnbID NgEnbId `xml:"enb-id"` } `xml:"global-ng-eNB-ID"` } +type EnbId struct { + Text string `xml:",chardata"` + MacroEnbId string `xml:"macro-eNB-ID"` + HomeEnbId string `xml:"home-eNB-ID"` + ShortMacroEnbId string `xml:"short-Macro-eNB-ID"` + LongMacroEnbId string `xml:"long-Macro-eNB-ID"` +} + type Enb struct { Text string `xml:",chardata"` GlobalENBID struct { Text string `xml:",chardata"` - PlmnID string `xml:"plmn-id"` - GnbID struct { - Text string `xml:",chardata"` - GnbID string `xml:"gnb-ID"` - } `xml:"gnb-id"` + PlmnID string `xml:"pLMN-Identity"` + EnbID EnbId `xml:"eNB-ID"` } `xml:"global-eNB-ID"` } @@ -171,22 +180,22 @@ func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId { return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID } -func (m *E2SetupRequestMessage) GetNodeType() entities.Node_Type { - globalE2NodeId := m.getGlobalE2NodeId() - if id := globalE2NodeId.GNB.GlobalGNBID.PlmnID; id != "" { - return entities.Node_GNB - } - if id := globalE2NodeId.EnGNB.GlobalGNBID.PlmnID; id != "" { - return entities.Node_GNB - } - if id := globalE2NodeId.ENB.GlobalENBID.PlmnID; id != "" { - return entities.Node_ENB - } - if id := globalE2NodeId.NgENB.GlobalNgENBID.PlmnID; id != "" { - return entities.Node_GNB - } - return entities.Node_UNKNOWN -} +//func (m *E2SetupRequestMessage) GetNodeType() entities.Node_Type { +// globalE2NodeId := m.getGlobalE2NodeId() +// if id := globalE2NodeId.GNB.GlobalGNBID.PlmnID; id != "" { +// return entities.Node_GNB +// } +// if id := globalE2NodeId.EnGNB.GlobalGNBID.PlmnID; id != "" { +// return entities.Node_GNB +// } +// if id := globalE2NodeId.ENB.GlobalENBID.PlmnID; id != "" { +// return entities.Node_ENB +// } +// if id := globalE2NodeId.NgENB.GlobalNgENBID.PlmnID; id != "" { +// return entities.Node_ENB +// } +// return entities.Node_UNKNOWN +//} func (m *E2SetupRequestMessage) GetPlmnId() string { globalE2NodeId := m.getGlobalE2NodeId() @@ -205,20 +214,62 @@ func (m *E2SetupRequestMessage) GetPlmnId() string { return "" } +func (m *E2SetupRequestMessage) getInnerEnbId(enbId EnbId) string { + + if id := enbId.HomeEnbId; id != "" { + return id + } + + if id := enbId.LongMacroEnbId; id != "" { + return id + } + + if id := enbId.MacroEnbId; id != "" { + return id + } + + if id := enbId.ShortMacroEnbId; id != "" { + return id + } + + return "" +} + +func (m *E2SetupRequestMessage) getInnerNgEnbId(enbId NgEnbId) string { + if id := enbId.EnbIdLongMacro; id != "" { + return id + } + + if id := enbId.EnbIdMacro; id != "" { + return id + } + + if id := enbId.EnbIdShortMacro; id != "" { + return id + } + + return "" +} + func (m *E2SetupRequestMessage) GetNbId() string { globalE2NodeId := m.getGlobalE2NodeId() + if id := globalE2NodeId.GNB.GlobalGNBID.GnbID.GnbID; id != "" { return m.trimSpaces(id) } + if id := globalE2NodeId.EnGNB.GlobalGNBID.GnbID.GnbID; id != "" { return m.trimSpaces(id) } - if id := globalE2NodeId.ENB.GlobalENBID.GnbID.GnbID; id != "" { + + if id := m.getInnerEnbId(globalE2NodeId.ENB.GlobalENBID.EnbID); id != "" { return m.trimSpaces(id) } - if id := globalE2NodeId.NgENB.GlobalNgENBID.GnbID.GnbID; id != "" { + + if id := m.getInnerNgEnbId(globalE2NodeId.NgENB.GlobalNgENBID.EnbID); id != "" { return m.trimSpaces(id) } + return "" } diff --git a/E2Manager/models/e2_setup_response_message.go b/E2Manager/models/e2_setup_response_message.go index 62c733d..654e2af 100644 --- a/E2Manager/models/e2_setup_response_message.go +++ b/E2Manager/models/e2_setup_response_message.go @@ -18,56 +18,56 @@ // platform project (RICP). package models + import ( "encoding/xml" ) - type TimeToWait = int -var TimeToWaitEnum = struct{ +var TimeToWaitEnum = struct { V60s TimeToWait V20s TimeToWait V10s TimeToWait - V5s TimeToWait - V2s TimeToWait - V1s TimeToWait + V5s TimeToWait + V2s TimeToWait + V1s TimeToWait }{60, 20, 10, 5, 2, 1} var timeToWaitMap = map[TimeToWait]interface{}{ - TimeToWaitEnum.V60s : struct { + TimeToWaitEnum.V60s: struct { XMLName xml.Name `xml:"TimeToWait"` - Text string `xml:",chardata"` - V60s string `xml:"v60s"` + Text string `xml:",chardata"` + V60s string `xml:"v60s"` }{}, - TimeToWaitEnum.V20s : struct { + TimeToWaitEnum.V20s: struct { XMLName xml.Name `xml:"TimeToWait"` - Text string `xml:",chardata"` - V20s string `xml:"v20s"` + Text string `xml:",chardata"` + V20s string `xml:"v20s"` }{}, - TimeToWaitEnum.V10s : struct { + TimeToWaitEnum.V10s: struct { XMLName xml.Name `xml:"TimeToWait"` - Text string `xml:",chardata"` - V10s string `xml:"v10s"` + Text string `xml:",chardata"` + V10s string `xml:"v10s"` }{}, - TimeToWaitEnum.V5s : struct { + TimeToWaitEnum.V5s: struct { XMLName xml.Name `xml:"TimeToWait"` - Text string `xml:",chardata"` - V5s string `xml:"v5s"` + Text string `xml:",chardata"` + V5s string `xml:"v5s"` }{}, - TimeToWaitEnum.V2s : struct { + TimeToWaitEnum.V2s: struct { XMLName xml.Name `xml:"TimeToWait"` - Text string `xml:",chardata"` - V2s string `xml:"v2s"` + Text string `xml:",chardata"` + V2s string `xml:"v2s"` }{}, - TimeToWaitEnum.V1s : struct { + TimeToWaitEnum.V1s: struct { XMLName xml.Name `xml:"TimeToWait"` - Text string `xml:",chardata"` - V1s string `xml:"v1s"` + Text string `xml:",chardata"` + V1s string `xml:"v1s"` }{}, } -func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage{ +func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage { outcome := SuccessfulOutcome{} outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, 2) outcome.ProcedureCode = "1" @@ -76,16 +76,16 @@ func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2Se Text string `xml:",chardata"` PLMNIdentity string `xml:"pLMN-Identity"` RicID string `xml:"ric-ID"` - }{PLMNIdentity:plmnId, RicID:ricId}} + }{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"` + Text string `xml:",chardata"` ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"` - }{ProtocolIESingleContainer:extractRanFunctionsIDList(request)}} - return E2SetupResponseMessage{E2APPDU:E2APPDU{Outcome:outcome}} + }{ProtocolIESingleContainer: extractRanFunctionsIDList(request)}} + return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}} } -func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage{ +func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage { outcome := UnsuccessfulOutcome{} outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2) outcome.ProcedureCode = "1" @@ -93,7 +93,7 @@ func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMess 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}} + return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}} } type E2SetupResponseMessage struct { @@ -104,14 +104,14 @@ type E2SetupResponseMessage struct { type E2APPDU struct { XMLName xml.Name `xml:"E2AP-PDU"` - Text string `xml:",chardata"` + Text string `xml:",chardata"` Outcome interface{} } type SuccessfulOutcome struct { - XMLName xml.Name `xml:"successfulOutcome"` - Text string `xml:",chardata"` - ProcedureCode string `xml:"procedureCode"` + XMLName xml.Name `xml:"successfulOutcome"` + Text string `xml:",chardata"` + ProcedureCode string `xml:"procedureCode"` Criticality struct { Text string `xml:",chardata"` Reject string `xml:"reject"` @@ -121,8 +121,8 @@ type SuccessfulOutcome struct { E2setupResponse struct { Text string `xml:",chardata"` ProtocolIEs struct { - Text string `xml:",chardata"` - E2setupResponseIEs []E2setupResponseIEs`xml:"E2setupResponseIEs"` + Text string `xml:",chardata"` + E2setupResponseIEs []E2setupResponseIEs `xml:"E2setupResponseIEs"` } `xml:"protocolIEs"` } `xml:"E2setupResponse"` } `xml:"value"` @@ -135,7 +135,7 @@ type E2setupResponseIEs struct { Text string `xml:",chardata"` Reject string `xml:"reject"` } `xml:"criticality"` - Value interface{}`xml:"value"` + Value interface{} `xml:"value"` } type GlobalRICID struct { @@ -148,9 +148,9 @@ type GlobalRICID struct { } type RANfunctionsIDList struct { - Text string `xml:",chardata"` + Text string `xml:",chardata"` RANfunctionsIDList struct { - Text string `xml:",chardata"` + Text string `xml:",chardata"` ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"` } `xml:"RANfunctionsID-List"` } @@ -172,22 +172,21 @@ type ProtocolIESingleContainer struct { } `xml:"value"` } - type UnsuccessfulOutcome struct { - XMLName xml.Name `xml:"unsuccessfulOutcome"` - Text string `xml:",chardata"` - ProcedureCode string `xml:"procedureCode"` + 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"` + Text string `xml:",chardata"` E2setupFailure struct { Text string `xml:",chardata"` ProtocolIEs struct { - Text string `xml:",chardata"` - E2setupFailureIEs []E2setupFailureIEs`xml:"E2setupFailureIEs"` + Text string `xml:",chardata"` + E2setupFailureIEs []E2setupFailureIEs `xml:"E2setupFailureIEs"` } `xml:"protocolIEs"` } `xml:"E2setupFailure"` } `xml:"value"` @@ -207,27 +206,27 @@ type E2setupFailureIEs struct { } type Cause struct { - XMLName xml.Name `xml:"Cause"` - Text string `xml:",chardata"` + 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{ +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 := 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{ +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/tests/resources/setupRequest_enb.xml b/E2Manager/tests/resources/setupRequest_enb.xml new file mode 100644 index 0000000..3502012 --- /dev/null +++ b/E2Manager/tests/resources/setupRequest_enb.xml @@ -0,0 +1,68 @@ + + + 1 + + + + + + + + 3 + + + + + + + + 63 59 AB + + 101010101010101010 + + + + + + + + 10 + + + + + + + 8 + + + + + + 1 + 334455 + 0 + + + + + 8 + + + + + + 7 + 334455 + 0 + + + + + + + + + + + \ No newline at end of file diff --git a/E2Manager/tests/resources/setupRequest_ng-eNB.xml b/E2Manager/tests/resources/setupRequest_ng-eNB.xml index 5686930..6bcd1f1 100644 --- a/E2Manager/tests/resources/setupRequest_ng-eNB.xml +++ b/E2Manager/tests/resources/setupRequest_ng-eNB.xml @@ -17,9 +17,9 @@ 13 10 14 - - 10011001101010101011 - + + 101010101010101010 + -- 2.16.6