LF RNIB Adaptation 73/473/2
authorMohamed Abukar <abukar.mohamed@nokia.com>
Fri, 5 Jul 2019 10:40:11 +0000 (13:40 +0300)
committerMohamed Abukar <abukar.mohamed@nokia.com>
Fri, 5 Jul 2019 10:44:36 +0000 (13:44 +0300)
Change-Id: Ibfddb7688559c77803a5df025c5bbdbcf1ce2e8d
Signed-off-by: Mohamed Abukar <abukar.mohamed@nokia.com>
go.mod
go.sum
pkg/rnib/iSdlInstance.go [new file with mode: 0755]
pkg/rnib/rNibWriter.go [new file with mode: 0755]
pkg/xapp/config.go
pkg/xapp/db.go
pkg/xapp/logger.go
pkg/xapp/mtypes.go
pkg/xapp/xapp.go
pkg/xapp/xapp_test.go

diff --git a/go.mod b/go.mod
index c325e2e..15e652a 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -4,14 +4,28 @@ go 1.12
 
 require (
        gerrit.o-ran-sc.org/r/com/golog v0.0.1
-       gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.1.1
+       gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.8
+       gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.8
+       gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.8
+       gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.2.2
+       gerrit.o-ran-sc.org/r/ric-plt/ue-nib v0.0.1
        github.com/BurntSushi/toml v0.3.1 // indirect
        github.com/fsnotify/fsnotify v1.4.7
+       github.com/golang/protobuf v1.3.1
        github.com/gorilla/mux v1.7.1
+       github.com/pkg/errors v0.8.1
        github.com/prometheus/client_golang v0.9.3
        github.com/spf13/viper v1.3.2
 )
 
-replace gerrit.o-ran-sc.org/r/ric-plt/sdlgo => gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.1.1
+replace gerrit.o-ran-sc.org/r/ric-plt/sdlgo => gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0
 
 replace gerrit.o-ran-sc.org/r/com/golog => gerrit.o-ran-sc.org/r/com/golog.git v0.0.0-20190604083303-aaffc8ebe3f1
+
+replace gerrit.o-ran-sc.org/r/ric-plt/ue-nib => gerrit.o-ran-sc.org/r/ric-plt/ue-nib.git v0.0.1
+
+replace gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common => gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.8
+
+replace gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities => gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.8
+
+replace gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader => gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.8
diff --git a/go.sum b/go.sum
index 2ff7b84..d058434 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -1,7 +1,17 @@
 gerrit.o-ran-sc.org/r/com/golog.git v0.0.0-20190604083303-aaffc8ebe3f1 h1:WAB8G/FFaUjRkpLuUhIo0EfbeBOY7xjkcFAFkpe3Xns=
 gerrit.o-ran-sc.org/r/com/golog.git v0.0.0-20190604083303-aaffc8ebe3f1/go.mod h1:b8YB31U8/4iRpABioeSzGi/YMzOQ/Zq7hrJmmXKqlJk=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.8 h1:KaSOJmMDsb3IW+YGHLrr5X36zRjcaclexPG9AiLBoRY=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.8/go.mod h1:XZBjA22t5rvzU4SrSGfa9TpSfPOgxhA1I3oJwWFdEM4=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.8 h1:25mglk3nUhSkVYnpxJH2SF9SccY2ecLio/OGBsJLNjk=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.8/go.mod h1:GXiXLz4ORBeIr0FLIbzENRykgh3Po5uPkX2jICxnRF0=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.8 h1:nvJjn4VyRGuyp5irasfFSPKW4zNDTh12sfky53UaqL4=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.8/go.mod h1:wqyKCJkXzU/UqeuRBUv3QrMHYVI544wdoMav3aeJXdE=
 gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.1.1 h1:D2fU0/YXdqSNYsmptSBbkDfG76uBFKjnhQiq5cD4WT4=
 gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.1.1/go.mod h1:2Y8gw2jqj9urI8VFqFQn7BX0J3A852+YrXVV9V8gOt4=
+gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0 h1:7edCLIQtk9xCwxTtLRUlXr8wQ6nmr/Mo4ZoqjF3m0NE=
+gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0/go.mod h1:2Y8gw2jqj9urI8VFqFQn7BX0J3A852+YrXVV9V8gOt4=
+gerrit.o-ran-sc.org/r/ric-plt/ue-nib.git v0.0.1 h1:XTb9hvfgnULlWjPeuIuD5vM5zZQqsau4GpYG2ceVYnw=
+gerrit.o-ran-sc.org/r/ric-plt/ue-nib.git v0.0.1/go.mod h1:vI0LM0KDGTseR28jXafdHud9zGZZauj5ETwUCKBC+3A=
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@@ -56,6 +66,8 @@ github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
diff --git a/pkg/rnib/iSdlInstance.go b/pkg/rnib/iSdlInstance.go
new file mode 100755 (executable)
index 0000000..2c7ee51
--- /dev/null
@@ -0,0 +1,47 @@
+//
+// 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 writer
+
+/*
+ISdlInstance integrates (wraps) the functionality that sdlgo library provides
+*/
+type ISdlInstance interface {
+       SubscribeChannel(cb func(string, ...string), channels ...string) error
+       UnsubscribeChannel(channels ...string) error
+       Close() error
+       SetAndPublish(channelsAndEvents []string, pairs ...interface{}) error
+       Set(pairs ...interface{}) error
+       Get(keys []string) (map[string]interface{}, error)
+       SetIfAndPublish(channelsAndEvents []string, key string, oldData, newData interface{}) (bool, error)
+       SetIf(key string, oldData, newData interface{}) (bool, error)
+       SetIfNotExistsAndPublish(channelsAndEvents []string, key string, data interface{}) (bool, error)
+       SetIfNotExists(key string, data interface{}) (bool, error)
+       RemoveAndPublish(channelsAndEvents []string, keys []string) error
+       Remove(keys []string) error
+       RemoveIfAndPublish(channelsAndEvents []string, key string, data interface{}) (bool, error)
+       RemoveIf(key string, data interface{}) (bool, error)
+       GetAll() ([]string, error)
+       RemoveAll() error
+       RemoveAllAndPublish(channelsAndEvents []string) error
+       AddMember(group string, member ...interface{}) error
+       RemoveMember(group string, member ...interface{}) error
+       RemoveGroup(group string) error
+       GetMembers(group string) ([]string, error)
+       IsMember(group string, member interface{}) (bool, error)
+       GroupSize(group string) (int64, error)
+}
diff --git a/pkg/rnib/rNibWriter.go b/pkg/rnib/rNibWriter.go
new file mode 100755 (executable)
index 0000000..cc8e49f
--- /dev/null
@@ -0,0 +1,181 @@
+//
+// 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 writer
+
+import (
+       "errors"
+       "fmt"
+       rnibcommon "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
+       rnibentities "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 *rnibcommon.Pool
+
+type rNibWriterInstance struct {
+       sdl       *ISdlInstance
+       namespace string
+}
+
+/*
+RNibWriter interface allows saving data to the redis BD
+*/
+type RNibWriter interface {
+       SaveNodeb(nbIdentity *rnibentities.NbIdentity, nb *rnibentities.NodebInfo) rnibcommon.IRNibError
+}
+
+/*
+Init initializes the infrastructure required for the RNibWriter instance
+*/
+func InitWriter(namespace string, poolSize int) {
+       initWriterPool(poolSize,
+               func() interface{} {
+                       var sdlI ISdlInstance = sdlgo.NewSdlInstance(namespace, sdlgo.NewDatabase())
+                       return &rNibWriterInstance{sdl: &sdlI, namespace: namespace}
+               },
+               func(obj interface{}) {
+                       (*obj.(*rNibWriterInstance).sdl).Close()
+               })
+}
+
+/*
+InitPool initializes the writer's instances pool
+*/
+func initWriterPool(poolSize int, newObj func() interface{}, destroyObj func(interface{})) {
+       writerPool = rnibcommon.NewPool(poolSize, newObj, destroyObj)
+}
+
+/*
+GetRNibWriter returns RNibWriter instance from the pool
+*/
+func GetRNibWriter() RNibWriter {
+       return writerPool.Get().(RNibWriter)
+}
+
+/*
+SaveNodeb saves nodeB entity data in the redis DB according to the specified data model
+*/
+func (w *rNibWriterInstance) SaveNodeb(nbIdentity *rnibentities.NbIdentity, entity *rnibentities.NodebInfo) rnibcommon.IRNibError {
+
+       isNotEmptyIdentity := isNotEmpty(nbIdentity)
+
+       if isNotEmptyIdentity && entity.GetNodeType() == rnibentities.Node_UNKNOWN {
+               return rnibcommon.NewValidationError(errors.New(fmt.Sprintf("#rNibWriter.saveNodeB - Unknown responding node type, entity: %v", entity)))
+       }
+       defer writerPool.Put(w)
+       data, err := proto.Marshal(entity)
+       if err != nil {
+               return rnibcommon.NewInternalError(err)
+       }
+       var pairs []interface{}
+       key, rNibErr := rnibcommon.ValidateAndBuildNodeBNameKey(nbIdentity.InventoryName)
+       if rNibErr != nil {
+               return rNibErr
+       }
+       pairs = append(pairs, key, data)
+
+       if isNotEmptyIdentity {
+               key, rNibErr = rnibcommon.ValidateAndBuildNodeBIdKey(entity.GetNodeType().String(), nbIdentity.GlobalNbId.GetPlmnId(), nbIdentity.GlobalNbId.GetNbId())
+               if rNibErr != nil {
+                       return rNibErr
+               }
+               pairs = append(pairs, key, data)
+       }
+
+       if entity.GetEnb() != nil {
+               pairs, rNibErr = appendEnbCells(nbIdentity, entity.GetEnb().GetServedCells(), pairs)
+               if rNibErr != nil {
+                       return rNibErr
+               }
+       }
+       if entity.GetGnb() != nil {
+               pairs, rNibErr = appendGnbCells(nbIdentity, entity.GetGnb().GetServedNrCells(), pairs)
+               if rNibErr != nil {
+                       return rNibErr
+               }
+       }
+       err = (*w.sdl).Set(pairs)
+       if err != nil {
+               return rnibcommon.NewInternalError(err)
+       }
+       if isNotEmptyIdentity {
+               nbIdData, err := proto.Marshal(nbIdentity)
+               if err != nil {
+                       return rnibcommon.NewInternalError(err)
+               }
+               err = (*w.sdl).AddMember(entity.GetNodeType().String(), nbIdData)
+               if err != nil {
+                       return rnibcommon.NewInternalError(err)
+               }
+       }
+       return nil
+}
+
+/*
+Close closes writer's pool
+*/
+func CloseWriter() {
+       writerPool.Close()
+}
+
+func appendEnbCells(nbIdentity *rnibentities.NbIdentity, cells []*rnibentities.ServedCellInfo, pairs []interface{}) ([]interface{}, rnibcommon.IRNibError) {
+       for _, cell := range cells {
+               cellEntity := rnibentities.Cell{Type: rnibentities.Cell_LTE_CELL, Cell: &rnibentities.Cell_ServedCellInfo{ServedCellInfo: cell}}
+               cellData, err := proto.Marshal(&cellEntity)
+               if err != nil {
+                       return pairs, rnibcommon.NewInternalError(err)
+               }
+               key, rNibErr := rnibcommon.ValidateAndBuildCellIdKey(cell.GetCellId())
+               if rNibErr != nil {
+                       return pairs, rNibErr
+               }
+               pairs = append(pairs, key, cellData)
+               key, rNibErr = rnibcommon.ValidateAndBuildCellNamePciKey(nbIdentity.InventoryName, cell.GetPci())
+               if rNibErr != nil {
+                       return pairs, rNibErr
+               }
+               pairs = append(pairs, key, cellData)
+       }
+       return pairs, nil
+}
+
+func appendGnbCells(nbIdentity *rnibentities.NbIdentity, cells []*rnibentities.ServedNRCell, pairs []interface{}) ([]interface{}, rnibcommon.IRNibError) {
+       for _, cell := range cells {
+               cellEntity := rnibentities.Cell{Type: rnibentities.Cell_NR_CELL, Cell: &rnibentities.Cell_ServedNrCell{ServedNrCell: cell}}
+               cellData, err := proto.Marshal(&cellEntity)
+               if err != nil {
+                       return pairs, rnibcommon.NewInternalError(err)
+               }
+               key, rNibErr := rnibcommon.ValidateAndBuildNrCellIdKey(cell.GetServedNrCellInformation().GetCellId())
+               if rNibErr != nil {
+                       return pairs, rNibErr
+               }
+               pairs = append(pairs, key, cellData)
+               key, rNibErr = rnibcommon.ValidateAndBuildCellNamePciKey(nbIdentity.InventoryName, cell.GetServedNrCellInformation().GetNrPci())
+               if rNibErr != nil {
+                       return pairs, rNibErr
+               }
+               pairs = append(pairs, key, cellData)
+       }
+       return pairs, nil
+}
+
+func isNotEmpty(nbIdentity *rnibentities.NbIdentity) bool {
+       return nbIdentity.GlobalNbId != nil && nbIdentity.GlobalNbId.PlmnId != "" && nbIdentity.GlobalNbId.NbId != ""
+}
index 647b3eb..0493059 100755 (executable)
@@ -80,3 +80,7 @@ func (*Configurator) GetString(key string) string {
 func (*Configurator) GetInt(key string) int {
        return viper.GetInt(key)
 }
+
+func (*Configurator) GetBool(key string) bool {
+       return viper.GetBool(key)
+}
index 542c755..779e2cd 100755 (executable)
 package xapp
 
 import (
+       rnibcommon "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
+       rnibentities "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       rnibreader "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
        sdl "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
+       uenibprotobuf "gerrit.o-ran-sc.org/r/ric-plt/ue-nib/uernibprotobuf"
+       uenibreader "gerrit.o-ran-sc.org/r/ric-plt/ue-nib/uernibreader"
+       uenibwriter "gerrit.o-ran-sc.org/r/ric-plt/ue-nib/uernibwriter"
+       rnibwriter "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/rnib"
        "sync"
        "time"
 )
@@ -40,8 +47,44 @@ type SDLClient struct {
        ready bool
 }
 
+// Alias
+type EventCategory = uenibreader.EventCategory
+type EventCallback = uenibreader.EventCallback
+type MeasResultNR = uenibprotobuf.MeasResultNR
+type MeasQuantityResults = uenibprotobuf.MeasResultNR_MeasQuantityResults
+type MeasResultServMO = uenibprotobuf.MeasResults_MeasResultServMO
+type MeasResults = uenibprotobuf.MeasResults
+
+type UENIBClient struct {
+       reader *uenibreader.Reader
+       writer *uenibwriter.Writer
+}
+
+// Alias
+type RNIBNodeType = rnibentities.Node_Type
+type RNIBGlobalNbId = rnibentities.GlobalNbId
+type RNIBNodebInfo = rnibentities.NodebInfo
+type RNIBIRNibError = rnibcommon.IRNibError
+type RNIBCells = rnibentities.Cells
+type RNIBNbIdentity = rnibentities.NbIdentity
+type RNIBCellType = rnibentities.Cell_Type
+type RNIBCell = rnibentities.Cell
+type RNIBEnb = rnibentities.Enb
+type RNIBGnb = rnibentities.Gnb
+
+const RNIBNodeENB = rnibentities.Node_ENB
+const RNIBNodeGNB = rnibentities.Node_GNB
+
+type RNIBServedCellInfo = rnibentities.ServedCellInfo
+type RNIBNodebInfoEnb = rnibentities.NodebInfo_Enb
+type RNIBNodebInfoGnb = rnibentities.NodebInfo_Gnb
+type RNIBServedNRCell = rnibentities.ServedNRCell
+type RNIBServedNRCellInformation = rnibentities.ServedNRCellInformation
+type RNIBNrNeighbourInformation = rnibentities.NrNeighbourInformation
+
 type RNIBClient struct {
-       db *sdl.SdlInstance
+       reader rnibreader.RNibReader
+       writer rnibwriter.RNibWriter
 }
 
 // NewSDLClient returns a new SDLClient.
@@ -134,39 +177,74 @@ func (c *SDLClient) GetStat() (t SDLStatistics) {
        return
 }
 
-// To be removed ...
+func NewUENIBClient() *UENIBClient {
+       return &UENIBClient{
+               reader: uenibreader.NewReader(),
+               writer: uenibwriter.NewWriter(),
+       }
+}
+
+func (u *UENIBClient) StoreUeMeasurement(gNbId string, gNbUeX2ApId string, data *uenibprotobuf.MeasResults) error {
+       return u.writer.UpdateUeMeasurement(gNbId, gNbUeX2ApId, data)
+}
+
+func (u *UENIBClient) CreateUeContext(gNbId string, gNbUeX2ApId string) error {
+       return u.writer.UeContextAddComplete(gNbId, gNbUeX2ApId)
+}
+
+func (u *UENIBClient) ReleaseUeContext(gNbId string, gNbUeX2ApId string) error {
+       return u.writer.RemoveUeContext(gNbId, gNbUeX2ApId)
+}
+
+func (u *UENIBClient) ReadUeMeasurement(gNbId string, gNbUeX2ApId string) (*uenibprotobuf.MeasResults, error) {
+       return u.reader.GetUeMeasurement(gNbId, gNbUeX2ApId)
+}
+
+func (u *UENIBClient) SubscribeEvents(gNbIDs []string, eventCategories []EventCategory, cb EventCallback) error {
+       return u.reader.SubscribeEvents(gNbIDs, eventCategories, cb)
+}
+
 func NewRNIBClient(ns string) *RNIBClient {
+       rnibreader.Init("rnib", 1)
+       rnibwriter.InitWriter("rnib", 1)
        return &RNIBClient{
-               db: sdl.NewSdlInstance(ns, sdl.NewDatabase()),
+               reader: nil,
+               writer: nil,
        }
 }
 
-func (r *RNIBClient) GetgNBList() (values map[string]interface{}, err error) {
-       keys, err := r.db.GetAll()
-       if err == nil {
-               values = make(map[string]interface{})
-               for _, key := range keys {
-                       v, err := r.db.Get([]string{key})
-                       if err == nil {
-                               values[key] = v[key]
-                       }
-               }
-       }
-       return
+func (r *RNIBClient) GetNodeb(invName string) (*RNIBNodebInfo, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetNodeb(invName)
+}
+
+func (r *RNIBClient) GetNodebByGlobalNbId(t RNIBNodeType, gid *RNIBGlobalNbId) (*RNIBNodebInfo, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetNodebByGlobalNbId(t, gid)
+}
+
+func (r *RNIBClient) GetCellList(invName string) (*RNIBCells, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetCellList(invName)
+}
+
+func (r *RNIBClient) GetListGnbIds() (*[]*RNIBNbIdentity, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetListGnbIds()
+}
+
+func (r *RNIBClient) GetListEnbIds() (*[]*RNIBNbIdentity, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetListEnbIds()
 }
 
-func (r *RNIBClient) GetNRCellList(key string) (value map[string]interface{}, err error) {
-       return r.db.Get([]string{key})
+func (r *RNIBClient) GetCountGnbList() (int, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetCountGnbList()
 }
 
-func (r *RNIBClient) GetUE(key1, key2 string) (value map[string]interface{}, err error) {
-       return r.db.Get([]string{key1 + key2})
+func (r *RNIBClient) GetCell(invName string, pci uint32) (*RNIBCell, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetCell(invName, pci)
 }
 
-func (r *RNIBClient) Store(key string, value interface{}) (err error) {
-       return r.db.Set(key, value)
+func (r *RNIBClient) GetCellById(cellType RNIBCellType, cellId string) (*RNIBCell, RNIBIRNibError) {
+       return rnibreader.GetRNibReader().GetCellById(cellType, cellId)
 }
 
-func (r *RNIBClient) Clear() {
-       r.db.RemoveAll()
+func (r *RNIBClient) SaveNodeb(nbIdentity *RNIBNbIdentity, entity *RNIBNodebInfo) RNIBIRNibError {
+       return rnibwriter.GetRNibWriter().SaveNodeb(nbIdentity, entity)
 }
index 484df2c..ff6e52e 100755 (executable)
@@ -21,6 +21,7 @@ package xapp
 
 import (
        mdclog "gerrit.o-ran-sc.org/r/com/golog"
+       "time"
 )
 
 type Log struct {
@@ -43,17 +44,21 @@ func (l *Log) SetMdc(key string, value string) {
 }
 
 func (l *Log) Error(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
        l.logger.Error(pattern, args...)
 }
 
 func (l *Log) Warn(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
        l.logger.Warning(pattern, args...)
 }
 
 func (l *Log) Info(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
        l.logger.Info(pattern, args...)
 }
 
 func (l *Log) Debug(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
        l.logger.Debug(pattern, args...)
 }
index 2965e1e..82f3466 100755 (executable)
@@ -67,89 +67,88 @@ var RICMessageTypes = map[string]int{
        "DC_ADM_INT_CONTROL_ACK":       C.DC_ADM_INT_CONTROL_ACK,
 }
 
-
 //-----------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------
 const (
-       RIC_SUB_REQ         = C.RIC_SUB_REQ
-       RIC_SUB_RESP        = C.RIC_SUB_RESP
-       RIC_SUB_FAILURE     = C.RIC_SUB_FAILURE
-       RIC_SUB_DEL_REQ     = C.RIC_SUB_DEL_REQ
-       RIC_SUB_DEL_RESP    = C.RIC_SUB_DEL_RESP
-       RIC_SUB_DEL_FAILURE = C.RIC_SUB_DEL_FAILURE
-       RIC_SERVICE_UPDATE = C.RIC_SERVICE_UPDATE
-       RIC_SERVICE_UPDATE_ACK = C.RIC_SERVICE_UPDATE_ACK
-       RIC_SERVICE_UPDATE_FAILURE = C.RIC_SERVICE_UPDATE_FAILURE
-       RIC_CONTROL_REQ = C.RIC_CONTROL_REQ
-       RIC_CONTROL_ACK = C.RIC_CONTROL_ACK
-       RIC_CONTROL_FAILURE = C.RIC_CONTROL_FAILURE
-       RIC_INDICATION = C.RIC_INDICATION
-       RIC_SERVICE_QUERY = C.RIC_SERVICE_QUERY
-       RIC_X2_SETUP_REQ = C.RIC_X2_SETUP_REQ
-       RIC_X2_SETUP_RESP = C.RIC_X2_SETUP_RESP
-       RIC_X2_SETUP_FAILURE = C.RIC_X2_SETUP_FAILURE
-       RIC_X2_RESET = C.RIC_X2_RESET
-       RIC_X2_RESET_RESP = C.RIC_X2_RESET_RESP
-       RIC_ENDC_X2_SETUP_REQ = C.RIC_ENDC_X2_SETUP_REQ
-       RIC_ENDC_X2_SETUP_RESP = C.RIC_ENDC_X2_SETUP_RESP
-       RIC_ENDC_X2_SETUP_FAILURE = C.RIC_ENDC_X2_SETUP_FAILURE
-       RIC_ENDC_CONF_UPDATE = C.RIC_ENDC_CONF_UPDATE
-       RIC_ENDC_CONF_UPDATE_ACK = C.RIC_ENDC_CONF_UPDATE_ACK
+       RIC_SUB_REQ                  = C.RIC_SUB_REQ
+       RIC_SUB_RESP                 = C.RIC_SUB_RESP
+       RIC_SUB_FAILURE              = C.RIC_SUB_FAILURE
+       RIC_SUB_DEL_REQ              = C.RIC_SUB_DEL_REQ
+       RIC_SUB_DEL_RESP             = C.RIC_SUB_DEL_RESP
+       RIC_SUB_DEL_FAILURE          = C.RIC_SUB_DEL_FAILURE
+       RIC_SERVICE_UPDATE           = C.RIC_SERVICE_UPDATE
+       RIC_SERVICE_UPDATE_ACK       = C.RIC_SERVICE_UPDATE_ACK
+       RIC_SERVICE_UPDATE_FAILURE   = C.RIC_SERVICE_UPDATE_FAILURE
+       RIC_CONTROL_REQ              = C.RIC_CONTROL_REQ
+       RIC_CONTROL_ACK              = C.RIC_CONTROL_ACK
+       RIC_CONTROL_FAILURE          = C.RIC_CONTROL_FAILURE
+       RIC_INDICATION               = C.RIC_INDICATION
+       RIC_SERVICE_QUERY            = C.RIC_SERVICE_QUERY
+       RIC_X2_SETUP_REQ             = C.RIC_X2_SETUP_REQ
+       RIC_X2_SETUP_RESP            = C.RIC_X2_SETUP_RESP
+       RIC_X2_SETUP_FAILURE         = C.RIC_X2_SETUP_FAILURE
+       RIC_X2_RESET                 = C.RIC_X2_RESET
+       RIC_X2_RESET_RESP            = C.RIC_X2_RESET_RESP
+       RIC_ENDC_X2_SETUP_REQ        = C.RIC_ENDC_X2_SETUP_REQ
+       RIC_ENDC_X2_SETUP_RESP       = C.RIC_ENDC_X2_SETUP_RESP
+       RIC_ENDC_X2_SETUP_FAILURE    = C.RIC_ENDC_X2_SETUP_FAILURE
+       RIC_ENDC_CONF_UPDATE         = C.RIC_ENDC_CONF_UPDATE
+       RIC_ENDC_CONF_UPDATE_ACK     = C.RIC_ENDC_CONF_UPDATE_ACK
        RIC_ENDC_CONF_UPDATE_FAILURE = C.RIC_ENDC_CONF_UPDATE_FAILURE
-       RIC_RES_STATUS_REQ = C.RIC_RES_STATUS_REQ
-       RIC_RES_STATUS_RESP = C.RIC_RES_STATUS_RESP
-       RIC_RES_STATUS_FAILURE = C.RIC_RES_STATUS_FAILURE
-       RIC_ENB_CONF_UPDATE = C.RIC_ENB_CONF_UPDATE
-       RIC_ENB_CONF_UPDATE_ACK = C.RIC_ENB_CONF_UPDATE_ACK
-       RIC_ENB_CONF_UPDATE_FAILURE = C.RIC_ENB_CONF_UPDATE_FAILURE
-       RIC_ENB_LOAD_INFORMATION = C.RIC_ENB_LOAD_INFORMATION
-       RIC_GNB_STATUS_INDICATION = C.RIC_GNB_STATUS_INDICATION
-       RIC_RESOURCE_STATUS_UPDATE = C.RIC_RESOURCE_STATUS_UPDATE
-       RIC_ERROR_INDICATION = C.RIC_ERROR_INDICATION
-       DC_ADM_INT_CONTROL = C.DC_ADM_INT_CONTROL
-       DC_ADM_INT_CONTROL_ACK = C.DC_ADM_INT_CONTROL_ACK
+       RIC_RES_STATUS_REQ           = C.RIC_RES_STATUS_REQ
+       RIC_RES_STATUS_RESP          = C.RIC_RES_STATUS_RESP
+       RIC_RES_STATUS_FAILURE       = C.RIC_RES_STATUS_FAILURE
+       RIC_ENB_CONF_UPDATE          = C.RIC_ENB_CONF_UPDATE
+       RIC_ENB_CONF_UPDATE_ACK      = C.RIC_ENB_CONF_UPDATE_ACK
+       RIC_ENB_CONF_UPDATE_FAILURE  = C.RIC_ENB_CONF_UPDATE_FAILURE
+       RIC_ENB_LOAD_INFORMATION     = C.RIC_ENB_LOAD_INFORMATION
+       RIC_GNB_STATUS_INDICATION    = C.RIC_GNB_STATUS_INDICATION
+       RIC_RESOURCE_STATUS_UPDATE   = C.RIC_RESOURCE_STATUS_UPDATE
+       RIC_ERROR_INDICATION         = C.RIC_ERROR_INDICATION
+       DC_ADM_INT_CONTROL           = C.DC_ADM_INT_CONTROL
+       DC_ADM_INT_CONTROL_ACK       = C.DC_ADM_INT_CONTROL_ACK
 )
 
 //-----------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------
 var RicMessageTypeToName = map[int]string{
-       RIC_SUB_REQ:                 "RIC SUBSCRIPTION REQUEST",
-       RIC_SUB_RESP:                "RIC SUBSCRIPTION RESPONSE",
-       RIC_SUB_FAILURE:             "RIC SUBSCRIPTION FAILURE",
-       RIC_SUB_DEL_REQ:             "RIC SUBSCRIPTION DELETE REQUEST",
-       RIC_SUB_DEL_RESP:            "RIC SUBSCRIPTION DELETE RESPONSE",
-       RIC_SUB_DEL_FAILURE:         "RIC SUBSCRIPTION DELETE FAILURE",
-       RIC_SERVICE_UPDATE:          "RIC SERVICE UPDATE",
-       RIC_SERVICE_UPDATE_ACK:      "RIC SERVICE UPDATE ACKNOWLEDGE",
-       RIC_SERVICE_UPDATE_FAILURE:  "RIC SERVICE UPDATE FAILURE",
-       RIC_CONTROL_REQ:             "RIC CONTROL REQUEST",
-       RIC_CONTROL_ACK:             "RIC CONTROL ACKNOWLEDGE",
-       RIC_CONTROL_FAILURE:         "RIC CONTROL FAILURE",
-       RIC_INDICATION:              "RIC INDICATION",
-       RIC_SERVICE_QUERY:           "RIC SERVICE QUERY",
-       RIC_X2_SETUP_REQ:            "RIC X2 SETUP REQUEST",
-       RIC_X2_SETUP_RESP:           "RIC X2 SETUP RESPONSE",
-       RIC_X2_SETUP_FAILURE:        "RIC X2 SETUP FAILURE",
-       RIC_X2_RESET:                "RIC X2 RESET REQUEST",
-       RIC_X2_RESET_RESP:           "RIC X2 RESET RESPONSE",
-       RIC_ENDC_X2_SETUP_REQ:       "RIC EN-DC X2 SETUP REQUEST",
-       RIC_ENDC_X2_SETUP_RESP:      "RIC EN-DC X2 SETUP RESPONSE",
-       RIC_ENDC_X2_SETUP_FAILURE:   "RIC EN-DC X2 SETUP FAILURE",
-       RIC_ENDC_CONF_UPDATE:        "RIC EN-DC CONFIGURATION UPDATE",
-       RIC_ENDC_CONF_UPDATE_ACK:    "RIC EN-DC CONFIGURATION UPDATE ACKNOWLEDGE",
-       RIC_ENDC_CONF_UPDATE_FAILURE:"RIC EN-DC CONFIGURATION UPDATE FAILURE",
-       RIC_RES_STATUS_REQ:          "RIC RESOURCE STATUS REQUEST",
-       RIC_RES_STATUS_RESP:         "RIC RESOURCE STATUS RESPONSE",
-       RIC_RES_STATUS_FAILURE:      "RIC RESOURCE STATUS FAILURE",
-       RIC_ENB_CONF_UPDATE:         "RIC ENB CONFIGURATION UPDATE",
-       RIC_ENB_CONF_UPDATE_ACK:     "RIC ENB CONFIGURATION UPDATE ACKNOWLEDGE",
-       RIC_ENB_CONF_UPDATE_FAILURE: "RIC ENB CONFIGURATION UPDATE FAILURE",
-       RIC_ENB_LOAD_INFORMATION:    "RIC ENB LOAD INFORMATION",
-       RIC_GNB_STATUS_INDICATION:   "RIC GNB STATUS INDICATION",
-       RIC_RESOURCE_STATUS_UPDATE:  "RIC RESOURCE STATUS UPDATE",
-       RIC_ERROR_INDICATION:        "RIC ERROR INDICATION",
-       DC_ADM_INT_CONTROL:          "DC ADMISSION INTERVAL CONTROL",
-       DC_ADM_INT_CONTROL_ACK:      "DC ADMISSION INTERVAL CONTROL ACK",
+       RIC_SUB_REQ:                  "RIC SUBSCRIPTION REQUEST",
+       RIC_SUB_RESP:                 "RIC SUBSCRIPTION RESPONSE",
+       RIC_SUB_FAILURE:              "RIC SUBSCRIPTION FAILURE",
+       RIC_SUB_DEL_REQ:              "RIC SUBSCRIPTION DELETE REQUEST",
+       RIC_SUB_DEL_RESP:             "RIC SUBSCRIPTION DELETE RESPONSE",
+       RIC_SUB_DEL_FAILURE:          "RIC SUBSCRIPTION DELETE FAILURE",
+       RIC_SERVICE_UPDATE:           "RIC SERVICE UPDATE",
+       RIC_SERVICE_UPDATE_ACK:       "RIC SERVICE UPDATE ACKNOWLEDGE",
+       RIC_SERVICE_UPDATE_FAILURE:   "RIC SERVICE UPDATE FAILURE",
+       RIC_CONTROL_REQ:              "RIC CONTROL REQUEST",
+       RIC_CONTROL_ACK:              "RIC CONTROL ACKNOWLEDGE",
+       RIC_CONTROL_FAILURE:          "RIC CONTROL FAILURE",
+       RIC_INDICATION:               "RIC INDICATION",
+       RIC_SERVICE_QUERY:            "RIC SERVICE QUERY",
+       RIC_X2_SETUP_REQ:             "RIC X2 SETUP REQUEST",
+       RIC_X2_SETUP_RESP:            "RIC X2 SETUP RESPONSE",
+       RIC_X2_SETUP_FAILURE:         "RIC X2 SETUP FAILURE",
+       RIC_X2_RESET:                 "RIC X2 RESET REQUEST",
+       RIC_X2_RESET_RESP:            "RIC X2 RESET RESPONSE",
+       RIC_ENDC_X2_SETUP_REQ:        "RIC EN-DC X2 SETUP REQUEST",
+       RIC_ENDC_X2_SETUP_RESP:       "RIC EN-DC X2 SETUP RESPONSE",
+       RIC_ENDC_X2_SETUP_FAILURE:    "RIC EN-DC X2 SETUP FAILURE",
+       RIC_ENDC_CONF_UPDATE:         "RIC EN-DC CONFIGURATION UPDATE",
+       RIC_ENDC_CONF_UPDATE_ACK:     "RIC EN-DC CONFIGURATION UPDATE ACKNOWLEDGE",
+       RIC_ENDC_CONF_UPDATE_FAILURE: "RIC EN-DC CONFIGURATION UPDATE FAILURE",
+       RIC_RES_STATUS_REQ:           "RIC RESOURCE STATUS REQUEST",
+       RIC_RES_STATUS_RESP:          "RIC RESOURCE STATUS RESPONSE",
+       RIC_RES_STATUS_FAILURE:       "RIC RESOURCE STATUS FAILURE",
+       RIC_ENB_CONF_UPDATE:          "RIC ENB CONFIGURATION UPDATE",
+       RIC_ENB_CONF_UPDATE_ACK:      "RIC ENB CONFIGURATION UPDATE ACKNOWLEDGE",
+       RIC_ENB_CONF_UPDATE_FAILURE:  "RIC ENB CONFIGURATION UPDATE FAILURE",
+       RIC_ENB_LOAD_INFORMATION:     "RIC ENB LOAD INFORMATION",
+       RIC_GNB_STATUS_INDICATION:    "RIC GNB STATUS INDICATION",
+       RIC_RESOURCE_STATUS_UPDATE:   "RIC RESOURCE STATUS UPDATE",
+       RIC_ERROR_INDICATION:         "RIC ERROR INDICATION",
+       DC_ADM_INT_CONTROL:           "DC ADMISSION INTERVAL CONTROL",
+       DC_ADM_INT_CONTROL_ACK:       "DC ADMISSION INTERVAL CONTROL ACK",
 }
index 1fd7ad6..69d2964 100755 (executable)
@@ -31,6 +31,7 @@ var (
        // XApp is an application instance
        Rmr      *RMRClient
        Sdl      *SDLClient
+       UeNib    *UENIBClient
        Rnib     *RNIBClient
        Resource *Router
        Metric   *Metrics
@@ -55,6 +56,7 @@ func init() {
        Config = Configurator{}
        Metric = NewMetrics(viper.GetString("metrics.url"), viper.GetString("metrics.namespace"), Resource.router)
        Rmr = NewRMRClient()
+       UeNib = NewUENIBClient()
 
        if viper.IsSet("db.namespaces") {
                namespaces := viper.GetStringSlice("db.namespaces")
index 06345af..84a910f 100755 (executable)
@@ -32,7 +32,7 @@ import (
 type Consumer struct {
 }
 
-func (m Consumer) Consume(mtype, sid, len int, payload []byte) (err error) {
+func (m Consumer) Consume(mtype, sid int, payload []byte, meid *RMRMeid) (err error) {
        Sdl.Store("myKey", payload)
        return nil
 }
@@ -100,7 +100,7 @@ func TestInjectQueryFailures(t *testing.T) {
 
 func TestMessagesReceivedSuccessfully(t *testing.T) {
        for i := 0; i < 100; i++ {
-               Rmr.Send(10004, 1111, 100, []byte{1, 2, 3, 4, 5, 6})
+               Rmr.Send(10004, 1111, []byte{1, 2, 3, 4, 5, 6}, &RMRMeid{PlmnID: "1234", EnbID: "7788"})
        }
 
        // Allow time to process the messages
@@ -132,16 +132,6 @@ func TestMessagesReceivedSuccessfully(t *testing.T) {
        }
 }
 
-func TestGetgNBList(t *testing.T) {
-       Rnib.Store("Kiikale", "Hello")
-       Rnib.Store("mykey", "myval")
-
-       v, _ := Rnib.GetgNBList()
-       if v["Kiikale"] != "Hello" || v["mykey"] != "myval" {
-               t.Errorf("Error: GetgNBList failed!")
-       }
-}
-
 func TestSubscribeChannels(t *testing.T) {
        var NotificationCb = func(ch string, events ...string) {
                if ch != "channel1" {
@@ -166,7 +156,7 @@ func TestGetRicMessageSuccess(t *testing.T) {
        }
 
        name := Rmr.GetRicMessageName(12010)
-       if name !=  "RIC_SUB_REQ" {
+       if name != "RIC_SUB_REQ" {
                t.Errorf("Error: GetRicMessageName failed: name=%s", name)
        }
 }
@@ -178,14 +168,13 @@ func TestGetRicMessageFails(t *testing.T) {
        }
 
        name := Rmr.GetRicMessageName(123456)
-       if name !=  "" {
+       if name != "" {
                t.Errorf("Error: GetRicMessageName returned invalid value: name=%s", name)
        }
 }
 
 func TestTeardown(t *testing.T) {
        Sdl.Clear()
-       Rnib.Clear()
 }
 
 // Helper functions
@@ -209,4 +198,4 @@ func getMetrics(t *testing.T) string {
        response := executeRequest(req)
 
        return response.Body.String()
-}
\ No newline at end of file
+}