[RICPLT-1853] Add RanReconnectionManager & RanSetupManager | Refactor providers/manag...
[ric-plt/e2mgr.git] / E2Manager / managers / ran_reconnection_manager.go
1 package managers
2
3 import (
4         "e2mgr/configuration"
5         "e2mgr/logger"
6         "e2mgr/rNibWriter"
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"
9         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
10 )
11
12 type RanReconnectionManager struct {
13         logger             *logger.Logger
14         config             *configuration.Configuration
15         rnibReaderProvider func() reader.RNibReader
16         rnibWriterProvider func() rNibWriter.RNibWriter
17         ranSetupManager    *RanSetupManager
18 }
19
20 func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranSetupManager *RanSetupManager) *RanReconnectionManager {
21         return &RanReconnectionManager{
22                 logger:             logger,
23                 config:             config,
24                 rnibReaderProvider: rnibReaderProvider,
25                 rnibWriterProvider: rnibWriterProvider,
26                 ranSetupManager:    ranSetupManager,
27         }
28 }
29
30 func (m *RanReconnectionManager) ReconnectRan(inventoryName string) error {
31         nodebInfo, rnibErr := m.rnibReaderProvider().GetNodeb(inventoryName)
32
33         if rnibErr != nil {
34                 m.logger.Errorf("#ReconnectRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, rnibErr)
35                 return rnibErr
36         }
37
38         if !m.canReconnectRan(nodebInfo) {
39                 m.logger.Warnf("#ReconnectRan - RAN name: %s - Cannot reconnect RAN", inventoryName)
40                 return m.setConnectionStatusOfUnconnectableRan(nodebInfo)
41         }
42
43         err := m.ranSetupManager.ExecuteSetup(nodebInfo)
44
45         if err != nil {
46                 m.logger.Errorf("#ReconnectRan - RAN name: %s - Failed executing setup. Error: %v", inventoryName, err)
47                 return err
48         }
49
50         m.logger.Infof("#ReconnectRan - RAN name: %s - Successfully done executing setup", inventoryName)
51         return nil
52 }
53
54 func (m *RanReconnectionManager) canReconnectRan(nodebInfo *entities.NodebInfo) bool {
55         connectionStatus := nodebInfo.GetConnectionStatus()
56         return connectionStatus != entities.ConnectionStatus_SHUT_DOWN && connectionStatus != entities.ConnectionStatus_SHUTTING_DOWN &&
57                 int(nodebInfo.GetConnectionAttempts()) < m.config.MaxConnectionAttempts
58 }
59
60 func (m *RanReconnectionManager) updateNodebInfoStatus(nodebInfo *entities.NodebInfo, connectionStatus entities.ConnectionStatus) common.IRNibError {
61         nodebInfo.ConnectionStatus = connectionStatus;
62         err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo)
63
64         if err != nil {
65                 m.logger.Errorf("#updateNodebInfoStatus - RAN name: %s - Failed updating RAN's connection status to %s in rNib. Error: %v", nodebInfo.RanName, connectionStatus, err)
66                 return err
67         }
68
69         m.logger.Infof("#updateNodebInfoStatus - RAN name: %s - Successfully updated RAN's connection status to %s in rNib", nodebInfo.RanName, connectionStatus)
70         return nil
71 }
72
73 func (m *RanReconnectionManager) setConnectionStatusOfUnconnectableRan(nodebInfo *entities.NodebInfo) common.IRNibError {
74         connectionStatus := nodebInfo.GetConnectionStatus()
75         m.logger.Warnf("#setConnectionStatusOfUnconnectableRan - RAN name: %s, RAN's connection status: %s, RAN's connection attempts: %d", nodebInfo.RanName, nodebInfo.ConnectionStatus, nodebInfo.ConnectionAttempts)
76
77         if connectionStatus == entities.ConnectionStatus_SHUTTING_DOWN {
78                 return m.updateNodebInfoStatus(nodebInfo, entities.ConnectionStatus_SHUT_DOWN)
79         }
80
81         if int(nodebInfo.GetConnectionAttempts()) >= m.config.MaxConnectionAttempts {
82                 m.logger.Warnf("#setConnectionStatusOfUnconnectableRan - RAN name: %s - RAN's connection attempts are greater than %d", nodebInfo.RanName, m.config.MaxConnectionAttempts)
83                 return m.updateNodebInfoStatus(nodebInfo, entities.ConnectionStatus_DISCONNECTED)
84         }
85
86         return nil
87 }