upload nodeb rnib reader version 1.0.5
[ric-plt/nodeb-rnib.git] / reader / rNibReader.go
diff --git a/reader/rNibReader.go b/reader/rNibReader.go
new file mode 100644 (file)
index 0000000..e24f4da
--- /dev/null
@@ -0,0 +1,223 @@
+//
+// Copyright 2019 AT&T Intellectual Property
+// Copyright 2019 Nokia
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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.
+
+package reader
+
+import (
+       "gerrit.ranco-dev-tools.eastus.cloudapp.azure.com/ric-plt/nodeb-rnib.git/entities"
+       "gerrit.ranco-dev-tools.eastus.cloudapp.azure.com/ric-plt/nodeb-rnib.git/common"
+       "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
+       "github.com/golang/protobuf/proto"
+       "github.com/pkg/errors"
+)
+
+var readerPool *common.Pool
+
+type rNibReaderInstance struct {
+       sdl       *common.ISdlInstance
+       namespace string
+}
+
+/*
+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)
+       // GetNodebByGlobalNbId retrieves responding nodeb entity from redis DB by nodeb global Id
+       GetNodebByGlobalNbId(nodeType entities.Node_Type, globalNbId *entities.GlobalNbId) (*entities.NodebInfo, common.IRNibError)
+       // 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)
+       // GetListGnbIds retrieves the list of gNodeb identity entities
+       GetListGnbIds()(*[]*entities.NbIdentity, common.IRNibError)
+       // GetListEnbIds retrieves the list of eNodeb identity entities
+       GetListEnbIds()(*[]*entities.NbIdentity, common.IRNibError)
+       // Close closes reader's pool
+       GetCountGnbList()(int, common.IRNibError)
+       // 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)
+       // 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)
+}
+/*
+ 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(obj interface{}) {
+               (*obj.(*rNibReaderInstance).sdl).Close()
+       })
+}
+
+func initPool(poolSize int, newObj func() interface{}, destroyObj func(interface{})) {
+       readerPool = common.NewPool(poolSize, newObj, destroyObj)
+}
+
+/*
+GetRNibReader returns RNibReader instance from the pool
+ */
+func GetRNibReader() RNibReader {
+       return readerPool.Get().(RNibReader)
+}
+
+func (w *rNibReaderInstance) GetNodeb(inventoryName string) (*entities.NodebInfo, common.IRNibError) {
+       name, rNibErr := common.ValidateAndBuildNodeBNameKey(inventoryName)
+       if rNibErr != nil{
+               return nil, rNibErr
+       }
+       defer readerPool.Put(w)
+       data, err := (*w.sdl).Get([]string{name})
+       if err != nil{
+               return nil, common.NewInternalError(err)
+       }
+       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
+       }
+       return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetNodeb - responding node %s not found", inventoryName))
+}
+
+func (w *rNibReaderInstance) GetNodebByGlobalNbId(nodeType entities.Node_Type, globalNbId *entities.GlobalNbId) (*entities.NodebInfo, common.IRNibError) {
+       key, rNibErr := common.ValidateAndBuildNodeBIdKey(nodeType.String(), globalNbId.GetPlmnId(), globalNbId.GetNbId())
+       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
+       }
+       return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetNodebByGlobalNbId - responding node not found, global nodeb Id: %s", key))
+}
+
+func (w *rNibReaderInstance) GetCellList(inventoryName string) (*entities.Cells, common.IRNibError){
+       cells := &entities.Cells{}
+       nb, err := w.GetNodeb(inventoryName)
+       if err != nil{
+               return nil, err
+       }
+       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()}}
+               return cells, nil
+       } else 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()}}
+               return cells, nil
+       }
+       return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetCellList - served cells not found. Responding node RAN name: %s.", inventoryName))
+}
+
+func (w *rNibReaderInstance) GetListGnbIds()(*[]*entities.NbIdentity, common.IRNibError){
+       defer readerPool.Put(w)
+       data, err := (*w.sdl).GetMembers("GNB")
+       if err != nil{
+               return nil, common.NewInternalError(err)
+       }
+       return unmarshalIdentityList(data)
+}
+
+func (w *rNibReaderInstance) GetListEnbIds()(*[]*entities.NbIdentity, common.IRNibError){
+       defer readerPool.Put(w)
+       data, err := (*w.sdl).GetMembers("ENB")
+       if err != nil{
+               return nil, common.NewInternalError(err)
+       }
+       return unmarshalIdentityList(data)
+}
+
+func (w *rNibReaderInstance) GetCountGnbList()(int, common.IRNibError){
+       defer readerPool.Put(w)
+       data, err := (*w.sdl).GetMembers("GNB")
+       if err != nil{
+               return 0, common.NewInternalError(err)
+       }
+       return len(data), nil
+}
+
+func (w *rNibReaderInstance) GetCell(inventoryName string, pci uint32) (*entities.Cell, common.IRNibError){
+       key, rNibErr := common.ValidateAndBuildCellNamePciKey(inventoryName, pci)
+       if rNibErr != nil{
+               return nil, rNibErr
+       }
+       return (*w).getCellByKey(key)
+}
+
+func (w *rNibReaderInstance) GetCellById(cellType entities.Cell_Type, cellId string) (*entities.Cell, common.IRNibError){
+       var key string
+       var rNibErr common.IRNibError
+       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))
+       }
+       if rNibErr != nil{
+               return nil, rNibErr
+       }
+       return (*w).getCellByKey(key)
+}
+
+func (w *rNibReaderInstance) getCellByKey(key string) (*entities.Cell, common.IRNibError){
+       defer readerPool.Put(w)
+       data, err := (*w.sdl).Get([]string{key})
+       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)
+               }
+               return &cell, nil
+       }
+       return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.getCellByKey - cell not found, key: %s", key))
+}
+
+func unmarshalIdentityList(data []string ) (*[]*entities.NbIdentity, common.IRNibError){
+       var members []*entities.NbIdentity
+       for _, d := range data{
+               member := entities.NbIdentity{}
+               err := proto.Unmarshal([]byte(d), &member)
+               if err != nil{
+                       return nil, common.NewInternalError(err)
+               }
+               members = append(members, &member)
+       }
+       return &members, nil
+}
+
+func Close(){
+       readerPool.Close()
+}
\ No newline at end of file