From: irina Date: Tue, 10 Sep 2019 09:40:37 +0000 (+0300) Subject: [RICPLT-2048] X2 ENDC Setup request refactoring X-Git-Tag: 2.0.10~14 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=33f84e1a0998af025880be3e8eb087fac34af731;p=ric-plt%2Fe2mgr.git [RICPLT-2048] X2 ENDC Setup request refactoring Change-Id: Iecf370b10b4604025e9112e545dc0a6a875de885 Signed-off-by: irina --- diff --git a/E2Manager/controllers/controller.go b/E2Manager/controllers/controller.go index 6c86816..0cd8293 100644 --- a/E2Manager/controllers/controller.go +++ b/E2Manager/controllers/controller.go @@ -21,6 +21,7 @@ import ( "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/logger" + "e2mgr/managers" "e2mgr/models" "e2mgr/providers/httpmsghandlerprovider" "e2mgr/rNibWriter" @@ -28,16 +29,23 @@ import ( "encoding/json" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "github.com/gorilla/mux" + "io" + "io/ioutil" "net/http" + "net/http/httputil" + "strings" ) const ( ParamRanName = "ranName" + LimitRequest = 1000 ) type IController interface { ShutdownHandler(writer http.ResponseWriter, r *http.Request) X2ResetHandler(writer http.ResponseWriter, r *http.Request) + X2SetupHandler(writer http.ResponseWriter, r *http.Request) + EndcSetupHandler(writer http.ResponseWriter, r *http.Request) } type Controller struct { @@ -46,9 +54,9 @@ type Controller struct { } func NewController(logger *logger.Logger, rmrService *services.RmrService, rNibReaderProvider func() reader.RNibReader, rNibWriterProvider func() rNibWriter.RNibWriter, - config *configuration.Configuration) *Controller { + config *configuration.Configuration, ranSetupManager *managers.RanSetupManager) *Controller { - provider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider) + provider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider, ranSetupManager) return &Controller{ logger: logger, handlerProvider: provider, @@ -56,32 +64,58 @@ func NewController(logger *logger.Logger, rmrService *services.RmrService, rNibR } func (c *Controller) ShutdownHandler(writer http.ResponseWriter, r *http.Request) { - c.logger.Infof("[Client -> E2 Manager] #controller.ShutdownHandler - request: %v", prettifyRequest(r)) - c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ShutdownRequest, nil, false, http.StatusNoContent) + c.logger.Infof("[Client -> E2 Manager] #controller.ShutdownHandler - request: %v", c.prettifyRequest(r)) + c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ShutdownRequest, nil, false) } func (c *Controller) X2ResetHandler(writer http.ResponseWriter, r *http.Request) { - c.logger.Infof("[Client -> E2 Manager] #controller.X2ResetHandler - request: %v", prettifyRequest(r)) + c.logger.Infof("[Client -> E2 Manager] #controller.X2ResetHandler - request: %v", c.prettifyRequest(r)) request := models.ResetRequest{} vars := mux.Vars(r) ranName := vars[ParamRanName] - if !c.extractJsonBody(r, &request, writer) { + if r.ContentLength > 0 && !c.extractJsonBody(r, &request, writer) { return } request.RanName = ranName - c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ResetRequest, request, false, http.StatusNoContent) + c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ResetRequest, request, false) } -func (c *Controller) extractJsonBody(r *http.Request, request models.Request, writer http.ResponseWriter) bool { - if r.ContentLength <= 0 { - return true +func (c *Controller) X2SetupHandler(writer http.ResponseWriter, r *http.Request) { + c.logger.Infof("[Client -> E2 Manager] #controller.X2SetupHandler - request: %v", c.prettifyRequest(r)) + + request := models.SetupRequest{} + + if !c.extractJsonBody(r, &request, writer) { + return + } + + c.handleRequest(writer, &r.Header, httpmsghandlerprovider.X2SetupRequest, request, true) +} + +func (c *Controller) EndcSetupHandler(writer http.ResponseWriter, r *http.Request) { + c.logger.Infof("[Client -> E2 Manager] #controller.EndcSetupHandler - request: %v", c.prettifyRequest(r)) + + request := models.SetupRequest{} + + if !c.extractJsonBody(r, &request, writer) { + return } - decoder := json.NewDecoder(r.Body) + c.handleRequest(writer, &r.Header, httpmsghandlerprovider.EndcSetupRequest, request, true) +} + +func (c *Controller) extractJsonBody(r *http.Request, request models.Request, writer http.ResponseWriter) bool { + defer r.Body.Close() + body, err := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest)) - err := decoder.Decode(request) + if err != nil { + c.logger.Errorf("[Client -> E2 Manager] #controller.extractJsonBody - unable to extract json body - error: %s", err) + c.handleErrorResponse(e2managererrors.NewInvalidJsonError(), writer) + return false + } + err = json.Unmarshal(body, &request) if err != nil { c.logger.Errorf("[Client -> E2 Manager] #controller.extractJsonBody - unable to extract json body - error: %s", err) c.handleErrorResponse(e2managererrors.NewInvalidJsonError(), writer) @@ -92,7 +126,7 @@ func (c *Controller) extractJsonBody(r *http.Request, request models.Request, wr } func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Header, requestName httpmsghandlerprovider.IncomingRequest, - request models.Request, validateHeader bool, httpStatusResponse int) { + request models.Request, validateHeader bool) { if validateHeader { @@ -110,15 +144,15 @@ func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Head return } - err = handler.Handle(c.logger, request) + err = handler.Handle(request) if err != nil { c.handleErrorResponse(err, writer) return } - writer.WriteHeader(httpStatusResponse) - c.logger.Infof("[E2 Manager -> Client] #controller.handleRequest - status response: %v", httpStatusResponse) + writer.WriteHeader(http.StatusNoContent) + c.logger.Infof("[E2 Manager -> Client] #controller.handleRequest - status response: %v", http.StatusNoContent) } func (c *Controller) validateRequestHeader(header *http.Header) error { @@ -189,3 +223,9 @@ func (c *Controller) handleErrorResponse(err error, writer http.ResponseWriter) c.logger.Errorf("#controller.handleErrorResponse - Cannot send response. writer:%v", writer) } } + +func (c *Controller) prettifyRequest(request *http.Request) string { + dump, _ := httputil.DumpRequest(request, true) + requestPrettyPrint := strings.Replace(string(dump), "\r\n", " ", -1) + return strings.Replace(requestPrettyPrint, "\n", "", -1) +} diff --git a/E2Manager/controllers/controller_test.go b/E2Manager/controllers/controller_test.go index 69dbfda..9a31d53 100644 --- a/E2Manager/controllers/controller_test.go +++ b/E2Manager/controllers/controller_test.go @@ -22,6 +22,7 @@ import ( "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/logger" + "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" "e2mgr/providers/httpmsghandlerprovider" @@ -44,6 +45,34 @@ import ( "testing" ) +func TestX2SetupSuccess(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() + + header := http.Header{} + header.Set("Content-Type", "application/json") + + writer := httptest.NewRecorder() + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) + controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) + + httpRequest := tests.GetHttpRequest() + httpRequest.Header = header + controller.X2SetupHandler(writer, httpRequest) + + assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)*/ +} + func TestShutdownHandlerRnibError(t *testing.T) { log := initLog(t) config := configuration.ParseConfiguration() @@ -63,7 +92,8 @@ func TestShutdownHandlerRnibError(t *testing.T) { readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr) writer := httptest.NewRecorder() - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config) + 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) @@ -87,12 +117,12 @@ func TestHeaderValidationFailed(t *testing.T) { } writer := httptest.NewRecorder() - - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config) + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) + controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) header := &http.Header{} - controller.handleRequest(writer, header, httpmsghandlerprovider.ShutdownRequest, nil, true, http.StatusNoContent) + controller.handleRequest(writer, header, httpmsghandlerprovider.ShutdownRequest, nil, true) var errorResponse = parseJsonRequest(t, writer.Body) err := e2managererrors.NewHeaderValidationError() @@ -121,7 +151,8 @@ func TestShutdownStatusNoContent(t *testing.T) { readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError) writer := httptest.NewRecorder() - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config) + 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) @@ -142,7 +173,8 @@ func TestHandleInternalError(t *testing.T) { } writer := httptest.NewRecorder() - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config) + 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) @@ -167,7 +199,8 @@ func TestHandleCommandAlreadyInProgressError(t *testing.T) { return writerMock } writer := httptest.NewRecorder() - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config) + 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) @@ -191,8 +224,8 @@ func TestValidateHeaders(t *testing.T) { return writerMock } config := configuration.ParseConfiguration() - - controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config) + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) + controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager) header := http.Header{} header.Set("Content-Type", "application/json") @@ -244,7 +277,8 @@ func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) writer := httptest.NewRecorder() - controller := NewController(log, rmrService, readerProvider, writerProvider, config) + 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) @@ -284,7 +318,8 @@ func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) writer := httptest.NewRecorder() - controller := NewController(log, rmrService, readerProvider, writerProvider, config) + 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) @@ -318,7 +353,8 @@ func TestX2ResetHandleFailureInvalidBody(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) writer := httptest.NewRecorder() - controller := NewController(log, rmrService, readerProvider, writerProvider, config) + 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\"") @@ -348,8 +384,8 @@ func TestHandleErrorResponse(t *testing.T) { config := configuration.ParseConfiguration() rmrService := getRmrService(rmrMessengerMock, log) - - controller := NewController(log, rmrService, readerProvider, writerProvider, config) + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) + controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager) writer := httptest.NewRecorder() controller.handleErrorResponse(e2managererrors.NewRnibDbError(), writer) diff --git a/E2Manager/controllers/nodeb_controller.go b/E2Manager/controllers/nodeb_controller.go index 802537d..fdfebe0 100644 --- a/E2Manager/controllers/nodeb_controller.go +++ b/E2Manager/controllers/nodeb_controller.go @@ -20,37 +20,26 @@ package controllers import ( "e2mgr/logger" "e2mgr/models" - "e2mgr/providers/httpmsghandlerprovider" "e2mgr/rNibWriter" "e2mgr/services" "e2mgr/sessions" "e2mgr/utils" "encoding/json" - "errors" "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/go-ozzo/ozzo-validation" - "github.com/go-ozzo/ozzo-validation/is" "github.com/golang/protobuf/jsonpb" "github.com/gorilla/mux" "net/http" - "net/http/httputil" - "strings" - "sync" "time" ) const ( - parseErrorCode int = 401 validationErrorCode int = 402 notFoundErrorCode int = 404 internalErrorCode int = 501 - requiredInputErrorMessage = "Mandatory fields are missing" validationFailedMessage = "Validation failed" - parseErrorMessage = "Parse failure" notFoundErrorMessage = "Resource not found" internalErrorMessage = "Internal Server Error. Please try again later" - sendMessageErrorMessage = "Failed to send message. For more information please check logs" ) var E2Sessions = make(sessions.E2Sessions) @@ -59,7 +48,6 @@ var messageChannel chan *models.E2RequestMessage var errorChannel chan error type INodebController interface { - HandleRequest(writer http.ResponseWriter, request *http.Request) GetNodebIdList (writer http.ResponseWriter, request *http.Request) GetNodeb(writer http.ResponseWriter, request *http.Request) HandleHealthCheckRequest(writer http.ResponseWriter, request *http.Request) @@ -83,68 +71,6 @@ func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, } } -func prettifyRequest(request *http.Request) string { - dump, _ := httputil.DumpRequest(request, true) - requestPrettyPrint := strings.Replace(string(dump), "\r\n", " ", -1) - return strings.Replace(requestPrettyPrint, "\n", "", -1) -} - -func (rc NodebController) HandleRequest(writer http.ResponseWriter, request *http.Request) { - startTime := time.Now() - rc.Logger.Infof("[Client -> E2 Manager] #nodeb_controller.HandleRequest - request: %v", prettifyRequest(request)) - - vars := mux.Vars(request) - messageTypeParam := vars["messageType"] - requestHandlerProvider := httpmsghandlerprovider.NewRequestHandlerProvider(rc.rnibWriterProvider) - handler, err := requestHandlerProvider.GetHandler(rc.Logger, messageTypeParam) - - if err != nil { - handleErrorResponse(rc.Logger, http.StatusNotFound, notFoundErrorCode, notFoundErrorMessage, writer, startTime) - return - } - - requestDetails, err := parseJson(rc.Logger, request) - - if err != nil { - handleErrorResponse(rc.Logger, http.StatusBadRequest, parseErrorCode, parseErrorMessage, writer, startTime) - return - } - - rc.Logger.Infof("#nodeb_controller.HandleRequest - request: %+v", requestDetails) - - if err := validateRequestDetails(rc.Logger, requestDetails); err != nil { - handleErrorResponse(rc.Logger, http.StatusBadRequest, validationErrorCode, requiredInputErrorMessage, writer, startTime) - return - } - - err = handler.PreHandle(rc.Logger, &requestDetails) - - if err != nil { - handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, err.Error(), writer, startTime) - return - } - - rc.Logger.Infof("[E2 Manager -> Client] #nodeb_controller.HandleRequest - http status: 200") - writer.WriteHeader(http.StatusOK) - - var wg sync.WaitGroup - - go handler.CreateMessage(rc.Logger, &requestDetails, messageChannel, E2Sessions, startTime, wg) - - go rc.rmrService.SendMessage(handler.GetMessageType(), messageChannel, errorChannel, wg) - - wg.Wait() - - err = <-errorChannel - - if err != nil { - handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, sendMessageErrorMessage, writer, startTime) - return - } - - printHandlingRequestElapsedTimeInMs(rc.Logger, startTime) -} - func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *http.Request) { startTime := time.Now() rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider) @@ -176,7 +102,7 @@ func (rc NodebController) GetNodeb(writer http.ResponseWriter, request *http.Req vars := mux.Vars(request) ranName := vars["ranName"] // WAS: respondingNode, rnibError := reader.GetRNibReader().GetNodeb(ranName) - rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider); + rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider) respondingNode, rnibError := rnibReaderService.GetNodeb(ranName) if rnibError != nil { rc.Logger.Errorf("%v", rnibError) @@ -204,32 +130,6 @@ func (rc NodebController) HandleHealthCheckRequest(writer http.ResponseWriter, r writer.WriteHeader(http.StatusOK) } -func parseJson(logger *logger.Logger, request *http.Request) (models.RequestDetails, error) { - var requestDetails models.RequestDetails - if err := json.NewDecoder(request.Body).Decode(&requestDetails); err != nil { - logger.Errorf("#nodeb_controller.parseJson - cannot deserialize incoming request. request: %v, error: %v", request, err) - return requestDetails, err - } - return requestDetails, nil -} - -func validateRequestDetails(logger *logger.Logger, requestDetails models.RequestDetails) error { - - if requestDetails.RanPort == 0 { - logger.Errorf("#nodeb_controller.validateRequestDetails - validation failure: port cannot be zero") - return errors.New("port: cannot be blank") - } - err := validation.ValidateStruct(&requestDetails, - validation.Field(&requestDetails.RanIp, validation.Required, is.IP), - validation.Field(&requestDetails.RanName, validation.Required), - ) - if err != nil { - logger.Errorf("#nodeb_controller.validateRequestDetails - validation failure, error: %v", err) - } - - return err -} - func handleErrorResponse(logger *logger.Logger, httpStatus int, errorCode int, errorMessage string, writer http.ResponseWriter, startTime time.Time) { errorResponseDetails := models.ErrorResponse{errorCode, errorMessage} errorResponse, _ := json.Marshal(errorResponseDetails) diff --git a/E2Manager/controllers/nodeb_controller_test.go b/E2Manager/controllers/nodeb_controller_test.go index 26f92c5..8334968 100644 --- a/E2Manager/controllers/nodeb_controller_test.go +++ b/E2Manager/controllers/nodeb_controller_test.go @@ -26,22 +26,18 @@ import ( "e2mgr/services" "e2mgr/sessions" "e2mgr/tests" - "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "io/ioutil" "net/http" "net/http/httptest" "testing" ) -const x2SetupMessageType = "x2-setup" - func TestNewRequestController(t *testing.T) { rnibReaderProvider := func() reader.RNibReader { return &mocks.RnibReaderMock{} @@ -53,63 +49,6 @@ func TestNewRequestController(t *testing.T) { assert.NotNil(t, NewNodebController(&logger.Logger{}, &services.RmrService{}, rnibReaderProvider, rnibWriterProvider)) } -func TestHandleRequestSuccess(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("#nodeb_controller_test.TestHandleRequestSuccess - failed to initialize logger, error: %s", err) - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize, "RanName", &tests.DummyPayload, &tests.DummyXAction) - - rmrMessengerMock.On("SendMsg", - mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), - tests.MaxMsgSize).Return(mbuf, nil) - - writer := httptest.NewRecorder() - - handleRequest(writer, log, rmrMessengerMock, tests.GetHttpRequest(), x2SetupMessageType) - assert.Equal(t, http.StatusOK, writer.Result().StatusCode) -} - -func TestHandleRequestFailure_InvalidRequestDetails(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("#nodeb_controller_test.TestHandleRequestFailure - failed to initialize logger, error: %s", err) - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - var mbuf *rmrCgo.MBuf - - rmrMessengerMock.On("SendMsg", - mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), - tests.MaxMsgSize).Return(mbuf, errors.New("test failure")) - - writer := httptest.NewRecorder() - - handleRequest(writer, log, rmrMessengerMock, tests.GetInvalidRequestDetails(), x2SetupMessageType) - assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode) -} - -func TestHandleRequestFailure_InvalidMessageType(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("#nodeb_controller_test.TestHandleRequestFailure - failed to initialize logger, error: %s", err) - } - - rmrMessengerMock := &mocks.RmrMessengerMock{} - var mbuf *rmrCgo.MBuf - - rmrMessengerMock.On("SendMsg", - mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), - tests.MaxMsgSize).Return(mbuf, errors.New("test failure")) - - writer := httptest.NewRecorder() - - handleRequest(writer, log, rmrMessengerMock, tests.GetInvalidMessageType(), "dummy") - assert.Equal(t, http.StatusNotFound, writer.Result().StatusCode) -} - func TestHandleHealthCheckRequest(t *testing.T) { rc := NewNodebController(nil, nil, nil, nil) writer := httptest.NewRecorder() @@ -117,30 +56,6 @@ func TestHandleHealthCheckRequest(t *testing.T) { assert.Equal(t, writer.Result().StatusCode, http.StatusOK) } -func handleRequest(writer *httptest.ResponseRecorder, log *logger.Logger, rmrMessengerMock *mocks.RmrMessengerMock, - request *http.Request, messageType string) { - rmrService := getRmrService(rmrMessengerMock, log) - request = mux.SetURLVars(request, map[string]string{"messageType": messageType}) - - var nodebInfo *entities.NodebInfo - var nbIdentity *entities.NbIdentity - - rnibWriterMock := mocks.RnibWriterMock{} - rnibWriterMock.On("SaveNodeb", - mock.AnythingOfType(fmt.Sprintf("%T", nbIdentity)), - mock.AnythingOfType(fmt.Sprintf("%T", nodebInfo))).Return(nil) - - rnibReaderProvider := func() reader.RNibReader { - return &mocks.RnibReaderMock{} - } - - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &rnibWriterMock - } - - NewNodebController(log, rmrService, rnibReaderProvider, rnibWriterProvider).HandleRequest(writer, request) -} - func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *services.RmrService { rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock) messageChannel := make(chan *models.NotificationResponse) diff --git a/E2Manager/e2pdus/endc_x2_setup_request_test.go b/E2Manager/e2pdus/endc_x2_setup_request_test.go index 776b9ae..57ed550 100644 --- a/E2Manager/e2pdus/endc_x2_setup_request_test.go +++ b/E2Manager/e2pdus/endc_x2_setup_request_test.go @@ -63,7 +63,7 @@ func TestPackEndcX2apSetupRequest(t *testing.T) { for _, tc := range testCases { t.Run(tc.packedPdu, func(t *testing.T) { - payload, _, err := PreparePackedEndcX2SetupRequest(MaxAsn1PackedBufferSize /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, tc.eNBId, tc.eNBIdBitqty, ricFlag) + payload, _, err := preparePackedEndcX2SetupRequest(MaxAsn1PackedBufferSize /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, tc.eNBId, tc.eNBIdBitqty, ricFlag) if err != nil { t.Errorf("want: success, got: pack failed. Error: %v\n", err) } else { @@ -90,7 +90,7 @@ func TestPackEndcX2apSetupRequestPackError(t *testing.T) { eNBIdBitqty := uint(Macro_eNB_ID) wantError := "packing error: #src/asn1codec_utils.c.pack_pdu_aux - Encoded output of E2AP-PDU, is too big:53" - _, _, err := PreparePackedEndcX2SetupRequest(40 /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, eNBId, eNBIdBitqty, ricFlag) + _, _, err := preparePackedEndcX2SetupRequest(40 /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, eNBId, eNBIdBitqty, ricFlag) if err != nil { if 0 != strings.Compare(fmt.Sprintf("%s", err), wantError) { t.Errorf("want failure: %s, got: %s", wantError, err) diff --git a/E2Manager/e2pdus/x2_reset_known_causes.go b/E2Manager/e2pdus/x2_reset_known_causes.go index 9140f3d..de130bc 100644 --- a/E2Manager/e2pdus/x2_reset_known_causes.go +++ b/E2Manager/e2pdus/x2_reset_known_causes.go @@ -27,7 +27,6 @@ import ( "unsafe" ) -//TODO: replace the constant in setup_request_handler.go const ( MaxAsn1PackedBufferSize = 4096 MaxAsn1CodecMessageBufferSize = 4096 diff --git a/E2Manager/e2pdus/x2_setup_request_test.go b/E2Manager/e2pdus/x2_setup_request_test.go index 42fcff8..8cf7da0 100644 --- a/E2Manager/e2pdus/x2_setup_request_test.go +++ b/E2Manager/e2pdus/x2_setup_request_test.go @@ -65,7 +65,7 @@ func TestPackX2apSetupRequest(t *testing.T) { for _, tc := range testCases { t.Run(tc.packedPdu, func(t *testing.T) { - payload, _, err :=PreparePackedX2SetupRequest(MaxAsn1PackedBufferSize /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, tc.eNBId, tc.eNBIdBitqty,ricFlag) + payload, _, err := preparePackedX2SetupRequest(MaxAsn1PackedBufferSize /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, tc.eNBId, tc.eNBIdBitqty,ricFlag) if err != nil { t.Errorf("want: success, got: pack failed. Error: %v\n", err) } else { @@ -92,7 +92,7 @@ func TestPackX2apSetupRequestPackError(t *testing.T) { ricFlag := []byte{0xbb, 0xbc, 0xcc} /*pLMNId [3]bytes*/ eNBId := []byte{0xab, 0xcd, 0xe} eNBIdBitqty := uint(Macro_eNB_ID) - _, _, err := PreparePackedX2SetupRequest(40 /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, eNBId, eNBIdBitqty, ricFlag) + _, _, err := preparePackedX2SetupRequest(40 /*max packed buffer*/, MaxAsn1CodecMessageBufferSize /*max message buffer*/, pLMNId, eNBId, eNBIdBitqty, ricFlag) if err != nil { if 0 != strings.Compare(fmt.Sprintf("%s", err), wantError) { t.Errorf("want failure: %s, got: %s", wantError, err) diff --git a/E2Manager/e2pdus/x2_setup_requests.go b/E2Manager/e2pdus/x2_setup_requests.go index 938506b..b22e59d 100644 --- a/E2Manager/e2pdus/x2_setup_requests.go +++ b/E2Manager/e2pdus/x2_setup_requests.go @@ -25,10 +25,12 @@ import "C" import ( "fmt" "github.com/pkg/errors" + "os" "unsafe" ) const ( + EnvRicId = "RIC_ID" ShortMacro_eNB_ID = 18 Macro_eNB_ID = 20 LongMacro_eNB_ID = 21 @@ -40,7 +42,13 @@ var PackedX2setupRequest []byte var PackedEndcX2setupRequestAsString string var PackedX2setupRequestAsString string -func PreparePackedEndcX2SetupRequest(maxAsn1PackedBufferSize int, maxAsn1CodecMessageBufferSize int, pLMNId []byte, eNB_Id []byte /*18, 20, 21, 28 bits length*/, bitqty uint, ricFlag []byte) ([]byte, string, error) { +/*The Ric Id is the combination of pLMNId and ENBId*/ +var pLMNId []byte +var eNBId []byte +var eNBIdBitqty uint +var ricFlag = []byte{0xbb, 0xbc, 0xcc} /*pLMNId [3]bytes*/ + +func preparePackedEndcX2SetupRequest(maxAsn1PackedBufferSize int, maxAsn1CodecMessageBufferSize int, pLMNId []byte, eNB_Id []byte /*18, 20, 21, 28 bits length*/, bitqty uint, ricFlag []byte) ([]byte, string, error) { packedBuf := make([]byte, maxAsn1PackedBufferSize) errBuf := make([]C.char, maxAsn1CodecMessageBufferSize) packedBufSize := C.ulong(len(packedBuf)) @@ -68,7 +76,7 @@ func PreparePackedEndcX2SetupRequest(maxAsn1PackedBufferSize int, maxAsn1CodecMe return packedBuf[:packedBufSize], pduAsString, nil } -func PreparePackedX2SetupRequest(maxAsn1PackedBufferSize int, maxAsn1CodecMessageBufferSize int, pLMNId []byte, eNB_Id []byte /*18, 20, 21, 28 bits length*/, bitqty uint, ricFlag []byte) ([]byte, string, error) { +func preparePackedX2SetupRequest(maxAsn1PackedBufferSize int, maxAsn1CodecMessageBufferSize int, pLMNId []byte, eNB_Id []byte /*18, 20, 21, 28 bits length*/, bitqty uint, ricFlag []byte) ([]byte, string, error) { packedBuf := make([]byte, maxAsn1PackedBufferSize) errBuf := make([]C.char, maxAsn1CodecMessageBufferSize) packedBufSize := C.ulong(len(packedBuf)) @@ -94,3 +102,46 @@ func PreparePackedX2SetupRequest(maxAsn1PackedBufferSize int, maxAsn1CodecMessag } return packedBuf[:packedBufSize], pduAsString, nil } + +//Expected value in RIC_ID = pLMN_Identity-eNB_ID/ +//<6 hex digits>-<6 or 8 hex digits>/<18|20|21|28> +//Each byte is represented by two hex digits, the value in the lowest byte of the eNB_ID must be assigned to the lowest bits +//For example, to get the value of ffffeab/28 the last byte must be 0x0b, not 0xb0 (-ffffea0b/28). +func parseRicID(ricId string) error { + if _, err := fmt.Sscanf(ricId, "%6x-%8x/%2d", &pLMNId, &eNBId, &eNBIdBitqty); err != nil { + return fmt.Errorf("unable to extract the value of %s: %s", EnvRicId, err) + } + + if len(pLMNId) < 3 { + return fmt.Errorf("invalid value for %s, len(pLMNId:%v) != 3", EnvRicId, pLMNId) + } + + if len(eNBId) < 3 { + return fmt.Errorf("invalid value for %s, len(eNBId:%v) != 3 or 4", EnvRicId, eNBId) + } + + if eNBIdBitqty != ShortMacro_eNB_ID && eNBIdBitqty != Macro_eNB_ID && eNBIdBitqty != LongMacro_eNB_ID && eNBIdBitqty != Home_eNB_ID { + return fmt.Errorf("invalid value for %s, eNBIdBitqty: %d", EnvRicId, eNBIdBitqty) + } + + return nil +} + +func init() { + var err error + ricId := os.Getenv(EnvRicId) + //ricId="bbbccc-ffff0e/20" + //ricId="bbbccc-abcd0e/20" + if err = parseRicID(ricId); err != nil { + panic(err) + } + + PackedEndcX2setupRequest, PackedEndcX2setupRequestAsString, err = preparePackedEndcX2SetupRequest(MaxAsn1PackedBufferSize, MaxAsn1CodecMessageBufferSize, pLMNId, eNBId, eNBIdBitqty, ricFlag) + if err != nil { + panic(err) + } + PackedX2setupRequest, PackedX2setupRequestAsString, err = preparePackedX2SetupRequest(MaxAsn1PackedBufferSize, MaxAsn1CodecMessageBufferSize, pLMNId, eNBId, eNBIdBitqty, ricFlag) + if err != nil { + panic(err) + } +} diff --git a/E2Manager/e2pdus/x2_setup_requests_test.go b/E2Manager/e2pdus/x2_setup_requests_test.go new file mode 100644 index 0000000..fd66480 --- /dev/null +++ b/E2Manager/e2pdus/x2_setup_requests_test.go @@ -0,0 +1,130 @@ +/******************************************************************************* + * + * Copyright (c) 2019 AT&T Intellectual Property. + * + * 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 e2pdus + +import ( + "bytes" + "fmt" + "strings" + "testing" +) + +func TestParseRicId(t *testing.T) { + var testCases = []struct { + ricId string + pLMNId []byte + eNBId []byte + eNBIdBitqty uint + failure error + }{ + { + ricId: "bbbccc-abcd02/18", + pLMNId: []byte{0xbb, 0xbc, 0xcc}, + eNBId: []byte{0xab, 0xcd, 0x2}, /*00000010 -> 10000000*/ + eNBIdBitqty: ShortMacro_eNB_ID, + }, + { + ricId: "bbbccc-abcd0e/20", + pLMNId: []byte{0xbb, 0xbc, 0xcc}, + eNBId: []byte{0xab, 0xcd, 0xe}, + eNBIdBitqty: Macro_eNB_ID, + }, + { + ricId: "bbbccc-abcd07/21", + pLMNId: []byte{0xbb, 0xbc, 0xcc}, + eNBId: []byte{0xab, 0xcd, 0x7}, /*00000111 -> 00111000*/ + eNBIdBitqty: LongMacro_eNB_ID, + }, + { + ricId: "bbbccc-abcdef08/28", + pLMNId: []byte{0xbb, 0xbc, 0xcc}, + eNBId: []byte{0xab, 0xcd, 0xef, 0x8}, + eNBIdBitqty: Home_eNB_ID, + }, + { + ricId: "", + failure: fmt.Errorf("unable to extract the value of RIC_ID: EOF"), + }, + + { + ricId: "bbbccc", + failure: fmt.Errorf("unable to extract the value of RIC_ID: unexpected EOF"), + }, + { + ricId: "bbbccc-", + failure: fmt.Errorf("unable to extract the value of RIC_ID: EOF"), + }, + { + ricId: "-bbbccc", + failure: fmt.Errorf("%s", "unable to extract the value of RIC_ID: no hex data for %x string"), + }, + { + ricId: "/20", + failure: fmt.Errorf("%s", "unable to extract the value of RIC_ID: no hex data for %x string"), + }, + { + ricId: "bbbcccdd-abcdef08/28", // pLMNId too long + failure: fmt.Errorf("unable to extract the value of RIC_ID: input does not match format"), + }, + { + ricId: "bbbccc-abcdef0809/28", // eNBId too long + failure: fmt.Errorf("unable to extract the value of RIC_ID: input does not match format"), + }, + + { + ricId: "bbbc-abcdef08/28", // pLMNId too short + failure: fmt.Errorf("invalid value for RIC_ID, len(pLMNId:[187 188]) != 3"), + }, + { + ricId: "bbbccc-abcd/28", // eNBId too short + failure: fmt.Errorf("invalid value for RIC_ID, len(eNBId:[171 205]) != 3 or 4"), + }, + { + ricId: "bbbccc-abcdef08/239", // bit quantity too long - no error, will return 23 (which is invalid) + failure: fmt.Errorf("invalid value for RIC_ID, eNBIdBitqty: 23"), + }, + } + + for _, tc := range testCases { + t.Run(tc.ricId, func(t *testing.T) { + + err := parseRicID(tc.ricId) + if err != nil { + if tc.failure == nil { + t.Errorf("want: success, got: parse failed. Error: %v\n", err) + } else { + if strings.Compare(err.Error(), tc.failure.Error()) != 0 { + t.Errorf("want: %s, got: %s\n", err, tc.failure) + } + } + } else { + if bytes.Compare(tc.pLMNId, pLMNId) != 0 { + t.Errorf("want: pLMNId = %v, got: pLMNId = %v", tc.pLMNId, pLMNId) + } + + if bytes.Compare(tc.eNBId, eNBId) != 0 { + t.Errorf("want: eNBId = %v, got: eNBId = %v", tc.eNBId, eNBId) + } + + if tc.eNBIdBitqty != eNBIdBitqty { + t.Errorf("want: eNBIdBitqty = %d, got: eNBIdBitqty = %d", tc.eNBIdBitqty, eNBIdBitqty) + } + } + }) + } +} \ No newline at end of file diff --git a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go index 6e70deb..c25235c 100644 --- a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go +++ b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go @@ -35,41 +35,44 @@ import ( type DeleteAllRequestHandler struct { readerProvider func() reader.RNibReader writerProvider func() rNibWriter.RNibWriter - rmrService *services.RmrService - config *configuration.Configuration + rmrService *services.RmrService + config *configuration.Configuration + logger *logger.Logger } -func NewDeleteAllRequestHandler(rmrService *services.RmrService, config *configuration.Configuration, writerProvider func() rNibWriter.RNibWriter, readerProvider func() reader.RNibReader) *DeleteAllRequestHandler { - return &DeleteAllRequestHandler { +func NewDeleteAllRequestHandler(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, writerProvider func() rNibWriter.RNibWriter, + readerProvider func() reader.RNibReader) *DeleteAllRequestHandler { + return &DeleteAllRequestHandler{ + logger: logger, readerProvider: readerProvider, writerProvider: writerProvider, - rmrService: rmrService, - config: config, + rmrService: rmrService, + config: config, } } -func (handler *DeleteAllRequestHandler) Handle(logger *logger.Logger, request models.Request) error { +func (handler *DeleteAllRequestHandler) Handle(request models.Request) error { - err, continueFlow := handler.updateNodebStates(logger, false) + err, continueFlow := handler.updateNodebStates(false) if err != nil { return err } - if continueFlow == false{ + if continueFlow == false { return nil } //TODO change to rmr_request response := models.NotificationResponse{MgsType: rmrCgo.RIC_SCTP_CLEAR_ALL} - if err:= handler.rmrService.SendRmrMessage(&response); err != nil { - logger.Errorf("#DeleteAllRequestHandler.Handle - failed to send sctp clear all message to RMR: %s", err) - return e2managererrors.NewRmrError() + if err := handler.rmrService.SendRmrMessage(&response); err != nil { + handler.logger.Errorf("#DeleteAllRequestHandler.Handle - failed to send sctp clear all message to RMR: %s", err) + return e2managererrors.NewRmrError() } time.Sleep(time.Duration(handler.config.BigRedButtonTimeoutSec) * time.Second) - logger.Infof("#DeleteAllRequestHandler.Handle - timer expired") + handler.logger.Infof("#DeleteAllRequestHandler.Handle - timer expired") - err, _ = handler.updateNodebStates(logger, true) + err, _ = handler.updateNodebStates(true) if err != nil { return err } @@ -77,11 +80,11 @@ func (handler *DeleteAllRequestHandler) Handle(logger *logger.Logger, request mo return nil } -func (handler *DeleteAllRequestHandler) updateNodebStates(logger *logger.Logger, timeoutExpired bool) (error, bool){ +func (handler *DeleteAllRequestHandler) updateNodebStates(timeoutExpired bool) (error, bool) { nbIdentityList, err := handler.readerProvider().GetListNodebIds() if err != nil { - logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodes list from RNIB. Error: %s", err.Error()) + handler.logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodes list from RNIB. Error: %s", err.Error()) return e2managererrors.NewRnibDbError(), false } @@ -90,41 +93,41 @@ func (handler *DeleteAllRequestHandler) updateNodebStates(logger *logger.Logger, } numOfRanToShutDown := 0 - for _,nbIdentity := range nbIdentityList{ + for _, nbIdentity := range nbIdentityList { node, err := handler.readerProvider().GetNodeb((*nbIdentity).GetInventoryName()) if err != nil { - logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodeB entity for ran name: %v from RNIB. Error: %s", + handler.logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodeB entity for ran name: %v from RNIB. Error: %s", (*nbIdentity).GetInventoryName(), err.Error()) continue } - if timeoutExpired{ + if timeoutExpired { - if handler.saveNodebShutDownState(logger, nbIdentity, node){ + if handler.saveNodebShutDownState(nbIdentity, node) { numOfRanToShutDown++ } continue } - if handler.saveNodebNextState(logger, nbIdentity, node){ + if handler.saveNodebNextState(nbIdentity, node) { numOfRanToShutDown++ } } - if numOfRanToShutDown > 0{ - logger.Infof("#DeleteAllRequestHandler.updateNodebStates - update nodebs states in RNIB completed") - }else { - logger.Infof("#DeleteAllRequestHandler.updateNodebStates - nodebs states are not updated ") + if numOfRanToShutDown > 0 { + handler.logger.Infof("#DeleteAllRequestHandler.updateNodebStates - update nodebs states in RNIB completed") + } else { + handler.logger.Infof("#DeleteAllRequestHandler.updateNodebStates - nodebs states are not updated ") return nil, false } return nil, true } -func (handler *DeleteAllRequestHandler) saveNodebNextState(logger *logger.Logger, nbIdentity *entities.NbIdentity, node *entities.NodebInfo) bool{ +func (handler *DeleteAllRequestHandler) saveNodebNextState(nbIdentity *entities.NbIdentity, node *entities.NodebInfo) bool { - if node.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN{ + if node.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN { return true } @@ -138,26 +141,26 @@ func (handler *DeleteAllRequestHandler) saveNodebNextState(logger *logger.Logger err := handler.writerProvider().SaveNodeb(nbIdentity, node) if err != nil { - logger.Errorf("#DeleteAllRequestHandler.saveNodebNextState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s", + handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebNextState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s", (*nbIdentity).GetInventoryName(), err.Error()) return false } - if logger.DebugEnabled() { - logger.Debugf("#DeleteAllRequestHandler.saveNodebNextState - connection status of inventory name: %v changed to %v", + if handler.logger.DebugEnabled() { + handler.logger.Debugf("#DeleteAllRequestHandler.saveNodebNextState - connection status of inventory name: %v changed to %v", (*nbIdentity).GetInventoryName(), nextStatus.String()) } return true } -func (handler *DeleteAllRequestHandler) saveNodebShutDownState(logger *logger.Logger, nbIdentity *entities.NbIdentity, node *entities.NodebInfo) bool{ +func (handler *DeleteAllRequestHandler) saveNodebShutDownState(nbIdentity *entities.NbIdentity, node *entities.NodebInfo) bool { - if node.ConnectionStatus == entities.ConnectionStatus_SHUT_DOWN{ + if node.ConnectionStatus == entities.ConnectionStatus_SHUT_DOWN { return false } if node.ConnectionStatus != entities.ConnectionStatus_SHUTTING_DOWN { - logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - ignore, status is not Shutting Down, inventory name: %v ", (*nbIdentity).GetInventoryName()) + handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - ignore, status is not Shutting Down, inventory name: %v ", (*nbIdentity).GetInventoryName()) return false } @@ -166,11 +169,11 @@ func (handler *DeleteAllRequestHandler) saveNodebShutDownState(logger *logger.Lo err := handler.writerProvider().SaveNodeb(nbIdentity, node) if err != nil { - logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s", + handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s", (*nbIdentity).GetInventoryName(), err.Error()) return false } - logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - Shut Down , inventory name: %v ", (*nbIdentity).GetInventoryName()) + handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - Shut Down , inventory name: %v ", (*nbIdentity).GetInventoryName()) return true } diff --git a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go index aae7322..ffd428e 100644 --- a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go @@ -38,7 +38,7 @@ import ( "testing" ) -func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T){ +func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -53,20 +53,20 @@ func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T){ config := configuration.ParseConfiguration() - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) rnibErr := &common.ResourceNotFoundError{} var nbIdentityList []*entities.NbIdentity readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr) expected := &e2managererrors.RnibDbError{} - actual := handler.Handle(log, nil) - if reflect.TypeOf(actual) != reflect.TypeOf(expected){ + actual := handler.Handle(nil) + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) } } -func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){ +func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -81,7 +81,7 @@ func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){ config := configuration.ParseConfiguration() config.BigRedButtonTimeoutSec = 1 - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) rnibErr := &common.ResourceNotFoundError{} //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown @@ -90,26 +90,26 @@ func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){ readerMock.On("GetListNodebIds").Return(nbIdentityList, nil).Return(nbIdentityList, rnibErr) nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,} - nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,} + nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil) - updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil) expected := &e2managererrors.RnibDbError{} - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) - if reflect.TypeOf(actual) != reflect.TypeOf(expected){ + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) } } -func TestHandleSuccessFlow(t *testing.T){ +func TestHandleSuccessFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -123,21 +123,21 @@ func TestHandleSuccessFlow(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() config.BigRedButtonTimeoutSec = 1 - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown nbIdentityList := createIdentityList() readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,} - nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,} + nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil) - updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil) @@ -145,26 +145,26 @@ func TestHandleSuccessFlow(t *testing.T){ readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} - nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil) readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil) - updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} + updatedNb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil) - mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction) + mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize, "RanName", &tests.DummyPayload, &tests.DummyXAction) rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil) - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) assert.Nil(t, actual) } -func TestHandleSuccessGetNextStatusFlow(t *testing.T){ +func TestHandleSuccessGetNextStatusFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -178,7 +178,7 @@ func TestHandleSuccessGetNextStatusFlow(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() config.BigRedButtonTimeoutSec = 1 - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) @@ -186,7 +186,7 @@ func TestHandleSuccessGetNextStatusFlow(t *testing.T){ nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED,} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) - updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil) //after timer: ShutDown->Ignore, ShuttingDown->ShutDown @@ -195,18 +195,18 @@ func TestHandleSuccessGetNextStatusFlow(t *testing.T){ nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil) - updatedNb1AfterTimer := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} + updatedNb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1AfterTimer).Return(nil) - mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction) + mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize, "RanName", &tests.DummyPayload, &tests.DummyXAction) rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil) - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) assert.Nil(t, actual) } -func TestHandleShuttingDownStatusFlow(t *testing.T){ +func TestHandleShuttingDownStatusFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -220,7 +220,7 @@ func TestHandleShuttingDownStatusFlow(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() config.BigRedButtonTimeoutSec = 1 - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) @@ -234,18 +234,18 @@ func TestHandleShuttingDownStatusFlow(t *testing.T){ nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil) - updatedNb1AfterTimer := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} + updatedNb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1AfterTimer).Return(nil) - mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction) + mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize, "RanName", &tests.DummyPayload, &tests.DummyXAction) rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil) - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) assert.Nil(t, actual) } -func TestHandleGetNodebFailedFlow(t *testing.T){ +func TestHandleGetNodebFailedFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -259,7 +259,7 @@ func TestHandleGetNodebFailedFlow(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() config.BigRedButtonTimeoutSec = 1 - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) //Before timer: Disconnected->ShutDown(will fail), ShuttingDown->Ignore, Connected->ShuttingDown nbIdentityList := createIdentityList() @@ -267,14 +267,14 @@ func TestHandleGetNodebFailedFlow(t *testing.T){ errRnib := &common.ResourceNotFoundError{} nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,} - nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,} + nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,} readerMock.On("GetNodeb", "RanName_1").Return(nb1, errRnib) readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil) - updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(errRnib) writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil) @@ -282,26 +282,26 @@ func TestHandleGetNodebFailedFlow(t *testing.T){ readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} - nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, errRnib) readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil) - updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} + updatedNb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil) - mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction) + mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize, "RanName", &tests.DummyPayload, &tests.DummyXAction) rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil) - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) assert.Nil(t, actual) } -func TestHandleSaveFailedFlow(t *testing.T){ +func TestHandleSaveFailedFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -315,22 +315,22 @@ func TestHandleSaveFailedFlow(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() config.BigRedButtonTimeoutSec = 1 - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail) nbIdentityList := createIdentityList() readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,} - nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,} + nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil) errRnib := &common.ResourceNotFoundError{} - updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(errRnib) @@ -338,26 +338,26 @@ func TestHandleSaveFailedFlow(t *testing.T){ readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} - nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil) readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil) - updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} + updatedNb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(errRnib) - mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction) + mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize, "RanName", &tests.DummyPayload, &tests.DummyXAction) rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, nil) - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) assert.Nil(t, actual) } -func TestHandleSendRmrFailedFlow(t *testing.T){ +func TestHandleSendRmrFailedFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -371,21 +371,21 @@ func TestHandleSendRmrFailedFlow(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() config.BigRedButtonTimeoutSec = 1 - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) //Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail) nbIdentityList := createIdentityList() readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,} - nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_CONNECTED,} + nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_CONNECTED,} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3, nil) - updatedNb1 := &entities.NodebInfo{RanName:"RanName_1", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3 := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb1).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3).Return(nil) @@ -393,29 +393,29 @@ func TestHandleSendRmrFailedFlow(t *testing.T){ readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) nb1AfterTimer := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} - nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} + nb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + nb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} readerMock.On("GetNodeb", "RanName_1").Return(nb1AfterTimer, nil) readerMock.On("GetNodeb", "RanName_2").Return(nb2AfterTimer, nil) readerMock.On("GetNodeb", "RanName_3").Return(nb3AfterTimer, nil) - updatedNb2AfterTimer := &entities.NodebInfo{RanName:"RanName_2", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - updatedNb3AfterTimer := &entities.NodebInfo{RanName:"RanName_3", ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} + updatedNb2AfterTimer := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} + updatedNb3AfterTimer := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} writerMock.On("SaveNodeb", mock.Anything, updatedNb2AfterTimer).Return(nil) writerMock.On("SaveNodeb", mock.Anything, updatedNb3AfterTimer).Return(nil) expected := e2managererrors.NewRmrError() - mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize,"RanName" , &tests.DummyPayload, &tests.DummyXAction) + mbuf := rmrCgo.NewMBuf(tests.MessageType, tests.MaxMsgSize, "RanName", &tests.DummyPayload, &tests.DummyXAction) rmrMessengerMock.On("SendMsg", mock.AnythingOfType(fmt.Sprintf("%T", mbuf)), tests.MaxMsgSize).Return(mbuf, expected) - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) - if reflect.TypeOf(actual) != reflect.TypeOf(expected){ + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) } } -func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){ +func TestHandleGetListEnbIdsEmptyFlow(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -429,14 +429,14 @@ func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() - handler := NewDeleteAllRequestHandler(getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) + handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider) var rnibError error nbIdentityList := []*entities.NbIdentity{} readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError) - actual := handler.Handle(log, nil) + actual := handler.Handle(nil) readerMock.AssertNumberOfCalls(t, "GetNodeb", 0) assert.Nil(t, actual) } @@ -462,10 +462,9 @@ func initLog(t *testing.T) *logger.Logger { return log } - func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *services.RmrService { rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock) messageChannel := make(chan *models.NotificationResponse) rmrMessengerMock.On("Init", tests.GetPort(), tests.MaxMsgSize, tests.Flags, log).Return(&rmrMessenger) - return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, make(sessions.E2Sessions), messageChannel) -} \ No newline at end of file + return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, make(sessions.E2Sessions), messageChannel) +} diff --git a/E2Manager/handlers/httpmsghandlers/endc_setup_request_handler.go b/E2Manager/handlers/httpmsghandlers/endc_setup_request_handler.go deleted file mode 100644 index 8f3658b..0000000 --- a/E2Manager/handlers/httpmsghandlers/endc_setup_request_handler.go +++ /dev/null @@ -1,74 +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 httpmsghandlers - -import ( - "e2mgr/e2pdus" - "e2mgr/logger" - "e2mgr/rNibWriter" - "e2mgr/rnibBuilders" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "sync" - "time" - - "e2mgr/models" - "e2mgr/rmrCgo" - "e2mgr/sessions" -) - -type EndcSetupRequestHandler struct { - rnibWriterProvider func() rNibWriter.RNibWriter -} - -func NewEndcSetupRequestHandler(rnibWriterProvider func() rNibWriter.RNibWriter) *EndcSetupRequestHandler { - return &EndcSetupRequestHandler{ - rnibWriterProvider: rnibWriterProvider, - } -} - -func (handler EndcSetupRequestHandler) PreHandle(logger *logger.Logger, details *models.RequestDetails) error { - nodebInfo, nodebIdentity := rnibBuilders.CreateInitialNodeInfo(details,entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) - - rNibErr := handler.rnibWriterProvider().SaveNodeb(nodebIdentity, nodebInfo) - if rNibErr != nil { - logger.Errorf("#endc_setup_request_handler.PreHandle - failed to initial nodeb entity for ran name: %v in RNIB. Error: %s", details.RanName, rNibErr.Error()) - } else { - logger.Infof("#endc_setup_request_handler.PreHandle - initial nodeb entity for ran name: %v was saved to RNIB ", details.RanName) - } - - return rNibErr -} - -func (EndcSetupRequestHandler) CreateMessage(logger *logger.Logger, requestDetails *models.RequestDetails, messageChannel chan *models.E2RequestMessage, e2sessions sessions.E2Sessions, startTime time.Time, wg sync.WaitGroup) { - - wg.Add(1) - - transactionId := requestDetails.RanName - e2sessions[transactionId] = sessions.E2SessionDetails{SessionStart: startTime, Request: requestDetails} - setupRequestMessage := models.NewE2RequestMessage(transactionId, requestDetails.RanIp, requestDetails.RanPort, requestDetails.RanName, e2pdus.PackedEndcX2setupRequest) - - logger.Debugf("#endc_setup_request_handler.CreateMessage - PDU: %s", e2pdus.PackedEndcX2setupRequestAsString) - logger.Debugf("#endc_setup_request_handler.CreateMessage - setupRequestMessage was created successfuly. setup request details(transactionId = [%s]): %+v", transactionId, setupRequestMessage) - messageChannel <- setupRequestMessage - - wg.Done() -} - -func (EndcSetupRequestHandler) GetMessageType() int { - return rmrCgo.RIC_ENDC_X2_SETUP_REQ -} diff --git a/E2Manager/handlers/httpmsghandlers/endc_setup_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/endc_setup_request_handler_test.go deleted file mode 100644 index 2a55532..0000000 --- a/E2Manager/handlers/httpmsghandlers/endc_setup_request_handler_test.go +++ /dev/null @@ -1,59 +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 httpmsghandlers - -import ( - "e2mgr/logger" - "e2mgr/mocks" - "e2mgr/models" - "e2mgr/rNibWriter" - "e2mgr/sessions" - "github.com/stretchr/testify/assert" - "sync" - "testing" - "time" -) - -func TestNewEndcSetupRequestHandler(t *testing.T) { - - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - h := NewEndcSetupRequestHandler(rnibWriterProvider) - assert.NotNil(t, h) -} - -func TestCreateEndcX2SetupMessageSuccess(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("#setup_request_handler_test.TestCreateMessageSuccess - failed to initialize logger, error: %s", err) - } - messageChannel := make(chan *models.E2RequestMessage) - assert.NotPanics(t, func() { createEndcX2SetupMsg(log, messageChannel) }) - assert.NotEmpty(t, <-messageChannel) -} - -func createEndcX2SetupMsg(log *logger.Logger, messageChannel chan *models.E2RequestMessage) { - h := EndcSetupRequestHandler{} - E2Sessions := make(sessions.E2Sessions) - var wg sync.WaitGroup - var rd models.RequestDetails - go h.CreateMessage(log, &rd, messageChannel, E2Sessions, time.Now(), wg) - wg.Wait() -} diff --git a/E2Manager/handlers/httpmsghandlers/handler.go b/E2Manager/handlers/httpmsghandlers/handler.go deleted file mode 100644 index 474f20a..0000000 --- a/E2Manager/handlers/httpmsghandlers/handler.go +++ /dev/null @@ -1,32 +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 httpmsghandlers - -import ( - "e2mgr/logger" - "e2mgr/models" - "e2mgr/sessions" - "sync" - "time" -) - -type Handler interface { - PreHandle(logger *logger.Logger, details *models.RequestDetails) error - CreateMessage(logger *logger.Logger, details *models.RequestDetails, messageChannel chan *models.E2RequestMessage, e2sessions sessions.E2Sessions, startTime time.Time, wg sync.WaitGroup) - GetMessageType() int -} diff --git a/E2Manager/handlers/httpmsghandlers/request_handler.go b/E2Manager/handlers/httpmsghandlers/request_handler.go index c5c84ec..7bf6f1e 100644 --- a/E2Manager/handlers/httpmsghandlers/request_handler.go +++ b/E2Manager/handlers/httpmsghandlers/request_handler.go @@ -18,10 +18,9 @@ package httpmsghandlers import ( - "e2mgr/logger" "e2mgr/models" ) type RequestHandler interface { - Handle(logger *logger.Logger, request models.Request) error + Handle(request models.Request) error } diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler.go index f3cf7b6..a792a45 100644 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler.go +++ b/E2Manager/handlers/httpmsghandlers/setup_request_handler.go @@ -14,121 +14,126 @@ // See the License for the specific language governing permissions and // limitations under the License. // - package httpmsghandlers import ( - "e2mgr/e2pdus" + "e2mgr/e2managererrors" "e2mgr/logger" + "e2mgr/managers" + "e2mgr/models" "e2mgr/rNibWriter" "e2mgr/rnibBuilders" - "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" - "os" - "sync" - "time" - - "e2mgr/models" - "e2mgr/rmrCgo" - "e2mgr/sessions" + "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" ) const ( - ENV_RIC_ID = "RIC_ID" - MaxAsn1CodecAllocationBufferSize = 64 * 1024 - MaxAsn1PackedBufferSize = 4096 - MaxAsn1CodecMessageBufferSize = 4096 + X2SetupActivityName = "X2_SETUP" + EndcSetupActivityName = "ENDC_SETUP" ) - -/*The Ric Id is the combination of pLMNId and ENBId*/ -var pLMNId []byte -var eNBId []byte -var eNBIdBitqty uint -var ricFlag = []byte{0xbb, 0xbc, 0xcc} /*pLMNId [3]bytes*/ - type SetupRequestHandler struct { - rnibWriterProvider func() rNibWriter.RNibWriter + readerProvider func() reader.RNibReader + writerProvider func() rNibWriter.RNibWriter + logger *logger.Logger + ranSetupManager *managers.RanSetupManager + protocol entities.E2ApplicationProtocol } -func NewSetupRequestHandler(rnibWriterProvider func() rNibWriter.RNibWriter) *SetupRequestHandler { +func NewSetupRequestHandler(logger *logger.Logger, writerProvider func() rNibWriter.RNibWriter, readerProvider func() reader.RNibReader, + ranSetupManager *managers.RanSetupManager, protocol entities.E2ApplicationProtocol) *SetupRequestHandler { return &SetupRequestHandler{ - rnibWriterProvider: rnibWriterProvider, + logger: logger, + readerProvider: readerProvider, + writerProvider: writerProvider, + ranSetupManager: ranSetupManager, + protocol: protocol, } } -func (handler SetupRequestHandler) PreHandle(logger *logger.Logger, details *models.RequestDetails) error { - nodebInfo, nodebIdentity := rnibBuilders.CreateInitialNodeInfo(details, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) +func (handler *SetupRequestHandler) Handle(request models.Request) error { - rNibErr := handler.rnibWriterProvider().SaveNodeb(nodebIdentity, nodebInfo) - if rNibErr != nil { - logger.Errorf("#setup_request_handler.PreHandle - failed to save initial nodeb entity for ran name: %v in RNIB. Error: %s", details.RanName, rNibErr.Error()) - } else { - logger.Infof("#setup_request_handler.PreHandle - initial nodeb entity for ran name: %v was saved to RNIB ", details.RanName) + setupRequest := request.(models.SetupRequest) + + err := handler.validateRequestDetails(setupRequest) + if err != nil { + return err } - return rNibErr -} + nodebInfo, err := handler.readerProvider().GetNodeb(setupRequest.RanName) + if err != nil { + _, ok := err.(*common.ResourceNotFoundError) + if !ok { + handler.logger.Errorf("#SetupRequestHandler.Handle - failed to get nodeB entity for ran name: %v from RNIB. Error: %s", + setupRequest.RanName, err.Error()) + return e2managererrors.NewRnibDbError() + } + + result := handler.connectNewRan(&setupRequest, handler.protocol) + return result + } -func (SetupRequestHandler) CreateMessage(logger *logger.Logger, requestDetails *models.RequestDetails, messageChannel chan *models.E2RequestMessage, e2sessions sessions.E2Sessions, startTime time.Time, wg sync.WaitGroup) { + result := handler.connectExistingRan(nodebInfo) + return result +} - wg.Add(1) +func (handler *SetupRequestHandler) connectExistingRan(nodebInfo *entities.NodebInfo) error { - transactionId := requestDetails.RanName - e2sessions[transactionId] = sessions.E2SessionDetails{SessionStart: startTime, Request: requestDetails} - setupRequestMessage := models.NewE2RequestMessage(transactionId, requestDetails.RanIp, requestDetails.RanPort, requestDetails.RanName, e2pdus.PackedX2setupRequest) + if nodebInfo.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN { + handler.logger.Errorf("#SetupRequestHandler.connectExistingRan - RAN: %s in wrong state (%s)", nodebInfo.RanName, entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)]) + return e2managererrors.NewWrongStateError(handler.getActivityName(handler.protocol), entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)]) + } - logger.Debugf("#setup_request_handler.CreateMessage - PDU: %s", e2pdus.PackedX2setupRequestAsString) - logger.Debugf("#setup_request_handler.CreateMessage - setupRequestMessage was created successfully. setup request details(transactionId = [%s]): %+v", transactionId, setupRequestMessage) - messageChannel <- setupRequestMessage + status := entities.ConnectionStatus_CONNECTING + if nodebInfo.ConnectionStatus == entities.ConnectionStatus_CONNECTED{ + status = nodebInfo.ConnectionStatus + } + nodebInfo.ConnectionAttempts = 0 - wg.Done() + result := handler.ranSetupManager.ExecuteSetup(nodebInfo, status) + return result } -//Expected value in RIC_ID = pLMN_Identity-eNB_ID/ -//<6 hex digits>-<6 or 8 hex digits>/<18|20|21|28> -//Each byte is represented by two hex digits, the value in the lowest byte of the eNB_ID must be assigned to the lowest bits -//For example, to get the value of ffffeab/28 the last byte must be 0x0b, not 0xb0 (-ffffea0b/28). -func parseRicID(ricId string) error { - if _, err := fmt.Sscanf(ricId, "%6x-%8x/%2d", &pLMNId, &eNBId, &eNBIdBitqty); err != nil { - return fmt.Errorf("unable to extract the value of %s: %s", ENV_RIC_ID, err) - } - - if len(pLMNId) < 3 { - return fmt.Errorf("invalid value for %s, len(pLMNId:%v) != 3", ENV_RIC_ID, pLMNId) - } +func (handler *SetupRequestHandler) connectNewRan(request *models.SetupRequest, protocol entities.E2ApplicationProtocol) error { - if len(eNBId) < 3 { - return fmt.Errorf("invalid value for %s, len(eNBId:%v) != 3 or 4", ENV_RIC_ID, eNBId) - } + nodebInfo, nodebIdentity := rnibBuilders.CreateInitialNodeInfo(request, protocol) - if eNBIdBitqty != e2pdus.ShortMacro_eNB_ID && eNBIdBitqty != e2pdus.Macro_eNB_ID && eNBIdBitqty != e2pdus.LongMacro_eNB_ID && eNBIdBitqty != e2pdus.Home_eNB_ID { - return fmt.Errorf("invalid value for %s, eNBIdBitqty: %d", ENV_RIC_ID, eNBIdBitqty) + rNibErr := handler.writerProvider().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() } + handler.logger.Infof("#SetupRequestHandler.connectNewRan - initial nodeb entity for ran name: %v was saved to RNIB ", request.RanName) - return nil + result := handler.ranSetupManager.ExecuteSetup(nodebInfo, entities.ConnectionStatus_CONNECTING) + return result } -//TODO: remove Get -func (SetupRequestHandler) GetMessageType() int { - return rmrCgo.RIC_X2_SETUP_REQ -} +func (handler *SetupRequestHandler) validateRequestDetails(request models.SetupRequest) error { -func init() { - var err error - ricId := os.Getenv(ENV_RIC_ID) - //ricId="bbbccc-ffff0e/20" - //ricId="bbbccc-abcd0e/20" - if err = parseRicID(ricId); err != nil { - panic(err) + if request.RanPort == 0 { + handler.logger.Errorf("#SetupRequestHandler.validateRequestDetails - validation failure: port cannot be zero") + return e2managererrors.NewRequestValidationError() } - - e2pdus.PackedEndcX2setupRequest,e2pdus.PackedEndcX2setupRequestAsString, err = e2pdus.PreparePackedEndcX2SetupRequest(MaxAsn1PackedBufferSize, MaxAsn1CodecMessageBufferSize,pLMNId, eNBId, eNBIdBitqty, ricFlag ) - if err != nil{ - panic(err) + err := validation.ValidateStruct(&request, + validation.Field(&request.RanIp, validation.Required, is.IP), + validation.Field(&request.RanName, validation.Required), + ) + + if err != nil { + handler.logger.Errorf("#SetupRequestHandler.validateRequestDetails - validation failure, error: %v", err) + return e2managererrors.NewRequestValidationError() } - e2pdus.PackedX2setupRequest,e2pdus.PackedX2setupRequestAsString, err = e2pdus.PreparePackedX2SetupRequest(MaxAsn1PackedBufferSize, MaxAsn1CodecMessageBufferSize,pLMNId, eNBId, eNBIdBitqty, ricFlag ) - if err != nil{ - panic(err) + + return nil +} + +func (handler *SetupRequestHandler) getActivityName(protocol entities.E2ApplicationProtocol) string { + if protocol == entities.E2ApplicationProtocol_X2_SETUP_REQUEST { + return X2SetupActivityName } + return EndcSetupActivityName } diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go index dddda35..8783389 100644 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go @@ -14,154 +14,290 @@ // See the License for the specific language governing permissions and // limitations under the License. // - package httpmsghandlers import ( - "bytes" + "e2mgr/e2managererrors" "e2mgr/e2pdus" - "e2mgr/logger" + "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" "e2mgr/rNibWriter" - "e2mgr/sessions" - "fmt" + "e2mgr/rmrCgo" + "e2mgr/rnibBuilders" + "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" - "strings" - "sync" + "github.com/stretchr/testify/mock" + "reflect" "testing" - "time" ) -func TestNewSetupRequestHandler(t *testing.T) { +func TestSetupHandleNewRanSave_Error(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) + + ranName := "RanName" + rnibErr := &common.ResourceNotFoundError{} + sr := models.SetupRequest{"127.0.0.1", 8080, ranName,} + + nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} + readerMock.On("GetNodeb", ranName).Return(nb, rnibErr) + + vErr := &common.ValidationError{} + updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(vErr) + + var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1} + writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil) + + payload := e2pdus.PackedEndcX2setupRequest + xaction := []byte(ranName) + msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) + + actual := handler.Handle(sr) + expected := &e2managererrors.RnibDbError{} + + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) } - h := NewSetupRequestHandler(rnibWriterProvider) - assert.NotNil(t, h) + writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1) + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) } -func TestCreateMessageSuccess(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("#setup_request_handler_test.TestCreateMessageSuccess - failed to initialize logger, error: %s", err) +func TestSetupHandleNewRan_Success(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) + + ranName := "RanName" + rnibErr := &common.ResourceNotFoundError{} + sr := models.SetupRequest{"127.0.0.1", 8080, ranName,} + + nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} + readerMock.On("GetNodeb", ranName).Return(nb, rnibErr) + + updatedNb, _ := rnibBuilders.CreateInitialNodeInfo(&sr, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) + writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(nil) + + var nbUpdated = &entities.NodebInfo{RanName: ranName, Ip: sr.RanIp, Port: uint32(sr.RanPort), ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1} + writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil) + + payload := e2pdus.PackedEndcX2setupRequest + xaction := []byte(ranName) + msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) + + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) + + actual := handler.Handle(sr) + + assert.Nil(t, actual) + + writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1) + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) +} + +func TestEndcSetupHandleRmr_Error(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) + + ranName := "RanName" + nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} + readerMock.On("GetNodeb", ranName).Return(nb, nil) + + var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1} + writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil) + + var nbDisconnected = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 0} + writerMock.On("UpdateNodebInfo", nbDisconnected).Return(nil) + + payload := e2pdus.PackedEndcX2setupRequest + xaction := []byte(ranName) + msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) + + rmrErr := &e2managererrors.RmrError{} + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, rmrErr) + + sr := models.SetupRequest{"127.0.0.1", 8080, ranName,} + actual := handler.Handle(sr) + + if reflect.TypeOf(actual) != reflect.TypeOf(rmrErr) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, rmrErr) } - messageChannel := make(chan *models.E2RequestMessage) - assert.NotPanics(t, func() { createMsg(log, messageChannel) }) - assert.NotEmpty(t, <-messageChannel) + + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) +} + +func TestEndcSetupHandleExistingDisconnectedRan_Success(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) + + ranName := "RanName" + nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST} + readerMock.On("GetNodeb", ranName).Return(nb, nil) + + var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1} + writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil) + + payload := e2pdus.PackedEndcX2setupRequest + xaction := []byte(ranName) + msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) + + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) + + sr := models.SetupRequest{"127.0.0.1", 8080, ranName,} + actual := handler.Handle(sr) + + assert.Nil(t, actual) + + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) } -func TestParseRicId(t *testing.T) { - var testCases = []struct { - ricId string - pLMNId []byte - eNBId []byte - eNBIdBitqty uint - failure error - }{ - { - ricId: "bbbccc-abcd02/18", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0x2}, /*00000010 -> 10000000*/ - eNBIdBitqty: e2pdus.ShortMacro_eNB_ID, - }, - { - ricId: "bbbccc-abcd0e/20", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0xe}, - eNBIdBitqty: e2pdus.Macro_eNB_ID, - }, - { - ricId: "bbbccc-abcd07/21", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0x7}, /*00000111 -> 00111000*/ - eNBIdBitqty: e2pdus.LongMacro_eNB_ID, - }, - { - ricId: "bbbccc-abcdef08/28", - pLMNId: []byte{0xbb, 0xbc, 0xcc}, - eNBId: []byte{0xab, 0xcd, 0xef, 0x8}, - eNBIdBitqty: e2pdus.Home_eNB_ID, - }, - { - ricId: "", - failure: fmt.Errorf("unable to extract the value of RIC_ID: EOF"), - }, - - { - ricId: "bbbccc", - failure: fmt.Errorf("unable to extract the value of RIC_ID: unexpected EOF"), - }, - { - ricId: "bbbccc-", - failure: fmt.Errorf("unable to extract the value of RIC_ID: EOF"), - }, - { - ricId: "-bbbccc", - failure: fmt.Errorf("%s", "unable to extract the value of RIC_ID: no hex data for %x string"), - }, - { - ricId: "/20", - failure: fmt.Errorf("%s", "unable to extract the value of RIC_ID: no hex data for %x string"), - }, - { - ricId: "bbbcccdd-abcdef08/28", // pLMNId too long - failure: fmt.Errorf("unable to extract the value of RIC_ID: input does not match format"), - }, - { - ricId: "bbbccc-abcdef0809/28", // eNBId too long - failure: fmt.Errorf("unable to extract the value of RIC_ID: input does not match format"), - }, - - { - ricId: "bbbc-abcdef08/28", // pLMNId too short - failure: fmt.Errorf("invalid value for RIC_ID, len(pLMNId:[187 188]) != 3"), - }, - { - ricId: "bbbccc-abcd/28", // eNBId too short - failure: fmt.Errorf("invalid value for RIC_ID, len(eNBId:[171 205]) != 3 or 4"), - }, - { - ricId: "bbbccc-abcdef08/239", // bit quantity too long - no error, will return 23 (which is invalid) - failure: fmt.Errorf("invalid value for RIC_ID, eNBIdBitqty: 23"), - }, +func TestX2SetupHandleExistingConnectedRan_Success(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + ranName := "RanName" + nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} + readerMock.On("GetNodeb", ranName).Return(nb, nil) + + var nbUpdated = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1} + writerMock.On("UpdateNodebInfo", nbUpdated).Return(nil) + + payload := e2pdus.PackedX2setupRequest + xaction := []byte(ranName) + msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction) + + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil) + + sr := models.SetupRequest{"127.0.0.1", 8080, ranName,} + actual := handler.Handle(sr) + + assert.Nil(t, actual) + + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 1) +} + +func TestX2SetupHandleRnibGet_Error(t *testing.T) { + readerMock, _, handler,rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + rnibErr := &common.ValidationError{} + nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + readerMock.On("GetNodeb", "RanName").Return(nb, rnibErr) + + sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",} + actual := handler.Handle(sr) + + expected := &e2managererrors.RnibDbError{} + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) + } + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) +} + +func TestX2SetupHandleShuttingDownRan_Error(t *testing.T) { + readerMock, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + nb := &entities.NodebInfo{RanName: "RanName", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} + readerMock.On("GetNodeb", "RanName").Return(nb, nil) + + sr := models.SetupRequest{"127.0.0.1", 8080, "RanName",} + actual := handler.Handle(sr) + + expected := &e2managererrors.WrongStateError{} + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) + } + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) +} + +func TestX2SetupHandleNoPort_Error(t *testing.T) { + _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + sr := models.SetupRequest{"127.0.0.1", 0, "RanName",} + actual := handler.Handle(sr) + + expected := &e2managererrors.RequestValidationError{} + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) + } + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) +} + +func TestX2SetupHandleNoRanName_Error(t *testing.T) { + _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + sr := models.SetupRequest{} + sr.RanPort = 8080 + sr.RanIp = "127.0.0.1" + + actual := handler.Handle(sr) + + expected := &e2managererrors.RequestValidationError{} + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) } + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) +} - for _, tc := range testCases { - t.Run(tc.ricId, func(t *testing.T) { - - err := parseRicID(tc.ricId) - if err != nil { - if tc.failure == nil { - t.Errorf("want: success, got: parse failed. Error: %v\n", err) - } else { - if strings.Compare(err.Error(), tc.failure.Error()) != 0 { - t.Errorf("want: %s, got: %s\n", err, tc.failure) - } - } - } else { - if bytes.Compare(tc.pLMNId, pLMNId) != 0 { - t.Errorf("want: pLMNId = %v, got: pLMNId = %v", tc.pLMNId, pLMNId) - } - - if bytes.Compare(tc.eNBId, eNBId) != 0 { - t.Errorf("want: eNBId = %v, got: eNBId = %v", tc.eNBId, eNBId) - } - - if tc.eNBIdBitqty != eNBIdBitqty { - t.Errorf("want: eNBIdBitqty = %d, got: eNBIdBitqty = %d", tc.eNBIdBitqty, eNBIdBitqty) - } - } - }) +func TestX2SetupHandleNoIP_Error(t *testing.T) { + _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + sr := models.SetupRequest{} + sr.RanPort = 8080 + sr.RanName = "RanName" + + actual := handler.Handle(sr) + + expected := &e2managererrors.RequestValidationError{} + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) } + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) } -func createMsg(log *logger.Logger, messageChannel chan *models.E2RequestMessage) { - h := SetupRequestHandler{} - E2Sessions := make(sessions.E2Sessions) - var wg sync.WaitGroup - var rd models.RequestDetails - go h.CreateMessage(log, &rd, messageChannel, E2Sessions, time.Now(), wg) - wg.Wait() + +func TestX2SetupHandleInvalidIp_Error(t *testing.T) { + _, writerMock, handler, rmrMessengerMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) + + sr := models.SetupRequest{} + sr.RanPort = 8080 + sr.RanName = "RanName" + sr.RanIp = "invalid ip" + + actual := handler.Handle(sr) + + expected := &e2managererrors.RequestValidationError{} + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) + } + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0) + rmrMessengerMock.AssertNumberOfCalls(t, "SendMsg", 0) } + +func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol)(*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) { + log := initLog(t) + + 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) + + ranSetupManager := managers.NewRanSetupManager(log, rmrService, writerProvider) + handler := NewSetupRequestHandler(log, writerProvider, readerProvider, 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 2455ac6..72f7ccb 100644 --- a/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go +++ b/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go @@ -18,7 +18,6 @@ package httpmsghandlers import ( - "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/e2pdus" "e2mgr/logger" @@ -34,39 +33,39 @@ import ( const ( X2_RESET_ACTIVITY_NAME = "X2_RESET" ) + type X2ResetRequestHandler struct { readerProvider func() reader.RNibReader writerProvider func() rNibWriter.RNibWriter - rmrService *services.RmrService - config *configuration.Configuration + rmrService *services.RmrService + logger *logger.Logger } - -func NewX2ResetRequestHandler(rmrService *services.RmrService, config *configuration.Configuration, writerProvider func() rNibWriter.RNibWriter, +func NewX2ResetRequestHandler(logger *logger.Logger, rmrService *services.RmrService, writerProvider func() rNibWriter.RNibWriter, readerProvider func() reader.RNibReader) *X2ResetRequestHandler { return &X2ResetRequestHandler{ readerProvider: readerProvider, writerProvider: writerProvider, - rmrService: rmrService, - config: config, + rmrService: rmrService, + logger: logger, } } -func (handler *X2ResetRequestHandler) Handle(logger *logger.Logger, request models.Request) error { +func (handler *X2ResetRequestHandler) Handle(request models.Request) error { resetRequest := request.(models.ResetRequest) if len(resetRequest.Cause) == 0 { resetRequest.Cause = e2pdus.OmInterventionCause } - payload, ok:= e2pdus.KnownCausesToX2ResetPDU(resetRequest.Cause) + payload, ok := e2pdus.KnownCausesToX2ResetPDU(resetRequest.Cause) if !ok { - logger.Errorf("#reset_request_handler.Handle - Unknown cause (%s)", resetRequest.Cause) + handler.logger.Errorf("#reset_request_handler.Handle - Unknown cause (%s)", resetRequest.Cause) return e2managererrors.NewRequestValidationError() } - nodeb, err := handler.readerProvider().GetNodeb(resetRequest.RanName) + nodeb, err := handler.readerProvider().GetNodeb(resetRequest.RanName) if err != nil { - logger.Errorf("#reset_request_handler.Handle - failed to get status of RAN: %s from RNIB. Error: %s", resetRequest.RanName, err.Error()) + 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) if ok { return e2managererrors.NewResourceNotFoundError() @@ -75,18 +74,16 @@ func (handler *X2ResetRequestHandler) Handle(logger *logger.Logger, request mode } if nodeb.ConnectionStatus != entities.ConnectionStatus_CONNECTED { - logger.Errorf("#reset_request_handler.Handle - RAN: %s in wrong state (%s)", resetRequest.RanName, entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)]) - return e2managererrors.NewWrongStateError(X2_RESET_ACTIVITY_NAME,entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)]) + handler.logger.Errorf("#reset_request_handler.Handle - RAN: %s in wrong state (%s)", resetRequest.RanName, entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)]) + return e2managererrors.NewWrongStateError(X2_RESET_ACTIVITY_NAME, entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)]) } response := models.NotificationResponse{MgsType: rmrCgo.RIC_X2_RESET, RanName: resetRequest.RanName, Payload: payload} - if err:= handler.rmrService.SendRmrMessage(&response); err != nil { - logger.Errorf("#reset_request_handler.Handle - failed to send reset message to RMR: %s", err) - return e2managererrors.NewRmrError() + if err := handler.rmrService.SendRmrMessage(&response); err != nil { + handler.logger.Errorf("#reset_request_handler.Handle - failed to send reset message to RMR: %s", err) + return e2managererrors.NewRmrError() } - logger.Infof("#reset_request_handler.Handle - sent x2 reset to RAN: %s with cause: %s", resetRequest.RanName, resetRequest.Cause) + handler.logger.Infof("#reset_request_handler.Handle - sent x2 reset to RAN: %s with cause: %s", resetRequest.RanName, resetRequest.Cause) return nil } - - diff --git a/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go index 35370c0..864e824 100644 --- a/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go @@ -1,7 +1,6 @@ package httpmsghandlers import ( - "e2mgr/configuration" "e2mgr/e2managererrors" "e2mgr/mocks" "e2mgr/models" @@ -16,8 +15,7 @@ import ( "testing" ) - -func TestHandleSuccessfulDefaultCause(t *testing.T){ +func TestHandleSuccessfulDefaultCause(t *testing.T) { log := initLog(t) ranName := "test1" @@ -31,26 +29,24 @@ func TestHandleSuccessfulDefaultCause(t *testing.T){ return writerMock } // o&m intervention - payload:= []byte {0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64} + 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) + msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xaction) rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrMessengerMock.On("SendMsg",msg,mock.Anything).Return(msg,nil) + rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) - config := configuration.ParseConfiguration() - rmrService:= getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(rmrService, config, writerProvider, readerProvider) + 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) + var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} + readerMock.On("GetNodeb", ranName).Return(nodeb, nil) - actual := handler.Handle(log, models.ResetRequest{RanName: ranName}) + actual := handler.Handle(models.ResetRequest{RanName: ranName}) assert.Nil(t, actual) - } -func TestHandleSuccessfulRequestedCause(t *testing.T){ +func TestHandleSuccessfulRequestedCause(t *testing.T) { log := initLog(t) ranName := "test1" @@ -64,25 +60,24 @@ func TestHandleSuccessfulRequestedCause(t *testing.T){ return writerMock } - payload:= []byte {0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x40} + 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) + msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_RESET, len(payload), ranName, &payload, &xaction) rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrMessengerMock.On("SendMsg",msg,mock.Anything).Return(msg,nil) + rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil) - config := configuration.ParseConfiguration() - rmrService:= getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(rmrService, config, writerProvider, readerProvider) + 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) + var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} + readerMock.On("GetNodeb", ranName).Return(nodeb, nil) - actual := handler.Handle(log, models.ResetRequest{RanName: ranName , Cause:"protocol:transfer-syntax-error"}) + actual := handler.Handle(models.ResetRequest{RanName: ranName, Cause: "protocol:transfer-syntax-error"}) assert.Nil(t, actual) } -func TestHandleFailureUnknownCause(t *testing.T){ +func TestHandleFailureUnknownCause(t *testing.T) { log := initLog(t) ranName := "test1" @@ -96,24 +91,21 @@ func TestHandleFailureUnknownCause(t *testing.T){ 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) - config := configuration.ParseConfiguration() - rmrService:= getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(rmrService, config, writerProvider, readerProvider) - - var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED } - readerMock.On("GetNodeb",ranName).Return(nodeb, nil) - - actual := handler.Handle(log, models.ResetRequest{RanName: ranName , Cause:"XXX"}) + actual := handler.Handle(models.ResetRequest{RanName: ranName, Cause: "XXX"}) assert.IsType(t, e2managererrors.NewRequestValidationError(), actual) } -func TestHandleFailureWrongState(t *testing.T){ +func TestHandleFailureWrongState(t *testing.T) { log := initLog(t) ranName := "test1" @@ -127,26 +119,20 @@ func TestHandleFailureWrongState(t *testing.T){ return writerMock } - rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrService := getRmrService(rmrMessengerMock, log) + handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - config := configuration.ParseConfiguration() - rmrService:= getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(rmrService, config, writerProvider, readerProvider) - - var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED } - readerMock.On("GetNodeb",ranName).Return(nodeb, nil) + var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED} + readerMock.On("GetNodeb", ranName).Return(nodeb, nil) - actual := handler.Handle(log, models.ResetRequest{RanName: ranName }) + actual := handler.Handle(models.ResetRequest{RanName: ranName}) assert.IsType(t, e2managererrors.NewWrongStateError(X2_RESET_ACTIVITY_NAME, entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)]), actual) - } - - -func TestHandleFailureRanNotFound(t *testing.T){ +func TestHandleFailureRanNotFound(t *testing.T) { log := initLog(t) ranName := "test1" @@ -160,24 +146,19 @@ func TestHandleFailureRanNotFound(t *testing.T){ return writerMock } - rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrService := getRmrService(rmrMessengerMock, log) + handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - config := configuration.ParseConfiguration() - rmrService:= getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(rmrService, config, writerProvider, readerProvider) - - readerMock.On("GetNodeb",ranName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("nodeb not found")) + readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("nodeb not found")) - actual := handler.Handle(log, models.ResetRequest{RanName: ranName }) + actual := handler.Handle(models.ResetRequest{RanName: ranName}) assert.IsType(t, e2managererrors.NewResourceNotFoundError(), actual) - } - -func TestHandleFailureRnibError(t *testing.T){ +func TestHandleFailureRnibError(t *testing.T) { log := initLog(t) ranName := "test1" @@ -191,24 +172,19 @@ func TestHandleFailureRnibError(t *testing.T){ return writerMock } - rmrMessengerMock := &mocks.RmrMessengerMock{} + rmrService := getRmrService(rmrMessengerMock, log) + handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider) - config := configuration.ParseConfiguration() - rmrService:= getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(rmrService, config, writerProvider, readerProvider) + readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{}, common.NewInternalError(fmt.Errorf("internal error"))) - readerMock.On("GetNodeb",ranName).Return(&entities.NodebInfo{}, common.NewInternalError(fmt.Errorf("internal error"))) - - actual := handler.Handle(log, models.ResetRequest{RanName: ranName }) + actual := handler.Handle(models.ResetRequest{RanName: ranName}) assert.IsType(t, e2managererrors.NewRnibDbError(), actual) - } - -func TestHandleFailureRmrError(t *testing.T){ +func TestHandleFailureRmrError(t *testing.T) { log := initLog(t) ranName := "test1" @@ -222,21 +198,19 @@ func TestHandleFailureRmrError(t *testing.T){ return writerMock } // o&m intervention - payload:= []byte {0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x05, 0x40, 0x01, 0x64} + 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) + 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")) + rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(&rmrCgo.MBuf{}, fmt.Errorf("rmr error")) - config := configuration.ParseConfiguration() - rmrService:= getRmrService(rmrMessengerMock, log) - handler := NewX2ResetRequestHandler(rmrService, config, writerProvider, readerProvider) + 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) + var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED} + readerMock.On("GetNodeb", ranName).Return(nodeb, nil) - actual := handler.Handle(log, models.ResetRequest{RanName: ranName }) + actual := handler.Handle(models.ResetRequest{RanName: ranName}) assert.IsType(t, e2managererrors.NewRmrError(), actual) - } 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 7948f9e..51827f4 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go @@ -21,6 +21,7 @@ import ( ) func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanReconnectionManager) { + logger := initLog(t) rmrMessengerMock := &mocks.RmrMessengerMock{} @@ -34,8 +35,8 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderM rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService) + ranSetupManager := managers.NewRanSetupManager(logger,rmrService, rnibWriterProvider) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager } diff --git a/E2Manager/main/http_server.go b/E2Manager/main/http_server.go index b2db55b..d644598 100644 --- a/E2Manager/main/http_server.go +++ b/E2Manager/main/http_server.go @@ -55,7 +55,8 @@ func main() { rmrResponseChannel := make(chan *models.NotificationResponse, config.NotificationResponseBuffer) rmrService := services.NewRmrService(rmrConfig, msgImpl, controllers.E2Sessions, rmrResponseChannel) - var ranReconnectionManager = managers.NewRanReconnectionManager(logger, config, reader.GetRNibReader, rNibWriter.GetRNibWriter, rmrService) + 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) rmrServiceReceiver := receivers.NewRmrServiceReceiver(*rmrService, nManager) @@ -64,7 +65,7 @@ func main() { go rmrService.SendResponse() controller := controllers.NewNodebController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter) - newController := controllers.NewController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter, config) + newController := controllers.NewController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter, config, ranSetupManager) runServer(config.Http.Port, controller, newController) } @@ -84,9 +85,10 @@ func initializeRoutes(router *mux.Router, controller controllers.INodebControlle r.HandleFunc("/health", controller.HandleHealthCheckRequest).Methods("GET") rr := r.PathPrefix("/nodeb").Subrouter() - rr.HandleFunc("/{messageType}", controller.HandleRequest).Methods("POST") rr.HandleFunc("/ids", controller.GetNodebIdList).Methods("GET") // nodeb/ids rr.HandleFunc("/{ranName}", controller.GetNodeb).Methods("GET") rr.HandleFunc("/shutdown", newController.ShutdownHandler).Methods("PUT") rr.HandleFunc("/{ranName}/reset", newController.X2ResetHandler).Methods("PUT") // nodeb/{ranName}/reset + rr.HandleFunc("/x2-setup", newController.X2SetupHandler).Methods("POST") + rr.HandleFunc("/endc-setup", newController.EndcSetupHandler).Methods("POST") } diff --git a/E2Manager/main/http_server_test.go b/E2Manager/main/http_server_test.go index aaac4db..760274d 100644 --- a/E2Manager/main/http_server_test.go +++ b/E2Manager/main/http_server_test.go @@ -34,29 +34,43 @@ func setupRouterAndMocks() (*mux.Router, *mocks.ControllerMock, *mocks.NodebCont controllerMock := &mocks.ControllerMock{} controllerMock.On("ShutdownHandler").Return(nil) controllerMock.On("X2ResetHandler").Return(nil) + controllerMock.On("X2SetupHandler").Return(nil) + controllerMock.On("EndcSetupHandler").Return(nil) nodebControllerMock := &mocks.NodebControllerMock{} - nodebControllerMock.On("HandleRequest").Return(nil) nodebControllerMock.On("GetNodebIdList").Return(nil) nodebControllerMock.On("GetNodeb").Return(nil) nodebControllerMock.On("HandleHealthCheckRequest").Return(nil) - router := mux.NewRouter(); + router := mux.NewRouter() initializeRoutes(router, nodebControllerMock, controllerMock) return router, controllerMock, nodebControllerMock } -func TestRoutePostNodebMessageType(t *testing.T) { - router, _, nodebControllerMock := setupRouterAndMocks() +func TestRoutePostEndcSetup(t *testing.T) { + router, controllerMock, _ := setupRouterAndMocks() + + req, err := http.NewRequest("POST", "/v1/nodeb/endc-setup", nil) + if err != nil { + t.Fatal(err) + } + rr := httptest.NewRecorder() + router.ServeHTTP(rr, req) + + controllerMock.AssertNumberOfCalls(t,"EndcSetupHandler", 1) +} + +func TestRoutePostX2Setup(t *testing.T) { + router, controllerMock, _ := setupRouterAndMocks() - req, err := http.NewRequest("POST", "/v1/nodeb/messageType", nil) + req, err := http.NewRequest("POST", "/v1/nodeb/x2-setup", nil) if err != nil { t.Fatal(err) } rr := httptest.NewRecorder() router.ServeHTTP(rr, req) - nodebControllerMock.AssertNumberOfCalls(t, "HandleRequest", 1) + controllerMock.AssertNumberOfCalls(t,"X2SetupHandler", 1) } func TestRouteGetNodebIds(t *testing.T) { diff --git a/E2Manager/managers/ran_reconnection_manager.go b/E2Manager/managers/ran_reconnection_manager.go index 70acee0..f42986c 100644 --- a/E2Manager/managers/ran_reconnection_manager.go +++ b/E2Manager/managers/ran_reconnection_manager.go @@ -21,7 +21,6 @@ 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" ) @@ -38,13 +37,14 @@ type RanReconnectionManager struct { ranSetupManager *RanSetupManager } -func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, rmrService *services.RmrService) *RanReconnectionManager { +func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader, + rnibWriterProvider func() rNibWriter.RNibWriter, ranSetupManager *RanSetupManager) *RanReconnectionManager { return &RanReconnectionManager{ logger: logger, config: config, rnibReaderProvider: rnibReaderProvider, rnibWriterProvider: rnibWriterProvider, - ranSetupManager: NewRanSetupManager(logger,rmrService,rnibWriterProvider), + ranSetupManager: ranSetupManager, } } @@ -62,8 +62,7 @@ func (m *RanReconnectionManager) ReconnectRan(inventoryName string) error { return m.setConnectionStatusOfUnconnectableRan(nodebInfo) } - - err := m.ranSetupManager.ExecuteSetup(nodebInfo) + err := m.ranSetupManager.ExecuteSetup(nodebInfo, entities.ConnectionStatus_CONNECTING) if err != nil { m.logger.Errorf("#RanReconnectionManager.ReconnectRan - RAN name: %s - Failed executing setup. Error: %v", inventoryName, err) diff --git a/E2Manager/managers/ran_reconnection_manager_test.go b/E2Manager/managers/ran_reconnection_manager_test.go index cd3dc58..95221c0 100644 --- a/E2Manager/managers/ran_reconnection_manager_test.go +++ b/E2Manager/managers/ran_reconnection_manager_test.go @@ -53,8 +53,8 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger,*mocks.RmrMessenger rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - - ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService) + ranSetupManager := NewRanSetupManager(logger,rmrService, rnibWriterProvider) + ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) return logger,rmrMessengerMock, readerMock, writerMock, ranReconnectionManager } diff --git a/E2Manager/managers/ran_setup_manager.go b/E2Manager/managers/ran_setup_manager.go index 6297467..9329411 100644 --- a/E2Manager/managers/ran_setup_manager.go +++ b/E2Manager/managers/ran_setup_manager.go @@ -44,23 +44,23 @@ func NewRanSetupManager(logger *logger.Logger, rmrService *services.RmrService, } } -// Update retries and connection status (connecting) -func (m *RanSetupManager) updateConnectionStatusConnecting(nodebInfo *entities.NodebInfo) error { - // Update retries and connection status (connecting) - nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTING +// Update retries and connection status +func (m *RanSetupManager) updateConnectionStatus(nodebInfo *entities.NodebInfo, status entities.ConnectionStatus) error { + // Update retries and connection status + nodebInfo.ConnectionStatus = status nodebInfo.ConnectionAttempts++ err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo) if err != nil { - m.logger.Errorf("#RanSetupManager.updateConnectionStatusConnecting - Ran name: %s - Failed updating RAN's connection status to CONNECTING : %s", nodebInfo.RanName, err) + m.logger.Errorf("#RanSetupManager.updateConnectionStatus - Ran name: %s - Failed updating RAN's connection status to %v : %s", nodebInfo.RanName, status.String(), err) } else { - m.logger.Infof("#RanSetupManager.updateConnectionStatusConnecting - Ran name: %s - Successfully updated rNib. RAN's current connection status: CONNECTING, RAN's current connection attempts: %d", nodebInfo.RanName, nodebInfo.ConnectionAttempts) + m.logger.Infof("#RanSetupManager.updateConnectionStatus - Ran name: %s - Successfully updated rNib. RAN's current connection status: %v, RAN's current connection attempts: %d", nodebInfo.RanName, status.String(), nodebInfo.ConnectionAttempts) } return err } // Decrement retries and connection status (disconnected) func (m *RanSetupManager) updateConnectionStatusDisconnected(nodebInfo *entities.NodebInfo) error { - // Update retries and connection status (connecting) + // Update retries and connection status nodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED nodebInfo.ConnectionAttempts-- err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo) @@ -90,14 +90,14 @@ func (m *RanSetupManager) prepareSetupRequest(nodebInfo *entities.NodebInfo) (in } // ExecuteSetup updates the connection status and number of attempts in the nodebInfo and send an endc/x2 setup request to establish a connection with the RAN -func (m *RanSetupManager) ExecuteSetup(nodebInfo *entities.NodebInfo) error { +func (m *RanSetupManager) ExecuteSetup(nodebInfo *entities.NodebInfo, status entities.ConnectionStatus) error { //Fill details for the response handler - requestDetails := models.RequestDetails{RanName: nodebInfo.RanName, RanPort: uint16(nodebInfo.Port), RanIp: nodebInfo.Ip} + requestDetails := models.SetupRequest{RanName: nodebInfo.RanName, RanPort: uint16(nodebInfo.Port), RanIp: nodebInfo.Ip} m.rmrService.E2sessions[nodebInfo.RanName] = sessions.E2SessionDetails{SessionStart: time.Now(), Request: &requestDetails} - // Update retries and connection status (connecting) - if err := m.updateConnectionStatusConnecting(nodebInfo); err != nil { + // Update retries and connection status + if err := m.updateConnectionStatus(nodebInfo, status); err != nil { delete(m.rmrService.E2sessions, nodebInfo.RanName) return e2managererrors.NewRnibDbError() } diff --git a/E2Manager/managers/ran_setup_manager_test.go b/E2Manager/managers/ran_setup_manager_test.go index f10e929..58ca166 100644 --- a/E2Manager/managers/ran_setup_manager_test.go +++ b/E2Manager/managers/ran_setup_manager_test.go @@ -55,7 +55,7 @@ func TestExecuteSetupConnectingX2Setup(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) mgr := NewRanSetupManager(log, rmrService, writerProvider) - if err := mgr.ExecuteSetup(initialNodeb); err != nil { + if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil { t.Errorf("want: success, got: error: %s", err) } @@ -86,7 +86,7 @@ func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) mgr := NewRanSetupManager(log, rmrService, writerProvider) - if err := mgr.ExecuteSetup(initialNodeb); err != nil { + if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil { t.Errorf("want: success, got: error: %s", err) } @@ -119,7 +119,7 @@ func TestExecuteSetupDisconnected(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) mgr := NewRanSetupManager(log, rmrService, writerProvider) - if err := mgr.ExecuteSetup(initialNodeb); err == nil { + if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: failure, got: success") } @@ -152,7 +152,7 @@ func TestExecuteSetupConnectingRnibError(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) mgr := NewRanSetupManager(log, rmrService, writerProvider) - if err := mgr.ExecuteSetup(initialNodeb); err == nil { + if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: failure, got: success") } else { assert.IsType(t, e2managererrors.NewRnibDbError(), err) @@ -187,7 +187,7 @@ func TestExecuteSetupDisconnectedRnibError(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) mgr := NewRanSetupManager(log, rmrService, writerProvider) - if err := mgr.ExecuteSetup(initialNodeb); err == nil { + if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: failure, got: success") } else { assert.IsType(t, e2managererrors.NewRnibDbError(), err) @@ -220,7 +220,7 @@ func TestExecuteSetupUnsupportedProtocol(t *testing.T) { rmrService := getRmrService(rmrMessengerMock, log) mgr := NewRanSetupManager(log, rmrService, writerProvider) - if err := mgr.ExecuteSetup(initialNodeb); err == nil { + if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil { t.Errorf("want: error, got: success") } diff --git a/E2Manager/mocks/controllerMock.go b/E2Manager/mocks/controllerMock.go index 390005c..5393a55 100644 --- a/E2Manager/mocks/controllerMock.go +++ b/E2Manager/mocks/controllerMock.go @@ -26,3 +26,16 @@ func (c *ControllerMock) X2ResetHandler(writer http.ResponseWriter, r *http.Requ c.Called() } +func (c *ControllerMock) X2SetupHandler(writer http.ResponseWriter, r *http.Request){ + writer.Header().Set("Content-Type", "application/json") + writer.WriteHeader(http.StatusOK) + + c.Called() +} + +func (c *ControllerMock) EndcSetupHandler(writer http.ResponseWriter, r *http.Request){ + writer.Header().Set("Content-Type", "application/json") + writer.WriteHeader(http.StatusOK) + + c.Called() +} \ No newline at end of file diff --git a/E2Manager/models/request_details.go b/E2Manager/models/setup_request.go similarity index 96% rename from E2Manager/models/request_details.go rename to E2Manager/models/setup_request.go index ae2484c..369e8a1 100644 --- a/E2Manager/models/request_details.go +++ b/E2Manager/models/setup_request.go @@ -17,7 +17,7 @@ package models -type RequestDetails struct { +type SetupRequest struct { RanIp string `json:"ranIp"` RanPort uint16 `json:"ranPort"` RanName string `json:"ranName"` diff --git a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go index 99585fc..7891d8c 100644 --- a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go @@ -22,16 +22,20 @@ import ( "e2mgr/e2managererrors" "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 const ( - ShutdownRequest IncomingRequest = "Shutdown" - ResetRequest IncomingRequest = "Reset" + ShutdownRequest IncomingRequest = "Shutdown" + ResetRequest IncomingRequest = "Reset" + X2SetupRequest IncomingRequest = "X2SetupRequest" + EndcSetupRequest IncomingRequest = "EndcSetupRequest" ) type IncomingRequestHandlerProvider struct { @@ -39,20 +43,23 @@ 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) *IncomingRequestHandlerProvider { +func NewIncomingRequestHandlerProvider(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter, + rNibReaderProvider func() reader.RNibReader, ranSetupManager *managers.RanSetupManager) *IncomingRequestHandlerProvider { return &IncomingRequestHandlerProvider{ - requestMap: initRequestHandlerMap(rmrService, config, rNibWriterProvider, rNibReaderProvider), + requestMap: initRequestHandlerMap(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider, ranSetupManager), logger: logger, } } -func initRequestHandlerMap(rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter, - rNibReaderProvider func() reader.RNibReader) map[IncomingRequest]httpmsghandlers.RequestHandler { +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 { return map[IncomingRequest]httpmsghandlers.RequestHandler{ - ShutdownRequest: httpmsghandlers.NewDeleteAllRequestHandler(rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer - ResetRequest: httpmsghandlers.NewX2ResetRequestHandler(rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer + 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 } } diff --git a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go index a6c4e49..91abb0e 100644 --- a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go @@ -22,6 +22,7 @@ import ( "e2mgr/e2managererrors" "e2mgr/handlers/httpmsghandlers" "e2mgr/logger" + "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" "e2mgr/rNibWriter" @@ -52,11 +53,8 @@ func TestNewIncomingRequestHandlerProvider(t *testing.T) { writerProvider := func() rNibWriter.RNibWriter { return &mocks.RnibWriterMock{} } - - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider) - /*if provider == nil { - t.Errorf("want: provider, got: nil") - }*/ + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) + provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider,ranSetupManager) assert.NotNil(t, provider) } @@ -72,22 +70,65 @@ func TestShutdownRequestHandler(t *testing.T) { return &mocks.RnibWriterMock{} } - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider) + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) + provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider,ranSetupManager) handler, err := provider.GetHandler(ShutdownRequest) - /*if handler == nil { - t.Errorf("failed to get x2 setup handler") - }*/ assert.NotNil(t, provider) assert.Nil(t, err) _, ok := handler.(*httpmsghandlers.DeleteAllRequestHandler) assert.True(t, ok) - /*if !ok { - t.Errorf("failed to delete all handler") - }*/ +} + +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) + + handler, err := provider.GetHandler(X2SetupRequest) + + assert.NotNil(t, provider) + assert.Nil(t, err) + + _, ok := handler.(*httpmsghandlers.SetupRequestHandler) + + assert.True(t, ok) +} + +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) + + handler, err := provider.GetHandler(EndcSetupRequest) + + assert.NotNil(t, provider) + assert.Nil(t, err) + + _, ok := handler.(*httpmsghandlers.SetupRequestHandler) + + assert.True(t, ok) } func TestGetShutdownHandlerFailure(t *testing.T) { @@ -100,7 +141,8 @@ func TestGetShutdownHandlerFailure(t *testing.T) { return &mocks.RnibWriterMock{} } - provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider) + ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter) + provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager) _, actual := provider.GetHandler("test") expected := &e2managererrors.InternalError{} diff --git a/E2Manager/providers/httpmsghandlerprovider/request_handler_provider.go b/E2Manager/providers/httpmsghandlerprovider/request_handler_provider.go deleted file mode 100644 index 6fa2807..0000000 --- a/E2Manager/providers/httpmsghandlerprovider/request_handler_provider.go +++ /dev/null @@ -1,54 +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 httpmsghandlerprovider - -import ( - "e2mgr/handlers/httpmsghandlers" - "e2mgr/logger" - "e2mgr/rNibWriter" - "errors" - "fmt" -) - -var requestMap map[string]httpmsghandlers.Handler - -type RequestHandlerProvider struct{} - -func NewRequestHandlerProvider(rnibWriterProvider func() rNibWriter.RNibWriter) *RequestHandlerProvider { - requestMap = initRequestMap(rnibWriterProvider) - return &RequestHandlerProvider{} -} - -func initRequestMap(rnibWriterProvider func() rNibWriter.RNibWriter) map[string]httpmsghandlers.Handler { - return map[string]httpmsghandlers.Handler{ - "x2-setup": httpmsghandlers.NewSetupRequestHandler(rnibWriterProvider), - "endc-setup": httpmsghandlers.NewEndcSetupRequestHandler(rnibWriterProvider), - } -} - -func (provider RequestHandlerProvider) GetHandler(logger *logger.Logger, requestType string) (httpmsghandlers.Handler, error) { - handler, ok := requestMap[requestType] - - if !ok { - errorMessage := fmt.Sprintf("#request_handler_provider.GetHandler - Cannot find handler for request type: %s", requestType) - logger.Errorf(errorMessage) - return nil, errors.New(errorMessage) - } - - return handler, nil -} diff --git a/E2Manager/providers/httpmsghandlerprovider/request_handler_provider_test.go b/E2Manager/providers/httpmsghandlerprovider/request_handler_provider_test.go deleted file mode 100644 index 8c5f133..0000000 --- a/E2Manager/providers/httpmsghandlerprovider/request_handler_provider_test.go +++ /dev/null @@ -1,123 +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 httpmsghandlerprovider - -import ( - "e2mgr/handlers/httpmsghandlers" - "e2mgr/logger" - "e2mgr/mocks" - "e2mgr/rNibWriter" - "testing" -) - -const x2SetupRequestType = "x2-setup" -const endcSetupRequestType = "endc-setup" - -/* - * Verify consturctor. - */ -func TestNewRequestHandlerProvider(t *testing.T) { - - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - provider := NewRequestHandlerProvider(rnibWriterProvider) - if provider == nil { - t.Errorf("want: provider, got: nil") - } -} - -/* - * Verify support for known providers. - */ - -func TestGetX2SetupRequestHandler(t *testing.T) { - - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("failed to initialize logger, error: %s", err) - } - - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - provider := NewRequestHandlerProvider(rnibWriterProvider) - - handler, err := provider.GetHandler(log, x2SetupRequestType) - - if handler == nil { - t.Errorf("failed to get x2 setup handler") - } - - _, ok := handler.(*httpmsghandlers.SetupRequestHandler) - - if !ok { - t.Errorf("failed to get x2 setup handler") - } -} - -func TestGetEndcSetupRequestHandler(t *testing.T) { - - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("failed to initialize logger, error: %s", err) - } - - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - provider := NewRequestHandlerProvider(rnibWriterProvider) - - handler, err := provider.GetHandler(log, endcSetupRequestType) - - if handler == nil { - t.Errorf("failed to get endc setup handler") - } - - _, ok := handler.(*httpmsghandlers.EndcSetupRequestHandler) - - if !ok { - t.Errorf("failed to get endc setup handler") - } -} - -/* - * Verify handling of a request for an unsupported request. - */ - -func TestGetHandlerFailure(t *testing.T) { - log, err := logger.InitLogger(logger.InfoLevel) - if err != nil { - t.Errorf("failed to initialize logger, error: %s", err) - } - - rnibWriterProvider := func() rNibWriter.RNibWriter { - return &mocks.RnibWriterMock{} - } - - provider := NewRequestHandlerProvider(rnibWriterProvider) - - _, err = provider.GetHandler(log, "dummy") - - if err == nil { - t.Errorf("Provider should had respond with error for dummy request type") - } -} diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go index 9238b2d..6d3c0e6 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go @@ -43,7 +43,6 @@ import ( func TestGetNotificationHandlerSuccess(t *testing.T) { logger := initLog(t) - rmrService := getRmrService(&mocks.RmrMessengerMock{}, logger) readerMock := &mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { @@ -53,8 +52,8 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService) + ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rNibWriter.GetRNibWriter) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) var testCases = []struct { msgType int @@ -95,7 +94,6 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { func TestGetNotificationHandlerFailure(t *testing.T) { logger := initLog(t) - rmrService := getRmrService(&mocks.RmrMessengerMock{}, logger) var testCases = []struct { msgType int @@ -113,7 +111,8 @@ func TestGetNotificationHandlerFailure(t *testing.T) { return writerMock } - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService) + ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rNibWriter.GetRNibWriter) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) { diff --git a/E2Manager/rnibBuilders/node_info_builder.go b/E2Manager/rnibBuilders/node_info_builder.go index 3595d79..0af804f 100644 --- a/E2Manager/rnibBuilders/node_info_builder.go +++ b/E2Manager/rnibBuilders/node_info_builder.go @@ -22,15 +22,16 @@ import ( "e2mgr/models" ) -func CreateInitialNodeInfo(requestDetails *models.RequestDetails, protocol entities.E2ApplicationProtocol) (*entities.NodebInfo, *entities.NbIdentity) { +func CreateInitialNodeInfo(requestDetails *models.SetupRequest, protocol entities.E2ApplicationProtocol) (*entities.NodebInfo, *entities.NbIdentity) { nodebInfo := &entities.NodebInfo{} nodebInfo.Ip = requestDetails.RanIp nodebInfo.Port = uint32(requestDetails.RanPort) nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTING nodebInfo.E2ApplicationProtocol = protocol nodebInfo.RanName = requestDetails.RanName + nodebInfo.ConnectionAttempts = 0 nodebIdentity := &entities.NbIdentity{} nodebIdentity.InventoryName = requestDetails.RanName return nodebInfo, nodebIdentity -} +} \ No newline at end of file diff --git a/E2Manager/rnibBuilders/node_info_builder_test.go b/E2Manager/rnibBuilders/node_info_builder_test.go index e95f12d..fc55935 100644 --- a/E2Manager/rnibBuilders/node_info_builder_test.go +++ b/E2Manager/rnibBuilders/node_info_builder_test.go @@ -29,7 +29,7 @@ const ranIP = "ip" const ranPort = uint16(30000) func TestCreateInitialNodeInfo(t *testing.T) { - requestDetails := &models.RequestDetails{ + requestDetails := &models.SetupRequest{ RanName: ranName, RanPort:ranPort, RanIp:ranIP, diff --git a/E2Manager/services/receivers/rmr_service_receiver_test.go b/E2Manager/services/receivers/rmr_service_receiver_test.go index ca51cf7..715a337 100644 --- a/E2Manager/services/receivers/rmr_service_receiver_test.go +++ b/E2Manager/services/receivers/rmr_service_receiver_test.go @@ -69,8 +69,8 @@ func getRmrServiceReceiver(rmrMessengerMock *mocks.RmrMessengerMock, logger *log } rmrService := getRmrService(rmrMessengerMock, logger) - - ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, rmrService) + ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rNibWriter.GetRNibWriter) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) nManager := notificationmanager.NewNotificationManager(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) return NewRmrServiceReceiver(*rmrService, nManager) diff --git a/E2Manager/sessions/e2session.go b/E2Manager/sessions/e2session.go index 99a458d..48563c6 100644 --- a/E2Manager/sessions/e2session.go +++ b/E2Manager/sessions/e2session.go @@ -27,7 +27,7 @@ import "e2mgr/models" */ type E2SessionDetails struct { SessionStart time.Time - Request *models.RequestDetails + Request *models.SetupRequest } /*