Copy latest code to master
[ric-plt/resource-status-manager.git] / RSM / handlers / httpmsghandlers / resource_status_request_handler.go
diff --git a/RSM/handlers/httpmsghandlers/resource_status_request_handler.go b/RSM/handlers/httpmsghandlers/resource_status_request_handler.go
new file mode 100644 (file)
index 0000000..4d0575f
--- /dev/null
@@ -0,0 +1,159 @@
+//
+// 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)
+}