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"
13 type E2TInstancesManager struct {
14 rnibDataService services.RNibDataService
19 type IE2TInstancesManager interface {
20 GetE2TInstance(e2tAddress string) (*entities.E2TInstance, error)
21 GetE2TInstances() ([]*entities.E2TInstance, error)
22 AddE2TInstance(e2tAddress string) error
23 RemoveE2TInstance(e2tInstance *entities.E2TInstance) error
24 SelectE2TInstance() (string, error)
25 AssociateRan(ranName string, e2tAddress string) error
26 DissociateRan(ranName string, e2tAddress string) error
29 func NewE2TInstancesManager(rnibDataService services.RNibDataService, logger *logger.Logger) *E2TInstancesManager {
30 return &E2TInstancesManager{
31 rnibDataService: rnibDataService,
36 func (m *E2TInstancesManager) GetE2TInstance(e2tAddress string) (*entities.E2TInstance, error) {
37 e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
40 m.logger.Errorf("#GetE2TInstance - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
43 return e2tInstance, err
46 func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error) {
47 e2tAddresses, err := m.rnibDataService.GetE2TAddresses()
50 m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T addresses. error: %s", err)
54 if len(e2tAddresses) == 0 {
55 m.logger.Warnf("#E2TInstancesManager.GetE2TInstances - Empty E2T addresses list")
56 return []*entities.E2TInstance{}, nil
59 e2tInstances, err := m.rnibDataService.GetE2TInstances(e2tAddresses)
62 m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T instances list. error: %s", err)
63 return e2tInstances, err
66 if len(e2tInstances) == 0 {
67 m.logger.Warnf("#E2TInstancesManager.GetE2TInstances - Empty E2T instances list")
68 return e2tInstances, nil
71 return e2tInstances, nil
75 func findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances []*entities.E2TInstance) *entities.E2TInstance {
76 var minInstance *entities.E2TInstance
77 minAssociatedRanCount := math.MaxInt32
79 for _, v := range e2tInstances {
80 if v.State == entities.Active && len(v.AssociatedRanList) < minAssociatedRanCount {
81 minAssociatedRanCount = len(v.AssociatedRanList)
89 func (m *E2TInstancesManager) AddE2TInstance(e2tAddress string) error {
91 if len(e2tAddress) == 0 {
92 m.logger.Errorf("#AddE2TInstance - Empty E2T address received")
93 return fmt.Errorf("empty E2T address")
96 e2tInstance := entities.NewE2TInstance(e2tAddress)
97 err := m.rnibDataService.SaveE2TInstance(e2tInstance)
100 m.logger.Errorf("#AddE2TInstance - E2T Instance address: %s - Failed saving E2T instance. error: %s", e2tInstance.Address, err)
107 e2tAddresses, err := m.rnibDataService.GetE2TAddresses()
111 _, ok := err.(*common.ResourceNotFoundError)
114 m.logger.Errorf("#AddE2TInstance - E2T Instance address: %s - Failed retrieving E2T addresses list. error: %s", e2tInstance.Address, err)
119 e2tAddresses = append(e2tAddresses, e2tInstance.Address)
121 err = m.rnibDataService.SaveE2TAddresses(e2tAddresses)
124 m.logger.Errorf("#AddE2TInstance - E2T Instance address: %s - Failed saving E2T addresses list. error: %s", e2tInstance.Address, err)
128 m.logger.Infof("#AddE2TInstance - E2T Instance address: %s - successfully completed", e2tInstance.Address)
132 func (m *E2TInstancesManager) DissociateRan(ranName string, e2tAddress string) error {
137 e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
140 m.logger.Errorf("#DissociateRan - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
144 i := 0 // output index
145 for _, v := range e2tInstance.AssociatedRanList {
147 // copy and increment index
148 e2tInstance.AssociatedRanList[i] = v
153 e2tInstance.AssociatedRanList = e2tInstance.AssociatedRanList[:i]
155 err = m.rnibDataService.SaveE2TInstance(e2tInstance)
158 m.logger.Errorf("#DissociateRan - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
165 func (m *E2TInstancesManager) RemoveE2TInstance(e2tInstance *entities.E2TInstance) error {
168 func (m *E2TInstancesManager) SelectE2TInstance() (string, error) {
170 e2tInstances, err := m.GetE2TInstances()
177 if len(e2tInstances) == 0 {
182 min := findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances)
185 m.logger.Errorf("#SelectE2TInstance - No active E2T instance found")
187 return "", fmt.Errorf("No active E2T instance found")
190 return min.Address, nil
193 func (m *E2TInstancesManager) AssociateRan(ranName string, e2tAddress string) error {
198 e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
201 m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
205 e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, ranName)
207 err = m.rnibDataService.SaveE2TInstance(e2tInstance)
210 m.logger.Errorf("#AssociateRan - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)