X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=reader%2FrNibReader.go;h=e29399af4471ef364cba334491143865e1b7c7ee;hb=refs%2Fheads%2Fr2;hp=41d1e6be828ecc08360359d6ab5edeed8b2e55aa;hpb=538c6deadda6e1cf3583a6fd22e1720ba12b3d1a;p=ric-plt%2Fnodeb-rnib.git diff --git a/reader/rNibReader.go b/reader/rNibReader.go index 41d1e6b..e29399a 100644 --- a/reader/rNibReader.go +++ b/reader/rNibReader.go @@ -17,11 +17,11 @@ package reader import ( - "gerrit.o-ran-sc.org/r/a/ric-plt/nodeb-rnib.git/entities" - "gerrit.o-ran-sc.org/r/a/ric-plt/nodeb-rnib.git/common" + "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" - "github.com/pkg/errors" + "reflect" ) var readerPool *common.Pool @@ -33,37 +33,45 @@ type rNibReaderInstance struct { /* RNibReader interface allows retrieving data from redis BD by various keys - */ +*/ type RNibReader interface { // GetNodeb retrieves responding nodeb entity from redis DB by nodeb inventory name - GetNodeb(inventoryName string) (*entities.NodebInfo, common.IRNibError) + GetNodeb(inventoryName string) (*entities.NodebInfo, error) // GetNodebByGlobalNbId retrieves responding nodeb entity from redis DB by nodeb global Id - GetNodebByGlobalNbId(nodeType entities.Node_Type, globalNbId *entities.GlobalNbId) (*entities.NodebInfo, common.IRNibError) + GetNodebByGlobalNbId(nodeType entities.Node_Type, globalNbId *entities.GlobalNbId) (*entities.NodebInfo, error) // GetCellList retrieves the list of cell entities belonging to responding nodeb entity from redis DB by nodeb inventory name - GetCellList(inventoryName string) (*entities.Cells, common.IRNibError) + GetCellList(inventoryName string) (*entities.Cells, error) // GetListGnbIds retrieves the list of gNodeb identity entities - GetListGnbIds()(*[]*entities.NbIdentity, common.IRNibError) + GetListGnbIds() ([]*entities.NbIdentity, error) // GetListEnbIds retrieves the list of eNodeb identity entities - GetListEnbIds()(*[]*entities.NbIdentity, common.IRNibError) + GetListEnbIds() ([]*entities.NbIdentity, error) // Close closes reader's pool - GetCountGnbList()(int, common.IRNibError) + GetCountGnbList() (int, error) // GetCell retrieves the cell entity belonging to responding nodeb from redis DB by nodeb inventory name and cell pci - GetCell(inventoryName string, pci uint32) (*entities.Cell, common.IRNibError) + GetCell(inventoryName string, pci uint32) (*entities.Cell, error) // GetCellById retrieves the cell entity from redis DB by cell type and cell Id - GetCellById(cellType entities.Cell_Type, cellId string) (*entities.Cell, common.IRNibError) + GetCellById(cellType entities.Cell_Type, cellId string) (*entities.Cell, error) + // GetListNodebIds returns the full list of Nodeb identity entities + GetListNodebIds()([]*entities.NbIdentity, error) + // GetRanLoadInformation retrieves nodeb load information entity from redis DB by nodeb inventory name + GetRanLoadInformation(inventoryName string) (*entities.RanLoadInformation, error) } + /* Init initializes the infrastructure required for the RNibReader instance */ func Init(namespace string, poolSize int) { initPool(poolSize, - func() interface{} { - var sdlI common.ISdlInstance = sdlgo.NewSdlInstance(namespace, sdlgo.NewDatabase()) - return &rNibReaderInstance{sdl: &sdlI, namespace: namespace} - }, + func() interface{} { + var sdlI common.ISdlInstance = sdlgo.NewSdlInstance(namespace, sdlgo.NewDatabase()) + return &rNibReaderInstance{sdl: &sdlI, namespace: namespace} + }, func(obj interface{}) { - (*obj.(*rNibReaderInstance).sdl).Close() - }) + i, ok := obj.(*rNibReaderInstance) + if ok{ + (*i.sdl).Close() + } + }) } func initPool(poolSize int, newObj func() interface{}, destroyObj func(interface{})) { @@ -71,153 +79,193 @@ func initPool(poolSize int, newObj func() interface{}, destroyObj func(interface } /* -GetRNibReader returns RNibReader instance from the pool - */ +GetRNibReader returns reference to RNibReader +*/ func GetRNibReader() RNibReader { - return readerPool.Get().(RNibReader) + return &rNibReaderInstance{} } -func (w *rNibReaderInstance) GetNodeb(inventoryName string) (*entities.NodebInfo, common.IRNibError) { - name, rNibErr := common.ValidateAndBuildNodeBNameKey(inventoryName) - if rNibErr != nil{ - return nil, rNibErr - } + +func (*rNibReaderInstance) GetNodeb(inventoryName string) (*entities.NodebInfo, error) { + w := readerPool.Get().(*rNibReaderInstance) defer readerPool.Put(w) - data, err := (*w.sdl).Get([]string{name}) - if err != nil{ - return nil, common.NewInternalError(err) + key, rNibErr := common.ValidateAndBuildNodeBNameKey(inventoryName) + if rNibErr != nil { + return nil, rNibErr } - nb := entities.NodebInfo{} - if data != nil && data[name] != nil{ - err = proto.Unmarshal( []byte(data[name].(string)), &nb) - if err != nil{ - return nil, common.NewInternalError(err) - } - return &nb, nil + nbInfo := &entities.NodebInfo{} + err := w.getByKeyAndUnmarshal(key, nbInfo) + if err!= nil{ + return nil, err } - return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetNodeb - responding node %s not found", inventoryName)) + return nbInfo, nil } -func (w *rNibReaderInstance) GetNodebByGlobalNbId(nodeType entities.Node_Type, globalNbId *entities.GlobalNbId) (*entities.NodebInfo, common.IRNibError) { +func (*rNibReaderInstance) GetNodebByGlobalNbId(nodeType entities.Node_Type, globalNbId *entities.GlobalNbId) (*entities.NodebInfo, error) { + w := readerPool.Get().(*rNibReaderInstance) + defer readerPool.Put(w) key, rNibErr := common.ValidateAndBuildNodeBIdKey(nodeType.String(), globalNbId.GetPlmnId(), globalNbId.GetNbId()) - if rNibErr != nil{ + if rNibErr != nil { return nil, rNibErr } - defer readerPool.Put(w) - data, err := (*w.sdl).Get([]string{key}) - if err != nil{ - return nil, common.NewInternalError(err) - } - nb := entities.NodebInfo{} - if data != nil && data[key] != nil{ - err = proto.Unmarshal( []byte(data[key].(string)), &nb) - if err != nil{ - return nil, common.NewInternalError(err) - } - return &nb, nil + nbInfo := &entities.NodebInfo{} + err := w.getByKeyAndUnmarshal(key, nbInfo) + if err!= nil{ + return nil, err } - return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetNodebByGlobalNbId - responding node not found, global nodeb Id: %s", key)) + return nbInfo, nil } -func (w *rNibReaderInstance) GetCellList(inventoryName string) (*entities.Cells, common.IRNibError){ +func (w *rNibReaderInstance) GetCellList(inventoryName string) (*entities.Cells, error) { cells := &entities.Cells{} nb, err := w.GetNodeb(inventoryName) - if err != nil{ + if err != nil { return nil, err } - if nb.GetEnb() != nil && len(nb.GetEnb().GetServedCells()) > 0{ + if nb.GetEnb() != nil && len(nb.GetEnb().GetServedCells()) > 0 { cells.Type = entities.Cell_LTE_CELL - cells.List = &entities.Cells_ServedCellInfos{ServedCellInfos:&entities.ServedCellInfoList{ServedCells:nb.GetEnb().GetServedCells()}} + cells.List = &entities.Cells_ServedCellInfos{ServedCellInfos: &entities.ServedCellInfoList{ServedCells: nb.GetEnb().GetServedCells()}} return cells, nil - } else if nb.GetGnb() != nil && len(nb.GetGnb().GetServedNrCells()) > 0{ + } + if nb.GetGnb() != nil && len(nb.GetGnb().GetServedNrCells()) > 0 { cells.Type = entities.Cell_NR_CELL - cells.List = &entities.Cells_ServedNrCells{ServedNrCells:&entities.ServedNRCellList{ServedCells:nb.GetGnb().GetServedNrCells()}} + cells.List = &entities.Cells_ServedNrCells{ServedNrCells: &entities.ServedNRCellList{ServedCells: nb.GetGnb().GetServedNrCells()}} return cells, nil } - return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetCellList - served cells not found. Responding node RAN name: %s.", inventoryName)) + return nil, common.NewResourceNotFoundErrorf("#rNibReader.GetCellList - served cells not found. Responding node RAN name: %s.", inventoryName) } -func (w *rNibReaderInstance) GetListGnbIds()(*[]*entities.NbIdentity, common.IRNibError){ +func (*rNibReaderInstance) GetListGnbIds() ([]*entities.NbIdentity, error) { + w := readerPool.Get().(*rNibReaderInstance) defer readerPool.Put(w) - data, err := (*w.sdl).GetMembers("GNB") - if err != nil{ - return nil, common.NewInternalError(err) - } - return unmarshalIdentityList(data) + return w.getListNodebIdsByType(entities.Node_GNB.String()) } -func (w *rNibReaderInstance) GetListEnbIds()(*[]*entities.NbIdentity, common.IRNibError){ +func (*rNibReaderInstance) GetListEnbIds() ([]*entities.NbIdentity, error) { + w := readerPool.Get().(*rNibReaderInstance) defer readerPool.Put(w) - data, err := (*w.sdl).GetMembers("ENB") - if err != nil{ - return nil, common.NewInternalError(err) - } - return unmarshalIdentityList(data) + return w.getListNodebIdsByType(entities.Node_ENB.String()) } -func (w *rNibReaderInstance) GetCountGnbList()(int, common.IRNibError){ +func (*rNibReaderInstance) GetCountGnbList() (int, error) { + w := readerPool.Get().(*rNibReaderInstance) defer readerPool.Put(w) - data, err := (*w.sdl).GetMembers("GNB") - if err != nil{ + size, err := (*w.sdl).GroupSize(entities.Node_GNB.String()) + if err != nil { return 0, common.NewInternalError(err) } - return len(data), nil + return int(size), nil } -func (w *rNibReaderInstance) GetCell(inventoryName string, pci uint32) (*entities.Cell, common.IRNibError){ +func (*rNibReaderInstance) GetCell(inventoryName string, pci uint32) (*entities.Cell, error) { + w := readerPool.Get().(*rNibReaderInstance) + defer readerPool.Put(w) key, rNibErr := common.ValidateAndBuildCellNamePciKey(inventoryName, pci) - if rNibErr != nil{ + if rNibErr != nil { return nil, rNibErr } - return (*w).getCellByKey(key) + cell := &entities.Cell{} + err := w.getByKeyAndUnmarshal(key, cell) + if err!= nil{ + return nil, err + } + return cell, err } -func (w *rNibReaderInstance) GetCellById(cellType entities.Cell_Type, cellId string) (*entities.Cell, common.IRNibError){ +func (*rNibReaderInstance) GetCellById(cellType entities.Cell_Type, cellId string) (*entities.Cell, error) { + w := readerPool.Get().(*rNibReaderInstance) + defer readerPool.Put(w) var key string - var rNibErr common.IRNibError + var rNibErr error if cellType == entities.Cell_LTE_CELL { key, rNibErr = common.ValidateAndBuildCellIdKey(cellId) } else if cellType == entities.Cell_NR_CELL { key, rNibErr = common.ValidateAndBuildNrCellIdKey(cellId) } else { - return nil, common.NewValidationError(errors.Errorf("#rNibReader.GetCellById - invalid cell type: %v", cellType)) + return nil, common.NewValidationErrorf("#rNibReader.GetCellById - invalid cell type: %v", cellType) } - if rNibErr != nil{ + if rNibErr != nil { return nil, rNibErr } - return (*w).getCellByKey(key) + cell := &entities.Cell{} + err := w.getByKeyAndUnmarshal(key, cell) + if err!= nil{ + return nil, err + } + return cell, err } -func (w *rNibReaderInstance) getCellByKey(key string) (*entities.Cell, common.IRNibError){ +func (*rNibReaderInstance) GetListNodebIds()([]*entities.NbIdentity, error){ + w := readerPool.Get().(*rNibReaderInstance) defer readerPool.Put(w) - data, err := (*w.sdl).Get([]string{key}) + dataEnb, err := (*w.sdl).GetMembers(entities.Node_ENB.String()) if err != nil{ return nil, common.NewInternalError(err) } - cell := entities.Cell{} - if data != nil && data[key] != nil{ - err = proto.Unmarshal( []byte(data[key].(string)), &cell) - if err != nil{ - return nil, common.NewInternalError(err) + dataGnb, err := (*w.sdl).GetMembers(entities.Node_GNB.String()) + if err != nil{ + return nil, common.NewInternalError(err) + } + dataUnknown, err := (*w.sdl).GetMembers(entities.Node_UNKNOWN.String()) + if err != nil{ + return nil, common.NewInternalError(err) + } + allIds := append(dataEnb, dataGnb...) + allIds = append(allIds, dataUnknown...) + data, rnibErr := w.unmarshalIdentityList(allIds) + return data, rnibErr +} + +func (*rNibReaderInstance) GetRanLoadInformation(inventoryName string) (*entities.RanLoadInformation, error){ + w := readerPool.Get().(*rNibReaderInstance) + key, rNibErr := common.ValidateAndBuildRanLoadInformationKey(inventoryName) + if rNibErr != nil { + return nil, rNibErr + } + loadInfo := &entities.RanLoadInformation{} + err := w.getByKeyAndUnmarshal(key, loadInfo) + if err!= nil{ + return nil, err + } + return loadInfo, err +} + +func (w *rNibReaderInstance) getByKeyAndUnmarshal(key string, entity proto.Message)error{ + data, err := (*w.sdl).Get([]string{key}) + if err != nil { + return common.NewInternalError(err) + } + if data != nil && data[key] != nil { + err = proto.Unmarshal([]byte(data[key].(string)), entity) + if err != nil { + return common.NewInternalError(err) } - return &cell, nil + return nil + } + return common.NewResourceNotFoundErrorf("#rNibReader.getByKeyAndUnmarshal - entity of type %s not found. Key: %s", reflect.TypeOf(entity).String(), key) +} + +func (w *rNibReaderInstance) getListNodebIdsByType(nbType string) ([]*entities.NbIdentity, error) { + data, err := (*w.sdl).GetMembers(nbType) + if err != nil { + return nil, common.NewInternalError(err) } - return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.getCellByKey - cell not found, key: %s", key)) + return w.unmarshalIdentityList(data) } -func unmarshalIdentityList(data []string ) (*[]*entities.NbIdentity, common.IRNibError){ +func (w *rNibReaderInstance) unmarshalIdentityList(data []string) ([]*entities.NbIdentity, error) { var members []*entities.NbIdentity - for _, d := range data{ + for _, d := range data { member := entities.NbIdentity{} err := proto.Unmarshal([]byte(d), &member) - if err != nil{ + if err != nil { return nil, common.NewInternalError(err) } members = append(members, &member) } - return &members, nil + return members, nil } -func Close(){ +func Close() { readerPool.Close() } \ No newline at end of file