Copy latest code to master
[ric-plt/resource-status-manager.git] / RSM / services / resource_status_service.go
diff --git a/RSM/services/resource_status_service.go b/RSM/services/resource_status_service.go
new file mode 100644 (file)
index 0000000..6f0df7e
--- /dev/null
@@ -0,0 +1,121 @@
+//
+// 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 services
+
+import (
+       "fmt"
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+       "rsm/e2pdus"
+       "rsm/enums"
+       "rsm/logger"
+       "rsm/models"
+       "rsm/rmrcgo"
+       "rsm/services/rmrsender"
+)
+
+type ResourceStatusService struct {
+       logger    *logger.Logger
+       rmrSender *rmrsender.RmrSender
+}
+
+type IResourceStatusService interface {
+       BuildAndSendInitiateRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64) error
+       BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error
+}
+
+func NewResourceStatusService(logger *logger.Logger, rmrSender *rmrsender.RmrSender) *ResourceStatusService {
+       return &ResourceStatusService{
+               logger:    logger,
+               rmrSender: rmrSender,
+       }
+}
+
+func (m *ResourceStatusService) BuildAndSendInitiateRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64) error {
+
+       return m.buildAndSendResourceStatusRequest(enums.Registration_Request_start, nodeb, config, enb1MeasurementId, 0)
+}
+
+func (m *ResourceStatusService) BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
+
+       return m.buildAndSendResourceStatusRequest(enums.Registration_Request_stop, nodeb, config, enb1MeasurementId, enb2MeasurementId)
+}
+
+func (m *ResourceStatusService) buildAndSendResourceStatusRequest(registrationRequest enums.Registration_Request, nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
+
+       cellIdList, err := m.extractCellIdList(nodeb)
+
+       if err != nil {
+               return err
+       }
+
+       requestParams := buildResourceStatusRequestParams(config, cellIdList, enb1MeasurementId, enb2MeasurementId)
+
+       payload, payloadAsString, err := e2pdus.BuildPackedResourceStatusRequest(registrationRequest, requestParams, e2pdus.MaxAsn1PackedBufferSize, e2pdus.MaxAsn1CodecMessageBufferSize, m.logger.DebugEnabled())
+
+       if err != nil {
+               m.logger.Errorf("#ResourceStatusService.buildAndSendResourceStatusRequest - RAN name: %s. Failed to build and pack resource status %s request. error: %s", nodeb.RanName, registrationRequest, err)
+               return err
+       }
+
+       m.logger.Debugf("#ResourceStatusService.buildAndSendResourceStatusRequest - RAN name: %s. Successfully build packed payload: %s", nodeb.RanName, payloadAsString)
+       rmrMsg := models.NewRmrMessage(rmrcgo.RicResStatusReq, nodeb.RanName, payload)
+
+       return m.rmrSender.Send(rmrMsg)
+}
+
+func (m *ResourceStatusService) extractCellIdList(nodeb *entities.NodebInfo) ([]string, error) {
+
+       enb, ok := nodeb.Configuration.(*entities.NodebInfo_Enb)
+
+       if !ok {
+               m.logger.Errorf("#ResourceStatusService.extractCellIdList - RAN name: %s - invalid configuration", nodeb.RanName)
+               return []string{}, fmt.Errorf("invalid configuration for RAN %s", nodeb.RanName)
+       }
+
+       cells := enb.Enb.ServedCells
+
+       if len(cells) == 0 {
+               m.logger.Errorf("#ResourceStatusService.extractCellIdList - RAN name: %s - empty cell list", nodeb.RanName)
+               return []string{}, fmt.Errorf("empty cell list for RAN %s", nodeb.RanName)
+       }
+
+       cellIdList := make([]string, len(cells))
+       for index, cellInfo := range cells {
+               cellIdList[index] = cellInfo.CellId
+       }
+
+       return cellIdList, nil
+}
+
+func buildResourceStatusRequestParams(config *models.RsmGeneralConfiguration, cellIdList []string, enb1MeasurementId int64, enb2MeasurementId int64) *e2pdus.ResourceStatusRequestData {
+       return &e2pdus.ResourceStatusRequestData{
+               CellIdList:                   cellIdList,
+               MeasurementID:                e2pdus.Measurement_ID(enb1MeasurementId),
+               MeasurementID2:               e2pdus.Measurement_ID(enb2MeasurementId),
+               PartialSuccessAllowed:        config.PartialSuccessAllowed,
+               PrbPeriodic:                  config.PrbPeriodic,
+               TnlLoadIndPeriodic:           config.TnlLoadIndPeriodic,
+               HwLoadIndPeriodic:            config.HwLoadIndPeriodic,
+               AbsStatusPeriodic:            config.AbsStatusPeriodic,
+               RsrpMeasurementPeriodic:      config.RsrpMeasurementPeriodic,
+               CsiPeriodic:                  config.CsiPeriodic,
+               PeriodicityMS:                config.PeriodicityMs,
+               PeriodicityRsrpMeasurementMS: config.PeriodicityRsrpMeasurementMs,
+               PeriodicityCsiMS:             config.PeriodicityCsiMs,
+       }
+}