//
// Copyright 2019 AT&T Intellectual Property
// Copyright 2019 Nokia
+// Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
package managers
import (
+ "e2mgr/e2managererrors"
"e2mgr/logger"
+ "e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+ "sync"
+ "time"
)
type ranListManagerInstance struct {
- logger *logger.Logger
+ logger *logger.Logger
+ rnibDataService services.RNibDataService
+ mux sync.Mutex
+ nbIdentityMap map[string]*entities.NbIdentity
}
type RanListManager interface {
- UpdateRanState(nodebInfo *entities.NodebInfo) error
+ InitNbIdentityMap() error
+ AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
+ UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error
+ RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error
+ GetNbIdentityList() []*entities.NbIdentity
+ GetNbIdentity(ranName string) (*entities.NbIdentity, error)
+ UpdateHealthcheckTimeStampReceived(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity)
+ UpdateHealthcheckTimeStampSent(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity)
+ UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error
}
-func NewRanListManager(logger *logger.Logger) RanListManager {
+func NewRanListManager(logger *logger.Logger, rnibDataService services.RNibDataService) RanListManager {
return &ranListManagerInstance{
- logger: logger,
+ logger: logger,
+ rnibDataService: rnibDataService,
+ nbIdentityMap: make(map[string]*entities.NbIdentity),
}
}
-func (m *ranListManagerInstance) UpdateRanState(nodebInfo *entities.NodebInfo) error {
- m.logger.Infof("#ranListManagerInstance.UpdateRanState - RAN name: %s - Updating state...", nodebInfo.RanName)
+func (m *ranListManagerInstance) InitNbIdentityMap() error {
+ nbIds, err := m.rnibDataService.GetListNodebIds()
+
+ if err != nil {
+ m.logger.Errorf("#ranListManagerInstance.InitNbIdentityMap - Failed fetching RAN list from DB. error: %s", err)
+ return err
+ }
+
+ for _, v := range nbIds {
+ m.nbIdentityMap[v.InventoryName] = v
+ }
+
+ m.logger.Infof("#ranListManagerInstance.InitNbIdentityMap - Successfully initiated nodeb identity map")
+ m.logger.Debugf("#ranListManagerInstance.InitNbIdentityMap - nodeb Identity map: %s", m.nbIdentityMap)
+ return nil
+}
+
+func (m *ranListManagerInstance) AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error {
+ m.mux.Lock()
+ defer m.mux.Unlock()
+
+ m.nbIdentityMap[nbIdentity.InventoryName] = nbIdentity
+
+ err := m.rnibDataService.AddNbIdentity(nodeType, nbIdentity)
+
+ if err != nil {
+ m.logger.Errorf("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Failed adding nodeb identity to DB. error: %s", nbIdentity.InventoryName, err)
+ return err
+ }
+
+ m.logger.Infof("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Successfully added nodeb identity", nbIdentity.InventoryName)
+ m.logger.Debugf("#ranListManagerInstance.AddNbIdentity - nodeb Identity map: %s", m.nbIdentityMap)
+ return nil
+}
+
+func (m *ranListManagerInstance) UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error {
+ m.mux.Lock()
+ defer m.mux.Unlock()
+
+ m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - updating nodeb identity connection status", ranName)
+
+ oldNbIdentity, ok := m.nbIdentityMap[ranName]
+ if !ok {
+ m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - nodeb identity not found in nbIdentityMap", ranName)
+ return e2managererrors.NewInternalError()
+ }
+
+ newNbIdentity := &entities.NbIdentity{
+ GlobalNbId: oldNbIdentity.GlobalNbId,
+ InventoryName: ranName,
+ ConnectionStatus: connectionStatus,
+ HealthCheckTimestampSent: oldNbIdentity.HealthCheckTimestampSent,
+ HealthCheckTimestampReceived: oldNbIdentity.HealthCheckTimestampReceived,
+ }
+ m.nbIdentityMap[ranName] = newNbIdentity
+
+ err := m.rnibDataService.UpdateNbIdentity(nodeType, oldNbIdentity, newNbIdentity)
+ if err != nil {
+ m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Failed updating nodeb identity in DB. error: %s", ranName, err)
+ return err
+ }
+ m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Successfully updated nodeb identity", ranName)
return nil
}
+
+func (m *ranListManagerInstance) RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error {
+ m.mux.Lock()
+ defer m.mux.Unlock()
+
+ m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - deleting nodeb identity from memory and db...", ranName)
+
+ nbIdentity, ok := m.nbIdentityMap[ranName]
+ if !ok {
+ m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - nodeb identity not found", ranName)
+ return nil
+ }
+
+ delete(m.nbIdentityMap, ranName)
+
+ err := m.rnibDataService.RemoveNbIdentity(nodeType, nbIdentity)
+ if err != nil {
+ m.logger.Errorf("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Failed removing nodeb identity from DB. error: %s", ranName, err)
+ return err
+ }
+
+ m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Successfully deleted nodeb identity", ranName)
+ return nil
+}
+
+func (m *ranListManagerInstance) GetNbIdentityList() []*entities.NbIdentity {
+ nbIds := make([]*entities.NbIdentity, 0, len(m.nbIdentityMap))
+ for _, v := range m.nbIdentityMap {
+ nbIds = append(nbIds, v)
+ }
+
+ m.logger.Infof("#ranListManagerInstance.GetNbIdentityList - %d identity returned", len(nbIds))
+
+ return nbIds
+}
+
+func (m *ranListManagerInstance) GetNbIdentity(ranName string) (*entities.NbIdentity, error) {
+ nbIdentity, ok := m.nbIdentityMap[ranName]
+ if !ok {
+ m.logger.Infof("#ranListManagerInstance.GetNbIdentity - RAN name: %s - nodeb identity not found", ranName)
+ return nil , e2managererrors.NewResourceNotFoundError()
+ }
+
+ m.logger.Infof("#ranListManagerInstance.GetNbIdentity - RAN name: %s - nodeb identity returned", ranName)
+
+ return nbIdentity, nil
+}
+
+func (m *ranListManagerInstance) UpdateHealthcheckTimeStampSent(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity){
+ currentTimeStamp := time.Now().UnixNano()
+ oldNbIdentity := m.nbIdentityMap[oldRRanName]
+
+ newNbIdentity := &entities.NbIdentity{
+ GlobalNbId: oldNbIdentity.GlobalNbId,
+ InventoryName: oldNbIdentity.InventoryName,
+ ConnectionStatus: oldNbIdentity.ConnectionStatus,
+ HealthCheckTimestampSent: currentTimeStamp,
+ HealthCheckTimestampReceived: oldNbIdentity.HealthCheckTimestampReceived,
+ }
+
+ m.nbIdentityMap[oldNbIdentity.InventoryName] = newNbIdentity
+ return oldNbIdentity, newNbIdentity
+}
+
+func (m *ranListManagerInstance) UpdateHealthcheckTimeStampReceived(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity){
+ currentTimeStamp := time.Now().UnixNano()
+ oldNbIdentity := m.nbIdentityMap[oldRRanName]
+
+ newNbIdentity := &entities.NbIdentity{
+ GlobalNbId: oldNbIdentity.GlobalNbId,
+ InventoryName: oldNbIdentity.InventoryName,
+ ConnectionStatus: oldNbIdentity.ConnectionStatus,
+ HealthCheckTimestampSent: oldNbIdentity.HealthCheckTimestampSent,
+ HealthCheckTimestampReceived: currentTimeStamp,
+ }
+
+ m.nbIdentityMap[oldNbIdentity.InventoryName] = newNbIdentity
+ return oldNbIdentity, newNbIdentity
+}
+
+func (m *ranListManagerInstance) UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error {
+ m.mux.Lock()
+ defer m.mux.Unlock()
+
+ err := m.rnibDataService.UpdateNbIdentities(nodeType, oldNbIdentities, newNbIdentities)
+
+ if err != nil {
+ m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentities not completed for %d nbIdentities of nodetype - %s", len(newNbIdentities), nodeType.String())
+ } else{
+ m.logger.Infof("#ranListManagerInstance.UpdateNbIdentities completed successfully for %d nbIdentities of nodetype - %s", len(newNbIdentities), nodeType.String())
+ }
+
+ return err
+}