From: idanshal Date: Tue, 25 Feb 2020 13:40:32 +0000 (+0200) Subject: [RIC-196] Refactor LostConnection.... X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=2ed06429ecae26f8591f2f7b6a8b64fe15c9b3d8;p=ric-plt%2Fe2mgr.git [RIC-196] Refactor LostConnection.... Change-Id: I3408d94eac6f99a41fbd1a18f62b53ac3b09684b Signed-off-by: idanshal --- diff --git a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go index c75140f..c36438d 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go @@ -31,18 +31,18 @@ import ( ) type E2TermInitNotificationHandler struct { - logger *logger.Logger - ranReconnectionManager *managers.RanReconnectionManager - e2tInstancesManager managers.IE2TInstancesManager - routingManagerClient clients.IRoutingManagerClient + logger *logger.Logger + ranDisconnectionManager *managers.RanDisconnectionManager + e2tInstancesManager managers.IE2TInstancesManager + routingManagerClient clients.IRoutingManagerClient } -func NewE2TermInitNotificationHandler(logger *logger.Logger, ranReconnectionManager *managers.RanReconnectionManager, e2tInstancesManager managers.IE2TInstancesManager, routingManagerClient clients.IRoutingManagerClient) E2TermInitNotificationHandler { +func NewE2TermInitNotificationHandler(logger *logger.Logger, ranDisconnectionManager *managers.RanDisconnectionManager, e2tInstancesManager managers.IE2TInstancesManager, routingManagerClient clients.IRoutingManagerClient) E2TermInitNotificationHandler { return E2TermInitNotificationHandler{ - logger: logger, - ranReconnectionManager: ranReconnectionManager, - e2tInstancesManager: e2tInstancesManager, - routingManagerClient: routingManagerClient, + logger: logger, + ranDisconnectionManager: ranDisconnectionManager, + e2tInstancesManager: e2tInstancesManager, + routingManagerClient: routingManagerClient, } } @@ -104,7 +104,7 @@ func (h E2TermInitNotificationHandler) HandleExistingE2TInstance(e2tInstance *en for _, ranName := range e2tInstance.AssociatedRanList { - if err := h.ranReconnectionManager.ReconnectRan(ranName); err != nil { + if err := h.ranDisconnectionManager.DisconnectRan(ranName); err != nil { h.logger.Errorf("#E2TermInitNotificationHandler.HandleExistingE2TInstance - Ran name: %s - connection attempt failure, error: %s", ranName, err) _, ok := err.(*common.ResourceNotFoundError) if !ok { diff --git a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go index 1b7cba6..6c830b1 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go @@ -52,7 +52,6 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotifica config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrSender := initRmrSender(rmrMessengerMock, logger) readerMock := &mocks.RnibReaderMock{} @@ -61,12 +60,11 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotifica routingManagerClientMock := &mocks.RoutingManagerClientMock{} rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) - ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService) e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager) + ranReconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, e2tInstancesManagerMock, routingManagerClientMock) return logger, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock @@ -78,7 +76,6 @@ func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger. config := configuration.ParseConfiguration() rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrSender := initRmrSender(rmrMessengerMock, logger) readerMock := &mocks.RnibReaderMock{} @@ -87,11 +84,10 @@ func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger. routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock) rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) - ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService) e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager) + ranReconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, e2tInstancesManager, routingManagerClient) return logger, config, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock } @@ -182,32 +178,32 @@ func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) { e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceAddress) } -func TestE2TermInitHandlerSuccessOneRan(t *testing.T) { - _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) - var rnibErr error - - var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr) - - var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr) - - payload := e2pdus.PackedX2setupRequest - xaction := []byte(RanName) - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName) - e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) -} +//func TestE2TermInitHandlerSuccessOneRan(t *testing.T) { +// _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) +// var rnibErr error +// +// var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr) +// +// var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr) +// +// payload := e2pdus.PackedX2setupRequest +// xaction := []byte(RanName) +// msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName) +// e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) +//} func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) { _, _, handler, readerMock, writerMock, rmrMessengerMock,_ := initRanLostConnectionTestWithRealE2tInstanceManager(t) @@ -266,39 +262,39 @@ func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) { rmrMessengerMock.AssertNotCalled(t, "SendMsg") } -func TestE2TermInitHandlerSuccessTwoRans_RoutingManagerFailure(t *testing.T) { - _, _, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock:= initRanLostConnectionTestWithRealE2tInstanceManager(t) - - var rnibErr error - var initialNodeb0 = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb1 = &entities.NodebInfo{RanName: "test2", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) - readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) - writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) - - payload := e2pdus.PackedX2setupRequest - xaction := []byte(RanName) - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.State = entities.RoutingManagerFailure - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") - - readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - writerMock.On("SaveE2TInstance", mock.Anything).Return(nil) - - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) - - httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything) - writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything) -} +//func TestE2TermInitHandlerSuccessTwoRans_RoutingManagerFailure(t *testing.T) { +// _, _, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock:= initRanLostConnectionTestWithRealE2tInstanceManager(t) +// +// var rnibErr error +// var initialNodeb0 = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb1 = &entities.NodebInfo{RanName: "test2", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) +// readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) +// writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) +// +// payload := e2pdus.PackedX2setupRequest +// xaction := []byte(RanName) +// msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.State = entities.RoutingManagerFailure +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") +// +// readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// writerMock.On("SaveE2TInstance", mock.Anything).Return(nil) +// +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) +// +// httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything) +// writerMock.AssertCalled(t, "SaveE2TInstance", mock.Anything) +//} func TestE2TermInitHandlerSuccessOneRan_RoutingManagerFailure_Error(t *testing.T) { _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) @@ -332,184 +328,184 @@ func TestE2TermInitHandlerSuccessOneRan_RoutingManagerFailure_Error(t *testing.T rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) } -func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) { - _, _, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock:= initRanLostConnectionTestWithRealE2tInstanceManager(t) - var rnibErr error - var initialNodeb0 = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb1 = &entities.NodebInfo{RanName: "test2", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) - readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) - writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) - - payload := e2pdus.PackedX2setupRequest - xaction := []byte(RanName) - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") - readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) - httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything) -} - -func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) { - _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) - var rnibErr error - var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) - readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) - - var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr) - - payload := e2pdus.PackedX2setupRequest - xaction := []byte(RanName) - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") - e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) - writerMock.AssertExpectations(t) -} - -func TestE2TermInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) { - log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) - var rnibErr error - - ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} - - var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr) - readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr) - readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr) - - var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0} - writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr) - writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr) - - payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log) - xaction := []byte(ids[0].InventoryName) - msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, fmt.Errorf("RMR Error")) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3") - e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - //test1 (before send +1, after failure +1), test2 (0) test3 (0) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) - //test1 failure (+1), test2 (0). test3 (0) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) -} - -func TestE2TermInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) { - log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) - var rnibErr error - - ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} - - var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr) - readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found")) - readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr) - - var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr) - writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr) - - var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr) - writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr) - - payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log) - xaction := []byte(ids[0].InventoryName) - msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3") - e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - readerMock.AssertNumberOfCalls(t, "GetNodeb", 3) - //test1 (+1), test2 failure (0) test3 (+1) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) - //test1 success (+1), test2 (0). test3 (+1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) -} - -func TestE2TermInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) { - log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) - var rnibErr error - - ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} - - var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr) - readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error"))) - readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr) - - var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr) - writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr) - - var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr) - writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr) - - payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log) - xaction := []byte(ids[0].InventoryName) - msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3") - e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - readerMock.AssertNumberOfCalls(t, "GetNodeb", 2) - //test1 (+1), test2 failure (0) test3 (0) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) - //test1 success (+1), test2 (0). test3 (+1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) -} +//func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) { +// _, _, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock:= initRanLostConnectionTestWithRealE2tInstanceManager(t) +// var rnibErr error +// var initialNodeb0 = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb1 = &entities.NodebInfo{RanName: "test2", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) +// readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) +// writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) +// +// payload := e2pdus.PackedX2setupRequest +// xaction := []byte(RanName) +// msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") +// readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) +// httpClientMock.AssertNotCalled(t, "Post", mock.Anything, mock.Anything, mock.Anything) +//} + +//func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) { +// _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) +// var rnibErr error +// var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) +// readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) +// +// var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr) +// +// payload := e2pdus.PackedX2setupRequest +// xaction := []byte(RanName) +// msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") +// e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) +// writerMock.AssertExpectations(t) +//} + +//func TestE2TermInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) { +// log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) +// var rnibErr error +// +// ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} +// +// var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr) +// readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, rnibErr) +// readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr) +// +// var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// var argNodeb0Fail = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0} +// writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr) +// writerMock.On("UpdateNodebInfo", argNodeb0Fail).Return(rnibErr) +// +// payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log) +// xaction := []byte(ids[0].InventoryName) +// msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, fmt.Errorf("RMR Error")) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3") +// e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// //test1 (before send +1, after failure +1), test2 (0) test3 (0) +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) +// //test1 failure (+1), test2 (0). test3 (0) +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) +//} + +//func TestE2TermInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) { +// log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) +// var rnibErr error +// +// ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} +// +// var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr) +// readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewResourceNotFoundError("not found")) +// readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr) +// +// var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr) +// writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr) +// +// var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr) +// writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr) +// +// payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log) +// xaction := []byte(ids[0].InventoryName) +// msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3") +// e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// readerMock.AssertNumberOfCalls(t, "GetNodeb", 3) +// //test1 (+1), test2 failure (0) test3 (+1) +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) +// //test1 success (+1), test2 (0). test3 (+1) +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) +//} + +//func TestE2TermInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) { +// log, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) +// var rnibErr error +// +// ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} +// +// var initialNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb1 = &entities.NodebInfo{RanName: ids[1].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", ids[0].InventoryName).Return(initialNodeb0, rnibErr) +// readerMock.On("GetNodeb", ids[1].InventoryName).Return(initialNodeb1, common.NewInternalError(fmt.Errorf("internal error"))) +// readerMock.On("GetNodeb", ids[2].InventoryName).Return(initialNodeb2, rnibErr) +// +// var argNodeb0 = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// var argNodeb0Success = &entities.NodebInfo{RanName: ids[0].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// writerMock.On("UpdateNodebInfo", argNodeb0).Return(rnibErr) +// writerMock.On("UpdateNodebInfo", argNodeb0Success).Return(rnibErr) +// +// var argNodeb2 = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// var argNodeb2Success = &entities.NodebInfo{RanName: ids[2].InventoryName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// writerMock.On("UpdateNodebInfo", argNodeb2).Return(rnibErr) +// writerMock.On("UpdateNodebInfo", argNodeb2Success).Return(rnibErr) +// +// payload := models.NewE2RequestMessage(ids[0].InventoryName /*tid*/, "", 0, ids[0].InventoryName, e2pdus.PackedX2setupRequest).GetMessageAsBytes(log) +// xaction := []byte(ids[0].InventoryName) +// msg0 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ids[0].InventoryName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg0, nil) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, "test1", "test2", "test3") +// e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// readerMock.AssertNumberOfCalls(t, "GetNodeb", 2) +// //test1 (+1), test2 failure (0) test3 (0) +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) +// //test1 success (+1), test2 (0). test3 (+1) +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) +//} func TestE2TermInitHandlerSuccessZeroRans(t *testing.T) { _, handler, _, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) @@ -540,33 +536,33 @@ func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) { rmrMessengerMock.AssertNotCalled(t, "SendMsg") } -func TestE2TermInitHandlerSuccessTwoRansSecondIsDisconnected(t *testing.T) { - _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) - var rnibErr error - var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) - readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) - - var argNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} - writerMock.On("UpdateNodebInfo", argNodeb1).Return(rnibErr) - - payload := e2pdus.PackedX2setupRequest - xaction := []byte(RanName) - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) - - e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") - e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) -} +//func TestE2TermInitHandlerSuccessTwoRansSecondIsDisconnected(t *testing.T) { +// _, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) +// var rnibErr error +// var initialNodeb0 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// var initialNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} +// readerMock.On("GetNodeb", RanName).Return(initialNodeb0, rnibErr) +// readerMock.On("GetNodeb", "test2").Return(initialNodeb1, rnibErr) +// +// var argNodeb1 = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} +// writerMock.On("UpdateNodebInfo", argNodeb1).Return(rnibErr) +// +// payload := e2pdus.PackedX2setupRequest +// xaction := []byte(RanName) +// msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction) +// +// rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) +// +// e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) +// e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName, "test2") +// e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) +// notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} +// +// handler.Handle(notificationRequest) +// +// writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) +// rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) +//} // TODO: extract to test_utils diff --git a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler.go b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler.go index 6c3569f..12d4df1 100644 --- a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler.go @@ -27,14 +27,14 @@ import ( ) type RanLostConnectionHandler struct { - ranReconnectionManager managers.IRanReconnectionManager - logger *logger.Logger + ranDisconnectionManager managers.IRanDisconnectionManager + logger *logger.Logger } -func NewRanLostConnectionHandler(logger *logger.Logger, ranReconnectionManager managers.IRanReconnectionManager) RanLostConnectionHandler { +func NewRanLostConnectionHandler(logger *logger.Logger, ranDisconnectionManager managers.IRanDisconnectionManager) RanLostConnectionHandler { return RanLostConnectionHandler{ - logger: logger, - ranReconnectionManager: ranReconnectionManager, + logger: logger, + ranDisconnectionManager: ranDisconnectionManager, } } func (h RanLostConnectionHandler) Handle(request *models.NotificationRequest) { @@ -43,5 +43,5 @@ func (h RanLostConnectionHandler) Handle(request *models.NotificationRequest) { h.logger.Warnf("#RanLostConnectionHandler.Handle - RAN name: %s - Received lost connection notification", ranName) - _ = h.ranReconnectionManager.ReconnectRan(ranName) + _ = h.ranDisconnectionManager.DisconnectRan(ranName) } diff --git a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go index 836c02a..c0cd787 100644 --- a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go @@ -42,39 +42,36 @@ func TestLostConnectionHandlerSuccess(t *testing.T) { logger, _ := logger.InitLogger(logger.InfoLevel) notificationRequest := models.NotificationRequest{RanName: ranName} - ranReconnectionManagerMock := &mocks.RanReconnectionManagerMock{} - ranReconnectionManagerMock.On("ReconnectRan", ranName).Return(nil) + ranReconnectionManagerMock := &mocks.RanDisconnectionManagerMock{} + ranReconnectionManagerMock.On("DisconnectRan", ranName).Return(nil) handler := NewRanLostConnectionHandler(logger, ranReconnectionManagerMock) handler.Handle(¬ificationRequest) - ranReconnectionManagerMock.AssertCalled(t, "ReconnectRan", ranName) + ranReconnectionManagerMock.AssertCalled(t, "DisconnectRan", ranName) } func TestLostConnectionHandlerFailure(t *testing.T) { logger, _ := logger.InitLogger(logger.InfoLevel) notificationRequest := models.NotificationRequest{RanName: ranName} - ranReconnectionManagerMock := &mocks.RanReconnectionManagerMock{} - ranReconnectionManagerMock.On("ReconnectRan", ranName).Return(errors.New("error")) + ranReconnectionManagerMock := &mocks.RanDisconnectionManagerMock{} + ranReconnectionManagerMock.On("DisconnectRan", ranName).Return(errors.New("error")) handler := NewRanLostConnectionHandler(logger, ranReconnectionManagerMock) handler.Handle(¬ificationRequest) - ranReconnectionManagerMock.AssertCalled(t, "ReconnectRan", ranName) + ranReconnectionManagerMock.AssertCalled(t, "DisconnectRan", ranName) } func setupLostConnectionHandlerTestWithRealReconnectionManager(t *testing.T, isSuccessfulHttpPost bool) (RanLostConnectionHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) { logger, _ := logger.InitLogger(logger.InfoLevel) config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} - rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrSender := initRmrSender(rmrMessengerMock, logger) readerMock := &mocks.RnibReaderMock{} writerMock := &mocks.RnibWriterMock{} rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) - ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService) httpClientMock := &mocks.HttpClientMock{} routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock) e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager) + ranReconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) handler := NewRanLostConnectionHandler(logger, ranReconnectionManager) origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 20, AssociatedE2TInstanceAddress: e2tAddress} @@ -87,10 +84,10 @@ func setupLostConnectionHandlerTestWithRealReconnectionManager(t *testing.T, isS updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED updatedNodebInfo2.AssociatedE2TInstanceAddress = "" writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(rnibErr) - e2tInstance := &entities.E2TInstance{Address: e2tAddress, AssociatedRanList:[]string{ranName}} + e2tInstance := &entities.E2TInstance{Address: e2tAddress, AssociatedRanList: []string{ranName}} readerMock.On("GetE2TInstance", e2tAddress).Return(e2tInstance, nil) e2tInstanceToSave := *e2tInstance - e2tInstanceToSave .AssociatedRanList = []string{} + e2tInstanceToSave.AssociatedRanList = []string{} writerMock.On("SaveE2TInstance", &e2tInstanceToSave).Return(nil) mockHttpClient(httpClientMock, isSuccessfulHttpPost) diff --git a/E2Manager/managers/ran_disconnection_manager.go b/E2Manager/managers/ran_disconnection_manager.go new file mode 100644 index 0000000..3c4479a --- /dev/null +++ b/E2Manager/managers/ran_disconnection_manager.go @@ -0,0 +1,93 @@ +// +// Copyright 2019 AT&T Intellectual Property +// Copyright 2019 Nokia +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This source code is part of the near-RT RIC (RAN Intelligent Controller) +// platform project (RICP). + +package managers + +import ( + "e2mgr/configuration" + "e2mgr/logger" + "e2mgr/services" + "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" +) + +type IRanDisconnectionManager interface { + DisconnectRan(inventoryName string) error +} + +type RanDisconnectionManager struct { + logger *logger.Logger + config *configuration.Configuration + rnibDataService services.RNibDataService + ranSetupManager *RanSetupManager + e2tAssociationManager *E2TAssociationManager +} + +func NewRanDisconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, e2tAssociationManager *E2TAssociationManager) *RanDisconnectionManager { + return &RanDisconnectionManager{ + logger: logger, + config: config, + rnibDataService: rnibDataService, + e2tAssociationManager: e2tAssociationManager, + } +} + +func (m *RanDisconnectionManager) DisconnectRan(inventoryName string) error { + nodebInfo, err := m.rnibDataService.GetNodeb(inventoryName) + + if err != nil { + m.logger.Errorf("#RanDisconnectionManager.DisconnectRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, err) + return err + } + + connectionStatus := nodebInfo.GetConnectionStatus() + m.logger.Infof("#RanDisconnectionManager.DisconnectRan - RAN name: %s - RAN's connection status: %s", nodebInfo.RanName, connectionStatus) + + + if connectionStatus == entities.ConnectionStatus_SHUT_DOWN { + m.logger.Warnf("#RanDisconnectionManager.DisconnectRan - RAN name: %s - quit. RAN's connection status is SHUT_DOWN", nodebInfo.RanName) + return nil + } + + if connectionStatus == entities.ConnectionStatus_SHUTTING_DOWN { + return m.updateNodebInfo(nodebInfo, entities.ConnectionStatus_SHUT_DOWN) + } + + err = m.updateNodebInfo(nodebInfo, entities.ConnectionStatus_DISCONNECTED) + + if err != nil { + return err; + } + + e2tAddress := nodebInfo.AssociatedE2TInstanceAddress + return m.e2tAssociationManager.DissociateRan(e2tAddress, nodebInfo.RanName) +} + +func (m *RanDisconnectionManager) updateNodebInfo(nodebInfo *entities.NodebInfo, connectionStatus entities.ConnectionStatus) error { + + nodebInfo.ConnectionStatus = connectionStatus; + err := m.rnibDataService.UpdateNodebInfo(nodebInfo) + + if err != nil { + m.logger.Errorf("#RanDisconnectionManager.updateNodebInfo - RAN name: %s - Failed updating RAN's connection status to %s in rNib. Error: %v", nodebInfo.RanName, connectionStatus, err) + return err + } + + m.logger.Infof("#RanDisconnectionManager.updateNodebInfo - RAN name: %s - Successfully updated rNib. RAN's current connection status: %s", nodebInfo.RanName, nodebInfo.ConnectionStatus) + return nil +} diff --git a/E2Manager/managers/ran_reconnection_manager_test.go b/E2Manager/managers/ran_disconnection_manager_test.go similarity index 65% rename from E2Manager/managers/ran_reconnection_manager_test.go rename to E2Manager/managers/ran_disconnection_manager_test.go index 7927d0c..fbddb40 100644 --- a/E2Manager/managers/ran_reconnection_manager_test.go +++ b/E2Manager/managers/ran_disconnection_manager_test.go @@ -17,7 +17,6 @@ // This source code is part of the near-RT RIC (RAN Intelligent Controller) // platform project (RICP). - package managers import ( @@ -33,14 +32,13 @@ import ( "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "github.com/pkg/errors" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "testing" ) const ranName = "test" const e2tAddress = "10.10.2.15:9800" -func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *RanReconnectionManager, *mocks.HttpClientMock) { +func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *RanDisconnectionManager, *mocks.HttpClientMock) { logger, err := logger.InitLogger(logger.DebugLevel) if err != nil { t.Errorf("#... - failed to initialize logger, error: %s", err) @@ -48,19 +46,14 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessenge config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrSender := initRmrSender(rmrMessengerMock, logger) - readerMock := &mocks.RnibReaderMock{} - writerMock := &mocks.RnibWriterMock{} - rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) e2tInstancesManager := NewE2TInstancesManager(rnibDataService, logger) - ranSetupManager := NewRanSetupManager(logger, rmrSender, rnibDataService) httpClient := &mocks.HttpClientMock{} routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient) e2tAssociationManager := NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) - ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager) + ranReconnectionManager := NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) return logger, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager, httpClient } @@ -69,7 +62,7 @@ func TestRanReconnectionGetNodebFailure(t *testing.T) { var nodebInfo *entities.NodebInfo readerMock.On("GetNodeb", ranName).Return(nodebInfo, common.NewInternalError(errors.New("Error"))) - err := ranReconnectionManager.ReconnectRan(ranName) + err := ranReconnectionManager.DisconnectRan(ranName) assert.NotNil(t, err) readerMock.AssertCalled(t, "GetNodeb", ranName) writerMock.AssertNotCalled(t, "UpdateNodebInfo") @@ -81,7 +74,7 @@ func TestShutdownRanReconnection(t *testing.T) { origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN} var rnibErr error readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr) - err := ranReconnectionManager.ReconnectRan(ranName) + err := ranReconnectionManager.DisconnectRan(ranName) assert.Nil(t, err) readerMock.AssertCalled(t, "GetNodeb", ranName) writerMock.AssertNotCalled(t, "UpdateNodebInfo") @@ -96,16 +89,16 @@ func TestShuttingdownRanReconnection(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(rnibErr) - err := ranReconnectionManager.ReconnectRan(ranName) + err := ranReconnectionManager.DisconnectRan(ranName) assert.Nil(t, err) readerMock.AssertCalled(t, "GetNodeb", ranName) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) } -func TestConnectingRanWithMaxAttemptsReconnectionDissociateSucceeds(t *testing.T) { - _, _, readerMock, writerMock, ranReconnectionManager, httpClient:= initRanLostConnectionTest(t) +func TestConnectingRanDissociateSucceeds(t *testing.T) { + _, _, readerMock, writerMock, ranReconnectionManager, httpClient := initRanLostConnectionTest(t) - origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 20, AssociatedE2TInstanceAddress: E2TAddress} + origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING, AssociatedE2TInstanceAddress: E2TAddress} var rnibErr error readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr) updatedNodebInfo1 := *origNodebInfo @@ -115,22 +108,22 @@ func TestConnectingRanWithMaxAttemptsReconnectionDissociateSucceeds(t *testing.T updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED updatedNodebInfo2.AssociatedE2TInstanceAddress = "" writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(rnibErr) - e2tInstance := &entities.E2TInstance{Address: E2TAddress, AssociatedRanList:[]string{ranName}} + e2tInstance := &entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{ranName}} readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil) e2tInstanceToSave := * e2tInstance - e2tInstanceToSave .AssociatedRanList = []string{} + e2tInstanceToSave.AssociatedRanList = []string{} writerMock.On("SaveE2TInstance", &e2tInstanceToSave).Return(nil) mockHttpClient(httpClient, clients.DissociateRanE2TInstanceApiSuffix, true) - err := ranReconnectionManager.ReconnectRan(ranName) + err := ranReconnectionManager.DisconnectRan(ranName) assert.Nil(t, err) readerMock.AssertCalled(t, "GetNodeb", ranName) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) } -func TestConnectingRanWithMaxAttemptsReconnectionDissociateFails(t *testing.T) { +func TestConnectingRanDissociateFails(t *testing.T) { _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t) - origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 20, AssociatedE2TInstanceAddress: e2tAddress} + origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING, AssociatedE2TInstanceAddress: e2tAddress} var rnibErr error readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr) updatedNodebInfo1 := *origNodebInfo @@ -140,15 +133,16 @@ func TestConnectingRanWithMaxAttemptsReconnectionDissociateFails(t *testing.T) { updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED updatedNodebInfo2.AssociatedE2TInstanceAddress = "" writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(rnibErr) - e2tInstance := &entities.E2TInstance{Address:e2tAddress, AssociatedRanList:[]string{ranName}} - readerMock.On("GetE2TInstance",e2tAddress).Return(e2tInstance, common.NewInternalError(errors.New("Error"))) - err := ranReconnectionManager.ReconnectRan(ranName) + e2tInstance := &entities.E2TInstance{Address: e2tAddress, AssociatedRanList: []string{ranName}} + readerMock.On("GetE2TInstance", e2tAddress).Return(e2tInstance, common.NewInternalError(errors.New("Error"))) + err := ranReconnectionManager.DisconnectRan(ranName) assert.NotNil(t, err) readerMock.AssertCalled(t, "GetNodeb", ranName) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) writerMock.AssertNotCalled(t, "SaveE2TInstance", ) } +// TODO: change test function name func TestUnconnectableRanUpdateNodebInfoFailure(t *testing.T) { _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t) @@ -158,53 +152,12 @@ func TestUnconnectableRanUpdateNodebInfoFailure(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(common.NewInternalError(errors.New("Error"))) - err := ranReconnectionManager.ReconnectRan(ranName) + err := ranReconnectionManager.DisconnectRan(ranName) assert.NotNil(t, err) readerMock.AssertCalled(t, "GetNodeb", ranName) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) } -func TestConnectedRanExecuteSetupSuccess(t *testing.T) { - _, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t) - - origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} - var rnibErr error - readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr) - updatedNodebInfo := *origNodebInfo - updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTING - updatedNodebInfo.ConnectionAttempts++ - writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(nil) - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, nil) - err := ranReconnectionManager.ReconnectRan(ranName) - assert.Nil(t, err) - readerMock.AssertCalled(t, "GetNodeb", ranName) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) -} - -func TestConnectedRanExecuteSetupFailure(t *testing.T) { - _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t) - - origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTED} - var rnibErr error - readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr) - updatedNodebInfo := *origNodebInfo - updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTING - updatedNodebInfo.ConnectionAttempts++ - writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(common.NewInternalError(errors.New("Error"))) - err := ranReconnectionManager.ReconnectRan(ranName) - assert.NotNil(t, err) - readerMock.AssertCalled(t, "GetNodeb", ranName) - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) -} - -func TestNoSetConnectionStatus(t *testing.T) { - _, _, _, _, ranReconnectionManager, _ := initRanLostConnectionTest(t) - nodebInfo := &entities.NodebInfo{RanName: "ranName", GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTED} - err := ranReconnectionManager.updateUnconnectableRan(nodebInfo) - assert.Nil(t, err) -} - func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender { rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock) rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger) diff --git a/E2Manager/managers/ran_reconnection_manager.go b/E2Manager/managers/ran_reconnection_manager.go deleted file mode 100644 index b733142..0000000 --- a/E2Manager/managers/ran_reconnection_manager.go +++ /dev/null @@ -1,131 +0,0 @@ -// -// Copyright 2019 AT&T Intellectual Property -// Copyright 2019 Nokia -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This source code is part of the near-RT RIC (RAN Intelligent Controller) -// platform project (RICP). - - -package managers - -import ( - "e2mgr/configuration" - "e2mgr/logger" - "e2mgr/services" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" -) - -type IRanReconnectionManager interface { - ReconnectRan(inventoryName string) error -} - -type RanReconnectionManager struct { - logger *logger.Logger - config *configuration.Configuration - rnibDataService services.RNibDataService - ranSetupManager *RanSetupManager - e2tAssociationManager *E2TAssociationManager -} - -func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, ranSetupManager *RanSetupManager, e2tAssociationManager *E2TAssociationManager) *RanReconnectionManager { - return &RanReconnectionManager{ - logger: logger, - config: config, - rnibDataService: rnibDataService, - ranSetupManager: ranSetupManager, - e2tAssociationManager: e2tAssociationManager, - } -} - -func (m *RanReconnectionManager) isRanExceededConnectionAttempts(nodebInfo *entities.NodebInfo) bool { - return int(nodebInfo.GetConnectionAttempts()) >= m.config.MaxConnectionAttempts -} - -func (m *RanReconnectionManager) ReconnectRan(inventoryName string) error { - nodebInfo, rnibErr := m.rnibDataService.GetNodeb(inventoryName) - - if rnibErr != nil { - m.logger.Errorf("#RanReconnectionManager.ReconnectRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, rnibErr) - return rnibErr - } - - m.logger.Infof("#RanReconnectionManager.ReconnectRan - RAN name: %s - RAN's connection status: %s, RAN's connection attempts: %d", nodebInfo.RanName, nodebInfo.ConnectionStatus, nodebInfo.ConnectionAttempts) - - if !m.canReconnectRan(nodebInfo) { - e2tAddress := nodebInfo.AssociatedE2TInstanceAddress - err := m.updateUnconnectableRan(nodebInfo) - - if err != nil { - return err - } - - if m.isRanExceededConnectionAttempts(nodebInfo) { - return m.e2tAssociationManager.DissociateRan(e2tAddress, nodebInfo.RanName) - } - - return nil - } - - err := m.ranSetupManager.ExecuteSetup(nodebInfo, entities.ConnectionStatus_CONNECTING) - - if err != nil { - m.logger.Errorf("#RanReconnectionManager.ReconnectRan - RAN name: %s - Failed executing setup. Error: %v", inventoryName, err) - return err - } - - return nil -} - -func (m *RanReconnectionManager) canReconnectRan(nodebInfo *entities.NodebInfo) bool { - connectionStatus := nodebInfo.GetConnectionStatus() - return connectionStatus != entities.ConnectionStatus_SHUT_DOWN && connectionStatus != entities.ConnectionStatus_SHUTTING_DOWN && - int(nodebInfo.GetConnectionAttempts()) < m.config.MaxConnectionAttempts -} - -func (m *RanReconnectionManager) updateNodebInfo(nodebInfo *entities.NodebInfo, connectionStatus entities.ConnectionStatus) error { - - nodebInfo.ConnectionStatus = connectionStatus; - - err := m.rnibDataService.UpdateNodebInfo(nodebInfo) - - if err != nil { - m.logger.Errorf("#RanReconnectionManager.updateNodebInfo - RAN name: %s - Failed updating RAN's connection status to %s in rNib. Error: %v", nodebInfo.RanName, connectionStatus, err) - return err - } - - m.logger.Infof("#RanReconnectionManager.updateNodebInfo - RAN name: %s - Successfully updated rNib. RAN's current connection status: %s", nodebInfo.RanName, nodebInfo.ConnectionStatus) - return nil -} - -func (m *RanReconnectionManager) updateUnconnectableRan(nodebInfo *entities.NodebInfo) error { - connectionStatus := nodebInfo.GetConnectionStatus() - - if connectionStatus == entities.ConnectionStatus_SHUT_DOWN { - m.logger.Warnf("#RanReconnectionManager.updateUnconnectableRan - RAN name: %s - Cannot reconnect RAN. Reason: connection status is SHUT_DOWN", nodebInfo.RanName) - return nil - } - - if connectionStatus == entities.ConnectionStatus_SHUTTING_DOWN { - m.logger.Warnf("#RanReconnectionManager.updateUnconnectableRan - RAN name: %s - Cannot reconnect RAN. Reason: connection status is SHUTTING_DOWN", nodebInfo.RanName) - return m.updateNodebInfo(nodebInfo, entities.ConnectionStatus_SHUT_DOWN) - } - - if m.isRanExceededConnectionAttempts(nodebInfo) { - m.logger.Warnf("#RanReconnectionManager.updateUnconnectableRan - RAN name: %s - Cannot reconnect RAN. Reason: RAN's connection attempts exceeded the limit (%d)", nodebInfo.RanName, m.config.MaxConnectionAttempts) - return m.updateNodebInfo(nodebInfo, entities.ConnectionStatus_DISCONNECTED) - } - - return nil -} diff --git a/E2Manager/mocks/ran_reconnection_manager_mock.go b/E2Manager/mocks/ran_reconnection_manager_mock.go index 8a3b249..18edaaf 100644 --- a/E2Manager/mocks/ran_reconnection_manager_mock.go +++ b/E2Manager/mocks/ran_reconnection_manager_mock.go @@ -22,11 +22,11 @@ import ( "github.com/stretchr/testify/mock" ) -type RanReconnectionManagerMock struct { +type RanDisconnectionManagerMock struct { mock.Mock } -func (m *RanReconnectionManagerMock) ReconnectRan(inventoryName string) error { +func (m *RanDisconnectionManagerMock) DisconnectRan(inventoryName string) error { args := m.Called(inventoryName) return args.Error(0) diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go index 3d79c28..1eaa6b5 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go @@ -17,7 +17,6 @@ // This source code is part of the near-RT RIC (RAN Intelligent Controller) // platform project (RICP). - package rmrmsghandlerprovider import ( @@ -69,7 +68,7 @@ func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config x2ResetResponseExtractor := converters.NewX2ResetResponseExtractor(logger) // Init managers - ranReconnectionManager := managers.NewRanReconnectionManager(logger, config, rnibDataService, ranSetupManager, e2tAssociationManager) + ranReconnectionManager := managers.NewRanDisconnectionManager(logger, config, rnibDataService, e2tAssociationManager) ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender) x2SetupResponseManager := managers.NewX2SetupResponseManager(x2SetupResponseConverter) x2SetupFailureResponseManager := managers.NewX2SetupFailureResponseManager(x2SetupFailureResponseConverter) diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go index 5d20a5f..f50001f 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go @@ -64,7 +64,7 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager := initTestCase(t) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager) + ranReconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender) x2SetupResponseConverter := converters.NewX2SetupResponseConverter(logger)