f4e0b5a039499bd51e6d4c5dd45d8f0e327dab15
[ric-plt/e2mgr.git] / E2Manager / services / rnib_data_service.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 services
21
22 import (
23         "e2mgr/configuration"
24         "e2mgr/logger"
25         "e2mgr/rNibWriter"
26         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
27         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
28         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
29         "net"
30         "time"
31 )
32
33 type RNibDataService interface {
34         SaveNodeb(nodebInfo *entities.NodebInfo) error
35         UpdateNodebInfo(nodebInfo *entities.NodebInfo) error
36         SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error
37         GetNodeb(ranName string) (*entities.NodebInfo, error)
38         GetListNodebIds() ([]*entities.NbIdentity, error)
39         PingRnib() bool
40         GetE2TInstance(address string) (*entities.E2TInstance, error)
41         GetE2TInstances(addresses []string) ([]*entities.E2TInstance, error)
42         GetE2TAddresses() ([]string, error)
43         SaveE2TInstance(e2tInstance *entities.E2TInstance) error
44         SaveE2TAddresses(addresses []string) error
45         GetE2TInstanceNoLogs(address string) (*entities.E2TInstance, error)
46         GetE2TInstancesNoLogs(addresses []string) ([]*entities.E2TInstance, error)
47         SaveE2TInstanceNoLogs(e2tInstance *entities.E2TInstance) error
48         GetE2TAddressesNoLogs() ([]string, error)
49         RemoveE2TInstance(e2tAddress string) error
50         UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error
51         RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error
52         GetGeneralConfiguration() (*entities.GeneralConfiguration, error)
53         UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error
54         SaveGeneralConfiguration(config *entities.GeneralConfiguration) error
55         RemoveEnb(nodebInfo *entities.NodebInfo) error
56         RemoveServedCells(inventoryName string, servedCells []*entities.ServedCellInfo) error
57         UpdateEnb(nodebInfo *entities.NodebInfo, servedCells []*entities.ServedCellInfo) error
58         AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
59 }
60
61 type rNibDataService struct {
62         logger        *logger.Logger
63         rnibReader    reader.RNibReader
64         rnibWriter    rNibWriter.RNibWriter
65         maxAttempts   int
66         retryInterval time.Duration
67 }
68
69 func NewRnibDataService(logger *logger.Logger, config *configuration.Configuration, rnibReader reader.RNibReader, rnibWriter rNibWriter.RNibWriter) *rNibDataService {
70         return &rNibDataService{
71                 logger:        logger,
72                 rnibReader:    rnibReader,
73                 rnibWriter:    rnibWriter,
74                 maxAttempts:   config.MaxRnibConnectionAttempts,
75                 retryInterval: time.Duration(config.RnibRetryIntervalMs) * time.Millisecond,
76         }
77 }
78
79 func (w *rNibDataService) AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error {
80         w.logger.Infof("#RnibDataService.AddNbIdentity - nbIdentity: %s", nbIdentity)
81
82         err := w.retry("AddNbIdentity", func() (err error) {
83                 err = w.rnibWriter.AddNbIdentity(nodeType, nbIdentity)
84                 return
85         })
86
87         return err
88 }
89
90 func (w *rNibDataService) RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error {
91         err := w.retry("RemoveServedNrCells", func() (err error) {
92                 err = w.rnibWriter.RemoveServedNrCells(inventoryName, servedNrCells)
93                 return
94         })
95
96         return err
97 }
98
99 func (w *rNibDataService) RemoveEnb(nodebInfo *entities.NodebInfo) error {
100         w.logger.Infof("#RnibDataService.RemoveEnb - nodebInfo: %s", nodebInfo)
101
102         err := w.retry("RemoveEnb", func() (err error) {
103                 err = w.rnibWriter.RemoveEnb(nodebInfo)
104                 return
105         })
106
107         return err
108 }
109
110 func (w *rNibDataService) UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error {
111         w.logger.Infof("#RnibDataService.UpdateGnbCells - nodebInfo: %s, servedNrCells: %s", nodebInfo, servedNrCells)
112
113         err := w.retry("UpdateGnbCells", func() (err error) {
114                 err = w.rnibWriter.UpdateGnbCells(nodebInfo, servedNrCells)
115                 return
116         })
117
118         return err
119 }
120
121 func (w *rNibDataService) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error {
122         w.logger.Infof("#RnibDataService.UpdateNodebInfo - nodebInfo: %s", nodebInfo)
123
124         err := w.retry("UpdateNodebInfo", func() (err error) {
125                 err = w.rnibWriter.UpdateNodebInfo(nodebInfo)
126                 return
127         })
128
129         return err
130 }
131
132 func (w *rNibDataService) SaveNodeb(nodebInfo *entities.NodebInfo) error {
133         w.logger.Infof("#RnibDataService.SaveNodeb - nodebInfo: %s", nodebInfo)
134
135         err := w.retry("SaveNodeb", func() (err error) {
136                 err = w.rnibWriter.SaveNodeb(nodebInfo)
137                 return
138         })
139
140         return err
141 }
142
143 func (w *rNibDataService) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error {
144         w.logger.Infof("#RnibDataService.SaveRanLoadInformation - inventoryName: %s, ranLoadInformation: %s", inventoryName, ranLoadInformation)
145
146         err := w.retry("SaveRanLoadInformation", func() (err error) {
147                 err = w.rnibWriter.SaveRanLoadInformation(inventoryName, ranLoadInformation)
148                 return
149         })
150
151         return err
152 }
153
154 func (w *rNibDataService) GetNodeb(ranName string) (*entities.NodebInfo, error) {
155
156         var nodeb *entities.NodebInfo = nil
157
158         err := w.retry("GetNodeb", func() (err error) {
159                 nodeb, err = w.rnibReader.GetNodeb(ranName)
160                 return
161         })
162
163         if err == nil {
164                 w.logger.Infof("#RnibDataService.GetNodeb - RAN name: %s, connection status: %s, associated E2T: %s", nodeb.RanName, nodeb.ConnectionStatus, nodeb.AssociatedE2TInstanceAddress)
165         }
166
167         return nodeb, err
168 }
169
170 func (w *rNibDataService) GetListNodebIds() ([]*entities.NbIdentity, error) {
171         var nodeIds []*entities.NbIdentity = nil
172
173         err := w.retry("GetListNodebIds", func() (err error) {
174                 nodeIds, err = w.rnibReader.GetListNodebIds()
175                 return
176         })
177
178         if err == nil {
179                 w.logger.Infof("#RnibDataService.GetListNodebIds - RANs count: %d", len(nodeIds))
180         }
181
182         return nodeIds, err
183 }
184
185 func (w *rNibDataService) GetE2TInstance(address string) (*entities.E2TInstance, error) {
186         var e2tInstance *entities.E2TInstance = nil
187
188         err := w.retry("GetE2TInstance", func() (err error) {
189                 e2tInstance, err = w.rnibReader.GetE2TInstance(address)
190                 return
191         })
192
193         if err == nil {
194                 w.logger.Infof("#RnibDataService.GetE2TInstance - E2T instance address: %s, state: %s, associated RANs count: %d, keep Alive ts: %d", e2tInstance.Address, e2tInstance.State, len(e2tInstance.AssociatedRanList), e2tInstance.KeepAliveTimestamp)
195         }
196
197         return e2tInstance, err
198 }
199
200 func (w *rNibDataService) GetE2TInstanceNoLogs(address string) (*entities.E2TInstance, error) {
201         var e2tInstance *entities.E2TInstance = nil
202
203         err := w.retry("GetE2TInstance", func() (err error) {
204                 e2tInstance, err = w.rnibReader.GetE2TInstance(address)
205                 return
206         })
207
208         return e2tInstance, err
209 }
210
211 func (w *rNibDataService) GetE2TInstances(addresses []string) ([]*entities.E2TInstance, error) {
212         w.logger.Infof("#RnibDataService.GetE2TInstances - addresses: %s", addresses)
213         var e2tInstances []*entities.E2TInstance = nil
214
215         err := w.retry("GetE2TInstance", func() (err error) {
216                 e2tInstances, err = w.rnibReader.GetE2TInstances(addresses)
217                 return
218         })
219
220         return e2tInstances, err
221 }
222
223 func (w *rNibDataService) GetE2TInstancesNoLogs(addresses []string) ([]*entities.E2TInstance, error) {
224
225         var e2tInstances []*entities.E2TInstance = nil
226
227         err := w.retry("GetE2TInstance", func() (err error) {
228                 e2tInstances, err = w.rnibReader.GetE2TInstances(addresses)
229                 return
230         })
231
232         return e2tInstances, err
233 }
234
235 func (w *rNibDataService) GetE2TAddresses() ([]string, error) {
236
237         var e2tAddresses []string = nil
238
239         err := w.retry("GetE2TAddresses", func() (err error) {
240                 e2tAddresses, err = w.rnibReader.GetE2TAddresses()
241                 return
242         })
243
244         if err == nil {
245                 w.logger.Infof("#RnibDataService.GetE2TAddresses - addresses: %s", e2tAddresses)
246         }
247
248         return e2tAddresses, err
249 }
250
251 func (w *rNibDataService) GetE2TAddressesNoLogs() ([]string, error) {
252
253         var e2tAddresses []string = nil
254
255         err := w.retry("GetE2TAddresses", func() (err error) {
256                 e2tAddresses, err = w.rnibReader.GetE2TAddresses()
257                 return
258         })
259
260         return e2tAddresses, err
261 }
262
263 func (w *rNibDataService) SaveE2TInstance(e2tInstance *entities.E2TInstance) error {
264         w.logger.Infof("#RnibDataService.SaveE2TInstance - E2T instance address: %s, podName: %s, state: %s, associated RANs count: %d, keep Alive ts: %d", e2tInstance.Address, e2tInstance.PodName, e2tInstance.State, len(e2tInstance.AssociatedRanList), e2tInstance.KeepAliveTimestamp)
265
266         return w.SaveE2TInstanceNoLogs(e2tInstance)
267 }
268
269 func (w *rNibDataService) SaveE2TInstanceNoLogs(e2tInstance *entities.E2TInstance) error {
270
271         err := w.retry("SaveE2TInstance", func() (err error) {
272                 err = w.rnibWriter.SaveE2TInstance(e2tInstance)
273                 return
274         })
275
276         return err
277 }
278
279 func (w *rNibDataService) SaveE2TAddresses(addresses []string) error {
280         w.logger.Infof("#RnibDataService.SaveE2TAddresses - addresses: %s", addresses)
281
282         err := w.retry("SaveE2TAddresses", func() (err error) {
283                 err = w.rnibWriter.SaveE2TAddresses(addresses)
284                 return
285         })
286
287         return err
288 }
289
290 func (w *rNibDataService) RemoveE2TInstance(e2tAddress string) error {
291         w.logger.Infof("#RnibDataService.RemoveE2TInstance - e2tAddress: %s", e2tAddress)
292
293         err := w.retry("RemoveE2TInstance", func() (err error) {
294                 err = w.rnibWriter.RemoveE2TInstance(e2tAddress)
295                 return
296         })
297
298         return err
299 }
300
301 func (w *rNibDataService) GetGeneralConfiguration() (*entities.GeneralConfiguration, error) {
302         var generalConfiguration *entities.GeneralConfiguration = nil
303
304         err := w.retry("GetGeneralConfiguration", func() (err error) {
305                 generalConfiguration, err = w.rnibReader.GetGeneralConfiguration()
306                 return
307         })
308
309         return generalConfiguration, err
310 }
311
312 func (w *rNibDataService) SaveGeneralConfiguration(config *entities.GeneralConfiguration) error {
313         err := w.retry("SaveGeneralConfiguration", func() (err error) {
314                 err = w.rnibWriter.SaveGeneralConfiguration(config)
315                 return
316         })
317
318         return err
319 }
320
321 func (w *rNibDataService) RemoveServedCells(inventoryName string, servedCells []*entities.ServedCellInfo) error {
322         err := w.retry("RemoveServedCells", func() (err error) {
323                 err = w.rnibWriter.RemoveServedCells(inventoryName, servedCells)
324                 return
325         })
326
327         return err
328 }
329
330 func (w *rNibDataService) UpdateEnb(nodebInfo *entities.NodebInfo, servedCells []*entities.ServedCellInfo) error {
331         err := w.retry("UpdateEnb", func() (err error) {
332                 err = w.rnibWriter.UpdateEnb(nodebInfo, servedCells)
333                 return
334         })
335
336         return err
337 }
338
339 func (w *rNibDataService) PingRnib() bool {
340         err := w.retry("GetListNodebIds", func() (err error) {
341                 _, err = w.rnibReader.GetListNodebIds()
342                 return
343         })
344
345         return !isRnibConnectionError(err)
346 }
347
348 func (w *rNibDataService) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error {
349         w.logger.Infof("#RnibDataService.UpdateNodebInfoOnConnectionStatusInversion - event: %s, nodebInfo: %s", event, nodebInfo)
350
351         err := w.retry("UpdateNodebInfoOnConnectionStatusInversion", func() (err error) {
352                 err = w.rnibWriter.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, event)
353                 return
354         })
355
356         return err
357 }
358
359 func (w *rNibDataService) retry(rnibFunc string, f func() error) (err error) {
360         attempts := w.maxAttempts
361
362         for i := 1; ; i++ {
363                 err = f()
364                 if err == nil {
365                         return
366                 }
367                 if !isRnibConnectionError(err) {
368                         return err
369                 }
370                 if i >= attempts {
371                         w.logger.Errorf("#RnibDataService.retry - after %d attempts of %s, last error: %s", attempts, rnibFunc, err)
372                         return err
373                 }
374                 time.Sleep(w.retryInterval)
375
376                 w.logger.Infof("#RnibDataService.retry - retrying %d %s after error: %s", i, rnibFunc, err)
377         }
378 }
379
380 func isRnibConnectionError(err error) bool {
381         internalErr, ok := err.(*common.InternalError)
382         if !ok {
383                 return false
384         }
385         _, ok = internalErr.Err.(*net.OpError)
386
387         return ok
388 }