[RICPLT-1423] Big Red button API - Implementation - Disconnect status 32/732/1
authoririna <ib565x@intl.att.com>
Thu, 15 Aug 2019 21:14:51 +0000 (00:14 +0300)
committeririna <ib565x@intl.att.com>
Thu, 15 Aug 2019 21:15:13 +0000 (00:15 +0300)
Change-Id: I1cf82bec1e7fcd42085748385a4c67aa8f491c0d
Signed-off-by: irina <ib565x@intl.att.com>
E2Manager/controllers/controller.go
E2Manager/controllers/controller_test.go
E2Manager/handlers/delete_all_request_handler.go
E2Manager/handlers/delete_all_request_handler_test.go
E2Manager/handlers/ranLostConnectionHandler.go
E2Manager/handlers/request_handler.go
E2Manager/handlers/x2_reset_request_handler.go
E2Manager/main/http_server.go
E2Manager/providers/incoming_request_handler_provider.go

index a0c7a15..7092358 100644 (file)
@@ -39,17 +39,15 @@ const (
 type Controller struct {
        logger         *logger.Logger
        handlerProvider *providers.IncomingRequestHandlerProvider
-       rmrResponseChannel chan<- *models.NotificationResponse
 }
 
 func NewController(logger *logger.Logger, rmrService *services.RmrService, rNibReaderProvider func() reader.RNibReader, rNibWriterProvider func() rNibWriter.RNibWriter,
-       config *configuration.Configuration, rmrResponseChannel chan<- *models.NotificationResponse) *Controller {
+       config *configuration.Configuration) *Controller {
 
        provider := providers.NewIncomingRequestHandlerProvider(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider)
        return &Controller{
                logger: logger,
                handlerProvider: provider,
-               rmrResponseChannel: rmrResponseChannel,
        }
 }
 
@@ -102,7 +100,7 @@ func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Head
                return
        }
 
-       err = handler.Handle(c.logger, request, c.rmrResponseChannel)
+       err = handler.Handle(c.logger, request)
 
        if err != nil {
                c.handleErrorResponse(err, writer)
index 6b9e7ae..6bc1613 100644 (file)
@@ -51,14 +51,13 @@ func TestShutdownHandlerRnibError(t *testing.T) {
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
-       var messageChannel chan<- *models.NotificationResponse
 
        rnibErr := &common.RNibError{}
        var nbIdentityList []*entities.NbIdentity
        readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr)
 
        writer := httptest.NewRecorder()
-       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, messageChannel)
+       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config)
        controller.ShutdownHandler(writer, tests.GetHttpRequest(), nil)
 
        var errorResponse = parseJsonRequest(t, writer.Body)
@@ -80,11 +79,10 @@ func TestHeaderValidationFailed(t *testing.T) {
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
-       var messageChannel chan<- *models.NotificationResponse
 
        writer := httptest.NewRecorder()
 
-       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, messageChannel)
+       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config)
 
        header := &http.Header{}
 
@@ -111,14 +109,13 @@ func TestShutdownStatusNoContent(t *testing.T){
                return writerMock
        }
        config := configuration.ParseConfiguration()
-       var messageChannel chan<- *models.NotificationResponse
 
        var rnibError common.IRNibError
        nbIdentityList := []*entities.NbIdentity{}
        readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError)
 
        writer := httptest.NewRecorder()
-       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, messageChannel)
+       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config)
        controller.ShutdownHandler(writer, tests.GetHttpRequest(), nil)
 
        assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
@@ -137,10 +134,9 @@ func TestHandleInternalError(t *testing.T) {
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
-       var messageChannel chan<- *models.NotificationResponse
 
        writer := httptest.NewRecorder()
-       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, messageChannel)
+       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config)
        err := e2managererrors.NewInternalError()
 
        controller.handleErrorResponse(err, writer)
@@ -164,9 +160,8 @@ func TestHandleCommandAlreadyInProgressError(t *testing.T) {
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
-       var messageChannel chan<- *models.NotificationResponse
        writer := httptest.NewRecorder()
-       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, messageChannel)
+       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config)
        err := e2managererrors.NewCommandAlreadyInProgressError()
 
        controller.handleErrorResponse(err, writer)
@@ -190,9 +185,8 @@ func TestValidateHeaders(t *testing.T){
                return writerMock
        }
        config := configuration.ParseConfiguration()
-       var messageChannel chan<- *models.NotificationResponse
 
-       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, messageChannel)
+       controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config)
 
        header := http.Header{}
        header.Set("Content-Type", "application/json")
index 95f83a2..c5240e2 100644 (file)
 
 package handlers
 
+import "C"
 import (
        "e2mgr/configuration"
        "e2mgr/e2managererrors"
        "e2mgr/logger"
+       "e2mgr/models"
        "e2mgr/rNibWriter"
        "e2mgr/rmrCgo"
+       "e2mgr/services"
        "e2mgr/stateMachine"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
        "time"
-
-       "e2mgr/models"
 )
 
 type DeleteAllRequestHandler struct {
        readerProvider func() reader.RNibReader
        writerProvider func() rNibWriter.RNibWriter
+       rmrService *services.RmrService
        config *configuration.Configuration
 }
 
-func NewDeleteAllRequestHandler(config *configuration.Configuration, writerProvider func() rNibWriter.RNibWriter,
+func NewDeleteAllRequestHandler(rmrService *services.RmrService, config *configuration.Configuration, writerProvider func() rNibWriter.RNibWriter,
        readerProvider func() reader.RNibReader) *DeleteAllRequestHandler {
        return &DeleteAllRequestHandler {
                readerProvider: readerProvider,
                writerProvider: writerProvider,
+               rmrService: rmrService,
                config: config,
        }
 }
 
-func (handler *DeleteAllRequestHandler) Handle(logger *logger.Logger, request models.Request, rmrResponseChannel chan<- *models.NotificationResponse) error {
+func (handler *DeleteAllRequestHandler) Handle(logger *logger.Logger, request models.Request) error {
 
        err, continueFlow := handler.updateNodebStates(logger, false)
        if err != nil {
@@ -59,7 +62,10 @@ func (handler *DeleteAllRequestHandler) Handle(logger *logger.Logger, request mo
 
        //TODO change to rmr_request
        response := models.NotificationResponse{MgsType: rmrCgo.RIC_SCTP_CLEAR_ALL}
-       rmrResponseChannel <- &response
+       if err:= handler.rmrService.SendRmrMessage(&response); err != nil {
+               logger.Errorf("#delete_all_request_handler.Handle - failed to send sctp clear all message to RMR: %s", err)
+               return  e2managererrors.NewRmrError()
+       }
 
        time.Sleep(time.Duration(handler.config.BigRedButtonTimeoutSec) * time.Second)
        logger.Infof("#delete_all_request_handler.Handle - timer expired")
@@ -84,6 +90,7 @@ func (handler *DeleteAllRequestHandler) updateNodebStates(logger *logger.Logger,
                return nil, false
        }
 
+       numOfRanToShutDown := 0
        for _,nbIdentity := range nbIdentityList{
 
                node, err := handler.readerProvider().GetNodeb((*nbIdentity).GetInventoryName())
@@ -96,21 +103,35 @@ func (handler *DeleteAllRequestHandler) updateNodebStates(logger *logger.Logger,
 
                if timeoutExpired{
 
-                       handler.saveNodebShutDownState(logger, nbIdentity, node)
+                       if handler.saveNodebShutDownState(logger, nbIdentity, node){
+                               numOfRanToShutDown++
+                       }
                        continue
                }
-               handler.saveNodebNextState(logger, nbIdentity, node)
+               if handler.saveNodebNextState(logger, nbIdentity, node){
+                       numOfRanToShutDown++
+               }
+       }
+
+       if numOfRanToShutDown > 0{
+               logger.Infof("#delete_all_request_handler.updateNodebStates - update nodebs states in RNIB completed")
+       }else {
+               logger.Infof("#delete_all_request_handler.updateNodebStates - nodebs states are not updated ")
+               return nil, false
        }
 
-       logger.Infof("#delete_all_request_handler.updateNodebStates - update nodeb states in RNIB completed")
        return nil, true
 }
 
-func (handler *DeleteAllRequestHandler) saveNodebNextState(logger *logger.Logger, nbIdentity *entities.NbIdentity, node *entities.NodebInfo) {
+func (handler *DeleteAllRequestHandler) saveNodebNextState(logger *logger.Logger, nbIdentity *entities.NbIdentity, node *entities.NodebInfo) bool{
+
+       if node.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN{
+               return true
+       }
 
        nextStatus, res := stateMachine.NodeNextStateDeleteAll(node.ConnectionStatus)
        if res == false {
-               return
+               return false
        }
 
        node.ConnectionStatus = nextStatus
@@ -120,24 +141,25 @@ func (handler *DeleteAllRequestHandler) saveNodebNextState(logger *logger.Logger
        if err != nil {
                logger.Errorf("#delete_all_request_handler.saveNodebNextState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s",
                        (*nbIdentity).GetInventoryName(), err.Error())
-               return
+               return false
        }
 
        if logger.DebugEnabled() {
                logger.Debugf("#delete_all_request_handler.saveNodebNextState - connection status of inventory name: %v changed to %v",
                        (*nbIdentity).GetInventoryName(), nextStatus.String())
        }
+       return true
 }
 
-func (handler *DeleteAllRequestHandler) saveNodebShutDownState(logger *logger.Logger, nbIdentity *entities.NbIdentity, node *entities.NodebInfo) {
+func (handler *DeleteAllRequestHandler) saveNodebShutDownState(logger *logger.Logger, nbIdentity *entities.NbIdentity, node *entities.NodebInfo) bool{
 
        if node.ConnectionStatus == entities.ConnectionStatus_SHUT_DOWN{
-               return
+               return false
        }
 
        if node.ConnectionStatus != entities.ConnectionStatus_SHUTTING_DOWN {
                logger.Errorf("#delete_all_request_handler.saveNodebShutDownState - ignore, status is not Shutting Down, inventory name: %v ", (*nbIdentity).GetInventoryName())
-               return
+               return false
        }
 
        node.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
@@ -147,8 +169,9 @@ func (handler *DeleteAllRequestHandler) saveNodebShutDownState(logger *logger.Lo
        if err != nil {
                logger.Errorf("#delete_all_request_handler.saveNodebShutDownState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s",
                        (*nbIdentity).GetInventoryName(), err.Error())
-               return
+               return false
        }
 
        logger.Errorf("#delete_all_request_handler.saveNodebShutDownState - Shut Down , inventory name: %v ", (*nbIdentity).GetInventoryName())
+       return true
 }
index 3204b71..62214a8 100644 (file)
@@ -25,6 +25,10 @@ import (
        "e2mgr/models"
        "e2mgr/rNibWriter"
        "e2mgr/rmrCgo"
+       "e2mgr/services"
+       "e2mgr/sessions"
+       "e2mgr/tests"
+       "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"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
@@ -45,18 +49,18 @@ func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T){
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
-       config := configuration.ParseConfiguration()
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
 
-       handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
+       config := configuration.ParseConfiguration()
 
-       var messageChannel chan<- *models.NotificationResponse
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
        rnibErr := &common.RNibError{}
        var nbIdentityList []*entities.NbIdentity
        readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr)
 
        expected := &e2managererrors.RnibDbError{}
-       actual := handler.Handle(log, nil, messageChannel)
+       actual := handler.Handle(log, nil)
        if reflect.TypeOf(actual) != reflect.TypeOf(expected){
                t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
        }
@@ -73,12 +77,11 @@ func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
        config := configuration.ParseConfiguration()
        config.BigRedButtonTimeoutSec = 1
 
-       handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
-
-       messageChannel := make(chan*models.NotificationResponse)
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
        rnibErr := &common.RNibError{}
        //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown
@@ -98,13 +101,9 @@ func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){
        writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil)
        writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil)
 
-       go func(){
-               response := <-messageChannel
-               assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
-       }()
-
        expected := &e2managererrors.RnibDbError{}
-       actual := handler.Handle(log, nil, messageChannel)
+       actual := handler.Handle(log, nil)
+
        if reflect.TypeOf(actual) != reflect.TypeOf(expected){
                t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
        }
@@ -121,11 +120,10 @@ func TestHandleSuccessFlow(t *testing.T){
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
        config := configuration.ParseConfiguration()
        config.BigRedButtonTimeoutSec = 1
-       handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
-
-       messageChannel := make(chan*models.NotificationResponse)
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
        //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown
        nbIdentityList := createIdentityList()
@@ -158,12 +156,10 @@ func TestHandleSuccessFlow(t *testing.T){
        writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil)
        writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil)
 
-       go func(){
-               response := <-messageChannel
-               assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
-       }()
+       mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction)
+       rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil)
 
-       actual := handler.Handle(log, nil, messageChannel)
+       actual := handler.Handle(log, nil)
 
        assert.Nil(t, actual)
 }
@@ -179,11 +175,10 @@ func TestHandleSuccessGetNextStatusFlow(t *testing.T){
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
        config := configuration.ParseConfiguration()
        config.BigRedButtonTimeoutSec = 1
-       handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
-
-       messageChannel := make(chan*models.NotificationResponse)
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
        nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
        readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
@@ -203,13 +198,49 @@ func TestHandleSuccessGetNextStatusFlow(t *testing.T){
        updatedNb1AfterTimer := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
        writerMock.On("SaveNodeb", mock.Anything, updatedNb1AfterTimer).Return(nil)
 
+       mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction)
+       rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil)
+
+       actual := handler.Handle(log, nil)
+
+       assert.Nil(t, actual)
+}
+
+func TestHandleShuttingDownStatusFlow(t *testing.T){
+       log := initLog(t)
+
+       readerMock := &mocks.RnibReaderMock{}
+       readerProvider := func() reader.RNibReader {
+               return readerMock
+       }
+       writerMock := &mocks.RnibWriterMock{}
+       writerProvider := func() rNibWriter.RNibWriter {
+               return writerMock
+       }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
+       config := configuration.ParseConfiguration()
+       config.BigRedButtonTimeoutSec = 1
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+
+       nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
+       readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
+
+       nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
+       readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
+
+       //after timer: ShutDown->Ignore, ShuttingDown->ShutDown
+       readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
+
+       nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
+       readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil)
+
+       updatedNb1AfterTimer := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
+       writerMock.On("SaveNodeb", mock.Anything, updatedNb1AfterTimer).Return(nil)
 
-       go func(){
-               response := <-messageChannel
-               assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
-       }()
+       mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction)
+       rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil)
 
-       actual := handler.Handle(log, nil, messageChannel)
+       actual := handler.Handle(log, nil)
 
        assert.Nil(t, actual)
 }
@@ -225,11 +256,10 @@ func TestHandleGetNodebFailedFlow(t *testing.T){
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
        config := configuration.ParseConfiguration()
        config.BigRedButtonTimeoutSec = 1
-       handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
-
-       messageChannel := make(chan*models.NotificationResponse)
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
        //Before timer: Disconnected->ShutDown(will fail), ShuttingDown->Ignore, Connected->ShuttingDown
        nbIdentityList := createIdentityList()
@@ -263,12 +293,10 @@ func TestHandleGetNodebFailedFlow(t *testing.T){
        writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil)
        writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil)
 
-       go func(){
-               response := <-messageChannel
-               assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
-       }()
+       mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction)
+       rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil)
 
-       actual := handler.Handle(log, nil, messageChannel)
+       actual := handler.Handle(log, nil)
 
        assert.Nil(t, actual)
 }
@@ -284,11 +312,10 @@ func TestHandleSaveFailedFlow(t *testing.T){
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
        config := configuration.ParseConfiguration()
        config.BigRedButtonTimeoutSec = 1
-       handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
-
-       messageChannel := make(chan*models.NotificationResponse)
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
        //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail)
        nbIdentityList := createIdentityList()
@@ -322,17 +349,15 @@ func TestHandleSaveFailedFlow(t *testing.T){
        writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil)
        writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(errRnib)
 
-       go func(){
-               response := <-messageChannel
-               assert.Equal(t, response.MgsType, rmrCgo.RIC_SCTP_CLEAR_ALL)
-       }()
+       mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction)
+       rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil)
 
-       actual := handler.Handle(log, nil, messageChannel)
+       actual := handler.Handle(log, nil)
 
        assert.Nil(t, actual)
 }
 
-func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){
+func TestHandleSendRmrFailedFlow(t *testing.T){
        log := initLog(t)
 
        readerMock := &mocks.RnibReaderMock{}
@@ -343,18 +368,75 @@ func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){
        writerProvider := func() rNibWriter.RNibWriter {
                return writerMock
        }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
        config := configuration.ParseConfiguration()
+       config.BigRedButtonTimeoutSec = 1
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
-       handler := NewDeleteAllRequestHandler(config, writerProvider, readerProvider)
+       //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail)
+       nbIdentityList := createIdentityList()
+       readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
 
-       var messageChannel chan<- *models.NotificationResponse
+       nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,}
+       nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
+       nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,}
+       readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil)
+       readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil)
+       readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil)
+
+       updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
+       updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
+       writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil)
+       writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil)
+
+       //after timer: ShutDown->Ignore, ShuttingDown->ShutDown(will fail)
+       readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
+
+       nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,}
+       nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
+       nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,}
+       readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil)
+       readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil)
+       readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil)
+
+       updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
+       updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,}
+       writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil)
+       writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil)
+
+       expected := e2managererrors.NewRmrError()
+       mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction)
+       rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, expected)
+
+       actual := handler.Handle(log, nil)
+
+       if reflect.TypeOf(actual) != reflect.TypeOf(expected){
+               t.Errorf("Error actual = %v, and Expected = %v.", actual, expected)
+       }
+}
+
+func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){
+       log := initLog(t)
+
+       readerMock := &mocks.RnibReaderMock{}
+       readerProvider := func() reader.RNibReader {
+               return readerMock
+       }
+       writerMock := &mocks.RnibWriterMock{}
+       writerProvider := func() rNibWriter.RNibWriter {
+               return writerMock
+       }
+       rmrMessengerMock := &mocks.RmrMessengerMock{}
+       config := configuration.ParseConfiguration()
+
+       handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
 
        var rnibError common.IRNibError
        nbIdentityList := []*entities.NbIdentity{}
 
        readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError)
 
-       actual := handler.Handle(log, nil, messageChannel)
+       actual := handler.Handle(log, nil)
        readerMock.AssertNumberOfCalls(t, "GetNodeb", 0)
        assert.Nil(t, actual)
 }
@@ -378,4 +460,12 @@ func initLog(t *testing.T) *logger.Logger {
                t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err)
        }
        return log
+}
+
+
+func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *services.RmrService {
+       rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock)
+       messageChannel := make(chan *models.NotificationResponse)
+       rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger)
+       return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger,  make(sessions.E2Sessions), messageChannel)
 }
\ No newline at end of file
index 0404e74..33c4948 100644 (file)
@@ -55,9 +55,7 @@ func (src RanLostConnectionHandler) Handle(logger *logger.Logger, e2Sessions ses
                if rNibErr = src.rnibWriterProvider().SaveNodeb(nbIdentity, nb); rNibErr != nil {
                        logger.Errorf("#ranLostConnectionHandler.Handle - transactionId %s: rNibWriter failed to save nb entity %s. Error: %s", request.TransactionId, nb.RanName, rNibErr.Error())
                } else {
-                       logger.Infof("#ranLostConnectionHandler.Handle - transactionId %s: saved to rNib", request.TransactionId)
-                       logger.Debugf("#ranLostConnectionHandler.Handle - transactionId %s: saved to rNib. RanName %s, ConnectionStatus %v", request.TransactionId, nb.RanName, nb.ConnectionStatus)
-
+                       logger.Infof("#ranLostConnectionHandler.Handle - transactionId %s: saved to rNib. RanName %s, ConnectionStatus %v", request.TransactionId, nb.RanName, nb.ConnectionStatus)
                }
        }
        e2session, ok := e2Sessions[request.TransactionId]
index 5e343fe..a8745f9 100644 (file)
@@ -23,5 +23,5 @@ import (
 )
 
 type RequestHandler interface {
-       Handle(logger *logger.Logger, request models.Request, rmrResponseChannel chan<- *models.NotificationResponse) error
+       Handle(logger *logger.Logger, request models.Request) error
 }
index e666513..8191aad 100644 (file)
@@ -134,7 +134,7 @@ func NewX2ResetRequestHandler(rmrService *services.RmrService, config *configura
        }
 }
 
-func (handler *X2ResetRequestHandler) Handle(logger *logger.Logger, request models.Request, rmrResponseChannel chan<- *models.NotificationResponse) error {
+func (handler *X2ResetRequestHandler) Handle(logger *logger.Logger, request models.Request) error {
        resetRequest := request.(models.ResetRequest)
        nodeb, err  := handler.readerProvider().GetNodeb(resetRequest.RanName)
        if err != nil {
index 1e601fb..b5456cc 100644 (file)
@@ -59,14 +59,14 @@ func main() {
        defer rmrService.CloseContext()
        go rmrServiceReceiver.ListenAndHandle()
        go rmrService.SendResponse()
-       runServer(rmrService, logger, config, rmrResponseChannel)
+       runServer(rmrService, logger, config)
 }
 
-func runServer(rmrService *services.RmrService, logger *logger.Logger, config *configuration.Configuration, rmrResponseChannel chan *models.NotificationResponse) {
+func runServer(rmrService *services.RmrService, logger *logger.Logger, config *configuration.Configuration) {
 
        router := httprouter.New()
        controller := controllers.NewNodebController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter)
-       newController := controllers.NewController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter, config, rmrResponseChannel)
+       newController := controllers.NewController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter, config)
 
        router.POST("/v1/nodeb/:messageType", controller.HandleRequest)
        router.GET("/v1/nodeb-ids", controller.GetNodebIdList)
index e8a124a..dc42966 100644 (file)
@@ -52,7 +52,7 @@ func initRequestHandlerMap(rmrService *services.RmrService,config *configuration
        rNibReaderProvider func() reader.RNibReader) map[IncomingRequest]handlers.RequestHandler {
 
        return map[IncomingRequest]handlers.RequestHandler{
-               ShutdownRequest: handlers.NewDeleteAllRequestHandler(config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer
+               ShutdownRequest: handlers.NewDeleteAllRequestHandler(rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer
                ResetRequest: handlers.NewX2ResetRequestHandler(rmrService, config, rNibWriterProvider, rNibReaderProvider),      //TODO change to pointer
        }
 }