blob: 1b105b0f99a3f0bdc155a83fe2c6486db873a141 [file] [log] [blame]
Amichai804065d2019-12-24 14:52:24 +02001//
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
20package managers
21
22import (
23 "e2mgr/clients"
24 "e2mgr/logger"
25 "e2mgr/services"
Amichai1f62f4c2019-12-29 17:48:44 +020026 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
Amichai804065d2019-12-24 14:52:24 +020027)
28
29type E2TAssociationManager struct {
30 logger *logger.Logger
31 rnibDataService services.RNibDataService
32 e2tInstanceManager IE2TInstancesManager
33 rmClient clients.IRoutingManagerClient
34}
35
36func NewE2TAssociationManager(logger *logger.Logger, rnibDataService services.RNibDataService, e2tInstanceManager IE2TInstancesManager, rmClient clients.IRoutingManagerClient) *E2TAssociationManager {
37 return &E2TAssociationManager{
38 logger: logger,
39 rnibDataService: rnibDataService,
40 e2tInstanceManager: e2tInstanceManager,
41 rmClient: rmClient,
42 }
43}
44
Amichai1f62f4c2019-12-29 17:48:44 +020045func (m *E2TAssociationManager) AssociateRan(e2tAddress string, nodebInfo *entities.NodebInfo) error {
46 ranName := nodebInfo.RanName
Amichai804065d2019-12-24 14:52:24 +020047 m.logger.Infof("#E2TAssociationManager.AssociateRan - Associating RAN %s to E2T Instance address: %s", ranName, e2tAddress)
48
49 err := m.rmClient.AssociateRanToE2TInstance(e2tAddress, ranName)
50 if err != nil {
51 m.logger.Errorf("#E2TAssociationManager.AssociateRan - RoutingManager failure: Failed to associate RAN %s to E2T %s. Error: %s", ranName, e2tAddress, err)
52 return err
53 }
54
Amichai804065d2019-12-24 14:52:24 +020055 nodebInfo.AssociatedE2TInstanceAddress = e2tAddress
56 nodebInfo.ConnectionAttempts = 0
is005qe3de46b2019-12-30 16:35:19 +020057
Amichai1f62f4c2019-12-29 17:48:44 +020058 rnibErr := m.rnibDataService.UpdateNodebInfo(nodebInfo)
Amichai804065d2019-12-24 14:52:24 +020059 if rnibErr != nil {
60 m.logger.Errorf("#E2TAssociationManager.AssociateRan - RAN name: %s - Failed to update RAN.AssociatedE2TInstanceAddress in rNib. Error: %s", ranName, rnibErr)
61 return rnibErr
62 }
63
Amichai380b7a22020-01-14 16:38:06 +020064 err = m.e2tInstanceManager.AddRansToInstance(e2tAddress, []string{ranName})
Amichai804065d2019-12-24 14:52:24 +020065 if err != nil {
66 m.logger.Errorf("#E2TAssociationManager.AssociateRan - RAN name: %s - Failed to add RAN to E2T instance %s. Error: %s", ranName, e2tAddress, err)
67 return err
68 }
69 m.logger.Infof("#E2TAssociationManager.AssociateRan - successfully associated RAN %s with E2T %s", ranName, e2tAddress)
70 return nil
71}
Amichai0c747ac2019-12-25 14:06:40 +020072
73func (m *E2TAssociationManager) DissociateRan(e2tAddress string, ranName string) error {
74 m.logger.Infof("#E2TAssociationManager.DissociateRan - Dissociating RAN %s from E2T Instance address: %s", ranName, e2tAddress)
75
76 nodebInfo, rnibErr := m.rnibDataService.GetNodeb(ranName)
77 if rnibErr != nil {
78 m.logger.Errorf("#E2TAssociationManager.DissociateRan - RAN name: %s - Failed fetching RAN from rNib. Error: %s", ranName, rnibErr)
79 return rnibErr
80 }
81
82 nodebInfo.AssociatedE2TInstanceAddress = ""
83 rnibErr = m.rnibDataService.UpdateNodebInfo(nodebInfo)
84 if rnibErr != nil {
85 m.logger.Errorf("#E2TAssociationManager.DissociateRan - RAN name: %s - Failed to update RAN.AssociatedE2TInstanceAddress in rNib. Error: %s", ranName, rnibErr)
86 return rnibErr
87 }
88
89 err := m.e2tInstanceManager.RemoveRanFromInstance(ranName, e2tAddress)
90 if err != nil {
91 m.logger.Errorf("#E2TAssociationManager.DissociateRan - RAN name: %s - Failed to remove RAN from E2T instance %s. Error: %s", ranName, e2tAddress, err)
92 return err
93 }
94
95 err = m.rmClient.DissociateRanE2TInstance(e2tAddress, ranName)
96 if err != nil {
97 m.logger.Errorf("#E2TAssociationManager.DissociateRan - RoutingManager failure: Failed to dissociate RAN %s from E2T %s. Error: %s", ranName, e2tAddress, err)
98 } else {
99 m.logger.Infof("#E2TAssociationManager.DissociateRan - successfully dissociated RAN %s from E2T %s", ranName, e2tAddress)
100 }
101 return nil
102}
Amichaif846c592020-01-08 16:45:07 +0200103
Amichai380b7a22020-01-14 16:38:06 +0200104func (m *E2TAssociationManager) RemoveE2tInstance(e2tInstance *entities.E2TInstance, ransToBeDissociated []string, ranAssociationList map[string][]string) error {
105 m.logger.Infof("#E2TAssociationManager.RemoveE2tInstance - Removing E2T %s and re-associating its associated RANs.", e2tInstance.Address)
Amichaif846c592020-01-08 16:45:07 +0200106
Amichai380b7a22020-01-14 16:38:06 +0200107 err := m.rmClient.DeleteE2TInstance(e2tInstance.Address, ransToBeDissociated, ranAssociationList)
Amichaif846c592020-01-08 16:45:07 +0200108 if err != nil {
Amichai380b7a22020-01-14 16:38:06 +0200109 _ = m.setStateToRoutingManagerFailure(e2tInstance)
110 m.logger.Errorf("#E2TAssociationManager.RemoveE2tInstance - RoutingManager failure: Failed to delete E2T %s. Error: %s", e2tInstance.Address, err)
Amichaif846c592020-01-08 16:45:07 +0200111 return err
112 }
113
Amichai380b7a22020-01-14 16:38:06 +0200114 err = m.e2tInstanceManager.RemoveE2TInstance(e2tInstance.Address)
Amichaif846c592020-01-08 16:45:07 +0200115 if err != nil {
Amichai380b7a22020-01-14 16:38:06 +0200116 m.logger.Errorf("#E2TAssociationManager.RemoveE2tInstance - Failed to remove E2T %s. Error: %s", e2tInstance.Address, err)
Amichaif846c592020-01-08 16:45:07 +0200117 return err
118 }
119
Amichai380b7a22020-01-14 16:38:06 +0200120 for e2tAddress, associatedRans := range ranAssociationList {
121 err = m.e2tInstanceManager.AddRansToInstance(e2tAddress, associatedRans)
122 if err != nil {
123 m.logger.Errorf("#E2TAssociationManager.RemoveE2tInstance - Failed to add RANs %s to E2T %s. Error: %s", associatedRans, e2tAddress, err)
124 return err
125 }
126 }
127
128 m.logger.Infof("#E2TAssociationManager.RemoveE2tInstance - E2T %s successfully removed.", e2tInstance.Address)
Amichaif846c592020-01-08 16:45:07 +0200129 return nil
130}
131
Amichai380b7a22020-01-14 16:38:06 +0200132func (m *E2TAssociationManager) setStateToRoutingManagerFailure(e2tInstance *entities.E2TInstance) error {
133
134 err := m.e2tInstanceManager.SetE2tInstanceState(e2tInstance.Address, e2tInstance.State, entities.RoutingManagerFailure)
Amichaif846c592020-01-08 16:45:07 +0200135 if err != nil {
136 return err
137 }
138 return nil
139}