From: subhash kumar singh Date: Mon, 18 Apr 2022 09:52:24 +0000 (+0000) Subject: E2Setup Message as per E2AP spec v2.0 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F69%2F8069%2F2;p=ric-plt%2Fe2mgr.git E2Setup Message as per E2AP spec v2.0 Implement E2Setup Message as per the E2AP spec v2.0 to mainly support E2nodeConfig IE. Issue-ID: RIC-722 Change-Id: I3174451912d5d08cd472b3ae7ba81b176daebf7c Signed-off-by: subhash kumar singh --- diff --git a/E2Manager/go.mod b/E2Manager/go.mod index 7a9abf3..c464026 100644 --- a/E2Manager/go.mod +++ b/E2Manager/go.mod @@ -2,7 +2,7 @@ module e2mgr require ( gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.2.1 - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.3 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.4-0.20220331130243-8ea5c5358ce9 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.2.1 gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.8.0 github.com/golang/protobuf v1.4.2 diff --git a/E2Manager/go.sum b/E2Manager/go.sum index 4a9b36e..398c388 100644 --- a/E2Manager/go.sum +++ b/E2Manager/go.sum @@ -5,6 +5,8 @@ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.1 h1:8Z60JRsPgcS1Ona4 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.1/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.3 h1:fF5SA51FeEB9of/Q9a17ADUbCa3cU6oNkXY7GlFSvhs= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.3/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.4-0.20220331130243-8ea5c5358ce9 h1:Z6NfwityKkVM0t6n/hAPwRvCsQwW3InMqQR62VlkvZI= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.4-0.20220331130243-8ea5c5358ce9/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.2.1 h1:BG3kste8PLVTG0m8CRB/VP2tAV5JImKueBGuOsUNcR8= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.2.1/go.mod h1:zX8rW6YEsagHrRGVW5YO50Ku/Csrpzsuvblhr4DbYi4= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.8.0 h1:H7GtCRC+pGn6oOxYalUZr7LinQX5jQCVa+ConX7PB5Q= diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go index b2e1633..8f4aacd 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go @@ -34,15 +34,16 @@ import ( "encoding/xml" "errors" "fmt" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "strconv" "strings" + + "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" + "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" ) var ( emptyTagsToReplaceToSelfClosingTags = []string{"reject", "ignore", "transport-resource-unavailable", "om-intervention", "request-id-unknown", - "v60s", "v20s", "v10s", "v5s", "v2s", "v1s"} + "v60s", "v20s", "v10s", "v5s", "v2s", "v1s", "ng", "xn", "e1", "f1", "w1", "s1", "x2", "success", "failure"} gnbTypesMap = map[string]entities.GnbType{ "gnb": entities.GnbType_GNB, "en_gnb": entities.GnbType_EN_GNB, @@ -93,14 +94,6 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR return } - h.logger.Infof("#E2SetupRequestNotificationHandler.Handle - got general configuration from rnib - enableRic: %t", generalConfiguration.EnableRic) - - if !generalConfiguration.EnableRic { - cause := models.Cause{Misc: &models.CauseMisc{OmIntervention: &struct{}{}}} - h.handleUnsuccessfulResponse(ranName, request, cause) - return - } - setupRequest, e2tIpAddress, err := h.parseSetupRequest(request.Payload) if err != nil { h.logger.Errorf(err.Error()) @@ -110,6 +103,14 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR h.logger.Infof("#E2SetupRequestNotificationHandler.Handle - E2T Address: %s - handling E2_SETUP_REQUEST", e2tIpAddress) h.logger.Debugf("#E2SetupRequestNotificationHandler.Handle - E2_SETUP_REQUEST has been parsed successfully %+v", setupRequest) + h.logger.Infof("#E2SetupRequestNotificationHandler.Handle - got general configuration from rnib - enableRic: %t", generalConfiguration.EnableRic) + + if !generalConfiguration.EnableRic { + cause := models.Cause{Misc: &models.CauseMisc{OmIntervention: &struct{}{}}} + h.handleUnsuccessfulResponse(ranName, request, cause, setupRequest) + return + } + _, err = h.e2tInstancesManager.GetE2TInstance(e2tIpAddress) if err != nil { @@ -131,7 +132,7 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR if nodebInfo, err = h.handleNewRan(ranName, e2tIpAddress, setupRequest); err != nil { if _, ok := err.(*e2managererrors.UnknownSetupRequestRanNameError); ok { cause := models.Cause{RicRequest: &models.CauseRic{RequestIdUnknown: &struct{}{}}} - h.handleUnsuccessfulResponse(ranName, request, cause) + h.handleUnsuccessfulResponse(ranName, request, cause, setupRequest) } return } @@ -157,7 +158,7 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR } cause := models.Cause{Transport: &models.CauseTransport{TransportResourceUnavailable: &struct{}{}}} - h.handleUnsuccessfulResponse(nodebInfo.RanName, request, cause) + h.handleUnsuccessfulResponse(nodebInfo.RanName, request, cause, setupRequest) } return } @@ -220,10 +221,25 @@ func (h *E2SetupRequestNotificationHandler) handleExistingRan(ranName string, no nodebInfo.SetupFromNetwork = true + e2NodeConfig := setupRequest.ExtractE2NodeConfigList() + if e2NodeConfig == nil { + return false, errors.New("Empty E2nodeComponentConfigAddition-List") + } + if nodebInfo.NodeType == entities.Node_ENB { + if len(e2NodeConfig) == 0 && len(nodebInfo.GetEnb().GetNodeConfigs()) == 0 { + return false, errors.New("Empty E2nodeComponentConfigAddition-List") + } + nodebInfo.GetEnb().NodeConfigs = e2NodeConfig + return false, nil } + if len(e2NodeConfig) == 0 && len(nodebInfo.GetGnb().GetNodeConfigs()) == 0 { + return false, errors.New("Empty E2nodeComponentConfigAddition-List") + } + nodebInfo.GetGnb().NodeConfigs = e2NodeConfig + setupMessageRanFuncs := setupRequest.ExtractRanFunctionsList() if setupMessageRanFuncs == nil || (len(setupMessageRanFuncs) == 0 && len(nodebInfo.GetGnb().RanFunctions) == 0) { @@ -234,8 +250,8 @@ func (h *E2SetupRequestNotificationHandler) handleExistingRan(ranName string, no return true, nil } -func (h *E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(ranName string, req *models.NotificationRequest, cause models.Cause) { - failureResponse := models.NewE2SetupFailureResponseMessage(models.TimeToWaitEnum.V60s, cause) +func (h *E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(ranName string, req *models.NotificationRequest, cause models.Cause, setupRequest *models.E2SetupRequestMessage) { + failureResponse := models.NewE2SetupFailureResponseMessage(models.TimeToWaitEnum.V60s, cause, setupRequest) h.logger.Debugf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - E2_SETUP_RESPONSE has been built successfully %+v", failureResponse) responsePayload, err := xml.Marshal(&failureResponse.E2APPDU) @@ -243,7 +259,7 @@ func (h *E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(ranName s h.logger.Warnf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", ranName, responsePayload) } - responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload,emptyTagsToReplaceToSelfClosingTags) + responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload, emptyTagsToReplaceToSelfClosingTags) h.logger.Infof("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - payload: %s", responsePayload) msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_FAILURE, ranName, responsePayload, req.TransactionId, req.GetMsgSrc()) @@ -268,7 +284,7 @@ func (h *E2SetupRequestNotificationHandler) handleSuccessfulResponse(ranName str h.logger.Warnf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", ranName, responsePayload) } - responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload,emptyTagsToReplaceToSelfClosingTags) + responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload, emptyTagsToReplaceToSelfClosingTags) h.logger.Infof("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - payload: %s", responsePayload) @@ -337,10 +353,25 @@ func (h *E2SetupRequestNotificationHandler) buildNodebInfo(ranName string, e2tAd return nil, err } + e2NodeConfig := request.ExtractE2NodeConfigList() + if e2NodeConfig == nil { + return nil, errors.New("Empty E2nodeComponentConfigAddition-List") + } + if nodebInfo.NodeType == entities.Node_ENB { + if len(e2NodeConfig) == 0 && len(nodebInfo.GetEnb().GetNodeConfigs()) == 0 { + return nil, errors.New("Empty E2nodeComponentConfigAddition-List") + } + nodebInfo.GetEnb().NodeConfigs = e2NodeConfig + return nodebInfo, nil } + if len(e2NodeConfig) == 0 && len(nodebInfo.GetGnb().GetNodeConfigs()) == 0 { + return nil, errors.New("Empty E2nodeComponentConfigAddition-List") + } + nodebInfo.GetGnb().NodeConfigs = e2NodeConfig + ranFuncs := request.ExtractRanFunctionsList() if ranFuncs != nil { 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 d3a7ae2..aff0ebb 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -1,7 +1,7 @@ // // Copyright 2019 AT&T Intellectual Property // Copyright 2019 Nokia -// Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved. +// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -32,11 +32,12 @@ import ( "e2mgr/utils" "encoding/xml" "errors" + "testing" + "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/stretchr/testify/assert" "github.com/stretchr/testify/mock" - "testing" ) const ( @@ -50,9 +51,9 @@ const ( NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_ng-eNB.xml" EnbSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_enb.xml" GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest/setupRequest_gnb_without_functions.xml" - E2SetupFailureResponseWithMiscCause = "1131" - E2SetupFailureResponseWithTransportCause = "1131" - E2SetupFailureResponseWithRicCause = "1131" + E2SetupFailureResponseWithMiscCause = "1491131" + E2SetupFailureResponseWithTransportCause = "1491131" + E2SetupFailureResponseWithRicCause = "1491131" StateChangeMessageChannel = "RAN_CONNECTION_STATUS_CHANGE" ) @@ -468,6 +469,7 @@ func getExpectedGnbNodebForNewRan(payload []byte) *entities.NodebInfo { Gnb: &entities.Gnb{ GnbType: entities.GnbType_GNB, RanFunctions: setupRequest.ExtractRanFunctionsList(), + NodeConfigs: setupRequest.ExtractE2NodeConfigList(), }, }, GlobalNbId: &entities.GlobalNbId{ @@ -491,7 +493,8 @@ func getExpectedEnbNodebForNewRan(payload []byte) *entities.NodebInfo { NodeType: entities.Node_ENB, Configuration: &entities.NodebInfo_Enb{ Enb: &entities.Enb{ - EnbType: entities.EnbType_MACRO_ENB, + EnbType: entities.EnbType_MACRO_ENB, + NodeConfigs: setupRequest.ExtractE2NodeConfigList(), }, }, GlobalNbId: &entities.GlobalNbId{ @@ -515,13 +518,26 @@ func getExpectedNodebForExistingRan(nodeb *entities.NodebInfo, payload []byte) * nb := *nodeb if nodeb.NodeType == entities.Node_ENB { + if e2NodeConfig := setupRequest.ExtractE2NodeConfigList(); e2NodeConfig != nil { + updatedEnb := *nodeb.GetEnb() + updatedEnb.NodeConfigs = e2NodeConfig + nb.Configuration = &entities.NodebInfo_Enb{Enb: &updatedEnb} + } + return &nb } if ranFuncs := setupRequest.ExtractRanFunctionsList(); ranFuncs != nil { updatedGnb := *nodeb.GetGnb() updatedGnb.RanFunctions = ranFuncs - nb.Configuration =&entities.NodebInfo_Gnb{Gnb: &updatedGnb} + nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &updatedGnb} + } + + if e2NodeConfig := setupRequest.ExtractE2NodeConfigList(); e2NodeConfig != nil { + updatedGnb := *nodeb.GetGnb() + updatedGnb.RanFunctions = nb.GetGnb().RanFunctions + updatedGnb.NodeConfigs = e2NodeConfig + nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &updatedGnb} } return &nb @@ -687,6 +703,16 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbRoutingMana gnb := nodebInfo.GetGnb() gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}} + gnb.NodeConfigs = []*entities.E2NodeComponentConfig{{ + E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{ + E2NodeComponentInterfaceTypeNG: &entities.E2NodeComponentInterfaceNG{ + AmfName: "nginterf", + }, + }, + E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_ng, + E2NodeComponentRequestPart: []byte("72 65 73 70 61 72 74"), + E2NodeComponentResponsePart: []byte("72 65 73 70 61 72 74"), + }} readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil) routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error")) diff --git a/E2Manager/models/e2_setup_request_message.go b/E2Manager/models/e2_setup_request_message.go index 96a7bcf..435ad7c 100644 --- a/E2Manager/models/e2_setup_request_message.go +++ b/E2Manager/models/e2_setup_request_message.go @@ -1,6 +1,7 @@ // // Copyright 2019 AT&T Intellectual Property // Copyright 2019 Nokia +// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -104,8 +105,10 @@ type E2SetupRequest struct { } `xml:"criticality"` Value struct { Text string `xml:",chardata"` + TransactionID string `xml:"TransactionID"` GlobalE2nodeID GlobalE2NodeId `xml:"GlobalE2node-ID"` RANfunctionsList RANfunctionsList `xml:"RANfunctions-List"` + E2NodeConfigList E2NodeConfigList `xml:"E2nodeComponentConfigAddition-List"` } `xml:"value"` } `xml:"E2setupRequestIEs"` } `xml:"protocolIEs"` @@ -155,14 +158,157 @@ type RANfunctionsList struct { } `xml:"ProtocolIE-SingleContainer"` } +type E2NodeConfigList struct { + Text string `xml:",chardata"` + ProtocolIESingleContainer []struct { + Text string `xml:",chardata"` + ID string `xml:"id"` + Criticality struct { + Text string `xml:",chardata"` + Reject string `xml:"reject"` + } `xml:"criticality"` + Value struct { + Text string `xml:",chardata"` + E2nodeConfigAdditionItem E2NodeConfigAdditionItem `xml:"E2nodeComponentConfigAddition-Item"` + } `xml:"value"` + } `xml:"ProtocolIE-SingleContainer"` +} + +type E2NodeComponentType struct { + Text string `xml:",chardata"` + NG *struct{} `xml:"ng"` + XN *struct{} `xml:"xn"` + E1 *struct{} `xml:"e1"` + F1 *struct{} `xml:"f1"` + W1 *struct{} `xml:"w1"` + S1 *struct{} `xml:"s1"` + X2 *struct{} `xml:"x2"` +} + +type E2NodeConfigAdditionItem struct { + Text string `xml:",chardata"` + E2nodeComponentType E2NodeComponentType `xml:"e2nodeComponentInterfaceType"` + E2nodeComponentID E2NodeComponentId `xml:"e2nodeComponentID"` + E2nodeConfiguration E2NodeConfigValue `xml:"e2nodeComponentConfiguration"` +} + +type E2NodeConfigValue struct { + Text string `xml:",chardata"` + E2NodeRequestPart []byte `xml:"e2nodeComponentRequestPart"` + E2NodeResponsePart []byte `xml:"e2nodeComponentResponsePart"` +} + +type E2NodeComponentId struct { + Text string `xml:",chardata"` + E2NodeIFTypeNG E2NodeIFTypeNG + E2NodeIFTypeXN E2NodeIFTypeXN + E2NodeIFTypeE1 E2NodeIFTypeE1 + E2NodeIFTypeF1 E2NodeIFTypeF1 + E2NodeIFTypeW1 E2NodeIFTypeW1 + E2NodeIFTypeS1 E2NodeIFTypeS1 + E2NodeIFTypeX2 E2NodeIFTypeX2 +} + +type E2NodeIFTypeNG struct { + XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeNG"` + Text string `xml:",chardata"` + AMFName string `xml:"amf-name"` +} + +type E2NodeIFTypeXN struct { + XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeXn"` + Text string `xml:",chardata"` + GlobalNgENBID struct { + Text string `xml:",chardata"` + GNB struct { + Text string `xml:",chardata"` + PLMNID string `xml:"plmn-id"` + GnbID struct { + Text string `xml:",chardata"` + GnbID string `xml:"gnb-ID"` + } `xml:"gnb-id"` + } `xml:"gNB"` + NGENB struct { + Text string `xml:",chardata"` + PLMNID string `xml:"plmn-id"` + GnbID struct { + Text string `xml:",chardata"` + ENBIDMacro string `xml:"enb-ID-macro"` + ENBIDShortMacro string `xml:"enb-ID-shortmacro"` + ENBIDLongMacro string `xml:"enb-ID-longmacro"` + } `xml:"gnb-id"` + } `xml:"ng-eNB"` + } `xml:"global-NG-RAN-Node-ID"` +} + +type E2NodeIFTypeE1 struct { + XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeE1"` + Text string `xml:",chardata"` + GNBCUCPID int64 `xml:"gNB-CU-CP-ID"` +} + +type E2NodeIFTypeF1 struct { + XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeF1"` + Text string `xml:",chardata"` + GNBDUID int64 `xml:"gNB-DU-ID"` +} + +type E2NodeIFTypeW1 struct { + XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeW1"` + Text string `xml:",chardata"` + NGENBDUID int64 `xml:"ng-eNB-DU-ID"` +} + +type E2NodeIFTypeS1 struct { + XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeS1"` + Text string `xml:",chardata"` + MMENAME string `xml:"mme-name"` +} + +type E2NodeIFTypeX2 struct { + XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeX2"` + Text string `xml:",chardata"` + GlobalENBID struct { + Text string `xml:",chardata"` + PLMNIdentity string `xml:"pLMN-Identity"` + 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"` + } `xml:"eNB-ID"` + } `xml:"global-eNB-ID"` + GlobalEnGNBID struct { + Text string `xml:",chardata"` + PLMNIdentity string `xml:"pLMN-Identity"` + GNBID struct { + Text string `xml:",chardata"` + GNBID string `xml:"gNB-ID"` + } `xml:"gNB-ID"` + } `xml:"global-en-gNB-ID"` +} + func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction { // TODO: verify e2SetupRequestIEs structure with Adi e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs - if len(e2SetupRequestIes) < 2 { + + var ranFuntionsList RANfunctionsList + var isPopulated bool + + for _, v := range e2SetupRequestIes { + if v.ID == RanFunctionsAddedID { + ranFuntionsList = v.Value.RANfunctionsList + isPopulated = true + break + } + } + + if !isPopulated { return nil } - ranFunctionsListContainer := e2SetupRequestIes[1].Value.RANfunctionsList.ProtocolIESingleContainer + ranFunctionsListContainer := ranFuntionsList.ProtocolIESingleContainer funcs := make([]*entities.RanFunction, len(ranFunctionsListContainer)) for i := 0; i < len(funcs); i++ { ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem @@ -177,8 +323,143 @@ func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunctio return funcs } +func (m *E2SetupRequestMessage) ExtractE2NodeConfigList() []*entities.E2NodeComponentConfig { + e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs + numOfIes := len(e2SetupRequestIes) + var e2NodeConfigListContainer E2NodeConfigList + var isPopulated bool + + for ieCount := 0; ieCount < numOfIes; ieCount++ { + + if e2SetupRequestIes[ieCount].ID == E2nodeConfigAdditionID { + e2NodeConfigListContainer = e2SetupRequestIes[ieCount].Value.E2NodeConfigList + isPopulated = true + break + } + } + + if !isPopulated { + return nil + } + + e2nodeComponentConfigs := make([]*entities.E2NodeComponentConfig, len(e2NodeConfigListContainer.ProtocolIESingleContainer)) + for i := 0; i < len(e2nodeComponentConfigs); i++ { + e2NodeConfigItem := e2NodeConfigListContainer.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem + + if e2NodeConfigItem.E2nodeComponentType.NG != nil { + e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{ + E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_ng, + E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart, + E2NodeComponentResponsePart: e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart, + E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{ + E2NodeComponentInterfaceTypeNG: &entities.E2NodeComponentInterfaceNG{ + AmfName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeNG.AMFName, + }, + }, + } + } else if e2NodeConfigItem.E2nodeComponentType.E1 != nil { + e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{ + E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_e1, + E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart, + E2NodeComponentResponsePart: e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart, + E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeE1{ + E2NodeComponentInterfaceTypeE1: &entities.E2NodeComponentInterfaceE1{ + GNBCuCpId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeE1.GNBCUCPID, + }, + }, + } + } else if e2NodeConfigItem.E2nodeComponentType.F1 != nil { + e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{ + E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_f1, + E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart, + E2NodeComponentResponsePart: e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart, + E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeF1{ + E2NodeComponentInterfaceTypeF1: &entities.E2NodeComponentInterfaceF1{ + GNBDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeF1.GNBDUID, + }, + }, + } + } else if e2NodeConfigItem.E2nodeComponentType.W1 != nil { + e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{ + E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_w1, + E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart, + E2NodeComponentResponsePart: e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart, + E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeW1{ + E2NodeComponentInterfaceTypeW1: &entities.E2NodeComponentInterfaceW1{ + NgenbDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeW1.NGENBDUID, + }, + }, + } + } else if e2NodeConfigItem.E2nodeComponentType.S1 != nil { + e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{ + E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_s1, + E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart, + E2NodeComponentResponsePart: e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart, + E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeS1{ + E2NodeComponentInterfaceTypeS1: &entities.E2NodeComponentInterfaceS1{ + MmeName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeS1.MMENAME, + }, + }, + } + } + /*else if e2NodeConfigItem.E2nodeComponentType.XN != nil { + funcs[i] = &entities.E2NodeComponentConfig{ + E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn, + E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart, + E2NodeComponentResponsePart: e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart, + E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{ + E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{ + GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{ + GlobalNgenbId:&entities.GlobalNGENBID{ + PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID, + EnbId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID, + }, + }, + GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalGnbId{ + GlobalGnbId:&entities.GlobalGNBID{ + PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID, + EnbId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID, + }, + }, + }, + }, + } + ifXn.GlobalNgENBID.NGENB.PLMNID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID + ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDMacro + ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro + ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro + + }*/ + /*else if e2NodeConfigItem.E2nodeComponentType.X2 != nil { + ifX2 := E2NodeIFTypeX2 {} + ifX2.GlobalENBID.PLMNIdentity = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity + ifX2.GlobalENBID.ENBID.MacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroENBID + ifX2.GlobalENBID.ENBID.HomeENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeENBID + ifX2.GlobalENBID.ENBID.ShortMacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroENBID + ifX2.GlobalENBID.ENBID.LongMacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroENBID + + ifX2.GlobalEnGNBID.PLMNIdentity = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.PLMNIdentity + ifX2.GlobalEnGNBID.GNBID.GNBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.GNBID.GNBID + }*/ + } + return e2nodeComponentConfigs +} + func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId { - return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID + + // TODO: Handle error case if GlobalE2NodeId not available + e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs + numOfIes := len(e2SetupRequestIes) + index := 1 + + for ieCount := 0; ieCount < numOfIes; ieCount++ { + if e2SetupRequestIes[ieCount].ID == GlobalE2nodeID { + index = ieCount + break + } + } + + return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.GlobalE2nodeID } func (m *E2SetupRequestMessage) GetPlmnId() string { diff --git a/E2Manager/models/e2_setup_request_message_test.go b/E2Manager/models/e2_setup_request_message_test.go index a609eed..b50d0d7 100644 --- a/E2Manager/models/e2_setup_request_message_test.go +++ b/E2Manager/models/e2_setup_request_message_test.go @@ -23,8 +23,9 @@ import ( "e2mgr/models" "e2mgr/utils" "encoding/xml" - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) const ( @@ -73,6 +74,17 @@ func TestExtractRanFunctionsListFromGnbRequestwithOidSuccess(t *testing.T) { assert.Equal(t, "OID125", ranFuncList[2].RanFunctionOid) } +func TestExtractE2nodeConfigSuccess(t *testing.T) { + setupRequest := getTestE2SetupRequest(t, e2SetupReqGnbSetupRequestWithOIDXmlPath) + e2nodeConfigs := setupRequest.ExtractE2NodeConfigList() + + assert.Equal(t, 2, len(e2nodeConfigs)) + + assert.Equal(t, "nginterf1", e2nodeConfigs[0].GetE2NodeComponentInterfaceTypeNG().GetAmfName()) + assert.Equal(t, "nginterf2", e2nodeConfigs[1].GetE2NodeComponentInterfaceTypeNG().GetAmfName()) + +} + func TestGetPlmnIdFromGnbRequestSuccess(t *testing.T) { setupRequest := getTestE2SetupRequest(t, e2SetupReqGnbSetupRequestXmlPath) diff --git a/E2Manager/models/e2_setup_response_message.go b/E2Manager/models/e2_setup_response_message.go index 04d63a1..1b62b01 100644 --- a/E2Manager/models/e2_setup_response_message.go +++ b/E2Manager/models/e2_setup_response_message.go @@ -1,6 +1,7 @@ // // Copyright 2019 AT&T Intellectual Property // Copyright 2019 Nokia +// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -23,6 +24,21 @@ import ( "encoding/xml" ) +const ( + CauseID = "1" + GlobalE2nodeID = "3" + GlobalRicID = "4" + RanFunctionIDItemID = "6" + RanFunctionsAcceptedID = "9" + RanFunctionsAddedID = "10" + TimeToWaitID = "31" + TransactionID = "49" + E2nodeConfigAdditionID = "50" + E2nodeConfigAdditionItemID = "51" + E2nodeConfigAdditionAckID = "52" + E2nodeConfigAdditionAckItemID = "53" +) + type TimeToWait = int var TimeToWaitEnum = struct { @@ -67,41 +83,87 @@ var timeToWaitMap = map[TimeToWait]interface{}{ }{}, } +type ConfigStatus = int + +var ConfigStatusEnum = struct { + Success ConfigStatus + Failure ConfigStatus +}{0, 1} + +var configStatusMap = map[ConfigStatus]interface{}{ + ConfigStatusEnum.Success: struct { + XMLName xml.Name `xml:"updateOutcome"` + Text string `xml:",chardata"` + Success string `xml:"success"` + }{}, + ConfigStatusEnum.Failure: struct { + XMLName xml.Name `xml:"updateOutcome"` + Text string `xml:",chardata"` + Failure string `xml:"failure"` + }{}, +} + func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage { outcome := SuccessfulOutcome{} outcome.ProcedureCode = "1" e2SetupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs + numOfIes := len(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}} + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, numOfIes) + + for ieCount := 0; ieCount < numOfIes; ieCount++ { + switch e2SetupRequestIes[ieCount].ID { + case TransactionID: + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = TransactionID + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = TransID{ + TransactionID: request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[ieCount].Value.TransactionID, + } + + case GlobalE2nodeID: + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = GlobalRicID + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = GlobalRICID{GlobalRICID: struct { + Text string `xml:",chardata"` + PLMNIdentity string `xml:"pLMN-Identity"` + RicID string `xml:"ric-ID"` + }{PLMNIdentity: plmnId, RicID: ricId}} + + case RanFunctionsAddedID: + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = RanFunctionsAcceptedID + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = RANfunctionsIDList{RANfunctionsIDList: struct { + Text string `xml:",chardata"` + ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"` + }{ProtocolIESingleContainer: extractRanFunctionsIDList(request, ieCount)}} - if len(e2SetupRequestIes) < 2 { - return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}} + case E2nodeConfigAdditionID: + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = E2nodeConfigAdditionAckID + outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = E2NodeConfigUpdateAckList{E2NodeConfigUpdateAckList: struct { + Text string `xml:",chardata"` + E2NodeConfigSingleContainer []E2NodeConfigSingleContainer `xml:"ProtocolIE-SingleContainer"` + }{E2NodeConfigSingleContainer: extractE2NodeConfigUpdateList(request, ieCount, 0)}} + } } - 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, cause Cause) E2SetupResponseMessage { +func NewE2SetupFailureResponseMessage(timeToWait TimeToWait, cause Cause, request *E2SetupRequestMessage) E2SetupResponseMessage { outcome := UnsuccessfulOutcome{} - outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2) + + outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 3) 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] + outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = TransactionID + outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = TransFailID{ + ID: request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.TransactionID, + } + + outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = CauseID + outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = cause + + outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[2].ID = TimeToWaitID + outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[2].Value.Value = timeToWaitMap[timeToWait] + return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}} } @@ -181,6 +243,52 @@ type ProtocolIESingleContainer struct { } `xml:"value"` } +type TransID struct { + Text string `xml:",chardata"` + TransactionID string `xml:"TransactionID"` +} + +type TransFailID struct { + XMLName xml.Name `xml:"TransactionID"` + ID string `xml:",chardata"` +} + +type E2NodeConfigUpdateAckList struct { + Text string `xml:",chardata"` + E2NodeConfigUpdateAckList struct { + Text string `xml:",chardata"` + E2NodeConfigSingleContainer []E2NodeConfigSingleContainer `xml:"ProtocolIE-SingleContainer"` + } `xml:"E2nodeComponentConfigAdditionAck-List"` +} + +type E2NodeConfigSingleContainer struct { + Text string `xml:",chardata"` + ID string `xml:"id"` + Criticality struct { + Text string `xml:",chardata"` + Reject string `xml:"reject"` + } `xml:"criticality"` + Value struct { + Text string `xml:",chardata"` + E2NodeConfigUpdateAckItem struct { + Text string `xml:",chardata"` + E2nodeComponentType E2NodeComponentType `xml:"e2nodeComponentInterfaceType"` + E2nodeComponentID E2NodeComponentIDResp + E2nodeConfigUpdateAck E2nodeConfigUpdateAckResp + } `xml:"E2nodeComponentConfigAdditionAck-Item"` + } `xml:"value"` +} + +type E2NodeComponentIDResp struct { + XMLName xml.Name `xml:"e2nodeComponentID"` + Value interface{} +} + +type E2nodeConfigUpdateAckResp struct { + XMLName xml.Name `xml:"e2nodeComponentConfigurationAck"` + Value interface{} +} + type UnsuccessfulOutcome struct { XMLName xml.Name `xml:"unsuccessfulOutcome"` Text string `xml:",chardata"` @@ -214,8 +322,8 @@ type E2setupFailureIEs struct { } `xml:"value"` } -func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer { - list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList +func extractRanFunctionsIDList(request *E2SetupRequestMessage, index int) []ProtocolIESingleContainer { + list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.RANfunctionsList ids := make([]ProtocolIESingleContainer, len(list.ProtocolIESingleContainer)) for i := 0; i < len(ids); i++ { ids[i] = convertToRANfunctionID(list, i) @@ -225,8 +333,74 @@ func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingl func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer { id := ProtocolIESingleContainer{} - id.ID = "6" + + id.ID = RanFunctionIDItemID id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision + + return id +} + +func extractE2NodeConfigUpdateList(request *E2SetupRequestMessage, index int, outcome int) []E2NodeConfigSingleContainer { + list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.E2NodeConfigList + ids := make([]E2NodeConfigSingleContainer, len(list.ProtocolIESingleContainer)) + for i := 0; i < len(ids); i++ { + ids[i] = convertToE2NodeConfig(list, i, outcome) + } + return ids +} + +func convertToE2NodeConfig(list *E2NodeConfigList, i int, outcome int) E2NodeConfigSingleContainer { + id := E2NodeConfigSingleContainer{} + id.ID = E2nodeConfigAdditionAckItemID + + id.Value.E2NodeConfigUpdateAckItem.E2nodeConfigUpdateAck.Value = configStatusMap[outcome] + + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentType = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType + + if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.NG != nil { + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeNG{ + AMFName: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeNG.AMFName, + } + } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.XN != nil { + ifXn := E2NodeIFTypeXN{} + ifXn.GlobalNgENBID.GNB.PLMNID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.PLMNID + ifXn.GlobalNgENBID.GNB.GnbID.GnbID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID + ifXn.GlobalNgENBID.NGENB.PLMNID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID + ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDMacro = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDMacro + ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro + ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro + + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = ifXn + } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.E1 != nil { + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeE1{ + GNBCUCPID: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeE1.GNBCUCPID, + } + } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.F1 != nil { + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeF1{ + GNBDUID: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeF1.GNBDUID, + } + } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.W1 != nil { + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeW1{ + NGENBDUID: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeW1.NGENBDUID, + } + } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.S1 != nil { + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeS1{ + MMENAME: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeS1.MMENAME, + } + } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.X2 != nil { + ifX2 := E2NodeIFTypeX2{} + ifX2.GlobalENBID.PLMNIdentity = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity + ifX2.GlobalENBID.ENBID.MacroENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroENBID + ifX2.GlobalENBID.ENBID.HomeENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeENBID + ifX2.GlobalENBID.ENBID.ShortMacroENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroENBID + ifX2.GlobalENBID.ENBID.LongMacroENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroENBID + + ifX2.GlobalEnGNBID.PLMNIdentity = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.PLMNIdentity + ifX2.GlobalEnGNBID.GNBID.GNBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.GNBID.GNBID + + id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = ifX2 + } + return id } diff --git a/E2Manager/models/e2_setup_response_message_test.go b/E2Manager/models/e2_setup_response_message_test.go index 2e2d7ba..744a8c9 100644 --- a/E2Manager/models/e2_setup_response_message_test.go +++ b/E2Manager/models/e2_setup_response_message_test.go @@ -1,6 +1,7 @@ // // Copyright 2020 AT&T Intellectual Property // Copyright 2020 Nokia +// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -23,8 +24,9 @@ import ( "e2mgr/models" "e2mgr/utils" "encoding/xml" - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) const ( @@ -47,10 +49,10 @@ func TestNewE2SetupSuccessResponseMessageSuccess(t *testing.T) { resp := models.NewE2SetupSuccessResponseMessage(plmn, ricNearRtId, setupRequest) respIEs := resp.E2APPDU.Outcome.(models.SuccessfulOutcome).Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs - assert.Equal(t, "4", respIEs[0].ID) - assert.Equal(t, plmn, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity) - assert.Equal(t, ricNearRtId, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.RicID) - assert.Equal(t, "9", respIEs[1].ID) + assert.Equal(t, models.GlobalRicID, respIEs[1].ID) + assert.Equal(t, plmn, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity) + assert.Equal(t, ricNearRtId, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.RicID) + assert.Equal(t, models.RanFunctionsAcceptedID, respIEs[2].ID) } func TestNewE2SetupSuccessResponseMessageWithoutRanFunctionsSuccess(t *testing.T) { @@ -60,18 +62,19 @@ func TestNewE2SetupSuccessResponseMessageWithoutRanFunctionsSuccess(t *testing.T resp := models.NewE2SetupSuccessResponseMessage(plmn, ricNearRtId, setupRequest) respIEs := resp.E2APPDU.Outcome.(models.SuccessfulOutcome).Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs - assert.Equal(t, "4", respIEs[0].ID) - assert.Equal(t, plmn, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity) - assert.Equal(t, ricNearRtId, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.RicID) - assert.Equal(t, 1, len(respIEs)) + assert.Equal(t, models.GlobalRicID, respIEs[1].ID) + assert.Equal(t, plmn, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity) + assert.Equal(t, ricNearRtId, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.RicID) + assert.Equal(t, 3, len(respIEs)) } func TestNewE2SetupFailureResponseMessageSuccess(t *testing.T) { waitTime := models.TimeToWaitEnum.V60s cause := models.Cause{Misc: &models.CauseMisc{OmIntervention: &struct{}{}}} + setupRequest := getE2SetupRespTestE2SetupRequest(t, e2SetupRespGnbSetupRequestXmlPath) - resp := models.NewE2SetupFailureResponseMessage(waitTime, cause) + resp := models.NewE2SetupFailureResponseMessage(waitTime, cause, setupRequest) respIEs := resp.E2APPDU.Outcome.(models.UnsuccessfulOutcome).Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs - assert.Equal(t, "1", respIEs[0].ID) - assert.Equal(t, cause, respIEs[0].Value.Value.(models.Cause)) + assert.Equal(t, models.CauseID, respIEs[1].ID) + assert.Equal(t, cause, respIEs[1].Value.Value.(models.Cause)) } diff --git a/E2Manager/tests/resources/setupRequest/setupRequest_en-gNB.xml b/E2Manager/tests/resources/setupRequest/setupRequest_en-gNB.xml index bb2115f..68986af 100644 --- a/E2Manager/tests/resources/setupRequest/setupRequest_en-gNB.xml +++ b/E2Manager/tests/resources/setupRequest/setupRequest_en-gNB.xml @@ -7,6 +7,15 @@ + + 49 + + + + + 1 + + 3 @@ -42,6 +51,7 @@ 1 334455 0 + OID123 @@ -55,12 +65,39 @@ 7 334455 0 + OID123 + + 50 + + + + + 51 + + + + + + + nginterf + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + + diff --git a/E2Manager/tests/resources/setupRequest/setupRequest_enb.xml b/E2Manager/tests/resources/setupRequest/setupRequest_enb.xml index 230e06f..7bab858 100644 --- a/E2Manager/tests/resources/setupRequest/setupRequest_enb.xml +++ b/E2Manager/tests/resources/setupRequest/setupRequest_enb.xml @@ -7,6 +7,15 @@ + + 49 + + + + + 1 + + 3 @@ -63,6 +72,32 @@ + + 50 + + + + + 51 + + + + + + + nginterf + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + + diff --git a/E2Manager/tests/resources/setupRequest/setupRequest_gnb.xml b/E2Manager/tests/resources/setupRequest/setupRequest_gnb.xml index 847df6a..89e7ff2 100644 --- a/E2Manager/tests/resources/setupRequest/setupRequest_gnb.xml +++ b/E2Manager/tests/resources/setupRequest/setupRequest_gnb.xml @@ -7,6 +7,15 @@ + + 49 + + + + + 1 + + 3 @@ -44,6 +53,7 @@ 790280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010000010108004D6573736167652054797065206F6E6C7901010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D7020010101010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D70200101010101010001010780436F6D706C657465206D657373616765010101010101 1 + OID123 @@ -59,6 +69,7 @@ 680300674E422D4E5254000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E332E330D80674E42204E65696768626F75722052656C6174696F6E205461626C6500010105804E6F74696669636174696F6E01010001010680436F6D706C657465207461626C650101000001058041646454696D657374616D70200101010100010107804E5254206D6F64696669636174696F6E010101010100 1 + OID123 @@ -74,12 +85,39 @@ 450280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010100010108004D6573736167652054797065206F6E6C79010100010108004D6573736167652041646D697373696F6E01020400010180514349310002018041525031000301805350494400040300552D5445494431400A05004C6F61645F6F666673657400 1 + OID123 + + 50 + + + + + 51 + + + + + + + nginterf + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + + diff --git a/E2Manager/tests/resources/setupRequest/setupRequest_gnb_with_zero_functions.xml b/E2Manager/tests/resources/setupRequest/setupRequest_gnb_with_zero_functions.xml index 3246799..29f1256 100644 --- a/E2Manager/tests/resources/setupRequest/setupRequest_gnb_with_zero_functions.xml +++ b/E2Manager/tests/resources/setupRequest/setupRequest_gnb_with_zero_functions.xml @@ -7,6 +7,15 @@ + + 49 + + + + + 1 + + 3 @@ -35,6 +44,32 @@ + + 50 + + + + + 51 + + + + + + + nginterf + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + + diff --git a/E2Manager/tests/resources/setupRequest/setupRequest_gnb_without_functions.xml b/E2Manager/tests/resources/setupRequest/setupRequest_gnb_without_functions.xml index db28387..17f8134 100644 --- a/E2Manager/tests/resources/setupRequest/setupRequest_gnb_without_functions.xml +++ b/E2Manager/tests/resources/setupRequest/setupRequest_gnb_without_functions.xml @@ -7,6 +7,15 @@ + + 49 + + + + + 1 + + 3 @@ -27,6 +36,32 @@ + + 50 + + + + + 51 + + + + + + + nginterf + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + + diff --git a/E2Manager/tests/resources/setupRequest/setupRequest_ng-eNB.xml b/E2Manager/tests/resources/setupRequest/setupRequest_ng-eNB.xml index 6bcd1f1..cbcbe80 100644 --- a/E2Manager/tests/resources/setupRequest/setupRequest_ng-eNB.xml +++ b/E2Manager/tests/resources/setupRequest/setupRequest_ng-eNB.xml @@ -7,6 +7,15 @@ + + 49 + + + + + 1 + + 3 @@ -42,6 +51,7 @@ 1 334455 0 + OID123 @@ -55,12 +65,39 @@ 7 334455 0 + OID123 + + 50 + + + + + 51 + + + + + + + nginterf + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + + diff --git a/E2Manager/tests/resources/setupRequest/setupRequest_with_oid_gnb.xml b/E2Manager/tests/resources/setupRequest/setupRequest_with_oid_gnb.xml index d5d0bff..918b37f 100644 --- a/E2Manager/tests/resources/setupRequest/setupRequest_with_oid_gnb.xml +++ b/E2Manager/tests/resources/setupRequest/setupRequest_with_oid_gnb.xml @@ -7,6 +7,15 @@ + + 49 + + + + + 1 + + 3 @@ -83,6 +92,50 @@ + + 50 + + + + + 51 + + + + + + + nginterf1 + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + 51 + + + + + + + nginterf2 + + + + 72 65 71 70 61 72 74 + 72 65 73 70 61 72 74 + + + + + + +