import (
"encoding/json"
+ "fmt"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
- "rsm/configuration"
- "rsm/e2pdus"
+ "rsm/enums"
"rsm/logger"
- "rsm/managers"
"rsm/models"
+ "rsm/services"
)
type ResourceStatusInitiateNotificationHandler struct {
- logger *logger.Logger
- config *configuration.Configuration
- resourceStatusInitiateManager managers.IResourceStatusInitiateManager
- requestName string
+ logger *logger.Logger
+ rnibDataService services.RNibDataService
+ resourceStatusService services.IResourceStatusService
+ requestName string
}
-func NewResourceStatusInitiateNotificationHandler(logger *logger.Logger, config *configuration.Configuration, resourceStatusInitiateManager managers.IResourceStatusInitiateManager, requestName string) ResourceStatusInitiateNotificationHandler {
+func NewResourceStatusInitiateNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, resourceStatusService services.IResourceStatusService, requestName string) ResourceStatusInitiateNotificationHandler {
return ResourceStatusInitiateNotificationHandler{
- logger: logger,
- config: config,
- resourceStatusInitiateManager: resourceStatusInitiateManager,
- requestName: requestName,
+ logger: logger,
+ rnibDataService: rnibDataService,
+ resourceStatusService: resourceStatusService,
+ requestName: requestName,
}
}
+func (h ResourceStatusInitiateNotificationHandler) UnmarshalResourceStatusPayload(inventoryName string, payload []byte) (*models.ResourceStatusPayload, error) {
+ unmarshalledPayload := models.ResourceStatusPayload{}
+ err := json.Unmarshal(payload, &unmarshalledPayload)
+
+ if err != nil {
+ h.logger.Errorf("#ResourceStatusInitiateNotificationHandler.UnmarshalResourceStatusPayload - RAN name: %s - Error unmarshaling RMR request payload: %v", inventoryName, err)
+ return nil, err
+ }
+
+ if unmarshalledPayload.NodeType == entities.Node_UNKNOWN {
+ h.logger.Errorf("#ResourceStatusInitiateNotificationHandler.UnmarshalResourceStatusPayload - RAN name: %s - Unknown Node Type", inventoryName)
+ return nil, fmt.Errorf("unknown node type for RAN %s", inventoryName)
+ }
+
+ h.logger.Infof("#ResourceStatusInitiateNotificationHandler.UnmarshalResourceStatusPayload - Unmarshaled payload successfully: %+v", unmarshalledPayload)
+ return &unmarshalledPayload, nil
+
+}
+
+func (h ResourceStatusInitiateNotificationHandler) SaveRsmRanInfoStopTrue(inventoryName string) {
+ rsmRanInfo := models.NewRsmRanInfo(inventoryName, 0, 0, enums.Stop, true)
+ _ = h.rnibDataService.SaveRsmRanInfo(rsmRanInfo)
+}
+
func (h ResourceStatusInitiateNotificationHandler) Handle(request *models.RmrRequest) {
inventoryName := request.RanName
- h.logger.Infof("#ResourceStatusInitiateNotificationHandler - RAN name: %s - Received %s notification", inventoryName, h.requestName)
+ h.logger.Infof("#ResourceStatusInitiateNotificationHandler.Handle - RAN name: %s - Received %s notification", inventoryName, h.requestName)
+
+ payload, err := h.UnmarshalResourceStatusPayload(inventoryName, request.Payload)
- if !isResourceStatusEnabled(h.config) {
- h.logger.Warnf("#ResourceStatusInitiateNotificationHandler - RAN name: %s - resource status is disabled", inventoryName)
+ if err != nil {
return
}
- payload := models.ResourceStatusPayload{}
- err := json.Unmarshal(request.Payload, &payload)
+ if payload.NodeType != entities.Node_ENB {
+ h.logger.Debugf("#ResourceStatusInitiateNotificationHandler.Handle - RAN name: %s, Node type isn't ENB", inventoryName)
+ return
+ }
+
+ config, err := h.rnibDataService.GetRsmGeneralConfiguration()
if err != nil {
- h.logger.Errorf("#ResourceStatusInitiateNotificationHandler - RAN name: %s - Error unmarshaling RMR request payload: %v", inventoryName, err)
return
}
- h.logger.Infof("#ResourceStatusInitiateNotificationHandler - Unmarshaled payload successfully: %+v", payload)
+ if !config.EnableResourceStatus {
+ h.SaveRsmRanInfoStopTrue(inventoryName)
+ return
+ }
- if payload.NodeType != entities.Node_ENB {
- h.logger.Debugf("#ResourceStatusInitiateNotificationHandler - RAN name: %s, Node type isn't ENB", inventoryName)
+ nodeb, err := h.rnibDataService.GetNodeb(inventoryName)
+
+ if err != nil {
return
}
- resourceStatusInitiateRequestParams := &e2pdus.ResourceStatusRequestData{}
- populateResourceStatusInitiateRequestParams(resourceStatusInitiateRequestParams, h.config)
+ nodebConnectionStatus := nodeb.GetConnectionStatus()
- _ = h.resourceStatusInitiateManager.Execute(inventoryName, resourceStatusInitiateRequestParams)
-}
+ h.logger.Infof("#ResourceStatusInitiateNotificationHandler.Handle - RAN name: %s - successfully fetched RAN from db. RAN's connection status: %s", inventoryName, nodebConnectionStatus)
-func isResourceStatusEnabled(configuration *configuration.Configuration) bool {
- return configuration.ResourceStatusParams.EnableResourceStatus
-}
+ if nodebConnectionStatus != entities.ConnectionStatus_CONNECTED {
+ h.logger.Errorf("#ResourceStatusInitiateNotificationHandler.Handle - RAN name: %s - RAN's connection status isn't CONNECTED", inventoryName)
+ h.SaveRsmRanInfoStopTrue(inventoryName)
+ return
+ }
+
+ rsmRanInfo := models.NewRsmRanInfo(inventoryName, enums.Enb1MeasurementId, 0, enums.Start, false)
+ err = h.rnibDataService.SaveRsmRanInfo(rsmRanInfo)
-func populateResourceStatusInitiateRequestParams(params *e2pdus.ResourceStatusRequestData, config *configuration.Configuration) {
- params.PartialSuccessAllowed = config.ResourceStatusParams.PartialSuccessAllowed
- params.PrbPeriodic = config.ResourceStatusParams.PrbPeriodic
- params.TnlLoadIndPeriodic = config.ResourceStatusParams.TnlLoadIndPeriodic
- params.HwLoadIndPeriodic = config.ResourceStatusParams.HwLoadIndPeriodic
- params.AbsStatusPeriodic = config.ResourceStatusParams.AbsStatusPeriodic
- params.RsrpMeasurementPeriodic = config.ResourceStatusParams.RsrpMeasurementPeriodic
- params.CsiPeriodic = config.ResourceStatusParams.CsiPeriodic
- params.PeriodicityMS = config.ResourceStatusParams.PeriodicityMs
- params.PeriodicityRsrpMeasurementMS = config.ResourceStatusParams.PeriodicityRsrpMeasurementMs
- params.PeriodicityCsiMS = config.ResourceStatusParams.PeriodicityCsiMs
+ if err != nil {
+ return
+ }
+
+ err = h.resourceStatusService.BuildAndSendInitiateRequest(nodeb, config, rsmRanInfo.Enb1MeasurementId)
+
+ if err != nil {
+ h.SaveRsmRanInfoStopTrue(inventoryName)
+ return
+ }
}