X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=E2Manager%2Fcontrollers%2Fnodeb_controller.go;h=28b713e4a425cbc738f356bc95365bd43d948a79;hb=e3623cf1310f8c8d2fd9b5842102516b9be3b441;hp=c0f8541812fed2c6195f945a3e20ec19cb38337f;hpb=1e5e5aeb99166f1b84b249ad7debd8a972a310bb;p=ric-plt%2Fe2mgr.git diff --git a/E2Manager/controllers/nodeb_controller.go b/E2Manager/controllers/nodeb_controller.go index c0f8541..28b713e 100644 --- a/E2Manager/controllers/nodeb_controller.go +++ b/E2Manager/controllers/nodeb_controller.go @@ -20,46 +20,29 @@ 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) - 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) @@ -68,88 +51,22 @@ type INodebController interface { type NodebController struct { rmrService *services.RmrService Logger *logger.Logger - rnibReaderProvider func() reader.RNibReader - rnibWriterProvider func() rNibWriter.RNibWriter + rnibDataService services.RNibDataService } -func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibReaderProvider func() reader.RNibReader, - rnibWriterProvider func() rNibWriter.RNibWriter) *NodebController { +func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibDataService services.RNibDataService) *NodebController { messageChannel = make(chan *models.E2RequestMessage) errorChannel = make(chan error) return &NodebController{ rmrService: rmrService, Logger: logger, - rnibReaderProvider: rnibReaderProvider, - rnibWriterProvider: rnibWriterProvider, - } -} - -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 + rnibDataService: rnibDataService, } - - printHandlingRequestElapsedTimeInMs(rc.Logger, startTime) } func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *http.Request) { startTime := time.Now() - rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider) - nodebIdList, rnibError := rnibReaderService.GetNodebIdList() + nodebIdList, rnibError := rc.rnibDataService.GetListNodebIds() if rnibError != nil { rc.Logger.Errorf("%v", rnibError); @@ -176,9 +93,7 @@ func (rc NodebController) GetNodeb(writer http.ResponseWriter, request *http.Req startTime := time.Now() vars := mux.Vars(request) ranName := vars["ranName"] - // WAS: respondingNode, rnibError := reader.GetRNibReader().GetNodeb(ranName) - rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider); - respondingNode, rnibError := rnibReaderService.GetNodeb(ranName) + respondingNode, rnibError := rc.rnibDataService.GetNodeb(ranName) if rnibError != nil { rc.Logger.Errorf("%v", rnibError) httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError) @@ -205,32 +120,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) @@ -250,13 +139,13 @@ func printHandlingRequestElapsedTimeInMs(logger *logger.Logger, startTime time.T float64(time.Since(startTime))/float64(time.Millisecond)) } -func rnibErrorToHttpError(rnibError common.IRNibError) (int, int, string) { - switch rnibError.GetCode() { - case common.RESOURCE_NOT_FOUND: +func rnibErrorToHttpError(rnibError error) (int, int, string) { + switch rnibError.(type) { + case *common.ResourceNotFoundError: return http.StatusNotFound, notFoundErrorCode, notFoundErrorMessage - case common.INTERNAL_ERROR: + case *common.InternalError: return http.StatusInternalServerError, internalErrorCode, internalErrorMessage - case common.VALIDATION_ERROR: + case *common.ValidationError: return http.StatusBadRequest, validationErrorCode, validationFailedMessage default: return http.StatusInternalServerError, internalErrorCode, internalErrorMessage