8a9189492bf4867c39b3589cee0e6cb99e480172
[ric-plt/e2mgr.git] / E2Manager / services / rnib_data_service.go
1 package services
2
3 import (
4         "e2mgr/configuration"
5         "e2mgr/logger"
6         "e2mgr/rNibWriter"
7         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
8         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
9         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
10         "net"
11         "time"
12 )
13
14 type RNibDataService interface {
15         SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error
16         UpdateNodebInfo(nodebInfo *entities.NodebInfo) error
17         SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error
18         GetNodeb(ranName string) (*entities.NodebInfo, error)
19         GetListNodebIds() ([]*entities.NbIdentity, error)
20 }
21
22 type rNibDataService struct {
23         logger             *logger.Logger
24         rnibReaderProvider func() reader.RNibReader
25         rnibWriterProvider func() rNibWriter.RNibWriter
26         maxAttempts        int
27         retryInterval      time.Duration
28 }
29
30 func NewRnibDataService(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *rNibDataService {
31         return &rNibDataService{
32                 logger:             logger,
33                 rnibReaderProvider: rnibReaderProvider,
34                 rnibWriterProvider: rnibWriterProvider,
35                 maxAttempts:        config.MaxRnibConnectionAttempts,
36                 retryInterval:      time.Duration(config.RnibRetryIntervalMs) * time.Millisecond,
37         }
38 }
39
40 func (w *rNibDataService) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error {
41         w.logger.Infof("#RnibDataService.UpdateNodebInfo - nodebInfo: %s", nodebInfo)
42
43         err := w.retry("UpdateNodebInfo", func() (err error) {
44                 err = w.rnibWriterProvider().UpdateNodebInfo(nodebInfo)
45                 return
46         })
47
48         return err
49 }
50
51 func (w *rNibDataService) SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error {
52         w.logger.Infof("#RnibDataService.SaveNodeb - nbIdentity: %s, nodebInfo: %s", nbIdentity, nb)
53
54         err := w.retry("SaveNodeb", func() (err error) {
55                 err = w.rnibWriterProvider().SaveNodeb(nbIdentity, nb)
56                 return
57         })
58
59         return err
60 }
61
62 func (w *rNibDataService) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error {
63         w.logger.Infof("#RnibDataService.SaveRanLoadInformation - inventoryName: %s, ranLoadInformation: %s", inventoryName, ranLoadInformation)
64
65         err := w.retry("SaveRanLoadInformation", func() (err error) {
66                 err = w.rnibWriterProvider().SaveRanLoadInformation(inventoryName, ranLoadInformation)
67                 return
68         })
69
70         return err
71 }
72
73 func (w *rNibDataService) GetNodeb(ranName string) (*entities.NodebInfo, error) {
74         w.logger.Infof("#RnibDataService.GetNodeb - ranName: %s", ranName)
75
76         var nodeb *entities.NodebInfo = nil
77
78         err := w.retry("GetNodeb", func() (err error) {
79                 nodeb, err = w.rnibReaderProvider().GetNodeb(ranName)
80                 return
81         })
82
83         return nodeb, err
84 }
85
86 func (w *rNibDataService) GetListNodebIds() ([]*entities.NbIdentity, error) {
87         w.logger.Infof("#RnibDataService.GetListNodebIds")
88
89         var nodeIds []*entities.NbIdentity = nil
90
91         err := w.retry("GetListNodebIds", func() (err error) {
92                 nodeIds, err = w.rnibReaderProvider().GetListNodebIds()
93                 return
94         })
95
96         return nodeIds, err
97 }
98
99 func (w *rNibDataService) retry(rnibFunc string, f func() error) (err error) {
100         attempts := w.maxAttempts
101
102         for i := 1; ; i++ {
103                 err = f()
104                 if err == nil {
105                         return
106                 }
107                 if !w.isConnError(err) {
108                         return err
109                 }
110                 if i >= attempts {
111                         w.logger.Errorf("#RnibDataService.retry - after %d attempts of %s, last error: %s", attempts, rnibFunc, err)
112                         return err
113                 }
114                 time.Sleep(w.retryInterval)
115
116                 w.logger.Infof("#RnibDataService.retry - retrying %d %s after error: %s", i, rnibFunc, err)
117         }
118 }
119
120 func (w *rNibDataService) isConnError(err error) bool {
121         internalErr, ok := err.(common.InternalError)
122         if !ok {
123                 return false
124         }
125         _, ok = internalErr.Err.(*net.OpError)
126
127         return ok
128 }