2 // Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved.
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
8 // http://www.apache.org/licenses/LICENSE-2.0
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.
16 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
17 // platform project (RICP).
19 package httpmsghandlers
22 "e2mgr/e2managererrors"
28 "e2mgr/services/rmrsender"
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"
37 healthCheckSuccessResponse = "Request Accepted"
38 healthCheckEmptyTagsToReplaceToSelfClosingTags = []string{"reject", "ignore", "protocolIEs", "procedureCode"}
41 type HealthCheckRequestHandler struct {
43 rNibDataService services.RNibDataService
44 ranListManager managers.RanListManager
45 rmrsender *rmrsender.RmrSender
48 func NewHealthCheckRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService, ranListManager managers.RanListManager, rmrsender *rmrsender.RmrSender) *HealthCheckRequestHandler {
49 return &HealthCheckRequestHandler{
51 rNibDataService: rNibDataService,
52 ranListManager: ranListManager,
57 func (h *HealthCheckRequestHandler) Handle(request models.Request) (models.IResponse, error) {
58 ranNameList := h.getRanNameList(request)
59 isAtleastOneRanConnected := false
61 nodetypeToNbIdentityMapOld := make(map[entities.Node_Type][]*entities.NbIdentity)
62 nodetypeToNbIdentityMapNew := make(map[entities.Node_Type][]*entities.NbIdentity)
64 for _, ranName := range ranNameList {
65 nodebInfo, err := h.rNibDataService.GetNodeb(ranName)
67 _, ok := err.(*common.ResourceNotFoundError)
69 h.logger.Errorf("#HealthCheckRequest.Handle - failed to get nodeBInfo entity for ran name: %v from RNIB. Error: %s", ranName, err)
70 return nil, e2managererrors.NewRnibDbError()
75 if nodebInfo.ConnectionStatus == entities.ConnectionStatus_CONNECTED {
76 isAtleastOneRanConnected = true
78 err := h.sendRICServiceQuery(nodebInfo)
83 oldnbIdentity, newnbIdentity := h.ranListManager.UpdateHealthcheckTimeStampSent(ranName)
84 nodetypeToNbIdentityMapOld[nodebInfo.NodeType] = append(nodetypeToNbIdentityMapOld[nodebInfo.NodeType], oldnbIdentity)
85 nodetypeToNbIdentityMapNew[nodebInfo.NodeType] = append(nodetypeToNbIdentityMapNew[nodebInfo.NodeType], newnbIdentity)
89 for k, _ := range nodetypeToNbIdentityMapOld {
90 err := h.ranListManager.UpdateNbIdentities(k, nodetypeToNbIdentityMapOld[k], nodetypeToNbIdentityMapNew[k])
96 if isAtleastOneRanConnected == false {
97 return nil, e2managererrors.NewNoConnectedRanError()
100 h.logger.Infof("#HealthcheckRequest.Handle - HealthcheckTimeStampSent Update completed to RedisDB")
102 return models.NewHealthCheckSuccessResponse(healthCheckSuccessResponse), nil
105 func (h *HealthCheckRequestHandler) sendRICServiceQuery(nodebInfo *entities.NodebInfo) error {
107 serviceQuery := models.NewRicServiceQueryMessage(nodebInfo.GetGnb().RanFunctions)
108 payLoad, err := xml.Marshal(serviceQuery.E2APPDU)
110 h.logger.Errorf("#HealthCHeckRequest.Handle- RAN name: %s - Error marshalling RIC_SERVICE_QUERY. Payload: %s", nodebInfo.RanName, payLoad)
111 //return nil, e2managererrors.NewInternalError()
114 payLoad = utils.ReplaceEmptyTagsWithSelfClosing(payLoad,healthCheckEmptyTagsToReplaceToSelfClosingTags)
117 var msgSrc unsafe.Pointer
118 msg := models.NewRmrMessage(rmrCgo.RIC_SERVICE_QUERY, nodebInfo.RanName, payLoad, xAction, msgSrc)
120 err = h.rmrsender.Send(msg)
123 h.logger.Errorf("#HealthCHeckRequest.Handle - failed to send RIC_SERVICE_QUERY message to RMR for %s. Error: %s", nodebInfo.RanName, err)
124 //return nil, e2managererrors.NewRmrError()
126 h.logger.Infof("#HealthCHeckRequest.Handle - RAN name : %s - Successfully built and sent RIC_SERVICE_QUERY. Message: %x", nodebInfo.RanName, msg)
132 func (h *HealthCheckRequestHandler) getRanNameList(request models.Request) []string {
133 healthCheckRequest := request.(models.HealthCheckRequest)
134 if request != nil && len(healthCheckRequest.RanList) != 0 {
135 return healthCheckRequest.RanList
138 h.logger.Infof("#HealthcheckRequest.getRanNameList - Empty request sent, fetching all connected NbIdentitylist")
140 nodeIds := h.ranListManager.GetNbIdentityList()
141 var ranNameList []string
143 for _, nbIdentity := range nodeIds {
144 if nbIdentity.ConnectionStatus == entities.ConnectionStatus_CONNECTED {
145 ranNameList = append(ranNameList, nbIdentity.InventoryName)