2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 // platform project (RICP).
25 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
31 "rsm/services/rmrsender"
34 type ResourceStatusService struct {
36 rmrSender *rmrsender.RmrSender
39 type IResourceStatusService interface {
40 BuildAndSendInitiateRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64) error
41 BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error
44 func NewResourceStatusService(logger *logger.Logger, rmrSender *rmrsender.RmrSender) *ResourceStatusService {
45 return &ResourceStatusService{
51 func (m *ResourceStatusService) BuildAndSendInitiateRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64) error {
53 return m.buildAndSendResourceStatusRequest(enums.Registration_Request_start, nodeb, config, enb1MeasurementId, 0)
56 func (m *ResourceStatusService) BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
58 return m.buildAndSendResourceStatusRequest(enums.Registration_Request_stop, nodeb, config, enb1MeasurementId, enb2MeasurementId)
61 func (m *ResourceStatusService) buildAndSendResourceStatusRequest(registrationRequest enums.Registration_Request, nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
63 cellIdList, err := m.extractCellIdList(nodeb)
69 requestParams := buildResourceStatusRequestParams(config, cellIdList, enb1MeasurementId, enb2MeasurementId)
71 payload, payloadAsString, err := e2pdus.BuildPackedResourceStatusRequest(registrationRequest, requestParams, e2pdus.MaxAsn1PackedBufferSize, e2pdus.MaxAsn1CodecMessageBufferSize, m.logger.DebugEnabled())
74 m.logger.Errorf("#ResourceStatusService.buildAndSendResourceStatusRequest - RAN name: %s. Failed to build and pack resource status %s request. error: %s", nodeb.RanName, registrationRequest, err)
78 m.logger.Debugf("#ResourceStatusService.buildAndSendResourceStatusRequest - RAN name: %s. Successfully build packed payload: %s", nodeb.RanName, payloadAsString)
79 rmrMsg := models.NewRmrMessage(rmrcgo.RicResStatusReq, nodeb.RanName, payload)
81 return m.rmrSender.Send(rmrMsg)
84 func (m *ResourceStatusService) extractCellIdList(nodeb *entities.NodebInfo) ([]string, error) {
86 enb, ok := nodeb.Configuration.(*entities.NodebInfo_Enb)
89 m.logger.Errorf("#ResourceStatusService.extractCellIdList - RAN name: %s - invalid configuration", nodeb.RanName)
90 return []string{}, fmt.Errorf("invalid configuration for RAN %s", nodeb.RanName)
93 cells := enb.Enb.ServedCells
96 m.logger.Errorf("#ResourceStatusService.extractCellIdList - RAN name: %s - empty cell list", nodeb.RanName)
97 return []string{}, fmt.Errorf("empty cell list for RAN %s", nodeb.RanName)
100 cellIdList := make([]string, len(cells))
101 for index, cellInfo := range cells {
102 cellIdList[index] = cellInfo.CellId
105 return cellIdList, nil
108 func buildResourceStatusRequestParams(config *models.RsmGeneralConfiguration, cellIdList []string, enb1MeasurementId int64, enb2MeasurementId int64) *e2pdus.ResourceStatusRequestData {
109 return &e2pdus.ResourceStatusRequestData{
110 CellIdList: cellIdList,
111 MeasurementID: e2pdus.Measurement_ID(enb1MeasurementId),
112 MeasurementID2: e2pdus.Measurement_ID(enb2MeasurementId),
113 PartialSuccessAllowed: config.PartialSuccessAllowed,
114 PrbPeriodic: config.PrbPeriodic,
115 TnlLoadIndPeriodic: config.TnlLoadIndPeriodic,
116 HwLoadIndPeriodic: config.HwLoadIndPeriodic,
117 AbsStatusPeriodic: config.AbsStatusPeriodic,
118 RsrpMeasurementPeriodic: config.RsrpMeasurementPeriodic,
119 CsiPeriodic: config.CsiPeriodic,
120 PeriodicityMS: config.PeriodicityMs,
121 PeriodicityRsrpMeasurementMS: config.PeriodicityRsrpMeasurementMs,
122 PeriodicityCsiMS: config.PeriodicityCsiMs,