From: Amichai Date: Wed, 11 Sep 2019 13:59:16 +0000 (+0300) Subject: [RICPLT-2165] Add rnibDataService to support retries X-Git-Tag: 2.0.10~5 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F43%2F943%2F1;p=ric-plt%2Fe2mgr.git [RICPLT-2165] Add rnibDataService to support retries Change-Id: Ia9dc8bbeead1d1f4fd0f970789bcd4b9af2f0540 Signed-off-by: Amichai --- diff --git a/E2Manager/configuration/configuration.go b/E2Manager/configuration/configuration.go index b0611b8..7d8992a 100644 --- a/E2Manager/configuration/configuration.go +++ b/E2Manager/configuration/configuration.go @@ -36,6 +36,8 @@ type Configuration struct { NotificationResponseBuffer int BigRedButtonTimeoutSec int MaxConnectionAttempts int + MaxRnibConnectionAttempts int + RnibRetryIntervalMs int } func ParseConfiguration() *Configuration{ @@ -58,6 +60,8 @@ func ParseConfiguration() *Configuration{ config.NotificationResponseBuffer = viper.GetInt("notificationResponseBuffer") config.BigRedButtonTimeoutSec = viper.GetInt("bigRedButtonTimeoutSec") config.MaxConnectionAttempts = viper.GetInt("maxConnectionAttempts") + config.MaxConnectionAttempts = viper.GetInt("maxRnibConnectionAttempts") + config.MaxConnectionAttempts = viper.GetInt("rnibRetryIntervalMs") return &config } diff --git a/E2Manager/controllers/controller.go b/E2Manager/controllers/controller.go index f9a7bb3..12ade63 100644 --- a/E2Manager/controllers/controller.go +++ b/E2Manager/controllers/controller.go @@ -24,10 +24,8 @@ import ( "e2mgr/managers" "e2mgr/models" "e2mgr/providers/httpmsghandlerprovider" - "e2mgr/rNibWriter" "e2mgr/services" "encoding/json" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "github.com/gorilla/mux" "io" "io/ioutil" @@ -53,10 +51,10 @@ type Controller struct { handlerProvider *httpmsghandlerprovider.IncomingRequestHandlerProvider } -func NewController(logger *logger.Logger, rmrService *services.RmrService, rNibReaderProvider func() reader.RNibReader, rNibWriterProvider func() rNibWriter.RNibWriter, +func NewController(logger *logger.Logger, rmrService *services.RmrService, rnibDataService services.RNibDataService, config *configuration.Configuration, ranSetupManager *managers.RanSetupManager) *Controller { - provider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider, ranSetupManager) + provider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrService, config, rnibDataService, ranSetupManager) return &Controller{ logger: logger, handlerProvider: provider, diff --git a/E2Manager/controllers/controller_test.go b/E2Manager/controllers/controller_test.go index f14d830..cf5ae71 100644 --- a/E2Manager/controllers/controller_test.go +++ b/E2Manager/controllers/controller_test.go @@ -29,6 +29,7 @@ import ( "e2mgr/providers/httpmsghandlerprovider" "e2mgr/rNibWriter" "e2mgr/rmrCgo" + "e2mgr/services" "e2mgr/tests" "encoding/json" "fmt" @@ -46,17 +47,29 @@ import ( "testing" ) -func TestX2SetupInvalidBody(t *testing.T) { - - readerMock, writerMock, rmrMessengerMock, ranSetupManager := initTest(t) +func setupControllerTest(t *testing.T) (*Controller, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock){ log := initLog(t) + config := configuration.ParseConfiguration() + rmrMessengerMock := &mocks.RmrMessengerMock{} + readerMock := &mocks.RnibReaderMock{} readerProvider := func() reader.RNibReader { return readerMock } + writerMock := &mocks.RnibWriterMock{} writerProvider := func() rNibWriter.RNibWriter { return writerMock } + rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider) + + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rnibDataService) + controller := NewController(log, getRmrService(rmrMessengerMock, log), rnibDataService, config, ranSetupManager) + return controller, readerMock, writerMock, rmrMessengerMock +} + +func TestX2SetupInvalidBody(t *testing.T) { + + controller, _, _, _ := setupControllerTest(t) header := http.Header{} header.Set("Content-Type", "application/json") @@ -64,8 +77,6 @@ func TestX2SetupInvalidBody(t *testing.T) { httpRequest.Header = header writer := httptest.NewRecorder() - config := configuration.ParseConfiguration() - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) controller.X2SetupHandler(writer, httpRequest) var errorResponse = parseJsonRequest(t, writer.Body) @@ -76,15 +87,7 @@ func TestX2SetupInvalidBody(t *testing.T) { func TestX2SetupSuccess(t *testing.T) { - readerMock, writerMock, rmrMessengerMock, ranSetupManager := initTest(t) - log := initLog(t) - - readerProvider := func() reader.RNibReader { - return readerMock - } - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } + controller, readerMock, writerMock, rmrMessengerMock := setupControllerTest(t) ranName := "test" nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} @@ -105,8 +108,6 @@ func TestX2SetupSuccess(t *testing.T) { httpRequest.Header = header writer := httptest.NewRecorder() - config := configuration.ParseConfiguration() - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) controller.X2SetupHandler(writer, httpRequest) assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) @@ -114,15 +115,7 @@ func TestX2SetupSuccess(t *testing.T) { func TestEndcSetupSuccess(t *testing.T) { - readerMock, writerMock, rmrMessengerMock, ranSetupManager := initTest(t) - log := initLog(t) - - readerProvider := func() reader.RNibReader { - return readerMock - } - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } + controller, readerMock, writerMock, rmrMessengerMock := setupControllerTest(t) ranName := "test" nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} @@ -143,34 +136,20 @@ func TestEndcSetupSuccess(t *testing.T) { httpRequest.Header = header writer := httptest.NewRecorder() - config := configuration.ParseConfiguration() - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) controller.EndcSetupHandler(writer, httpRequest) assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) } func TestShutdownHandlerRnibError(t *testing.T) { - log := initLog(t) - config := configuration.ParseConfiguration() - - rmrMessengerMock := &mocks.RmrMessengerMock{} - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } + controller, readerMock, _, _:= setupControllerTest(t) rnibErr := &common.ResourceNotFoundError{} var nbIdentityList []*entities.NbIdentity readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr) writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) + controller.ShutdownHandler(writer, tests.GetHttpRequest()) var errorResponse = parseJsonRequest(t, writer.Body) @@ -180,22 +159,9 @@ func TestShutdownHandlerRnibError(t *testing.T) { } func TestHeaderValidationFailed(t *testing.T) { - log := initLog(t) - config := configuration.ParseConfiguration() - - rmrMessengerMock := &mocks.RmrMessengerMock{} - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } + controller, _, _, _ := setupControllerTest(t) writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) header := &http.Header{} @@ -210,48 +176,22 @@ func TestHeaderValidationFailed(t *testing.T) { } func TestShutdownStatusNoContent(t *testing.T) { - log := initLog(t) - - rmrMessengerMock := &mocks.RmrMessengerMock{} - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - config := configuration.ParseConfiguration() + controller, readerMock, _, _ := setupControllerTest(t) var rnibError error nbIdentityList := []*entities.NbIdentity{} readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError) writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) controller.ShutdownHandler(writer, tests.GetHttpRequest()) assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) } func TestHandleInternalError(t *testing.T) { - log := initLog(t) - config := configuration.ParseConfiguration() - - rmrMessengerMock := &mocks.RmrMessengerMock{} - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } + controller, _, _, _ := setupControllerTest(t) writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) err := e2managererrors.NewInternalError() controller.handleErrorResponse(err, writer) @@ -263,21 +203,8 @@ func TestHandleInternalError(t *testing.T) { } func TestHandleCommandAlreadyInProgressError(t *testing.T) { - log := initLog(t) - config := configuration.ParseConfiguration() - - rmrMessengerMock := &mocks.RmrMessengerMock{} - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } + controller, _, _, _ := setupControllerTest(t) writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) err := e2managererrors.NewCommandAlreadyInProgressError() controller.handleErrorResponse(err, writer) @@ -289,20 +216,7 @@ func TestHandleCommandAlreadyInProgressError(t *testing.T) { } func TestValidateHeaders(t *testing.T) { - log := initLog(t) - - rmrMessengerMock := &mocks.RmrMessengerMock{} - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - config := configuration.ParseConfiguration() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) + controller, _, _, _ := setupControllerTest(t) header := http.Header{} header.Set("Content-Type", "application/json") @@ -332,30 +246,15 @@ func initLog(t *testing.T) *logger.Logger { } func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) { - log := initLog(t) + controller, readerMock, _, rmrMessengerMock := setupControllerTest(t) ranName := "test1" - - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) - config := configuration.ParseConfiguration() - rmrService := getRmrService(rmrMessengerMock, log) - writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager) var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} readerMock.On("GetNodeb", ranName).Return(nodeb, nil) @@ -372,31 +271,16 @@ func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) { } func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) { - log := initLog(t) + controller, readerMock, _, rmrMessengerMock := setupControllerTest(t) ranName := "test1" - - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } // o&m intervention payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) - config := configuration.ParseConfiguration() - rmrService := getRmrService(rmrMessengerMock, log) - writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager) var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} readerMock.On("GetNodeb", ranName).Return(nodeb, nil) @@ -412,26 +296,11 @@ func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) { } func TestX2ResetHandleFailureInvalidBody(t *testing.T) { - log := initLog(t) + controller, _, _, _ := setupControllerTest(t) ranName := "test1" - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - rmrMessengerMock := &mocks.RmrMessengerMock{} - - config := configuration.ParseConfiguration() - rmrService := getRmrService(rmrMessengerMock, log) - writer := httptest.NewRecorder() - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager) // Invalid json: attribute name without quotes (should be "cause":). b := strings.NewReader("{cause:\"protocol:transfer-syntax-error\"") @@ -444,22 +313,7 @@ func TestX2ResetHandleFailureInvalidBody(t *testing.T) { } func TestHandleErrorResponse(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() - rmrService := getRmrService(rmrMessengerMock, log) - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager) + controller, _, _, _ := setupControllerTest(t) writer := httptest.NewRecorder() controller.handleErrorResponse(e2managererrors.NewRnibDbError(), writer) @@ -492,21 +346,4 @@ func TestHandleErrorResponse(t *testing.T) { writer = httptest.NewRecorder() controller.handleErrorResponse(fmt.Errorf("ErrorError"), writer) assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode) -} - -func initTest(t *testing.T)(*mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanSetupManager) { - log := initLog(t) - - readerMock := &mocks.RnibReaderMock{} - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrService := getRmrService(rmrMessengerMock, log) - - ranSetupManager := managers.NewRanSetupManager(log, rmrService, writerProvider) - - return readerMock, writerMock, rmrMessengerMock, ranSetupManager } \ No newline at end of file diff --git a/E2Manager/controllers/nodeb_controller.go b/E2Manager/controllers/nodeb_controller.go index cdb76a9..28b713e 100644 --- a/E2Manager/controllers/nodeb_controller.go +++ b/E2Manager/controllers/nodeb_controller.go @@ -20,12 +20,10 @@ package controllers import ( "e2mgr/logger" "e2mgr/models" - "e2mgr/rNibWriter" "e2mgr/services" "e2mgr/utils" "encoding/json" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "github.com/golang/protobuf/jsonpb" "github.com/gorilla/mux" "net/http" @@ -53,25 +51,22 @@ type INodebController interface { type NodebController struct { rmrService *services.RmrService Logger *logger.Logger - rnibReaderProvider func() reader.RNibReader - rnibWriterProvider func() rNibWriter.RNibWriter + rnibDataService services.RNibDataService } -func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *NodebController { +func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibDataService services.RNibDataService) *NodebController { messageChannel = make(chan *models.E2RequestMessage) errorChannel = make(chan error) return &NodebController{ rmrService: rmrService, Logger: logger, - rnibReaderProvider: rnibReaderProvider, - rnibWriterProvider: rnibWriterProvider, + rnibDataService: rnibDataService, } } func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *http.Request) { startTime := time.Now() - rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider) - nodebIdList, rnibError := rnibReaderService.GetNodebIdList() + nodebIdList, rnibError := rc.rnibDataService.GetListNodebIds() if rnibError != nil { rc.Logger.Errorf("%v", rnibError); @@ -98,9 +93,7 @@ func (rc NodebController) GetNodeb(writer http.ResponseWriter, request *http.Req startTime := time.Now() vars := mux.Vars(request) ranName := vars["ranName"] - // WAS: respondingNode, rnibError := reader.GetRNibReader().GetNodeb(ranName) - rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider) - respondingNode, rnibError := rnibReaderService.GetNodeb(ranName) + respondingNode, rnibError := rc.rnibDataService.GetNodeb(ranName) if rnibError != nil { rc.Logger.Errorf("%v", rnibError) httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError) diff --git a/E2Manager/controllers/nodeb_controller_test.go b/E2Manager/controllers/nodeb_controller_test.go index 812d7dc..f49cd8c 100644 --- a/E2Manager/controllers/nodeb_controller_test.go +++ b/E2Manager/controllers/nodeb_controller_test.go @@ -18,6 +18,7 @@ package controllers import ( + "e2mgr/configuration" "e2mgr/logger" "e2mgr/mocks" "e2mgr/models" @@ -37,19 +38,30 @@ import ( "testing" ) -func TestNewRequestController(t *testing.T) { +func setupNodebControllerTest(t *testing.T) (*logger.Logger, services.RNibDataService, *mocks.RnibReaderMock){ + 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} + readerMock := &mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { - return &mocks.RnibReaderMock{} + return readerMock } rnibWriterProvider := func() rNibWriter.RNibWriter { return &mocks.RnibWriterMock{} } + rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) + return logger, rnibDataService, readerMock +} - assert.NotNil(t, NewNodebController(&logger.Logger{}, &services.RmrService{}, rnibReaderProvider, rnibWriterProvider)) +func TestNewRequestController(t *testing.T) { + logger, rnibDataService, _ := setupNodebControllerTest(t) + assert.NotNil(t, NewNodebController(logger, &services.RmrService{}, rnibDataService)) } func TestHandleHealthCheckRequest(t *testing.T) { - rc := NewNodebController(nil, nil, nil, nil) + rc := NewNodebController(nil, nil, nil) writer := httptest.NewRecorder() rc.HandleHealthCheckRequest(writer, nil) assert.Equal(t, writer.Result().StatusCode, http.StatusOK) @@ -62,96 +74,62 @@ func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, messageChannel) } -func executeGetNodeb(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibReaderProvider func() reader.RNibReader) { +func executeGetNodeb(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibDataService services.RNibDataService) { req, _ := http.NewRequest("GET", "/nodeb", nil) req = mux.SetURLVars(req, map[string]string{"ranName": "testNode"}) - NewNodebController(logger, nil, rnibReaderProvider, nil).GetNodeb(writer, req) + NewNodebController(logger, nil, rnibDataService).GetNodeb(writer, req) } func TestNodebController_GetNodeb_Success(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - - if err != nil { - t.Errorf("#nodeb_controller_test.TestNodebController_GetNodeb_Success - failed to initialize logger, error: %s", err) - } + logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t) writer := httptest.NewRecorder() - rnibReaderMock := mocks.RnibReaderMock{} var rnibError error rnibReaderMock.On("GetNodeb", "testNode").Return(&entities.NodebInfo{}, rnibError) - rnibReaderProvider := func() reader.RNibReader { - return &rnibReaderMock - } - - executeGetNodeb(log, writer, rnibReaderProvider) + executeGetNodeb(logger, writer, rnibDataService) assert.Equal(t, writer.Result().StatusCode, http.StatusOK) } func TestNodebController_GetNodeb_NotFound(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - - if err != nil { - t.Errorf("#nodeb_controller_test.TestNodebController_GetNodeb_NotFound - failed to initialize logger, error: %s", err) - } + logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t) writer := httptest.NewRecorder() - rnibReaderMock := mocks.RnibReaderMock{} rnibError := common.NewResourceNotFoundErrorf("#reader.GetNodeb - responding node %s not found", "testNode") var nodebInfo *entities.NodebInfo rnibReaderMock.On("GetNodeb", "testNode").Return(nodebInfo, rnibError) - rnibReaderProvider := func() reader.RNibReader { - return &rnibReaderMock - } - - executeGetNodeb(log, writer, rnibReaderProvider) + executeGetNodeb(logger, writer, rnibDataService) assert.Equal(t, writer.Result().StatusCode, http.StatusNotFound) } func TestNodebController_GetNodeb_InternalError(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - - if err != nil { - t.Errorf("#nodeb_controller_test.TestNodebController_GetNodeb_InternalError - failed to initialize logger, error: %s", err) - } + logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t) writer := httptest.NewRecorder() - rnibReaderMock := mocks.RnibReaderMock{} - rnibError := common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error")) var nodebInfo *entities.NodebInfo rnibReaderMock.On("GetNodeb", "testNode").Return(nodebInfo, rnibError) - rnibReaderProvider := func() reader.RNibReader { - return &rnibReaderMock - } - - executeGetNodeb(log, writer, rnibReaderProvider) + executeGetNodeb(logger, writer, rnibDataService) assert.Equal(t, writer.Result().StatusCode, http.StatusInternalServerError) } -func executeGetNodebIdList(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibReaderProvider func() reader.RNibReader) { +func executeGetNodebIdList(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibDataService services.RNibDataService) { req, _ := http.NewRequest("GET", "/nodeb-ids", nil) - NewNodebController(logger, nil, rnibReaderProvider, nil).GetNodebIdList(writer, req) + NewNodebController(logger, nil, rnibDataService).GetNodebIdList(writer,req) } func TestNodebController_GetNodebIdList_Success(t *testing.T) { - logger, err := logger.InitLogger(logger.InfoLevel) - - if err != nil { - t.Errorf("#nodeb_controller_test.TestNodebController_GetNodebIdList_Success - failed to initialize logger, error: %s", err) - } - + logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t) writer := httptest.NewRecorder() - rnibReaderMock := mocks.RnibReaderMock{} var rnibError error nbList := []*entities.NbIdentity{ @@ -161,61 +139,38 @@ func TestNodebController_GetNodebIdList_Success(t *testing.T) { } rnibReaderMock.On("GetListNodebIds").Return(nbList, rnibError) - rnibReaderProvider := func() reader.RNibReader { - return &rnibReaderMock - } - - executeGetNodebIdList(logger, writer, rnibReaderProvider) + executeGetNodebIdList(logger, writer, rnibDataService) assert.Equal(t, writer.Result().StatusCode, http.StatusOK) - bodyBytes, err := ioutil.ReadAll(writer.Body) + bodyBytes, _ := ioutil.ReadAll(writer.Body) assert.Equal(t, "[{\"inventoryName\":\"test1\",\"globalNbId\":{\"plmnId\":\"plmnId1\",\"nbId\":\"nbId1\"}},{\"inventoryName\":\"test2\",\"globalNbId\":{\"plmnId\":\"plmnId2\",\"nbId\":\"nbId2\"}},{\"inventoryName\":\"test3\",\"globalNbId\":{}}]", string(bodyBytes)) } func TestNodebController_GetNodebIdList_EmptyList(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - - if err != nil { - t.Errorf("#nodeb_controller_test.TestNodebController_GetNodebIdList_EmptyList - failed to initialize logger, error: %s", err) - } + logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t) writer := httptest.NewRecorder() - rnibReaderMock := mocks.RnibReaderMock{} - var rnibError error nbList := []*entities.NbIdentity{} rnibReaderMock.On("GetListNodebIds").Return(nbList, rnibError) - rnibReaderProvider := func() reader.RNibReader { - return &rnibReaderMock - } - executeGetNodebIdList(log, writer, rnibReaderProvider) + executeGetNodebIdList(logger, writer, rnibDataService) assert.Equal(t, writer.Result().StatusCode, http.StatusOK) - bodyBytes, err := ioutil.ReadAll(writer.Body) + bodyBytes, _ := ioutil.ReadAll(writer.Body) assert.Equal(t, "[]", string(bodyBytes)) } func TestNodebController_GetNodebIdList_InternalError(t *testing.T) { - logger, err := logger.InitLogger(logger.InfoLevel) - - if err != nil { - t.Errorf("#nodeb_controller_test.TestNodebController_GetNodebIdList_InternalError - failed to initialize logger, error: %s", err) - } + logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t) writer := httptest.NewRecorder() - rnibReaderMock := mocks.RnibReaderMock{} - rnibError := common.NewInternalError(errors.New("#reader.GetEnbIdList - Internal Error")) var nbList []*entities.NbIdentity rnibReaderMock.On("GetListNodebIds").Return(nbList, rnibError) - rnibReaderProvider := func() reader.RNibReader { - return &rnibReaderMock - } - - executeGetNodebIdList(logger, writer, rnibReaderProvider) + executeGetNodebIdList(logger, writer, rnibDataService) assert.Equal(t, writer.Result().StatusCode, http.StatusInternalServerError) } diff --git a/E2Manager/converters/endc_x2setupFailureResponseToProtobuf_test.go b/E2Manager/converters/endc_x2setupFailureResponseToProtobuf_test.go index f51b987..cdd2f25 100644 --- a/E2Manager/converters/endc_x2setupFailureResponseToProtobuf_test.go +++ b/E2Manager/converters/endc_x2setupFailureResponseToProtobuf_test.go @@ -20,7 +20,6 @@ package converters import ( "e2mgr/e2pdus" "e2mgr/logger" - "e2mgr/rNibWriter" "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "strings" @@ -35,14 +34,12 @@ func TestUnpackEndcX2SetupFailureResponseAndExtract(t *testing.T) { logger, _ := logger.InitLogger(logger.InfoLevel) var testCases = []struct { - saveToRNib bool - response string - packedPdu string - failure error + response string + packedPdu string + failure error }{ { - saveToRNib: false, //TODO: use MOCK? - response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics: > ", + response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics: > ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -77,7 +74,6 @@ func TestUnpackEndcX2SetupFailureResponseAndExtract(t *testing.T) { /**** shares the same code with x2setup failure response to protobuf ****/ } - initDb_f := true for _, tc := range testCases { t.Run(tc.packedPdu, func(t *testing.T) { @@ -113,23 +109,6 @@ func TestUnpackEndcX2SetupFailureResponseAndExtract(t *testing.T) { t.Errorf("want: response=[%s], got: [%s]", tc.response, respStr) } - // Save to rNib - if tc.saveToRNib { - if initDb_f { - rNibWriter.Init("e2Manager", 1) - initDb_f = false - } - nbIdentity := &entities.NbIdentity{InventoryName: "RanName"} - if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil { - if tc.failure == nil { - t.Errorf("rNibWriter failed to save ENB. Error: %s\n", rNibErr.Error()) - } else { - if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 { - t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error()) - } - } - } - } } }) } diff --git a/E2Manager/converters/endc_x2setupResponseToProtobuf_test.go b/E2Manager/converters/endc_x2setupResponseToProtobuf_test.go index 60b7e6d..e3de6b3 100644 --- a/E2Manager/converters/endc_x2setupResponseToProtobuf_test.go +++ b/E2Manager/converters/endc_x2setupResponseToProtobuf_test.go @@ -20,7 +20,6 @@ package converters import ( "e2mgr/e2pdus" "e2mgr/logger" - "e2mgr/rNibWriter" "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "strings" @@ -35,16 +34,14 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { logger, _ := logger.InitLogger(logger.InfoLevel) var testCases = []struct { - saveToRNib bool - key *entities.GlobalNbId - gnb string - packedPdu string - failure error + key *entities.GlobalNbId + gnb string + packedPdu string + failure error }{ { - saveToRNib: false, //TODO: use MOCK? - key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}, - gnb: "CONNECTED [served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > nr_neighbour_infos: > frequency_bands: > > > > ]", + key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}, + gnb: "CONNECTED [served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > nr_neighbour_infos: > frequency_bands: > > > > ]", /* E2AP-PDU: successfulOutcome_t @@ -152,9 +149,8 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "202400808e00000100f600808640000200fc00090002f829504a952a0a00fd007200010c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000211e148033e4e5e4c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a00021a0044033e4e5e000000002c001e3f271f2e3d4ff0031e3f274400010000150400000a00020000"}, { - saveToRNib: false, - key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}, - gnb: "CONNECTED [served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > nr_neighbour_infos: > frequency_bands: > > > > ]", + key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}, + gnb: "CONNECTED [served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > nr_neighbour_infos: > frequency_bands: > > > > ]", /* E2AP-PDU: successfulOutcome_t @@ -234,8 +230,7 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { packedPdu: "2024006500000100f6005e40000200fc00090002f829504a952a0a00fd004a00004c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000209e040033e4e5e000000002c001e3f271f2e3d4ff0031e3f274400050000150400000a00061820"}, { - saveToRNib: false, - key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}, + key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}, gnb: "CONNECTED [served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > nr_neighbour_infos: > frequency_bands: > > > > ]", /* E2AP-PDU: @@ -344,9 +339,8 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { packedPdu: "202400808e00000100f600808640000200fc00090002f829504a952a0a00fd007200010c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000211e148033e4e5e4c0008002e3f451f2e3d4ff04faa3c1a2f0050321e4400040000060400000200081a00440350321e000000002c001e3f271f2e3d4ff0031e3f274400010000150400000a00020000"}, { - saveToRNib: false, - key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}, - gnb: "CONNECTED [served_nr_cell_information: > dl_freq_info: > ul_transmission_bandwidth: dl_transmission_bandwidth: > > > nr_neighbour_infos: > dlar_fcn_freq_info: > > > > ]", + key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}, + gnb: "CONNECTED [served_nr_cell_information: > dl_freq_info: > ul_transmission_bandwidth: dl_transmission_bandwidth: > > > nr_neighbour_infos: > dlar_fcn_freq_info: > > > > ]", /* E2AP-PDU: successfulOutcome_t @@ -435,9 +429,8 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { { - saveToRNib: false, - key: &entities.GlobalNbId{PlmnId:"04a5c1", NbId:"4fc52bff"}, - gnb: "CONNECTED [served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > nr_neighbour_infos: > frequency_bands: > > > > nr_neighbour_infos: > frequency_bands: > > > > ]", + key: &entities.GlobalNbId{PlmnId: "04a5c1", NbId: "4fc52bff"}, + gnb: "CONNECTED [served_nr_cell_information: > frequency_bands: > transmission_bandwidth: > > > nr_neighbour_infos: > frequency_bands: > > > > nr_neighbour_infos: > frequency_bands: > > > > ]", /* E2AP-PDU: successfulOutcome_t @@ -536,7 +529,7 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "202400808200000100f6007b40000200fc00090004a5c1504fc52bff00fd006700004c000900aeafa72a3e3b4cd07d4773477f007e7e7e4400080000150400000a0009020204037e7e7e000100002c005a5ff12a3e3b4cd0035a5ff144000500000304000002000608200009005d5caaaf3e354ac0035d5caa4400070000020400000000081860"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952aaa"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952aaa"}, /* E2AP-PDU: successfulOutcome_t @@ -562,7 +555,6 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { failure: fmt.Errorf("getList for path [successfulOutcome_t ENDCX2SetupResponse protocolIEs_t ProtocolIE_Container_elm RespondingNodeType-EndcX2Setup respond_en_gNB_t ProtocolIE_Container_elm ServedNRcellsENDCX2ManagementList ServedNRcellsENDCX2ManagementList_elm servedNRCellInfo_t nrpCI_t] failed, rc = 1" /*NO_ITEMS*/),}, } - initDb_f := true for _, tc := range testCases { t.Run(tc.packedPdu, func(t *testing.T) { @@ -580,9 +572,9 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { if tc.failure == nil { t.Errorf("want: success, got: error: %v\n", err) } else { - if strings.Compare(err.Error(), tc.failure.Error()) != 0 { - t.Errorf("want: %s, got: %s", tc.failure, err) - } + if strings.Compare(err.Error(), tc.failure.Error()) != 0 { + t.Errorf("want: %s, got: %s", tc.failure, err) + } } } @@ -591,7 +583,7 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { t.Errorf("want: key=%v, got: empty key", tc.key) } } else { - if strings.Compare(key.PlmnId, tc.key.PlmnId) != 0 || strings.Compare(key.NbId, tc.key.NbId) != 0{ + if strings.Compare(key.PlmnId, tc.key.PlmnId) != 0 || strings.Compare(key.NbId, tc.key.NbId) != 0 { t.Errorf("want: key=%v, got: %v", tc.key, key) } } @@ -603,31 +595,13 @@ func TestUnpackEndcX2SetupResponseAndExtract(t *testing.T) { } else { nb := &entities.NodebInfo{} nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - nb.Configuration = &entities.NodebInfo_Gnb{Gnb:gnb} + nb.Configuration = &entities.NodebInfo_Gnb{Gnb: gnb} gnbStr := fmt.Sprintf("%s %s", nb.ConnectionStatus, gnb.ServedNrCells) if !strings.EqualFold(gnbStr, tc.gnb) { t.Errorf("want: enb=%s, got: %s", tc.gnb, gnbStr) } - // Save to rNib - if tc.saveToRNib { - if initDb_f { - rNibWriter.Init("e2Manager", 1) - initDb_f = false - } - nbIdentity := &entities.NbIdentity{InventoryName:"RanName", GlobalNbId:key} - if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil { - if tc.failure == nil { - t.Errorf("rNibWriter failed to save ENB. Error: %v\n", rNibErr.Error()) - } else { - if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 { - t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error()) - } - } - } - } } }) } } - diff --git a/E2Manager/converters/x2setupFailureResponseToProtobuf_test.go b/E2Manager/converters/x2setupFailureResponseToProtobuf_test.go index 3bc099b..787dd19 100644 --- a/E2Manager/converters/x2setupFailureResponseToProtobuf_test.go +++ b/E2Manager/converters/x2setupFailureResponseToProtobuf_test.go @@ -20,7 +20,6 @@ package converters import ( "e2mgr/e2pdus" "e2mgr/logger" - "e2mgr/rNibWriter" "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "strings" @@ -35,14 +34,12 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { logger, _ := logger.InitLogger(logger.InfoLevel) var testCases = []struct { - saveToRNib bool - response string - packedPdu string - failure error + response string + packedPdu string + failure error }{ { - saveToRNib: false, //TODO: use MOCK? - response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics: > ", + response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics: > ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -74,8 +71,7 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { */ packedPdu: "4006001a0000030005400200000016400100001140087821a00000008040"}, { - saveToRNib: false, - response: "CONNECTED_SETUP_FAILED transport_layer_cause:TRANSPORT_RESOURCE_UNAVAILABLE criticality_diagnostics: > ", + response: "CONNECTED_SETUP_FAILED transport_layer_cause:TRANSPORT_RESOURCE_UNAVAILABLE criticality_diagnostics: > ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -103,8 +99,7 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { */ packedPdu: "400600140000020005400120001140087821a00000008040"}, { - saveToRNib: false, - response: "CONNECTED_SETUP_FAILED protocol_cause:ABSTRACT_SYNTAX_ERROR_IGNORE_AND_NOTIFY criticality_diagnostics: > ", + response: "CONNECTED_SETUP_FAILED protocol_cause:ABSTRACT_SYNTAX_ERROR_IGNORE_AND_NOTIFY criticality_diagnostics: > ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -132,8 +127,7 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { packedPdu: "400600130000020005400144001140073a800000008040"}, { - saveToRNib: false, - response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics: > ", + response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics: > ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -160,8 +154,7 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { packedPdu: "400600120000020005400168001140061a0000008040"}, { - saveToRNib: false, - response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics: information_element_criticality_diagnostics: > ", + response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics: information_element_criticality_diagnostics: > ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -192,8 +185,7 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { { - saveToRNib: false, - response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics: ", + response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics: ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -215,8 +207,7 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { packedPdu: "4006000e0000020005400168001140024021"}, { - saveToRNib: false, - response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED ", + response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED ", /* E2AP-PDU: unsuccessfulOutcome_t @@ -232,7 +223,6 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { */ packedPdu: "400600080000010005400168"}, { - saveToRNib: false, response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics: > ", /* E2AP-PDU: @@ -268,7 +258,6 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { }, } - initDb_f := true for _, tc := range testCases { t.Run(tc.packedPdu, func(t *testing.T) { @@ -297,32 +286,14 @@ func TestUnpackX2SetupFailureResponseAndExtract(t *testing.T) { } else { nb := &entities.NodebInfo{} nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED_SETUP_FAILED - nb.SetupFailure = response + nb.SetupFailure = response nb.FailureType = entities.Failure_X2_SETUP_FAILURE respStr := fmt.Sprintf("%s %s", nb.ConnectionStatus, response) if !strings.EqualFold(respStr, tc.response) { t.Errorf("want: response=[%s], got: [%s]", tc.response, respStr) } - // Save to rNib - if tc.saveToRNib { - if initDb_f { - rNibWriter.Init("e2Manager", 1) - initDb_f = false - } - nbIdentity := &entities.NbIdentity{InventoryName:"RanName"} - if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil { - if tc.failure == nil { - t.Errorf("rNibWriter failed to save ENB. Error: %s\n", rNibErr.Error()) - } else { - if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 { - t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error()) - } - } - } - } } }) } } - diff --git a/E2Manager/converters/x2setupResponseToProtobuf_test.go b/E2Manager/converters/x2setupResponseToProtobuf_test.go index 7ab91d1..1cd3f20 100644 --- a/E2Manager/converters/x2setupResponseToProtobuf_test.go +++ b/E2Manager/converters/x2setupResponseToProtobuf_test.go @@ -20,7 +20,6 @@ package converters import ( "e2mgr/e2pdus" "e2mgr/logger" - "e2mgr/rNibWriter" "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "strings" @@ -35,16 +34,14 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { logger, _ := logger.InitLogger(logger.InfoLevel) var testCases = []struct { - saveToRNib bool - key *entities.GlobalNbId - enb string - packedPdu string - failure error + key *entities.GlobalNbId + enb string + packedPdu string + failure error }{ { - saveToRNib: false, //TODO: use MOCK? - key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, - enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD ] []", + key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, + enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD ] []", /* X2AP-PDU: successfulOutcome_t @@ -81,7 +78,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "2006002a000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829000001000133"}, { - key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD ] []", /* X2AP-PDU: @@ -135,7 +132,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "20060043000002001500080002f82900007a8000140030010000630002f8290007ab50102002f8290000010001330000640002f9290007ac50203202f82902f929000002000344"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD ] []", /* X2AP-PDU: @@ -177,7 +174,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { EARFCNExtension = 0x2 */ packedPdu: "20060033000002001500080002f82900007a8000140020000000630002f8290007ab50102002f8291000010001330000005f0003800102"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD ] [02f729:0203 02f929:0304]", /* X2AP-PDU: @@ -225,7 +222,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "2006003a000003001500080002f82900007a8000140017000000630002f8290007ab50102002f8290000010001330018000c1002f72902030002f9290304"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > > eutra_mode:TDD ] []", /* X2AP-PDU: @@ -265,7 +262,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { cyclicPrefixUL_t = 0x1 */ packedPdu: "2006002a000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829400001320820"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: additional_special_subframe_info: > > eutra_mode:TDD ] []", /* X2AP-PDU: @@ -314,7 +311,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "20060032000002001500080002f82900007a800014001f000000630002f8290007ab50102002f8295000013208800000006140021220"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > > eutra_mode:TDD ] []", /* X2AP-PDU: @@ -360,7 +357,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "20060033000002001500080002f82900007a8000140020000000630002f8290007ab50102002f8295000013208800000005e0003800102"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: additional_special_subframe_extension_info: > > eutra_mode:TDD ] []", /* X2AP-PDU: @@ -409,7 +406,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "20060031000002001500080002f82900007a800014001e000000630002f8290007ab50102002f829500001320880000000b3400100"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: additional_special_subframe_info: additional_special_subframe_extension_info: > > eutra_mode:TDD ] []", /* X2AP-PDU: @@ -470,7 +467,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "2006003e000002001500080002f82900007a800014002b000000630002f8290007ab50102002f829500001320880000200b3400100006140021220005e0003800102"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80b0"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80b0"}, enb: "CONNECTED HOME_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD ] []", /* X2AP-PDU: @@ -530,144 +527,144 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "2006004b000002001500090002f82940007a80b000140037010800630002f8290007ab50102002f829000001000133000000294001000000640002f9290007ac50203202f82902f929000002000344"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"}, - enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD prach_configuration: ] []", - /* - X2AP-PDU: - successfulOutcome_t - procedureCode_t = 0x6 - criticality_t = 0 - X2SetupResponse - protocolIEs_t: - ProtocolIE_Container_elm - id_t = 0x15 - criticality_t = 0 - GlobalENB-ID - pLMN_Identity_t = 02 f8 29 - eNB_ID_t: - short_Macro_eNB_ID_t = 00 7a 40 (18 bits) - ProtocolIE_Container_elm - id_t = 0x14 - criticality_t = 0 - ServedCells: - ServedCells_elm - servedCellInfo_t - pCI_t = 0x63 - cellId_t - pLMN_Identity_t = 02 f8 29 - eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits) - tAC_t = 01 02 - broadcastPLMNs_t: - BroadcastPLMNs_Item_elm = 02 f8 29 - eUTRA_Mode_Info_t: - fDD_t - uL_EARFCN_t = 0x1 - dL_EARFCN_t = 0x1 - uL_Transmission_Bandwidth_t = 0x3 - dL_Transmission_Bandwidth_t = 0x3 - iE_Extensions_t: - ProtocolExtensionContainer_elm - id_t = 0x29 - criticality_t = 0x1 - Number-of-Antennaports = 0 - ServedCells_elm - servedCellInfo_t - pCI_t = 0x64 - cellId_t - pLMN_Identity_t = 02 f9 29 - eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits) - tAC_t = 02 03 - broadcastPLMNs_t: - BroadcastPLMNs_Item_elm = 02 f8 29 - BroadcastPLMNs_Item_elm = 02 f9 29 - eUTRA_Mode_Info_t: - fDD_t - uL_EARFCN_t = 0x2 - dL_EARFCN_t = 0x3 - uL_Transmission_Bandwidth_t = 0x4 - dL_Transmission_Bandwidth_t = 0x4 - iE_Extensions_t: - ProtocolExtensionContainer_elm - id_t = 0x37 - criticality_t = 0x1 - PRACH-Configuration - rootSequenceIndex_t = 0xf - zeroCorrelationIndex_t = 0x7 - highSpeedFlag_t = true - prach_FreqOffset_t = 0x1e + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"}, + enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD prach_configuration: ] []", + /* + X2AP-PDU: + successfulOutcome_t + procedureCode_t = 0x6 + criticality_t = 0 + X2SetupResponse + protocolIEs_t: + ProtocolIE_Container_elm + id_t = 0x15 + criticality_t = 0 + GlobalENB-ID + pLMN_Identity_t = 02 f8 29 + eNB_ID_t: + short_Macro_eNB_ID_t = 00 7a 40 (18 bits) + ProtocolIE_Container_elm + id_t = 0x14 + criticality_t = 0 + ServedCells: + ServedCells_elm + servedCellInfo_t + pCI_t = 0x63 + cellId_t + pLMN_Identity_t = 02 f8 29 + eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits) + tAC_t = 01 02 + broadcastPLMNs_t: + BroadcastPLMNs_Item_elm = 02 f8 29 + eUTRA_Mode_Info_t: + fDD_t + uL_EARFCN_t = 0x1 + dL_EARFCN_t = 0x1 + uL_Transmission_Bandwidth_t = 0x3 + dL_Transmission_Bandwidth_t = 0x3 + iE_Extensions_t: + ProtocolExtensionContainer_elm + id_t = 0x29 + criticality_t = 0x1 + Number-of-Antennaports = 0 + ServedCells_elm + servedCellInfo_t + pCI_t = 0x64 + cellId_t + pLMN_Identity_t = 02 f9 29 + eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits) + tAC_t = 02 03 + broadcastPLMNs_t: + BroadcastPLMNs_Item_elm = 02 f8 29 + BroadcastPLMNs_Item_elm = 02 f9 29 + eUTRA_Mode_Info_t: + fDD_t + uL_EARFCN_t = 0x2 + dL_EARFCN_t = 0x3 + uL_Transmission_Bandwidth_t = 0x4 + dL_Transmission_Bandwidth_t = 0x4 + iE_Extensions_t: + ProtocolExtensionContainer_elm + id_t = 0x37 + criticality_t = 0x1 + PRACH-Configuration + rootSequenceIndex_t = 0xf + zeroCorrelationIndex_t = 0x7 + highSpeedFlag_t = true + prach_FreqOffset_t = 0x1e - */ - packedPdu: "20060056000002001500090002f8298003007a4000140042010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f92900000200034400000037400500000f79e0"}, + */ + packedPdu: "20060056000002001500090002f8298003007a4000140042010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f92900000200034400000037400500000f79e0"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"}, - enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD mbsfn_subframe_infos: ] []", - /* - X2AP-PDU: - successfulOutcome_t - procedureCode_t = 0x6 - criticality_t = 0 - X2SetupResponse - protocolIEs_t: - ProtocolIE_Container_elm - id_t = 0x15 - criticality_t = 0 - GlobalENB-ID - pLMN_Identity_t = 02 f8 29 - eNB_ID_t: - short_Macro_eNB_ID_t = 00 7a 40 (18 bits) - ProtocolIE_Container_elm - id_t = 0x14 - criticality_t = 0 - ServedCells: - ServedCells_elm - servedCellInfo_t - pCI_t = 0x63 - cellId_t - pLMN_Identity_t = 02 f8 29 - eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits) - tAC_t = 01 02 - broadcastPLMNs_t: - BroadcastPLMNs_Item_elm = 02 f8 29 - eUTRA_Mode_Info_t: - fDD_t - uL_EARFCN_t = 0x1 - dL_EARFCN_t = 0x1 - uL_Transmission_Bandwidth_t = 0x3 - dL_Transmission_Bandwidth_t = 0x3 - iE_Extensions_t: - ProtocolExtensionContainer_elm - id_t = 0x29 - criticality_t = 0x1 - Number-of-Antennaports = 0 - ServedCells_elm - servedCellInfo_t - pCI_t = 0x64 - cellId_t - pLMN_Identity_t = 02 f9 29 - eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits) - tAC_t = 02 03 - broadcastPLMNs_t: - BroadcastPLMNs_Item_elm = 02 f8 29 - BroadcastPLMNs_Item_elm = 02 f9 29 - eUTRA_Mode_Info_t: - fDD_t - uL_EARFCN_t = 0x2 - dL_EARFCN_t = 0x3 - uL_Transmission_Bandwidth_t = 0x4 - dL_Transmission_Bandwidth_t = 0x4 - iE_Extensions_t: - ProtocolExtensionContainer_elm - id_t = 0x38 - criticality_t = 0x1 - MBSFN-Subframe-Infolist: - MBSFN_Subframe_Infolist_elm - radioframeAllocationPeriod_t = 0x3 - radioframeAllocationOffset_t = 0x3 - subframeAllocation_t: - oneframe_t = 28 (6 bits) - */ - packedPdu: "20060054000002001500090002f8298003007a4000140040010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f929000002000344000000384003019850"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"}, + enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD mbsfn_subframe_infos: ] []", + /* + X2AP-PDU: + successfulOutcome_t + procedureCode_t = 0x6 + criticality_t = 0 + X2SetupResponse + protocolIEs_t: + ProtocolIE_Container_elm + id_t = 0x15 + criticality_t = 0 + GlobalENB-ID + pLMN_Identity_t = 02 f8 29 + eNB_ID_t: + short_Macro_eNB_ID_t = 00 7a 40 (18 bits) + ProtocolIE_Container_elm + id_t = 0x14 + criticality_t = 0 + ServedCells: + ServedCells_elm + servedCellInfo_t + pCI_t = 0x63 + cellId_t + pLMN_Identity_t = 02 f8 29 + eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits) + tAC_t = 01 02 + broadcastPLMNs_t: + BroadcastPLMNs_Item_elm = 02 f8 29 + eUTRA_Mode_Info_t: + fDD_t + uL_EARFCN_t = 0x1 + dL_EARFCN_t = 0x1 + uL_Transmission_Bandwidth_t = 0x3 + dL_Transmission_Bandwidth_t = 0x3 + iE_Extensions_t: + ProtocolExtensionContainer_elm + id_t = 0x29 + criticality_t = 0x1 + Number-of-Antennaports = 0 + ServedCells_elm + servedCellInfo_t + pCI_t = 0x64 + cellId_t + pLMN_Identity_t = 02 f9 29 + eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits) + tAC_t = 02 03 + broadcastPLMNs_t: + BroadcastPLMNs_Item_elm = 02 f8 29 + BroadcastPLMNs_Item_elm = 02 f9 29 + eUTRA_Mode_Info_t: + fDD_t + uL_EARFCN_t = 0x2 + dL_EARFCN_t = 0x3 + uL_Transmission_Bandwidth_t = 0x4 + dL_Transmission_Bandwidth_t = 0x4 + iE_Extensions_t: + ProtocolExtensionContainer_elm + id_t = 0x38 + criticality_t = 0x1 + MBSFN-Subframe-Infolist: + MBSFN_Subframe_Infolist_elm + radioframeAllocationPeriod_t = 0x3 + radioframeAllocationOffset_t = 0x3 + subframeAllocation_t: + oneframe_t = 28 (6 bits) + */ + packedPdu: "20060054000002001500090002f8298003007a4000140040010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f929000002000344000000384003019850"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"}, enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD number_of_antenna_ports:AN1 mbsfn_subframe_infos: pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD ] []", /* X2AP-PDU: @@ -734,7 +731,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { dL_Transmission_Bandwidth_t = 0x4 */ packedPdu: "20060052000002001500090002f8298003007a400014003e010800630002f8290007ab50102002f82900000100013300010029400100003840030198500000640002f9290007ac50203202f82902f929000002000344"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"}, enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD number_of_antenna_ports:AN1 prach_configuration: pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD ] []", /* X2AP-PDU: @@ -800,72 +797,72 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { dL_Transmission_Bandwidth_t = 0x4 */ packedPdu: "20060054000002001500090002f8298003007a4000140040010800630002f8290007ab50102002f829000001000133000100294001000037400500000f79e00000640002f9290007ac50203202f82902f929000002000344"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a08"}, - enb: "CONNECTED LONG_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD prach_configuration: pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD ] []", - /* - X2AP-PDU: - successfulOutcome_t - procedureCode_t = 0x6 - criticality_t = 0 - X2SetupResponse - protocolIEs_t: - ProtocolIE_Container_elm - id_t = 0x15 - criticality_t = 0 - GlobalENB-ID - pLMN_Identity_t = 02 f8 29 - eNB_ID_t: - long_Macro_eNB_ID_t = 00 7a 08 (21 bits) - ProtocolIE_Container_elm - id_t = 0x14 - criticality_t = 0 - ServedCells: - ServedCells_elm - servedCellInfo_t - pCI_t = 0x63 - cellId_t - pLMN_Identity_t = 02 f8 29 - eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits) - tAC_t = 01 02 - broadcastPLMNs_t: - BroadcastPLMNs_Item_elm = 02 f8 29 - eUTRA_Mode_Info_t: - fDD_t - uL_EARFCN_t = 0x1 - dL_EARFCN_t = 0x1 - uL_Transmission_Bandwidth_t = 0x3 - dL_Transmission_Bandwidth_t = 0x3 - iE_Extensions_t: - ProtocolExtensionContainer_elm - id_t = 0x37 - criticality_t = 0x1 - PRACH-Configuration - rootSequenceIndex_t = 0xf - zeroCorrelationIndex_t = 0x7 - highSpeedFlag_t = true - prach_FreqOffset_t = 0x1e - prach_ConfigIndex_t = 0x3c - ServedCells_elm - servedCellInfo_t - pCI_t = 0x64 - cellId_t - pLMN_Identity_t = 02 f9 29 - eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits) - tAC_t = 02 03 - broadcastPLMNs_t: - BroadcastPLMNs_Item_elm = 02 f8 29 - BroadcastPLMNs_Item_elm = 02 f9 29 - eUTRA_Mode_Info_t: - fDD_t - uL_EARFCN_t = 0x2 - dL_EARFCN_t = 0x3 - uL_Transmission_Bandwidth_t = 0x4 - dL_Transmission_Bandwidth_t = 0x4 - */ - //packedPdu: "20060050000002001500090002f8298103007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"}, - packedPdu: "20060050000002001500090002f829c003007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a08"}, + enb: "CONNECTED LONG_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD prach_configuration: pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode: > eutra_mode:FDD ] []", + /* + X2AP-PDU: + successfulOutcome_t + procedureCode_t = 0x6 + criticality_t = 0 + X2SetupResponse + protocolIEs_t: + ProtocolIE_Container_elm + id_t = 0x15 + criticality_t = 0 + GlobalENB-ID + pLMN_Identity_t = 02 f8 29 + eNB_ID_t: + long_Macro_eNB_ID_t = 00 7a 08 (21 bits) + ProtocolIE_Container_elm + id_t = 0x14 + criticality_t = 0 + ServedCells: + ServedCells_elm + servedCellInfo_t + pCI_t = 0x63 + cellId_t + pLMN_Identity_t = 02 f8 29 + eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits) + tAC_t = 01 02 + broadcastPLMNs_t: + BroadcastPLMNs_Item_elm = 02 f8 29 + eUTRA_Mode_Info_t: + fDD_t + uL_EARFCN_t = 0x1 + dL_EARFCN_t = 0x1 + uL_Transmission_Bandwidth_t = 0x3 + dL_Transmission_Bandwidth_t = 0x3 + iE_Extensions_t: + ProtocolExtensionContainer_elm + id_t = 0x37 + criticality_t = 0x1 + PRACH-Configuration + rootSequenceIndex_t = 0xf + zeroCorrelationIndex_t = 0x7 + highSpeedFlag_t = true + prach_FreqOffset_t = 0x1e + prach_ConfigIndex_t = 0x3c + ServedCells_elm + servedCellInfo_t + pCI_t = 0x64 + cellId_t + pLMN_Identity_t = 02 f9 29 + eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits) + tAC_t = 02 03 + broadcastPLMNs_t: + BroadcastPLMNs_Item_elm = 02 f8 29 + BroadcastPLMNs_Item_elm = 02 f9 29 + eUTRA_Mode_Info_t: + fDD_t + uL_EARFCN_t = 0x2 + dL_EARFCN_t = 0x3 + uL_Transmission_Bandwidth_t = 0x4 + dL_Transmission_Bandwidth_t = 0x4 + */ + //packedPdu: "20060050000002001500090002f8298103007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"}, + packedPdu: "20060050000002001500090002f829c003007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD csg_id:\"0007aba0\" freq_band_indicator_priority:BROADCASTED bandwidth_reduced_si:SCHEDULED ] []", /* X2AP-PDU: @@ -916,7 +913,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "2006003e000002001500080002f82900007a800014002b000800630002f8290007ab50102002f8290000010001330002004640040007aba000a040014000b4400100"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD mbms_service_area_identities:\"02f8\" mbms_service_area_identities:\"03f9\" multiband_infos:1 multiband_infos:2 multiband_infos:3 freq_band_indicator_priority:NOT_BROADCASTED ] []", /* X2AP-PDU: @@ -974,7 +971,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { freqBandIndicator_t = 0x3 */ packedPdu: "20060044000002001500080002f82900007a8000140031000800630002f8290007ab50102002f8290000010001330002004f40050102f803f900a040010000544006200000010002"}, - { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD neighbour_infos: neighbour_infos: ] []", /* X2AP-PDU: @@ -1025,7 +1022,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "20060044000002001500080002f82900007a8000140031004000630002f8290007ab50102002f82900000100013300020002f8290007ab50006300010003f9300008bc5000640002"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD neighbour_infos: neighbour_infos: ] []", /* X2AP-PDU: @@ -1086,7 +1083,7 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { */ packedPdu: "20060055000002001500080002f82900007a8000140042004000630002f8290007ab50102002f82900000100013300024002f8290007ab50006300010000004c400201024003f9300008bc50006400020000005e0003800103"}, - {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"}, + {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"}, enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode: > eutra_mode:FDD neighbour_infos: neighbour_infos: ] []", /* X2AP-PDU: @@ -1146,10 +1143,9 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { EARFCNExtension = 0x3 */ packedPdu: "20060055000002001500080002f82900007a8000140042004000630002f8290007ab50102002f82900000100013300024002f8290007ab50006300010000004c400201024003f9300008bc50006400020000005e0003800103", - /*failure: fmt.Errorf("getAtom for path [successfulOutcome_t X2SetupResponse protocolIEs_t ProtocolIE_Container_elm GlobalENB-ID pLMN_Identity_t] failed, rc = 2" /NO_SPACE_LEFT),*/}, + /*failure: fmt.Errorf("getAtom for path [successfulOutcome_t X2SetupResponse protocolIEs_t ProtocolIE_Container_elm GlobalENB-ID pLMN_Identity_t] failed, rc = 2" /NO_SPACE_LEFT),*/ }, } - initDb_f := true for _, tc := range testCases { t.Run(tc.packedPdu, func(t *testing.T) { @@ -1188,31 +1184,12 @@ func TestUnpackX2SetupResponseAndExtract(t *testing.T) { } else { nb := &entities.NodebInfo{} nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - nb.Configuration = &entities.NodebInfo_Enb{Enb:enb} + nb.Configuration = &entities.NodebInfo_Enb{Enb: enb} embStr := fmt.Sprintf("%s %s %s %s", nb.ConnectionStatus, enb.EnbType, enb.ServedCells, enb.GuGroupIds) if !strings.EqualFold(embStr, tc.enb) { t.Errorf("want: enb=%s, got: %s", tc.enb, embStr) } - - // Save to rNib - if tc.saveToRNib { - if initDb_f { - rNibWriter.Init("e2Manager", 1) - initDb_f = false - } - nbIdentity := &entities.NbIdentity{InventoryName:"RanName", GlobalNbId:key} - if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil { - if tc.failure == nil { - t.Errorf("rNibWriter failed to save ENB. Error: %s\n", rNibErr.Error()) - } else { - if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 { - t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error()) - } - } - } - } } }) } } - diff --git a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go index c25235c..ba77075 100644 --- a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go +++ b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go @@ -23,29 +23,24 @@ import ( "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" ) type DeleteAllRequestHandler struct { - readerProvider func() reader.RNibReader - writerProvider func() rNibWriter.RNibWriter - rmrService *services.RmrService - config *configuration.Configuration + rnibDataService services.RNibDataService + rmrService *services.RmrService + config *configuration.Configuration logger *logger.Logger } -func NewDeleteAllRequestHandler(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, writerProvider func() rNibWriter.RNibWriter, - readerProvider func() reader.RNibReader) *DeleteAllRequestHandler { +func NewDeleteAllRequestHandler(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rnibDataService services.RNibDataService) *DeleteAllRequestHandler { return &DeleteAllRequestHandler{ logger: logger, - readerProvider: readerProvider, - writerProvider: writerProvider, + rnibDataService: rnibDataService, rmrService: rmrService, config: config, } @@ -81,7 +76,7 @@ func (handler *DeleteAllRequestHandler) Handle(request models.Request) error { } func (handler *DeleteAllRequestHandler) updateNodebStates(timeoutExpired bool) (error, bool) { - nbIdentityList, err := handler.readerProvider().GetListNodebIds() + nbIdentityList, err := handler.rnibDataService.GetListNodebIds() if err != nil { handler.logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodes list from RNIB. Error: %s", err.Error()) @@ -95,7 +90,7 @@ func (handler *DeleteAllRequestHandler) updateNodebStates(timeoutExpired bool) ( numOfRanToShutDown := 0 for _, nbIdentity := range nbIdentityList { - node, err := handler.readerProvider().GetNodeb((*nbIdentity).GetInventoryName()) + node, err := handler.rnibDataService.GetNodeb((*nbIdentity).GetInventoryName()) if err != nil { handler.logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodeB entity for ran name: %v from RNIB. Error: %s", @@ -138,7 +133,7 @@ func (handler *DeleteAllRequestHandler) saveNodebNextState(nbIdentity *entities. node.ConnectionStatus = nextStatus - err := handler.writerProvider().SaveNodeb(nbIdentity, node) + err := handler.rnibDataService.SaveNodeb(nbIdentity, node) if err != nil { handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebNextState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s", @@ -166,7 +161,7 @@ func (handler *DeleteAllRequestHandler) saveNodebShutDownState(nbIdentity *entit node.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN - err := handler.writerProvider().SaveNodeb(nbIdentity, node) + err := handler.rnibDataService.SaveNodeb(nbIdentity, node) if err != nil { handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s", diff --git a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go index be1cd25..6e16766 100644 --- a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go @@ -37,8 +37,9 @@ import ( "testing" ) -func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T) { +func setupTest(t *testing.T) (*logger.Logger, *configuration.Configuration, *mocks.RnibReaderMock, *mocks.RnibWriterMock, services.RNibDataService, *mocks.RmrMessengerMock) { log := initLog(t) + config := configuration.ParseConfiguration() readerMock := &mocks.RnibReaderMock{} readerProvider := func() reader.RNibReader { @@ -48,11 +49,15 @@ func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T) { writerProvider := func() rNibWriter.RNibWriter { return writerMock } + rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider) rmrMessengerMock := &mocks.RmrMessengerMock{} + return log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock +} - config := configuration.ParseConfiguration() +func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T){ + log, config, readerMock, _, rnibDataService, rmrMessengerMock := setupTest(t) - handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) rnibErr := &common.ResourceNotFoundError{} var nbIdentityList []*entities.NbIdentity @@ -65,22 +70,12 @@ func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T) { } } -func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T) { - log := initLog(t) +func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){ + log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(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(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) rnibErr := &common.ResourceNotFoundError{} //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown @@ -108,21 +103,11 @@ func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T) { } } -func TestHandleSuccessFlow(t *testing.T) { - log := initLog(t) +func TestHandleSuccessFlow(t *testing.T){ + log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(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(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown nbIdentityList := createIdentityList() @@ -163,21 +148,11 @@ func TestHandleSuccessFlow(t *testing.T) { assert.Nil(t, actual) } -func TestHandleSuccessGetNextStatusFlow(t *testing.T) { - log := initLog(t) +func TestHandleSuccessGetNextStatusFlow(t *testing.T){ + log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(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(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) @@ -205,21 +180,11 @@ func TestHandleSuccessGetNextStatusFlow(t *testing.T) { assert.Nil(t, actual) } -func TestHandleShuttingDownStatusFlow(t *testing.T) { - log := initLog(t) +func TestHandleShuttingDownStatusFlow(t *testing.T){ + log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(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(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) @@ -244,21 +209,11 @@ func TestHandleShuttingDownStatusFlow(t *testing.T) { assert.Nil(t, actual) } -func TestHandleGetNodebFailedFlow(t *testing.T) { - log := initLog(t) +func TestHandleGetNodebFailedFlow(t *testing.T){ + log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(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(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) //Before timer: Disconnected->ShutDown(will fail), ShuttingDown->Ignore, Connected->ShuttingDown nbIdentityList := createIdentityList() @@ -300,21 +255,11 @@ func TestHandleGetNodebFailedFlow(t *testing.T) { assert.Nil(t, actual) } -func TestHandleSaveFailedFlow(t *testing.T) { - log := initLog(t) +func TestHandleSaveFailedFlow(t *testing.T){ + log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(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(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail) nbIdentityList := createIdentityList() @@ -356,21 +301,11 @@ func TestHandleSaveFailedFlow(t *testing.T) { assert.Nil(t, actual) } -func TestHandleSendRmrFailedFlow(t *testing.T) { - log := initLog(t) +func TestHandleSendRmrFailedFlow(t *testing.T){ + log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(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(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail) nbIdentityList := createIdentityList() @@ -414,21 +349,10 @@ func TestHandleSendRmrFailedFlow(t *testing.T) { } } -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() +func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){ + log, config, readerMock, _, rnibDataService, rmrMessengerMock := setupTest(t) - handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService) var rnibError error nbIdentityList := []*entities.NbIdentity{} diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler.go index a792a45..36df7bf 100644 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler.go +++ b/E2Manager/handlers/httpmsghandlers/setup_request_handler.go @@ -21,11 +21,10 @@ import ( "e2mgr/logger" "e2mgr/managers" "e2mgr/models" - "e2mgr/rNibWriter" "e2mgr/rnibBuilders" + "e2mgr/services" "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" "github.com/go-ozzo/ozzo-validation" "github.com/go-ozzo/ozzo-validation/is" ) @@ -36,19 +35,17 @@ const ( ) type SetupRequestHandler struct { - readerProvider func() reader.RNibReader - writerProvider func() rNibWriter.RNibWriter + rNibDataService services.RNibDataService logger *logger.Logger ranSetupManager *managers.RanSetupManager protocol entities.E2ApplicationProtocol } -func NewSetupRequestHandler(logger *logger.Logger, writerProvider func() rNibWriter.RNibWriter, readerProvider func() reader.RNibReader, +func NewSetupRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService, ranSetupManager *managers.RanSetupManager, protocol entities.E2ApplicationProtocol) *SetupRequestHandler { return &SetupRequestHandler{ logger: logger, - readerProvider: readerProvider, - writerProvider: writerProvider, + rNibDataService: rNibDataService, ranSetupManager: ranSetupManager, protocol: protocol, } @@ -63,7 +60,7 @@ func (handler *SetupRequestHandler) Handle(request models.Request) error { return err } - nodebInfo, err := handler.readerProvider().GetNodeb(setupRequest.RanName) + nodebInfo, err := handler.rNibDataService.GetNodeb(setupRequest.RanName) if err != nil { _, ok := err.(*common.ResourceNotFoundError) if !ok { @@ -101,7 +98,7 @@ func (handler *SetupRequestHandler) connectNewRan(request *models.SetupRequest, nodebInfo, nodebIdentity := rnibBuilders.CreateInitialNodeInfo(request, protocol) - rNibErr := handler.writerProvider().SaveNodeb(nodebIdentity, nodebInfo) + rNibErr := handler.rNibDataService.SaveNodeb(nodebIdentity, nodebInfo) if rNibErr != nil { handler.logger.Errorf("#SetupRequestHandler.connectNewRan - failed to initial nodeb entity for ran name: %v in RNIB. Error: %s", request.RanName, rNibErr.Error()) return e2managererrors.NewRnibDbError() diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go index 8783389..a545cff 100644 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go @@ -17,6 +17,7 @@ package httpmsghandlers import ( + "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/e2pdus" "e2mgr/managers" @@ -25,6 +26,7 @@ import ( "e2mgr/rNibWriter" "e2mgr/rmrCgo" "e2mgr/rnibBuilders" + "e2mgr/services" "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" @@ -283,6 +285,7 @@ func TestX2SetupHandleInvalidIp_Error(t *testing.T) { func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol)(*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) { log := initLog(t) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} readerMock := &mocks.RnibReaderMock{} readerProvider := func() reader.RNibReader { @@ -296,8 +299,10 @@ func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) rmrMessengerMock := &mocks.RmrMessengerMock{} rmrService := getRmrService(rmrMessengerMock, log) - ranSetupManager := managers.NewRanSetupManager(log, rmrService, writerProvider) - handler := NewSetupRequestHandler(log, writerProvider, readerProvider, ranSetupManager, protocol) + rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider) + + ranSetupManager := managers.NewRanSetupManager(log, rmrService, rnibDataService) + handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol) return readerMock, writerMock, handler, rmrMessengerMock } \ No newline at end of file diff --git a/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go b/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go index 72f7ccb..3d02272 100644 --- a/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go +++ b/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go @@ -22,12 +22,10 @@ import ( "e2mgr/e2pdus" "e2mgr/logger" "e2mgr/models" - "e2mgr/rNibWriter" "e2mgr/rmrCgo" "e2mgr/services" "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" ) const ( @@ -35,17 +33,14 @@ const ( ) type X2ResetRequestHandler struct { - readerProvider func() reader.RNibReader - writerProvider func() rNibWriter.RNibWriter + rNibDataService services.RNibDataService rmrService *services.RmrService logger *logger.Logger } -func NewX2ResetRequestHandler(logger *logger.Logger, rmrService *services.RmrService, writerProvider func() rNibWriter.RNibWriter, - readerProvider func() reader.RNibReader) *X2ResetRequestHandler { +func NewX2ResetRequestHandler(logger *logger.Logger, rmrService *services.RmrService, rNibDataService services.RNibDataService) *X2ResetRequestHandler { return &X2ResetRequestHandler{ - readerProvider: readerProvider, - writerProvider: writerProvider, + rNibDataService: rNibDataService, rmrService: rmrService, logger: logger, } @@ -63,7 +58,7 @@ func (handler *X2ResetRequestHandler) Handle(request models.Request) error { return e2managererrors.NewRequestValidationError() } - nodeb, err := handler.readerProvider().GetNodeb(resetRequest.RanName) + nodeb, err := handler.rNibDataService.GetNodeb(resetRequest.RanName) if err != nil { handler.logger.Errorf("#reset_request_handler.Handle - failed to get status of RAN: %s from RNIB. Error: %s", resetRequest.RanName, err.Error()) _, ok := err.(*common.ResourceNotFoundError) diff --git a/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go index 864e824..64e0c10 100644 --- a/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go @@ -1,11 +1,13 @@ package httpmsghandlers import ( + "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/mocks" "e2mgr/models" "e2mgr/rNibWriter" "e2mgr/rmrCgo" + "e2mgr/services" "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" @@ -15,11 +17,9 @@ import ( "testing" ) -func TestHandleSuccessfulDefaultCause(t *testing.T) { +func setupX2ResetRequestHandlerTest(t *testing.T) (*X2ResetRequestHandler, *mocks.RmrMessengerMock, *mocks.RnibReaderMock){ log := initLog(t) - - ranName := "test1" - + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} readerMock := &mocks.RnibReaderMock{} readerProvider := func() reader.RNibReader { return readerMock @@ -28,15 +28,23 @@ func TestHandleSuccessfulDefaultCause(t *testing.T) { writerProvider := func() rNibWriter.RNibWriter { return writerMock } + rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider) + rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrService := getRmrService(rmrMessengerMock, log) + handler := NewX2ResetRequestHandler(log, rmrService, rnibDataService) + + return handler, rmrMessengerMock, readerMock +} +func TestHandleSuccessfulDefaultCause(t *testing.T) { + handler, rmrMessengerMock, readerMock := setupX2ResetRequestHandlerTest(t) + + ranName := "test1" // o&m intervention payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) - rmrService := getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) + rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} readerMock.On("GetNodeb", ranName).Return(nodeb, nil) @@ -47,28 +55,14 @@ func TestHandleSuccessfulDefaultCause(t *testing.T) { } func TestHandleSuccessfulRequestedCause(t *testing.T) { - log := initLog(t) + handler, rmrMessengerMock, readerMock := setupX2ResetRequestHandlerTest(t) ranName := "test1" - - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) - rmrService := getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} readerMock.On("GetNodeb", ranName).Return(nodeb, nil) @@ -78,24 +72,9 @@ func TestHandleSuccessfulRequestedCause(t *testing.T) { } func TestHandleFailureUnknownCause(t *testing.T) { - log := initLog(t) + handler, _, readerMock := setupX2ResetRequestHandlerTest(t) ranName := "test1" - - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - - rmrService := getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} readerMock.On("GetNodeb", ranName).Return(nodeb, nil) @@ -106,24 +85,9 @@ func TestHandleFailureUnknownCause(t *testing.T) { } func TestHandleFailureWrongState(t *testing.T) { - log := initLog(t) + handler, _, readerMock := setupX2ResetRequestHandlerTest(t) ranName := "test1" - - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - - rmrService := getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED} readerMock.On("GetNodeb", ranName).Return(nodeb, nil) @@ -133,24 +97,10 @@ func TestHandleFailureWrongState(t *testing.T) { } func TestHandleFailureRanNotFound(t *testing.T) { - log := initLog(t) + handler, _, readerMock := setupX2ResetRequestHandlerTest(t) ranName := "test1" - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - - rmrService := getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("nodeb not found")) actual := handler.Handle(models.ResetRequest{RanName: ranName}) @@ -159,24 +109,10 @@ func TestHandleFailureRanNotFound(t *testing.T) { } func TestHandleFailureRnibError(t *testing.T) { - log := initLog(t) + handler, _, readerMock := setupX2ResetRequestHandlerTest(t) ranName := "test1" - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - - rmrService := getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{}, common.NewInternalError(fmt.Errorf("internal error"))) actual := handler.Handle(models.ResetRequest{RanName: ranName}) @@ -185,28 +121,15 @@ func TestHandleFailureRnibError(t *testing.T) { } func TestHandleFailureRmrError(t *testing.T) { - log := initLog(t) + handler, rmrMessengerMock, readerMock := setupX2ResetRequestHandlerTest(t) ranName := "test1" - - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } // o&m intervention payload := []byte{0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(&rmrCgo.MBuf{}, fmt.Errorf("rmr error")) - rmrService := getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} readerMock.On("GetNodeb", ranName).Return(nodeb, nil) diff --git a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go index 73e86bd..783f714 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler.go @@ -21,27 +21,27 @@ import ( "e2mgr/logger" "e2mgr/managers" "e2mgr/models" + "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" ) type E2TermInitNotificationHandler struct { - rnibReaderProvider func() reader.RNibReader + rnibDataService services.RNibDataService ranReconnectionManager *managers.RanReconnectionManager } -func NewE2TermInitNotificationHandler(ranReconnectionManager *managers.RanReconnectionManager, rnibReaderProvider func() reader.RNibReader) E2TermInitNotificationHandler { +func NewE2TermInitNotificationHandler(ranReconnectionManager *managers.RanReconnectionManager, rnibDataService services.RNibDataService) E2TermInitNotificationHandler { return E2TermInitNotificationHandler{ - rnibReaderProvider: rnibReaderProvider, + rnibDataService: rnibDataService, ranReconnectionManager: ranReconnectionManager, } } func (handler E2TermInitNotificationHandler) Handle(logger *logger.Logger, request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) { -logger.Infof("#E2TermInitNotificationHandler.Handle - Handling E2_TERM_INIT") + logger.Infof("#E2TermInitNotificationHandler.Handle - Handling E2_TERM_INIT") - nbIdentityList, err := handler.rnibReaderProvider().GetListNodebIds() + nbIdentityList, err := handler.rnibDataService.GetListNodebIds() if err != nil { logger.Errorf("#E2TermInitNotificationHandler.Handle - Failed to get nodes list from RNIB. Error: %s", err.Error()) return 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 8bb8a05..308d970 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go @@ -19,9 +19,10 @@ import ( "testing" ) -func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanReconnectionManager) { +func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock) { logger := initLog(t) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} rmrMessengerMock := &mocks.RmrMessengerMock{} rmrService := getRmrService(rmrMessengerMock, logger) @@ -34,19 +35,17 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderM rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibWriterProvider) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) - return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager + rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) + ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibDataService) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager) + handler := NewE2TermInitNotificationHandler(ranReconnectionManager, rnibDataService) + return logger, handler, readerMock, writerMock, rmrMessengerMock } func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) { - log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t) + log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t) var rnibErr error - readerProvider := func() reader.RNibReader { - return readerMock - } - ids := []*entities.NbIdentity{{InventoryName: "test1"}} readerMock.On("GetListNodebIds").Return(ids, rnibErr) @@ -62,7 +61,6 @@ func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) { rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) - handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider) handler.Handle(log, nil, nil) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) @@ -70,13 +68,9 @@ func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) { } func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) { - log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t) + log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t) var rnibErr error - readerProvider := func() reader.RNibReader { - return readerMock - } - ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}} readerMock.On("GetListNodebIds").Return(ids, rnibErr) @@ -94,7 +88,6 @@ func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) { rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) - handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider) handler.Handle(log, nil, nil) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) @@ -102,13 +95,9 @@ func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) { } func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) { - log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t) + log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t) var rnibErr error - readerProvider := func() reader.RNibReader { - return readerMock - } - ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} readerMock.On("GetListNodebIds").Return(ids, rnibErr) @@ -135,7 +124,6 @@ func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) { rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error")) - handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider) handler.Handle(log, nil, nil) //test1 (before send +1, after failure +1), test2 (0) test3 (0) @@ -145,13 +133,9 @@ func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) { } func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) { - log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t) + log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t) var rnibErr error - readerProvider := func() reader.RNibReader { - return readerMock - } - ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} readerMock.On("GetListNodebIds").Return(ids, rnibErr) @@ -183,7 +167,6 @@ func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil) - handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider) handler.Handle(log, nil, nil) readerMock.AssertNumberOfCalls(t, "GetNodeb", 3) @@ -194,13 +177,9 @@ func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) } func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) { - log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t) + log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t) var rnibErr error - readerProvider := func() reader.RNibReader { - return readerMock - } - ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}} readerMock.On("GetListNodebIds").Return(ids, rnibErr) @@ -232,7 +211,6 @@ func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *te rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil) - handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider) handler.Handle(log, nil, nil) readerMock.AssertNumberOfCalls(t, "GetNodeb", 2) @@ -243,16 +221,11 @@ func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *te } func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) { - log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t) + log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t) var rnibErr error - readerProvider := func() reader.RNibReader { - return readerMock - } - readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr) - handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider) handler.Handle(log, nil, nil) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) @@ -260,15 +233,10 @@ func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) { } func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) { - log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t) - - readerProvider := func() reader.RNibReader { - return readerMock - } + log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t) readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error"))) - handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider) handler.Handle(log, nil, nil) writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) diff --git a/E2Manager/handlers/rmrmsghandlers/enb_load_information_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/enb_load_information_notification_handler.go index 2185e2b..88763a3 100644 --- a/E2Manager/handlers/rmrmsghandlers/enb_load_information_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/enb_load_information_notification_handler.go @@ -6,18 +6,18 @@ import ( "e2mgr/e2pdus" "e2mgr/logger" "e2mgr/models" - "e2mgr/rNibWriter" + "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "time" ) type EnbLoadInformationNotificationHandler struct { - rnibWriterProvider func() rNibWriter.RNibWriter + rnibDataService services.RNibDataService } -func NewEnbLoadInformationNotificationHandler(rnibWriterProvider func() rNibWriter.RNibWriter) EnbLoadInformationNotificationHandler { +func NewEnbLoadInformationNotificationHandler(rnibDataService services.RNibDataService) EnbLoadInformationNotificationHandler { return EnbLoadInformationNotificationHandler{ - rnibWriterProvider: rnibWriterProvider, + rnibDataService: rnibDataService, } } @@ -47,7 +47,7 @@ func (src EnbLoadInformationNotificationHandler) Handle(logger *logger.Logger, r logger.Debugf("#EnbLoadInformationNotificationHandler.Handle - RAN name: %s - Successfully done with extracting and building RAN load information. elapsed: %f ms", request.RanName, elapsed(request.StartTime)) - rnibErr := src.rnibWriterProvider().SaveRanLoadInformation(request.RanName, ranLoadInformation) + rnibErr := src.rnibDataService.SaveRanLoadInformation(request.RanName, ranLoadInformation) if rnibErr != nil { logger.Errorf("#EnbLoadInformationNotificationHandler.Handle - RAN name: %s - Failed saving RAN load information. Error: %v", request.RanName, rnibErr) diff --git a/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler.go index 3595741..f6b63f3 100644 --- a/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler.go @@ -20,22 +20,19 @@ import ( "e2mgr/logger" "e2mgr/managers" "e2mgr/models" - "e2mgr/rNibWriter" + "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" ) type SetupResponseNotificationHandler struct { - rnibReaderProvider func() reader.RNibReader - rnibWriterProvider func() rNibWriter.RNibWriter + rnibDataService services.RNibDataService setupResponseManager managers.ISetupResponseManager notificationType string } -func NewSetupResponseNotificationHandler(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, setupResponseManager managers.ISetupResponseManager, notificationType string) SetupResponseNotificationHandler { +func NewSetupResponseNotificationHandler(rnibDataService services.RNibDataService, setupResponseManager managers.ISetupResponseManager, notificationType string) SetupResponseNotificationHandler { return SetupResponseNotificationHandler{ - rnibReaderProvider: rnibReaderProvider, - rnibWriterProvider: rnibWriterProvider, + rnibDataService: rnibDataService, setupResponseManager: setupResponseManager, notificationType: notificationType, } @@ -46,7 +43,7 @@ func (h SetupResponseNotificationHandler) Handle(logger *logger.Logger, request inventoryName := request.RanName - nodebInfo, rnibErr := h.rnibReaderProvider().GetNodeb(inventoryName) + nodebInfo, rnibErr := h.rnibDataService.GetNodeb(inventoryName) if rnibErr != nil { logger.Errorf("#SetupResponseNotificationHandler - RAN name: %s - Error fetching RAN from rNib: %v", request.RanName, rnibErr) @@ -66,7 +63,7 @@ func (h SetupResponseNotificationHandler) Handle(logger *logger.Logger, request return } - rnibErr = h.rnibWriterProvider().SaveNodeb(nbIdentity, nodebInfo) + rnibErr = h.rnibDataService.SaveNodeb(nbIdentity, nodebInfo) if rnibErr != nil { logger.Errorf("#SetupResponseNotificationHandler - RAN name: %s - Error saving RAN to rNib: %v", request.RanName, rnibErr) diff --git a/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go index 04358a6..d4503b8 100644 --- a/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/setup_response_notification_handler_test.go @@ -18,11 +18,13 @@ package rmrmsghandlers import ( + "e2mgr/configuration" "e2mgr/logger" "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" "e2mgr/rNibWriter" + "e2mgr/services" "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" @@ -45,26 +47,28 @@ type setupResponseTestContext struct { logger *logger.Logger readerMock *mocks.RnibReaderMock writerMock *mocks.RnibWriterMock - rnibReaderProvider func() reader.RNibReader - rnibWriterProvider func() rNibWriter.RNibWriter + rnibDataService services.RNibDataService setupResponseManager managers.ISetupResponseManager } func NewSetupResponseTestContext(manager managers.ISetupResponseManager) *setupResponseTestContext { logger, _ := logger.InitLogger(logger.InfoLevel) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} readerMock := &mocks.RnibReaderMock{} writerMock := &mocks.RnibWriterMock{} + rnibReaderProvider := func() reader.RNibReader { + return readerMock + } + rnibWriterProvider := func() rNibWriter.RNibWriter { + return writerMock + } + rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) return &setupResponseTestContext{ - logger: logger, - readerMock: readerMock, - writerMock: writerMock, - rnibReaderProvider: func() reader.RNibReader { - return readerMock - }, - rnibWriterProvider: func() rNibWriter.RNibWriter { - return writerMock - }, + logger: logger, + readerMock: readerMock, + writerMock: writerMock, + rnibDataService: rnibDataService, setupResponseManager: manager, } } @@ -72,7 +76,7 @@ func NewSetupResponseTestContext(manager managers.ISetupResponseManager) *setupR func TestSetupResponseGetNodebFailure(t *testing.T) { notificationRequest := models.NotificationRequest{RanName: RanName} testContext := NewSetupResponseTestContext(nil) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response") + handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, &managers.X2SetupResponseManager{}, "X2 Setup Response") testContext.readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewInternalError(errors.New("Error"))) handler.Handle(testContext.logger, ¬ificationRequest, nil) testContext.readerMock.AssertCalled(t, "GetNodeb", RanName) @@ -83,7 +87,7 @@ func TestSetupResponseInvalidConnectionStatus(t *testing.T) { ranName := "test" notificationRequest := models.NotificationRequest{RanName: ranName} testContext := NewSetupResponseTestContext(nil) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response") + handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, &managers.X2SetupResponseManager{}, "X2 Setup Response") var rnibErr error testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}, rnibErr) handler.Handle(testContext.logger, ¬ificationRequest, nil) @@ -101,7 +105,7 @@ func executeHandleSuccessSetupResponse(t *testing.T, packedPdu string, setupResp notificationRequest := models.NotificationRequest{RanName: RanName, Payload: payload} testContext := NewSetupResponseTestContext(setupResponseManager) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, testContext.setupResponseManager, notificationType) + handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, testContext.setupResponseManager, notificationType) var rnibErr error @@ -173,7 +177,7 @@ func TestSetupResponseInvalidPayload(t *testing.T) { ranName := "test" notificationRequest := models.NotificationRequest{RanName: ranName, Payload: []byte("123")} testContext := NewSetupResponseTestContext(nil) - handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response") + handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, &managers.X2SetupResponseManager{}, "X2 Setup Response") var rnibErr error testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 1}, rnibErr) handler.Handle(testContext.logger, ¬ificationRequest, nil) diff --git a/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler.go index e1f6841..622a338 100644 --- a/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler.go @@ -27,18 +27,18 @@ import ( "e2mgr/logger" "e2mgr/models" "e2mgr/rmrCgo" + "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "unsafe" ) type X2ResetRequestNotificationHandler struct { - rnibReaderProvider func() reader.RNibReader + rnibDataService services.RNibDataService } -func NewX2ResetRequestNotificationHandler(rnibReaderProvider func() reader.RNibReader) X2ResetRequestNotificationHandler { +func NewX2ResetRequestNotificationHandler(rnibDataService services.RNibDataService) X2ResetRequestNotificationHandler { return X2ResetRequestNotificationHandler{ - rnibReaderProvider: rnibReaderProvider, + rnibDataService: rnibDataService, } } @@ -46,7 +46,7 @@ func (src X2ResetRequestNotificationHandler) Handle(logger *logger.Logger, reque logger.Debugf("#X2ResetRequestNotificationHandler.Handle - Ran name: %s", request.RanName) - nb, rNibErr := src.rnibReaderProvider().GetNodeb(request.RanName) + nb, rNibErr := src.rnibDataService.GetNodeb(request.RanName) if rNibErr != nil { logger.Errorf("#X2ResetRequestNotificationHandler.Handle - failed to retrieve nodeB entity. RanName: %s. Error: %s", request.RanName, rNibErr.Error()) printHandlingSetupResponseElapsedTimeInMs(logger, "#X2ResetRequestNotificationHandler.Handle - Summary: Elapsed time for receiving and handling reset request message from E2 terminator", request.StartTime) diff --git a/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler_test.go index 3e32c36..309a57e 100644 --- a/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/x2_reset_request_notification_handler_test.go @@ -18,9 +18,12 @@ package rmrmsghandlers import ( + "e2mgr/configuration" + "e2mgr/logger" "e2mgr/mocks" "e2mgr/models" "e2mgr/rmrCgo" + "e2mgr/services" "e2mgr/tests" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" @@ -30,15 +33,23 @@ import ( "time" ) -func TestX2ResetRequestNotifSuccess(t *testing.T) { +func initX2ResetRequestNotifHandlerTest(t *testing.T) (*logger.Logger, X2ResetRequestNotificationHandler, *mocks.RnibReaderMock) { log := initLog(t) - payload := []byte("payload") + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} readerMock := &mocks.RnibReaderMock{} readerProvider := func() reader.RNibReader { return readerMock } + rnibDataService := services.NewRnibDataService(log, config, readerProvider, nil) + + h := NewX2ResetRequestNotificationHandler(rnibDataService) + return log, h, readerMock +} - h := NewX2ResetRequestNotificationHandler(readerProvider) +func TestX2ResetRequestNotifSuccess(t *testing.T) { + log, h, readerMock := initX2ResetRequestNotifHandlerTest(t) + + payload := []byte("payload") xaction := []byte("RanName") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction) @@ -59,14 +70,8 @@ func TestX2ResetRequestNotifSuccess(t *testing.T) { } func TestHandleX2ResetRequestNotifShuttingDownStatus(t *testing.T) { - log := initLog(t) + log, h, readerMock := initX2ResetRequestNotifHandlerTest(t) var payload []byte - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - - h := NewX2ResetRequestNotificationHandler(readerProvider) xaction := []byte("RanName") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction) @@ -82,14 +87,8 @@ func TestHandleX2ResetRequestNotifShuttingDownStatus(t *testing.T) { } func TestHandleX2ResetRequestNotifDisconnectStatus(t *testing.T) { - log := initLog(t) + log, h, readerMock := initX2ResetRequestNotifHandlerTest(t) var payload []byte - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - - h := NewX2ResetRequestNotificationHandler(readerProvider) xaction := []byte("RanName") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction) @@ -106,14 +105,8 @@ func TestHandleX2ResetRequestNotifDisconnectStatus(t *testing.T) { func TestHandleX2ResetRequestNotifGetNodebFailed(t *testing.T) { - log := initLog(t) + log, h, readerMock := initX2ResetRequestNotifHandlerTest(t) var payload []byte - readerMock := &mocks.RnibReaderMock{} - readerProvider := func() reader.RNibReader { - return readerMock - } - - h := NewX2ResetRequestNotificationHandler(readerProvider) xaction := []byte("RanName") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, diff --git a/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler.go b/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler.go index cd1556d..1ad7d98 100644 --- a/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler.go @@ -26,16 +26,16 @@ import ( "e2mgr/e2pdus" "e2mgr/logger" "e2mgr/models" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" + "e2mgr/services" ) type X2ResetResponseHandler struct { - rnibReaderProvider func() reader.RNibReader + rnibDataService services.RNibDataService } -func NewX2ResetResponseHandler(rnibReaderProvider func() reader.RNibReader) X2ResetResponseHandler { +func NewX2ResetResponseHandler(rnibDataService services.RNibDataService) X2ResetResponseHandler { return X2ResetResponseHandler{ - rnibReaderProvider: rnibReaderProvider, + rnibDataService: rnibDataService, } } @@ -43,11 +43,11 @@ func (src X2ResetResponseHandler) Handle(logger *logger.Logger, request *models. logger.Infof("#x2ResetResponseHandler.Handle - received reset response. Payload: %x", request.Payload) - if nb, rNibErr := src.rnibReaderProvider().GetNodeb(request.RanName); rNibErr != nil { + if nb, rNibErr := src.rnibDataService.GetNodeb(request.RanName); rNibErr != nil { logger.Errorf("#x2ResetResponseHandler.Handle - failed to retrieve nb entity. RanName: %s. Error: %s", request.RanName, rNibErr.Error()) } else { logger.Debugf("#x2ResetResponseHandler.Handle - nb entity retrieved. RanName %s, ConnectionStatus %s", nb.RanName, nb.ConnectionStatus) - refinedMessage, err := converters.UnpackX2apPduAndRefine(logger, e2pdus.MaxAsn1CodecAllocationBufferSize , request.Len, request.Payload, e2pdus.MaxAsn1CodecMessageBufferSize /*message buffer*/) + refinedMessage, err := converters.UnpackX2apPduAndRefine(logger, e2pdus.MaxAsn1CodecAllocationBufferSize, request.Len, request.Payload, e2pdus.MaxAsn1CodecMessageBufferSize /*message buffer*/) if err != nil { logger.Errorf("#x2ResetResponseHandler.Handle - failed to unpack reset response message. RanName %s, Payload: %s", request.RanName, request.Payload) } else { diff --git a/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler_test.go b/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler_test.go index 0134399..26f0ade 100644 --- a/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/x2_reset_response_handler_test.go @@ -18,10 +18,12 @@ package rmrmsghandlers import ( + "e2mgr/configuration" "e2mgr/logger" "e2mgr/mocks" "e2mgr/models" "e2mgr/rmrCgo" + "e2mgr/services" "e2mgr/tests" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" @@ -30,12 +32,9 @@ import ( "time" ) -func TestX2ResetResponseSuccess(t *testing.T) { - payload, err := tests.BuildPackedX2ResetResponse() - if err != nil { - t.Errorf("#x2_reset_response_handler_test.TestX2resetResponse - failed to build and pack X2ResetResponse. Error %x", err) - } +func initX2ResetResponseHandlerTest(t *testing.T) (*logger.Logger, X2ResetResponseHandler, *mocks.RnibReaderMock) { log, err := logger.InitLogger(logger.DebugLevel) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} if err!=nil{ t.Errorf("#sctp_errors_notification_handler_test.TestHandleInSession - failed to initialize logger, error: %s", err) } @@ -43,8 +42,20 @@ func TestX2ResetResponseSuccess(t *testing.T) { rnibReaderProvider := func() reader.RNibReader { return readerMock } + rnibDataService := services.NewRnibDataService(log, config, rnibReaderProvider, nil) + + h := NewX2ResetResponseHandler(rnibDataService) + return log, h, readerMock +} + +func TestX2ResetResponseSuccess(t *testing.T) { + log, h, readerMock := initX2ResetResponseHandlerTest(t) + + payload, err := tests.BuildPackedX2ResetResponse() + if err != nil { + t.Errorf("#x2_reset_response_handler_test.TestX2resetResponse - failed to build and pack X2ResetResponse. Error %x", err) + } - h := NewX2ResetResponseHandler(rnibReaderProvider) xaction := []byte("RanName") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, @@ -61,17 +72,9 @@ func TestX2ResetResponseSuccess(t *testing.T) { } func TestX2ResetResponseReaderFailure(t *testing.T) { - var payload []byte - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestX2ResetResponseReaderFailure - failed to initialize logger, error: %s", err) - } - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } + log, h, readerMock := initX2ResetResponseHandlerTest(t) - h := NewX2ResetResponseHandler(rnibReaderProvider) + var payload []byte xaction := []byte("RanName") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, @@ -88,17 +91,9 @@ func TestX2ResetResponseReaderFailure(t *testing.T) { } func TestX2ResetResponseUnpackFailure(t *testing.T) { - payload := []byte("not valid payload") - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestX2ResetResponseUnpackFailure - failed to initialize logger, error: %s", err) - } - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } + log, h, readerMock := initX2ResetResponseHandlerTest(t) - h := NewX2ResetResponseHandler(rnibReaderProvider) + payload := []byte("not valid payload") xaction := []byte("RanName") mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, diff --git a/E2Manager/main/http_server.go b/E2Manager/main/http_server.go index cbad8ce..7cd6e39 100644 --- a/E2Manager/main/http_server.go +++ b/E2Manager/main/http_server.go @@ -53,19 +53,20 @@ func main() { reader.Init("e2Manager", MAX_RNIB_POOL_INSTANCES) defer reader.Close() + rnibDataService := services.NewRnibDataService(logger, config, reader.GetRNibReader, rNibWriter.GetRNibWriter) rmrResponseChannel := make(chan *models.NotificationResponse, config.NotificationResponseBuffer) rmrService := services.NewRmrService(rmrConfig, msgImpl, rmrResponseChannel) - var ranSetupManager = managers.NewRanSetupManager(logger, rmrService, rNibWriter.GetRNibWriter) - var ranReconnectionManager = managers.NewRanReconnectionManager(logger, config, reader.GetRNibReader, rNibWriter.GetRNibWriter, ranSetupManager) - var nManager = notificationmanager.NewNotificationManager(reader.GetRNibReader, rNibWriter.GetRNibWriter, ranReconnectionManager) + var ranSetupManager = managers.NewRanSetupManager(logger, rmrService, rnibDataService) + var ranReconnectionManager = managers.NewRanReconnectionManager(logger, config, rnibDataService, ranSetupManager) + var nManager = notificationmanager.NewNotificationManager(rnibDataService, ranReconnectionManager) rmrServiceReceiver := receivers.NewRmrServiceReceiver(*rmrService, nManager) defer rmrService.CloseContext() go rmrServiceReceiver.ListenAndHandle() go rmrService.SendResponse() - controller := controllers.NewNodebController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter) - newController := controllers.NewController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter, config, ranSetupManager) + controller := controllers.NewNodebController(logger, rmrService, rnibDataService) + newController := controllers.NewController(logger, rmrService, rnibDataService, config, ranSetupManager) runServer(config.Http.Port, controller, newController) } diff --git a/E2Manager/managers/notificationmanager/notification_manager.go b/E2Manager/managers/notificationmanager/notification_manager.go index 319dde7..70b81ed 100644 --- a/E2Manager/managers/notificationmanager/notification_manager.go +++ b/E2Manager/managers/notificationmanager/notification_manager.go @@ -22,10 +22,9 @@ import ( "e2mgr/managers" "e2mgr/models" "e2mgr/providers/rmrmsghandlerprovider" - "e2mgr/rNibWriter" "e2mgr/rmrCgo" + "e2mgr/services" "fmt" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "time" ) @@ -33,8 +32,8 @@ type NotificationManager struct { notificationHandlerProvider *rmrmsghandlerprovider.NotificationHandlerProvider } -func NewNotificationManager(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) *NotificationManager { - notificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) +func NewNotificationManager(rnibDataService services.RNibDataService, ranReconnectionManager *managers.RanReconnectionManager) *NotificationManager { + notificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider(rnibDataService, ranReconnectionManager) return &NotificationManager{ notificationHandlerProvider: notificationHandlerProvider, diff --git a/E2Manager/managers/ran_reconnection_manager.go b/E2Manager/managers/ran_reconnection_manager.go index f42986c..f27f810 100644 --- a/E2Manager/managers/ran_reconnection_manager.go +++ b/E2Manager/managers/ran_reconnection_manager.go @@ -20,9 +20,8 @@ package managers import ( "e2mgr/configuration" "e2mgr/logger" - "e2mgr/rNibWriter" + "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" ) type IRanReconnectionManager interface { @@ -30,26 +29,23 @@ type IRanReconnectionManager interface { } type RanReconnectionManager struct { - logger *logger.Logger - config *configuration.Configuration - rnibReaderProvider func() reader.RNibReader - rnibWriterProvider func() rNibWriter.RNibWriter - ranSetupManager *RanSetupManager + logger *logger.Logger + config *configuration.Configuration + rnibDataService services.RNibDataService + ranSetupManager *RanSetupManager } -func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader, - rnibWriterProvider func() rNibWriter.RNibWriter, ranSetupManager *RanSetupManager) *RanReconnectionManager { +func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, ranSetupManager *RanSetupManager) *RanReconnectionManager { return &RanReconnectionManager{ - logger: logger, - config: config, - rnibReaderProvider: rnibReaderProvider, - rnibWriterProvider: rnibWriterProvider, - ranSetupManager: ranSetupManager, + logger: logger, + config: config, + rnibDataService: rnibDataService, + ranSetupManager: ranSetupManager, } } func (m *RanReconnectionManager) ReconnectRan(inventoryName string) error { - nodebInfo, rnibErr := m.rnibReaderProvider().GetNodeb(inventoryName) + nodebInfo, rnibErr := m.rnibDataService.GetNodeb(inventoryName) if rnibErr != nil { m.logger.Errorf("#RanReconnectionManager.ReconnectRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, rnibErr) @@ -84,7 +80,7 @@ func (m *RanReconnectionManager) updateNodebInfoStatus(nodebInfo *entities.Nodeb } nodebInfo.ConnectionStatus = connectionStatus; - err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo) + err := m.rnibDataService.UpdateNodebInfo(nodebInfo) if err != nil { m.logger.Errorf("#RanReconnectionManager.updateNodebInfoStatus - RAN name: %s - Failed updating RAN's connection status to %s in rNib. Error: %v", nodebInfo.RanName, connectionStatus, err) diff --git a/E2Manager/managers/ran_reconnection_manager_test.go b/E2Manager/managers/ran_reconnection_manager_test.go index 7679473..d8e169d 100644 --- a/E2Manager/managers/ran_reconnection_manager_test.go +++ b/E2Manager/managers/ran_reconnection_manager_test.go @@ -40,6 +40,7 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessenge if err != nil { t.Errorf("#... - failed to initialize logger, error: %s", err) } + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} rmrMessengerMock := &mocks.RmrMessengerMock{} rmrService := getRmrService(rmrMessengerMock, logger) @@ -52,8 +53,9 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessenge rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - ranSetupManager := NewRanSetupManager(logger, rmrService, rnibWriterProvider) - ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) + rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) + ranSetupManager := NewRanSetupManager(logger, rmrService, rnibDataService) + ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager) return logger, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager } diff --git a/E2Manager/managers/ran_setup_manager.go b/E2Manager/managers/ran_setup_manager.go index ef4a642..7500069 100644 --- a/E2Manager/managers/ran_setup_manager.go +++ b/E2Manager/managers/ran_setup_manager.go @@ -22,7 +22,6 @@ import ( "e2mgr/e2pdus" "e2mgr/logger" "e2mgr/models" - "e2mgr/rNibWriter" "e2mgr/rmrCgo" "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" @@ -30,14 +29,14 @@ import ( type RanSetupManager struct { logger *logger.Logger - rnibWriterProvider func() rNibWriter.RNibWriter + rnibDataService services.RNibDataService rmrService *services.RmrService } -func NewRanSetupManager(logger *logger.Logger, rmrService *services.RmrService, rnibWriterProvider func() rNibWriter.RNibWriter) *RanSetupManager { +func NewRanSetupManager(logger *logger.Logger, rmrService *services.RmrService, rnibDataService services.RNibDataService) *RanSetupManager { return &RanSetupManager{ logger: logger, - rnibWriterProvider: rnibWriterProvider, + rnibDataService: rnibDataService, rmrService: rmrService, } } @@ -47,7 +46,7 @@ func (m *RanSetupManager) updateConnectionStatus(nodebInfo *entities.NodebInfo, // Update retries and connection status nodebInfo.ConnectionStatus = status nodebInfo.ConnectionAttempts++ - err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo) + err := m.rnibDataService.UpdateNodebInfo(nodebInfo) if err != nil { m.logger.Errorf("#RanSetupManager.updateConnectionStatus - Ran name: %s - Failed updating RAN's connection status to %v : %s", nodebInfo.RanName, status, err) } else { @@ -61,7 +60,7 @@ func (m *RanSetupManager) updateConnectionStatusDisconnected(nodebInfo *entities // Update retries and connection status nodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED nodebInfo.ConnectionAttempts-- - err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo) + err := m.rnibDataService.UpdateNodebInfo(nodebInfo) if err != nil { m.logger.Errorf("#RanSetupManager.updateConnectionStatusDisconnected - Ran name: %s - Failed updating RAN's connection status to DISCONNECTED : %s", nodebInfo.RanName, err) } else { diff --git a/E2Manager/managers/ran_setup_manager_test.go b/E2Manager/managers/ran_setup_manager_test.go index 58ca166..20f3d59 100644 --- a/E2Manager/managers/ran_setup_manager_test.go +++ b/E2Manager/managers/ran_setup_manager_test.go @@ -18,29 +18,50 @@ package managers import ( + "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/e2pdus" "e2mgr/logger" "e2mgr/mocks" "e2mgr/rNibWriter" "e2mgr/rmrCgo" + "e2mgr/services" "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "testing" ) -func TestExecuteSetupConnectingX2Setup(t *testing.T) { - log := initLog(t) +func initRanSetupManagerTest(t *testing.T) (*mocks.RmrMessengerMock, *mocks.RnibWriterMock, *RanSetupManager) { + 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} - ranName := "test1" + rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrService := getRmrService(rmrMessengerMock, logger) + readerMock := &mocks.RnibReaderMock{} + rnibReaderProvider := func() reader.RNibReader { + return readerMock + } writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { + rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } + rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) + ranSetupManager := NewRanSetupManager(logger, rmrService, rnibDataService) + return rmrMessengerMock, writerMock, ranSetupManager +} + +func TestExecuteSetupConnectingX2Setup(t *testing.T) { + rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t) + + ranName := "test1" var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} @@ -50,11 +71,8 @@ func TestExecuteSetupConnectingX2Setup(t *testing.T) { payload := e2pdus.PackedX2setupRequest xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) - rmrService := getRmrService(rmrMessengerMock, log) - mgr := NewRanSetupManager(log, rmrService, writerProvider) if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil { t.Errorf("want: success, got: error: %s", err) } @@ -64,16 +82,11 @@ func TestExecuteSetupConnectingX2Setup(t *testing.T) { } func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) { - log := initLog(t) + rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t) ranName := "test1" - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - - var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} + var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1} var rnibErr error writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr) @@ -81,11 +94,8 @@ func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) { payload := e2pdus.PackedEndcX2setupRequest xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) - rmrService := getRmrService(rmrMessengerMock, log) - mgr := NewRanSetupManager(log, rmrService, writerProvider) if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil { t.Errorf("want: success, got: error: %s", err) } @@ -95,15 +105,10 @@ func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) { } func TestExecuteSetupDisconnected(t *testing.T) { - log := initLog(t) + rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t) ranName := "test1" - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0} @@ -114,11 +119,8 @@ func TestExecuteSetupDisconnected(t *testing.T) { payload := []byte{0} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure")) - rmrService := getRmrService(rmrMessengerMock, log) - mgr := NewRanSetupManager(log, rmrService, writerProvider) if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: failure, got: success") } @@ -128,15 +130,10 @@ func TestExecuteSetupDisconnected(t *testing.T) { } func TestExecuteSetupConnectingRnibError(t *testing.T) { - log := initLog(t) + rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t) ranName := "test1" - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0} @@ -147,11 +144,8 @@ func TestExecuteSetupConnectingRnibError(t *testing.T) { payload := []byte{0} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure")) - rmrService := getRmrService(rmrMessengerMock, log) - mgr := NewRanSetupManager(log, rmrService, writerProvider) if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: failure, got: success") } else { @@ -163,15 +157,10 @@ func TestExecuteSetupConnectingRnibError(t *testing.T) { } func TestExecuteSetupDisconnectedRnibError(t *testing.T) { - log := initLog(t) + rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t) ranName := "test1" - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0} @@ -182,11 +171,8 @@ func TestExecuteSetupDisconnectedRnibError(t *testing.T) { payload := []byte{0} xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure")) - rmrService := getRmrService(rmrMessengerMock, log) - mgr := NewRanSetupManager(log, rmrService, writerProvider) if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: failure, got: success") } else { @@ -198,15 +184,10 @@ func TestExecuteSetupDisconnectedRnibError(t *testing.T) { } func TestExecuteSetupUnsupportedProtocol(t *testing.T) { - log := initLog(t) + rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t) ranName := "test1" - writerMock := &mocks.RnibWriterMock{} - writerProvider := func() rNibWriter.RNibWriter { - return writerMock - } - var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL} var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL, ConnectionAttempts: 1} var rnibErr error @@ -215,11 +196,8 @@ func TestExecuteSetupUnsupportedProtocol(t *testing.T) { payload := e2pdus.PackedX2setupRequest xaction := []byte(ranName) msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) - rmrMessengerMock := &mocks.RmrMessengerMock{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) - rmrService := getRmrService(rmrMessengerMock, log) - mgr := NewRanSetupManager(log, rmrService, writerProvider) if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: error, got: success") } diff --git a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go index 7891d8c..23493cd 100644 --- a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go @@ -23,10 +23,8 @@ import ( "e2mgr/handlers/httpmsghandlers" "e2mgr/logger" "e2mgr/managers" - "e2mgr/rNibWriter" "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" ) type IncomingRequest string @@ -43,23 +41,21 @@ type IncomingRequestHandlerProvider struct { logger *logger.Logger } -func NewIncomingRequestHandlerProvider(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter, - rNibReaderProvider func() reader.RNibReader, ranSetupManager *managers.RanSetupManager) *IncomingRequestHandlerProvider { +func NewIncomingRequestHandlerProvider(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibDataService services.RNibDataService, ranSetupManager *managers.RanSetupManager) *IncomingRequestHandlerProvider { return &IncomingRequestHandlerProvider{ - requestMap: initRequestHandlerMap(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider, ranSetupManager), + requestMap: initRequestHandlerMap(logger, rmrService, config, rNibDataService, ranSetupManager), logger: logger, } } -func initRequestHandlerMap(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter, - rNibReaderProvider func() reader.RNibReader, ranSetupManager *managers.RanSetupManager) map[IncomingRequest]httpmsghandlers.RequestHandler { +func initRequestHandlerMap(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibDataService services.RNibDataService, ranSetupManager *managers.RanSetupManager) map[IncomingRequest]httpmsghandlers.RequestHandler { return map[IncomingRequest]httpmsghandlers.RequestHandler{ - ShutdownRequest: httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer - ResetRequest: httpmsghandlers.NewX2ResetRequestHandler(logger, rmrService, rNibWriterProvider, rNibReaderProvider), - X2SetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibWriterProvider, rNibReaderProvider, ranSetupManager, entities.E2ApplicationProtocol_X2_SETUP_REQUEST), - EndcSetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibWriterProvider, rNibReaderProvider, ranSetupManager, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST), //TODO change to pointer + ShutdownRequest: httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrService, config, rNibDataService), //TODO change to pointer + ResetRequest: httpmsghandlers.NewX2ResetRequestHandler(logger, rmrService, rNibDataService), + X2SetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_X2_SETUP_REQUEST), + EndcSetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST), //TODO change to pointer } } diff --git a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go index d0e13f3..393b800 100644 --- a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go @@ -42,36 +42,29 @@ func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, messageChannel) } -func TestNewIncomingRequestHandlerProvider(t *testing.T) { +func setupTest(t *testing.T) *IncomingRequestHandlerProvider { rmrMessengerMock := &mocks.RmrMessengerMock{} - log := initLog(t) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} readerProvider := func() reader.RNibReader { return &mocks.RnibReaderMock{} } writerProvider := func() rNibWriter.RNibWriter { return &mocks.RnibWriterMock{} } - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager) + rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider) + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rnibDataService) + return NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), rnibDataService, ranSetupManager) +} + +func TestNewIncomingRequestHandlerProvider(t *testing.T) { + provider := setupTest(t) assert.NotNil(t, provider) } func TestShutdownRequestHandler(t *testing.T) { - rmrMessengerMock := &mocks.RmrMessengerMock{} - - log := initLog(t) - readerProvider := func() reader.RNibReader { - return &mocks.RnibReaderMock{} - } - writerProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager) - + provider := setupTest(t) handler, err := provider.GetHandler(ShutdownRequest) assert.NotNil(t, provider) @@ -83,19 +76,7 @@ func TestShutdownRequestHandler(t *testing.T) { } func TestX2SetupRequestHandler(t *testing.T) { - rmrMessengerMock := &mocks.RmrMessengerMock{} - - log := initLog(t) - readerProvider := func() reader.RNibReader { - return &mocks.RnibReaderMock{} - } - writerProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager) - + provider := setupTest(t) handler, err := provider.GetHandler(X2SetupRequest) assert.NotNil(t, provider) @@ -107,19 +88,7 @@ func TestX2SetupRequestHandler(t *testing.T) { } func TestEndcSetupRequestHandler(t *testing.T) { - rmrMessengerMock := &mocks.RmrMessengerMock{} - - log := initLog(t) - readerProvider := func() reader.RNibReader { - return &mocks.RnibReaderMock{} - } - writerProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager) - + provider := setupTest(t) handler, err := provider.GetHandler(EndcSetupRequest) assert.NotNil(t, provider) @@ -131,18 +100,7 @@ func TestEndcSetupRequestHandler(t *testing.T) { } func TestGetShutdownHandlerFailure(t *testing.T) { - rmrMessengerMock := &mocks.RmrMessengerMock{} - log := initLog(t) - readerProvider := func() reader.RNibReader { - return &mocks.RnibReaderMock{} - } - writerProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager) - + provider := setupTest(t) _, actual := provider.GetHandler("test") expected := &e2managererrors.InternalError{} diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go index 0a01b76..d85bf95 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go @@ -20,36 +20,35 @@ package rmrmsghandlerprovider import ( "e2mgr/handlers/rmrmsghandlers" "e2mgr/managers" - "e2mgr/rNibWriter" "e2mgr/rmrCgo" + "e2mgr/services" "fmt" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" ) type NotificationHandlerProvider struct { notificationHandlers map[int]rmrmsghandlers.NotificationHandler } -func NewNotificationHandlerProvider(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) *NotificationHandlerProvider { +func NewNotificationHandlerProvider(rnibDataService services.RNibDataService, ranReconnectionManager *managers.RanReconnectionManager) *NotificationHandlerProvider { return &NotificationHandlerProvider{ - notificationHandlers: initNotificationHandlersMap(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager), + notificationHandlers: initNotificationHandlersMap(rnibDataService, ranReconnectionManager), } } //TODO change handlers.NotificationHandler to *handlers.NotificationHandler -func initNotificationHandlersMap(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) map[int]rmrmsghandlers.NotificationHandler { +func initNotificationHandlersMap(rnibDataService services.RNibDataService, ranReconnectionManager *managers.RanReconnectionManager) map[int]rmrmsghandlers.NotificationHandler { return map[int]rmrmsghandlers.NotificationHandler{ - rmrCgo.RIC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupResponseManager(), "X2 Setup Response"), - rmrCgo.RIC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response"), - rmrCgo.RIC_ENDC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupResponseManager(), "ENDC Setup Response"), - rmrCgo.RIC_ENDC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"), + rmrCgo.RIC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupResponseManager(), "X2 Setup Response"), + rmrCgo.RIC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response"), + rmrCgo.RIC_ENDC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupResponseManager(), "ENDC Setup Response"), + rmrCgo.RIC_ENDC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"), rmrCgo.RIC_SCTP_CONNECTION_FAILURE: rmrmsghandlers.NewRanLostConnectionHandler(ranReconnectionManager), - rmrCgo.RIC_ENB_LOAD_INFORMATION: rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibWriterProvider), + rmrCgo.RIC_ENB_LOAD_INFORMATION: rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibDataService), rmrCgo.RIC_ENB_CONF_UPDATE: rmrmsghandlers.NewX2EnbConfigurationUpdateHandler(), rmrCgo.RIC_ENDC_CONF_UPDATE: rmrmsghandlers.NewEndcConfigurationUpdateHandler(), - rmrCgo.RIC_X2_RESET_RESP: rmrmsghandlers.NewX2ResetResponseHandler(rnibReaderProvider), - rmrCgo.RIC_X2_RESET: rmrmsghandlers.NewX2ResetRequestNotificationHandler(rnibReaderProvider), - rmrCgo.RIC_E2_TERM_INIT: rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibReaderProvider), + rmrCgo.RIC_X2_RESET_RESP: rmrmsghandlers.NewX2ResetResponseHandler(rnibDataService), + rmrCgo.RIC_X2_RESET: rmrmsghandlers.NewX2ResetRequestNotificationHandler(rnibDataService), + rmrCgo.RIC_E2_TERM_INIT: rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibDataService), } } diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go index b3e7c24..463259a 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go @@ -39,9 +39,9 @@ import ( * Verify support for known providers. */ -func TestGetNotificationHandlerSuccess(t *testing.T) { - +func initTestCase(t *testing.T) (services.RNibDataService, *managers.RanReconnectionManager) { logger := initLog(t) + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} readerMock := &mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { @@ -51,27 +51,34 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rNibWriter.GetRNibWriter) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) + rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) + ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rnibDataService) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager) + return rnibDataService, ranReconnectionManager +} + +func TestGetNotificationHandlerSuccess(t *testing.T) { + + rnibDataService, ranReconnectionManager := initTestCase(t) var testCases = []struct { msgType int handler rmrmsghandlers.NotificationHandler }{ - {rmrCgo.RIC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupResponseManager(), "X2 Setup Response")}, - {rmrCgo.RIC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response")}, - {rmrCgo.RIC_ENDC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupResponseManager(), "ENDC Setup Response")}, - {rmrCgo.RIC_ENDC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"),}, + {rmrCgo.RIC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupResponseManager(), "X2 Setup Response")}, + {rmrCgo.RIC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response")}, + {rmrCgo.RIC_ENDC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupResponseManager(), "ENDC Setup Response")}, + {rmrCgo.RIC_ENDC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"),}, {rmrCgo.RIC_SCTP_CONNECTION_FAILURE, rmrmsghandlers.NewRanLostConnectionHandler(ranReconnectionManager)}, - {rmrCgo.RIC_ENB_LOAD_INFORMATION, rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibWriterProvider)}, + {rmrCgo.RIC_ENB_LOAD_INFORMATION, rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibDataService)}, {rmrCgo.RIC_ENB_CONF_UPDATE, rmrmsghandlers.X2EnbConfigurationUpdateHandler{}}, {rmrCgo.RIC_ENDC_CONF_UPDATE, rmrmsghandlers.EndcConfigurationUpdateHandler{}}, - {rmrCgo.RIC_E2_TERM_INIT, rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibReaderProvider)}, + {rmrCgo.RIC_E2_TERM_INIT, rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibDataService)}, } for _, tc := range testCases { - provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) + provider := NewNotificationHandlerProvider(rnibDataService, ranReconnectionManager) t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) { handler, err := provider.GetNotificationHandler(tc.msgType) if err != nil { @@ -92,8 +99,6 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { func TestGetNotificationHandlerFailure(t *testing.T) { - logger := initLog(t) - var testCases = []struct { msgType int errorText string @@ -101,19 +106,9 @@ func TestGetNotificationHandlerFailure(t *testing.T) { {9999 /*unknown*/, "notification handler not found"}, } for _, tc := range testCases { - readerMock := &mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - - ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rNibWriter.GetRNibWriter) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) - - provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) + + rnibDataService, ranReconnectionManager := initTestCase(t) + provider := NewNotificationHandlerProvider(rnibDataService, ranReconnectionManager) t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) { _, err := provider.GetNotificationHandler(tc.msgType) if err == nil { diff --git a/E2Manager/resources/configuration.yaml b/E2Manager/resources/configuration.yaml index 0e16ecd..4dabf92 100644 --- a/E2Manager/resources/configuration.yaml +++ b/E2Manager/resources/configuration.yaml @@ -8,3 +8,5 @@ rmr: notificationResponseBuffer: 100 bigRedButtonTimeoutSec: 5 maxConnectionAttempts: 3 +maxRnibConnectionAttempts: 3 +rnibRetryIntervalMs: 10 diff --git a/E2Manager/services/receivers/rmr_service_receiver_test.go b/E2Manager/services/receivers/rmr_service_receiver_test.go index 15e9857..1482085 100644 --- a/E2Manager/services/receivers/rmr_service_receiver_test.go +++ b/E2Manager/services/receivers/rmr_service_receiver_test.go @@ -58,6 +58,8 @@ func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) } func getRmrServiceReceiver(rmrMessengerMock *mocks.RmrMessengerMock, logger *logger.Logger) *RmrServiceReceiver { + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} + readerMock := &mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock @@ -67,10 +69,11 @@ func getRmrServiceReceiver(rmrMessengerMock *mocks.RmrMessengerMock, logger *log return writerMock } + rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) rmrService := getRmrService(rmrMessengerMock, logger) - ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rNibWriter.GetRNibWriter) - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) - nManager := notificationmanager.NewNotificationManager(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) + ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibDataService) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager) + nManager := notificationmanager.NewNotificationManager(rnibDataService, ranReconnectionManager) return NewRmrServiceReceiver(*rmrService, nManager) } diff --git a/E2Manager/services/rnib_data_service.go b/E2Manager/services/rnib_data_service.go new file mode 100644 index 0000000..8a91894 --- /dev/null +++ b/E2Manager/services/rnib_data_service.go @@ -0,0 +1,128 @@ +package services + +import ( + "e2mgr/configuration" + "e2mgr/logger" + "e2mgr/rNibWriter" + "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" + "net" + "time" +) + +type RNibDataService interface { + SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error + UpdateNodebInfo(nodebInfo *entities.NodebInfo) error + SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error + GetNodeb(ranName string) (*entities.NodebInfo, error) + GetListNodebIds() ([]*entities.NbIdentity, error) +} + +type rNibDataService struct { + logger *logger.Logger + rnibReaderProvider func() reader.RNibReader + rnibWriterProvider func() rNibWriter.RNibWriter + maxAttempts int + retryInterval time.Duration +} + +func NewRnibDataService(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *rNibDataService { + return &rNibDataService{ + logger: logger, + rnibReaderProvider: rnibReaderProvider, + rnibWriterProvider: rnibWriterProvider, + maxAttempts: config.MaxRnibConnectionAttempts, + retryInterval: time.Duration(config.RnibRetryIntervalMs) * time.Millisecond, + } +} + +func (w *rNibDataService) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error { + w.logger.Infof("#RnibDataService.UpdateNodebInfo - nodebInfo: %s", nodebInfo) + + err := w.retry("UpdateNodebInfo", func() (err error) { + err = w.rnibWriterProvider().UpdateNodebInfo(nodebInfo) + return + }) + + return err +} + +func (w *rNibDataService) SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error { + w.logger.Infof("#RnibDataService.SaveNodeb - nbIdentity: %s, nodebInfo: %s", nbIdentity, nb) + + err := w.retry("SaveNodeb", func() (err error) { + err = w.rnibWriterProvider().SaveNodeb(nbIdentity, nb) + return + }) + + return err +} + +func (w *rNibDataService) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error { + w.logger.Infof("#RnibDataService.SaveRanLoadInformation - inventoryName: %s, ranLoadInformation: %s", inventoryName, ranLoadInformation) + + err := w.retry("SaveRanLoadInformation", func() (err error) { + err = w.rnibWriterProvider().SaveRanLoadInformation(inventoryName, ranLoadInformation) + return + }) + + return err +} + +func (w *rNibDataService) GetNodeb(ranName string) (*entities.NodebInfo, error) { + w.logger.Infof("#RnibDataService.GetNodeb - ranName: %s", ranName) + + var nodeb *entities.NodebInfo = nil + + err := w.retry("GetNodeb", func() (err error) { + nodeb, err = w.rnibReaderProvider().GetNodeb(ranName) + return + }) + + return nodeb, err +} + +func (w *rNibDataService) GetListNodebIds() ([]*entities.NbIdentity, error) { + w.logger.Infof("#RnibDataService.GetListNodebIds") + + var nodeIds []*entities.NbIdentity = nil + + err := w.retry("GetListNodebIds", func() (err error) { + nodeIds, err = w.rnibReaderProvider().GetListNodebIds() + return + }) + + return nodeIds, err +} + +func (w *rNibDataService) retry(rnibFunc string, f func() error) (err error) { + attempts := w.maxAttempts + + for i := 1; ; i++ { + err = f() + if err == nil { + return + } + if !w.isConnError(err) { + return err + } + if i >= attempts { + w.logger.Errorf("#RnibDataService.retry - after %d attempts of %s, last error: %s", attempts, rnibFunc, err) + return err + } + time.Sleep(w.retryInterval) + + w.logger.Infof("#RnibDataService.retry - retrying %d %s after error: %s", i, rnibFunc, err) + } +} + +func (w *rNibDataService) isConnError(err error) bool { + internalErr, ok := err.(common.InternalError) + if !ok { + return false + } + _, ok = internalErr.Err.(*net.OpError) + + return ok +} diff --git a/E2Manager/services/rnib_data_service_test.go b/E2Manager/services/rnib_data_service_test.go new file mode 100644 index 0000000..7a96310 --- /dev/null +++ b/E2Manager/services/rnib_data_service_test.go @@ -0,0 +1,186 @@ +package services + +import ( + "e2mgr/configuration" + "e2mgr/logger" + "e2mgr/mocks" + "e2mgr/rNibWriter" + "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" + "github.com/stretchr/testify/assert" + "net" + "strings" + "testing" +) + +func setupTest(t *testing.T) (*rNibDataService, *mocks.RnibReaderMock, *mocks.RnibWriterMock) { + 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} + + readerMock := &mocks.RnibReaderMock{} + rnibReaderProvider := func() reader.RNibReader { + return readerMock + } + + writerMock := &mocks.RnibWriterMock{} + rnibWriterProvider := func() rNibWriter.RNibWriter { + return writerMock + } + + rnibDataService := NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider) + assert.NotNil(t, rnibDataService) + + return rnibDataService, readerMock, writerMock +} + +func TestSuccessfulSaveNodeb(t *testing.T) { + rnibDataService, _, writerMock := setupTest(t) + + nodebInfo := &entities.NodebInfo{} + nbIdentity := &entities.NbIdentity{} + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) + + rnibDataService.SaveNodeb(nbIdentity, nodebInfo) + writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1) +} + +func TestConnFailureSaveNodeb(t *testing.T) { + rnibDataService, _, writerMock := setupTest(t) + + nodebInfo := &entities.NodebInfo{} + nbIdentity := &entities.NbIdentity{} + mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}} + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(mockErr) + + rnibDataService.SaveNodeb(nbIdentity, nodebInfo) + writerMock.AssertNumberOfCalls(t, "SaveNodeb", 3) +} + +func TestNonConnFailureSaveNodeb(t *testing.T) { + rnibDataService, _, writerMock := setupTest(t) + + nodebInfo := &entities.NodebInfo{} + nbIdentity := &entities.NbIdentity{} + mockErr := common.InternalError{Err: fmt.Errorf("non connection failure")} + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(mockErr) + + rnibDataService.SaveNodeb(nbIdentity, nodebInfo) + writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1) +} + +func TestSuccessfulUpdateNodebInfo(t *testing.T) { + rnibDataService, _, writerMock := setupTest(t) + + nodebInfo := &entities.NodebInfo{} + writerMock.On("UpdateNodebInfo", nodebInfo).Return(nil) + + rnibDataService.UpdateNodebInfo(nodebInfo) + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) +} + +func TestConnFailureUpdateNodebInfo(t *testing.T) { + rnibDataService, _, writerMock := setupTest(t) + + nodebInfo := &entities.NodebInfo{} + mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}} + writerMock.On("UpdateNodebInfo", nodebInfo).Return(mockErr) + + rnibDataService.UpdateNodebInfo(nodebInfo) + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3) +} + +func TestSuccessfulSaveRanLoadInformation(t *testing.T) { + rnibDataService, _, writerMock := setupTest(t) + + var ranName string = "abcd" + ranLoadInformation := &entities.RanLoadInformation{} + writerMock.On("SaveRanLoadInformation", ranName, ranLoadInformation).Return(nil) + + rnibDataService.SaveRanLoadInformation(ranName, ranLoadInformation) + writerMock.AssertNumberOfCalls(t, "SaveRanLoadInformation", 1) +} + +func TestConnFailureSaveRanLoadInformation(t *testing.T) { + rnibDataService, _, writerMock := setupTest(t) + + var ranName string = "abcd" + ranLoadInformation := &entities.RanLoadInformation{} + mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}} + writerMock.On("SaveRanLoadInformation", ranName, ranLoadInformation).Return(mockErr) + + rnibDataService.SaveRanLoadInformation(ranName, ranLoadInformation) + writerMock.AssertNumberOfCalls(t, "SaveRanLoadInformation", 3) +} + +func TestSuccessfulGetNodeb(t *testing.T) { + rnibDataService, readerMock, _ := setupTest(t) + + invName := "abcd" + nodebInfo := &entities.NodebInfo{} + readerMock.On("GetNodeb", invName).Return(nodebInfo, nil) + + res, err := rnibDataService.GetNodeb(invName) + readerMock.AssertNumberOfCalls(t, "GetNodeb", 1) + assert.Equal(t, nodebInfo, res) + assert.Nil(t, err) +} + +func TestConnFailureGetNodeb(t *testing.T) { + rnibDataService, readerMock, _ := setupTest(t) + + invName := "abcd" + var nodeb *entities.NodebInfo = nil + mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}} + readerMock.On("GetNodeb", invName).Return(nodeb, mockErr) + + res, err := rnibDataService.GetNodeb(invName) + readerMock.AssertNumberOfCalls(t, "GetNodeb", 3) + assert.True(t, strings.Contains(err.Error(), "connection error", )) + assert.Equal(t, nodeb, res) +} + +func TestSuccessfulGetNodebIdList(t *testing.T) { + rnibDataService, readerMock, _ := setupTest(t) + + nodeIds := []*entities.NbIdentity{} + readerMock.On("GetListNodebIds").Return(nodeIds, nil) + + res, err := rnibDataService.GetListNodebIds() + readerMock.AssertNumberOfCalls(t, "GetListNodebIds", 1) + assert.Equal(t, nodeIds, res) + assert.Nil(t, err) +} + +func TestConnFailureGetNodebIdList(t *testing.T) { + rnibDataService, readerMock, _ := setupTest(t) + + var nodeIds []*entities.NbIdentity = nil + mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}} + readerMock.On("GetListNodebIds").Return(nodeIds, mockErr) + + res, err := rnibDataService.GetListNodebIds() + readerMock.AssertNumberOfCalls(t, "GetListNodebIds", 3) + assert.True(t, strings.Contains(err.Error(), "connection error", )) + assert.Equal(t, nodeIds, res) +} + +//func TestConnFailureThenSuccessGetNodebIdList(t *testing.T) { +// rnibDataService, readerMock, _ := setupTest(t) +// +// var nilNodeIds []*entities.NbIdentity = nil +// nodeIds := []*entities.NbIdentity{} +// mockErr := common.InternalError{Err: &net.OpError{Err:fmt.Errorf("connection error")}} +// //readerMock.On("GetListNodebIds").Return(nilNodeIds, mockErr) +// //readerMock.On("GetListNodebIds").Return(nodeIds, nil) +// +// res, err := rnibDataService.GetListNodebIds() +// readerMock.AssertNumberOfCalls(t, "GetListNodebIds", 2) +// assert.True(t, strings.Contains(err.Error(),"connection failure", )) +// assert.Equal(t, nodeIds, res) +//} diff --git a/E2Manager/services/rnib_reader_service.go b/E2Manager/services/rnib_reader_service.go deleted file mode 100644 index 4b014d7..0000000 --- a/E2Manager/services/rnib_reader_service.go +++ /dev/null @@ -1,41 +0,0 @@ -// -// Copyright 2019 AT&T Intellectual Property -// Copyright 2019 Nokia -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package services - -import ( - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" -) - -type RnibReaderService struct { - rnibReaderProvider func() reader.RNibReader -} - -func NewRnibReaderService(rnibReaderProvider func() reader.RNibReader) *RnibReaderService{ - return &RnibReaderService{rnibReaderProvider} -} - -func (s RnibReaderService) GetNodeb(ranName string) (*entities.NodebInfo, error) { - return s.rnibReaderProvider().GetNodeb(ranName) -} - -func (s RnibReaderService) GetNodebIdList()([]*entities.NbIdentity, error) { - return s.rnibReaderProvider().GetListNodebIds() -} - -