b96574d5b13b149f0e35d5c148f82912ab7e592d
[ric-plt/resource-status-manager.git] / RSM / managers / resource_status_initiate_manager.go
1 package managers
2
3 import (
4         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
5         "rsm/e2pdus"
6         "rsm/enums"
7         "rsm/logger"
8         "rsm/models"
9         "rsm/rmrcgo"
10         "rsm/rsmerrors"
11         "rsm/services"
12         "rsm/services/rmrsender"
13 )
14
15 type ResourceStatusInitiateManager struct {
16         logger          *logger.Logger
17         rnibDataService services.RNibDataService
18         rmrSender       *rmrsender.RmrSender
19 }
20
21 type IResourceStatusInitiateManager interface {
22         Execute(inventoryName string, resourceStatusInitiateRequestParams *e2pdus.ResourceStatusRequestData) error
23 }
24
25 func NewResourceStatusInitiateManager(logger *logger.Logger, rnibDataService services.RNibDataService, rmrSender *rmrsender.RmrSender) *ResourceStatusInitiateManager {
26         return &ResourceStatusInitiateManager{
27                 logger:          logger,
28                 rnibDataService: rnibDataService,
29                 rmrSender:       rmrSender,
30         }
31 }
32
33 func (m *ResourceStatusInitiateManager) Execute(inventoryName string, resourceStatusInitiateRequestParams *e2pdus.ResourceStatusRequestData) error {
34
35         nodebInfo, err := m.rnibDataService.GetNodeb(inventoryName)
36
37         if err != nil {
38                 m.logger.Errorf("#ResourceStatusInitiateManager.Execute - RAN name: %s - Error fetching RAN from rNib: %v", inventoryName, err)
39                 return rsmerrors.NewRnibDbError()
40         }
41
42         m.logger.Infof("#ResourceStatusInitiateManager.Execute - RAN name: %s, connection status: %s", nodebInfo.GetRanName(), nodebInfo.GetConnectionStatus())
43
44         if nodebInfo.GetConnectionStatus() != entities.ConnectionStatus_CONNECTED {
45                 m.logger.Errorf("#ResourceStatusInitiateManager.Execute - RAN name: %s - RAN's connection status isn't CONNECTED", inventoryName)
46                 return rsmerrors.NewWrongStateError("Resource Status Initiate", entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)])
47         }
48
49         m.sendResourceStatusInitiatePerCell(nodebInfo, *resourceStatusInitiateRequestParams)
50
51         return nil
52 }
53
54 func (m *ResourceStatusInitiateManager) sendResourceStatusInitiatePerCell(nodebInfo *entities.NodebInfo, requestParams e2pdus.ResourceStatusRequestData) {
55         enb, _ := nodebInfo.Configuration.(*entities.NodebInfo_Enb)
56         cells := enb.Enb.ServedCells
57
58         for index, cellInfo := range cells {
59                 requestParams.CellID = cellInfo.CellId
60                 requestParams.MeasurementID = e2pdus.Measurement_ID(index + 1)
61
62                 m.logger.Infof("#ResourceStatusInitiateManager.sendResourceStatusInitiatePerCell - RAN name: %s, Going to send request for cell id %s, measurement id %d", nodebInfo.RanName, requestParams.CellID, requestParams.MeasurementID)
63
64                 payload, payloadAsString, err := e2pdus.BuildPackedResourceStatusRequest(enums.Registration_Request_start, &requestParams, e2pdus.MaxAsn1PackedBufferSize, e2pdus.MaxAsn1CodecMessageBufferSize, m.logger.DebugEnabled())
65                 if err != nil {
66                         m.logger.Errorf("#ResourceStatusInitiateManager.sendResourceStatusInitiatePerCell - RAN name: %s. Failed to build and pack the resource status initiate request for cell id %s, measurement id %d. error: %s", nodebInfo.RanName, requestParams.CellID, requestParams.MeasurementID, err)
67                         continue
68                 }
69
70                 m.logger.Debugf("#ResourceStatusInitiateManager.sendResourceStatusInitiatePerCell - RAN name: %s, cell id: %s, measurement id: %d, payload: %s", nodebInfo.RanName, requestParams.CellID, requestParams.MeasurementID, payloadAsString)
71
72                 rmrMsg := models.NewRmrMessage(rmrcgo.RicResStatusReq, nodebInfo.RanName, payload)
73                 go m.rmrSender.Send(rmrMsg)
74         }
75 }