[RIC-249] [RIC-588] US RIC SERVICE UPDATE - Health Check Received | RIC SERVICE UPDAT...
[ric-plt/e2mgr.git] / E2Manager / handlers / httpmsghandlers / health_check_handler.go
1 //
2 // Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15
16 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
17 //  platform project (RICP).
18
19 package httpmsghandlers
20
21 import (
22         "e2mgr/e2managererrors"
23         "e2mgr/logger"
24         "e2mgr/managers"
25         "e2mgr/models"
26         "e2mgr/rmrCgo"
27         "e2mgr/services"
28         "e2mgr/services/rmrsender"
29         "e2mgr/utils"
30         "encoding/xml"
31         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
32         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
33         "unsafe"
34 )
35
36 var(
37         healthCheckEmptyTagsToReplaceToSelfClosingTags = []string{"reject", "ignore", "protocolIEs", "procedureCode"}
38 )
39
40 type HealthCheckRequestHandler struct {
41         logger          *logger.Logger
42         rNibDataService services.RNibDataService
43         ranListManager  managers.RanListManager
44         rmrsender       *rmrsender.RmrSender
45 }
46
47 func NewHealthCheckRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService, ranListManager managers.RanListManager, rmrsender *rmrsender.RmrSender) *HealthCheckRequestHandler {
48         return &HealthCheckRequestHandler{
49                 logger:          logger,
50                 rNibDataService: rNibDataService,
51                 ranListManager:  ranListManager,
52                 rmrsender:       rmrsender,
53         }
54 }
55
56 func (h *HealthCheckRequestHandler) Handle(request models.Request) (models.IResponse, error) {
57         ranNameList := h.getRanNameList(request)
58         isAtleastOneRanConnected := false
59
60         nodetypeToNbIdentityMapOld := make(map[entities.Node_Type][]*entities.NbIdentity)
61         nodetypeToNbIdentityMapNew := make(map[entities.Node_Type][]*entities.NbIdentity)
62
63         for _, ranName := range ranNameList {
64                 nodebInfo, err := h.rNibDataService.GetNodeb(ranName)
65                 if err != nil {
66                         _, ok := err.(*common.ResourceNotFoundError)
67                         if !ok {
68                                 h.logger.Errorf("#HealthCheckRequest.Handle - failed to get nodeBInfo entity for ran name: %v from RNIB. Error: %s", ranName, err)
69                                 return nil, e2managererrors.NewRnibDbError()
70                         }
71                         continue
72                 }
73
74                 if nodebInfo.ConnectionStatus == entities.ConnectionStatus_CONNECTED {
75                         isAtleastOneRanConnected = true
76
77                         err := h.sendRICServiceQuery(nodebInfo)
78                         if err != nil {
79                                 return nil,err
80                         }
81
82                         oldnbIdentity, newnbIdentity := h.ranListManager.UpdateHealthcheckTimeStampSent(ranName)
83                         nodetypeToNbIdentityMapOld[nodebInfo.NodeType] = append(nodetypeToNbIdentityMapOld[nodebInfo.NodeType], oldnbIdentity)
84                         nodetypeToNbIdentityMapNew[nodebInfo.NodeType] = append(nodetypeToNbIdentityMapNew[nodebInfo.NodeType], newnbIdentity)
85                 }
86         }
87
88         for k, _ := range nodetypeToNbIdentityMapOld {
89                 err := h.ranListManager.UpdateNbIdentities(k, nodetypeToNbIdentityMapOld[k], nodetypeToNbIdentityMapNew[k])
90                 if err != nil {
91                         return nil,err
92                 }
93         }
94
95         if isAtleastOneRanConnected == false {
96                 return nil, e2managererrors.NewNoConnectedRanError()
97         }
98
99         h.logger.Infof("#HealthcheckRequest.Handle - HealthcheckTimeStampSent Update completed to RedisDB")
100
101         return nil, nil
102 }
103
104 func (h *HealthCheckRequestHandler) sendRICServiceQuery(nodebInfo *entities.NodebInfo) error {
105
106         serviceQuery := models.NewRicServiceQueryMessage(nodebInfo.GetGnb().RanFunctions)
107         payLoad, err := xml.Marshal(serviceQuery.E2APPDU)
108         if err != nil {
109                 h.logger.Errorf("#HealthCHeckRequest.Handle- RAN name: %s - Error marshalling RIC_SERVICE_QUERY. Payload: %s", nodebInfo.RanName, payLoad)
110                 //return nil, e2managererrors.NewInternalError()
111         }
112
113         payLoad = utils.ReplaceEmptyTagsWithSelfClosing(payLoad,healthCheckEmptyTagsToReplaceToSelfClosingTags)
114
115         var xAction []byte
116         var msgSrc unsafe.Pointer
117         msg := models.NewRmrMessage(rmrCgo.RIC_SERVICE_QUERY, nodebInfo.RanName, payLoad, xAction, msgSrc)
118
119         err = h.rmrsender.Send(msg)
120
121         if err != nil {
122                 h.logger.Errorf("#HealthCHeckRequest.Handle - failed to send RIC_SERVICE_QUERY message to RMR for %s. Error: %s", nodebInfo.RanName, err)
123                 //return nil, e2managererrors.NewRmrError()
124         } else {
125                 h.logger.Infof("#HealthCHeckRequest.Handle - RAN name : %s - Successfully built and sent RIC_SERVICE_QUERY. Message: %x", nodebInfo.RanName, msg)
126         }
127
128         return nil
129 }
130
131 func (h *HealthCheckRequestHandler) getRanNameList(request models.Request) []string {
132         healthCheckRequest := request.(models.HealthCheckRequest)
133         if request != nil && len(healthCheckRequest.RanList) != 0 {
134                 return healthCheckRequest.RanList
135         }
136
137         h.logger.Infof("#HealthcheckRequest.getRanNameList - Empty request sent, fetching all connected NbIdentitylist")
138
139         nodeIds := h.ranListManager.GetNbIdentityList()
140         var ranNameList []string
141
142         for _, nbIdentity := range nodeIds {
143                 if nbIdentity.ConnectionStatus == entities.ConnectionStatus_CONNECTED {
144                         ranNameList = append(ranNameList, nbIdentity.InventoryName)
145                 }
146         }
147
148         return ranNameList
149 }