Add header missing license header
[ric-plt/resource-status-manager.git] / RSM / handlers / httpmsghandlers / resource_status_request_handler.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 httpmsghandlers
22
23 import (
24         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
25         "rsm/enums"
26         "rsm/logger"
27         "rsm/models"
28         "rsm/rsmerrors"
29         "rsm/services"
30 )
31
32 type ResourceStatusRequestHandler struct {
33         rNibDataService       services.RNibDataService
34         logger                *logger.Logger
35         resourceStatusService services.IResourceStatusService
36 }
37
38 func NewResourceStatusRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService, resourceStatusService services.IResourceStatusService) *ResourceStatusRequestHandler {
39         return &ResourceStatusRequestHandler{
40                 resourceStatusService: resourceStatusService,
41                 rNibDataService:       rNibDataService,
42                 logger:                logger,
43         }
44 }
45
46 func (h ResourceStatusRequestHandler) Handle(request models.Request) error {
47
48         resourceStatusRequest := request.(models.ResourceStatusRequest)
49         config, err := h.rNibDataService.GetRsmGeneralConfiguration()
50         if err != nil {
51                 return rsmerrors.NewRnibDbError()
52         }
53
54         config.EnableResourceStatus = resourceStatusRequest.EnableResourceStatus
55         err = h.rNibDataService.SaveRsmGeneralConfiguration(config)
56         if err != nil {
57                 return rsmerrors.NewRnibDbError()
58         }
59
60         nbIdentityList, err := h.rNibDataService.GetListEnbIds()
61         if err != nil {
62                 return rsmerrors.NewRnibDbError()
63         }
64
65         numberOfFails := 0
66         for _, nbIdentity := range nbIdentityList {
67
68                 ranName := (*nbIdentity).GetInventoryName()
69
70                 nodeb, err := h.rNibDataService.GetNodeb(ranName)
71                 if err != nil {
72                         h.logger.Errorf("#ResourceStatusRequestHandler.Handle - Couldn't find RAN %s in RSM DB", ranName)
73                         numberOfFails++
74                         continue
75                 }
76
77                 h.logger.Infof("#ResourceStatusRequestHandler.Handle - handle RAN: %s started", nodeb.RanName)
78
79                 if nodeb.ConnectionStatus != entities.ConnectionStatus_CONNECTED {
80                         h.logger.Infof("#ResourceStatusRequestHandler.Handle - RAN name: %s - connection status not CONNECTED, ignore", nodeb.RanName)
81                         h.logger.Infof("#ResourceStatusRequestHandler.Handle - handle RAN: %s completed", nodeb.RanName)
82                         continue
83                 }
84
85                 err = h.saveAndSendRsmRanInfo(nodeb, config)
86                 if err != nil {
87                         numberOfFails++
88                 }
89                 h.logger.Infof("#ResourceStatusRequestHandler.Handle - handle RAN: %s completed", nodeb.RanName)
90         }
91
92         if numberOfFails > 0 {
93                 return rsmerrors.NewRsmError(numberOfFails)
94         }
95         return nil
96 }
97
98 func (h ResourceStatusRequestHandler) saveAndSendRsmRanInfo(nodebInfo *entities.NodebInfo, config *models.RsmGeneralConfiguration) error {
99
100         rsmRanInfo, err := h.rNibDataService.GetRsmRanInfo(nodebInfo.RanName)
101         if err != nil {
102                 return err
103         }
104
105         if config.EnableResourceStatus {
106                 return h.handleNotStartedRsmRanInfo(nodebInfo, rsmRanInfo, config)
107         }
108
109         return h.handleNotStoppedRsmRanInfo(nodebInfo, rsmRanInfo, config)
110 }
111
112 func (h ResourceStatusRequestHandler) handleNotStoppedRsmRanInfo(nodebInfo *entities.NodebInfo, rsmRanInfo *models.RsmRanInfo, config *models.RsmGeneralConfiguration) error {
113         if rsmRanInfo.Action == enums.Stop && rsmRanInfo.ActionStatus {
114                 return nil
115         }
116
117         if rsmRanInfo.Enb2MeasurementId == 0 {
118                 h.logger.Errorf("#ResourceStatusRequestHandler.handleNotStoppedRsmRanInfo - RAN: %s Enb2MeasurementId is zero", nodebInfo.RanName)
119                 return rsmerrors.NewInternalError()
120         }
121
122         if rsmRanInfo.Action != enums.Stop {
123
124                 err := h.saveRsmRanInfoStopFalse(rsmRanInfo)
125                 if err != nil {
126                         return err
127                 }
128         }
129
130         return h.resourceStatusService.BuildAndSendStopRequest(nodebInfo, config, rsmRanInfo.Enb1MeasurementId, rsmRanInfo.Enb2MeasurementId)
131 }
132
133 func (h ResourceStatusRequestHandler) handleNotStartedRsmRanInfo(nodebInfo *entities.NodebInfo, rsmRanInfo *models.RsmRanInfo, config *models.RsmGeneralConfiguration) error {
134         if rsmRanInfo.Action == enums.Start && rsmRanInfo.ActionStatus {
135                 return nil
136         }
137
138         if rsmRanInfo.Action != enums.Start {
139
140                 err := h.saveRsmRanInfoStartFalse(rsmRanInfo)
141                 if err != nil {
142                         return err
143                 }
144         }
145
146         return h.resourceStatusService.BuildAndSendInitiateRequest(nodebInfo, config, rsmRanInfo.Enb1MeasurementId)
147 }
148
149 func (h ResourceStatusRequestHandler) saveRsmRanInfoStopFalse(rsmRanInfo *models.RsmRanInfo) error {
150         rsmRanInfo.Action = enums.Stop
151         rsmRanInfo.ActionStatus = false
152
153         return h.rNibDataService.SaveRsmRanInfo(rsmRanInfo)
154 }
155
156 func (h ResourceStatusRequestHandler) saveRsmRanInfoStartFalse(rsmRanInfo *models.RsmRanInfo) error {
157         rsmRanInfo.Action = enums.Start
158         rsmRanInfo.ActionStatus = false
159         rsmRanInfo.Enb2MeasurementId = 0
160         rsmRanInfo.Enb1MeasurementId = enums.Enb1MeasurementId
161
162         return h.rNibDataService.SaveRsmRanInfo(rsmRanInfo)
163 }