From 25ffe73b7261ce3f87c653062df79ed7d8aa2278 Mon Sep 17 00:00:00 2001 From: ns019t Date: Tue, 7 Apr 2020 12:53:40 +0300 Subject: [PATCH] RIC-193 - E2t association manager: AssociateRan method update + tests fix Change-Id: Ie4b454142cad625b6686feafdd535a3fda96e1fe Signed-off-by: ns019t --- .../httpmsghandlers/setup_request_handler_test.go | 74 +++++++++++----------- .../e2_setup_request_notification_handler.go | 4 -- .../e2_setup_request_notification_handler_test.go | 8 ++- E2Manager/managers/e2t_association_manager.go | 12 ++-- E2Manager/managers/e2t_association_manager_test.go | 15 +++-- 5 files changed, 57 insertions(+), 56 deletions(-) diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go index 7bc67ac..9fc75fe 100644 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go @@ -66,10 +66,10 @@ func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) return readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock } -func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock, *mocks.HttpClientMock) { +func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock, *mocks.HttpClientMock, *mocks.E2TInstancesManagerMock) { log := initLog(t) config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} - + config.RoutingManager.BaseUrl = BaseRMUrl readerMock := &mocks.RnibReaderMock{} writerMock := &mocks.RnibWriterMock{} @@ -78,13 +78,13 @@ func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2Applicatio rmrMessengerMock := &mocks.RmrMessengerMock{} rmrSender := getRmrSender(rmrMessengerMock, log) ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService) - e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log) + e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) - e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) - handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManager, e2tAssociationManager) + e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManagerMock, rmClient) + handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManagerMock, e2tAssociationManager) - return readerMock, writerMock, handler, rmrMessengerMock, httpClientMock + return readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock } func mockHttpClientAssociateRan(httpClientMock *mocks.HttpClientMock) { @@ -156,33 +156,36 @@ func TestSetupNewRanSelectE2TInstancesDbError(t *testing.T) { } func TestSetupNewRanSelectE2TInstancesNoInstances(t *testing.T) { - readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - readerMock.On("GetE2TAddresses").Return([]string{}, nil) + e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) + e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) + setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + nodebInfo, _ := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) + updatedNb := *nodebInfo + updatedNb.ConnectionAttempts = 0 + updatedNb.AssociatedE2TInstanceAddress = E2TAddress + writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil) _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err) - writerMock.AssertNotCalled(t, "SaveNodeb") - rmrMessengerMock.AssertNotCalled(t, "SendMsg") + assert.Nil(t, err) } func TestSetupNewRanAssociateRanFailure(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + readerMock, writerMock, handler, e2tInstancesManagerMock, _, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError()) setupRequest := &models.SetupRequest{"127.0.0.1", 8080, RanName,} nb, nbIdentity := createInitialNodeInfo(setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) writerMock.On("SaveNodeb", nbIdentity, mock.Anything).Return(nil) + writerMock.On("UpdateNodebInfo", nb).Return(nil) nb.AssociatedE2TInstanceAddress = E2TAddress nb.ConnectionAttempts = 0 - writerMock.On("UpdateNodebInfo", nb).Return(nil) + mockHttpClientAssociateRan(httpClientMock) _, err := handler.Handle(*setupRequest) assert.IsType(t, &e2managererrors.RnibDbError{}, err) - writerMock.AssertExpectations(t) - readerMock.AssertExpectations(t) - e2tInstancesManagerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") } func TestSetupNewRanSaveNodebFailure(t *testing.T) { @@ -286,16 +289,17 @@ func TestSetupExistingRanWithoutAssocE2TInstanceSelectDbError(t *testing.T) { } func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceError(t *testing.T) { - readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + readerMock, writerMock, handler, rmrMessengerMock, httpClientMock,e2tInstancesManagerMock:= initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} readerMock.On("GetNodeb", RanName).Return(nb, nil) readerMock.On("GetE2TAddresses").Return([]string{}, nil) - updatedNb := *nb - updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} + e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) + e2tInstancesManagerMock.On("AddRansToInstance", "10.0.2.15:8989", []string{"test"}).Return(nil) + mockHttpClientAssociateRan(httpClientMock) _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err) + assert.IsType(t, &e2managererrors.InternalError{}, err) rmrMessengerMock.AssertNotCalled(t, "SendMsg") writerMock.AssertExpectations(t) } @@ -399,7 +403,7 @@ func TestSetupExistingRanWithAssocE2TInstanceUpdateNodebFailure(t *testing.T) { } func TestSetupExistingRanWithAssocE2TInstanceExecuteSetupRmrError(t *testing.T) { - readerMock, writerMock, handler, rmrMessengerMock, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + readerMock, writerMock, handler, rmrMessengerMock, _, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} readerMock.On("GetNodeb", RanName).Return(nb, nil) updatedNb := *nb @@ -436,22 +440,18 @@ func TestSetupExistingRanWithAssocE2TInstanceConnectedSuccess(t *testing.T) { } func TestSetupExistingRanWithoutAssocE2TInstanceExecuteRoutingManagerError(t *testing.T) { - readerMock, writerMock, handler, _, httpClientMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} readerMock.On("GetNodeb", RanName).Return(nb, nil) - addresses := []string{E2TAddress} - readerMock.On("GetE2TAddresses").Return(addresses, nil) - e2tInstance := &entities.E2TInstance{Address: E2TAddress, State: entities.Active} - readerMock.On("GetE2TInstances", addresses).Return([]*entities.E2TInstance{e2tInstance}, nil) - - data := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)} - marshaled, _ := json.Marshal(data) - body := bytes.NewBuffer(marshaled) - respBody := ioutil.NopCloser(bytes.NewBufferString("")) - httpClientMock.On("Post", clients.AssociateRanToE2TInstanceApiSuffix, "application/json", body).Return(&http.Response{StatusCode: http.StatusBadRequest, Body: respBody}, nil) - + writerMock.On("UpdateNodebInfo", nb).Return(nil) + e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) + mockHttpClientAssociateRan(httpClientMock) + e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) + msg := &rmrCgo.MBuf{} + var errNIl error + rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, errNIl) _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.IsType(t, &e2managererrors.RoutingManagerError{}, err) + assert.Nil(t, err) writerMock.AssertExpectations(t) readerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go index 8271e64..405d30d 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go @@ -113,10 +113,6 @@ func (h E2SetupRequestNotificationHandler) Handle(request *models.NotificationRe err = h.e2tAssociationManager.AssociateRan(e2tIpAddress, nodebInfo) if err != nil{ h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s - failed to associate E2T to nodeB entity. Error: %s", ranName, err) - err = h.rNibDataService.UpdateNodebInfo(nodebInfo) - if err != nil { - h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s - Failed to update nodebInfo entity. Error: %s", ranName, err) - } return } diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go index 6421bf9..c689025 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -305,7 +305,11 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) + e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error")) + var errEmpty error + rmrMessage := &rmrCgo.MBuf{} + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) prefBytes := []byte(prefix) notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlGnb...)} @@ -315,8 +319,8 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything) routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything) writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything) - e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything) - rmrMessengerMock.AssertNotCalled(t, "SendMsg", mock.Anything, mock.Anything) + e2tInstancesManagerMock.AssertCalled(t, "AddRansToInstance", mock.Anything, mock.Anything) + rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, mock.Anything) } diff --git a/E2Manager/managers/e2t_association_manager.go b/E2Manager/managers/e2t_association_manager.go index 822c01a..855ac05 100644 --- a/E2Manager/managers/e2t_association_manager.go +++ b/E2Manager/managers/e2t_association_manager.go @@ -46,12 +46,6 @@ func (m *E2TAssociationManager) AssociateRan(e2tAddress string, nodebInfo *entit ranName := nodebInfo.RanName m.logger.Infof("#E2TAssociationManager.AssociateRan - Associating RAN %s to E2T Instance address: %s", ranName, e2tAddress) - err := m.rmClient.AssociateRanToE2TInstance(e2tAddress, ranName) - if err != nil { - m.logger.Errorf("#E2TAssociationManager.AssociateRan - RoutingManager failure: Failed to associate RAN %s to E2T %s. Error: %s", ranName, e2tAddress, err) - return err - } - nodebInfo.AssociatedE2TInstanceAddress = e2tAddress nodebInfo.ConnectionAttempts = 0 @@ -61,11 +55,15 @@ func (m *E2TAssociationManager) AssociateRan(e2tAddress string, nodebInfo *entit return rnibErr } - err = m.e2tInstanceManager.AddRansToInstance(e2tAddress, []string{ranName}) + err := m.e2tInstanceManager.AddRansToInstance(e2tAddress, []string{ranName}) if err != nil { m.logger.Errorf("#E2TAssociationManager.AssociateRan - RAN name: %s - Failed to add RAN to E2T instance %s. Error: %s", ranName, e2tAddress, err) return err } + err = m.rmClient.AssociateRanToE2TInstance(e2tAddress, ranName) + if err != nil { + m.logger.Errorf("#E2TAssociationManager.AssociateRan - RoutingManager failure: Failed to associate RAN %s to E2T %s. Error: %s", ranName, e2tAddress, err) + } m.logger.Infof("#E2TAssociationManager.AssociateRan - successfully associated RAN %s with E2T %s", ranName, e2tAddress) return nil } diff --git a/E2Manager/managers/e2t_association_manager_test.go b/E2Manager/managers/e2t_association_manager_test.go index 73be905..994dd40 100644 --- a/E2Manager/managers/e2t_association_manager_test.go +++ b/E2Manager/managers/e2t_association_manager_test.go @@ -31,6 +31,7 @@ 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" "io/ioutil" "net/http" "testing" @@ -93,12 +94,14 @@ func TestAssociateRanSuccess(t *testing.T) { func TestAssociateRanRoutingManagerError(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, false) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1} + writerMock.On("UpdateNodebInfo", nb).Return(nil) + e2tInstance := &entities.E2TInstance{Address: E2TAddress} + readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil) + writerMock.On("SaveE2TInstance", mock.Anything).Return(nil) err := manager.AssociateRan(E2TAddress, nb) - assert.NotNil(t, err) - assert.IsType(t, &e2managererrors.RoutingManagerError{}, err) + assert.Nil(t, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) @@ -106,7 +109,7 @@ func TestAssociateRanRoutingManagerError(t *testing.T) { func TestAssociateRanUpdateNodebError(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) + //mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1} updatedNb := *nb updatedNb.ConnectionAttempts = 0 @@ -124,7 +127,7 @@ func TestAssociateRanUpdateNodebError(t *testing.T) { func TestAssociateRanGetE2tInstanceError(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) + //mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1} updatedNb := *nb updatedNb.ConnectionAttempts = 0 @@ -144,7 +147,7 @@ func TestAssociateRanGetE2tInstanceError(t *testing.T) { func TestAssociateRanSaveE2tInstanceError(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) + //mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1} updatedNb := *nb updatedNb.ConnectionAttempts = 0 -- 2.16.6