[RIC-396] Add RNIB data service GetGeneralConfiguration
[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(nbIdentity *entities.NbIdentity, nb *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 }
54
55 type rNibDataService struct {
56         logger        *logger.Logger
57         rnibReader    reader.RNibReader
58         rnibWriter    rNibWriter.RNibWriter
59         maxAttempts   int
60         retryInterval time.Duration
61 }
62
63 func NewRnibDataService(logger *logger.Logger, config *configuration.Configuration, rnibReader reader.RNibReader, rnibWriter rNibWriter.RNibWriter) *rNibDataService {
64         return &rNibDataService{
65                 logger:        logger,
66                 rnibReader:    rnibReader,
67                 rnibWriter:    rnibWriter,
68                 maxAttempts:   config.MaxRnibConnectionAttempts,
69                 retryInterval: time.Duration(config.RnibRetryIntervalMs) * time.Millisecond,
70         }
71 }
72
73 func (w *rNibDataService) RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error {
74         err := w.retry("RemoveServedNrCells", func() (err error) {
75                 err = w.rnibWriter.RemoveServedNrCells(inventoryName, servedNrCells)
76                 return
77         })
78
79         return err
80 }
81
82 func (w *rNibDataService) UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error {
83         w.logger.Infof("#RnibDataService.UpdateGnbCells - nodebInfo: %s, servedNrCells: %s", nodebInfo, servedNrCells)
84
85         err := w.retry("UpdateGnbCells", func() (err error) {
86                 err = w.rnibWriter.UpdateGnbCells(nodebInfo, servedNrCells)
87                 return
88         })
89
90         return err
91 }
92
93 func (w *rNibDataService) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error {
94         w.logger.Infof("#RnibDataService.UpdateNodebInfo - nodebInfo: %s", nodebInfo)
95
96         err := w.retry("UpdateNodebInfo", func() (err error) {
97                 err = w.rnibWriter.UpdateNodebInfo(nodebInfo)
98                 return
99         })
100
101         return err
102 }
103
104 func (w *rNibDataService) SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error {
105         w.logger.Infof("#RnibDataService.SaveNodeb - nbIdentity: %s, nodebInfo: %s", nbIdentity, nb)
106
107         err := w.retry("SaveNodeb", func() (err error) {
108                 err = w.rnibWriter.SaveNodeb(nbIdentity, nb)
109                 return
110         })
111
112         return err
113 }
114
115 func (w *rNibDataService) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error {
116         w.logger.Infof("#RnibDataService.SaveRanLoadInformation - inventoryName: %s, ranLoadInformation: %s", inventoryName, ranLoadInformation)
117
118         err := w.retry("SaveRanLoadInformation", func() (err error) {
119                 err = w.rnibWriter.SaveRanLoadInformation(inventoryName, ranLoadInformation)
120                 return
121         })
122
123         return err
124 }
125
126 func (w *rNibDataService) GetNodeb(ranName string) (*entities.NodebInfo, error) {
127
128         var nodeb *entities.NodebInfo = nil
129
130         err := w.retry("GetNodeb", func() (err error) {
131                 nodeb, err = w.rnibReader.GetNodeb(ranName)
132                 return
133         })
134
135         if err == nil {
136                 w.logger.Infof("#RnibDataService.GetNodeb - RAN name: %s, connection status: %s, associated E2T: %s", nodeb.RanName, nodeb.ConnectionStatus, nodeb.AssociatedE2TInstanceAddress)
137         }
138
139         return nodeb, err
140 }
141
142 func (w *rNibDataService) GetListNodebIds() ([]*entities.NbIdentity, error) {
143         var nodeIds []*entities.NbIdentity = nil
144
145         err := w.retry("GetListNodebIds", func() (err error) {
146                 nodeIds, err = w.rnibReader.GetListNodebIds()
147                 return
148         })
149
150         if err == nil {
151                 w.logger.Infof("#RnibDataService.GetListNodebIds - RANs count: %d", len(nodeIds))
152         }
153
154         return nodeIds, err
155 }
156
157 func (w *rNibDataService) GetE2TInstance(address string) (*entities.E2TInstance, error) {
158         var e2tInstance *entities.E2TInstance = nil
159
160         err := w.retry("GetE2TInstance", func() (err error) {
161                 e2tInstance, err = w.rnibReader.GetE2TInstance(address)
162                 return
163         })
164
165         if err == nil {
166                 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)
167         }
168
169         return e2tInstance, err
170 }
171
172 func (w *rNibDataService) GetE2TInstanceNoLogs(address string) (*entities.E2TInstance, error) {
173         var e2tInstance *entities.E2TInstance = nil
174
175         err := w.retry("GetE2TInstance", func() (err error) {
176                 e2tInstance, err = w.rnibReader.GetE2TInstance(address)
177                 return
178         })
179
180         return e2tInstance, err
181 }
182
183 func (w *rNibDataService) GetE2TInstances(addresses []string) ([]*entities.E2TInstance, error) {
184         w.logger.Infof("#RnibDataService.GetE2TInstances - addresses: %s", addresses)
185         var e2tInstances []*entities.E2TInstance = nil
186
187         err := w.retry("GetE2TInstance", func() (err error) {
188                 e2tInstances, err = w.rnibReader.GetE2TInstances(addresses)
189                 return
190         })
191
192         return e2tInstances, err
193 }
194
195 func (w *rNibDataService) GetE2TInstancesNoLogs(addresses []string) ([]*entities.E2TInstance, error) {
196
197         var e2tInstances []*entities.E2TInstance = nil
198
199         err := w.retry("GetE2TInstance", func() (err error) {
200                 e2tInstances, err = w.rnibReader.GetE2TInstances(addresses)
201                 return
202         })
203
204         return e2tInstances, err
205 }
206
207 func (w *rNibDataService) GetE2TAddresses() ([]string, error) {
208
209         var e2tAddresses []string = nil
210
211         err := w.retry("GetE2TAddresses", func() (err error) {
212                 e2tAddresses, err = w.rnibReader.GetE2TAddresses()
213                 return
214         })
215
216         if err == nil {
217                 w.logger.Infof("#RnibDataService.GetE2TAddresses - addresses: %s", e2tAddresses)
218         }
219
220         return e2tAddresses, err
221 }
222
223 func (w *rNibDataService) GetE2TAddressesNoLogs() ([]string, error) {
224
225         var e2tAddresses []string = nil
226
227         err := w.retry("GetE2TAddresses", func() (err error) {
228                 e2tAddresses, err = w.rnibReader.GetE2TAddresses()
229                 return
230         })
231
232         return e2tAddresses, err
233 }
234
235 func (w *rNibDataService) SaveE2TInstance(e2tInstance *entities.E2TInstance) error {
236         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)
237
238         return w.SaveE2TInstanceNoLogs(e2tInstance)
239 }
240
241 func (w *rNibDataService) SaveE2TInstanceNoLogs(e2tInstance *entities.E2TInstance) error {
242
243         err := w.retry("SaveE2TInstance", func() (err error) {
244                 err = w.rnibWriter.SaveE2TInstance(e2tInstance)
245                 return
246         })
247
248         return err
249 }
250
251 func (w *rNibDataService) SaveE2TAddresses(addresses []string) error {
252         w.logger.Infof("#RnibDataService.SaveE2TAddresses - addresses: %s", addresses)
253
254         err := w.retry("SaveE2TAddresses", func() (err error) {
255                 err = w.rnibWriter.SaveE2TAddresses(addresses)
256                 return
257         })
258
259         return err
260 }
261
262 func (w *rNibDataService) RemoveE2TInstance(e2tAddress string) error {
263         w.logger.Infof("#RnibDataService.RemoveE2TInstance - e2tAddress: %s", e2tAddress)
264
265         err := w.retry("RemoveE2TInstance", func() (err error) {
266                 err = w.rnibWriter.RemoveE2TInstance(e2tAddress)
267                 return
268         })
269
270         return err
271 }
272
273 func (w *rNibDataService) GetGeneralConfiguration() (*entities.GeneralConfiguration, error) {
274         var generalConfiguration *entities.GeneralConfiguration = nil
275
276         err := w.retry("GetGeneralConfiguration", func() (err error) {
277                 generalConfiguration, err = w.rnibReader.GetGeneralConfiguration()
278                 return
279         })
280
281         if err == nil {
282                 w.logger.Infof("#RnibDataService.GetGeneralConfiguration - enableRic: %t", generalConfiguration.EnableRic)
283         }
284
285         return generalConfiguration, err
286 }
287
288 func (w *rNibDataService) PingRnib() bool {
289         err := w.retry("GetListNodebIds", func() (err error) {
290                 _, err = w.rnibReader.GetListNodebIds()
291                 return
292         })
293
294         return !isRnibConnectionError(err)
295 }
296
297 func (w *rNibDataService) retry(rnibFunc string, f func() error) (err error) {
298         attempts := w.maxAttempts
299
300         for i := 1; ; i++ {
301                 err = f()
302                 if err == nil {
303                         return
304                 }
305                 if !isRnibConnectionError(err) {
306                         return err
307                 }
308                 if i >= attempts {
309                         w.logger.Errorf("#RnibDataService.retry - after %d attempts of %s, last error: %s", attempts, rnibFunc, err)
310                         return err
311                 }
312                 time.Sleep(w.retryInterval)
313
314                 w.logger.Infof("#RnibDataService.retry - retrying %d %s after error: %s", i, rnibFunc, err)
315         }
316 }
317
318 func isRnibConnectionError(err error) bool {
319         internalErr, ok := err.(*common.InternalError)
320         if !ok {
321                 return false
322         }
323         _, ok = internalErr.Err.(*net.OpError)
324
325         return ok
326 }