RIC-11565:Add support for Multiple E2 Nodes: CU/DU for the case having same GNBId
[ric-plt/e2mgr.git] / E2Manager / rNibWriter / rNibWriter.go
index 7678fb3..fdc1aaf 100644 (file)
@@ -1,6 +1,7 @@
 //
 // Copyright 2019 AT&T Intellectual Property
 // Copyright 2019 Nokia
+// Copyright 2023 Capgemini
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -36,8 +37,9 @@ const (
 )
 
 type rNibWriterInstance struct {
-       sdl              common.ISdlInstance
+       sdl              common.ISdlSyncStorage
        rnibWriterConfig configuration.RnibWriterConfig
+       ns               string
 }
 
 /*
@@ -46,6 +48,7 @@ RNibWriter interface allows saving data to the redis DB
 type RNibWriter interface {
        SaveNodeb(nodebInfo *entities.NodebInfo) error
        UpdateNodebInfo(nodebInfo *entities.NodebInfo) error
+       UpdateNodebInfoAndPublish(nodebInfo *entities.NodebInfo) error
        SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error
        SaveE2TInstance(e2tInstance *entities.E2TInstance) error
        SaveE2TAddresses(addresses []string) error
@@ -60,14 +63,19 @@ type RNibWriter interface {
        AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
        RemoveNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
        AddEnb(nodebInfo *entities.NodebInfo) error
+       UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error
 }
 
 /*
 GetRNibWriter returns reference to RNibWriter
 */
 
-func GetRNibWriter(sdl common.ISdlInstance, rnibWriterConfig configuration.RnibWriterConfig) RNibWriter {
-       return &rNibWriterInstance{sdl: sdl, rnibWriterConfig: rnibWriterConfig}
+func GetRNibWriter(sdl common.ISdlSyncStorage, rnibWriterConfig configuration.RnibWriterConfig) RNibWriter {
+       return &rNibWriterInstance{
+               sdl:              sdl,
+               rnibWriterConfig: rnibWriterConfig,
+               ns:               common.GetRNibNamespace(),
+       }
 }
 
 func getChannelsAndEventsPair(channel string, ranName string, event string) []string {
@@ -81,7 +89,7 @@ func (w *rNibWriterInstance) AddNbIdentity(nodeType entities.Node_Type, nbIdenti
                return common.NewInternalError(err)
        }
 
-       err = w.sdl.AddMember(nodeType.String(), nbIdData)
+       err = w.sdl.AddMember(w.ns, nodeType.String(), nbIdData)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -92,7 +100,7 @@ func (w *rNibWriterInstance) AddNbIdentity(nodeType entities.Node_Type, nbIdenti
 func (w *rNibWriterInstance) RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error {
        cellKeysToRemove := buildServedNRCellKeysToRemove(inventoryName, servedNrCells)
 
-       err := w.sdl.Remove(cellKeysToRemove)
+       err := w.sdl.Remove(w.ns, cellKeysToRemove)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -104,7 +112,7 @@ func (w *rNibWriterInstance) RemoveServedNrCells(inventoryName string, servedNrC
 func (w *rNibWriterInstance) RemoveServedCells(inventoryName string, servedCells []*entities.ServedCellInfo) error {
        cellKeysToRemove := buildServedCellInfoKeysToRemove(inventoryName, servedCells)
 
-       err := w.sdl.Remove(cellKeysToRemove)
+       err := w.sdl.Remove(w.ns, cellKeysToRemove)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -146,7 +154,7 @@ func (w *rNibWriterInstance) SaveNodeb(nodebInfo *entities.NodebInfo) error {
 
        if nodebInfo.GlobalNbId != nil {
 
-               key, rNibErr = common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
+               key, rNibErr = common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId(),nodebInfo.GetCuUpId(),nodebInfo.GetDuId())
                if rNibErr != nil {
                        return rNibErr
                }
@@ -167,7 +175,7 @@ func (w *rNibWriterInstance) SaveNodeb(nodebInfo *entities.NodebInfo) error {
                }
        }
 
-       err = w.sdl.Set(pairs)
+       err = w.sdl.Set(w.ns, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -195,7 +203,7 @@ func (w *rNibWriterInstance) AddEnb(nodebInfo *entities.NodebInfo) error {
 
        if nodebInfo.GlobalNbId != nil {
 
-               key, rNibErr = common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
+               key, rNibErr = common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId(),nodebInfo.GetCuUpId(),nodebInfo.GetDuId())
                if rNibErr != nil {
                        return rNibErr
                }
@@ -208,7 +216,7 @@ func (w *rNibWriterInstance) AddEnb(nodebInfo *entities.NodebInfo) error {
        }
 
        channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanAddedEvent)
-       err = w.sdl.SetAndPublish(channelsAndEvents, pairs)
+       err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
        if err != nil {
                return common.NewInternalError(err)
        }
@@ -216,6 +224,31 @@ func (w *rNibWriterInstance) AddEnb(nodebInfo *entities.NodebInfo) error {
        return nil
 }
 
+func (w *rNibWriterInstance) UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error {
+
+       nbIdIdentitiesToRemove, err := w.buildNbIdentitiesMembers(oldNbIdentities)
+       if err != nil {
+               return err
+       }
+
+       err = w.sdl.RemoveMember(w.ns, nodeType.String(), nbIdIdentitiesToRemove[:]...)
+       if err != nil {
+               return err
+       }
+
+       nbIdIdentitiesToAdd, err := w.buildNbIdentitiesMembers(newNbIdentities)
+       if err != nil {
+               return err
+       }
+
+       err = w.sdl.AddMember(w.ns, nodeType.String(), nbIdIdentitiesToAdd[:]...)
+       if err != nil {
+               return err
+       }
+
+       return nil
+}
+
 func (w *rNibWriterInstance) UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error {
 
        pairs, err := buildUpdateNodebInfoPairs(nodebInfo)
@@ -231,7 +264,7 @@ func (w *rNibWriterInstance) UpdateGnbCells(nodebInfo *entities.NodebInfo, serve
        }
 
        channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanUpdatedEvent)
-       err = w.sdl.SetAndPublish(channelsAndEvents, pairs)
+       err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -291,7 +324,7 @@ func buildUpdateNodebInfoPairs(nodebInfo *entities.NodebInfo) ([]interface{}, er
                return []interface{}{}, rNibErr
        }
 
-       nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
+       nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId(),nodebInfo.GetCuUpId(),nodebInfo.GetDuId())
 
        data, err := proto.Marshal(nodebInfo)
 
@@ -319,7 +352,7 @@ func (w *rNibWriterInstance) buildRemoveEnbKeys(nodebInfo *entities.NodebInfo) (
 
        keys = append(keys, nodebNameKey)
 
-       nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
+       nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId(),nodebInfo.GetCuUpId(),nodebInfo.GetDuId())
 
        if buildNodebIdKeyError == nil {
                keys = append(keys, nodebIdKey)
@@ -333,17 +366,14 @@ func (w *rNibWriterInstance) RemoveNbIdentity(nodeType entities.Node_Type, nbIde
        if err != nil {
                return common.NewInternalError(err)
        }
-       err = w.sdl.RemoveMember(nodeType.String(), nbIdData)
+       err = w.sdl.RemoveMember(w.ns, nodeType.String(), nbIdData)
        if err != nil {
                return common.NewInternalError(err)
        }
        return nil
 }
 
-/*
-UpdateNodebInfo...
-*/
-func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error {
+func (w *rNibWriterInstance) updateNodebInfo(nodebInfo *entities.NodebInfo, publish bool) error {
 
        pairs, err := buildUpdateNodebInfoPairs(nodebInfo)
 
@@ -351,7 +381,12 @@ func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) erro
                return err
        }
 
-       err = w.sdl.Set(pairs)
+       if publish {
+               channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanUpdatedEvent)
+               err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
+       } else {
+               err = w.sdl.Set(w.ns, pairs)
+       }
 
        if err != nil {
                return common.NewInternalError(err)
@@ -360,6 +395,20 @@ func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) erro
        return nil
 }
 
+/*
+UpdateNodebInfo...
+*/
+func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error {
+       return w.updateNodebInfo(nodebInfo, false)
+}
+
+/*
+UpdateNodebInfoAndPublish...
+*/
+func (w *rNibWriterInstance) UpdateNodebInfoAndPublish(nodebInfo *entities.NodebInfo) error {
+       return w.updateNodebInfo(nodebInfo, true)
+}
+
 /*
 SaveRanLoadInformation stores ran load information for the provided ran
 */
@@ -380,7 +429,7 @@ func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoa
        var pairs []interface{}
        pairs = append(pairs, key, data)
 
-       err = w.sdl.Set(pairs)
+       err = w.sdl.Set(w.ns, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -406,7 +455,7 @@ func (w *rNibWriterInstance) SaveE2TInstance(e2tInstance *entities.E2TInstance)
        var pairs []interface{}
        pairs = append(pairs, key, data)
 
-       err = w.sdl.Set(pairs)
+       err = w.sdl.Set(w.ns, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -426,7 +475,7 @@ func (w *rNibWriterInstance) SaveE2TAddresses(addresses []string) error {
        var pairs []interface{}
        pairs = append(pairs, E2TAddressesKey, data)
 
-       err = w.sdl.Set(pairs)
+       err = w.sdl.Set(w.ns, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -440,7 +489,7 @@ func (w *rNibWriterInstance) RemoveE2TInstance(address string) error {
        if rNibErr != nil {
                return rNibErr
        }
-       err := w.sdl.Remove([]string{key})
+       err := w.sdl.Remove(w.ns, []string{key})
 
        if err != nil {
                return common.NewInternalError(err)
@@ -459,7 +508,7 @@ func (w *rNibWriterInstance) SaveWithKeyAndMarshal(key string, entity interface{
        var pairs []interface{}
        pairs = append(pairs, key, data)
 
-       err = w.sdl.Set(pairs)
+       err = w.sdl.Set(w.ns, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -479,7 +528,7 @@ func (w *rNibWriterInstance) UpdateNodebInfoOnConnectionStatusInversion(nodebInf
                return err
        }
 
-       err = w.sdl.SetAndPublish([]string{w.rnibWriterConfig.StateChangeMessageChannel, event}, pairs)
+       err = w.sdl.SetAndPublish(w.ns, []string{w.rnibWriterConfig.StateChangeMessageChannel, event}, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -495,7 +544,7 @@ func (w *rNibWriterInstance) RemoveEnb(nodebInfo *entities.NodebInfo) error {
        }
 
        channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanDeletedEvent)
-       err = w.sdl.RemoveAndPublish(channelsAndEvents, keysToRemove)
+       err = w.sdl.RemoveAndPublish(w.ns, channelsAndEvents, keysToRemove)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -519,7 +568,7 @@ func (w *rNibWriterInstance) UpdateEnb(nodebInfo *entities.NodebInfo, servedCell
        }
 
        channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanUpdatedEvent)
-       err = w.sdl.SetAndPublish(channelsAndEvents, pairs)
+       err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
 
        if err != nil {
                return common.NewInternalError(err)
@@ -528,6 +577,21 @@ func (w *rNibWriterInstance) UpdateEnb(nodebInfo *entities.NodebInfo, servedCell
        return nil
 }
 
+func (w *rNibWriterInstance) buildNbIdentitiesMembers(nbIdentities []*entities.NbIdentity) ([]interface{}, error) {
+
+       var nbIdIdentitiesMembers []interface{}
+       for _, nbIdentity := range nbIdentities {
+
+               nbIdData, err := proto.Marshal(nbIdentity)
+               if err != nil {
+                       return nil, common.NewInternalError(err)
+               }
+               nbIdIdentitiesMembers = append(nbIdIdentitiesMembers, nbIdData)
+       }
+
+       return nbIdIdentitiesMembers, nil
+}
+
 /*
 Close the writer
 */