[RICPLT-1703] - Reset Request - after acceptance 98/798/1
authorrh362j <ronen.hasid@intl.att.com>
Sun, 25 Aug 2019 09:56:55 +0000 (12:56 +0300)
committerrh362j <ronen.hasid@intl.att.com>
Sun, 25 Aug 2019 10:33:14 +0000 (13:33 +0300)
Change-Id: I3af442803a7b33c0d981bf5dc973c6d5894b4cf8
Signed-off-by: rh362j <ronen.hasid@intl.att.com>
E2Manager/controllers/controller.go
E2Manager/controllers/controller_test.go
E2Manager/e2managererrors/invalid_json_error.go [new file with mode: 0644]
E2Manager/e2managererrors/wrong_state_error.go
E2Manager/handlers/x2_reset_request_handler.go
E2Manager/handlers/x2_reset_request_handler_test.go
E2Manager/handlers/x2_reset_response_handler.go
E2Manager/handlers/x2_reset_response_handler_test.go
E2Manager/models/reset_request.go
E2Manager/rmrCgo/rmrCgoApi.go
E2Manager/services/rmr_service.go

index 7682721..6d638c4 100644 (file)
@@ -29,7 +29,6 @@ import (
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
        "github.com/julienschmidt/httprouter"
        "net/http"
-       "time"
 )
 
 const (
@@ -56,7 +55,6 @@ func (c *Controller)ShutdownHandler(writer http.ResponseWriter, r *http.Request,
 }
 
 func (c *Controller) X2ResetHandler(writer http.ResponseWriter, r *http.Request, params httprouter.Params){
-       startTime := time.Now()
        c.logger.Infof("[Client -> E2 Manager] #controller.X2ResetHandler - request: %v", prettifyRequest(r))
        request:= models.ResetRequest{}
        ranName:= params.ByName(ParamRanName)
@@ -65,7 +63,6 @@ func (c *Controller) X2ResetHandler(writer http.ResponseWriter, r *http.Request,
                return
        }
        request.RanName = ranName
-       request.StartTime = startTime
        c.handleRequest(writer, &r.Header, providers.ResetRequest, request, false, http.StatusNoContent)
 }
 
@@ -78,7 +75,7 @@ func (c *Controller) extractJsonBody(r *http.Request, request models.Request, wr
        if err := decoder.Decode(request); err != nil {
                if err != nil {
                        c.logger.Errorf("[Client -> E2 Manager] #controller.extractJsonBody - unable to extract json body - error: %s", err)
-                       c.handleErrorResponse(e2managererrors.NewRequestValidationError(), writer)
+                       c.handleErrorResponse(e2managererrors.NewInvalidJsonError(), writer)
                        return false
                }
        }
@@ -89,8 +86,6 @@ func (c *Controller) extractJsonBody(r *http.Request, request models.Request, wr
 func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Header, requestName providers.IncomingRequest,
        request models.Request, validateHeader bool, httpStatusResponse int) {
 
-       c.logger.Infof("[Client -> E2 Manager] #controller.handleRequest - request: %v", requestName) //TODO print request if exist
-
        if validateHeader {
 
                err := c.validateRequestHeader(header)
@@ -154,6 +149,10 @@ func (c *Controller) handleErrorResponse(err error, writer http.ResponseWriter){
                        e2Error, _ := err.(*e2managererrors.RequestValidationError)
                        errorResponseDetails = models.ErrorResponse{Code: e2Error.Err.Code, Message: e2Error.Err.Message}
                        httpError = http.StatusBadRequest
+               case *e2managererrors.InvalidJsonError:
+                       e2Error, _ := err.(*e2managererrors.InvalidJsonError)
+                       errorResponseDetails = models.ErrorResponse{Code: e2Error.Err.Code, Message: e2Error.Err.Message}
+                       httpError = http.StatusBadRequest
                case *e2managererrors.RmrError:
                        e2Error, _ := err.(*e2managererrors.RmrError)
                        errorResponseDetails = models.ErrorResponse{Code: e2Error.Err.Code, Message: e2Error.Err.Message}
index 4d0774e..420badd 100644 (file)
@@ -259,10 +259,6 @@ func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T){
        controller.X2ResetHandler(writer, req, []httprouter.Param {param})
        assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
 
-       v, ok := rmrService.E2sessions[ranName]
-       assert.True(t, ok)
-
-       assert.Equal(t, v.Request.RanName, ranName)
 }
 
 func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T){
@@ -302,10 +298,6 @@ func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T){
        controller.X2ResetHandler(writer, req, []httprouter.Param {param})
        assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
 
-       v, ok := rmrService.E2sessions[ranName]
-       assert.True(t, ok)
-
-       assert.Equal(t, v.Request.RanName, ranName)
 }
 
 func TestX2ResetHandleFailureInvalidBody(t *testing.T){
@@ -374,7 +366,7 @@ func TestHandleErrorResponse(t *testing.T){
        assert.Equal(t, http.StatusUnsupportedMediaType, writer.Result().StatusCode)
 
        writer = httptest.NewRecorder()
-       controller.handleErrorResponse(e2managererrors.NewWrongStateError(""),writer)
+       controller.handleErrorResponse(e2managererrors.NewWrongStateError("",""),writer)
        assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode)
 
        writer = httptest.NewRecorder()
diff --git a/E2Manager/e2managererrors/invalid_json_error.go b/E2Manager/e2managererrors/invalid_json_error.go
new file mode 100644 (file)
index 0000000..17a3564
--- /dev/null
@@ -0,0 +1,37 @@
+//
+// 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 e2managererrors
+
+
+type InvalidJsonError struct {
+       Err BaseError
+}
+
+func NewInvalidJsonError() *InvalidJsonError {
+       return &InvalidJsonError{
+               BaseError{
+                       Code:    401,
+                       Message: "corrupted json",
+               },
+       }
+}
+
+func (e *InvalidJsonError) Error() string {
+       return e.Err.Message
+}
+
index 4c53b2e..ea984ed 100644 (file)
@@ -23,11 +23,11 @@ type WrongStateError struct {
        Err BaseError
 }
 
-func NewWrongStateError(state string) *WrongStateError {
+func NewWrongStateError(activityName string, state string) *WrongStateError {
        return &WrongStateError{
                BaseError{
                        Code:    403,
-                       Message: fmt.Sprintf("The RAN state <%s> isn’t in the appropriate state.", state) ,
+                       Message: fmt.Sprintf("Activity <%s> rejected. RAN current state <%s> does not allow its execution ", activityName, state) ,
                },
        }
 }
index f5afbaa..eafd0cc 100644 (file)
@@ -16,6 +16,7 @@
 //
 
 package handlers
+
 import (
        "e2mgr/configuration"
        "e2mgr/e2managererrors"
@@ -25,12 +26,14 @@ import (
        "e2mgr/rNibWriter"
        "e2mgr/rmrCgo"
        "e2mgr/services"
-       "e2mgr/sessions"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
 )
 
+const (
+       X2_RESET_ACTIVITIY_NAME = "X2_RESET"
+)
 type X2ResetRequestHandler struct {
        readerProvider func() reader.RNibReader
        writerProvider func() rNibWriter.RNibWriter
@@ -72,15 +75,12 @@ 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(entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)])
+               return e2managererrors.NewWrongStateError(X2_RESET_ACTIVITIY_NAME,entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)])
        }
 
-       transactionId := resetRequest.RanName
-       handler.rmrService.E2sessions[transactionId] = sessions.E2SessionDetails{SessionStart: resetRequest.StartTime, Request: &models.RequestDetails{RanName: resetRequest.RanName}}
        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)
-               delete(handler.rmrService.E2sessions, transactionId)
                return  e2managererrors.NewRmrError()
        }
 
index e59b442..7027ec4 100644 (file)
@@ -14,14 +14,12 @@ import (
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/mock"
        "testing"
-       "time"
 )
 
 
 func TestHandleSuccessfulDefaultCause(t *testing.T){
        log := initLog(t)
 
-       curTime := time.Now()
        ranName := "test1"
 
        readerMock := &mocks.RnibReaderMock{}
@@ -46,22 +44,15 @@ func TestHandleSuccessfulDefaultCause(t *testing.T){
        var nodeb = &entities.NodebInfo{ConnectionStatus:  entities.ConnectionStatus_CONNECTED }
        readerMock.On("GetNodeb",ranName).Return(nodeb, nil)
 
-       actual := handler.Handle(log, models.ResetRequest{RanName: ranName , StartTime: curTime})
+       actual := handler.Handle(log, models.ResetRequest{RanName: ranName})
 
        assert.Nil(t, actual)
 
-       v, ok := rmrService.E2sessions[ranName]
-       assert.True(t, ok)
-
-       assert.Equal(t, v.Request.RanName, ranName)
-
-       assert.Equal(t, v.SessionStart ,curTime)
 }
 
 func TestHandleSuccessfulRequestedCause(t *testing.T){
        log := initLog(t)
 
-       curTime := time.Now()
        ranName := "test1"
 
        readerMock := &mocks.RnibReaderMock{}
@@ -86,22 +77,14 @@ func TestHandleSuccessfulRequestedCause(t *testing.T){
        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", StartTime: curTime})
+       actual := handler.Handle(log, models.ResetRequest{RanName: ranName , Cause:"protocol:transfer-syntax-error"})
 
        assert.Nil(t, actual)
-
-       v, ok := rmrService.E2sessions[ranName]
-       assert.True(t, ok)
-
-       assert.Equal(t, v.Request.RanName, ranName)
-
-       assert.Equal(t, v.SessionStart ,curTime)
 }
 
 func TestHandleFailureUnknownCause(t *testing.T){
        log := initLog(t)
 
-       curTime := time.Now()
        ranName := "test1"
 
        readerMock := &mocks.RnibReaderMock{}
@@ -124,18 +107,15 @@ func TestHandleFailureUnknownCause(t *testing.T){
        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", StartTime: curTime})
+       actual := handler.Handle(log, models.ResetRequest{RanName: ranName , Cause:"XXX"})
 
        assert.IsType(t, e2managererrors.NewRequestValidationError(), actual)
 
-       _, ok := rmrService.E2sessions[ranName]
-       assert.False(t, ok)
 }
 
 func TestHandleFailureWrongState(t *testing.T){
        log := initLog(t)
 
-       curTime := time.Now()
        ranName := "test1"
 
        readerMock := &mocks.RnibReaderMock{}
@@ -158,12 +138,10 @@ func TestHandleFailureWrongState(t *testing.T){
        var nodeb = &entities.NodebInfo{ConnectionStatus:  entities.ConnectionStatus_DISCONNECTED }
        readerMock.On("GetNodeb",ranName).Return(nodeb, nil)
 
-       actual := handler.Handle(log, models.ResetRequest{RanName: ranName ,  StartTime: curTime})
+       actual := handler.Handle(log, models.ResetRequest{RanName: ranName })
 
-       assert.IsType(t, e2managererrors.NewWrongStateError(entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)]), actual)
+       assert.IsType(t, e2managererrors.NewWrongStateError(X2_RESET_ACTIVITIY_NAME, entities.ConnectionStatus_name[int32(nodeb.ConnectionStatus)]), actual)
 
-       _, ok := rmrService.E2sessions[ranName]
-       assert.False(t, ok)
 }
 
 
@@ -171,7 +149,6 @@ func TestHandleFailureWrongState(t *testing.T){
 func TestHandleFailureRanNotFound(t *testing.T){
        log := initLog(t)
 
-       curTime := time.Now()
        ranName := "test1"
 
        readerMock := &mocks.RnibReaderMock{}
@@ -193,19 +170,16 @@ func TestHandleFailureRanNotFound(t *testing.T){
 
        readerMock.On("GetNodeb",ranName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError(fmt.Errorf("nodeb not found")))
 
-       actual := handler.Handle(log, models.ResetRequest{RanName: ranName ,  StartTime: curTime})
+       actual := handler.Handle(log, models.ResetRequest{RanName: ranName })
 
        assert.IsType(t, e2managererrors.NewResourceNotFoundError(), actual)
 
-       _, ok := rmrService.E2sessions[ranName]
-       assert.False(t, ok)
 }
 
 
 func TestHandleFailureRnibError(t *testing.T){
        log := initLog(t)
 
-       curTime := time.Now()
        ranName := "test1"
 
        readerMock := &mocks.RnibReaderMock{}
@@ -227,19 +201,16 @@ func TestHandleFailureRnibError(t *testing.T){
 
        readerMock.On("GetNodeb",ranName).Return(&entities.NodebInfo{}, common.NewInternalError(fmt.Errorf("internal error")))
 
-       actual := handler.Handle(log, models.ResetRequest{RanName: ranName ,  StartTime: curTime})
+       actual := handler.Handle(log, models.ResetRequest{RanName: ranName })
 
        assert.IsType(t, e2managererrors.NewRnibDbError(), actual)
 
-       _, ok := rmrService.E2sessions[ranName]
-       assert.False(t, ok)
 }
 
 
 func TestHandleFailureRmrError(t *testing.T){
        log := initLog(t)
 
-       curTime := time.Now()
        ranName := "test1"
 
        readerMock := &mocks.RnibReaderMock{}
@@ -264,10 +235,8 @@ func TestHandleFailureRmrError(t *testing.T){
        var nodeb = &entities.NodebInfo{ConnectionStatus:  entities.ConnectionStatus_CONNECTED }
        readerMock.On("GetNodeb",ranName).Return(nodeb, nil)
 
-       actual := handler.Handle(log, models.ResetRequest{RanName: ranName , StartTime: curTime})
+       actual := handler.Handle(log, models.ResetRequest{RanName: ranName })
 
        assert.IsType(t, e2managererrors.NewRmrError(), actual)
 
-       _, ok := rmrService.E2sessions[ranName]
-       assert.False(t, ok)
 }
index 0fbebf3..8279577 100644 (file)
@@ -25,11 +25,10 @@ import (
        "e2mgr/logger"
        "e2mgr/models"
        "e2mgr/sessions"
-       "fmt"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
 )
 
-type X2ResetResponseHandler struct{
+type X2ResetResponseHandler struct {
        rnibReaderProvider func() reader.RNibReader
 }
 
@@ -41,24 +40,18 @@ func NewX2ResetResponseHandler(rnibReaderProvider func() reader.RNibReader) X2Re
 
 func (src X2ResetResponseHandler) Handle(logger *logger.Logger, e2Sessions sessions.E2Sessions,
        request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) {
-       request.TransactionId = request.RanName
 
-       logger.Debugf("#x2ResetResponseHandler.Handle - transactionId %s: received reset response. Payload: %s", request.TransactionId, request.Payload)
+       logger.Infof("#x2ResetResponseHandler.Handle - received reset response. Payload: %x", request.Payload)
 
        if nb, rNibErr := src.rnibReaderProvider().GetNodeb(request.RanName); rNibErr != nil {
-               logger.Errorf("#x2ResetResponseHandler.Handle - transactionId %s: failed to retrieve nb entity. RanName: %s. Error: %s", request.TransactionId, request.RanName, rNibErr.Error())
+               logger.Errorf("#x2ResetResponseHandler.Handle - failed to retrieve nb entity. RanName: %s. Error: %s", request.RanName, rNibErr.Error())
        } else {
-               logger.Debugf("#x2ResetResponseHandler.Handle - transactionId %s: nb entity retrieved. RanName %s, ConnectionStatus %s", request.TransactionId, nb.RanName, nb.ConnectionStatus)
+               logger.Debugf("#x2ResetResponseHandler.Handle - nb entity retrieved. RanName %s, ConnectionStatus %s", nb.RanName, nb.ConnectionStatus)
                refinedMessage, err := unpackX2apPduAndRefine(logger, MaxAsn1CodecAllocationBufferSize /*allocation buffer*/, request.Len, request.Payload, MaxAsn1CodecMessageBufferSize /*message buffer*/)
                if err != nil {
-                       logger.Errorf("#x2ResetResponseHandler.Handle - transactionId %s: failed to unpack reset response message. RanName %s, Payload: %s", request.TransactionId , request.RanName, request.Payload)
+                       logger.Errorf("#x2ResetResponseHandler.Handle - failed to unpack reset response message. RanName %s, Payload: %s", request.RanName, request.Payload)
                } else {
-                       logger.Debugf("#x2ResetResponseHandler.Handle - transactionId %s: reset response message payload unpacked. RanName %s, Message: %s", request.TransactionId , request.RanName, refinedMessage.pduPrint)
+                       logger.Debugf("#x2ResetResponseHandler.Handle - reset response message payload unpacked. RanName %s, Message: %s", request.RanName, refinedMessage.pduPrint)
                }
        }
-       e2session, ok := e2Sessions[request.TransactionId]
-       if ok {
-               printHandlingSetupResponseElapsedTimeInMs(logger, fmt.Sprintf("#x2ResetResponseHandler.Handle- Summary: Total roundtrip elapsed time for transactionId %s", request.TransactionId), e2session.SessionStart)
-               delete(e2Sessions, request.TransactionId)
-       }
-}
\ No newline at end of file
+}
index a99ea62..8846501 100644 (file)
@@ -62,9 +62,7 @@ func TestX2ResetResponseSuccess(t *testing.T) {
 
        h.Handle(log,e2Sessions, &notificationRequest, messageChannel)
 
-       if _, ok := e2Sessions[string(xaction)]; ok {
-               t.Errorf("want: no session entry, got: session entry for: %s", string(xaction) )
-       }
+       //TODO:Nothing to verify
 }
 
 func TestX2ResetResponseReaderFailure(t *testing.T) {
@@ -94,9 +92,7 @@ func TestX2ResetResponseReaderFailure(t *testing.T) {
 
        h.Handle(log,e2Sessions, &notificationRequest, messageChannel)
 
-       if _, ok := e2Sessions[string(xaction)]; ok {
-               t.Errorf("want: no session entry, got: session entry for: %s", string(xaction) )
-       }
+       //TODO:Nothing to verify
 }
 
 func TestX2ResetResponseUnpackFailure(t *testing.T) {
@@ -126,7 +122,5 @@ func TestX2ResetResponseUnpackFailure(t *testing.T) {
 
        h.Handle(log,e2Sessions, &notificationRequest, messageChannel)
 
-       if _, ok := e2Sessions[string(xaction)]; ok {
-               t.Errorf("want: no session entry, got: session entry for: %s", string(xaction) )
-       }
+       //TODO:Nothing to verify
 }
index 39c40a0..cf28ef5 100644 (file)
 
 package models
 
-import "time"
-
 type ResetRequest struct {
-       StartTime time.Time
        RanName string
        Cause   string `json:"cause"`
 }
index 2de57d9..9b242c4 100644 (file)
@@ -58,7 +58,6 @@ func (ctx *Context) SendMsg(msg *MBuf, maxMsgSize int) (*MBuf, error) {
        state := allocatedCMBuf.state
        if state != RMR_OK {
                errorMessage := fmt.Sprintf("#rmrCgoApi.SendMsg - Failed to get allocated message. state: %v - %s", state, states[int(state)])
-               ctx.Logger.Errorf(errorMessage)
                return nil, errors.New(errorMessage)
        }
 
@@ -73,7 +72,6 @@ func (ctx *Context) SendMsg(msg *MBuf, maxMsgSize int) (*MBuf, error) {
 
        if state != RMR_OK {
                errorMessage := fmt.Sprintf("#rmrCgoApi.SendMsg - Failed to send message. state: %v - %s", state, states[int(state)])
-               ctx.Logger.Errorf(errorMessage)
                return nil, errors.New(errorMessage)
        }
 
index a0126af..dc35dfb 100644 (file)
@@ -84,7 +84,6 @@ func (r *RmrService) SendRmrMessage(response *models.NotificationResponse) error
        _, err := (*r.Messenger).SendMsg(msg, r.Config.MaxMsgSize)
 
        if err != nil {
-               r.Config.Logger.Errorf("#rmr_service.SendRmrMessage - error: %#v\n", err)
                return err
        }
        return nil
@@ -101,7 +100,9 @@ func (r *RmrService) SendResponse() {
                }
 
                r.Config.Logger.Debugf("#rmr_service.SendResponse - Going to send message: %#v\n", response)
-               r.SendRmrMessage(response)
+               if err := r.SendRmrMessage(response); err != nil {
+                       r.Config.Logger.Errorf("#rmr_service.SendResponse - error: %#v\n", err)
+               }
        }
 }