[RICPLT-2585] E2Term Init - Support Multiple E2T Instances
[ric-plt/e2mgr.git] / E2Manager / managers / e2t_instances_manager.go
1 package managers
2
3 import (
4         "e2mgr/logger"
5         "e2mgr/services"
6         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
7         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
8         "sync"
9 )
10
11 type E2TInstancesManager struct {
12         rnibDataService services.RNibDataService
13         logger          *logger.Logger
14         mux             sync.Mutex
15 }
16
17 type IE2TInstancesManager interface {
18         GetE2TInstance(e2tAddress string) (*entities.E2TInstance, error)
19         AddE2TInstance(e2tAddress string) error
20         RemoveE2TInstance(e2tInstance *entities.E2TInstance) error
21         SelectE2TInstance(e2tInstance *entities.E2TInstance) (string, error)
22         AssociateRan(ranName string, e2tAddress string) error
23         DeassociateRan(ranName string, e2tAddress string) error
24 }
25
26 func NewE2TInstancesManager(rnibDataService services.RNibDataService, logger *logger.Logger) *E2TInstancesManager {
27         return &E2TInstancesManager{
28                 rnibDataService: rnibDataService,
29                 logger:          logger,
30         }
31 }
32
33 func (m *E2TInstancesManager) GetE2TInstance(e2tAddress string) (*entities.E2TInstance, error) {
34         e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
35
36         if err != nil {
37                 m.logger.Errorf("#GetE2TInstance - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
38         }
39
40         return e2tInstance, err
41 }
42
43 func (m *E2TInstancesManager) AddE2TInstance(e2tAddress string) error {
44         e2tInstance := entities.NewE2TInstance(e2tAddress)
45         err := m.rnibDataService.SaveE2TInstance(e2tInstance)
46
47         if err != nil {
48                 m.logger.Errorf("#AddE2TInstance - E2T Instance address: %s - Failed saving E2T instance. error: %s", e2tInstance.Address, err)
49                 return err
50         }
51
52         m.mux.Lock()
53         defer m.mux.Unlock()
54
55         e2tInfoList, err := m.rnibDataService.GetE2TInfoList()
56
57         if err != nil {
58
59                 _, ok := err.(*common.ResourceNotFoundError)
60
61                 if !ok {
62                         m.logger.Errorf("#AddE2TInstance - E2T Instance address: %s - Failed retrieving E2TInfoList. error: %s", e2tInstance.Address, err)
63                         return err
64                 }
65         }
66
67         e2tInstanceInfo := entities.NewE2TInstanceInfo(e2tInstance.Address)
68         e2tInfoList = append(e2tInfoList, e2tInstanceInfo)
69
70         err = m.rnibDataService.SaveE2TInfoList(e2tInfoList)
71
72         if err != nil {
73                 m.logger.Errorf("#AddE2TInstance - E2T Instance address: %s - Failed saving E2TInfoList. error: %s", e2tInstance.Address, err)
74                 return err
75         }
76
77         m.logger.Infof("#AddE2TInstance - E2T Instance address: %s - successfully completed", e2tInstance.Address)
78         return nil
79 }
80
81 func (m *E2TInstancesManager) DeassociateRan(ranName string, e2tAddress string) error {
82
83         m.mux.Lock()
84         defer m.mux.Unlock()
85
86         e2tInfoList, err := m.rnibDataService.GetE2TInfoList()
87
88         if err != nil {
89                 m.logger.Errorf("#DeassociateRan - E2T Instance address: %s - Failed retrieving E2TInfoList. error: %s", e2tAddress, err)
90                 return err
91         }
92
93         isE2TInstanceFound := false
94
95         for _, e2tInfoInstance := range e2tInfoList {
96                 if e2tInfoInstance.Address == e2tAddress {
97                         e2tInfoInstance.AssociatedRanCount--
98                         isE2TInstanceFound = true
99                         break
100                 }
101         }
102
103         if !isE2TInstanceFound {
104                 m.logger.Warnf("#DeassociateRan - E2T Instance address: %s - E2TInstance not found in E2TInfoList.", e2tAddress)
105                 return nil
106         }
107
108         err = m.rnibDataService.SaveE2TInfoList(e2tInfoList)
109
110         if err != nil {
111                 m.logger.Errorf("#DeassociateRan - E2T Instance address: %s - Failed saving E2TInfoList. error: %s", e2tAddress, err)
112                 return err
113         }
114
115         e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
116
117         if err != nil {
118                 m.logger.Errorf("#DeassociateRan - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
119                 return err
120         }
121
122         i := 0 // output index
123         for _, v := range e2tInstance.AssociatedRanList {
124                 if v != ranName {
125                         // copy and increment index
126                         e2tInstance.AssociatedRanList[i] = v
127                         i++
128                 }
129         }
130
131         e2tInstance.AssociatedRanList = e2tInstance.AssociatedRanList[:i]
132
133         err = m.rnibDataService.SaveE2TInstance(e2tInstance)
134
135         if err != nil {
136                 m.logger.Errorf("#DeassociateRan - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
137                 return err
138         }
139
140         return nil
141 }
142
143 func (m *E2TInstancesManager) RemoveE2TInstance(e2tInstance *entities.E2TInstance) error {
144         return nil
145 }
146 func (m *E2TInstancesManager) SelectE2TInstance(e2tInstance *entities.E2TInstance) (string, error) {
147         return "", nil
148 }
149
150 func (m *E2TInstancesManager) AssociateRan(ranName string, e2tAddress string) error {
151
152         e2tInfoList, err := m.rnibDataService.GetE2TInfoList()
153
154         if err != nil {
155                 m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed retrieving E2TInfoList. error: %s", e2tAddress, err)
156                 return err
157         }
158
159         for _, e2tInfoInstance := range e2tInfoList {
160                 if e2tInfoInstance.Address == e2tAddress {
161                         e2tInfoInstance.AssociatedRanCount++
162                         break;
163                 }
164         }
165
166         err = m.rnibDataService.SaveE2TInfoList(e2tInfoList)
167
168         if err != nil {
169                 m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed saving E2TInfoList. error: %s", e2tAddress, err)
170                 return err
171         }
172
173         e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
174
175         if err != nil {
176                 m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
177                 return err
178         }
179
180         e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, ranName)
181
182         err = m.rnibDataService.SaveE2TInstance(e2tInstance)
183
184         if err != nil {
185                 m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
186                 return err
187         }
188
189         return nil
190 }