// // Copyright 2019 AT&T Intellectual Property // Copyright 2019 Nokia // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package httpmsghandlers import ( "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "rsm/enums" "rsm/logger" "rsm/models" "rsm/rsmerrors" "rsm/services" ) type ResourceStatusRequestHandler struct { rNibDataService services.RNibDataService logger *logger.Logger resourceStatusService services.IResourceStatusService } func NewResourceStatusRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService, resourceStatusService services.IResourceStatusService) *ResourceStatusRequestHandler { return &ResourceStatusRequestHandler{ resourceStatusService: resourceStatusService, rNibDataService: rNibDataService, logger: logger, } } func (h ResourceStatusRequestHandler) Handle(request models.Request) error { resourceStatusRequest := request.(models.ResourceStatusRequest) config, err := h.rNibDataService.GetRsmGeneralConfiguration() if err != nil { return rsmerrors.NewRnibDbError() } config.EnableResourceStatus = resourceStatusRequest.EnableResourceStatus err = h.rNibDataService.SaveRsmGeneralConfiguration(config) if err != nil { return rsmerrors.NewRnibDbError() } nbIdentityList, err := h.rNibDataService.GetListEnbIds() if err != nil { return rsmerrors.NewRnibDbError() } numberOfFails := 0 for _, nbIdentity := range nbIdentityList { ranName := (*nbIdentity).GetInventoryName() nodeb, err := h.rNibDataService.GetNodeb(ranName) if err != nil { h.logger.Errorf("#ResourceStatusRequestHandler.Handle - Couldn't find RAN %s in RSM DB", ranName) numberOfFails++ continue } h.logger.Infof("#ResourceStatusRequestHandler.Handle - handle RAN: %s started", nodeb.RanName) if nodeb.ConnectionStatus != entities.ConnectionStatus_CONNECTED { h.logger.Infof("#ResourceStatusRequestHandler.Handle - RAN name: %s - connection status not CONNECTED, ignore", nodeb.RanName) h.logger.Infof("#ResourceStatusRequestHandler.Handle - handle RAN: %s completed", nodeb.RanName) continue } err = h.saveAndSendRsmRanInfo(nodeb, config) if err != nil { numberOfFails++ } h.logger.Infof("#ResourceStatusRequestHandler.Handle - handle RAN: %s completed", nodeb.RanName) } if numberOfFails > 0 { return rsmerrors.NewRsmError(numberOfFails) } return nil } func (h ResourceStatusRequestHandler) saveAndSendRsmRanInfo(nodebInfo *entities.NodebInfo, config *models.RsmGeneralConfiguration) error { rsmRanInfo, err := h.rNibDataService.GetRsmRanInfo(nodebInfo.RanName) if err != nil { return err } if config.EnableResourceStatus { return h.handleNotStartedRsmRanInfo(nodebInfo, rsmRanInfo, config) } return h.handleNotStoppedRsmRanInfo(nodebInfo, rsmRanInfo, config) } func (h ResourceStatusRequestHandler) handleNotStoppedRsmRanInfo(nodebInfo *entities.NodebInfo, rsmRanInfo *models.RsmRanInfo, config *models.RsmGeneralConfiguration) error { if rsmRanInfo.Action == enums.Stop && rsmRanInfo.ActionStatus { return nil } if rsmRanInfo.Enb2MeasurementId == 0 { h.logger.Errorf("#ResourceStatusRequestHandler.handleNotStoppedRsmRanInfo - RAN: %s Enb2MeasurementId is zero", nodebInfo.RanName) return rsmerrors.NewInternalError() } if rsmRanInfo.Action != enums.Stop { err := h.saveRsmRanInfoStopFalse(rsmRanInfo) if err != nil { return err } } return h.resourceStatusService.BuildAndSendStopRequest(nodebInfo, config, rsmRanInfo.Enb1MeasurementId, rsmRanInfo.Enb2MeasurementId) } func (h ResourceStatusRequestHandler) handleNotStartedRsmRanInfo(nodebInfo *entities.NodebInfo, rsmRanInfo *models.RsmRanInfo, config *models.RsmGeneralConfiguration) error { if rsmRanInfo.Action == enums.Start && rsmRanInfo.ActionStatus { return nil } if rsmRanInfo.Action != enums.Start { err := h.saveRsmRanInfoStartFalse(rsmRanInfo) if err != nil { return err } } return h.resourceStatusService.BuildAndSendInitiateRequest(nodebInfo, config, rsmRanInfo.Enb1MeasurementId) } func (h ResourceStatusRequestHandler) saveRsmRanInfoStopFalse(rsmRanInfo *models.RsmRanInfo) error { rsmRanInfo.Action = enums.Stop rsmRanInfo.ActionStatus = false return h.rNibDataService.SaveRsmRanInfo(rsmRanInfo) } func (h ResourceStatusRequestHandler) saveRsmRanInfoStartFalse(rsmRanInfo *models.RsmRanInfo) error { rsmRanInfo.Action = enums.Start rsmRanInfo.ActionStatus = false rsmRanInfo.Enb2MeasurementId = 0 rsmRanInfo.Enb1MeasurementId = enums.Enb1MeasurementId return h.rNibDataService.SaveRsmRanInfo(rsmRanInfo) }