X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2FrNibWriter%2FrNibWriter.go;h=71913bf0cd5fe546f26a0a7e9469572e0d062d60;hb=refs%2Fchanges%2F15%2F4315%2F1;hp=1a0b60ba767f57e73ceea5ed6795f6c11160d46a;hpb=19e72a51b5edbf108d230093fdf85b42fe5ab470;p=ric-plt%2Fe2mgr.git diff --git a/E2Manager/rNibWriter/rNibWriter.go b/E2Manager/rNibWriter/rNibWriter.go index 1a0b60b..71913bf 100644 --- a/E2Manager/rNibWriter/rNibWriter.go +++ b/E2Manager/rNibWriter/rNibWriter.go @@ -13,87 +13,109 @@ // 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 rNibWriter import ( - "errors" + "e2mgr/configuration" + "encoding/json" "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" - "gerrit.o-ran-sc.org/r/ric-plt/sdlgo" "github.com/golang/protobuf/proto" ) -var writerPool *common.Pool +const ( + E2TAddressesKey = "E2TAddresses" + RanAddedEvent = "ADDED" + RanUpdatedEvent = "UPDATED" + RanDeletedEvent = "DELETED" +) type rNibWriterInstance struct { - sdl *common.ISdlInstance - namespace string + sdl common.ISdlInstance + rnibWriterConfig configuration.RnibWriterConfig } /* RNibWriter interface allows saving data to the redis DB */ type RNibWriter interface { - SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) common.IRNibError - UpdateNodebInfo(nodebInfo *entities.NodebInfo) common.IRNibError - SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) common.IRNibError + SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error + UpdateNodebInfo(nodebInfo *entities.NodebInfo) error + SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error + SaveE2TInstance(e2tInstance *entities.E2TInstance) error + SaveE2TAddresses(addresses []string) error + RemoveE2TInstance(e2tAddress string) error + UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error + RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error + UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, stateChangeMessageChannel string, event string) error + SaveGeneralConfiguration(config *entities.GeneralConfiguration) error } /* -Init initializes the infrastructure required for the RNibWriter instance +GetRNibWriter returns reference to RNibWriter */ -func Init(namespace string, poolSize int) { - initPool(poolSize, - func() interface{} { - var sdlI common.ISdlInstance = sdlgo.NewSdlInstance(namespace, sdlgo.NewDatabase()) - return &rNibWriterInstance{sdl: &sdlI, namespace: namespace} - }, - func(obj interface{}) { - (*obj.(*rNibWriterInstance).sdl).Close() - }) + +func GetRNibWriter(sdl common.ISdlInstance, rnibWriterConfig configuration.RnibWriterConfig) RNibWriter { + return &rNibWriterInstance{sdl: sdl, rnibWriterConfig: rnibWriterConfig} } -/* -InitPool initializes the writer's instances pool -*/ -func initPool(poolSize int, newObj func() interface{}, destroyObj func(interface{})) { - writerPool = common.NewPool(poolSize, newObj, destroyObj) +func (w *rNibWriterInstance) RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error { + cellKeysToRemove := buildCellKeysToRemove(inventoryName, servedNrCells) + err := w.sdl.Remove(cellKeysToRemove) + + if err != nil { + return common.NewInternalError(err) + } + + return nil } -/* -GetRNibWriter returns RNibWriter instance from the pool -*/ -func GetRNibWriter() RNibWriter { - return writerPool.Get().(RNibWriter) +func (w *rNibWriterInstance) SaveGeneralConfiguration(config *entities.GeneralConfiguration) error { + + err := w.SaveWithKeyAndMarshal(common.BuildGeneralConfigurationKey(), config) + + if err != nil { + return common.NewInternalError(err) + } + + return nil } /* SaveNodeb saves nodeB entity data in the redis DB according to the specified data model */ -func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity *entities.NodebInfo) common.IRNibError { - +func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity *entities.NodebInfo) error { isNotEmptyIdentity := isNotEmpty(nbIdentity) - if isNotEmptyIdentity && entity.GetNodeType() == entities.Node_UNKNOWN { - return common.NewValidationError(errors.New(fmt.Sprintf("#rNibWriter.saveNodeB - Unknown responding node type, entity: %v", entity))) + nodeType := entity.GetNodeType() + + if isNotEmptyIdentity && nodeType == entities.Node_UNKNOWN { + return common.NewValidationError(fmt.Sprintf("#rNibWriter.saveNodeB - Unknown responding node type, entity: %v", entity)) } - defer writerPool.Put(w) + data, err := proto.Marshal(entity) + if err != nil { return common.NewInternalError(err) } + var pairs []interface{} key, rNibErr := common.ValidateAndBuildNodeBNameKey(nbIdentity.InventoryName) + if rNibErr != nil { return rNibErr } + pairs = append(pairs, key, data) if isNotEmptyIdentity { - key, rNibErr = common.ValidateAndBuildNodeBIdKey(entity.GetNodeType().String(), nbIdentity.GlobalNbId.GetPlmnId(), nbIdentity.GlobalNbId.GetNbId()) + + key, rNibErr = common.ValidateAndBuildNodeBIdKey(nodeType.String(), nbIdentity.GlobalNbId.GetPlmnId(), nbIdentity.GlobalNbId.GetNbId()) if rNibErr != nil { return rNibErr } @@ -101,18 +123,25 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity * } if entity.GetEnb() != nil { - pairs, rNibErr = appendEnbCells(nbIdentity, entity.GetEnb().GetServedCells(), pairs) + pairs, rNibErr = appendEnbCells(nbIdentity.InventoryName, entity.GetEnb().GetServedCells(), pairs) if rNibErr != nil { return rNibErr } } + if entity.GetGnb() != nil { - pairs, rNibErr = appendGnbCells(nbIdentity, entity.GetGnb().GetServedNrCells(), pairs) + pairs, rNibErr = appendGnbCells(nbIdentity.InventoryName, entity.GetGnb().GetServedNrCells(), pairs) if rNibErr != nil { return rNibErr } } - err = (*w.sdl).Set(pairs) + + if nodeType == entities.Node_ENB { + err = w.sdl.SetAndPublish([]string{w.rnibWriterConfig.RanManipulationMessageChannel, fmt.Sprintf("%s_%s", entity.RanName, RanAddedEvent)}, pairs) + } else { + err = w.sdl.Set(pairs) + } + if err != nil { return common.NewInternalError(err) } @@ -124,7 +153,7 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity * if err != nil { return common.NewInternalError(err) } - err = (*w.sdl).RemoveMember(entities.Node_UNKNOWN.String(), nbIdData) + err = w.sdl.RemoveMember(entities.Node_UNKNOWN.String(), nbIdData) if err != nil { return common.NewInternalError(err) } @@ -133,44 +162,100 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity * } nbIdData, err := proto.Marshal(nbIdentity) + if err != nil { return common.NewInternalError(err) } - err = (*w.sdl).AddMember(entity.GetNodeType().String(), nbIdData) + + err = w.sdl.AddMember(nodeType.String(), nbIdData) + if err != nil { return common.NewInternalError(err) } return nil } -/* -UpdateNodebInfo... -*/ -func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) common.IRNibError { +func (w *rNibWriterInstance) UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error { - defer writerPool.Put(w) + pairs, err := buildUpdateNodebInfoPairs(nodebInfo) - nodebNameKey, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.GetRanName()) + if err != nil { + return err + } - if rNibErr != nil { - return rNibErr + pairs, err = appendGnbCells(nodebInfo.RanName, servedNrCells, pairs) + + if err != nil { + return err + } + + err = w.sdl.Set(pairs) + + if err != nil { + return common.NewInternalError(err) + } + + return nil +} + +func buildCellKeysToRemove(inventoryName string, servedNrCellsToRemove []*entities.ServedNRCell) []string { + + cellKeysToRemove := []string{} + + for _, cell := range servedNrCellsToRemove { + + key, _ := common.ValidateAndBuildNrCellIdKey(cell.GetServedNrCellInformation().GetCellId()) + + if len(key) != 0 { + cellKeysToRemove = append(cellKeysToRemove, key) + } + + key, _ = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetServedNrCellInformation().GetNrPci()) + + if len(key) != 0 { + cellKeysToRemove = append(cellKeysToRemove, key) + } } - nodebIdKey, rNibErr := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId()) + return cellKeysToRemove +} + +func buildUpdateNodebInfoPairs(nodebInfo *entities.NodebInfo) ([]interface{}, error) { + nodebNameKey, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.GetRanName()) if rNibErr != nil { - return rNibErr + return []interface{}{}, rNibErr } + nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId()) + data, err := proto.Marshal(nodebInfo) if err != nil { - return common.NewInternalError(err) + return []interface{}{}, common.NewInternalError(err) } - var pairs []interface{} - pairs = append(pairs, nodebNameKey, data, nodebIdKey, data) - err = (*w.sdl).Set(pairs) + pairs := []interface{}{nodebNameKey, data} + + if buildNodebIdKeyError == nil { + pairs = append(pairs, nodebIdKey, data) + } + + return pairs, nil +} + +/* +UpdateNodebInfo... +*/ +func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error { + + pairs, err := buildUpdateNodebInfoPairs(nodebInfo) + + if err != nil { + return err + } + + err = w.sdl.Set(pairs) if err != nil { return common.NewInternalError(err) @@ -182,9 +267,7 @@ func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) comm /* SaveRanLoadInformation stores ran load information for the provided ran */ -func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) common.IRNibError { - - defer writerPool.Put(w) +func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error { key, rnibErr := common.ValidateAndBuildRanLoadInformationKey(inventoryName) @@ -201,7 +284,106 @@ func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoa var pairs []interface{} pairs = append(pairs, key, data) - err = (*w.sdl).Set(pairs) + err = w.sdl.Set(pairs) + + if err != nil { + return common.NewInternalError(err) + } + + return nil +} + +func (w *rNibWriterInstance) SaveE2TInstance(e2tInstance *entities.E2TInstance) error { + + key, rnibErr := common.ValidateAndBuildE2TInstanceKey(e2tInstance.Address) + + if rnibErr != nil { + return rnibErr + } + + data, err := json.Marshal(e2tInstance) + + if err != nil { + return common.NewInternalError(err) + } + + var pairs []interface{} + pairs = append(pairs, key, data) + + err = w.sdl.Set(pairs) + + if err != nil { + return common.NewInternalError(err) + } + + return nil +} + +func (w *rNibWriterInstance) SaveE2TAddresses(addresses []string) error { + + data, err := json.Marshal(addresses) + + if err != nil { + return common.NewInternalError(err) + } + + var pairs []interface{} + pairs = append(pairs, E2TAddressesKey, data) + + err = w.sdl.Set(pairs) + + if err != nil { + return common.NewInternalError(err) + } + + return nil +} + +func (w *rNibWriterInstance) RemoveE2TInstance(address string) error { + key, rNibErr := common.ValidateAndBuildE2TInstanceKey(address) + if rNibErr != nil { + return rNibErr + } + err := w.sdl.Remove([]string{key}) + + if err != nil { + return common.NewInternalError(err) + } + return nil +} + +func (w *rNibWriterInstance) SaveWithKeyAndMarshal(key string, entity interface{}) error { + + data, err := json.Marshal(entity) + + if err != nil { + return common.NewInternalError(err) + } + + var pairs []interface{} + pairs = append(pairs, key, data) + + err = w.sdl.Set(pairs) + + if err != nil { + return common.NewInternalError(err) + } + + return nil +} + +/* +UpdateNodebInfoOnConnectionStatusInversion... +*/ +func (w *rNibWriterInstance) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, stateChangeMessageChannel string, event string) error { + + pairs, err := buildUpdateNodebInfoPairs(nodebInfo) + + if err != nil { + return err + } + + err = w.sdl.SetAndPublish([]string{stateChangeMessageChannel, event}, pairs) if err != nil { return common.NewInternalError(err) @@ -211,13 +393,13 @@ func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoa } /* -Close closes writer's pool +Close the writer */ func Close() { - writerPool.Close() + //Nothing to do } -func appendEnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedCellInfo, pairs []interface{}) ([]interface{}, common.IRNibError) { +func appendEnbCells(inventoryName string, cells []*entities.ServedCellInfo, pairs []interface{}) ([]interface{}, error) { for _, cell := range cells { cellEntity := entities.Cell{Type: entities.Cell_LTE_CELL, Cell: &entities.Cell_ServedCellInfo{ServedCellInfo: cell}} cellData, err := proto.Marshal(&cellEntity) @@ -229,7 +411,7 @@ func appendEnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedCel return pairs, rNibErr } pairs = append(pairs, key, cellData) - key, rNibErr = common.ValidateAndBuildCellNamePciKey(nbIdentity.InventoryName, cell.GetPci()) + key, rNibErr = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetPci()) if rNibErr != nil { return pairs, rNibErr } @@ -238,7 +420,7 @@ func appendEnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedCel return pairs, nil } -func appendGnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedNRCell, pairs []interface{}) ([]interface{}, common.IRNibError) { +func appendGnbCells(inventoryName string, cells []*entities.ServedNRCell, pairs []interface{}) ([]interface{}, error) { for _, cell := range cells { cellEntity := entities.Cell{Type: entities.Cell_NR_CELL, Cell: &entities.Cell_ServedNrCell{ServedNrCell: cell}} cellData, err := proto.Marshal(&cellEntity) @@ -250,7 +432,7 @@ func appendGnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedNRC return pairs, rNibErr } pairs = append(pairs, key, cellData) - key, rNibErr = common.ValidateAndBuildCellNamePciKey(nbIdentity.InventoryName, cell.GetServedNrCellInformation().GetNrPci()) + key, rNibErr = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetServedNrCellInformation().GetNrPci()) if rNibErr != nil { return pairs, rNibErr }