Add header missing license header
[ric-plt/resource-status-manager.git] / RSM / services / resource_status_service.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
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
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17
18 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 //  platform project (RICP).
20
21 package services
22
23 import (
24         "fmt"
25         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
26         "rsm/e2pdus"
27         "rsm/enums"
28         "rsm/logger"
29         "rsm/models"
30         "rsm/rmrcgo"
31         "rsm/services/rmrsender"
32 )
33
34 type ResourceStatusService struct {
35         logger    *logger.Logger
36         rmrSender *rmrsender.RmrSender
37 }
38
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
42 }
43
44 func NewResourceStatusService(logger *logger.Logger, rmrSender *rmrsender.RmrSender) *ResourceStatusService {
45         return &ResourceStatusService{
46                 logger:    logger,
47                 rmrSender: rmrSender,
48         }
49 }
50
51 func (m *ResourceStatusService) BuildAndSendInitiateRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64) error {
52
53         return m.buildAndSendResourceStatusRequest(enums.Registration_Request_start, nodeb, config, enb1MeasurementId, 0)
54 }
55
56 func (m *ResourceStatusService) BuildAndSendStopRequest(nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
57
58         return m.buildAndSendResourceStatusRequest(enums.Registration_Request_stop, nodeb, config, enb1MeasurementId, enb2MeasurementId)
59 }
60
61 func (m *ResourceStatusService) buildAndSendResourceStatusRequest(registrationRequest enums.Registration_Request, nodeb *entities.NodebInfo, config *models.RsmGeneralConfiguration, enb1MeasurementId int64, enb2MeasurementId int64) error {
62
63         cellIdList, err := m.extractCellIdList(nodeb)
64
65         if err != nil {
66                 return err
67         }
68
69         requestParams := buildResourceStatusRequestParams(config, cellIdList, enb1MeasurementId, enb2MeasurementId)
70
71         payload, payloadAsString, err := e2pdus.BuildPackedResourceStatusRequest(registrationRequest, requestParams, e2pdus.MaxAsn1PackedBufferSize, e2pdus.MaxAsn1CodecMessageBufferSize, m.logger.DebugEnabled())
72
73         if err != nil {
74                 m.logger.Errorf("#ResourceStatusService.buildAndSendResourceStatusRequest - RAN name: %s. Failed to build and pack resource status %s request. error: %s", nodeb.RanName, registrationRequest, err)
75                 return err
76         }
77
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)
80
81         return m.rmrSender.Send(rmrMsg)
82 }
83
84 func (m *ResourceStatusService) extractCellIdList(nodeb *entities.NodebInfo) ([]string, error) {
85
86         enb, ok := nodeb.Configuration.(*entities.NodebInfo_Enb)
87
88         if !ok {
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)
91         }
92
93         cells := enb.Enb.ServedCells
94
95         if len(cells) == 0 {
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)
98         }
99
100         cellIdList := make([]string, len(cells))
101         for index, cellInfo := range cells {
102                 cellIdList[index] = cellInfo.CellId
103         }
104
105         return cellIdList, nil
106 }
107
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,
123         }
124 }