[RIC-430] - Update Connection Status on RAN List
[ric-plt/e2mgr.git] / E2Manager / managers / ran_list_manager.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16
17 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 //  platform project (RICP).
19
20 package managers
21
22 import (
23         "e2mgr/e2managererrors"
24         "e2mgr/logger"
25         "e2mgr/services"
26         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
27         "sync"
28 )
29
30 type ranListManagerInstance struct {
31         logger          *logger.Logger
32         rnibDataService services.RNibDataService
33         mux             sync.Mutex
34         nbIdentityMap   map[string]*entities.NbIdentity
35 }
36
37 type RanListManager interface {
38         InitNbIdentityMap() error
39         AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
40         UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error
41         RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error
42         GetNbIdentityList() []*entities.NbIdentity
43 }
44
45 func NewRanListManager(logger *logger.Logger, rnibDataService services.RNibDataService) RanListManager {
46         return &ranListManagerInstance{
47                 logger:          logger,
48                 rnibDataService: rnibDataService,
49                 nbIdentityMap:   make(map[string]*entities.NbIdentity),
50         }
51 }
52
53 func (m *ranListManagerInstance) InitNbIdentityMap() error {
54         nbIds, err := m.rnibDataService.GetListNodebIds()
55
56         if err != nil {
57                 m.logger.Errorf("#ranListManagerInstance.InitNbIdentityMap - Failed fetching RAN list from DB. error: %s", err)
58                 return err
59         }
60
61         for _, v := range nbIds {
62                 m.nbIdentityMap[v.InventoryName] = v
63         }
64
65         m.logger.Infof("#ranListManagerInstance.InitNbIdentityMap - Successfully initiated nodeb identity map")
66         m.logger.Debugf("#ranListManagerInstance.InitNbIdentityMap - nodeb Identity map: %s", m.nbIdentityMap)
67         return nil
68 }
69
70 func (m *ranListManagerInstance) AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error {
71         m.mux.Lock()
72         defer m.mux.Unlock()
73
74         m.nbIdentityMap[nbIdentity.InventoryName] = nbIdentity
75
76         err := m.rnibDataService.AddNbIdentity(nodeType, nbIdentity)
77
78         if err != nil {
79                 m.logger.Errorf("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Failed adding nodeb identity to DB. error: %s", nbIdentity.InventoryName, err)
80                 return err
81         }
82
83         m.logger.Infof("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Successfully added nodeb identity", nbIdentity.InventoryName)
84         m.logger.Debugf("#ranListManagerInstance.AddNbIdentity - nodeb Identity map: %s", m.nbIdentityMap)
85         return nil
86 }
87
88 func (m *ranListManagerInstance) UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error {
89         m.mux.Lock()
90         defer m.mux.Unlock()
91
92         m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - updating nodeb identity connection status", ranName)
93
94         oldNbIdentity, ok := m.nbIdentityMap[ranName]
95         if !ok {
96                 m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - nodeb identity not found in nbIdentityMap", ranName)
97                 return e2managererrors.NewInternalError()
98         }
99
100         newNbIdentity := &entities.NbIdentity{
101                 GlobalNbId:       oldNbIdentity.GlobalNbId,
102                 InventoryName:    ranName,
103                 ConnectionStatus: connectionStatus,
104         }
105         m.nbIdentityMap[ranName] = newNbIdentity
106
107         err := m.rnibDataService.UpdateNbIdentity(nodeType, oldNbIdentity, newNbIdentity)
108         if err != nil {
109                 m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Failed updating nodeb identity in DB. error: %s", ranName, err)
110                 return err
111         }
112         m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Successfully updated nodeb identity", ranName)
113         return nil
114 }
115
116 func (m *ranListManagerInstance) RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error {
117         m.mux.Lock()
118         defer m.mux.Unlock()
119
120         m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - deleting nodeb identity from memory and db...", ranName)
121
122         nbIdentity, ok := m.nbIdentityMap[ranName]
123         if !ok {
124                 m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - nodeb identity not found", ranName)
125                 return nil
126         }
127
128         delete(m.nbIdentityMap, ranName)
129
130         err := m.rnibDataService.RemoveNbIdentity(nodeType, nbIdentity)
131         if err != nil {
132                 m.logger.Errorf("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Failed removing nodeb identity from DB. error: %s", ranName, err)
133                 return err
134         }
135
136         m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Successfully deleted nodeb identity", ranName)
137         return nil
138 }
139
140 func (m *ranListManagerInstance) GetNbIdentityList() []*entities.NbIdentity {
141         nbIds := make([]*entities.NbIdentity, 0, len(m.nbIdentityMap))
142         for _, v := range m.nbIdentityMap {
143                 nbIds = append(nbIds, v)
144         }
145
146         m.logger.Infof("#ranListManagerInstance.GetNbIdentityList - %d identity returned", len(nbIds))
147
148         return nbIds
149 }