ecb645ccc5b5d7b9bc03e14515b225a1e8c96fb3
[ric-plt/e2mgr.git] / E2Manager / managers / ran_connect_status_change_manager.go
1 //
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
20 package managers
21
22 import (
23         "e2mgr/logger"
24         "e2mgr/services"
25         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
26 )
27
28 const (
29         CONNECTED_RAW_EVENT    = "CONNECTED"
30         DISCONNECTED_RAW_EVENT = "DISCONNECTED"
31         NONE_RAW_EVENT         = "NONE"
32 )
33
34 type IRanConnectStatusChangeManager interface {
35         ChangeStatus(nodebInfo *entities.NodebInfo, nextStatus entities.ConnectionStatus) error
36 }
37
38 type RanConnectStatusChangeManager struct {
39         logger          *logger.Logger
40         rnibDataService services.RNibDataService
41         ranListManager  RanListManager
42         ranAlarmService services.RanAlarmService
43 }
44
45 func NewRanConnectStatusChangeManager(logger *logger.Logger, rnibDataService services.RNibDataService, ranListManager RanListManager, ranAlarmService services.RanAlarmService) *RanConnectStatusChangeManager {
46         return &RanConnectStatusChangeManager{
47                 logger:          logger,
48                 rnibDataService: rnibDataService,
49                 ranListManager:  ranListManager,
50                 ranAlarmService: ranAlarmService,
51         }
52 }
53
54 func (m *RanConnectStatusChangeManager) ChangeStatus(nodebInfo *entities.NodebInfo, nextStatus entities.ConnectionStatus) error {
55         m.logger.Infof("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s, currentStatus: %s, nextStatus: %s", nodebInfo.RanName, nodebInfo.GetConnectionStatus(), nextStatus)
56
57         // set the proper event
58         event := m.setEvent(nodebInfo, nextStatus)
59         isConnectivityEvent := event != NONE_RAW_EVENT
60
61         // only after determining event we set next status
62         nodebInfo.ConnectionStatus = nextStatus;
63         if !isConnectivityEvent {
64                 err := m.updateNodebInfo(nodebInfo)
65                 if err != nil {
66                         return err
67                 }
68         } else {
69                 err := m.updateNodebInfoOnConnectionStatusInversion(nodebInfo, event)
70                 if err != nil {
71                         return err
72                 }
73         }
74
75         // in any case, update RanListManager
76         m.logger.Infof("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s, updating RanListManager... status: %s", nodebInfo.RanName, nodebInfo.GetConnectionStatus())
77         err := m.ranListManager.UpdateRanState(nodebInfo)
78         if err != nil {
79                 m.logger.Errorf("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s - Failed updating RAN's connection status by RanListManager. Error: %v", nodebInfo.RanName, err)
80                 // log and proceed...
81         }
82
83         if isConnectivityEvent {
84                 m.logger.Infof("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s, setting alarm at RanAlarmService... event: %s", nodebInfo.RanName, event)
85                 err := m.ranAlarmService.SetConnectivityChangeAlarm(nodebInfo)
86                 if err != nil {
87                         m.logger.Errorf("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s - Failed setting an alarm by RanAlarmService. Error: %v", nodebInfo.RanName, err)
88                         // log and proceed...
89                 }
90         }
91
92         return nil
93 }
94
95 func (m *RanConnectStatusChangeManager) updateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error {
96
97         err := m.rnibDataService.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, event)
98
99         if err != nil {
100                 m.logger.Errorf("#RanConnectStatusChangeManager.updateNodebInfoOnConnectionStatusInversion - RAN name: %s - Failed updating RAN's connection status in rNib. Error: %v", nodebInfo.RanName, err)
101                 return err
102         }
103
104         m.logger.Infof("#RanConnectStatusChangeManager.updateNodebInfoOnConnectionStatusInversion - RAN name: %s - Successfully updated rNib.", nodebInfo.RanName)
105         return nil
106 }
107
108 func (m *RanConnectStatusChangeManager) updateNodebInfo(nodebInfo *entities.NodebInfo) error {
109
110         err := m.rnibDataService.UpdateNodebInfo(nodebInfo)
111
112         if err != nil {
113                 m.logger.Errorf("#RanConnectStatusChangeManager.updateNodebInfo - RAN name: %s - Failed updating RAN's connection status in rNib. Error: %v", nodebInfo.RanName, err)
114                 return err
115         }
116
117         m.logger.Infof("#RanConnectStatusChangeManager.updateNodebInfo - RAN name: %s - Successfully updated rNib.", nodebInfo.RanName)
118         return nil
119 }
120
121 func (m *RanConnectStatusChangeManager) setEvent(nodebInfo *entities.NodebInfo, nextState entities.ConnectionStatus) string {
122         currentConnectionStatus := nodebInfo.GetConnectionStatus()
123
124         var event string
125         if currentConnectionStatus != entities.ConnectionStatus_CONNECTED && nextState == entities.ConnectionStatus_CONNECTED {
126                 event = nodebInfo.RanName + "_" + CONNECTED_RAW_EVENT
127         } else if currentConnectionStatus == entities.ConnectionStatus_CONNECTED && nextState != entities.ConnectionStatus_CONNECTED {
128                 event = nodebInfo.RanName + "_" + DISCONNECTED_RAW_EVENT
129         } else {
130                 event = NONE_RAW_EVENT
131         }
132
133         m.logger.Infof("#RanConnectStatusChangeManager.setEvent - Connectivity Event for RAN %s is: %s", nodebInfo.RanName, event)
134         return event
135 }