sdlgo versions updated to v0.3.1
[ric-plt/nodeb-rnib.git] / reader / rNibReader.go
index 41d1e6b..e29399a 100644 (file)
 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