[RIC-249] [RIC-588] US RIC SERVICE UPDATE - Health Check Received | RIC SERVICE UPDAT...
[ric-plt/e2mgr.git] / E2Manager / managers / ran_list_manager.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 // Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved.
5 //
6 // Licensed under the Apache License, Version 2.0 (the "License");
7 // you may not use this file except in compliance with the License.
8 // You may obtain a copy of the License at
9 //
10 //      http://www.apache.org/licenses/LICENSE-2.0
11 //
12 // Unless required by applicable law or agreed to in writing, software
13 // distributed under the License is distributed on an "AS IS" BASIS,
14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 // See the License for the specific language governing permissions and
16 // limitations under the License.
17
18 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 //  platform project (RICP).
20
21 package managers
22
23 import (
24         "e2mgr/e2managererrors"
25         "e2mgr/logger"
26         "e2mgr/services"
27         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
28         "sync"
29         "time"
30 )
31
32 type ranListManagerInstance struct {
33         logger          *logger.Logger
34         rnibDataService services.RNibDataService
35         mux             sync.Mutex
36         nbIdentityMap   map[string]*entities.NbIdentity
37 }
38
39 type RanListManager interface {
40         InitNbIdentityMap() error
41         AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
42         UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error
43         RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error
44         GetNbIdentityList() []*entities.NbIdentity
45         UpdateHealthcheckTimeStampReceived(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity)
46         UpdateHealthcheckTimeStampSent(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity)
47         UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error
48 }
49
50 func NewRanListManager(logger *logger.Logger, rnibDataService services.RNibDataService) RanListManager {
51         return &ranListManagerInstance{
52                 logger:          logger,
53                 rnibDataService: rnibDataService,
54                 nbIdentityMap:   make(map[string]*entities.NbIdentity),
55         }
56 }
57
58 func (m *ranListManagerInstance) InitNbIdentityMap() error {
59         nbIds, err := m.rnibDataService.GetListNodebIds()
60
61         if err != nil {
62                 m.logger.Errorf("#ranListManagerInstance.InitNbIdentityMap - Failed fetching RAN list from DB. error: %s", err)
63                 return err
64         }
65
66         for _, v := range nbIds {
67                 m.nbIdentityMap[v.InventoryName] = v
68         }
69
70         m.logger.Infof("#ranListManagerInstance.InitNbIdentityMap - Successfully initiated nodeb identity map")
71         m.logger.Debugf("#ranListManagerInstance.InitNbIdentityMap - nodeb Identity map: %s", m.nbIdentityMap)
72         return nil
73 }
74
75 func (m *ranListManagerInstance) AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error {
76         m.mux.Lock()
77         defer m.mux.Unlock()
78
79         m.nbIdentityMap[nbIdentity.InventoryName] = nbIdentity
80
81         err := m.rnibDataService.AddNbIdentity(nodeType, nbIdentity)
82
83         if err != nil {
84                 m.logger.Errorf("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Failed adding nodeb identity to DB. error: %s", nbIdentity.InventoryName, err)
85                 return err
86         }
87
88         m.logger.Infof("#ranListManagerInstance.AddNbIdentity - RAN name: %s - Successfully added nodeb identity", nbIdentity.InventoryName)
89         m.logger.Debugf("#ranListManagerInstance.AddNbIdentity - nodeb Identity map: %s", m.nbIdentityMap)
90         return nil
91 }
92
93 func (m *ranListManagerInstance) UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error {
94         m.mux.Lock()
95         defer m.mux.Unlock()
96
97         m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - updating nodeb identity connection status", ranName)
98
99         oldNbIdentity, ok := m.nbIdentityMap[ranName]
100         if !ok {
101                 m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - nodeb identity not found in nbIdentityMap", ranName)
102                 return e2managererrors.NewInternalError()
103         }
104
105         newNbIdentity := &entities.NbIdentity{
106                 GlobalNbId:       oldNbIdentity.GlobalNbId,
107                 InventoryName:    ranName,
108                 ConnectionStatus: connectionStatus,
109                 HealthCheckTimestampSent: oldNbIdentity.HealthCheckTimestampSent,
110                 HealthCheckTimestampReceived: oldNbIdentity.HealthCheckTimestampReceived,
111         }
112         m.nbIdentityMap[ranName] = newNbIdentity
113
114         err := m.rnibDataService.UpdateNbIdentity(nodeType, oldNbIdentity, newNbIdentity)
115         if err != nil {
116                 m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Failed updating nodeb identity in DB. error: %s", ranName, err)
117                 return err
118         }
119         m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Successfully updated nodeb identity", ranName)
120         return nil
121 }
122
123 func (m *ranListManagerInstance) RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error {
124         m.mux.Lock()
125         defer m.mux.Unlock()
126
127         m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - deleting nodeb identity from memory and db...", ranName)
128
129         nbIdentity, ok := m.nbIdentityMap[ranName]
130         if !ok {
131                 m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - nodeb identity not found", ranName)
132                 return nil
133         }
134
135         delete(m.nbIdentityMap, ranName)
136
137         err := m.rnibDataService.RemoveNbIdentity(nodeType, nbIdentity)
138         if err != nil {
139                 m.logger.Errorf("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Failed removing nodeb identity from DB. error: %s", ranName, err)
140                 return err
141         }
142
143         m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Successfully deleted nodeb identity", ranName)
144         return nil
145 }
146
147 func (m *ranListManagerInstance) GetNbIdentityList() []*entities.NbIdentity {
148         nbIds := make([]*entities.NbIdentity, 0, len(m.nbIdentityMap))
149         for _, v := range m.nbIdentityMap {
150                 nbIds = append(nbIds, v)
151         }
152
153         m.logger.Infof("#ranListManagerInstance.GetNbIdentityList - %d identity returned", len(nbIds))
154
155         return nbIds
156 }
157
158 func (m *ranListManagerInstance) UpdateHealthcheckTimeStampSent(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity){
159         currentTimeStamp := time.Now().UnixNano()
160         oldNbIdentity := m.nbIdentityMap[oldRRanName]
161
162         newNbIdentity := &entities.NbIdentity{
163                 GlobalNbId:       oldNbIdentity.GlobalNbId,
164                 InventoryName:    oldNbIdentity.InventoryName,
165                 ConnectionStatus: oldNbIdentity.ConnectionStatus,
166                 HealthCheckTimestampSent: currentTimeStamp,
167                 HealthCheckTimestampReceived: oldNbIdentity.HealthCheckTimestampReceived,
168         }
169
170         m.nbIdentityMap[oldNbIdentity.InventoryName] = newNbIdentity
171         return oldNbIdentity, newNbIdentity
172 }
173
174 func (m *ranListManagerInstance) UpdateHealthcheckTimeStampReceived(oldRRanName string) (*entities.NbIdentity, *entities.NbIdentity){
175         currentTimeStamp := time.Now().UnixNano()
176         oldNbIdentity := m.nbIdentityMap[oldRRanName]
177
178         newNbIdentity := &entities.NbIdentity{
179                 GlobalNbId:       oldNbIdentity.GlobalNbId,
180                 InventoryName:    oldNbIdentity.InventoryName,
181                 ConnectionStatus: oldNbIdentity.ConnectionStatus,
182                 HealthCheckTimestampSent: oldNbIdentity.HealthCheckTimestampSent,
183                 HealthCheckTimestampReceived: currentTimeStamp,
184         }
185
186         m.nbIdentityMap[oldNbIdentity.InventoryName] = newNbIdentity
187         return oldNbIdentity, newNbIdentity
188 }
189
190 func (m *ranListManagerInstance) UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error {
191         m.mux.Lock()
192         defer m.mux.Unlock()
193
194         err := m.rnibDataService.UpdateNbIdentities(nodeType, oldNbIdentities, newNbIdentities)
195
196         if err != nil {
197                 m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentities not completed for %d nbIdentities of nodetype - %s", len(newNbIdentities), nodeType.String())
198         } else{
199                 m.logger.Infof("#ranListManagerInstance.UpdateNbIdentities completed successfully for %d nbIdentities of nodetype - %s", len(newNbIdentities), nodeType.String())
200         }
201
202         return err
203 }