Implement creation of E2nodeConfigUpdateAck msg 96/8196/2
authorsubhash kumar singh <subh.singh@samsung.com>
Sun, 8 May 2022 20:05:37 +0000 (20:05 +0000)
committersubhash kumar singh <subh.singh@samsung.com>
Tue, 10 May 2022 16:35:00 +0000 (16:35 +0000)
Implemented creation of E2nodeConfigUpdateAck message.
It can be used to create an entity to create Ack message.

Signed-off-by: subhash kumar singh <subh.singh@samsung.com>
Change-Id: I86b4932e7cb25e1e3550e8810b46cd1e7783968a

E2Manager/models/constants.go
E2Manager/models/e2_node_configuration_update_ack.go
E2Manager/models/e2_node_configuration_update_ack_test.go [new file with mode: 0644]

index 2d1d235..a24b6de 100644 (file)
 package models
 
 const (
-       ProtocolIE_ID_id_RANfunctionID_Item            = "6"
-       ProtocolIE_ID_id_RANfunctionsAccepted          = "9"
-       ProtocolIE_ID_id_TransactionID                 = "49"
-       ProtocolIE_ID_id_E2nodeComponentConfigAddition = "50"
-       ProtocolIE_ID_id_E2nodeComponentConfigRemoval  = "54"
+       ProtocolIE_ID_id_RANfunctionID_Item                    = "6"
+       ProtocolIE_ID_id_RANfunctionsAccepted                  = "9"
+       ProtocolIE_ID_id_E2nodeComponentConfigUpdateAck        = "35"
+       ProtocolIE_ID_id_E2nodeComponentConfigUpdateAck_Item   = "36"
+       ProtocolIE_ID_id_TransactionID                         = "49"
+       ProtocolIE_ID_id_E2nodeComponentConfigAddition         = "50"
+       ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck      = "52"
+       ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck_Item = "53"
+       ProtocolIE_ID_id_E2nodeComponentConfigRemoval          = "54"
+       ProtocolIE_ID_id_E2nodeComponentConfigRemovalAck       = "56"
+       ProtocolIE_ID_id_E2nodeComponentConfigRemovalAck_Item  = "57"
 )
 
 const (
index fac1c9b..4c4a717 100644 (file)
@@ -20,6 +20,8 @@ package models
 
 import (
        "encoding/xml"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
 )
 
 type E2nodeConfigurationUpdateAcknowledgeE2APPDU struct {
@@ -132,3 +134,205 @@ type ComponentAckDetail struct {
        E2nodeComponentID            E2NodeComponentIDResp `xml:"e2nodeComponentID"`
        E2nodeConfigUpdateAck        E2nodeConfigUpdateAckResp
 }
+
+func prepareAdditionAckList(e2nodeConfigs []entities.E2NodeComponentConfig) []AdditionListProtocolIESingleContainer {
+       additionListAckSingle := []AdditionListProtocolIESingleContainer{}
+       for _, v := range e2nodeConfigs {
+               c := convertEntitiyToModelComponent(v)
+
+               t := AdditionListProtocolIESingleContainer{
+                       ID: ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck_Item,
+                       Value: struct {
+                               Text                                 string             `xml:",chardata"`
+                               E2nodeComponentConfigAdditionAckItem ComponentAckDetail `xml:"E2nodeComponentConfigAdditionAck-Item"`
+                       }{
+                               E2nodeComponentConfigAdditionAckItem: *c,
+                       },
+               }
+               additionListAckSingle = append(additionListAckSingle, t)
+       }
+       return additionListAckSingle
+}
+
+func prepareUpdateAckList(e2nodeConfigs []entities.E2NodeComponentConfig) []UpdateProtocolIESingleContainer {
+       updateListAckSingle := []UpdateProtocolIESingleContainer{}
+       for _, v := range e2nodeConfigs {
+               c := convertEntitiyToModelComponent(v)
+
+               t := UpdateProtocolIESingleContainer{
+                       ID: ProtocolIE_ID_id_E2nodeComponentConfigUpdateAck_Item,
+                       Value: struct {
+                               Text                               string             `xml:",chardata"`
+                               E2nodeComponentConfigUpdateAckItem ComponentAckDetail `xml:"E2nodeComponentConfigUpdateAck-Item"`
+                       }{
+                               E2nodeComponentConfigUpdateAckItem: *c,
+                       },
+               }
+               updateListAckSingle = append(updateListAckSingle, t)
+       }
+       return updateListAckSingle
+}
+
+func prepareRemovalAckList(e2nodeConfigs []entities.E2NodeComponentConfig) []RemovalProtocolIESingleContainer {
+       removalListAckSingle := []RemovalProtocolIESingleContainer{}
+       for _, v := range e2nodeConfigs {
+               c := convertEntitiyToModelComponent(v)
+
+               t := RemovalProtocolIESingleContainer{
+                       ID: ProtocolIE_ID_id_E2nodeComponentConfigRemovalAck_Item,
+                       Value: struct {
+                               Text                                string             `xml:",chardata"`
+                               E2nodeComponentConfigRemovalAckItem ComponentAckDetail `xml:"E2nodeComponentConfigRemovalAck-Item"`
+                       }{
+                               E2nodeComponentConfigRemovalAckItem: *c,
+                       },
+               }
+               removalListAckSingle = append(removalListAckSingle, t)
+       }
+       return removalListAckSingle
+}
+
+func updateIDAndStatus(t *ComponentAckDetail, c entities.E2NodeComponentConfig, succss bool) {
+       switch c.E2NodeComponentInterfaceType {
+       case entities.E2NodeComponentInterfaceType_ng:
+               t.E2nodeComponentID.Value = E2NodeIFTypeNG{
+                       AMFName: c.GetE2NodeComponentInterfaceTypeNG().AmfName,
+               }
+       case entities.E2NodeComponentInterfaceType_e1:
+               t.E2nodeComponentID.Value = E2NodeIFTypeE1{
+                       GNBCUCPID: c.GetE2NodeComponentInterfaceTypeE1().GetGNBCuCpId(),
+               }
+       case entities.E2NodeComponentInterfaceType_s1:
+               t.E2nodeComponentID.Value = E2NodeIFTypeS1{
+                       MMENAME: c.GetE2NodeComponentInterfaceTypeS1().GetMmeName(),
+               }
+       case entities.E2NodeComponentInterfaceType_f1:
+               t.E2nodeComponentID.Value = E2NodeIFTypeF1{
+                       GNBDUID: c.GetE2NodeComponentInterfaceTypeF1().GetGNBDuId(),
+               }
+       case entities.E2NodeComponentInterfaceType_w1:
+               t.E2nodeComponentID.Value = E2NodeIFTypeW1{
+                       NGENBDUID: c.GetE2NodeComponentInterfaceTypeW1().GetNgenbDuId(),
+               }
+       }
+
+       if succss {
+               t.E2nodeConfigUpdateAck = E2nodeConfigUpdateAckResp{
+                       Value: struct {
+                               XMLName xml.Name `xml:"updateOutcome"`
+                               Text    string   `xml:",chardata"`
+                               Success string   `xml:"success"`
+                       }{},
+               }
+       } else {
+               t.E2nodeConfigUpdateAck = E2nodeConfigUpdateAckResp{
+                       Value: struct {
+                               XMLName xml.Name `xml:"updateOutcome"`
+                               Text    string   `xml:",chardata"`
+                               Success string   `xml:"failure"`
+                       }{},
+               }
+       }
+}
+
+func updateInterfaceType(t *ComponentAckDetail, c entities.E2NodeComponentConfig) {
+       switch c.E2NodeComponentInterfaceType {
+       case entities.E2NodeComponentInterfaceType_ng:
+               t.E2nodeComponentInterfaceType = E2NodeComponentType{
+                       NG: &struct{}{},
+               }
+       case entities.E2NodeComponentInterfaceType_e1:
+               t.E2nodeComponentInterfaceType = E2NodeComponentType{
+                       E1: &struct{}{},
+               }
+       case entities.E2NodeComponentInterfaceType_f1:
+               t.E2nodeComponentInterfaceType = E2NodeComponentType{
+                       F1: &struct{}{},
+               }
+       case entities.E2NodeComponentInterfaceType_w1:
+               t.E2nodeComponentInterfaceType = E2NodeComponentType{
+                       W1: &struct{}{},
+               }
+       case entities.E2NodeComponentInterfaceType_s1:
+               t.E2nodeComponentInterfaceType = E2NodeComponentType{
+                       S1: &struct{}{},
+               }
+       }
+}
+
+func convertEntitiyToModelComponent(component entities.E2NodeComponentConfig) *ComponentAckDetail {
+       componentAckDetail := &ComponentAckDetail{}
+       updateInterfaceType(componentAckDetail, component)
+       updateIDAndStatus(componentAckDetail, component, true)
+       return componentAckDetail
+}
+
+func NewE2nodeConfigurationUpdateSuccessResponseMessage(e2nodeConfigupdateMessage *E2nodeConfigurationUpdateMessage) *E2nodeConfigurationUpdateAcknowledgeE2APPDU {
+       successfulOutcome := E2nodeConfigurationUpdateAcknowledgeSuccessfulOutcome{
+               ProcedureCode: ProcedureCode_id_E2nodeConfigurationUpdate,
+       }
+
+       e2nodeConfigurationUpdateAckIEs := []E2nodeConfigurationUpdateAcknowledgeIEs{}
+       txIEs := E2nodeConfigurationUpdateAcknowledgeIEs{
+               ID: ProtocolIE_ID_id_TransactionID,
+               Value: E2nodeConfigurationUpdateAcknowledgeTransID{
+                       TransactionID: e2nodeConfigupdateMessage.E2APPDU.InitiatingMessage.Value.E2nodeConfigurationUpdate.ProtocolIEs.E2nodeConfigurationUpdateIEs[0].Value.TransactionID,
+               },
+       }
+
+       e2nodeConfigurationUpdateAckIEs = append(e2nodeConfigurationUpdateAckIEs, txIEs)
+
+       items := e2nodeConfigupdateMessage.ExtractConfigAdditionList()
+       if len(items) > 0 {
+               addtionListAckIEs := E2nodeConfigurationUpdateAcknowledgeIEs{
+                       ID: ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck,
+                       Value: E2nodeComponentConfigAdditionAckList{
+                               E2nodeComponentConfigAdditionAckList: struct {
+                                       Text                      string                                  `xml:",chardata"`
+                                       ProtocolIESingleContainer []AdditionListProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+                               }{
+                                       ProtocolIESingleContainer: prepareAdditionAckList(items),
+                               },
+                       },
+               }
+               e2nodeConfigurationUpdateAckIEs = append(e2nodeConfigurationUpdateAckIEs, addtionListAckIEs)
+       }
+
+       items = e2nodeConfigupdateMessage.ExtractConfigUpdateList()
+       if len(items) > 0 {
+               updateListAckIEs := E2nodeConfigurationUpdateAcknowledgeIEs{
+                       ID: ProtocolIE_ID_id_E2nodeComponentConfigUpdateAck,
+                       Value: E2nodeComponentConfigUpdateAckList{
+                               E2nodeComponentConfigUpdateAckList: struct {
+                                       Text                      string                            `xml:",chardata"`
+                                       ProtocolIESingleContainer []UpdateProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+                               }{
+                                       ProtocolIESingleContainer: prepareUpdateAckList(items),
+                               },
+                       },
+               }
+               e2nodeConfigurationUpdateAckIEs = append(e2nodeConfigurationUpdateAckIEs, updateListAckIEs)
+       }
+
+       items = e2nodeConfigupdateMessage.ExtractConfigDeletionList()
+       if len(items) > 0 {
+               removalListAckIEs := E2nodeConfigurationUpdateAcknowledgeIEs{
+                       ID: ProtocolIE_ID_id_E2nodeComponentConfigRemovalAck,
+                       Value: E2nodeComponentConfigRemovalAckList{
+                               E2nodeComponentConfigRemovalAckList: struct {
+                                       Text                      string                             `xml:",chardata"`
+                                       ProtocolIESingleContainer []RemovalProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+                               }{
+                                       ProtocolIESingleContainer: prepareRemovalAckList(items),
+                               },
+                       },
+               }
+               e2nodeConfigurationUpdateAckIEs = append(e2nodeConfigurationUpdateAckIEs, removalListAckIEs)
+       }
+
+       successfulOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs = e2nodeConfigurationUpdateAckIEs
+       response := &E2nodeConfigurationUpdateAcknowledgeE2APPDU{
+               Outcome: successfulOutcome,
+       }
+       return response
+}
diff --git a/E2Manager/models/e2_node_configuration_update_ack_test.go b/E2Manager/models/e2_node_configuration_update_ack_test.go
new file mode 100644 (file)
index 0000000..0356178
--- /dev/null
@@ -0,0 +1,68 @@
+//
+// 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.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//  This source code is part of the near-RT RIC (RAN Intelligent Controller)
+//  platform project (RICP).
+
+package models_test
+
+import (
+       "e2mgr/models"
+       "testing"
+
+       "github.com/stretchr/testify/assert"
+)
+
+func TestNewE2nodeConfigurationUpdateSuccessResponseMessage(t *testing.T) {
+       configurationUpdate := getTestE2NodeConfigurationUpdateMessage(t, e2NodeConfigurationUpdateXmlPath)
+       ack := models.NewE2nodeConfigurationUpdateSuccessResponseMessage(configurationUpdate)
+       successOutcome := ack.Outcome.(models.E2nodeConfigurationUpdateAcknowledgeSuccessfulOutcome)
+
+       assert.Equal(t, models.ProcedureCode_id_E2nodeConfigurationUpdate, successOutcome.ProcedureCode)
+       assert.Equal(t, 4, len(successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs))
+
+       txIE := successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs[0]
+       assert.Equal(t, models.ProtocolIE_ID_id_TransactionID, txIE.ID)
+       assert.Equal(t, "1234", txIE.Value.(models.E2nodeConfigurationUpdateAcknowledgeTransID).TransactionID)
+
+       additionIE := successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs[1]
+       assert.Equal(t, models.ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck, additionIE.ID)
+       assert.Equal(t, 5, len(additionIE.Value.(models.E2nodeComponentConfigAdditionAckList).E2nodeComponentConfigAdditionAckList.ProtocolIESingleContainer))
+
+       updateIE := successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs[2]
+       assert.Equal(t, models.ProtocolIE_ID_id_E2nodeComponentConfigUpdateAck, updateIE.ID)
+       assert.Equal(t, 5, len(updateIE.Value.(models.E2nodeComponentConfigUpdateAckList).E2nodeComponentConfigUpdateAckList.ProtocolIESingleContainer))
+
+       removalIE := successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs[3]
+       assert.Equal(t, models.ProtocolIE_ID_id_E2nodeComponentConfigRemovalAck, removalIE.ID)
+       assert.Equal(t, 5, len(removalIE.Value.(models.E2nodeComponentConfigRemovalAckList).E2nodeComponentConfigRemovalAckList.ProtocolIESingleContainer))
+}
+
+func TestNewE2nodeConfigurationUpdateSuccessResponseMessageAdditionOnly(t *testing.T) {
+       configurationUpdate := getTestE2NodeConfigurationUpdateMessage(t, e2NodeConfigurationUpdateOnlyAdditionXmlPath)
+       ack := models.NewE2nodeConfigurationUpdateSuccessResponseMessage(configurationUpdate)
+       successOutcome := ack.Outcome.(models.E2nodeConfigurationUpdateAcknowledgeSuccessfulOutcome)
+
+       assert.Equal(t, models.ProcedureCode_id_E2nodeConfigurationUpdate, successOutcome.ProcedureCode)
+       assert.Equal(t, 2, len(successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs))
+
+       txIE := successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs[0]
+       assert.Equal(t, models.ProtocolIE_ID_id_TransactionID, txIE.ID)
+       assert.Equal(t, "1234", txIE.Value.(models.E2nodeConfigurationUpdateAcknowledgeTransID).TransactionID)
+
+       additionIE := successOutcome.Value.E2nodeConfigurationUpdateAcknowledge.ProtocolIEs.E2nodeConfigurationUpdateAcknowledgeIEs[1]
+       assert.Equal(t, models.ProtocolIE_ID_id_E2nodeComponentConfigAdditionAck, additionIE.ID)
+       assert.Equal(t, 1, len(additionIE.Value.(models.E2nodeComponentConfigAdditionAckList).E2nodeComponentConfigAdditionAckList.ProtocolIESingleContainer))
+}