Changing status to connected state after timeout.
[ric-plt/e2mgr.git] / E2Manager / handlers / httpmsghandlers / health_check_handler.go
index 70203d8..785fa49 100644 (file)
@@ -23,11 +23,19 @@ import (
        "e2mgr/logger"
        "e2mgr/managers"
        "e2mgr/models"
+       "e2mgr/rmrCgo"
        "e2mgr/services"
        "e2mgr/services/rmrsender"
+       "e2mgr/utils"
+       "encoding/xml"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
-       //        "github.com/pkg/errors"
+       "unsafe"
+)
+
+var(
+       healthCheckSuccessResponse          = "Request Accepted"
+       healthCheckEmptyTagsToReplaceToSelfClosingTags = []string{"reject", "ignore", "protocolIEs", "procedureCode"}
 )
 
 type HealthCheckRequestHandler struct {
@@ -50,8 +58,11 @@ func (h *HealthCheckRequestHandler) Handle(request models.Request) (models.IResp
        ranNameList := h.getRanNameList(request)
        isAtleastOneRanConnected := false
 
+       nodetypeToNbIdentityMapOld := make(map[entities.Node_Type][]*entities.NbIdentity)
+       nodetypeToNbIdentityMapNew := make(map[entities.Node_Type][]*entities.NbIdentity)
+
        for _, ranName := range ranNameList {
-               nodebInfo, err := h.rNibDataService.GetNodeb(ranName) //This method is needed for getting RAN functions with later commits
+               nodebInfo, err := h.rNibDataService.GetNodeb(ranName)
                if err != nil {
                        _, ok := err.(*common.ResourceNotFoundError)
                        if !ok {
@@ -60,16 +71,62 @@ func (h *HealthCheckRequestHandler) Handle(request models.Request) (models.IResp
                        }
                        continue
                }
+
                if nodebInfo.ConnectionStatus == entities.ConnectionStatus_CONNECTED {
                        isAtleastOneRanConnected = true
 
+                       err := h.sendRICServiceQuery(nodebInfo)
+                       if err != nil {
+                               return nil,err
+                       }
+
+                       oldnbIdentity, newnbIdentity := h.ranListManager.UpdateHealthcheckTimeStampSent(ranName)
+                       nodetypeToNbIdentityMapOld[nodebInfo.NodeType] = append(nodetypeToNbIdentityMapOld[nodebInfo.NodeType], oldnbIdentity)
+                       nodetypeToNbIdentityMapNew[nodebInfo.NodeType] = append(nodetypeToNbIdentityMapNew[nodebInfo.NodeType], newnbIdentity)
+               }
+       }
+
+       for k, _ := range nodetypeToNbIdentityMapOld {
+               err := h.ranListManager.UpdateNbIdentities(k, nodetypeToNbIdentityMapOld[k], nodetypeToNbIdentityMapNew[k])
+               if err != nil {
+                       return nil,err
                }
        }
+
        if isAtleastOneRanConnected == false {
                return nil, e2managererrors.NewNoConnectedRanError()
        }
 
-       return nil, nil
+       h.logger.Infof("#HealthcheckRequest.Handle - HealthcheckTimeStampSent Update completed to RedisDB")
+
+       return models.NewHealthCheckSuccessResponse(healthCheckSuccessResponse), nil
+}
+
+func (h *HealthCheckRequestHandler) sendRICServiceQuery(nodebInfo *entities.NodebInfo) error {
+
+       serviceQuery := models.NewRicServiceQueryMessage(nodebInfo.GetGnb().RanFunctions)
+       payLoad, err := xml.Marshal(serviceQuery.E2APPDU)
+       if err != nil {
+               h.logger.Errorf("#HealthCHeckRequest.Handle- RAN name: %s - Error marshalling RIC_SERVICE_QUERY. Payload: %s", nodebInfo.RanName, payLoad)
+               //return nil, e2managererrors.NewInternalError()
+       }
+
+       payLoad = utils.ReplaceEmptyTagsWithSelfClosing(payLoad,healthCheckEmptyTagsToReplaceToSelfClosingTags)
+
+       var xAction []byte
+       var msgSrc unsafe.Pointer
+       msg := models.NewRmrMessage(rmrCgo.RIC_SERVICE_QUERY, nodebInfo.RanName, payLoad, xAction, msgSrc)
+
+       err = h.rmrsender.Send(msg)
+
+       if err != nil {
+               h.logger.Errorf("#HealthCHeckRequest.Handle - failed to send RIC_SERVICE_QUERY message to RMR for %s. Error: %s", nodebInfo.RanName, err)
+               //return nil, e2managererrors.NewRmrError()
+       } else {
+               h.logger.Infof("#HealthCHeckRequest.Handle - RAN name : %s - Successfully built and sent RIC_SERVICE_QUERY. Message: %x", nodebInfo.RanName, msg)
+       }
+
+       return nil
 }
 
 func (h *HealthCheckRequestHandler) getRanNameList(request models.Request) []string {
@@ -77,13 +134,17 @@ func (h *HealthCheckRequestHandler) getRanNameList(request models.Request) []str
        if request != nil && len(healthCheckRequest.RanList) != 0 {
                return healthCheckRequest.RanList
        }
-       nodeIds := h.ranListManager.GetNbIdentityList()
 
+       h.logger.Infof("#HealthcheckRequest.getRanNameList - Empty request sent, fetching all connected NbIdentitylist")
+
+       nodeIds := h.ranListManager.GetNbIdentityList()
        var ranNameList []string
+
        for _, nbIdentity := range nodeIds {
                if nbIdentity.ConnectionStatus == entities.ConnectionStatus_CONNECTED {
                        ranNameList = append(ranNameList, nbIdentity.InventoryName)
                }
        }
+
        return ranNameList
 }