[RIC-287] New Handler: Handle Ran List Object - to solve Race Condition
[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         "time"
29 )
30
31 type ranListManagerInstance struct {
32         logger          *logger.Logger
33         rnibDataService services.RNibDataService
34         mux             sync.Mutex
35         nbIdentityMap   map[string]*entities.NbIdentity
36 }
37
38 type RanListManager interface {
39         InitNbIdentityMap() error
40         AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
41         UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error
42         RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error
43         GetNbIdentityList() []*entities.NbIdentity
44         UpdateHealthcheckTimeStampReceived(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity)
45         UpdateHealthcheckTimeStampSent(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity)
46         UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error
47 }
48
49 func NewRanListManager(logger *logger.Logger, rnibDataService services.RNibDataService) RanListManager {
50         return &ranListManagerInstance{
51                 logger:          logger,
52                 rnibDataService: rnibDataService,
53                 nbIdentityMap:   make(map[string]*entities.NbIdentity),
54         }
55 }
56
57 func (m *ranListManagerInstance) InitNbIdentityMap() error {
58         nbIds, err := m.rnibDataService.GetListNodebIds()
59
60         if err != nil {
61                 m.logger.Errorf("#ranListManagerInstance.InitNbIdentityMap - Failed fetching RAN list from DB. error: %s", err)
62                 return err
63         }
64
65         for _, v := range nbIds {
66                 m.nbIdentityMap[v.InventoryName] = v
67         }
68
69         m.logger.Infof("#ranListManagerInstance.InitNbIdentityMap - Successfully initiated nodeb identity map")
70         m.logger.Debugf("#ranListManagerInstance.InitNbIdentityMap - nodeb Identity map: %s", m.nbIdentityMap)
71         return nil
72 }
73
74 func (m *ranListManagerInstance) AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error {
75         m.mux.Lock()
76         defer m.mux.Unlock()
77
78         m.nbIdentityMap[nbIdentity.InventoryName] = nbIdentity
79
80         err := m.rnibDataService.AddNbIdentity(nodeType, nbIdentity)
81
82         if err != nil {
83                 m.logger.Errorf("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Failed adding nodeb identity to DB. error: %s", nbIdentity.InventoryName, err)
84                 return err
85         }
86
87         m.logger.Infof("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Successfully added nodeb identity", nbIdentity.InventoryName)
88         m.logger.Debugf("#ranListManagerInstance.AddNbIdentity - nodeb Identity map: %s", m.nbIdentityMap)
89         return nil
90 }
91
92 func (m *ranListManagerInstance) UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error {
93         m.mux.Lock()
94         defer m.mux.Unlock()
95
96         m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - updating nodeb identity connection status", ranName)
97
98         oldNbIdentity, ok := m.nbIdentityMap[ranName]
99         if !ok {
100                 m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - nodeb identity not found in nbIdentityMap", ranName)
101                 return e2managererrors.NewInternalError()
102         }
103
104         newNbIdentity := &entities.NbIdentity{
105                 GlobalNbId:       oldNbIdentity.GlobalNbId,
106                 InventoryName:    ranName,
107                 ConnectionStatus: connectionStatus,
108                 HealthCheckTimestampSent: oldNbIdentity.HealthCheckTimestampSent,
109                 HealthCheckTimestampReceived: oldNbIdentity.HealthCheckTimestampReceived,
110         }
111         m.nbIdentityMap[ranName] = newNbIdentity
112
113         err := m.rnibDataService.UpdateNbIdentity(nodeType, oldNbIdentity, newNbIdentity)
114         if err != nil {
115                 m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Failed updating nodeb identity in DB. error: %s", ranName, err)
116                 return err
117         }
118         m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Successfully updated nodeb identity", ranName)
119         return nil
120 }
121
122 func (m *ranListManagerInstance) RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error {
123         m.mux.Lock()
124         defer m.mux.Unlock()
125
126         m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - deleting nodeb identity from memory and db...", ranName)
127
128         nbIdentity, ok := m.nbIdentityMap[ranName]
129         if !ok {
130                 m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - nodeb identity not found", ranName)
131                 return nil
132         }
133
134         delete(m.nbIdentityMap, ranName)
135
136         err := m.rnibDataService.RemoveNbIdentity(nodeType, nbIdentity)
137         if err != nil {
138                 m.logger.Errorf("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Failed removing nodeb identity from DB. error: %s", ranName, err)
139                 return err
140         }
141
142         m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Successfully deleted nodeb identity", ranName)
143         return nil
144 }
145
146 func (m *ranListManagerInstance) GetNbIdentityList() []*entities.NbIdentity {
147         nbIds := make([]*entities.NbIdentity, 0, len(m.nbIdentityMap))
148         for _, v := range m.nbIdentityMap {
149                 nbIds = append(nbIds, v)
150         }
151
152         m.logger.Infof("#ranListManagerInstance.GetNbIdentityList - %d identity returned", len(nbIds))
153
154         return nbIds
155 }
156
157 func (m *ranListManagerInstance) UpdateHealthcheckTimeStampSent(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity){
158         currentTimeStamp := time.Now().UnixNano()
159         oldNbIdentity := m.nbIdentityMap[oldRRanName]
160
161         newNbIdentity := &entities.NbIdentity{
162                 GlobalNbId:       oldNbIdentity.GlobalNbId,
163                 InventoryName:    oldNbIdentity.InventoryName,
164                 ConnectionStatus: oldNbIdentity.ConnectionStatus,
165                 HealthCheckTimestampSent: currentTimeStamp,
166                 HealthCheckTimestampReceived: oldNbIdentity.HealthCheckTimestampReceived,
167         }
168
169         m.nbIdentityMap[oldNbIdentity.InventoryName] = newNbIdentity
170         return oldNbIdentity, newNbIdentity
171 }
172
173 func (m *ranListManagerInstance) UpdateHealthcheckTimeStampReceived(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity){
174         currentTimeStamp := time.Now().UnixNano()
175         oldNbIdentity := m.nbIdentityMap[oldRRanName]
176
177         newNbIdentity := &entities.NbIdentity{
178                 GlobalNbId:       oldNbIdentity.GlobalNbId,
179                 InventoryName:    oldNbIdentity.InventoryName,
180                 ConnectionStatus: oldNbIdentity.ConnectionStatus,
181                 HealthCheckTimestampSent: oldNbIdentity.HealthCheckTimestampSent,
182                 HealthCheckTimestampReceived: currentTimeStamp,
183         }
184
185         m.nbIdentityMap[oldNbIdentity.InventoryName] = newNbIdentity
186         return oldNbIdentity, newNbIdentity
187 }
188
189 func (m *ranListManagerInstance) UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error {
190         m.mux.Lock()
191         defer m.mux.Unlock()
192
193         err:= m.rnibDataService.UpdateNbIdentities(nodeType, oldNbIdentities, newNbIdentities)
194
195         return err
196 }