2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
17 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 // platform project (RICP).
26 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
27 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
28 "github.com/golang/protobuf/proto"
32 E2TAddressesKey = "E2TAddresses"
33 RanAddedEvent = "ADDED"
34 RanUpdatedEvent = "UPDATED"
35 RanDeletedEvent = "DELETED"
38 type rNibWriterInstance struct {
39 sdl common.ISdlSyncStorage
40 rnibWriterConfig configuration.RnibWriterConfig
45 RNibWriter interface allows saving data to the redis DB
47 type RNibWriter interface {
48 SaveNodeb(nodebInfo *entities.NodebInfo) error
49 UpdateNodebInfo(nodebInfo *entities.NodebInfo) error
50 UpdateNodebInfoAndPublish(nodebInfo *entities.NodebInfo) error
51 SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error
52 SaveE2TInstance(e2tInstance *entities.E2TInstance) error
53 SaveE2TAddresses(addresses []string) error
54 RemoveE2TInstance(e2tAddress string) error
55 UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error
56 RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error
57 UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, ent string) error
58 SaveGeneralConfiguration(config *entities.GeneralConfiguration) error
59 RemoveEnb(nodebInfo *entities.NodebInfo) error
60 RemoveServedCells(inventoryName string, servedCells []*entities.ServedCellInfo) error
61 UpdateEnb(nodebInfo *entities.NodebInfo, servedCells []*entities.ServedCellInfo) error
62 AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
63 RemoveNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
64 AddEnb(nodebInfo *entities.NodebInfo) error
65 UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error
69 GetRNibWriter returns reference to RNibWriter
72 func GetRNibWriter(sdl common.ISdlSyncStorage, rnibWriterConfig configuration.RnibWriterConfig) RNibWriter {
73 return &rNibWriterInstance{
75 rnibWriterConfig: rnibWriterConfig,
76 ns: common.GetRNibNamespace(),
80 func getChannelsAndEventsPair(channel string, ranName string, event string) []string {
81 return []string{channel, fmt.Sprintf("%s_%s", ranName, event)}
84 func (w *rNibWriterInstance) AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error {
85 nbIdData, err := proto.Marshal(nbIdentity)
88 return common.NewInternalError(err)
91 err = w.sdl.AddMember(w.ns, nodeType.String(), nbIdData)
94 return common.NewInternalError(err)
99 func (w *rNibWriterInstance) RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error {
100 cellKeysToRemove := buildServedNRCellKeysToRemove(inventoryName, servedNrCells)
102 err := w.sdl.Remove(w.ns, cellKeysToRemove)
105 return common.NewInternalError(err)
111 func (w *rNibWriterInstance) RemoveServedCells(inventoryName string, servedCells []*entities.ServedCellInfo) error {
112 cellKeysToRemove := buildServedCellInfoKeysToRemove(inventoryName, servedCells)
114 err := w.sdl.Remove(w.ns, cellKeysToRemove)
117 return common.NewInternalError(err)
123 func (w *rNibWriterInstance) SaveGeneralConfiguration(config *entities.GeneralConfiguration) error {
125 err := w.SaveWithKeyAndMarshal(common.BuildGeneralConfigurationKey(), config)
128 return common.NewInternalError(err)
135 SaveNodeb saves nodeB entity data in the redis DB according to the specified data model
137 func (w *rNibWriterInstance) SaveNodeb(nodebInfo *entities.NodebInfo) error {
139 data, err := proto.Marshal(nodebInfo)
142 return common.NewInternalError(err)
145 var pairs []interface{}
146 key, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.RanName)
152 pairs = append(pairs, key, data)
154 if nodebInfo.GlobalNbId != nil {
156 key, rNibErr = common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
160 pairs = append(pairs, key, data)
163 if nodebInfo.GetEnb() != nil {
164 pairs, rNibErr = appendEnbCells(nodebInfo.RanName, nodebInfo.GetEnb().GetServedCells(), pairs)
170 if nodebInfo.GetGnb() != nil {
171 pairs, rNibErr = appendGnbCells(nodebInfo.RanName, nodebInfo.GetGnb().GetServedNrCells(), pairs)
177 err = w.sdl.Set(w.ns, pairs)
180 return common.NewInternalError(err)
186 func (w *rNibWriterInstance) AddEnb(nodebInfo *entities.NodebInfo) error {
188 data, err := proto.Marshal(nodebInfo)
191 return common.NewInternalError(err)
194 var pairs []interface{}
195 key, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.RanName)
201 pairs = append(pairs, key, data)
203 if nodebInfo.GlobalNbId != nil {
205 key, rNibErr = common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
209 pairs = append(pairs, key, data)
212 pairs, rNibErr = appendEnbCells(nodebInfo.RanName, nodebInfo.GetEnb().GetServedCells(), pairs)
217 channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanAddedEvent)
218 err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
220 return common.NewInternalError(err)
226 func (w *rNibWriterInstance) UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error {
228 nbIdIdentitiesToRemove, err := w.buildNbIdentitiesMembers(oldNbIdentities)
233 err = w.sdl.RemoveMember(w.ns, nodeType.String(), nbIdIdentitiesToRemove[:]...)
238 nbIdIdentitiesToAdd, err := w.buildNbIdentitiesMembers(newNbIdentities)
243 err = w.sdl.AddMember(w.ns, nodeType.String(), nbIdIdentitiesToAdd[:]...)
251 func (w *rNibWriterInstance) UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error {
253 pairs, err := buildUpdateNodebInfoPairs(nodebInfo)
259 pairs, err = appendGnbCells(nodebInfo.RanName, servedNrCells, pairs)
265 channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanUpdatedEvent)
266 err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
269 return common.NewInternalError(err)
275 func buildServedNRCellKeysToRemove(inventoryName string, servedNrCellsToRemove []*entities.ServedNRCell) []string {
277 var cellKeysToRemove []string
279 for _, cell := range servedNrCellsToRemove {
281 key, _ := common.ValidateAndBuildNrCellIdKey(cell.GetServedNrCellInformation().GetCellId())
284 cellKeysToRemove = append(cellKeysToRemove, key)
287 key, _ = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetServedNrCellInformation().GetNrPci())
290 cellKeysToRemove = append(cellKeysToRemove, key)
294 return cellKeysToRemove
297 func buildServedCellInfoKeysToRemove(inventoryName string, servedCellsToRemove []*entities.ServedCellInfo) []string {
299 var cellKeysToRemove []string
301 for _, cell := range servedCellsToRemove {
303 key, _ := common.ValidateAndBuildCellIdKey(cell.GetCellId())
306 cellKeysToRemove = append(cellKeysToRemove, key)
309 key, _ = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetPci())
312 cellKeysToRemove = append(cellKeysToRemove, key)
316 return cellKeysToRemove
319 func buildUpdateNodebInfoPairs(nodebInfo *entities.NodebInfo) ([]interface{}, error) {
320 nodebNameKey, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.GetRanName())
323 return []interface{}{}, rNibErr
326 nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
328 data, err := proto.Marshal(nodebInfo)
331 return []interface{}{}, common.NewInternalError(err)
334 pairs := []interface{}{nodebNameKey, data}
336 if buildNodebIdKeyError == nil {
337 pairs = append(pairs, nodebIdKey, data)
343 func (w *rNibWriterInstance) buildRemoveEnbKeys(nodebInfo *entities.NodebInfo) ([]string, error) {
344 keys := buildServedCellInfoKeysToRemove(nodebInfo.GetRanName(), nodebInfo.GetEnb().GetServedCells())
346 nodebNameKey, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.GetRanName())
349 return []string{}, rNibErr
352 keys = append(keys, nodebNameKey)
354 nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
356 if buildNodebIdKeyError == nil {
357 keys = append(keys, nodebIdKey)
363 func (w *rNibWriterInstance) RemoveNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error {
364 nbIdData, err := proto.Marshal(nbIdentity)
366 return common.NewInternalError(err)
368 err = w.sdl.RemoveMember(w.ns, nodeType.String(), nbIdData)
370 return common.NewInternalError(err)
375 func (w *rNibWriterInstance) updateNodebInfo(nodebInfo *entities.NodebInfo, publish bool) error {
377 pairs, err := buildUpdateNodebInfoPairs(nodebInfo)
384 channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanUpdatedEvent)
385 err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
387 err = w.sdl.Set(w.ns, pairs)
391 return common.NewInternalError(err)
400 func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error {
401 return w.updateNodebInfo(nodebInfo, false)
405 UpdateNodebInfoAndPublish...
407 func (w *rNibWriterInstance) UpdateNodebInfoAndPublish(nodebInfo *entities.NodebInfo) error {
408 return w.updateNodebInfo(nodebInfo, true)
412 SaveRanLoadInformation stores ran load information for the provided ran
414 func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error {
416 key, rnibErr := common.ValidateAndBuildRanLoadInformationKey(inventoryName)
422 data, err := proto.Marshal(ranLoadInformation)
425 return common.NewInternalError(err)
428 var pairs []interface{}
429 pairs = append(pairs, key, data)
431 err = w.sdl.Set(w.ns, pairs)
434 return common.NewInternalError(err)
440 func (w *rNibWriterInstance) SaveE2TInstance(e2tInstance *entities.E2TInstance) error {
442 key, rnibErr := common.ValidateAndBuildE2TInstanceKey(e2tInstance.Address)
448 data, err := json.Marshal(e2tInstance)
451 return common.NewInternalError(err)
454 var pairs []interface{}
455 pairs = append(pairs, key, data)
457 err = w.sdl.Set(w.ns, pairs)
460 return common.NewInternalError(err)
466 func (w *rNibWriterInstance) SaveE2TAddresses(addresses []string) error {
468 data, err := json.Marshal(addresses)
471 return common.NewInternalError(err)
474 var pairs []interface{}
475 pairs = append(pairs, E2TAddressesKey, data)
477 err = w.sdl.Set(w.ns, pairs)
480 return common.NewInternalError(err)
486 func (w *rNibWriterInstance) RemoveE2TInstance(address string) error {
487 key, rNibErr := common.ValidateAndBuildE2TInstanceKey(address)
491 err := w.sdl.Remove(w.ns, []string{key})
494 return common.NewInternalError(err)
499 func (w *rNibWriterInstance) SaveWithKeyAndMarshal(key string, entity interface{}) error {
501 data, err := json.Marshal(entity)
504 return common.NewInternalError(err)
507 var pairs []interface{}
508 pairs = append(pairs, key, data)
510 err = w.sdl.Set(w.ns, pairs)
513 return common.NewInternalError(err)
520 UpdateNodebInfoOnConnectionStatusInversion...
522 func (w *rNibWriterInstance) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error {
524 pairs, err := buildUpdateNodebInfoPairs(nodebInfo)
530 err = w.sdl.SetAndPublish(w.ns, []string{w.rnibWriterConfig.StateChangeMessageChannel, event}, pairs)
533 return common.NewInternalError(err)
539 func (w *rNibWriterInstance) RemoveEnb(nodebInfo *entities.NodebInfo) error {
540 keysToRemove, err := w.buildRemoveEnbKeys(nodebInfo)
545 channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanDeletedEvent)
546 err = w.sdl.RemoveAndPublish(w.ns, channelsAndEvents, keysToRemove)
549 return common.NewInternalError(err)
555 func (w *rNibWriterInstance) UpdateEnb(nodebInfo *entities.NodebInfo, servedCells []*entities.ServedCellInfo) error {
557 pairs, err := buildUpdateNodebInfoPairs(nodebInfo)
563 pairs, err = appendEnbCells(nodebInfo.RanName, servedCells, pairs)
569 channelsAndEvents := getChannelsAndEventsPair(w.rnibWriterConfig.RanManipulationMessageChannel, nodebInfo.RanName, RanUpdatedEvent)
570 err = w.sdl.SetAndPublish(w.ns, channelsAndEvents, pairs)
573 return common.NewInternalError(err)
579 func (w *rNibWriterInstance) buildNbIdentitiesMembers(nbIdentities []*entities.NbIdentity) ([]interface{}, error) {
581 var nbIdIdentitiesMembers []interface{}
582 for _, nbIdentity := range nbIdentities {
584 nbIdData, err := proto.Marshal(nbIdentity)
586 return nil, common.NewInternalError(err)
588 nbIdIdentitiesMembers = append(nbIdIdentitiesMembers, nbIdData)
591 return nbIdIdentitiesMembers, nil
601 func appendEnbCells(inventoryName string, cells []*entities.ServedCellInfo, pairs []interface{}) ([]interface{}, error) {
602 for _, cell := range cells {
603 cellEntity := entities.Cell{Type: entities.Cell_LTE_CELL, Cell: &entities.Cell_ServedCellInfo{ServedCellInfo: cell}}
604 cellData, err := proto.Marshal(&cellEntity)
606 return pairs, common.NewInternalError(err)
608 key, rNibErr := common.ValidateAndBuildCellIdKey(cell.GetCellId())
610 return pairs, rNibErr
612 pairs = append(pairs, key, cellData)
613 key, rNibErr = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetPci())
615 return pairs, rNibErr
617 pairs = append(pairs, key, cellData)
622 func appendGnbCells(inventoryName string, cells []*entities.ServedNRCell, pairs []interface{}) ([]interface{}, error) {
623 for _, cell := range cells {
624 cellEntity := entities.Cell{Type: entities.Cell_NR_CELL, Cell: &entities.Cell_ServedNrCell{ServedNrCell: cell}}
625 cellData, err := proto.Marshal(&cellEntity)
627 return pairs, common.NewInternalError(err)
629 key, rNibErr := common.ValidateAndBuildNrCellIdKey(cell.GetServedNrCellInformation().GetCellId())
631 return pairs, rNibErr
633 pairs = append(pairs, key, cellData)
634 key, rNibErr = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetServedNrCellInformation().GetNrPci())
636 return pairs, rNibErr
638 pairs = append(pairs, key, cellData)