[RICPLT-2048] X2 ENDC Setup request refactoring 24/924/1
authoririna <ib565x@intl.att.com>
Tue, 10 Sep 2019 09:40:37 +0000 (12:40 +0300)
committeririna <ib565x@intl.att.com>
Tue, 10 Sep 2019 09:47:17 +0000 (12:47 +0300)
Change-Id: Iecf370b10b4604025e9112e545dc0a6a875de885
Signed-off-by: irina <ib565x@intl.att.com>
37 files changed:
E2Manager/controllers/controller.go
E2Manager/controllers/controller_test.go
E2Manager/controllers/nodeb_controller.go
E2Manager/controllers/nodeb_controller_test.go
E2Manager/e2pdus/endc_x2_setup_request_test.go
E2Manager/e2pdus/x2_reset_known_causes.go
E2Manager/e2pdus/x2_setup_request_test.go
E2Manager/e2pdus/x2_setup_requests.go
E2Manager/e2pdus/x2_setup_requests_test.go [new file with mode: 0644]
E2Manager/handlers/httpmsghandlers/delete_all_request_handler.go
E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go
E2Manager/handlers/httpmsghandlers/endc_setup_request_handler.go [deleted file]
E2Manager/handlers/httpmsghandlers/endc_setup_request_handler_test.go [deleted file]
E2Manager/handlers/httpmsghandlers/handler.go [deleted file]
E2Manager/handlers/httpmsghandlers/request_handler.go
E2Manager/handlers/httpmsghandlers/setup_request_handler.go
E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go
E2Manager/handlers/httpmsghandlers/x2_reset_request_handler.go
E2Manager/handlers/httpmsghandlers/x2_reset_request_handler_test.go
E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go
E2Manager/main/http_server.go
E2Manager/main/http_server_test.go
E2Manager/managers/ran_reconnection_manager.go
E2Manager/managers/ran_reconnection_manager_test.go
E2Manager/managers/ran_setup_manager.go
E2Manager/managers/ran_setup_manager_test.go
E2Manager/mocks/controllerMock.go
E2Manager/models/setup_request.go [moved from E2Manager/models/request_details.go with 96% similarity]
E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go
E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go
E2Manager/providers/httpmsghandlerprovider/request_handler_provider.go [deleted file]
E2Manager/providers/httpmsghandlerprovider/request_handler_provider_test.go [deleted file]
E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go
E2Manager/rnibBuilders/node_info_builder.go
E2Manager/rnibBuilders/node_info_builder_test.go
E2Manager/services/receivers/rmr_service_receiver_test.go
E2Manager/sessions/e2session.go

index 6c86816..0cd8293 100644 (file)
@@ -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)
+}
index 69dbfda..9a31d53 100644 (file)
@@ -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)
index 802537d..fdfebe0 100644 (file)
@@ -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)
index 26f92c5..8334968 100644 (file)
@@ -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)
index 776b9ae..57ed550 100644 (file)
@@ -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)
index 9140f3d..de130bc 100644 (file)
@@ -27,7 +27,6 @@ import (
        "unsafe"
 )
 
-//TODO: replace the constant in setup_request_handler.go
 const (
        MaxAsn1PackedBufferSize       = 4096
        MaxAsn1CodecMessageBufferSize = 4096
index 42fcff8..8cf7da0 100644 (file)
@@ -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)
index 938506b..b22e59d 100644 (file)
@@ -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/<eNB_ID size in bits>
+//<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 (file)
index 0000000..fd66480
--- /dev/null
@@ -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
index 6e70deb..c25235c 100644 (file)
@@ -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
 }
index aae7322..ffd428e 100644 (file)
@@ -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 (file)
index 8f3658b..0000000
+++ /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 (file)
index 2a55532..0000000
+++ /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 (file)
index 474f20a..0000000
+++ /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
-}
index c5c84ec..7bf6f1e 100644 (file)
 package httpmsghandlers
 
 import (
-       "e2mgr/logger"
        "e2mgr/models"
 )
 
 type RequestHandler interface {
-       Handle(logger *logger.Logger, request models.Request) error
+       Handle(request models.Request) error
 }
index f3cf7b6..a792a45 100644 (file)
 // 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/<eNB_ID size in bits>
-//<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
 }
index dddda35..8783389 100644 (file)
 // 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
index 2455ac6..72f7ccb 100644 (file)
@@ -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
 }
-
-
index 35370c0..864e824 100644 (file)
@@ -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)
-
 }
index 7948f9e..51827f4 100644 (file)
@@ -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
 }
 
index b2db55b..d644598 100644 (file)
@@ -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")
 }
index aaac4db..760274d 100644 (file)
@@ -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) {
index 70acee0..f42986c 100644 (file)
@@ -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)
index cd3dc58..95221c0 100644 (file)
@@ -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
 }
 
index 6297467..9329411 100644 (file)
@@ -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()
        }
index f10e929..58ca166 100644 (file)
@@ -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")
        }
 
index 390005c..5393a55 100644 (file)
@@ -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
similarity index 96%
rename from E2Manager/models/request_details.go
rename to E2Manager/models/setup_request.go
index ae2484c..369e8a1 100644 (file)
@@ -17,7 +17,7 @@
 
 package models
 
-type RequestDetails struct {
+type SetupRequest struct {
        RanIp   string `json:"ranIp"`
        RanPort uint16 `json:"ranPort"`
        RanName string `json:"ranName"`
index 99585fc..7891d8c 100644 (file)
@@ -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
        }
 }
 
index a6c4e49..91abb0e 100644 (file)
@@ -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 (file)
index 6fa2807..0000000
+++ /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 (file)
index 8c5f133..0000000
+++ /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")
-       }
-}
index 9238b2d..6d3c0e6 100644 (file)
@@ -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) {
index 3595d79..0af804f 100644 (file)
@@ -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
index e95f12d..fc55935 100644 (file)
@@ -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,
index ca51cf7..715a337 100644 (file)
@@ -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)
index 99a458d..48563c6 100644 (file)
@@ -27,7 +27,7 @@ import "e2mgr/models"
  */
 type E2SessionDetails struct {
        SessionStart time.Time
-       Request *models.RequestDetails
+       Request *models.SetupRequest
 }
 
 /*