From: rh362j Date: Sun, 25 Aug 2019 09:56:55 +0000 (+0300) Subject: [RICPLT-1703] - Reset Request - after acceptance X-Git-Tag: 2.0.10~35 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=549944ecfb9e75ed4a03dd6d10e4160b89f26ca8;p=ric-plt%2Fe2mgr.git [RICPLT-1703] - Reset Request - after acceptance Change-Id: I3af442803a7b33c0d981bf5dc973c6d5894b4cf8 Signed-off-by: rh362j --- diff --git a/E2Manager/controllers/controller.go b/E2Manager/controllers/controller.go index 7682721..6d638c4 100644 --- a/E2Manager/controllers/controller.go +++ b/E2Manager/controllers/controller.go @@ -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} diff --git a/E2Manager/controllers/controller_test.go b/E2Manager/controllers/controller_test.go index 4d0774e..420badd 100644 --- a/E2Manager/controllers/controller_test.go +++ b/E2Manager/controllers/controller_test.go @@ -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 index 0000000..17a3564 --- /dev/null +++ b/E2Manager/e2managererrors/invalid_json_error.go @@ -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 +} + diff --git a/E2Manager/e2managererrors/wrong_state_error.go b/E2Manager/e2managererrors/wrong_state_error.go index 4c53b2e..ea984ed 100644 --- a/E2Manager/e2managererrors/wrong_state_error.go +++ b/E2Manager/e2managererrors/wrong_state_error.go @@ -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) , }, } } diff --git a/E2Manager/handlers/x2_reset_request_handler.go b/E2Manager/handlers/x2_reset_request_handler.go index f5afbaa..eafd0cc 100644 --- a/E2Manager/handlers/x2_reset_request_handler.go +++ b/E2Manager/handlers/x2_reset_request_handler.go @@ -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() } diff --git a/E2Manager/handlers/x2_reset_request_handler_test.go b/E2Manager/handlers/x2_reset_request_handler_test.go index e59b442..7027ec4 100644 --- a/E2Manager/handlers/x2_reset_request_handler_test.go +++ b/E2Manager/handlers/x2_reset_request_handler_test.go @@ -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) } diff --git a/E2Manager/handlers/x2_reset_response_handler.go b/E2Manager/handlers/x2_reset_response_handler.go index 0fbebf3..8279577 100644 --- a/E2Manager/handlers/x2_reset_response_handler.go +++ b/E2Manager/handlers/x2_reset_response_handler.go @@ -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 +} diff --git a/E2Manager/handlers/x2_reset_response_handler_test.go b/E2Manager/handlers/x2_reset_response_handler_test.go index a99ea62..8846501 100644 --- a/E2Manager/handlers/x2_reset_response_handler_test.go +++ b/E2Manager/handlers/x2_reset_response_handler_test.go @@ -62,9 +62,7 @@ func TestX2ResetResponseSuccess(t *testing.T) { h.Handle(log,e2Sessions, ¬ificationRequest, 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, ¬ificationRequest, 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, ¬ificationRequest, messageChannel) - if _, ok := e2Sessions[string(xaction)]; ok { - t.Errorf("want: no session entry, got: session entry for: %s", string(xaction) ) - } + //TODO:Nothing to verify } diff --git a/E2Manager/models/reset_request.go b/E2Manager/models/reset_request.go index 39c40a0..cf28ef5 100644 --- a/E2Manager/models/reset_request.go +++ b/E2Manager/models/reset_request.go @@ -17,10 +17,7 @@ package models -import "time" - type ResetRequest struct { - StartTime time.Time RanName string Cause string `json:"cause"` } diff --git a/E2Manager/rmrCgo/rmrCgoApi.go b/E2Manager/rmrCgo/rmrCgoApi.go index 2de57d9..9b242c4 100644 --- a/E2Manager/rmrCgo/rmrCgoApi.go +++ b/E2Manager/rmrCgo/rmrCgoApi.go @@ -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) } diff --git a/E2Manager/services/rmr_service.go b/E2Manager/services/rmr_service.go index a0126af..dc35dfb 100644 --- a/E2Manager/services/rmr_service.go +++ b/E2Manager/services/rmr_service.go @@ -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) + } } }