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