2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
21 "e2mgr/e2managererrors"
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"
31 type E2TInstancesManager struct {
32 rnibDataService services.RNibDataService
37 type IE2TInstancesManager interface {
38 GetE2TInstance(e2tAddress string) (*entities.E2TInstance, error)
39 GetE2TInstances() ([]*entities.E2TInstance, error)
40 GetE2TInstancesNoLogs() ([]*entities.E2TInstance, error)
41 AddE2TInstance(e2tAddress string) error
42 RemoveE2TInstance(e2tInstance *entities.E2TInstance) error
43 SelectE2TInstance() (string, error)
44 AssociateRan(ranName string, e2tAddress string) error
45 DissociateRan(ranName string, e2tAddress string) error
46 ResetKeepAliveTimestamp(e2tAddress string) error
49 func NewE2TInstancesManager(rnibDataService services.RNibDataService, logger *logger.Logger) *E2TInstancesManager {
50 return &E2TInstancesManager{
51 rnibDataService: rnibDataService,
56 func (m *E2TInstancesManager) GetE2TInstance(e2tAddress string) (*entities.E2TInstance, error) {
57 e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
61 _, ok := err.(*common.ResourceNotFoundError)
64 m.logger.Errorf("#E2TInstancesManager.GetE2TInstance - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
66 m.logger.Infof("#E2TInstancesManager.GetE2TInstance - E2T Instance address: %s not found on DB", e2tAddress)
70 return e2tInstance, err
73 func (m *E2TInstancesManager) GetE2TInstancesNoLogs() ([]*entities.E2TInstance, error) {
74 e2tAddresses, err := m.rnibDataService.GetE2TAddressesNoLogs()
77 _, ok := err.(*common.ResourceNotFoundError)
80 m.logger.Errorf("#E2TInstancesManager.GetE2TInstancesNoLogs - Failed retrieving E2T addresses. error: %s", err)
85 if len(e2tAddresses) == 0 {
86 return []*entities.E2TInstance{}, nil
89 e2tInstances, err := m.rnibDataService.GetE2TInstancesNoLogs(e2tAddresses)
92 _, ok := err.(*common.ResourceNotFoundError)
95 m.logger.Errorf("#E2TInstancesManager.GetE2TInstancesNoLogs - Failed retrieving E2T instances list. error: %s", err)
97 return e2tInstances, err
100 return e2tInstances, nil
103 func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error) {
104 e2tAddresses, err := m.rnibDataService.GetE2TAddresses()
107 m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T addresses. error: %s", err)
111 if len(e2tAddresses) == 0 {
112 m.logger.Infof("#E2TInstancesManager.GetE2TInstances - Empty E2T addresses list")
113 return []*entities.E2TInstance{}, nil
116 e2tInstances, err := m.rnibDataService.GetE2TInstances(e2tAddresses)
119 m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T instances list. error: %s", err)
120 return e2tInstances, err
123 if len(e2tInstances) == 0 {
124 m.logger.Warnf("#E2TInstancesManager.GetE2TInstances - Empty E2T instances list")
125 return e2tInstances, nil
128 return e2tInstances, nil
131 func (m *E2TInstancesManager) ResetKeepAliveTimestampsForAllE2TInstances() {
133 e2tInstances, err := m.GetE2TInstances()
136 m.logger.Errorf("E2TInstancesManager.ResetKeepAliveTimestampForAllE2TInstances - Couldn't reset timestamps due to a DB error")
140 if len(e2tInstances) == 0 {
141 m.logger.Infof("E2TInstancesManager.ResetKeepAliveTimestampForAllE2TInstances - No instances, ignoring reset")
145 for _, v := range e2tInstances {
147 if v.State != entities.Active {
151 v.KeepAliveTimestamp = time.Now().UnixNano()
153 err := m.rnibDataService.SaveE2TInstance(v)
156 m.logger.Errorf("E2TInstancesManager.ResetKeepAliveTimestampForAllE2TInstances - E2T address: %s - failed resetting e2t instance keep alive timestamp. error: %s", v.Address, err)
160 m.logger.Infof("E2TInstancesManager.ResetKeepAliveTimestampForAllE2TInstances - Done with reset")
163 func findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances []*entities.E2TInstance) *entities.E2TInstance {
164 var minInstance *entities.E2TInstance
165 minAssociatedRanCount := math.MaxInt32
167 for _, v := range e2tInstances {
168 if v.State == entities.Active && len(v.AssociatedRanList) < minAssociatedRanCount {
169 minAssociatedRanCount = len(v.AssociatedRanList)
177 func (m *E2TInstancesManager) AddE2TInstance(e2tAddress string) error {
182 e2tInstance := entities.NewE2TInstance(e2tAddress)
183 err := m.rnibDataService.SaveE2TInstance(e2tInstance)
186 m.logger.Errorf("#E2TInstancesManager.AddE2TInstance - E2T Instance address: %s - Failed saving E2T instance. error: %s", e2tInstance.Address, err)
190 e2tAddresses, err := m.rnibDataService.GetE2TAddresses()
194 _, ok := err.(*common.ResourceNotFoundError)
197 m.logger.Errorf("#E2TInstancesManager.AddE2TInstance - E2T Instance address: %s - Failed retrieving E2T addresses list. error: %s", e2tInstance.Address, err)
202 e2tAddresses = append(e2tAddresses, e2tInstance.Address)
204 err = m.rnibDataService.SaveE2TAddresses(e2tAddresses)
207 m.logger.Errorf("#E2TInstancesManager.AddE2TInstance - E2T Instance address: %s - Failed saving E2T addresses list. error: %s", e2tInstance.Address, err)
211 m.logger.Infof("#E2TInstancesManager.AddE2TInstance - E2T Instance address: %s - successfully added E2T instance", e2tInstance.Address)
215 func (m *E2TInstancesManager) DissociateRan(ranName string, e2tAddress string) error {
220 e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
223 m.logger.Errorf("#E2TInstancesManager.DissociateRan - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
227 i := 0 // output index
228 for _, v := range e2tInstance.AssociatedRanList {
230 // copy and increment index
231 e2tInstance.AssociatedRanList[i] = v
236 e2tInstance.AssociatedRanList = e2tInstance.AssociatedRanList[:i]
238 err = m.rnibDataService.SaveE2TInstance(e2tInstance)
241 m.logger.Errorf("#E2TInstancesManager.DissociateRan - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
245 m.logger.Infof("#E2TInstancesManager.DissociateRan - successfully dissociated RAN %s from E2T %s", ranName, e2tInstance.Address)
249 func (m *E2TInstancesManager) RemoveE2TInstance(e2tInstance *entities.E2TInstance) error {
252 func (m *E2TInstancesManager) SelectE2TInstance() (string, error) {
254 e2tInstances, err := m.GetE2TInstances()
257 return "", e2managererrors.NewRnibDbError()
260 if len(e2tInstances) == 0 {
261 m.logger.Errorf("#E2TInstancesManager.SelectE2TInstance - No E2T instance found")
262 return "", e2managererrors.NewE2TInstanceAbsenceError()
265 min := findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances)
268 m.logger.Errorf("#E2TInstancesManager.SelectE2TInstance - No active E2T instance found")
269 return "", e2managererrors.NewE2TInstanceAbsenceError()
272 m.logger.Infof("#E2TInstancesManager.SelectE2TInstance - successfully selected E2T instance. address: %s", min.Address)
273 return min.Address, nil
276 func (m *E2TInstancesManager) AssociateRan(ranName string, e2tAddress string) error {
281 e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
284 m.logger.Errorf("#E2TInstancesManager.AssociateRan - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
285 return e2managererrors.NewRnibDbError()
288 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, ranName)
290 err = m.rnibDataService.SaveE2TInstance(e2tInstance)
293 m.logger.Errorf("#E2TInstancesManager.AssociateRan - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
294 return e2managererrors.NewRnibDbError()
297 m.logger.Infof("#E2TInstancesManager.AssociateRan - successfully associated RAN %s with E2T %s", ranName, e2tInstance.Address)
301 func (m *E2TInstancesManager) ResetKeepAliveTimestamp(e2tAddress string) error {
306 e2tInstance, err := m.rnibDataService.GetE2TInstanceNoLogs(e2tAddress)
309 m.logger.Errorf("#E2TInstancesManager.ResetKeepAliveTimestamp - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
313 if e2tInstance.State == entities.ToBeDeleted || e2tInstance.State == entities.RoutingManagerFailure {
314 m.logger.Warnf("#E2TInstancesManager.ResetKeepAliveTimestamp - Ignore. This Instance is about to deleted")
319 e2tInstance.KeepAliveTimestamp = time.Now().UnixNano()
320 err = m.rnibDataService.SaveE2TInstanceNoLogs(e2tInstance)
323 m.logger.Errorf("#E2TInstancesManager.ResetKeepAliveTimestamp - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)