[RICPLT-2527] Implementation of DissociateRan + UTs 12/2112/1
authorAmichai <amichai.sichel@intl.att.com>
Wed, 25 Dec 2019 12:06:40 +0000 (14:06 +0200)
committerAmichai <amichai.sichel@intl.att.com>
Wed, 25 Dec 2019 12:06:50 +0000 (14:06 +0200)
Change-Id: I5a285f4eeed731a051285e0856335105dca9d7f6
Signed-off-by: Amichai <amichai.sichel@intl.att.com>
E2Manager/app/main.go
E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go
E2Manager/managers/e2t_association_manager.go
E2Manager/managers/e2t_association_manager_test.go
E2Manager/managers/e2t_instances_manager.go
E2Manager/managers/notificationmanager/notification_manager_test.go
E2Manager/managers/ran_reconnection_manager.go
E2Manager/managers/ran_reconnection_manager_test.go
E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go
E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go
E2Manager/services/rmrreceiver/rmr_receiver_test.go

index e311dc8..0678611 100644 (file)
@@ -65,7 +65,7 @@ func main() {
        routingManagerClient := clients.NewRoutingManagerClient(logger, config, &http.Client{})
        e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
        rmrNotificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider()
-       rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient)
+       rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager)
 
        notificationManager := notificationmanager.NewNotificationManager(logger, rmrNotificationHandlerProvider)
        rmrReceiver := rmrreceiver.NewRmrReceiver(logger, rmrMessenger, notificationManager)
index 18c89ca..c930b0e 100644 (file)
@@ -64,8 +64,9 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotifica
        ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
 
        e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
+       e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock)
 
-       ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManagerMock)
+       ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager)
        handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, e2tInstancesManagerMock, routingManagerClientMock)
 
        return logger, handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock
@@ -89,7 +90,8 @@ func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.
        ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
 
        e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
-       ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManager)
+       e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
+       ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager)
        handler := NewE2TermInitNotificationHandler(logger, ranReconnectionManager, e2tInstancesManager, routingManagerClient)
        return logger, config, handler, readerMock, writerMock, rmrMessengerMock, httpClientMock
 }
index 3311e60..78ae6d7 100644 (file)
@@ -73,3 +73,34 @@ func (m *E2TAssociationManager) AssociateRan(e2tAddress string, ranName string)
        m.logger.Infof("#E2TAssociationManager.AssociateRan - successfully associated RAN %s with E2T %s", ranName, e2tAddress)
        return nil
 }
+
+func (m *E2TAssociationManager) DissociateRan(e2tAddress string, ranName string) error {
+       m.logger.Infof("#E2TAssociationManager.DissociateRan - Dissociating RAN %s from E2T Instance address: %s", ranName, e2tAddress)
+
+       nodebInfo, rnibErr := m.rnibDataService.GetNodeb(ranName)
+       if rnibErr != nil {
+               m.logger.Errorf("#E2TAssociationManager.DissociateRan - RAN name: %s - Failed fetching RAN from rNib. Error: %s", ranName, rnibErr)
+               return rnibErr
+       }
+
+       nodebInfo.AssociatedE2TInstanceAddress = ""
+       rnibErr = m.rnibDataService.UpdateNodebInfo(nodebInfo)
+       if rnibErr != nil {
+               m.logger.Errorf("#E2TAssociationManager.DissociateRan - RAN name: %s - Failed to update RAN.AssociatedE2TInstanceAddress in rNib. Error: %s", ranName, rnibErr)
+               return rnibErr
+       }
+
+       err := m.e2tInstanceManager.RemoveRanFromInstance(ranName, e2tAddress)
+       if err != nil {
+               m.logger.Errorf("#E2TAssociationManager.DissociateRan - RAN name: %s - Failed to remove RAN from E2T instance %s. Error: %s", ranName, e2tAddress, err)
+               return err
+       }
+
+       err = m.rmClient.DissociateRanE2TInstance(e2tAddress, ranName)
+       if err != nil {
+               m.logger.Errorf("#E2TAssociationManager.DissociateRan - RoutingManager failure: Failed to dissociate RAN %s from E2T %s. Error: %s", ranName, e2tAddress, err)
+       } else {
+               m.logger.Infof("#E2TAssociationManager.DissociateRan - successfully dissociated RAN %s from E2T %s", ranName, e2tAddress)
+       }
+       return nil
+}
index 6754a3b..cdaed68 100644 (file)
@@ -37,12 +37,10 @@ import (
 )
 
 const RanName = "test"
-const BaseRMUrl = "http://10.10.2.15:12020/routingmanager"
 
 func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
        log := initLog(t)
        config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
-       config.RoutingManager.BaseUrl = BaseRMUrl
 
        readerMock := &mocks.RnibReaderMock{}
        writerMock := &mocks.RnibWriterMock{}
@@ -56,11 +54,10 @@ func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks
        return manager, readerMock, writerMock, httpClientMock
 }
 
-func mockHttpClientAssociateRan(httpClientMock *mocks.HttpClientMock, isSuccessful bool) {
+func mockHttpClient(httpClientMock *mocks.HttpClientMock, apiSuffix string, isSuccessful bool) {
        data := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)}
        marshaled, _ := json.Marshal(data)
        body := bytes.NewBuffer(marshaled)
-       url := BaseRMUrl + clients.AssociateRanToE2TInstanceApiSuffix
        respBody := ioutil.NopCloser(bytes.NewBufferString(""))
        var respStatusCode int
        if isSuccessful {
@@ -68,12 +65,12 @@ func mockHttpClientAssociateRan(httpClientMock *mocks.HttpClientMock, isSuccessf
        } else {
                respStatusCode = http.StatusBadRequest
        }
-       httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: respStatusCode, Body: respBody}, nil)
+       httpClientMock.On("Post", apiSuffix, "application/json", body).Return(&http.Response{StatusCode: respStatusCode, Body: respBody}, nil)
 }
 
 func TestAssociateRanSuccess(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       mockHttpClientAssociateRan(httpClientMock, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        readerMock.On("GetNodeb", RanName).Return(nb, nil)
        updatedNb := *nb
@@ -96,7 +93,7 @@ func TestAssociateRanSuccess(t *testing.T) {
 
 func TestAssociateRanRoutingManagerError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       mockHttpClientAssociateRan(httpClientMock, false)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, false)
 
        err := manager.AssociateRan(E2TAddress, RanName)
 
@@ -109,7 +106,7 @@ func TestAssociateRanRoutingManagerError(t *testing.T) {
 
 func TestAssociateRanGetNodebError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       mockHttpClientAssociateRan(httpClientMock, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        var nb *entities.NodebInfo
        readerMock.On("GetNodeb", RanName).Return(nb, e2managererrors.NewRnibDbError())
 
@@ -124,7 +121,7 @@ func TestAssociateRanGetNodebError(t *testing.T) {
 
 func TestAssociateRanUpdateNodebError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       mockHttpClientAssociateRan(httpClientMock, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        readerMock.On("GetNodeb", RanName).Return(nb, nil)
        updatedNb := *nb
@@ -143,7 +140,7 @@ func TestAssociateRanUpdateNodebError(t *testing.T) {
 
 func TestAssociateRanGetE2tInstanceError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       mockHttpClientAssociateRan(httpClientMock, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        readerMock.On("GetNodeb", RanName).Return(nb, nil)
        updatedNb := *nb
@@ -164,7 +161,7 @@ func TestAssociateRanGetE2tInstanceError(t *testing.T) {
 
 func TestAssociateRanSaveE2tInstanceError(t *testing.T) {
        manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
-       mockHttpClientAssociateRan(httpClientMock, true)
+       mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true)
        nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionAttempts: 1}
        readerMock.On("GetNodeb", RanName).Return(nb, nil)
        updatedNb := *nb
@@ -185,3 +182,122 @@ func TestAssociateRanSaveE2tInstanceError(t *testing.T) {
        writerMock.AssertExpectations(t)
        httpClientMock.AssertExpectations(t)
 }
+
+func TestDissociateRanSuccess(t *testing.T) {
+       manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
+       mockHttpClient(httpClientMock, clients.DissociateRanE2TInstanceApiSuffix, true)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
+       readerMock.On("GetNodeb", RanName).Return(nb, nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = ""
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       e2tInstance := &entities.E2TInstance{Address: E2TAddress}
+       e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
+       readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
+       updatedE2tInstance := *e2tInstance
+       updatedE2tInstance.AssociatedRanList = []string{}
+       writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
+
+       err := manager.DissociateRan(E2TAddress, RanName)
+
+       assert.Nil(t, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       httpClientMock.AssertExpectations(t)
+}
+
+func TestDissociateRanGetNodebError(t *testing.T) {
+       manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
+       var nb *entities.NodebInfo
+       readerMock.On("GetNodeb", RanName).Return(nb, e2managererrors.NewRnibDbError())
+
+       err := manager.DissociateRan(E2TAddress, RanName)
+
+       assert.NotNil(t, err)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       httpClientMock.AssertExpectations(t)
+}
+
+func TestDissociateRanUpdateNodebError(t *testing.T) {
+       manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
+       readerMock.On("GetNodeb", RanName).Return(nb, nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = ""
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError())
+
+       err := manager.DissociateRan(E2TAddress, RanName)
+
+       assert.NotNil(t, err)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       httpClientMock.AssertExpectations(t)
+}
+
+func TestDissociateRanGetE2tInstanceError(t *testing.T) {
+       manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
+       readerMock.On("GetNodeb", RanName).Return(nb, nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = ""
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       var e2tInstance *entities.E2TInstance
+       readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, errors.New("test"))
+
+       err := manager.DissociateRan(E2TAddress, RanName)
+
+       assert.NotNil(t, err)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       httpClientMock.AssertExpectations(t)
+}
+
+func TestDissociateRanSaveE2tInstanceError(t *testing.T) {
+       manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
+       readerMock.On("GetNodeb", RanName).Return(nb, nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = ""
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       e2tInstance := &entities.E2TInstance{Address: E2TAddress}
+       e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
+       readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
+       updatedE2tInstance := *e2tInstance
+       updatedE2tInstance.AssociatedRanList = []string{}
+       writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(errors.New("test"))
+
+       err := manager.DissociateRan(E2TAddress, RanName)
+
+       assert.NotNil(t, err)
+       assert.IsType(t, &e2managererrors.RnibDbError{}, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       httpClientMock.AssertExpectations(t)
+}
+
+func TestDissociateRanRoutingManagerError(t *testing.T) {
+       manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t)
+       mockHttpClient(httpClientMock, clients.DissociateRanE2TInstanceApiSuffix, false)
+       nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionAttempts: 1}
+       readerMock.On("GetNodeb", RanName).Return(nb, nil)
+       updatedNb := *nb
+       updatedNb.AssociatedE2TInstanceAddress = ""
+       writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil)
+       e2tInstance := &entities.E2TInstance{Address: E2TAddress}
+       e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName)
+       readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
+       updatedE2tInstance := *e2tInstance
+       updatedE2tInstance.AssociatedRanList = []string{}
+       writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil)
+
+       err := manager.DissociateRan(E2TAddress, RanName)
+
+       assert.Nil(t, err)
+       readerMock.AssertExpectations(t)
+       writerMock.AssertExpectations(t)
+       httpClientMock.AssertExpectations(t)
+}
\ No newline at end of file
index 4f4017d..0a95f5f 100644 (file)
@@ -235,7 +235,7 @@ func (m *E2TInstancesManager) RemoveRanFromInstance(ranName string, e2tAddress s
 
        if err != nil {
                m.logger.Errorf("#E2TInstancesManager.RemoveRanFromInstance - E2T Instance address: %s - Failed retrieving E2TInstance. error: %s", e2tAddress, err)
-               return err
+               return e2managererrors.NewRnibDbError()
        }
 
        i := 0 // output index
@@ -253,7 +253,7 @@ func (m *E2TInstancesManager) RemoveRanFromInstance(ranName string, e2tAddress s
 
        if err != nil {
                m.logger.Errorf("#E2TInstancesManager.RemoveRanFromInstance - E2T Instance address: %s - Failed saving E2TInstance. error: %s", e2tAddress, err)
-               return err
+               return e2managererrors.NewRnibDbError()
        }
 
        m.logger.Infof("#E2TInstancesManager.RemoveRanFromInstance - successfully dissociated RAN %s from E2T %s", ranName, e2tInstance.Address)
index bd6798e..ded3f27 100644 (file)
@@ -49,8 +49,9 @@ func initNotificationManagerTest(t *testing.T) (*logger.Logger, *mocks.RnibReade
        ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
        e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
        routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient)
+       e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
        rmrNotificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider()
-       rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager,routingManagerClient)
+       rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager,routingManagerClient, e2tAssociationManager)
        notificationManager := NewNotificationManager(logger, rmrNotificationHandlerProvider )
        return logger, readerMock, notificationManager
 }
index 7a1dab7..530131f 100644 (file)
@@ -32,20 +32,20 @@ type IRanReconnectionManager interface {
 }
 
 type RanReconnectionManager struct {
-       logger              *logger.Logger
-       config              *configuration.Configuration
-       rnibDataService     services.RNibDataService
-       ranSetupManager     *RanSetupManager
-       e2tInstancesManager IE2TInstancesManager
+       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, e2tInstancesManager IE2TInstancesManager) *RanReconnectionManager {
+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,
-               e2tInstancesManager: e2tInstancesManager,
+               logger:                logger,
+               config:                config,
+               rnibDataService:       rnibDataService,
+               ranSetupManager:       ranSetupManager,
+               e2tAssociationManager: e2tAssociationManager,
        }
 }
 
@@ -72,7 +72,7 @@ func (m *RanReconnectionManager) ReconnectRan(inventoryName string) error {
                }
 
                if m.isRanExceededConnectionAttempts(nodebInfo) {
-                       return m.e2tInstancesManager.RemoveRanFromInstance(nodebInfo.RanName, e2tAddress)
+                       return m.e2tAssociationManager.DissociateRan(e2tAddress, nodebInfo.RanName)
                }
 
                return nil
index 44a3c78..e5e7ef3 100644 (file)
@@ -21,6 +21,7 @@
 package managers
 
 import (
+       "e2mgr/clients"
        "e2mgr/configuration"
        "e2mgr/logger"
        "e2mgr/mocks"
@@ -36,7 +37,7 @@ import (
        "testing"
 )
 
-func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *RanReconnectionManager) {
+func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *RanReconnectionManager, *mocks.HttpClientMock) {
        logger, err := logger.InitLogger(logger.DebugLevel)
        if err != nil {
                t.Errorf("#... - failed to initialize logger, error: %s", err)
@@ -53,33 +54,15 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessenge
        rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)
        e2tInstancesManager := NewE2TInstancesManager(rnibDataService, logger)
        ranSetupManager := NewRanSetupManager(logger, rmrSender, rnibDataService)
-       ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManager)
-       return logger, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager
-}
-
-func initRanLostConnectionTestBasicMocks(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *RanReconnectionManager, *mocks.E2TInstancesManagerMock) {
-       logger, err := logger.InitLogger(logger.DebugLevel)
-       if err != nil {
-               t.Errorf("#... - failed to initialize logger, error: %s", err)
-       }
-       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)
-       e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{}
-       ranSetupManager := NewRanSetupManager(logger, rmrSender, rnibDataService)
-       ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManagerMock)
-       return logger, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager, e2tInstancesManagerMock
+       httpClient := &mocks.HttpClientMock{}
+       routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient)
+       e2tAssociationManager := NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
+       ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager)
+       return logger, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager, httpClient
 }
 
 func TestRanReconnectionGetNodebFailure(t *testing.T) {
-       _, _, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t)
        ranName := "test"
        var nodebInfo *entities.NodebInfo
        readerMock.On("GetNodeb", ranName).Return(nodebInfo, common.NewInternalError(errors.New("Error")))
@@ -90,7 +73,7 @@ func TestRanReconnectionGetNodebFailure(t *testing.T) {
 }
 
 func TestShutdownRanReconnection(t *testing.T) {
-       _, _, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t)
        ranName := "test"
        origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
        var rnibErr error
@@ -102,7 +85,7 @@ func TestShutdownRanReconnection(t *testing.T) {
 }
 
 func TestShuttingdownRanReconnection(t *testing.T) {
-       _, _, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t)
        ranName := "test"
        origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
        var rnibErr error
@@ -117,29 +100,29 @@ func TestShuttingdownRanReconnection(t *testing.T) {
 }
 
 func TestConnectingRanWithMaxAttemptsReconnectionDissociateSucceeds(t *testing.T) {
-       _, _, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, _, readerMock, writerMock, ranReconnectionManager, httpClient:= initRanLostConnectionTest(t)
        ranName := "test"
-       e2tAddress := "10.0.2.15"
-       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, ConnectionAttempts: 20, AssociatedE2TInstanceAddress: E2TAddress}
        var rnibErr error
        readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr)
        updatedNodebInfo := *origNodebInfo
        updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
        updatedNodebInfo.AssociatedE2TInstanceAddress = ""
        writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(rnibErr)
-       e2tInstance := &entities.E2TInstance{Address:e2tAddress, AssociatedRanList:[]string{ranName}}
-       readerMock.On("GetE2TInstance",e2tAddress).Return(e2tInstance, nil)
+       e2tInstance := &entities.E2TInstance{Address: E2TAddress, AssociatedRanList:[]string{ranName}}
+       readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil)
        e2tInstanceToSave := * e2tInstance
        e2tInstanceToSave .AssociatedRanList = []string{}
        writerMock.On("SaveE2TInstance", &e2tInstanceToSave).Return(nil)
+       mockHttpClient(httpClient, clients.DissociateRanE2TInstanceApiSuffix, true)
        err := ranReconnectionManager.ReconnectRan(ranName)
        assert.Nil(t, err)
        readerMock.AssertCalled(t, "GetNodeb", ranName)
-       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
+       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
 }
 
 func TestConnectingRanWithMaxAttemptsReconnectionDissociateFails(t *testing.T) {
-       _, _, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t)
        ranName := "test"
        e2tAddress := "10.0.2.15"
        origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 20, AssociatedE2TInstanceAddress: e2tAddress}
@@ -154,12 +137,12 @@ func TestConnectingRanWithMaxAttemptsReconnectionDissociateFails(t *testing.T) {
        err := ranReconnectionManager.ReconnectRan(ranName)
        assert.NotNil(t, err)
        readerMock.AssertCalled(t, "GetNodeb", ranName)
-       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
+       writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
        writerMock.AssertNotCalled(t, "SaveE2TInstance", )
 }
 
 func TestUnconnectableRanUpdateNodebInfoFailure(t *testing.T) {
-       _, _, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t)
        ranName := "test"
        origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}
        var rnibErr error
@@ -174,7 +157,7 @@ func TestUnconnectableRanUpdateNodebInfoFailure(t *testing.T) {
 }
 
 func TestConnectedRanExecuteSetupSuccess(t *testing.T) {
-       _, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t)
        ranName := "test"
        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
@@ -192,7 +175,7 @@ func TestConnectedRanExecuteSetupSuccess(t *testing.T) {
 }
 
 func TestConnectedRanExecuteSetupFailure(t *testing.T) {
-       _, _, readerMock, writerMock, ranReconnectionManager := initRanLostConnectionTest(t)
+       _, _, readerMock, writerMock, ranReconnectionManager, _ := initRanLostConnectionTest(t)
        ranName := "test"
        origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTED}
        var rnibErr error
@@ -208,7 +191,7 @@ func TestConnectedRanExecuteSetupFailure(t *testing.T) {
 }
 
 func TestNoSetConnectionStatus(t *testing.T) {
-       _, _, _, _, ranReconnectionManager := initRanLostConnectionTest(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)
index b7002ad..3d79c28 100644 (file)
@@ -58,7 +58,7 @@ func (provider *NotificationHandlerProvider) Register(msgType int, handler rmrms
        provider.notificationHandlers[msgType] = handler
 }
 
-func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, rmrSender *rmrsender.RmrSender, ranSetupManager *managers.RanSetupManager, e2tInstancesManager managers.IE2TInstancesManager, routingManagerClient clients.IRoutingManagerClient) {
+func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, rmrSender *rmrsender.RmrSender, ranSetupManager *managers.RanSetupManager, e2tInstancesManager managers.IE2TInstancesManager, routingManagerClient clients.IRoutingManagerClient, e2tAssociationManager *managers.E2TAssociationManager) {
 
        // Init converters
        x2SetupResponseConverter := converters.NewX2SetupResponseConverter(logger)
@@ -69,7 +69,7 @@ func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config
        x2ResetResponseExtractor := converters.NewX2ResetResponseExtractor(logger)
 
        // Init managers
-       ranReconnectionManager := managers.NewRanReconnectionManager(logger, config, rnibDataService, ranSetupManager, e2tInstancesManager)
+       ranReconnectionManager := managers.NewRanReconnectionManager(logger, config, rnibDataService, ranSetupManager, e2tAssociationManager)
        ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender)
        x2SetupResponseManager := managers.NewX2SetupResponseManager(x2SetupResponseConverter)
        x2SetupFailureResponseManager := managers.NewX2SetupFailureResponseManager(x2SetupFailureResponseConverter)
index d01d7c4..5d20a5f 100644 (file)
@@ -42,7 +42,7 @@ import (
  * Verify support for known providers.
  */
 
-func initTestCase(t *testing.T) (*logger.Logger, *configuration.Configuration, services.RNibDataService, *rmrsender.RmrSender, *managers.RanSetupManager, managers.IE2TInstancesManager, clients.IRoutingManagerClient) {
+func initTestCase(t *testing.T) (*logger.Logger, *configuration.Configuration, services.RNibDataService, *rmrsender.RmrSender, *managers.RanSetupManager, managers.IE2TInstancesManager, clients.IRoutingManagerClient, *managers.E2TAssociationManager) {
        logger := initLog(t)
        config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
 
@@ -55,15 +55,16 @@ func initTestCase(t *testing.T) (*logger.Logger, *configuration.Configuration, s
        ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
        e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
        routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient)
+       e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
 
-       return logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient
+       return logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager
 }
 
 func TestGetNotificationHandlerSuccess(t *testing.T) {
 
-       logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient := initTestCase(t)
+       logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager := initTestCase(t)
 
-       ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManager)
+       ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tAssociationManager)
        ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender)
 
        x2SetupResponseConverter := converters.NewX2SetupResponseConverter(logger)
@@ -101,7 +102,7 @@ func TestGetNotificationHandlerSuccess(t *testing.T) {
        for _, tc := range testCases {
 
                provider := NewNotificationHandlerProvider()
-               provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient)
+               provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager)
                t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) {
                        handler, err := provider.GetNotificationHandler(tc.msgType)
                        if err != nil {
@@ -130,9 +131,9 @@ func TestGetNotificationHandlerFailure(t *testing.T) {
        }
        for _, tc := range testCases {
 
-               logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient := initTestCase(t)
+               logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager := initTestCase(t)
                provider := NewNotificationHandlerProvider()
-               provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient)
+               provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager)
                t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) {
                        _, err := provider.GetNotificationHandler(tc.msgType)
                        if err == nil {
index 5e766f7..b79c581 100644 (file)
@@ -72,8 +72,9 @@ func initRmrReceiver(logger *logger.Logger) *RmrReceiver {
        ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService)
        e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger)
        routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient)
+       e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient)
        rmrNotificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider()
-       rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient)
+       rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager)
        notificationManager := notificationmanager.NewNotificationManager(logger, rmrNotificationHandlerProvider)
        return NewRmrReceiver(logger, rmrMessenger, notificationManager)
 }