X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2Fhandlers%2Frmrmsghandlers%2Fe2_reset_request_handler.go;h=eb20f13ddf0255e19b5d89ba2eef8bb13c5e3a5a;hb=5734b9170a6ea903130cf1bc2a2d81c27356e310;hp=76a0b1a6051d3e2f557745fade58709921aea4a7;hpb=2e2df47c2adf829fc8dfcd57362061b1a09e1125;p=ric-plt%2Fe2mgr.git diff --git a/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go index 76a0b1a..eb20f13 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go @@ -21,9 +21,13 @@ package rmrmsghandlers import ( "e2mgr/configuration" "e2mgr/logger" + "e2mgr/managers" "e2mgr/models" + "e2mgr/rmrCgo" "e2mgr/services" + "e2mgr/services/rmrsender" "e2mgr/utils" + "encoding/xml" "time" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" @@ -31,17 +35,27 @@ import ( const E2ResetRequestLogInfoElapsedTime = "#E2ResetRequestNotificationHandler.Handle - Summary: elapsed time for receiving and handling reset request message from E2 terminator: %f ms" +var ( + resetRequestEmptyTagsToReplaceToSelfClosingTags = []string{"reject", "ignore", "protocolIEs", "procedureCode", "ResetResponse", "ResetResponseIEs", "id", "criticality", "TransactionID"} +) + type E2ResetRequestNotificationHandler struct { - logger *logger.Logger - rnibDataService services.RNibDataService - config *configuration.Configuration + logger *logger.Logger + rnibDataService services.RNibDataService + config *configuration.Configuration + rmrSender *rmrsender.RmrSender + ranResetManager *managers.RanResetManager + changeStatusToConnectedRanManager *managers.ChangeStatusToConnectedRanManager } -func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration) *E2ResetRequestNotificationHandler { +func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration, rmrSender *rmrsender.RmrSender, ranResetManager *managers.RanResetManager, changeStatusToConnectedRanManager *managers.ChangeStatusToConnectedRanManager) *E2ResetRequestNotificationHandler { return &E2ResetRequestNotificationHandler{ - logger: logger, - rnibDataService: rnibDataService, - config: config, + logger: logger, + rnibDataService: rnibDataService, + config: config, + rmrSender: rmrSender, + ranResetManager: ranResetManager, + changeStatusToConnectedRanManager: changeStatusToConnectedRanManager, } } @@ -62,7 +76,21 @@ func (e *E2ResetRequestNotificationHandler) Handle(request *models.NotificationR nodebInfo.ConnectionStatus = entities.ConnectionStatus_UNDER_RESET - err = e.rnibDataService.UpdateNodebInfoAndPublish(nodebInfo) + ranName := request.RanName + isResetDone, err := e.ranResetManager.ResetRan(ranName) + if err != nil { + e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update and notify connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error()) + } else { + if isResetDone { + nodebInfoupdated, err1 := e.getNodebInfo(request.RanName) + if err1 != nil { + e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to get updated nodeB entity. RanName: %s. Error: %s", request.RanName, err1.Error()) + } + e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Done Successfully ran: %s , Connection status updated : %s", ranName, nodebInfoupdated.ConnectionStatus) + } else { + e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Failed") + } + } if err != nil { e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error()) @@ -74,12 +102,27 @@ func (e *E2ResetRequestNotificationHandler) Handle(request *models.NotificationR e.waitfortimertimeout(request) - nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED - - err = e.rnibDataService.UpdateNodebInfoAndPublish(nodebInfo) + resetRequest, err := e.parseE2ResetMessage(request.Payload) + if err != nil { + e.logger.Errorf(err.Error()) + return + } + e.logger.Infof("#E2ResetRequestNotificationHandler.Handle - RIC_RESET_REQUEST has been parsed successfully %+v", resetRequest) + e.handleSuccessfulResponse(ranName, request, resetRequest) + isConnectedStatus, err := e.changeStatusToConnectedRanManager.ChangeStatusToConnectedRan(ranName) if err != nil { - e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error()) + e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update and notify connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error()) + } else { + if isConnectedStatus { + nodebInfoupdated, err1 := e.getNodebInfo(request.RanName) + if err1 != nil { + e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to get updated nodeB entity. RanName: %s. Error: %s", request.RanName, err1.Error()) + } + e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Connection status Set Successfully ran: %s , Connection status updated : %s", ranName, nodebInfoupdated.ConnectionStatus) + } else { + e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Connection status Setting Failed") + } } e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - nodeB entity connected state. RanName %s, ConnectionStatus %s", nodebInfo.RanName, nodebInfo.ConnectionStatus) @@ -107,3 +150,37 @@ func (e *E2ResetRequestNotificationHandler) waitfortimertimeout(request *models. time.Sleep(time.Duration(timeout/100) * time.Millisecond) } } + +func (e *E2ResetRequestNotificationHandler) parseE2ResetMessage(payload []byte) (*models.E2ResetRequestMessage, error) { + e2resetMessage := models.E2ResetRequestMessage{} + err := xml.Unmarshal(utils.NormalizeXml(payload), &(e2resetMessage.E2ApPDU)) + + if err != nil { + e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - error in parsing request message: %+v", err) + return nil, err + } + e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Unmarshalling is successful %v", e2resetMessage.E2ApPDU.InitiatingMessage.ProcedureCode) + return &e2resetMessage, nil +} + +func (h *E2ResetRequestNotificationHandler) handleSuccessfulResponse(ranName string, req *models.NotificationRequest, resetRequest *models.E2ResetRequestMessage) { + + successResponse := models.NewE2ResetResponseMessage(resetRequest) + h.logger.Debugf("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - E2_RESET_RESPONSE has been built successfully %+v", successResponse) + + responsePayload, err := xml.Marshal(&successResponse.E2ApPdu) + if err != nil { + h.logger.Warnf("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_RESET_RESP. Payload: %s", ranName, responsePayload) + } + + responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload, resetRequestEmptyTagsToReplaceToSelfClosingTags) + + h.logger.Infof("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - payload: %s", responsePayload) + + msg := models.NewRmrMessage(rmrCgo.RIC_E2_RESET_RESP, ranName, responsePayload, req.TransactionId, req.GetMsgSrc()) + h.logger.Infof("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - RIC_E2_RESET_RESP message has been built successfully. Message: %x", ranName, msg) + err = h.rmrSender.Send(msg) + if err != nil { + h.logger.Errorf("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error sending e2 success response %+v", ranName, msg) + } +}