Adding new comments for Oran in all files with licenses
[ric-plt/resource-status-manager.git] / RSM / 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
21 package services
22
23 import (
24         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
25         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
26         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
27         "net"
28         "rsm/configuration"
29         "rsm/logger"
30         "time"
31 )
32
33 type RNibDataService interface {
34         GetNodeb(ranName string) (*entities.NodebInfo, error)
35         GetListNodebIds() ([]*entities.NbIdentity, error)
36         PingRnib() bool
37 }
38
39 type rNibDataService struct {
40         logger             *logger.Logger
41         rnibReaderProvider func() reader.RNibReader
42         maxAttempts        int
43         retryInterval      time.Duration
44 }
45
46 func NewRnibDataService(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader) *rNibDataService {
47         return &rNibDataService{
48                 logger:             logger,
49                 rnibReaderProvider: rnibReaderProvider,
50                 maxAttempts:        config.Rnib.MaxRnibConnectionAttempts,
51                 retryInterval:      time.Duration(config.Rnib.RnibRetryIntervalMs) * time.Millisecond,
52         }
53 }
54
55 func (w *rNibDataService) GetNodeb(ranName string) (*entities.NodebInfo, error) {
56         w.logger.Infof("#RnibDataService.GetNodeb - ranName: %s", ranName)
57
58         var nodeb *entities.NodebInfo = nil
59
60         err := w.retry("GetNodeb", func() (err error) {
61                 nodeb, err = w.rnibReaderProvider().GetNodeb(ranName)
62                 return
63         })
64
65         return nodeb, err
66 }
67
68 func (w *rNibDataService) GetListNodebIds() ([]*entities.NbIdentity, error) {
69         w.logger.Infof("#RnibDataService.GetListNodebIds")
70
71         var nodeIds []*entities.NbIdentity = nil
72
73         err := w.retry("GetListNodebIds", func() (err error) {
74                 nodeIds, err = w.rnibReaderProvider().GetListNodebIds()
75                 return
76         })
77
78         return nodeIds, err
79 }
80
81 func (w *rNibDataService) PingRnib() bool {
82         err := w.retry("GetListNodebIds", func() (err error) {
83                 _, err = w.rnibReaderProvider().GetListNodebIds()
84                 return
85         })
86
87         return !isRnibConnectionError(err)
88 }
89
90 func (w *rNibDataService) retry(rnibFunc string, f func() error) (err error) {
91         attempts := w.maxAttempts
92
93         for i := 1; ; i++ {
94                 err = f()
95                 if err == nil {
96                         return
97                 }
98                 if !isRnibConnectionError(err) {
99                         return err
100                 }
101                 if i >= attempts {
102                         w.logger.Errorf("#RnibDataService.retry - after %d attempts of %s, last error: %s", attempts, rnibFunc, err)
103                         return err
104                 }
105                 time.Sleep(w.retryInterval)
106
107                 w.logger.Infof("#RnibDataService.retry - retrying %d %s after error: %s", i, rnibFunc, err)
108         }
109 }
110
111 func isRnibConnectionError(err error) bool {
112         internalErr, ok := err.(*common.InternalError)
113         if !ok {
114                 return false
115         }
116         _, ok = internalErr.Err.(*net.OpError)
117
118         return ok
119 }