Merge "[RIC-435] DevOps: Create Simulator on K8S"
[ric-plt/e2mgr.git] / E2Manager / managers / e2t_instances_manager.go
index eefeea1..1887cd7 100644 (file)
@@ -14,6 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 //
+
 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
 //  platform project (RICP).
 
@@ -37,16 +38,18 @@ type E2TInstancesManager struct {
 }
 
 type IE2TInstancesManager interface {
+       GetE2TAddresses() ([]string, error)
        GetE2TInstance(e2tAddress string) (*entities.E2TInstance, error)
        GetE2TInstances() ([]*entities.E2TInstance, error)
        GetE2TInstancesNoLogs() ([]*entities.E2TInstance, error)
-       AddE2TInstance(e2tAddress string) error
-       RemoveE2TInstance(e2tInstance *entities.E2TInstance) error
+       AddE2TInstance(e2tAddress string, podName string) error
+       RemoveE2TInstance(e2tAddress string) error
        SelectE2TInstance() (string, error)
-       AddRanToInstance(ranName string, e2tAddress string) error
+       AddRansToInstance(e2tAddress string, ranNames []string) error
        RemoveRanFromInstance(ranName string, e2tAddress string) error
-       ActivateE2TInstance(e2tInstance *entities.E2TInstance) error
        ResetKeepAliveTimestamp(e2tAddress string) error
+       ClearRansOfAllE2TInstances() error
+       SetE2tInstanceState(e2tAddress string, currentState entities.E2TInstanceState, newState entities.E2TInstanceState) error
 }
 
 func NewE2TInstancesManager(rnibDataService services.RNibDataService, logger *logger.Logger) *E2TInstancesManager {
@@ -105,7 +108,7 @@ func (m *E2TInstancesManager) GetE2TInstancesNoLogs() ([]*entities.E2TInstance,
        return e2tInstances, nil
 }
 
-func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error) {
+func (m *E2TInstancesManager) GetE2TAddresses() ([]string, error) {
        e2tAddresses, err := m.rnibDataService.GetE2TAddresses()
 
        if err != nil {
@@ -113,12 +116,20 @@ func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error)
                _, ok := err.(*common.ResourceNotFoundError)
 
                if !ok {
-                       m.logger.Errorf("#E2TInstancesManager.GetE2TInstances - Failed retrieving E2T addresses. error: %s", err)
+                       m.logger.Errorf("#E2TInstancesManager.GetE2TAddresses - Failed retrieving E2T addresses. error: %s", err)
                        return nil, e2managererrors.NewRnibDbError()
                }
 
-               m.logger.Infof("#E2TInstancesManager.GetE2TInstances - Empty E2T addresses list")
-               return []*entities.E2TInstance{}, nil
+       }
+
+       return e2tAddresses, nil
+}
+
+func (m *E2TInstancesManager) GetE2TInstances() ([]*entities.E2TInstance, error) {
+       e2tAddresses, err := m.GetE2TAddresses()
+
+       if err != nil {
+               return nil, e2managererrors.NewRnibDbError()
        }
 
        if len(e2tAddresses) == 0 {
@@ -187,12 +198,12 @@ func findActiveE2TInstanceWithMinimumAssociatedRans(e2tInstances []*entities.E2T
        return minInstance
 }
 
-func (m *E2TInstancesManager) AddE2TInstance(e2tAddress string) error {
+func (m *E2TInstancesManager) AddE2TInstance(e2tAddress string, podName string) error {
 
        m.mux.Lock()
        defer m.mux.Unlock()
 
-       e2tInstance := entities.NewE2TInstance(e2tAddress)
+       e2tInstance := entities.NewE2TInstance(e2tAddress, podName)
        err := m.rnibDataService.SaveE2TInstance(e2tInstance)
 
        if err != nil {
@@ -221,7 +232,7 @@ func (m *E2TInstancesManager) AddE2TInstance(e2tAddress string) error {
                return err
        }
 
-       m.logger.Infof("#E2TInstancesManager.AddE2TInstance - E2T Instance address: %s - successfully added E2T instance", e2tInstance.Address)
+       m.logger.Infof("#E2TInstancesManager.AddE2TInstance - E2T Instance address: %s, pod name: %s - successfully added E2T instance", e2tInstance.Address, e2tInstance.PodName)
        return nil
 }
 
@@ -234,7 +245,7 @@ func (m *E2TInstancesManager) RemoveRanFromInstance(ranName string, e2tAddress s
 
        if err != nil {
                m.logger.Errorf("#E2TInstancesManager.RemoveRanFromInstance - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
-               return err
+               return e2managererrors.NewRnibDbError()
        }
 
        i := 0 // output index
@@ -252,16 +263,53 @@ func (m *E2TInstancesManager) RemoveRanFromInstance(ranName string, e2tAddress s
 
        if err != nil {
                m.logger.Errorf("#E2TInstancesManager.RemoveRanFromInstance - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
-               return err
+               return e2managererrors.NewRnibDbError()
        }
 
        m.logger.Infof("#E2TInstancesManager.RemoveRanFromInstance - successfully dissociated RAN %s from E2T %s", ranName, e2tInstance.Address)
        return nil
 }
 
-func (m *E2TInstancesManager) RemoveE2TInstance(e2tInstance *entities.E2TInstance) error {
+func (m *E2TInstancesManager) RemoveE2TInstance(e2tAddress string) error {
+       m.mux.Lock()
+       defer m.mux.Unlock()
+
+       err := m.rnibDataService.RemoveE2TInstance(e2tAddress)
+       if err != nil {
+               m.logger.Errorf("#E2TInstancesManager.RemoveE2TInstance - E2T Instance address: %s - Failed removing E2TInstance. error: %s", e2tAddress, err)
+               return e2managererrors.NewRnibDbError()
+       }
+
+       e2tAddresses, err := m.rnibDataService.GetE2TAddresses()
+
+       if err != nil {
+               m.logger.Errorf("#E2TInstancesManager.RemoveE2TInstance - E2T Instance address: %s - Failed retrieving E2T addresses list. error: %s", e2tAddress, err)
+               return e2managererrors.NewRnibDbError()
+       }
+
+       e2tAddresses = m.removeAddressFromList(e2tAddresses, e2tAddress)
+
+       err = m.rnibDataService.SaveE2TAddresses(e2tAddresses)
+       if err != nil {
+               m.logger.Errorf("#E2TInstancesManager.RemoveE2TInstance - E2T Instance address: %s - Failed saving E2T addresses list. error: %s", e2tAddress, err)
+               return e2managererrors.NewRnibDbError()
+       }
+
        return nil
 }
+
+func (m *E2TInstancesManager) removeAddressFromList(e2tAddresses []string, addressToRemove string) []string {
+       newAddressList := []string{}
+
+       for _, address := range e2tAddresses {
+               if address != addressToRemove {
+                       newAddressList = append(newAddressList, address)
+               }
+       }
+
+       return newAddressList
+}
+
 func (m *E2TInstancesManager) SelectE2TInstance() (string, error) {
 
        e2tInstances, err := m.GetE2TInstances()
@@ -286,7 +334,7 @@ func (m *E2TInstancesManager) SelectE2TInstance() (string, error) {
        return min.Address, nil
 }
 
-func (m *E2TInstancesManager) AddRanToInstance(ranName string, e2tAddress string) error {
+func (m *E2TInstancesManager) AddRansToInstance(e2tAddress string, ranNames []string) error {
 
        m.mux.Lock()
        defer m.mux.Unlock()
@@ -294,68 +342,108 @@ func (m *E2TInstancesManager) AddRanToInstance(ranName string, e2tAddress string
        e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
 
        if err != nil {
-               m.logger.Errorf("#E2TInstancesManager.AddRanToInstance - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
+               m.logger.Errorf("#E2TInstancesManager.AddRansToInstance - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
                return e2managererrors.NewRnibDbError()
        }
 
-       e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, ranName)
+       e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, ranNames...)
 
        err = m.rnibDataService.SaveE2TInstance(e2tInstance)
 
        if err != nil {
-               m.logger.Errorf("#E2TInstancesManager.AddRanToInstance - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
+               m.logger.Errorf("#E2TInstancesManager.AddRansToInstance - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
                return e2managererrors.NewRnibDbError()
        }
 
-       m.logger.Infof("#E2TInstancesManager.AddRanToInstance - RAN %s was added successfully to E2T %s", ranName, e2tInstance.Address)
+       m.logger.Infof("#E2TInstancesManager.AddRansToInstance - RAN %s were added successfully to E2T %s", ranNames, e2tInstance.Address)
        return nil
 }
 
-func (m E2TInstancesManager) ActivateE2TInstance(e2tInstance *entities.E2TInstance) error{
+func (m *E2TInstancesManager) ResetKeepAliveTimestamp(e2tAddress string) error {
+
+       m.mux.Lock()
+       defer m.mux.Unlock()
+
+       e2tInstance, err := m.rnibDataService.GetE2TInstanceNoLogs(e2tAddress)
 
-       if e2tInstance == nil {
-               m.logger.Errorf("#E2TInstancesManager.ActivateE2TInstance - e2tInstance empty")
-               return e2managererrors.NewInternalError()
+       if err != nil {
+               m.logger.Errorf("#E2TInstancesManager.ResetKeepAliveTimestamp - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
+               return err
        }
 
-       m.logger.Infof("#E2TInstancesManager.ActivateE2TInstance - E2T Address: %s - activate E2T instance", e2tInstance.Address)
+       if e2tInstance.State == entities.ToBeDeleted {
+               m.logger.Warnf("#E2TInstancesManager.ResetKeepAliveTimestamp - Ignore. This Instance is about to be deleted")
+               return nil
+
+       }
 
-       e2tInstance.State = entities.Active
        e2tInstance.KeepAliveTimestamp = time.Now().UnixNano()
+       err = m.rnibDataService.SaveE2TInstanceNoLogs(e2tInstance)
 
-       err := m.rnibDataService.SaveE2TInstance(e2tInstance)
        if err != nil {
-               m.logger.Errorf("#E2TInstancesManager.ActivateE2TInstance - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tInstance.Address, err)
+               m.logger.Errorf("#E2TInstancesManager.ResetKeepAliveTimestamp - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
                return err
        }
+
        return nil
 }
 
-func (m *E2TInstancesManager) ResetKeepAliveTimestamp(e2tAddress string) error {
-
+func (m *E2TInstancesManager) SetE2tInstanceState(e2tAddress string, currentState entities.E2TInstanceState, newState entities.E2TInstanceState) error {
        m.mux.Lock()
        defer m.mux.Unlock()
 
-       e2tInstance, err := m.rnibDataService.GetE2TInstanceNoLogs(e2tAddress)
+       e2tInstance, err := m.rnibDataService.GetE2TInstance(e2tAddress)
 
        if err != nil {
-               m.logger.Errorf("#E2TInstancesManager.ResetKeepAliveTimestamp - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
-               return err
+               m.logger.Errorf("#E2TInstancesManager.SetE2tInstanceState - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
+               return e2managererrors.NewRnibDbError()
        }
 
-       if e2tInstance.State == entities.ToBeDeleted || e2tInstance.State == entities.RoutingManagerFailure {
-               m.logger.Warnf("#E2TInstancesManager.ResetKeepAliveTimestamp - Ignore. This Instance is about to deleted")
-               return nil
+       if currentState != e2tInstance.State {
+               m.logger.Warnf("#E2TInstancesManager.SetE2tInstanceState - E2T Instance address: %s - Current state is not: %s", e2tAddress, currentState)
+               return e2managererrors.NewInternalError()
+       }
 
+       e2tInstance.State = newState
+       if newState == entities.Active {
+               e2tInstance.KeepAliveTimestamp = time.Now().UnixNano()
        }
 
-       e2tInstance.KeepAliveTimestamp = time.Now().UnixNano()
-       err = m.rnibDataService.SaveE2TInstanceNoLogs(e2tInstance)
+       err = m.rnibDataService.SaveE2TInstance(e2tInstance)
+       if err != nil {
+               m.logger.Errorf("#E2TInstancesManager.SetE2tInstanceState - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tInstance.Address, err)
+               return err
+       }
+
+       m.logger.Infof("#E2TInstancesManager.SetE2tInstanceState - E2T Instance address: %s - State change: %s --> %s", e2tAddress, currentState, newState)
+
+       return nil
+}
+
+func (m *E2TInstancesManager) ClearRansOfAllE2TInstances() error {
+       m.logger.Infof("#E2TInstancesManager.ClearRansOfAllE2TInstances - Going to clear associated RANs from E2T instances")
+       m.mux.Lock()
+       defer m.mux.Unlock()
+
+       e2tInstances, err := m.GetE2TInstances()
 
        if err != nil {
-               m.logger.Errorf("#E2TInstancesManager.ResetKeepAliveTimestamp - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
                return err
        }
 
+       if len(e2tInstances) == 0 {
+               m.logger.Errorf("#E2TInstancesManager.ClearRansOfAllE2TInstances - No E2T instances to clear associated RANs from")
+               return nil
+       }
+
+       for _, v := range e2tInstances {
+               v.AssociatedRanList = []string{}
+               err := m.rnibDataService.SaveE2TInstance(v)
+
+               if err != nil {
+                       m.logger.Errorf("#E2TInstancesManager.ClearRansOfAllE2TInstances - e2t address: %s - failed saving e2t instance. error: %s", v.Address, err)
+               }
+       }
+
        return nil
 }