import (\r
"e2mgr/configuration"\r
"e2mgr/logger"\r
+ "e2mgr/managers"\r
"e2mgr/models"\r
+ "e2mgr/rmrCgo"\r
"e2mgr/services"\r
+ "e2mgr/services/rmrsender"\r
"e2mgr/utils"\r
+ "encoding/xml"\r
"time"\r
\r
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"\r
\r
const E2ResetRequestLogInfoElapsedTime = "#E2ResetRequestNotificationHandler.Handle - Summary: elapsed time for receiving and handling reset request message from E2 terminator: %f ms"\r
\r
+var (\r
+ resetRequestEmptyTagsToReplaceToSelfClosingTags = []string{"reject", "ignore", "protocolIEs", "procedureCode", "ResetResponse", "ResetResponseIEs", "id", "criticality", "TransactionID"}\r
+)\r
+\r
type E2ResetRequestNotificationHandler struct {\r
- logger *logger.Logger\r
- rnibDataService services.RNibDataService\r
- config *configuration.Configuration\r
+ logger *logger.Logger\r
+ rnibDataService services.RNibDataService\r
+ config *configuration.Configuration\r
+ rmrSender *rmrsender.RmrSender\r
+ ranResetManager *managers.RanResetManager\r
+ changeStatusToConnectedRanManager *managers.ChangeStatusToConnectedRanManager\r
}\r
\r
-func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration) *E2ResetRequestNotificationHandler {\r
+func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration, rmrSender *rmrsender.RmrSender, ranResetManager *managers.RanResetManager, changeStatusToConnectedRanManager *managers.ChangeStatusToConnectedRanManager) *E2ResetRequestNotificationHandler {\r
return &E2ResetRequestNotificationHandler{\r
- logger: logger,\r
- rnibDataService: rnibDataService,\r
- config: config,\r
+ logger: logger,\r
+ rnibDataService: rnibDataService,\r
+ config: config,\r
+ rmrSender: rmrSender,\r
+ ranResetManager: ranResetManager,\r
+ changeStatusToConnectedRanManager: changeStatusToConnectedRanManager,\r
}\r
}\r
\r
\r
nodebInfo.ConnectionStatus = entities.ConnectionStatus_UNDER_RESET\r
\r
- err = e.rnibDataService.UpdateNodebInfoAndPublish(nodebInfo)\r
+ ranName := request.RanName\r
+ isResetDone, err := e.ranResetManager.ResetRan(ranName)\r
+ if err != nil {\r
+ e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update and notify connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error())\r
+ } else {\r
+ if isResetDone {\r
+ nodebInfoupdated, err1 := e.getNodebInfo(request.RanName)\r
+ if err1 != nil {\r
+ e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to get updated nodeB entity. RanName: %s. Error: %s", request.RanName, err1.Error())\r
+ }\r
+ e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Done Successfully ran: %s , Connection status updated : %s", ranName, nodebInfoupdated.ConnectionStatus)\r
+ } else {\r
+ e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Failed")\r
+ }\r
+ }\r
\r
if err != nil {\r
e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error())\r
\r
e.waitfortimertimeout(request)\r
\r
- nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED\r
-\r
- err = e.rnibDataService.UpdateNodebInfoAndPublish(nodebInfo)\r
+ resetRequest, err := e.parseE2ResetMessage(request.Payload)\r
+ if err != nil {\r
+ e.logger.Errorf(err.Error())\r
+ return\r
+ }\r
+ e.logger.Infof("#E2ResetRequestNotificationHandler.Handle - RIC_RESET_REQUEST has been parsed successfully %+v", resetRequest)\r
+ e.handleSuccessfulResponse(ranName, request, resetRequest)\r
\r
+ isConnectedStatus, err := e.changeStatusToConnectedRanManager.ChangeStatusToConnectedRan(ranName)\r
if err != nil {\r
- e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error())\r
+ e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update and notify connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error())\r
+ } else {\r
+ if isConnectedStatus {\r
+ nodebInfoupdated, err1 := e.getNodebInfo(request.RanName)\r
+ if err1 != nil {\r
+ e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to get updated nodeB entity. RanName: %s. Error: %s", request.RanName, err1.Error())\r
+ }\r
+ e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Connection status Set Successfully ran: %s , Connection status updated : %s", ranName, nodebInfoupdated.ConnectionStatus)\r
+ } else {\r
+ e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Connection status Setting Failed")\r
+ }\r
}\r
\r
e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - nodeB entity connected state. RanName %s, ConnectionStatus %s", nodebInfo.RanName, nodebInfo.ConnectionStatus)\r
time.Sleep(time.Duration(timeout/100) * time.Millisecond)\r
}\r
}\r
+\r
+func (e *E2ResetRequestNotificationHandler) parseE2ResetMessage(payload []byte) (*models.E2ResetRequestMessage, error) {\r
+ e2resetMessage := models.E2ResetRequestMessage{}\r
+ err := xml.Unmarshal(utils.NormalizeXml(payload), &(e2resetMessage.E2ApPDU))\r
+\r
+ if err != nil {\r
+ e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - error in parsing request message: %+v", err)\r
+ return nil, err\r
+ }\r
+ e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Unmarshalling is successful %v", e2resetMessage.E2ApPDU.InitiatingMessage.ProcedureCode)\r
+ return &e2resetMessage, nil\r
+}\r
+\r
+func (h *E2ResetRequestNotificationHandler) handleSuccessfulResponse(ranName string, req *models.NotificationRequest, resetRequest *models.E2ResetRequestMessage) {\r
+\r
+ successResponse := models.NewE2ResetResponseMessage(resetRequest)\r
+ h.logger.Debugf("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - E2_RESET_RESPONSE has been built successfully %+v", successResponse)\r
+\r
+ responsePayload, err := xml.Marshal(&successResponse.E2ApPdu)\r
+ if err != nil {\r
+ h.logger.Warnf("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_RESET_RESP. Payload: %s", ranName, responsePayload)\r
+ }\r
+\r
+ responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload, resetRequestEmptyTagsToReplaceToSelfClosingTags)\r
+\r
+ h.logger.Infof("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - payload: %s", responsePayload)\r
+\r
+ msg := models.NewRmrMessage(rmrCgo.RIC_E2_RESET_RESP, ranName, responsePayload, req.TransactionId, req.GetMsgSrc())\r
+ h.logger.Infof("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - RIC_E2_RESET_RESP message has been built successfully. Message: %x", ranName, msg)\r
+ err = h.rmrSender.Send(msg)\r
+ if err != nil {\r
+ h.logger.Errorf("#E2ResetRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error sending e2 success response %+v", ranName, msg)\r
+ }\r
+}\r