From: Amichai Date: Thu, 27 Feb 2020 14:50:22 +0000 (+0200) Subject: [RIC-198]- No reassociations during e2t shutdown + fix tests X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=d2ad088bc2621c1dcd556b160c78f1e1bb2e79a6;p=ric-plt%2Fe2mgr.git [RIC-198]- No reassociations during e2t shutdown + fix tests Change-Id: I1431ca40318e3ad62c35fc9695b18b8d82b0809c Signed-off-by: Amichai --- diff --git a/E2Manager/app/main.go b/E2Manager/app/main.go index 6f180e3..719e8d7 100644 --- a/E2Manager/app/main.go +++ b/E2Manager/app/main.go @@ -60,7 +60,7 @@ func main() { e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) routingManagerClient := clients.NewRoutingManagerClient(logger, config, clients.NewHttpClient()) e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) - e2tShutdownManager := managers.NewE2TShutdownManager(logger, config, rnibDataService, e2tInstancesManager, e2tAssociationManager, ranSetupManager) + e2tShutdownManager := managers.NewE2TShutdownManager(logger, config, rnibDataService, e2tInstancesManager, e2tAssociationManager) e2tKeepAliveWorker := managers.NewE2TKeepAliveWorker(logger, rmrSender, e2tInstancesManager, e2tShutdownManager, config) rmrNotificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider() rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager) diff --git a/E2Manager/clients/routing_manager_client.go b/E2Manager/clients/routing_manager_client.go index 318b7cf..2625612 100644 --- a/E2Manager/clients/routing_manager_client.go +++ b/E2Manager/clients/routing_manager_client.go @@ -47,7 +47,7 @@ type IRoutingManagerClient interface { AssociateRanToE2TInstance(e2tAddress string, ranName string) error DissociateRanE2TInstance(e2tAddress string, ranName string) error DissociateAllRans(e2tAddresses []string) error - DeleteE2TInstance(e2tAddress string, ransToBeDissociated []string, e2tToRansAssociations map[string][]string) error + DeleteE2TInstance(e2tAddress string, ransToBeDissociated []string) error } func NewRoutingManagerClient(logger *logger.Logger, config *configuration.Configuration, httpClient IHttpClient) *RoutingManagerClient { @@ -90,9 +90,8 @@ func (c *RoutingManagerClient) DissociateAllRans(e2tAddresses []string) error { return c.PostMessage(url, data) } -func (c *RoutingManagerClient) DeleteE2TInstance(e2tAddress string, ransTobeDissociated []string, e2tToRansAssociations map[string][]string) error { - e2tDataList := convertE2TToRansAssociationsMapToE2TDataList(e2tToRansAssociations) - data := models.NewRoutingManagerDeleteRequestModel(e2tAddress, ransTobeDissociated, e2tDataList) +func (c *RoutingManagerClient) DeleteE2TInstance(e2tAddress string, ransTobeDissociated []string) error { + data := models.NewRoutingManagerDeleteRequestModel(e2tAddress, ransTobeDissociated, nil) url := c.config.RoutingManager.BaseUrl + DeleteE2TInstanceApiSuffix return c.DeleteMessage(url, data) } diff --git a/E2Manager/clients/routing_manager_client_test.go b/E2Manager/clients/routing_manager_client_test.go index 2af458c..bf5f82c 100644 --- a/E2Manager/clients/routing_manager_client_test.go +++ b/E2Manager/clients/routing_manager_client_test.go @@ -50,50 +50,38 @@ func initRoutingManagerClientTest(t *testing.T) (*RoutingManagerClient, *mocks.H func TestDeleteE2TInstanceSuccess(t *testing.T) { rmClient, httpClientMock, config := initRoutingManagerClientTest(t) - e2tToRansAssociations := map[string][]string{ - E2TAddress2: {"test1"}, - } - e2tDataList := convertE2TToRansAssociationsMapToE2TDataList(e2tToRansAssociations) - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"},e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"}, nil) marshaled, _ := json.Marshal(data) body := bytes.NewBuffer(marshaled) url := config.RoutingManager.BaseUrl + "e2t" respBody := ioutil.NopCloser(bytes.NewBufferString("")) httpClientMock.On("Delete", url, "application/json", body).Return(&http.Response{StatusCode: http.StatusOK, Body: respBody}, nil) - err := rmClient.DeleteE2TInstance(E2TAddress, []string{"test1"}, e2tToRansAssociations) + err := rmClient.DeleteE2TInstance(E2TAddress, []string{"test1"}) assert.Nil(t, err) } func TestDeleteE2TInstanceFailure(t *testing.T) { rmClient, httpClientMock, config := initRoutingManagerClientTest(t) - e2tToRansAssociations := map[string][]string{ - E2TAddress2: {"test1"}, - } - e2tDataList := convertE2TToRansAssociationsMapToE2TDataList(e2tToRansAssociations) - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"},e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"},nil) marshaled, _ := json.Marshal(data) body := bytes.NewBuffer(marshaled) url := config.RoutingManager.BaseUrl + "e2t" respBody := ioutil.NopCloser(bytes.NewBufferString("")) httpClientMock.On("Delete", url, "application/json", body).Return(&http.Response{StatusCode: http.StatusBadRequest, Body: respBody}, nil) - err := rmClient.DeleteE2TInstance(E2TAddress, []string{"test1"}, e2tToRansAssociations) + err := rmClient.DeleteE2TInstance(E2TAddress, []string{"test1"}) assert.IsType(t, &e2managererrors.RoutingManagerError{}, err) } func TestDeleteE2TInstanceDeleteFailure(t *testing.T) { rmClient, httpClientMock, config := initRoutingManagerClientTest(t) - e2tToRansAssociations := map[string][]string{ - E2TAddress2: {"test1"}, - } - e2tDataList := convertE2TToRansAssociationsMapToE2TDataList(e2tToRansAssociations) - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"},e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"},nil) marshaled, _ := json.Marshal(data) body := bytes.NewBuffer(marshaled) url := config.RoutingManager.BaseUrl + "e2t" httpClientMock.On("Delete", url, "application/json", body).Return(&http.Response{}, errors.New("error")) - err := rmClient.DeleteE2TInstance(E2TAddress, []string{"test1"}, e2tToRansAssociations) + err := rmClient.DeleteE2TInstance(E2TAddress, []string{"test1"}) assert.IsType(t, &e2managererrors.RoutingManagerError{}, err) } diff --git a/E2Manager/go.mod b/E2Manager/go.mod index 59a3fc9..8cd3f48 100644 --- a/E2Manager/go.mod +++ b/E2Manager/go.mod @@ -1,9 +1,9 @@ module e2mgr require ( - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.29 - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.29 - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.29 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.30 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.30 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.30 gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.5.2 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/go-ozzo/ozzo-validation v3.5.0+incompatible diff --git a/E2Manager/go.sum b/E2Manager/go.sum index ad692e7..1f1691a 100644 --- a/E2Manager/go.sum +++ b/E2Manager/go.sum @@ -1,10 +1,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.29 h1:T0ydbEy2pmP2n8A/eyx5iF5PNm0XYa3A5G5HmXsN0Wo= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.29/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.29 h1:H/6CeGFUwS4S1DJ2OVwjt/qKmm/VTdgcgHcxBJfrQt4= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.29/go.mod h1:Fh23KkroYw5CRBh39WzZzxpKSkpQWL3scdzGnMngLo8= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.29 h1:eke+zU8y2gQmEBxAQryBXwBWwvXSHeu+pC11t8luQBQ= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.29/go.mod h1:EPOJ7YGXDS5F+IK1pa9cv2JYlj73PYOXVvgolhhCSfM= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.30 h1:GuA/5jPx+Srjcs38Bja0392Ht+7ubUOyBbCAp4QRCJY= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.30/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.30 h1:MBOyQeDNA+8rs8OSsEIuh7oHhO/5v7ISimd/BMRhLYA= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.30/go.mod h1:Fh23KkroYw5CRBh39WzZzxpKSkpQWL3scdzGnMngLo8= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.30 h1:fL5qY6KS5RRxvduCnXeK8fWj7YUF1p9b9ObduFSSlRs= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.30/go.mod h1:HeUXZTDqAaGYiVVcWrHwgY0qDNQ6Rt6nZSvWdMueDNc= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2 h1:UK7awyRKIkVdokWvvkYvazlg3EWIfMnIqCcJxTnLlDA= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2/go.mod h1:y2WhrCvdLkAKdH+ySdHSOSehACJkTMyZghCGVcqoZzc= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= diff --git a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go index c36438d..4987ef1 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go @@ -88,13 +88,6 @@ func (h E2TermInitNotificationHandler) Handle(request *models.NotificationReques return } - if e2tInstance.State == entities.RoutingManagerFailure { - err := h.e2tInstancesManager.SetE2tInstanceState(e2tAddress, e2tInstance.State, entities.Active) - if err != nil { - return - } - } - h.HandleExistingE2TInstance(e2tInstance) h.logger.Infof("#E2TermInitNotificationHandler.Handle - Completed handling of E2_TERM_INIT") 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 6c830b1..e06b37f 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go @@ -36,7 +36,6 @@ import ( "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "github.com/pkg/errors" "github.com/stretchr/testify/mock" "io/ioutil" "net/http" @@ -152,23 +151,6 @@ func TestE2TermInitNewE2TInstance(t *testing.T) { writerMock.AssertCalled(t, "SaveE2TAddresses", e2tAddresses) } -func TestE2TermInitNewE2TInstance_RoutingManagerError(t *testing.T) { - _, config, handler, readerMock, writerMock, _, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) - var e2tInstance *entities.E2TInstance - - readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found")) - - url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix - httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{}, errors.New("error")) - - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - handler.Handle(notificationRequest) - - httpClientMock.AssertCalled(t, "Post", url, mock.Anything, mock.Anything) - writerMock.AssertNotCalled(t, "SaveE2TInstance", mock.Anything) - writerMock.AssertNotCalled(t, "SaveE2TAddresses", mock.Anything) -} - func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) { _, handler, _, _, _, e2tInstancesManagerMock, _ := initRanLostConnectionTest(t) e2tInstance := entities.NewE2TInstance(e2tInstanceAddress) @@ -262,72 +244,6 @@ 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 TestE2TermInitHandlerSuccessOneRan_RoutingManagerFailure_Error(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.State = entities.RoutingManagerFailure - e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName) - - e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) - e2tInstancesManagerMock.On("SetE2tInstanceState", e2tInstanceAddress, e2tInstance.State, entities.Active).Return(fmt.Errorf(" Error ")) - writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr) - - notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} - - handler.Handle(notificationRequest) - - writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) -} - //func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) { // _, _, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock:= initRanLostConnectionTestWithRealE2tInstanceManager(t) // var rnibErr error diff --git a/E2Manager/managers/e2t_association_manager.go b/E2Manager/managers/e2t_association_manager.go index 1b105b0..822c01a 100644 --- a/E2Manager/managers/e2t_association_manager.go +++ b/E2Manager/managers/e2t_association_manager.go @@ -101,14 +101,13 @@ func (m *E2TAssociationManager) DissociateRan(e2tAddress string, ranName string) return nil } -func (m *E2TAssociationManager) RemoveE2tInstance(e2tInstance *entities.E2TInstance, ransToBeDissociated []string, ranAssociationList map[string][]string) error { - m.logger.Infof("#E2TAssociationManager.RemoveE2tInstance - Removing E2T %s and re-associating its associated RANs.", e2tInstance.Address) +func (m *E2TAssociationManager) RemoveE2tInstance(e2tInstance *entities.E2TInstance) error { + m.logger.Infof("#E2TAssociationManager.RemoveE2tInstance - Removing E2T %s and dessociating its associated RANs.", e2tInstance.Address) - err := m.rmClient.DeleteE2TInstance(e2tInstance.Address, ransToBeDissociated, ranAssociationList) + err := m.rmClient.DeleteE2TInstance(e2tInstance.Address, e2tInstance.AssociatedRanList) if err != nil { - _ = m.setStateToRoutingManagerFailure(e2tInstance) - m.logger.Errorf("#E2TAssociationManager.RemoveE2tInstance - RoutingManager failure: Failed to delete E2T %s. Error: %s", e2tInstance.Address, err) - return err + m.logger.Warnf("#E2TAssociationManager.RemoveE2tInstance - RoutingManager failure: Failed to delete E2T %s. Error: %s", e2tInstance.Address, err) + // log and continue } err = m.e2tInstanceManager.RemoveE2TInstance(e2tInstance.Address) @@ -117,23 +116,6 @@ func (m *E2TAssociationManager) RemoveE2tInstance(e2tInstance *entities.E2TInsta return err } - for e2tAddress, associatedRans := range ranAssociationList { - err = m.e2tInstanceManager.AddRansToInstance(e2tAddress, associatedRans) - if err != nil { - m.logger.Errorf("#E2TAssociationManager.RemoveE2tInstance - Failed to add RANs %s to E2T %s. Error: %s", associatedRans, e2tAddress, err) - return err - } - } - m.logger.Infof("#E2TAssociationManager.RemoveE2tInstance - E2T %s successfully removed.", e2tInstance.Address) return nil } - -func (m *E2TAssociationManager) setStateToRoutingManagerFailure(e2tInstance *entities.E2TInstance) error { - - err := m.e2tInstanceManager.SetE2tInstanceState(e2tInstance.Address, e2tInstance.State, entities.RoutingManagerFailure) - if err != nil { - return err - } - return nil -} diff --git a/E2Manager/managers/e2t_association_manager_test.go b/E2Manager/managers/e2t_association_manager_test.go index 3f31f6b..73be905 100644 --- a/E2Manager/managers/e2t_association_manager_test.go +++ b/E2Manager/managers/e2t_association_manager_test.go @@ -31,7 +31,6 @@ 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" @@ -285,43 +284,6 @@ func TestDissociateRanRoutingManagerError(t *testing.T) { httpClientMock.AssertExpectations(t) } -func TestRemoveE2tInstanceSuccess(t *testing.T) { - manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, RanName), models.NewRoutingManagerE2TData(E2TAddress3, "test1")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) - mockHttpClientDelete(httpClientMock, data, true) - - writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) - e2tAddresses := []string{E2TAddress, E2TAddress2, E2TAddress3} - readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) - e2tAddressesNew := []string{E2TAddress2, E2TAddress3} - writerMock.On("SaveE2TAddresses", e2tAddressesNew).Return(nil) - - e2tInstance1 := &entities.E2TInstance{Address: E2TAddress} - e2tInstance2 := &entities.E2TInstance{Address: E2TAddress2} - readerMock.On("GetE2TInstance", E2TAddress2).Return(e2tInstance2, nil) - e2tInstance3 := &entities.E2TInstance{Address: E2TAddress3} - readerMock.On("GetE2TInstance", E2TAddress3).Return(e2tInstance3, nil) - - e2tInstance2updated := *e2tInstance2 - e2tInstance2updated.AssociatedRanList = []string{RanName} - writerMock.On("SaveE2TInstance", &e2tInstance2updated).Return(nil) - e2tInstance3updated := *e2tInstance3 - e2tInstance3updated.AssociatedRanList = []string{"test1"} - writerMock.On("SaveE2TInstance", &e2tInstance3updated).Return(nil) - - ranNamesToBeAssociated := make(map[string][]string) - ranNamesToBeAssociated[E2TAddress2] = []string{RanName} - ranNamesToBeAssociated[E2TAddress3] = []string{"test1"} - err := manager.RemoveE2tInstance(e2tInstance1, nil, ranNamesToBeAssociated) - - assert.Nil(t, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) -} - func TestRemoveE2tInstanceSuccessWithOrphans(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) @@ -335,8 +297,8 @@ func TestRemoveE2tInstanceSuccessWithOrphans(t *testing.T) { e2tAddressesNew := []string{} writerMock.On("SaveE2TAddresses", e2tAddressesNew).Return(nil) - e2tInstance1 := &entities.E2TInstance{Address: E2TAddress} - err := manager.RemoveE2tInstance(e2tInstance1, ranNamesToBeDissociated, nil) + e2tInstance1 := &entities.E2TInstance{Address: E2TAddress, AssociatedRanList:ranNamesToBeDissociated} + err := manager.RemoveE2tInstance(e2tInstance1) assert.Nil(t, err) readerMock.AssertExpectations(t) @@ -347,63 +309,20 @@ func TestRemoveE2tInstanceSuccessWithOrphans(t *testing.T) { func TestRemoveE2tInstanceFailureRoutingManager(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"}, e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"}, nil) mockHttpClientDelete(httpClientMock, data, false) - e2tInstance1 := entities.NewE2TInstance(E2TAddress) - e2tInstance1.State = entities.Active - readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, nil) - e2tInstance2 := *e2tInstance1 - e2tInstance2.State = entities.RoutingManagerFailure - writerMock.On("SaveE2TInstance", &e2tInstance2).Return(nil) - ranNamesToBeAssociated := make(map[string][]string) - ranNamesToBeAssociated[E2TAddress] = []string{"test"} - err := manager.RemoveE2tInstance(e2tInstance1, []string{"test1"}, ranNamesToBeAssociated) - - assert.NotNil(t, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) -} - -func TestRemoveE2tInstanceFailureRoutingManagerAndGetInstance(t *testing.T) { - manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"}, e2tDataList) - mockHttpClientDelete(httpClientMock, data, false) - - e2tInstance1 := &entities.E2TInstance{Address: E2TAddress} - readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, e2managererrors.NewRnibDbError()) - ranNamesToBeAssociated := make(map[string][]string) - ranNamesToBeAssociated[E2TAddress] = []string{"test"} - err := manager.RemoveE2tInstance(e2tInstance1, []string{"test1"}, ranNamesToBeAssociated) - - assert.NotNil(t, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) -} - -func TestRemoveE2tInstanceFailureRoutingManagerAndSetInstanceState(t *testing.T) { - manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"}, e2tDataList) - mockHttpClientDelete(httpClientMock, data, false) + writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) + e2tAddresses := []string{E2TAddress} + readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) + e2tAddressesNew := []string{} + writerMock.On("SaveE2TAddresses", e2tAddressesNew).Return(nil) - e2tInstance1 := entities.NewE2TInstance(E2TAddress) - e2tInstance1.State = entities.Active - readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, nil) - e2tInstance2 := *e2tInstance1 - e2tInstance2.State = entities.RoutingManagerFailure - writerMock.On("SaveE2TInstance", &e2tInstance2).Return(e2managererrors.NewRnibDbError()) - ranNamesToBeAssociated := make(map[string][]string) - ranNamesToBeAssociated[E2TAddress] = []string{"test"} - err := manager.RemoveE2tInstance(e2tInstance1, []string{"test1"}, ranNamesToBeAssociated) + e2tInstance1 := &entities.E2TInstance{Address: E2TAddress, AssociatedRanList:[]string{"test1"}} + //readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, e2managererrors.NewRnibDbError()) + err := manager.RemoveE2tInstance(e2tInstance1) - assert.NotNil(t, err) + assert.Nil(t, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) @@ -411,8 +330,7 @@ func TestRemoveE2tInstanceFailureRoutingManagerAndSetInstanceState(t *testing.T) func TestRemoveE2tInstanceFailureInE2TInstanceManager(t *testing.T) { - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"}, e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1"}, nil) manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) mockHttpClientDelete(httpClientMock, data, true) @@ -420,10 +338,8 @@ func TestRemoveE2tInstanceFailureInE2TInstanceManager(t *testing.T) { var e2tAddresses []string readerMock.On("GetE2TAddresses").Return(e2tAddresses, e2managererrors.NewRnibDbError()) - ranNamesToBeAssociated := make(map[string][]string) - ranNamesToBeAssociated[E2TAddress] = []string{"test"} - e2tInstance1 := &entities.E2TInstance{Address: E2TAddress} - err := manager.RemoveE2tInstance(e2tInstance1, []string{"test1"}, ranNamesToBeAssociated) + e2tInstance1 := &entities.E2TInstance{Address: E2TAddress, AssociatedRanList:[]string{"test1"}} + err := manager.RemoveE2tInstance(e2tInstance1) assert.NotNil(t, err) readerMock.AssertExpectations(t) @@ -434,8 +350,7 @@ func TestRemoveE2tInstanceFailureInE2TInstanceManager(t *testing.T) { func TestRemoveE2tInstanceFailureInE2tInstanceAddRansToInstance(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, RanName), models.NewRoutingManagerE2TData(E2TAddress3, "test1")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, nil) mockHttpClientDelete(httpClientMock, data, true) writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) @@ -444,17 +359,10 @@ func TestRemoveE2tInstanceFailureInE2tInstanceAddRansToInstance(t *testing.T) { e2tAddressesNew := []string{E2TAddress2, E2TAddress3} writerMock.On("SaveE2TAddresses", e2tAddressesNew).Return(nil) - var e2tInstance2 *entities.E2TInstance - readerMock.On("GetE2TInstance", mock.Anything).Return(e2tInstance2, e2managererrors.NewRnibDbError()) - - ranNamesToBeAssociated := make(map[string][]string) - ranNamesToBeAssociated[E2TAddress2] = []string{RanName} - ranNamesToBeAssociated[E2TAddress3] = []string{"test1"} - e2tInstance1 := &entities.E2TInstance{Address: E2TAddress} - err := manager.RemoveE2tInstance(e2tInstance1, nil, ranNamesToBeAssociated) + err := manager.RemoveE2tInstance(e2tInstance1) - assert.NotNil(t, err) + assert.Nil(t, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) diff --git a/E2Manager/managers/e2t_instances_manager.go b/E2Manager/managers/e2t_instances_manager.go index d4cc3d8..f8def48 100644 --- a/E2Manager/managers/e2t_instances_manager.go +++ b/E2Manager/managers/e2t_instances_manager.go @@ -371,7 +371,7 @@ func (m *E2TInstancesManager) ResetKeepAliveTimestamp(e2tAddress string) error { return err } - if e2tInstance.State == entities.ToBeDeleted || e2tInstance.State == entities.RoutingManagerFailure { + if e2tInstance.State == entities.ToBeDeleted { m.logger.Warnf("#E2TInstancesManager.ResetKeepAliveTimestamp - Ignore. This Instance is about to be deleted") return nil diff --git a/E2Manager/managers/e2t_instances_manager_test.go b/E2Manager/managers/e2t_instances_manager_test.go index 41fea42..2674349 100644 --- a/E2Manager/managers/e2t_instances_manager_test.go +++ b/E2Manager/managers/e2t_instances_manager_test.go @@ -300,12 +300,12 @@ func TestActivateE2TInstanceSuccess(t *testing.T) { rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) - e2tInstance1.State = entities.RoutingManagerFailure + e2tInstance1.State = entities.ToBeDeleted e2tInstance1.AssociatedRanList = []string{"test1","test2","test3"} rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, nil) rnibWriterMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.State == entities.Active })).Return(nil) - err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.RoutingManagerFailure, entities.Active) + err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.ToBeDeleted, entities.Active) assert.Nil(t, err) assert.Equal(t, entities.Active, e2tInstance1.State) rnibWriterMock.AssertExpectations(t) @@ -317,7 +317,7 @@ func TestActivateE2TInstance_RnibError(t *testing.T) { var e2tInstance1 *entities.E2TInstance rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, common.NewInternalError(errors.New("for test"))) - err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.RoutingManagerFailure, entities.Active) + err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.ToBeDeleted, entities.Active) assert.NotNil(t, err) rnibWriterMock.AssertExpectations(t) } @@ -328,7 +328,7 @@ func TestActivateE2TInstance_NoInstance(t *testing.T) { var e2tInstance1 *entities.E2TInstance rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, e2managererrors.NewResourceNotFoundError()) - err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.RoutingManagerFailure, entities.Active) + err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.ToBeDeleted, entities.Active) assert.NotNil(t, err) rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance") @@ -387,20 +387,6 @@ func TestResetKeepAliveTimestampToBeDeleted(t *testing.T) { rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance") } -func TestResetKeepAliveTimestampRoutingManagerFailure(t *testing.T) { - rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t) - - address := "10.10.2.15:9800" - e2tInstance := entities.NewE2TInstance(address) - e2tInstance.State = entities.RoutingManagerFailure - rnibReaderMock.On("GetE2TInstance", address).Return(e2tInstance, nil) - - err := e2tInstancesManager.ResetKeepAliveTimestamp(address) - assert.Nil(t, err) - rnibReaderMock.AssertCalled(t, "GetE2TInstance", address) - rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance") -} - func TestResetKeepAliveTimestampsForAllE2TInstancesGetE2TInstancesFailure(t *testing.T) { rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t) rnibReaderMock.On("GetE2TAddresses").Return([]string{}, common.NewInternalError(errors.New("Error"))) @@ -422,7 +408,7 @@ func TestResetKeepAliveTimestampsForAllE2TInstancesNoActiveInstances(t *testing. e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.ToBeDeleted e2tInstance2 := entities.NewE2TInstance(E2TAddress2) - e2tInstance2.State = entities.RoutingManagerFailure + e2tInstance2.State = entities.ToBeDeleted rnibReaderMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{e2tInstance1, e2tInstance2}, nil) e2tInstancesManager.ResetKeepAliveTimestampsForAllE2TInstances() rnibWriterMock.AssertNotCalled(t, "SaveE2TInstance") @@ -508,3 +494,59 @@ func TestRemoveE2TInstanceRnibErrorInSaveAddresses(t *testing.T) { rnibReaderMock.AssertExpectations(t) rnibWriterMock.AssertExpectations(t) } + +func TestSetE2tInstanceStateCurrentStateHasChanged(t *testing.T) { + rnibReaderMock, _, e2tInstancesManager := initE2TInstancesManagerTest(t) + + e2tInstance := entities.NewE2TInstance(E2TAddress) + e2tInstance.State = entities.Active + + rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil) + + err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.ToBeDeleted, entities.Active) + assert.NotNil(t, err) + assert.IsType(t, e2managererrors.NewInternalError(), err) + rnibReaderMock.AssertExpectations(t) +} + +func TestSetE2tInstanceStateErrorInSaveE2TInstance(t *testing.T) { + rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t) + + e2tInstance := entities.NewE2TInstance(E2TAddress) + e2tInstance.State = entities.ToBeDeleted + rnibReaderMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil) + rnibWriterMock.On("SaveE2TInstance", mock.Anything).Return(common.NewInternalError(fmt.Errorf("for testing"))) + + err := e2tInstancesManager.SetE2tInstanceState(E2TAddress, entities.ToBeDeleted, entities.Active) + assert.NotNil(t, err) + assert.IsType(t, &common.InternalError{}, err) + rnibReaderMock.AssertExpectations(t) +} + +func TestClearRansOfAllE2TInstancesEmptyList(t *testing.T) { + rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t) + E2TAddresses := []string{} + rnibReaderMock.On("GetE2TAddresses").Return(E2TAddresses, nil) + err := e2tInstancesManager.ClearRansOfAllE2TInstances() + assert.Nil(t, err) + rnibReaderMock.AssertExpectations(t) + rnibWriterMock.AssertExpectations(t) +} + +func TestClearRansOfAllE2TInstancesErrorInSaveE2TInstance(t *testing.T) { + rnibReaderMock, rnibWriterMock, e2tInstancesManager := initE2TInstancesManagerTest(t) + addresses := []string{E2TAddress, E2TAddress2} + e2tInstance1 := entities.NewE2TInstance(E2TAddress) + e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test3"} + e2tInstance2 := entities.NewE2TInstance(E2TAddress2) + e2tInstance2.AssociatedRanList = []string{"test4", "test5", "test6", "test7"} + + rnibReaderMock.On("GetE2TAddresses").Return(addresses, nil) + rnibReaderMock.On("GetE2TInstances", addresses).Return([]*entities.E2TInstance{e2tInstance1, e2tInstance2}, nil) + rnibWriterMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress})).Return(common.NewInternalError(fmt.Errorf("for testing"))) + rnibWriterMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress2})).Return(nil) + err := e2tInstancesManager.ClearRansOfAllE2TInstances() + assert.Nil(t, err) + rnibReaderMock.AssertExpectations(t) + rnibWriterMock.AssertExpectations(t) +} diff --git a/E2Manager/managers/e2t_shutdown_manager.go b/E2Manager/managers/e2t_shutdown_manager.go index dd71ad4..9ecf416 100644 --- a/E2Manager/managers/e2t_shutdown_manager.go +++ b/E2Manager/managers/e2t_shutdown_manager.go @@ -39,17 +39,15 @@ type E2TShutdownManager struct { rnibDataService services.RNibDataService e2TInstancesManager IE2TInstancesManager e2tAssociationManager *E2TAssociationManager - ranSetupManager IRanSetupManager } -func NewE2TShutdownManager(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, e2TInstancesManager IE2TInstancesManager, e2tAssociationManager *E2TAssociationManager, ranSetupManager IRanSetupManager) *E2TShutdownManager { +func NewE2TShutdownManager(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, e2TInstancesManager IE2TInstancesManager, e2tAssociationManager *E2TAssociationManager) *E2TShutdownManager { return &E2TShutdownManager{ logger: logger, config: config, rnibDataService: rnibDataService, e2TInstancesManager: e2TInstancesManager, e2tAssociationManager: e2tAssociationManager, - ranSetupManager: ranSetupManager, } } @@ -68,58 +66,25 @@ func (m E2TShutdownManager) Shutdown(e2tInstance *entities.E2TInstance) error { return err } - ranNamesToBeDissociated := []string{} - ranNamesToBeAssociated := make(map[string][]string) // e2tAddress -> associatedRanList - - for _, ranName := range e2tInstance.AssociatedRanList { - ranNamesToBeDissociated, err = m.reAssociateRanInMemory(ranName, ranNamesToBeAssociated, ranNamesToBeDissociated) - if err != nil { - m.logger.Errorf("#E2TShutdownManager.Shutdown - Failed to re-associate nodeb %s.", ranName) - return err - } - } - - err = m.e2tAssociationManager.RemoveE2tInstance(e2tInstance, ranNamesToBeDissociated, ranNamesToBeAssociated) - if err != nil { - m.logger.Errorf("#E2TShutdownManager.Shutdown - Failed to remove E2T %s.", e2tInstance.Address) - return err - } - - err = m.clearNodebsAssociation(ranNamesToBeDissociated) + err = m.clearNodebsAssociation(e2tInstance.AssociatedRanList) if err != nil { m.logger.Errorf("#E2TShutdownManager.Shutdown - Failed to clear nodebs association to E2T %s.", e2tInstance.Address) return err } - err = m.reassociateNodebs(ranNamesToBeAssociated) + err = m.e2tAssociationManager.RemoveE2tInstance(e2tInstance) if err != nil { - m.logger.Errorf("#E2TShutdownManager.Shutdown - Failed to re-associate nodebs after killing E2T %s.", e2tInstance.Address) + m.logger.Errorf("#E2TShutdownManager.Shutdown - Failed to remove E2T %s.", e2tInstance.Address) return err } - m.logger.Infof("#E2TShutdownManager.Shutdown - E2T %s was sutdown successfully.", e2tInstance.Address) - return nil -} - -func (m E2TShutdownManager) reassociateNodebs(ranNamesToBeAssociated map[string][]string) error { - for e2tAddress, ranNames := range ranNamesToBeAssociated { - err := m.associateAndSetupNodebs(ranNames, e2tAddress) - if err != nil { - return err - } - - } + m.logger.Infof("#E2TShutdownManager.Shutdown - E2T %s was sutdown successfully.", e2tInstance.Address) return nil } func (m E2TShutdownManager) clearNodebsAssociation(ranNamesToBeDissociated []string) error { - return m.associateAndSetupNodebs(ranNamesToBeDissociated, "") -} - -func (m E2TShutdownManager) associateAndSetupNodebs(ranNamesToBeUpdated []string, e2tAddress string) error { - isDissociatedRans := len(e2tAddress) == 0 - for _, ranName := range ranNamesToBeUpdated { + for _, ranName := range ranNamesToBeDissociated { nodeb, err := m.rnibDataService.GetNodeb(ranName) if err != nil { m.logger.Warnf("#E2TShutdownManager.associateAndSetupNodebs - Failed to get nodeb %s from db.", ranName) @@ -129,59 +94,18 @@ func (m E2TShutdownManager) associateAndSetupNodebs(ranNamesToBeUpdated []string } return err } - nodeb.AssociatedE2TInstanceAddress = e2tAddress - if isDissociatedRans{ - nodeb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - } + nodeb.AssociatedE2TInstanceAddress = "" + nodeb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED err = m.rnibDataService.UpdateNodebInfo(nodeb) if err != nil { m.logger.Errorf("#E2TShutdownManager.associateAndSetupNodebs - Failed to save nodeb %s from db.", ranName) return err } - - if !isDissociatedRans { - err = m.ranSetupManager.ExecuteSetup(nodeb, entities.ConnectionStatus_CONNECTING) - if err != nil { - m.logger.Errorf("#E2TShutdownManager.associateAndSetupNodebs - Failed to execute Setup for nodeb %s.", ranName) - continue - } - } } return nil } -func (m E2TShutdownManager) reAssociateRanInMemory(ranName string, ranNamesToBeAssociated map[string][]string, ranNamesToBeDissociated []string) ([]string, error) { - nodeb, err := m.rnibDataService.GetNodeb(ranName) - if err != nil { - - _, ok := err.(*common.ResourceNotFoundError) - - if !ok { - m.logger.Errorf("#E2TShutdownManager.reAssociateRanInMemory - Failed to get nodeb %s from db.", ranName) - return ranNamesToBeDissociated, err - } - - m.logger.Errorf("#E2TShutdownManager.reAssociateRanInMemory - nodeb %s not found in db. Skipping it...", ranName) - return ranNamesToBeDissociated, nil - } - - if nodeb.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN || nodeb.ConnectionStatus == entities.ConnectionStatus_SHUT_DOWN { - m.logger.Errorf("#E2TShutdownManager.reAssociateRanInMemory - nodeb %s status is %s. Skipping it...", ranName, nodeb.ConnectionStatus) - return ranNamesToBeDissociated, nil - } - - selectedE2tAddress, err := m.e2TInstancesManager.SelectE2TInstance() - if err != nil { - m.logger.Infof("#E2TShutdownManager.reAssociateRanInMemory - No selected E2T instance for nodeb %s found.", ranName) - ranNamesToBeDissociated = append(ranNamesToBeDissociated, ranName) - return ranNamesToBeDissociated, nil - } - - ranNamesToBeAssociated[selectedE2tAddress] = append(ranNamesToBeAssociated[selectedE2tAddress], ranName) - return ranNamesToBeDissociated, nil -} - func (m E2TShutdownManager) markE2tInstanceToBeDeleted(e2tInstance *entities.E2TInstance) error { e2tInstance.State = entities.ToBeDeleted e2tInstance.DeletionTimestamp = time.Now().UnixNano() diff --git a/E2Manager/managers/e2t_shutdown_manager_test.go b/E2Manager/managers/e2t_shutdown_manager_test.go index cd69fcf..570cf62 100644 --- a/E2Manager/managers/e2t_shutdown_manager_test.go +++ b/E2Manager/managers/e2t_shutdown_manager_test.go @@ -25,10 +25,8 @@ import ( "e2mgr/clients" "e2mgr/configuration" "e2mgr/e2managererrors" - "e2mgr/e2pdus" "e2mgr/mocks" "e2mgr/models" - "e2mgr/rmrCgo" "e2mgr/services" "encoding/json" "fmt" @@ -44,7 +42,7 @@ import ( const E2TAddress3 = "10.10.2.17:9800" -func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock, *mocks.RmrMessengerMock) { +func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) { log := initLog(t) config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, E2TInstanceDeletionTimeoutMs: 15000} @@ -56,16 +54,14 @@ func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibR httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) associationManager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) - rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrSender := initRmrSender(rmrMessengerMock, log) - ranSetupManager := NewRanSetupManager(log, rmrSender, rnibDataService) - shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager, ranSetupManager) - return shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock + shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager) + + return shutdownManager, readerMock, writerMock, httpClientMock } func TestShutdownSuccess1OutOf3Instances(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active @@ -87,10 +83,8 @@ func TestShutdownSuccess1OutOf3Instances(t *testing.T) { e2tAddresses := []string{E2TAddress, E2TAddress2,E2TAddress3} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) - readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{e2tInstance2,e2tInstance3}, nil) - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, "test1", "test5")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, e2tInstance1.AssociatedRanList, nil) marshaled, _ := json.Marshal(data) body := bytes.NewBuffer(marshaled) respBody := ioutil.NopCloser(bytes.NewBufferString("")) @@ -99,50 +93,29 @@ func TestShutdownSuccess1OutOf3Instances(t *testing.T) { writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) writerMock.On("SaveE2TAddresses", []string{E2TAddress2,E2TAddress3}).Return(nil) - readerMock.On("GetE2TInstance", E2TAddress2).Return(e2tInstance2, nil) - e2tInstance2updated := *e2tInstance2 - e2tInstance2updated.AssociatedRanList = append(e2tInstance2updated.AssociatedRanList, "test1", "test5") - writerMock.On("SaveE2TInstance", &e2tInstance2updated).Return(nil) - - nodeb1new := *nodeb1 - nodeb1new.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb1new.ConnectionStatus = entities.ConnectionStatus_CONNECTING - nodeb1new.ConnectionAttempts = 1 - writerMock.On("UpdateNodebInfo", &nodeb1new).Return(nil) - nodeb5new := *nodeb5 - nodeb5new.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb5new.ConnectionStatus = entities.ConnectionStatus_CONNECTING - nodeb5new.ConnectionAttempts = 1 - writerMock.On("UpdateNodebInfo", &nodeb5new).Return(nil) - nodeb1connected := *nodeb1 - nodeb1connected.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb1connected.ConnectionStatus = entities.ConnectionStatus_CONNECTED + nodeb1connected.AssociatedE2TInstanceAddress = "" + nodeb1connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED writerMock.On("UpdateNodebInfo", &nodeb1connected).Return(nil) + nodeb2connected := *nodeb2 + nodeb2connected.AssociatedE2TInstanceAddress = "" + nodeb2connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED + writerMock.On("UpdateNodebInfo", &nodeb2connected).Return(nil) nodeb5connected := *nodeb5 - nodeb5connected.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb5connected.ConnectionStatus = entities.ConnectionStatus_CONNECTED + nodeb5connected.AssociatedE2TInstanceAddress = "" + nodeb5connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED writerMock.On("UpdateNodebInfo", &nodeb5connected).Return(nil) - payload := e2pdus.PackedX2setupRequest - xaction1 := []byte("test1") - msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), "test1", &payload, &xaction1) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg1, nil) - xaction5 := []byte("test5") - msg5 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), "test5", &payload, &xaction5) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg5, nil) - err := shutdownManager.Shutdown(e2tInstance1) assert.Nil(t, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) } func TestShutdownSuccess1InstanceWithoutRans(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active @@ -165,11 +138,10 @@ func TestShutdownSuccess1InstanceWithoutRans(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) } func TestShutdownSuccess1Instance2Rans(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active @@ -187,10 +159,6 @@ func TestShutdownSuccess1Instance2Rans(t *testing.T) { respBody := ioutil.NopCloser(bytes.NewBufferString("")) httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) - e2tInstance1updated := *e2tInstance1 - e2tInstance1updated.State = entities.ToBeDeleted - readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance1updated}, nil) - writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil) writerMock.On("SaveE2TAddresses", []string{}).Return(nil) @@ -210,13 +178,11 @@ func TestShutdownSuccess1Instance2Rans(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) + } - - func TestShutdownE2tInstanceAlreadyBeingDeleted(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.ToBeDeleted @@ -229,11 +195,11 @@ func TestShutdownE2tInstanceAlreadyBeingDeleted(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) + } func TestShutdownFailureMarkInstanceAsToBeDeleted(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active @@ -246,94 +212,11 @@ func TestShutdownFailureMarkInstanceAsToBeDeleted(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) -} - -func TestShutdownFailureReassociatingInMemoryNodebNotFound(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) - - e2tInstance1 := entities.NewE2TInstance(E2TAddress) - e2tInstance1.State = entities.Active - e2tInstance1.AssociatedRanList = []string{"test1", "test2"} - e2tInstance2 := entities.NewE2TInstance(E2TAddress2) - e2tInstance2.State = entities.Active - e2tInstance2.AssociatedRanList = []string{"test3"} - writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil) - - var nodeb1 *entities.NodebInfo - readerMock.On("GetNodeb", "test1").Return(nodeb1, common.NewResourceNotFoundError("for tests")) - nodeb2 := &entities.NodebInfo{RanName:"test2", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", "test2").Return(nodeb2, nil) - - e2tAddresses := []string{E2TAddress, E2TAddress2} - readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) - readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{e2tInstance2}, nil) - - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, "test2")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) - marshaled, _ := json.Marshal(data) - body := bytes.NewBuffer(marshaled) - respBody := ioutil.NopCloser(bytes.NewBufferString("")) - httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) - - writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) - writerMock.On("SaveE2TAddresses", []string{E2TAddress2}).Return(nil) - - readerMock.On("GetE2TInstance", E2TAddress2).Return(e2tInstance2, nil) - e2tInstance2updated := *e2tInstance2 - e2tInstance2updated.AssociatedRanList = append(e2tInstance2updated.AssociatedRanList, "test2") - writerMock.On("SaveE2TInstance", &e2tInstance2updated).Return(nil) - - nodeb2new := *nodeb2 - nodeb2new.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb2new.ConnectionStatus = entities.ConnectionStatus_CONNECTING - nodeb2new.ConnectionAttempts = 1 - writerMock.On("UpdateNodebInfo", &nodeb2new).Return(nil) - - nodeb2connected := *nodeb2 - nodeb2connected.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb2connected.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &nodeb2connected).Return(nil) - - payload := e2pdus.PackedX2setupRequest - xaction2 := []byte("test2") - msg2 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), "test2", &payload, &xaction2) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg2, nil) - - err := shutdownManager.Shutdown(e2tInstance1) - - assert.Nil(t, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) -} - -func TestShutdownFailureReassociatingInMemoryGetNodebError(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) - - e2tInstance1 := entities.NewE2TInstance(E2TAddress) - e2tInstance1.State = entities.Active - e2tInstance1.AssociatedRanList = []string{"test1", "test2"} - e2tInstance2 := entities.NewE2TInstance(E2TAddress2) - e2tInstance2.State = entities.Active - e2tInstance2.AssociatedRanList = []string{"test3"} - writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil) - - var nodeb1 *entities.NodebInfo - readerMock.On("GetNodeb", "test1").Return(nodeb1, common.NewInternalError(fmt.Errorf("for tests"))) - - err := shutdownManager.Shutdown(e2tInstance1) - - assert.NotNil(t, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) + } func TestShutdownFailureRoutingManagerError(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active @@ -355,29 +238,40 @@ func TestShutdownFailureRoutingManagerError(t *testing.T) { e2tAddresses := []string{E2TAddress, E2TAddress2,E2TAddress3} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) - readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{e2tInstance2,e2tInstance3}, nil) - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, "test1", "test5")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, e2tInstance1.AssociatedRanList, nil) marshaled, _ := json.Marshal(data) body := bytes.NewBuffer(marshaled) respBody := ioutil.NopCloser(bytes.NewBufferString("")) httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusBadRequest, Body: respBody}, nil) - readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance1, nil) - writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.RoutingManagerFailure })).Return(nil) + writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) + writerMock.On("SaveE2TAddresses", []string{E2TAddress2,E2TAddress3}).Return(nil) + + nodeb1connected := *nodeb1 + nodeb1connected.AssociatedE2TInstanceAddress = "" + nodeb1connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED + writerMock.On("UpdateNodebInfo", &nodeb1connected).Return(nil) + nodeb2connected := *nodeb2 + nodeb2connected.AssociatedE2TInstanceAddress = "" + nodeb2connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED + writerMock.On("UpdateNodebInfo", &nodeb2connected).Return(nil) + nodeb5connected := *nodeb5 + nodeb5connected.AssociatedE2TInstanceAddress = "" + nodeb5connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED + writerMock.On("UpdateNodebInfo", &nodeb5connected).Return(nil) err := shutdownManager.Shutdown(e2tInstance1) - assert.NotNil(t, err) + assert.Nil(t, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) + } func TestShutdownFailureInClearNodebsAssociation(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active @@ -386,22 +280,6 @@ func TestShutdownFailureInClearNodebsAssociation(t *testing.T) { nodeb1 := &entities.NodebInfo{RanName:"test1", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} readerMock.On("GetNodeb", "test1").Return(nodeb1, nil) - nodeb2 := &entities.NodebInfo{RanName:"test2", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", "test2").Return(nodeb2, nil) - - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1", "test2"}, nil) - marshaled, _ := json.Marshal(data) - body := bytes.NewBuffer(marshaled) - respBody := ioutil.NopCloser(bytes.NewBufferString("")) - httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) - - e2tInstance1updated := *e2tInstance1 - e2tInstance1updated.State = entities.ToBeDeleted - readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{&e2tInstance1updated}, nil) - - writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) - readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil) - writerMock.On("SaveE2TAddresses", []string{}).Return(nil) nodeb1new := *nodeb1 nodeb1new.AssociatedE2TInstanceAddress = "" @@ -414,155 +292,76 @@ func TestShutdownFailureInClearNodebsAssociation(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) } -func TestShutdownFailureInRmr(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) +func TestShutdownResourceNotFoundErrorInGetNodeb(t *testing.T) { + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active - e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test5"} - e2tInstance2 := entities.NewE2TInstance(E2TAddress2) - e2tInstance2.State = entities.Active - e2tInstance2.AssociatedRanList = []string{"test3"} - e2tInstance3 := entities.NewE2TInstance(E2TAddress3) - e2tInstance3.State = entities.Active - e2tInstance3.AssociatedRanList = []string{"test4"} + e2tInstance1.AssociatedRanList = []string{"test1", "test2"} writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil) nodeb1 := &entities.NodebInfo{RanName:"test1", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} readerMock.On("GetNodeb", "test1").Return(nodeb1, nil) - nodeb2 := &entities.NodebInfo{RanName:"test2", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", "test2").Return(nodeb2, nil) - nodeb5 := &entities.NodebInfo{RanName:"test5", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", "test5").Return(nodeb5, nil) - - e2tAddresses := []string{E2TAddress, E2TAddress2,E2TAddress3} - readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) - readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{e2tInstance2,e2tInstance3}, nil) - - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, "test1", "test5")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) - marshaled, _ := json.Marshal(data) - body := bytes.NewBuffer(marshaled) - respBody := ioutil.NopCloser(bytes.NewBufferString("")) - httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) - - writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) - writerMock.On("SaveE2TAddresses", []string{E2TAddress2,E2TAddress3}).Return(nil) - - readerMock.On("GetE2TInstance", E2TAddress2).Return(e2tInstance2, nil) - e2tInstance2updated := *e2tInstance2 - e2tInstance2updated.AssociatedRanList = []string{"test3", "test1", "test5"} - writerMock.On("SaveE2TInstance", &e2tInstance2updated).Return(nil) - - nodeb1reassigned := *nodeb1 - nodeb1reassigned.AssociatedE2TInstanceAddress = E2TAddress2 - writerMock.On("UpdateNodebInfo", &nodeb1reassigned).Return(nil) - nodeb5reassigned := *nodeb5 - nodeb5reassigned.AssociatedE2TInstanceAddress = E2TAddress2 - writerMock.On("UpdateNodebInfo", &nodeb5reassigned).Return(nil) + var nodeb2 *entities.NodebInfo + readerMock.On("GetNodeb", "test2").Return(nodeb2, common.NewResourceNotFoundError("for testing")) nodeb1new := *nodeb1 - nodeb1new.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb1new.ConnectionStatus = entities.ConnectionStatus_CONNECTING - nodeb1new.ConnectionAttempts = 1 + nodeb1new.AssociatedE2TInstanceAddress = "" + nodeb1new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED writerMock.On("UpdateNodebInfo", &nodeb1new).Return(nil) - nodeb5new := *nodeb5 - nodeb5new.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb5new.ConnectionStatus = entities.ConnectionStatus_CONNECTING - nodeb5new.ConnectionAttempts = 1 - writerMock.On("UpdateNodebInfo", &nodeb5new).Return(nil) - - nodeb1connected := *nodeb1 - nodeb1connected.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb1connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - nodeb1connected.ConnectionAttempts = 0 - //nodeb1connected.E2ApplicationProtocol = entities.E2ApplicationProtocol_X2_SETUP_REQUEST - writerMock.On("UpdateNodebInfo", &nodeb1connected).Return(nil) - nodeb5connected := *nodeb5 - nodeb5connected.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb5connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - nodeb5connected.ConnectionAttempts = 0 - //nodeb5connected.E2ApplicationProtocol = entities.E2ApplicationProtocol_X2_SETUP_REQUEST - writerMock.On("UpdateNodebInfo", &nodeb5connected).Return(nil) - - payload := e2pdus.PackedX2setupRequest - xaction1 := []byte("test1") - msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), "test1", &payload, &xaction1) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg1, common.NewInternalError(fmt.Errorf("for test"))) - xaction2 := []byte("test5") - msg2 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), "test5", &payload, &xaction2) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg2, common.NewInternalError(fmt.Errorf("for test"))) err := shutdownManager.Shutdown(e2tInstance1) - assert.Nil(t, err) + assert.NotNil(t, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) } -func TestShutdownFailureDbErrorInAsociateAndSetupNodebs(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) +func TestShutdownResourceGeneralErrorInGetNodeb(t *testing.T) { + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) e2tInstance1.State = entities.Active - e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test5"} - e2tInstance2 := entities.NewE2TInstance(E2TAddress2) - e2tInstance2.State = entities.Active - e2tInstance2.AssociatedRanList = []string{"test3"} - e2tInstance3 := entities.NewE2TInstance(E2TAddress3) - e2tInstance3.State = entities.Active - e2tInstance3.AssociatedRanList = []string{"test4"} + e2tInstance1.AssociatedRanList = []string{"test1", "test2"} writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil) - nodeb1 := &entities.NodebInfo{RanName:"test1", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", "test1").Return(nodeb1, nil) - nodeb2 := &entities.NodebInfo{RanName:"test2", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} + var nodeb1 *entities.NodebInfo + readerMock.On("GetNodeb", "test1").Return(nodeb1, common.NewInternalError(fmt.Errorf("for testing"))) + nodeb2 := &entities.NodebInfo{RanName:"test2", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} readerMock.On("GetNodeb", "test2").Return(nodeb2, nil) - nodeb5 := &entities.NodebInfo{RanName:"test5", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", "test5").Return(nodeb5, nil) - - e2tAddresses := []string{E2TAddress, E2TAddress2,E2TAddress3} - readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) - readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{e2tInstance2,e2tInstance3}, nil) - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, "test1", "test5")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test1", "test2"}, nil) marshaled, _ := json.Marshal(data) body := bytes.NewBuffer(marshaled) respBody := ioutil.NopCloser(bytes.NewBufferString("")) httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) - writerMock.On("SaveE2TAddresses", []string{E2TAddress2,E2TAddress3}).Return(nil) - - readerMock.On("GetE2TInstance", E2TAddress2).Return(e2tInstance2, nil) - e2tInstance2updated := *e2tInstance2 - e2tInstance2updated.AssociatedRanList = []string{"test3", "test1", "test5"} - writerMock.On("SaveE2TInstance", &e2tInstance2updated).Return(nil) + readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil) + writerMock.On("SaveE2TAddresses", []string{}).Return(nil) - nodeb1reassigned := *nodeb1 - nodeb1reassigned.AssociatedE2TInstanceAddress = E2TAddress2 - writerMock.On("UpdateNodebInfo", &nodeb1reassigned).Return(common.NewInternalError(fmt.Errorf("for tests"))) + nodeb2new := *nodeb2 + nodeb2new.AssociatedE2TInstanceAddress = "" + nodeb2new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED + writerMock.On("UpdateNodebInfo", &nodeb2new).Return(nil) err := shutdownManager.Shutdown(e2tInstance1) - assert.NotNil(t, err) + assert.Nil(t, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) + } -func TestShutdownSuccess1OutOf3InstancesStateIsRoutingManagerFailure(t *testing.T) { - shutdownManager, readerMock, writerMock, httpClientMock, rmrMessengerMock := initE2TShutdownManagerTest(t) +func TestShutdownFailureInRemoveE2TInstance(t *testing.T) { + shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t) e2tInstance1 := entities.NewE2TInstance(E2TAddress) - e2tInstance1.State = entities.RoutingManagerFailure + e2tInstance1.State = entities.Active e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test5"} e2tInstance2 := entities.NewE2TInstance(E2TAddress2) e2tInstance2.State = entities.Active @@ -579,60 +378,31 @@ func TestShutdownSuccess1OutOf3InstancesStateIsRoutingManagerFailure(t *testing. nodeb5 := &entities.NodebInfo{RanName:"test5", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} readerMock.On("GetNodeb", "test5").Return(nodeb5, nil) - e2tAddresses := []string{E2TAddress, E2TAddress2,E2TAddress3} - readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) - readerMock.On("GetE2TInstances", e2tAddresses).Return([]*entities.E2TInstance{e2tInstance2,e2tInstance3}, nil) - - e2tDataList := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress2, "test1", "test5")} - data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, nil, e2tDataList) + data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, e2tInstance1.AssociatedRanList, nil) marshaled, _ := json.Marshal(data) body := bytes.NewBuffer(marshaled) respBody := ioutil.NopCloser(bytes.NewBufferString("")) httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) - writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil) - writerMock.On("SaveE2TAddresses", []string{E2TAddress2,E2TAddress3}).Return(nil) - - readerMock.On("GetE2TInstance", E2TAddress2).Return(e2tInstance2, nil) - e2tInstance2updated := *e2tInstance2 - e2tInstance2updated.AssociatedRanList = []string{"test3", "test1", "test5"} - writerMock.On("SaveE2TInstance", &e2tInstance2updated).Return(nil) - - nodeb1new := *nodeb1 - nodeb1new.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb1new.ConnectionStatus = entities.ConnectionStatus_CONNECTING - nodeb1new.ConnectionAttempts = 1 - writerMock.On("UpdateNodebInfo", &nodeb1new).Return(nil) - nodeb5new := *nodeb5 - nodeb5new.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb5new.ConnectionStatus = entities.ConnectionStatus_CONNECTING - nodeb5new.ConnectionAttempts = 1 - writerMock.On("UpdateNodebInfo", &nodeb5new).Return(nil) + writerMock.On("RemoveE2TInstance", E2TAddress).Return(common.NewInternalError(fmt.Errorf("for tests"))) nodeb1connected := *nodeb1 - nodeb1connected.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb1connected.ConnectionStatus = entities.ConnectionStatus_CONNECTED - //nodeb1connected.E2ApplicationProtocol = entities.E2ApplicationProtocol_X2_SETUP_REQUEST + nodeb1connected.AssociatedE2TInstanceAddress = "" + nodeb1connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED writerMock.On("UpdateNodebInfo", &nodeb1connected).Return(nil) + nodeb2connected := *nodeb2 + nodeb2connected.AssociatedE2TInstanceAddress = "" + nodeb2connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED + writerMock.On("UpdateNodebInfo", &nodeb2connected).Return(nil) nodeb5connected := *nodeb5 - nodeb5connected.AssociatedE2TInstanceAddress = E2TAddress2 - nodeb5connected.ConnectionStatus = entities.ConnectionStatus_CONNECTED - //nodeb5connected.E2ApplicationProtocol = entities.E2ApplicationProtocol_X2_SETUP_REQUEST + nodeb5connected.AssociatedE2TInstanceAddress = "" + nodeb5connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED writerMock.On("UpdateNodebInfo", &nodeb5connected).Return(nil) - payload := e2pdus.PackedX2setupRequest - xaction1 := []byte("test1") - msg1 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), "test1", &payload, &xaction1) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg1, nil) - xaction5 := []byte("test5") - msg5 := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), "test5", &payload, &xaction5) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg5, nil) - err := shutdownManager.Shutdown(e2tInstance1) - assert.Nil(t, err) + assert.IsType(t, &e2managererrors.RnibDbError{}, err) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 2) } \ No newline at end of file diff --git a/E2Manager/mocks/routing_manager_client_mock.go b/E2Manager/mocks/routing_manager_client_mock.go index 0652276..717703d 100644 --- a/E2Manager/mocks/routing_manager_client_mock.go +++ b/E2Manager/mocks/routing_manager_client_mock.go @@ -51,8 +51,8 @@ args := m.Called(e2tAddresses) return args.Error(0) } -func (m *RoutingManagerClientMock) DeleteE2TInstance(e2tAddress string, ransToBeDissociated []string, e2tToRansAssociations map[string][]string) error { +func (m *RoutingManagerClientMock) DeleteE2TInstance(e2tAddress string, ransToBeDissociated []string) error { - args := m.Called(e2tAddress, ransToBeDissociated, e2tToRansAssociations) + args := m.Called(e2tAddress, ransToBeDissociated) return args.Error(0) } \ No newline at end of file