From 19e72a51b5edbf108d230093fdf85b42fe5ab470 Mon Sep 17 00:00:00 2001 From: is005q Date: Mon, 26 Aug 2019 17:56:18 +0300 Subject: [PATCH] [RICPLT-1853] Add RanReconnectionManager & RanSetupManager | Refactor providers/managers packages | Add UpdateNodebInfo to RnibWriter Change-Id: Id7d6b32421caec0daad26c7d72cc88a5642f5547 Signed-off-by: is005q --- E2Manager/configuration/configuration.go | 6 +- E2Manager/controllers/controller.go | 41 +- E2Manager/controllers/controller_test.go | 74 +- E2Manager/controllers/nodeb_controller.go | 13 +- E2Manager/cp.out | 841 --------------------- E2Manager/go.mod | 6 +- E2Manager/go.sum | 6 + E2Manager/handlers/ranLostConnectionHandler.go | 53 +- .../handlers/ranLostConnectionHandler_test.go | 646 ++++++++-------- E2Manager/handlers/setup_request_handler.go | 18 - E2Manager/main/http_server.go | 15 +- .../notification_manager.go | 11 +- E2Manager/managers/ran_reconnection_manager.go | 87 +++ E2Manager/managers/ran_setup_manager.go | 28 + E2Manager/mocks/rnibWriterMock.go | 13 +- .../incoming_request_handler_provider.go | 18 +- .../incoming_request_handler_provider_test.go | 8 +- .../request_handler_provider.go | 2 +- .../request_handler_provider_test.go | 2 +- .../notification_handler_provider.go | 25 +- .../notification_handler_provider_test.go | 49 +- E2Manager/rNibWriter/rNibWriter.go | 92 ++- E2Manager/rNibWriter/rNibWriter_test.go | 202 +++-- E2Manager/resources/configuration.yaml | 1 + .../services/receivers/rmr_service_receiver.go | 6 +- .../receivers/rmr_service_receiver_test.go | 27 +- 26 files changed, 854 insertions(+), 1436 deletions(-) delete mode 100644 E2Manager/cp.out rename E2Manager/managers/{ => notificationmanager}/notification_manager.go (77%) create mode 100644 E2Manager/managers/ran_reconnection_manager.go create mode 100644 E2Manager/managers/ran_setup_manager.go rename E2Manager/providers/{ => httpmsghandlerprovider}/incoming_request_handler_provider.go (78%) rename E2Manager/providers/{ => httpmsghandlerprovider}/incoming_request_handler_provider_test.go (95%) rename E2Manager/providers/{ => httpmsghandlerprovider}/request_handler_provider.go (98%) rename E2Manager/providers/{ => httpmsghandlerprovider}/request_handler_provider_test.go (98%) rename E2Manager/providers/{ => rmrmsghandlerprovider}/notification_handler_provider.go (70%) rename E2Manager/providers/{ => rmrmsghandlerprovider}/notification_handler_provider_test.go (67%) diff --git a/E2Manager/configuration/configuration.go b/E2Manager/configuration/configuration.go index 5bca875..b0611b8 100644 --- a/E2Manager/configuration/configuration.go +++ b/E2Manager/configuration/configuration.go @@ -34,7 +34,8 @@ type Configuration struct { MaxMsgSize int } NotificationResponseBuffer int - BigRedButtonTimeoutSec int + BigRedButtonTimeoutSec int + MaxConnectionAttempts int } func ParseConfiguration() *Configuration{ @@ -43,6 +44,7 @@ func ParseConfiguration() *Configuration{ viper.AddConfigPath("E2Manager/resources/") viper.AddConfigPath("./resources/") //For production viper.AddConfigPath("../resources/") //For test under Docker + viper.AddConfigPath("../../resources/") //For test under Docker err := viper.ReadInConfig() if err != nil { panic(fmt.Sprintf("#http_server.parseConfiguration - failed to read configuration file: %s\n", err)) @@ -55,7 +57,7 @@ func ParseConfiguration() *Configuration{ config.NotificationResponseBuffer = viper.GetInt("notificationResponseBuffer") config.BigRedButtonTimeoutSec = viper.GetInt("bigRedButtonTimeoutSec") - + config.MaxConnectionAttempts = viper.GetInt("maxConnectionAttempts") return &config } diff --git a/E2Manager/controllers/controller.go b/E2Manager/controllers/controller.go index 6d638c4..4f785da 100644 --- a/E2Manager/controllers/controller.go +++ b/E2Manager/controllers/controller.go @@ -22,7 +22,7 @@ import ( "e2mgr/e2managererrors" "e2mgr/logger" "e2mgr/models" - "e2mgr/providers" + "e2mgr/providers/httpmsghandlerprovider" "e2mgr/rNibWriter" "e2mgr/services" "encoding/json" @@ -34,39 +34,40 @@ import ( const ( ParamRanName = "ranName" ) + type Controller struct { - logger *logger.Logger - handlerProvider *providers.IncomingRequestHandlerProvider + logger *logger.Logger + handlerProvider *httpmsghandlerprovider.IncomingRequestHandlerProvider } func NewController(logger *logger.Logger, rmrService *services.RmrService, rNibReaderProvider func() reader.RNibReader, rNibWriterProvider func() rNibWriter.RNibWriter, config *configuration.Configuration) *Controller { - provider := providers.NewIncomingRequestHandlerProvider(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider) + provider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider) return &Controller{ - logger: logger, + logger: logger, handlerProvider: provider, } } -func (c *Controller)ShutdownHandler(writer http.ResponseWriter, r *http.Request, params httprouter.Params){ +func (c *Controller) ShutdownHandler(writer http.ResponseWriter, r *http.Request, params httprouter.Params) { c.logger.Infof("[Client -> E2 Manager] #controller.ShutdownHandler - request: %v", prettifyRequest(r)) - c.handleRequest(writer, &r.Header, providers.ShutdownRequest,nil, false, http.StatusNoContent) + c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ShutdownRequest, nil, false, http.StatusNoContent) } -func (c *Controller) X2ResetHandler(writer http.ResponseWriter, r *http.Request, params httprouter.Params){ +func (c *Controller) X2ResetHandler(writer http.ResponseWriter, r *http.Request, params httprouter.Params) { c.logger.Infof("[Client -> E2 Manager] #controller.X2ResetHandler - request: %v", prettifyRequest(r)) - request:= models.ResetRequest{} - ranName:= params.ByName(ParamRanName) + request := models.ResetRequest{} + ranName := params.ByName(ParamRanName) - if !c.extractJsonBody(r, &request, writer){ + if !c.extractJsonBody(r, &request, writer) { return } request.RanName = ranName - c.handleRequest(writer, &r.Header, providers.ResetRequest, request, false, http.StatusNoContent) + c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ResetRequest, request, false, http.StatusNoContent) } -func (c *Controller) extractJsonBody(r *http.Request, request models.Request, writer http.ResponseWriter) bool{ +func (c *Controller) extractJsonBody(r *http.Request, request models.Request, writer http.ResponseWriter) bool { if r.ContentLength <= 0 { return true } @@ -83,7 +84,7 @@ func (c *Controller) extractJsonBody(r *http.Request, request models.Request, wr return true } -func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Header, requestName providers.IncomingRequest, +func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Header, requestName httpmsghandlerprovider.IncomingRequest, request models.Request, validateHeader bool, httpStatusResponse int) { if validateHeader { @@ -95,7 +96,7 @@ func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Head } } - handler,err := c.handlerProvider.GetHandler(requestName) + handler, err := c.handlerProvider.GetHandler(requestName) if err != nil { c.handleErrorResponse(err, writer) return @@ -112,17 +113,17 @@ func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Head c.logger.Infof("[E2 Manager -> Client] #controller.handleRequest - status response: %v", httpStatusResponse) } -func (c *Controller) validateRequestHeader( header *http.Header) error { +func (c *Controller) validateRequestHeader(header *http.Header) error { - if header.Get("Content-Type") != "application/json"{ + if header.Get("Content-Type") != "application/json" { c.logger.Errorf("#controller.validateRequestHeader - validation failure, incorrect content type") - return e2managererrors.NewHeaderValidationError() + return e2managererrors.NewHeaderValidationError() } return nil } -func (c *Controller) handleErrorResponse(err error, writer http.ResponseWriter){ +func (c *Controller) handleErrorResponse(err error, writer http.ResponseWriter) { var errorResponseDetails models.ErrorResponse var httpError int @@ -179,4 +180,4 @@ func (c *Controller) handleErrorResponse(err error, writer http.ResponseWriter){ if err != nil { c.logger.Errorf("#controller.handleErrorResponse - Cannot send response. writer:%v", writer) } -} \ No newline at end of file +} diff --git a/E2Manager/controllers/controller_test.go b/E2Manager/controllers/controller_test.go index 420badd..b869252 100644 --- a/E2Manager/controllers/controller_test.go +++ b/E2Manager/controllers/controller_test.go @@ -24,7 +24,7 @@ import ( "e2mgr/logger" "e2mgr/mocks" "e2mgr/models" - "e2mgr/providers" + "e2mgr/providers/httpmsghandlerprovider" "e2mgr/rNibWriter" "e2mgr/rmrCgo" "e2mgr/tests" @@ -92,7 +92,7 @@ func TestHeaderValidationFailed(t *testing.T) { header := &http.Header{} - controller.handleRequest(writer, header, providers.ShutdownRequest, nil, true, http.StatusNoContent) + controller.handleRequest(writer, header, httpmsghandlerprovider.ShutdownRequest, nil, true, http.StatusNoContent) var errorResponse = parseJsonRequest(t, writer.Body) err := e2managererrors.NewHeaderValidationError() @@ -102,7 +102,7 @@ func TestHeaderValidationFailed(t *testing.T) { assert.Equal(t, errorResponse.Message, err.Err.Message) } -func TestShutdownStatusNoContent(t *testing.T){ +func TestShutdownStatusNoContent(t *testing.T) { log := initLog(t) rmrMessengerMock := &mocks.RmrMessengerMock{} @@ -178,7 +178,7 @@ func TestHandleCommandAlreadyInProgressError(t *testing.T) { assert.Equal(t, errorResponse.Message, err.Err.Message) } -func TestValidateHeaders(t *testing.T){ +func TestValidateHeaders(t *testing.T) { log := initLog(t) rmrMessengerMock := &mocks.RmrMessengerMock{} @@ -221,8 +221,7 @@ func initLog(t *testing.T) *logger.Logger { return log } - -func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T){ +func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) { log := initLog(t) ranName := "test1" @@ -235,33 +234,33 @@ func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T){ writerProvider := func() rNibWriter.RNibWriter { 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) + rmrService := getRmrService(rmrMessengerMock, log) writer := httptest.NewRecorder() controller := NewController(log, rmrService, readerProvider, writerProvider, config) - 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) data4Req := map[string]interface{}{"cause": "protocol:transfer-syntax-error"} b := new(bytes.Buffer) _ = json.NewEncoder(b).Encode(data4Req) req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b) - param:= httprouter.Param{Key:"ranName", Value: ranName} - controller.X2ResetHandler(writer, req, []httprouter.Param {param}) + param := httprouter.Param{Key: "ranName", Value: ranName} + controller.X2ResetHandler(writer, req, []httprouter.Param{param}) assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) } -func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T){ +func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) { log := initLog(t) ranName := "test1" @@ -275,32 +274,32 @@ func TestX2ResetHandleSuccessfulRequestedDefault(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) + rmrService := getRmrService(rmrMessengerMock, log) writer := httptest.NewRecorder() controller := NewController(log, rmrService, readerProvider, writerProvider, config) - 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) // no body b := new(bytes.Buffer) req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b) - param:= httprouter.Param{Key:"ranName", Value: ranName} - controller.X2ResetHandler(writer, req, []httprouter.Param {param}) + param := httprouter.Param{Key: "ranName", Value: ranName} + controller.X2ResetHandler(writer, req, []httprouter.Param{param}) assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) } -func TestX2ResetHandleFailureInvalidBody(t *testing.T){ +func TestX2ResetHandleFailureInvalidBody(t *testing.T) { log := initLog(t) ranName := "test1" @@ -316,7 +315,7 @@ func TestX2ResetHandleFailureInvalidBody(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() - rmrService:=getRmrService(rmrMessengerMock, log) + rmrService := getRmrService(rmrMessengerMock, log) writer := httptest.NewRecorder() controller := NewController(log, rmrService, readerProvider, writerProvider, config) @@ -325,8 +324,8 @@ func TestX2ResetHandleFailureInvalidBody(t *testing.T){ b := strings.NewReader("{cause:\"protocol:transfer-syntax-error\"") req, _ := http.NewRequest("PUT", "https://localhost:3800/nodeb-reset", b) - param:= httprouter.Param{Key:"ranName", Value: ranName} - controller.X2ResetHandler(writer, req, []httprouter.Param {param}) + param := httprouter.Param{Key: "ranName", Value: ranName} + controller.X2ResetHandler(writer, req, []httprouter.Param{param}) assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode) _, ok := rmrService.E2sessions[ranName] @@ -334,7 +333,7 @@ func TestX2ResetHandleFailureInvalidBody(t *testing.T){ } -func TestHandleErrorResponse(t *testing.T){ +func TestHandleErrorResponse(t *testing.T) { log := initLog(t) readerMock := &mocks.RnibReaderMock{} @@ -348,40 +347,39 @@ func TestHandleErrorResponse(t *testing.T){ rmrMessengerMock := &mocks.RmrMessengerMock{} config := configuration.ParseConfiguration() - rmrService:=getRmrService(rmrMessengerMock, log) - + rmrService := getRmrService(rmrMessengerMock, log) controller := NewController(log, rmrService, readerProvider, writerProvider, config) writer := httptest.NewRecorder() - controller.handleErrorResponse(e2managererrors.NewRnibDbError(),writer) + controller.handleErrorResponse(e2managererrors.NewRnibDbError(), writer) assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode) writer = httptest.NewRecorder() - controller.handleErrorResponse(e2managererrors.NewCommandAlreadyInProgressError(),writer) + controller.handleErrorResponse(e2managererrors.NewCommandAlreadyInProgressError(), writer) assert.Equal(t, http.StatusMethodNotAllowed, writer.Result().StatusCode) writer = httptest.NewRecorder() - controller.handleErrorResponse(e2managererrors.NewHeaderValidationError(),writer) + controller.handleErrorResponse(e2managererrors.NewHeaderValidationError(), writer) 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() - controller.handleErrorResponse(e2managererrors.NewRequestValidationError(),writer) + controller.handleErrorResponse(e2managererrors.NewRequestValidationError(), writer) assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode) writer = httptest.NewRecorder() - controller.handleErrorResponse(e2managererrors.NewRmrError(),writer) + controller.handleErrorResponse(e2managererrors.NewRmrError(), writer) assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode) writer = httptest.NewRecorder() - controller.handleErrorResponse(e2managererrors.NewResourceNotFoundError(),writer) + controller.handleErrorResponse(e2managererrors.NewResourceNotFoundError(), writer) assert.Equal(t, http.StatusNotFound, writer.Result().StatusCode) writer = httptest.NewRecorder() - controller.handleErrorResponse(fmt.Errorf("ErrorError"),writer) + controller.handleErrorResponse(fmt.Errorf("ErrorError"), writer) assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode) } diff --git a/E2Manager/controllers/nodeb_controller.go b/E2Manager/controllers/nodeb_controller.go index a3286f8..50cb49b 100644 --- a/E2Manager/controllers/nodeb_controller.go +++ b/E2Manager/controllers/nodeb_controller.go @@ -20,7 +20,7 @@ package controllers import ( "e2mgr/logger" "e2mgr/models" - "e2mgr/providers" + "e2mgr/providers/httpmsghandlerprovider" "e2mgr/rNibWriter" "e2mgr/services" "e2mgr/sessions" @@ -77,7 +77,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) @@ -89,7 +88,7 @@ func (rc NodebController) HandleRequest(writer http.ResponseWriter, request *htt rc.Logger.Infof("[Client -> E2 Manager] #nodeb_controller.HandleRequest - request: %v", prettifyRequest(request)) messageTypeParam := params.ByName("messageType") - requestHandlerProvider := providers.NewRequestHandlerProvider(rc.rnibWriterProvider) + requestHandlerProvider := httpmsghandlerprovider.NewRequestHandlerProvider(rc.rnibWriterProvider) handler, err := requestHandlerProvider.GetHandler(rc.Logger, messageTypeParam) if err != nil { @@ -139,7 +138,7 @@ func (rc NodebController) HandleRequest(writer http.ResponseWriter, request *htt printHandlingRequestElapsedTimeInMs(rc.Logger, startTime) } -func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *http.Request, params httprouter.Params) { +func (rc NodebController) GetNodebIdList(writer http.ResponseWriter, request *http.Request, params httprouter.Params) { startTime := time.Now() rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider) nodebIdList, rnibError := rnibReaderService.GetNodebIdList() @@ -147,16 +146,16 @@ func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *h if rnibError != nil { rc.Logger.Errorf("%v", rnibError); httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError) - handleErrorResponse(rc.Logger,httpStatusCode,errorCode,errorMessage,writer,startTime ) + handleErrorResponse(rc.Logger, httpStatusCode, errorCode, errorMessage, writer, startTime) return; } - pmList:= utils.ConvertNodebIdListToProtoMessageList(*nodebIdList) + pmList := utils.ConvertNodebIdListToProtoMessageList(*nodebIdList) result, err := utils.MarshalProtoMessageListToJsonArray(pmList) if err != nil { rc.Logger.Errorf("%v", err); - handleErrorResponse(rc.Logger,http.StatusInternalServerError,internalErrorCode,internalErrorMessage,writer,startTime ) + handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, internalErrorMessage, writer, startTime) return; } diff --git a/E2Manager/cp.out b/E2Manager/cp.out deleted file mode 100644 index 5194ca7..0000000 --- a/E2Manager/cp.out +++ /dev/null @@ -1,841 +0,0 @@ -mode: set -e2mgr/controllers/nodeb_controller.go:69.68,78.2 3 1 -e2mgr/controllers/nodeb_controller.go:81.52,85.2 3 1 -e2mgr/controllers/nodeb_controller.go:87.118,95.16 6 1 -e2mgr/controllers/nodeb_controller.go:100.2,102.16 2 1 -e2mgr/controllers/nodeb_controller.go:107.2,109.74 2 1 -e2mgr/controllers/nodeb_controller.go:114.2,116.16 2 1 -e2mgr/controllers/nodeb_controller.go:121.2,134.16 8 1 -e2mgr/controllers/nodeb_controller.go:139.2,139.59 1 1 -e2mgr/controllers/nodeb_controller.go:95.16,98.3 2 1 -e2mgr/controllers/nodeb_controller.go:102.16,105.3 2 0 -e2mgr/controllers/nodeb_controller.go:109.74,112.3 2 1 -e2mgr/controllers/nodeb_controller.go:116.16,119.3 2 0 -e2mgr/controllers/nodeb_controller.go:134.16,137.3 2 0 -e2mgr/controllers/nodeb_controller.go:142.120,147.22 4 1 -e2mgr/controllers/nodeb_controller.go:154.2,157.16 3 1 -e2mgr/controllers/nodeb_controller.go:163.2,165.30 3 1 -e2mgr/controllers/nodeb_controller.go:147.22,152.3 4 1 -e2mgr/controllers/nodeb_controller.go:157.16,161.3 3 0 -e2mgr/controllers/nodeb_controller.go:168.113,174.22 5 1 -e2mgr/controllers/nodeb_controller.go:181.2,184.16 3 1 -e2mgr/controllers/nodeb_controller.go:190.2,192.30 3 1 -e2mgr/controllers/nodeb_controller.go:174.22,179.3 4 1 -e2mgr/controllers/nodeb_controller.go:184.16,188.3 3 0 -e2mgr/controllers/nodeb_controller.go:195.129,198.2 1 1 -e2mgr/controllers/nodeb_controller.go:200.93,202.78 2 1 -e2mgr/controllers/nodeb_controller.go:206.2,206.28 1 1 -e2mgr/controllers/nodeb_controller.go:202.78,205.3 2 0 -e2mgr/controllers/nodeb_controller.go:209.96,211.33 1 1 -e2mgr/controllers/nodeb_controller.go:215.2,219.16 2 1 -e2mgr/controllers/nodeb_controller.go:223.2,223.12 1 1 -e2mgr/controllers/nodeb_controller.go:211.33,214.3 2 0 -e2mgr/controllers/nodeb_controller.go:219.16,221.3 1 1 -e2mgr/controllers/nodeb_controller.go:226.150,235.16 8 1 -e2mgr/controllers/nodeb_controller.go:235.16,237.3 1 0 -e2mgr/controllers/nodeb_controller.go:240.86,243.2 1 1 -e2mgr/controllers/nodeb_controller.go:245.75,246.29 1 1 -e2mgr/controllers/nodeb_controller.go:247.33,248.70 1 1 -e2mgr/controllers/nodeb_controller.go:249.29,250.81 1 1 -e2mgr/controllers/nodeb_controller.go:251.31,252.77 1 0 -e2mgr/controllers/nodeb_controller.go:253.10,254.81 1 0 -e2mgr/controllers/controller.go:40.107,48.2 2 1 -e2mgr/controllers/controller.go:50.107,53.2 1 1 -e2mgr/controllers/controller.go:57.72,61.20 2 1 -e2mgr/controllers/controller.go:70.2,71.16 2 1 -e2mgr/controllers/controller.go:76.2,78.16 2 1 -e2mgr/controllers/controller.go:83.2,84.110 2 1 -e2mgr/controllers/controller.go:61.20,64.17 2 1 -e2mgr/controllers/controller.go:64.17,67.4 2 1 -e2mgr/controllers/controller.go:71.16,74.3 2 0 -e2mgr/controllers/controller.go:78.16,81.3 2 1 -e2mgr/controllers/controller.go:87.72,89.53 1 1 -e2mgr/controllers/controller.go:94.2,94.12 1 1 -e2mgr/controllers/controller.go:89.53,93.3 2 1 -e2mgr/controllers/controller.go:97.80,102.16 3 1 -e2mgr/controllers/controller.go:122.2,130.16 6 1 -e2mgr/controllers/controller.go:102.16,103.21 1 1 -e2mgr/controllers/controller.go:104.37,107.46 3 1 -e2mgr/controllers/controller.go:108.55,111.43 3 1 -e2mgr/controllers/controller.go:112.47,115.47 3 1 -e2mgr/controllers/controller.go:116.11,119.46 3 1 -e2mgr/controllers/controller.go:130.16,132.3 1 0 -e2mgr/logger/logger.go:71.58,72.85 1 1 -e2mgr/logger/logger.go:75.2,75.27 1 1 -e2mgr/logger/logger.go:72.85,74.3 1 1 -e2mgr/logger/logger.go:78.54,81.19 3 1 -e2mgr/logger/logger.go:99.2,99.16 1 1 -e2mgr/logger/logger.go:102.2,102.36 1 1 -e2mgr/logger/logger.go:82.18,83.54 1 1 -e2mgr/logger/logger.go:84.17,85.53 1 1 -e2mgr/logger/logger.go:86.17,87.53 1 0 -e2mgr/logger/logger.go:88.18,89.54 1 0 -e2mgr/logger/logger.go:90.19,91.55 1 0 -e2mgr/logger/logger.go:92.18,93.54 1 0 -e2mgr/logger/logger.go:94.18,95.54 1 1 -e2mgr/logger/logger.go:96.10,97.58 1 1 -e2mgr/logger/logger.go:99.16,101.3 1 1 -e2mgr/logger/logger.go:105.29,108.2 2 1 -e2mgr/logger/logger.go:110.60,111.21 1 1 -e2mgr/logger/logger.go:111.21,114.3 2 1 -e2mgr/logger/logger.go:117.61,118.21 1 1 -e2mgr/logger/logger.go:118.21,121.3 2 1 -e2mgr/logger/logger.go:124.61,127.2 2 1 -e2mgr/logger/logger.go:129.60,132.2 2 0 -e2mgr/logger/logger.go:134.54,138.2 3 1 -e2mgr/logger/logger.go:140.34,142.2 1 1 -e2mgr/logger/logger.go:144.35,146.2 1 1 -e2mgr/logger/logger.go:148.62,151.2 2 1 -e2mgr/logger/logger.go:153.62,173.2 2 1 -e2mgr/logger/logger.go:175.92,177.2 1 1 -e2mgr/logger/logger.go:179.84,183.2 3 1 -e2mgr/main/http_server.go:39.13,43.16 4 0 -e2mgr/main/http_server.go:47.2,60.59 13 0 -e2mgr/main/http_server.go:43.16,46.3 2 0 -e2mgr/main/http_server.go:63.163,76.58 10 0 -e2mgr/main/http_server.go:76.58,78.3 1 0 -e2mgr/models/e2_request_message.go:33.59,35.2 1 1 -e2mgr/models/e2_request_message.go:37.65,39.2 1 1 -e2mgr/models/e2_request_message.go:41.128,43.2 1 1 -e2mgr/models/e2_request_message.go:45.90,52.2 4 1 -e2mgr/models/notification_request.go:30.125,38.2 1 0 -e2mgr/models/notification_response.go:31.86,33.2 1 0 -e2mgr/providers/incoming_request_handler_provider.go:41.79,47.2 1 0 -e2mgr/providers/incoming_request_handler_provider.go:50.91,55.2 1 0 -e2mgr/providers/incoming_request_handler_provider.go:57.121,60.9 2 0 -e2mgr/providers/incoming_request_handler_provider.go:65.2,65.21 1 0 -e2mgr/providers/incoming_request_handler_provider.go:60.9,63.3 2 0 -e2mgr/providers/notification_handler_provider.go:34.160,40.2 1 1 -e2mgr/providers/notification_handler_provider.go:42.164,54.2 1 1 -e2mgr/providers/notification_handler_provider.go:56.123,59.9 2 1 -e2mgr/providers/notification_handler_provider.go:63.2,63.21 1 1 -e2mgr/providers/notification_handler_provider.go:59.9,61.3 1 1 -e2mgr/providers/request_handler_provider.go:32.105,35.2 2 1 -e2mgr/providers/request_handler_provider.go:37.98,42.2 1 1 -e2mgr/providers/request_handler_provider.go:44.120,47.9 2 1 -e2mgr/providers/request_handler_provider.go:53.2,53.21 1 1 -e2mgr/providers/request_handler_provider.go:47.9,51.3 3 1 -e2mgr/rNibWriter/rNibWriter.go:47.43,49.22 1 1 -e2mgr/rNibWriter/rNibWriter.go:49.22,52.4 2 0 -e2mgr/rNibWriter/rNibWriter.go:53.25,55.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:60.86,62.2 1 1 -e2mgr/rNibWriter/rNibWriter.go:66.33,68.2 1 1 -e2mgr/rNibWriter/rNibWriter.go:72.119,76.72 2 1 -e2mgr/rNibWriter/rNibWriter.go:79.2,81.16 3 1 -e2mgr/rNibWriter/rNibWriter.go:84.2,86.19 3 1 -e2mgr/rNibWriter/rNibWriter.go:89.2,91.24 2 1 -e2mgr/rNibWriter/rNibWriter.go:99.2,99.28 1 1 -e2mgr/rNibWriter/rNibWriter.go:105.2,105.28 1 1 -e2mgr/rNibWriter/rNibWriter.go:111.2,112.16 2 1 -e2mgr/rNibWriter/rNibWriter.go:115.2,115.24 1 1 -e2mgr/rNibWriter/rNibWriter.go:125.2,125.12 1 1 -e2mgr/rNibWriter/rNibWriter.go:76.72,78.3 1 1 -e2mgr/rNibWriter/rNibWriter.go:81.16,83.3 1 1 -e2mgr/rNibWriter/rNibWriter.go:86.19,88.3 1 1 -e2mgr/rNibWriter/rNibWriter.go:91.24,93.20 2 1 -e2mgr/rNibWriter/rNibWriter.go:96.3,96.35 1 1 -e2mgr/rNibWriter/rNibWriter.go:93.20,95.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:99.28,101.20 2 1 -e2mgr/rNibWriter/rNibWriter.go:101.20,103.4 1 1 -e2mgr/rNibWriter/rNibWriter.go:105.28,107.20 2 1 -e2mgr/rNibWriter/rNibWriter.go:107.20,109.4 1 1 -e2mgr/rNibWriter/rNibWriter.go:112.16,114.3 1 1 -e2mgr/rNibWriter/rNibWriter.go:115.24,117.17 2 1 -e2mgr/rNibWriter/rNibWriter.go:120.3,121.17 2 1 -e2mgr/rNibWriter/rNibWriter.go:117.17,119.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:121.17,123.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:131.142,137.20 3 1 -e2mgr/rNibWriter/rNibWriter.go:141.2,143.16 2 1 -e2mgr/rNibWriter/rNibWriter.go:147.2,152.16 4 1 -e2mgr/rNibWriter/rNibWriter.go:156.2,156.12 1 1 -e2mgr/rNibWriter/rNibWriter.go:137.20,139.3 1 1 -e2mgr/rNibWriter/rNibWriter.go:143.16,145.3 1 1 -e2mgr/rNibWriter/rNibWriter.go:152.16,154.3 1 1 -e2mgr/rNibWriter/rNibWriter.go:162.13,164.2 1 1 -e2mgr/rNibWriter/rNibWriter.go:166.144,167.29 1 1 -e2mgr/rNibWriter/rNibWriter.go:184.2,184.19 1 1 -e2mgr/rNibWriter/rNibWriter.go:167.29,170.17 3 1 -e2mgr/rNibWriter/rNibWriter.go:173.3,174.20 2 1 -e2mgr/rNibWriter/rNibWriter.go:177.3,179.20 3 1 -e2mgr/rNibWriter/rNibWriter.go:182.3,182.39 1 1 -e2mgr/rNibWriter/rNibWriter.go:170.17,172.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:174.20,176.4 1 1 -e2mgr/rNibWriter/rNibWriter.go:179.20,181.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:187.143,188.29 1 1 -e2mgr/rNibWriter/rNibWriter.go:205.2,205.19 1 1 -e2mgr/rNibWriter/rNibWriter.go:188.29,191.17 3 1 -e2mgr/rNibWriter/rNibWriter.go:194.3,195.20 2 1 -e2mgr/rNibWriter/rNibWriter.go:198.3,200.20 3 1 -e2mgr/rNibWriter/rNibWriter.go:203.3,203.39 1 1 -e2mgr/rNibWriter/rNibWriter.go:191.17,193.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:195.20,197.4 1 1 -e2mgr/rNibWriter/rNibWriter.go:200.20,202.4 1 0 -e2mgr/rNibWriter/rNibWriter.go:208.55,210.2 1 1 -e2mgr/rmrCgo/rmrCgoTypes.go:31.87,39.2 1 1 -e2mgr/rmrCgo/rmrCgoTypes.go:41.96,48.2 1 1 -e2mgr/rmrCgo/rmrCgoTypes.go:119.32,121.2 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:32.66,48.93 7 0 -e2mgr/rmrCgo/rmrCgoUtils.go:52.2,52.13 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:48.93,50.3 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:55.115,68.50 9 0 -e2mgr/rmrCgo/rmrCgoUtils.go:73.2,74.51 2 0 -e2mgr/rmrCgo/rmrCgoUtils.go:78.2,82.16 4 0 -e2mgr/rmrCgo/rmrCgoUtils.go:86.2,87.16 2 0 -e2mgr/rmrCgo/rmrCgoUtils.go:91.2,92.34 2 0 -e2mgr/rmrCgo/rmrCgoUtils.go:96.2,96.14 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:68.50,70.3 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:74.51,76.3 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:82.16,85.3 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:87.16,90.3 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:92.34,95.3 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:100.47,101.23 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:101.23,102.24 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:105.3,105.138 1 0 -e2mgr/rmrCgo/rmrCgoUtils.go:102.24,104.4 1 0 -e2mgr/rmrCgo/rmrCgoApi.go:34.99,41.21 6 1 -e2mgr/rmrCgo/rmrCgoApi.go:48.2,50.11 3 1 -e2mgr/rmrCgo/rmrCgoApi.go:41.21,43.39 2 1 -e2mgr/rmrCgo/rmrCgoApi.go:43.39,46.4 2 0 -e2mgr/rmrCgo/rmrCgoApi.go:53.71,59.21 6 0 -e2mgr/rmrCgo/rmrCgoApi.go:66.2,74.21 7 0 -e2mgr/rmrCgo/rmrCgoApi.go:80.2,81.50 2 0 -e2mgr/rmrCgo/rmrCgoApi.go:59.21,63.3 3 0 -e2mgr/rmrCgo/rmrCgoApi.go:74.21,78.3 3 0 -e2mgr/rmrCgo/rmrCgoApi.go:84.46,93.21 7 0 -e2mgr/rmrCgo/rmrCgoApi.go:99.2,103.18 5 0 -e2mgr/rmrCgo/rmrCgoApi.go:93.21,97.3 3 0 -e2mgr/rmrCgo/rmrCgoApi.go:106.39,112.2 5 0 -e2mgr/rmrCgo/rmrCgoApi.go:114.36,117.2 2 1 -e2mgr/rmrCgo/rmrCgoApi.go:119.29,123.2 3 0 -e2mgr/rnibBuilders/node_info_builder.go:25.111,35.2 8 1 -e2mgr/services/rmr_service.go:38.90,40.2 1 1 -e2mgr/services/rmr_service.go:53.61,62.2 1 1 -e2mgr/services/rmr_service.go:65.21,80.2 9 1 -e2mgr/services/rmr_service.go:82.76,93.16 6 0 -e2mgr/services/rmr_service.go:93.16,96.3 2 0 -e2mgr/services/rmr_service.go:100.40,102.6 1 1 -e2mgr/services/rmr_service.go:102.6,107.17 3 1 -e2mgr/services/rmr_service.go:111.3,111.79 1 0 -e2mgr/services/rmr_service.go:107.17,108.12 1 1 -e2mgr/services/rmr_service.go:115.36,116.5 1 0 -e2mgr/services/rmr_service.go:116.5,119.10 2 0 -e2mgr/services/rmr_service.go:125.3,126.29 2 0 -e2mgr/services/rmr_service.go:119.10,122.9 2 0 -e2mgr/services/rmr_service.go:130.37,131.35 1 1 -e2mgr/services/rmr_service.go:131.35,135.3 3 1 -e2mgr/services/rnib_reader_service.go:30.83,32.2 1 0 -e2mgr/services/rnib_reader_service.go:36.94,38.2 1 0 -e2mgr/services/rnib_reader_service.go:40.90,43.18 2 0 -e2mgr/services/rnib_reader_service.go:47.2,49.18 2 0 -e2mgr/services/rnib_reader_service.go:53.2,55.26 2 0 -e2mgr/services/rnib_reader_service.go:43.18,45.3 1 0 -e2mgr/services/rnib_reader_service.go:49.18,51.3 1 0 -e2mgr/handlers/endc_setup_request_handler.go:36.107,40.2 1 1 -e2mgr/handlers/endc_setup_request_handler.go:42.111,46.20 3 0 -e2mgr/handlers/endc_setup_request_handler.go:52.2,52.16 1 0 -e2mgr/handlers/endc_setup_request_handler.go:46.20,48.3 1 0 -e2mgr/handlers/endc_setup_request_handler.go:48.8,50.3 1 0 -e2mgr/handlers/endc_setup_request_handler.go:55.226,60.16 3 1 -e2mgr/handlers/endc_setup_request_handler.go:71.2,71.11 1 1 -e2mgr/handlers/endc_setup_request_handler.go:60.16,62.3 1 0 -e2mgr/handlers/endc_setup_request_handler.go:62.8,69.3 5 1 -e2mgr/handlers/endc_setup_request_handler.go:74.53,76.2 1 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:33.91,38.16 3 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:42.2,43.8 2 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:38.16,40.3 1 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:43.8,44.29 1 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:65.3,66.44 2 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:44.29,56.87 9 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:56.87,58.5 1 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:58.10,60.30 2 0 -e2mgr/handlers/endc_x2Setup_failure_response_notification_handler.go:60.30,62.6 1 0 -e2mgr/handlers/endc_x2apSetupRequest_asn1_packer.go:32.221,39.96 4 1 -e2mgr/handlers/endc_x2apSetupRequest_asn1_packer.go:43.2,43.27 1 1 -e2mgr/handlers/endc_x2apSetupRequest_asn1_packer.go:52.2,52.39 1 1 -e2mgr/handlers/endc_x2apSetupRequest_asn1_packer.go:39.96,41.3 1 1 -e2mgr/handlers/endc_x2apSetupRequest_asn1_packer.go:43.27,46.119 3 0 -e2mgr/handlers/endc_x2apSetupRequest_asn1_packer.go:46.119,49.4 2 0 -e2mgr/handlers/setup_request_handler.go:58.99,62.2 1 1 -e2mgr/handlers/setup_request_handler.go:64.107,68.20 3 0 -e2mgr/handlers/setup_request_handler.go:74.2,74.16 1 0 -e2mgr/handlers/setup_request_handler.go:68.20,70.3 1 0 -e2mgr/handlers/setup_request_handler.go:70.8,72.3 1 0 -e2mgr/handlers/setup_request_handler.go:77.222,82.16 3 1 -e2mgr/handlers/setup_request_handler.go:93.2,93.11 1 1 -e2mgr/handlers/setup_request_handler.go:82.16,84.3 1 0 -e2mgr/handlers/setup_request_handler.go:84.8,91.3 5 1 -e2mgr/handlers/setup_request_handler.go:96.59,103.12 3 0 -e2mgr/handlers/setup_request_handler.go:108.2,108.19 1 0 -e2mgr/handlers/setup_request_handler.go:111.2,111.53 1 0 -e2mgr/handlers/setup_request_handler.go:103.12,106.3 1 0 -e2mgr/handlers/setup_request_handler.go:108.19,110.3 1 0 -e2mgr/handlers/setup_request_handler.go:118.37,119.91 1 1 -e2mgr/handlers/setup_request_handler.go:123.2,123.21 1 1 -e2mgr/handlers/setup_request_handler.go:127.2,127.20 1 1 -e2mgr/handlers/setup_request_handler.go:131.2,131.134 1 1 -e2mgr/handlers/setup_request_handler.go:135.2,135.12 1 1 -e2mgr/handlers/setup_request_handler.go:119.91,121.3 1 1 -e2mgr/handlers/setup_request_handler.go:123.21,125.3 1 1 -e2mgr/handlers/setup_request_handler.go:127.20,129.3 1 1 -e2mgr/handlers/setup_request_handler.go:131.134,133.3 1 1 -e2mgr/handlers/setup_request_handler.go:139.49,141.2 1 0 -e2mgr/handlers/setup_request_handler.go:143.13,147.42 2 1 -e2mgr/handlers/setup_request_handler.go:147.42,148.13 1 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:32.91,37.16 3 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:41.2,42.8 2 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:37.16,39.3 1 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:42.8,43.29 1 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:64.3,65.44 2 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:43.29,55.87 9 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:55.87,57.5 1 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:57.10,59.30 2 0 -e2mgr/handlers/x2Setup_failure_response_notification_handler.go:59.30,61.6 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:31.98,33.52 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:37.2,39.116 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:43.2,45.35 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:49.2,51.31 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:55.2,59.93 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:63.2,67.87 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:71.2,71.176 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:33.52,35.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:39.116,41.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:45.35,47.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:51.31,53.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:59.93,61.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:67.87,69.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:74.144,78.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:82.2,85.16 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:89.2,91.12 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:78.16,80.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:85.16,87.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:94.106,96.84 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:100.2,100.80 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:96.84,98.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:103.135,110.16 4 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:114.2,114.55 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:118.2,120.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:124.2,124.53 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:128.2,130.41 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:140.2,142.49 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:146.2,148.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:152.2,152.12 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:110.16,112.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:114.55,116.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:120.16,122.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:124.53,126.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:130.41,133.17 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:137.3,137.128 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:133.17,135.4 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:142.49,144.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:148.16,150.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:156.42,160.2 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:162.180,164.62 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:168.2,168.20 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:164.62,166.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:171.171,173.66 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:177.2,179.103 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:183.2,185.54 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:173.66,175.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:179.103,181.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:188.84,193.2 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:195.82,204.37 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:208.2,208.22 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:204.37,206.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:211.66,213.2 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:215.54,217.2 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:219.169,229.28 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:233.2,233.35 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:229.28,231.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:236.120,238.58 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:242.2,242.104 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:238.58,240.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:245.174,248.57 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:256.2,256.14 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:248.57,254.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:259.171,262.50 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:266.2,268.119 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:272.2,274.54 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:262.50,264.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:268.119,270.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:277.130,280.19 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:284.2,286.22 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:290.2,290.114 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:280.19,282.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:286.22,288.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:293.132,297.19 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:301.2,303.22 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:307.2,311.116 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:315.2,315.94 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:297.19,299.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:303.22,305.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:311.116,313.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:318.117,321.33 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:325.2,332.29 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:321.33,323.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:335.117,338.33 2 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:342.2,349.29 2 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:338.33,340.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:352.144,355.35 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:364.2,364.133 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:356.31,357.59 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:358.31,359.59 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:360.40,361.87 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:367.180,371.56 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:375.2,377.59 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:381.2,381.53 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:371.56,373.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:377.59,379.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:384.170,392.2 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:394.135,398.22 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:402.2,402.29 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:406.2,408.59 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:412.2,412.58 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:398.22,400.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:402.29,404.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:408.59,410.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:415.50,417.28 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:421.2,421.12 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:417.28,419.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:424.202,427.36 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:431.2,433.54 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:438.2,438.51 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:442.2,444.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:448.2,448.21 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:452.2,452.47 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:427.36,429.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:433.54,436.3 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:438.51,440.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:444.16,446.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:448.21,450.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:455.161,458.105 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:462.2,462.103 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:466.2,466.107 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:458.105,460.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:462.103,464.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:469.136,472.44 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:476.2,478.44 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:482.2,482.45 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:472.44,474.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:478.44,480.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:485.110,490.2 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:492.145,498.102 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:502.2,504.69 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:509.2,509.32 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:498.102,500.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:504.69,507.3 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:512.146,516.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:520.2,525.30 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:516.16,518.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:528.127,535.16 4 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:539.2,539.40 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:543.2,545.106 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:549.2,551.65 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:561.2,561.30 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:535.16,537.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:539.40,541.3 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:545.106,547.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:551.65,554.17 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:558.3,558.107 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:554.17,556.4 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:564.141,567.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:571.2,572.12 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:567.16,569.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:575.143,579.2 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:581.152,585.2 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:587.161,591.2 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:593.142,596.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:600.2,601.12 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:596.16,598.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:604.159,607.16 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:611.2,612.12 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:607.16,609.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:615.161,616.31 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:632.2,632.12 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:616.31,620.12 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:624.3,626.17 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:620.12,621.12 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:626.17,628.4 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:635.114,641.16 3 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:645.2,645.69 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:653.2,653.12 1 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:641.16,643.3 1 0 -e2mgr/handlers/enb_load_information_to_protobuf.go:645.69,648.17 2 1 -e2mgr/handlers/enb_load_information_to_protobuf.go:648.17,650.4 1 0 -e2mgr/handlers/endc_configuration_update_handler.go:36.54,43.16 6 1 -e2mgr/handlers/endc_configuration_update_handler.go:67.2,67.230 1 1 -e2mgr/handlers/endc_configuration_update_handler.go:43.16,45.13 2 1 -e2mgr/handlers/endc_configuration_update_handler.go:53.3,53.93 1 1 -e2mgr/handlers/endc_configuration_update_handler.go:45.13,50.4 4 1 -e2mgr/handlers/endc_configuration_update_handler.go:50.9,52.4 1 0 -e2mgr/handlers/endc_configuration_update_handler.go:54.8,58.13 4 0 -e2mgr/handlers/endc_configuration_update_handler.go:58.13,63.4 4 0 -e2mgr/handlers/endc_configuration_update_handler.go:63.9,65.4 1 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:34.91,40.16 3 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:44.2,45.8 2 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:40.16,42.3 1 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:45.8,47.17 1 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:72.3,73.44 2 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:47.17,62.87 12 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:62.87,64.5 1 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:64.10,66.30 2 0 -e2mgr/handlers/endc_setup_response_notification_handler.go:66.30,68.6 1 0 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:32.94,35.54 2 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:68.2,68.27 1 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:35.54,38.124 2 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:38.124,40.82 2 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:40.82,43.72 3 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:43.72,44.38 1 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:44.38,45.50 1 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:46.53,49.22 3 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:52.58,53.135 1 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:54.70,56.66 2 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:49.22,51.9 1 0 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:56.66,58.9 1 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:58.14,60.9 1 0 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:71.196,73.16 2 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:77.2,79.50 2 1 -e2mgr/handlers/endc_x2setupFailureResponseToProtobuf.go:73.16,75.3 1 0 -e2mgr/handlers/setup_response_notification_handler.go:33.91,36.16 2 1 -e2mgr/handlers/setup_response_notification_handler.go:40.2,42.8 3 1 -e2mgr/handlers/setup_response_notification_handler.go:46.2,46.136 1 1 -e2mgr/handlers/setup_response_notification_handler.go:36.16,38.3 1 1 -e2mgr/handlers/setup_response_notification_handler.go:42.8,45.3 2 0 -e2mgr/handlers/setup_response_notification_handler.go:49.104,51.2 1 1 -e2mgr/handlers/x2apSetupRequest_asn1_packer.go:32.217,39.96 4 1 -e2mgr/handlers/x2apSetupRequest_asn1_packer.go:43.2,43.27 1 1 -e2mgr/handlers/x2apSetupRequest_asn1_packer.go:51.2,51.39 1 1 -e2mgr/handlers/x2apSetupRequest_asn1_packer.go:39.96,41.3 1 1 -e2mgr/handlers/x2apSetupRequest_asn1_packer.go:43.27,46.119 3 0 -e2mgr/handlers/x2apSetupRequest_asn1_packer.go:46.119,49.4 2 0 -e2mgr/handlers/x2enb_configuration_update_handler.go:36.54,43.16 6 1 -e2mgr/handlers/x2enb_configuration_update_handler.go:68.2,68.230 1 1 -e2mgr/handlers/x2enb_configuration_update_handler.go:43.16,45.12 2 1 -e2mgr/handlers/x2enb_configuration_update_handler.go:53.3,53.94 1 1 -e2mgr/handlers/x2enb_configuration_update_handler.go:45.12,50.4 4 1 -e2mgr/handlers/x2enb_configuration_update_handler.go:50.9,52.4 1 0 -e2mgr/handlers/x2enb_configuration_update_handler.go:54.8,59.13 4 1 -e2mgr/handlers/x2enb_configuration_update_handler.go:59.13,64.4 4 1 -e2mgr/handlers/x2enb_configuration_update_handler.go:64.9,66.4 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:45.69,48.23 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:59.2,59.47 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:49.32,50.116 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:51.31,52.114 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:53.38,54.121 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:55.37,56.120 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:62.63,65.16 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:96.2,96.21 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:65.16,72.45 6 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:72.45,75.40 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:75.40,76.42 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:77.63,79.60 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:82.6,82.60 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:85.82,85.82 0 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:87.68,87.68 0 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:89.81,89.81 0 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:79.60,81.7 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:82.60,84.7 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:99.90,107.2 5 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:109.121,116.2 4 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:118.148,125.2 4 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:127.63,130.16 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:154.2,154.21 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:130.16,138.45 6 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:138.45,141.40 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:141.40,142.42 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:143.78,144.167 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:145.63,146.104 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:147.87,148.194 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:158.127,160.36 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:168.2,168.133 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:161.40,163.154 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:164.42,166.155 2 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:171.122,174.99 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:193.2,193.28 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:174.99,177.55 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:177.55,183.18 4 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:186.4,189.58 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:183.18,185.5 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:196.93,204.40 6 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:208.2,208.27 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:204.40,206.3 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:210.123,212.45 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:265.2,265.12 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:212.45,215.39 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:215.39,216.41 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:217.83,219.84 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:220.80,222.59 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:223.84,225.19 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:228.5,228.64 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:229.67,231.105 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:232.92,234.136 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:241.78,243.88 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:250.86,252.97 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:253.79,255.77 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:256.93,256.93 0 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:225.19,227.6 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:234.136,237.69 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:237.69,239.7 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:243.88,246.55 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:246.55,248.7 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:268.126,271.131 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:305.2,305.24 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:271.131,274.54 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:274.54,286.46 7 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:301.4,301.49 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:286.46,289.84 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:289.84,290.64 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:291.65,293.99 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:294.77,296.45 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:308.89,311.102 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:362.2,362.25 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:311.102,314.52 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:314.52,324.127 6 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:332.4,332.57 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:347.4,348.18 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:351.4,353.160 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:357.4,357.53 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:324.127,327.55 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:327.55,329.6 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:333.34,334.142 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:339.34,340.142 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:334.142,336.6 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:336.11,338.6 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:340.142,342.6 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:342.11,344.6 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:348.18,350.5 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:353.160,355.5 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:365.66,368.98 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:378.2,378.12 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:368.98,371.49 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:371.49,375.4 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:383.96,388.52 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:427.2,427.30 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:388.52,391.115 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:391.115,393.76 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:393.76,396.66 3 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:396.66,397.46 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:398.56,406.28 7 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:408.55,410.21 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:413.7,413.36 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:414.57,415.114 1 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:416.66,416.66 0 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:418.50,418.50 0 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:410.21,412.8 1 0 -e2mgr/handlers/x2setupResponseToProtobuf.go:430.198,432.16 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:436.2,437.39 2 1 -e2mgr/handlers/x2setupResponseToProtobuf.go:432.16,434.3 1 0 -e2mgr/handlers/enb_load_information_notification_handler.go:17.134,21.2 1 1 -e2mgr/handlers/enb_load_information_notification_handler.go:23.43,25.2 1 1 -e2mgr/handlers/enb_load_information_notification_handler.go:27.201,42.16 2 1 -e2mgr/handlers/enb_load_information_notification_handler.go:47.2,53.18 4 1 -e2mgr/handlers/enb_load_information_notification_handler.go:58.2,62.20 3 1 -e2mgr/handlers/enb_load_information_notification_handler.go:67.2,67.190 1 1 -e2mgr/handlers/enb_load_information_notification_handler.go:42.16,45.3 2 1 -e2mgr/handlers/enb_load_information_notification_handler.go:53.18,56.3 2 0 -e2mgr/handlers/enb_load_information_notification_handler.go:62.20,65.3 2 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:39.80,43.36 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:53.2,53.104 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:71.2,71.18 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:43.36,46.100 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:46.100,48.4 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:48.9,50.4 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:53.104,56.55 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:56.55,59.130 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:67.4,67.68 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:59.130,62.73 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:62.73,64.6 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:74.78,81.2 4 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:83.134,86.63 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:92.2,92.63 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:98.2,98.55 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:104.2,104.55 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:110.2,110.21 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:86.63,88.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:88.8,90.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:92.63,94.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:94.8,96.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:98.55,100.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:100.8,102.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:104.55,106.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:106.8,108.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:113.134,116.60 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:123.2,123.52 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:129.2,129.21 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:116.60,118.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:118.8,121.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:123.52,125.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:125.8,127.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:132.168,135.63 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:141.2,141.63 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:147.2,147.21 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:135.63,137.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:137.8,139.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:141.63,143.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:143.8,145.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:149.168,152.60 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:158.2,158.21 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:152.60,154.3 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:154.8,156.3 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:161.121,164.131 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:199.2,199.24 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:164.131,167.54 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:167.54,175.32 5 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:180.4,180.36 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:183.4,183.46 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:194.4,194.41 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:175.32,178.5 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:180.36,182.5 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:184.71,185.200 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:189.71,190.200 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:185.200,187.6 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:190.200,192.6 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:202.125,205.146 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:257.2,257.27 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:205.146,208.109 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:208.109,217.42 6 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:221.4,221.46 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:225.4,225.117 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:232.4,232.47 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:247.4,248.18 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:251.4,253.55 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:217.42,219.5 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:221.46,223.5 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:225.117,228.55 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:228.55,230.6 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:233.55,234.166 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:239.55,240.166 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:234.166,236.6 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:236.11,238.6 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:240.166,242.6 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:242.11,244.6 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:248.18,250.5 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:263.100,268.52 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:315.2,315.29 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:268.52,271.119 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:271.119,273.84 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:273.84,276.74 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:276.74,277.116 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:277.116,279.41 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:280.63,282.112 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:306.60,306.60 0 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:282.112,285.86 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:285.86,286.58 1 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:287.68,290.64 3 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:296.89,298.25 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:301.11,302.42 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:290.64,295.12 4 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:298.25,300.12 1 0 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:318.202,320.16 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:324.2,325.43 2 1 -e2mgr/handlers/endc_x2setupResponseToProtobuf.go:320.16,322.3 1 0 -e2mgr/handlers/ranLostConnectionHandler.go:36.153,41.2 1 1 -e2mgr/handlers/ranLostConnectionHandler.go:43.91,49.86 4 1 -e2mgr/handlers/ranLostConnectionHandler.go:63.2,65.8 3 1 -e2mgr/handlers/ranLostConnectionHandler.go:49.86,51.3 1 1 -e2mgr/handlers/ranLostConnectionHandler.go:51.8,55.83 4 1 -e2mgr/handlers/ranLostConnectionHandler.go:55.83,57.4 1 1 -e2mgr/handlers/ranLostConnectionHandler.go:57.9,61.4 2 1 -e2mgr/handlers/ranLostConnectionHandler.go:65.8,68.3 2 1 -e2mgr/handlers/ranLostConnectionHandler.go:72.70,73.28 1 1 -e2mgr/handlers/ranLostConnectionHandler.go:74.131,75.63 1 1 -e2mgr/handlers/ranLostConnectionHandler.go:76.46,77.153 1 1 -e2mgr/handlers/ranLostConnectionHandler.go:78.10,79.60 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:31.162,34.16 2 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:38.2,41.159 3 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:45.2,45.27 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:50.2,50.17 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:34.16,36.3 1 0 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:41.159,43.3 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:45.27,48.3 2 0 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:78.158,81.16 2 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:85.2,88.132 3 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:92.2,92.27 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:97.2,97.17 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:81.16,83.3 1 0 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:88.132,90.3 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:92.27,95.3 2 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:100.175,102.16 2 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:106.2,109.27 3 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:115.2,115.62 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:102.16,104.3 1 1 -e2mgr/handlers/x2apPdu_asn1_unpacker.go:109.27,113.3 3 1 -e2mgr/handlers/x2apSetup_response_notification_handler.go:33.91,38.16 3 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:42.2,44.8 2 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:38.16,40.3 1 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:44.8,45.17 1 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:69.3,70.44 2 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:45.17,60.87 12 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:60.87,62.5 1 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:62.10,64.30 2 0 -e2mgr/handlers/x2apSetup_response_notification_handler.go:64.30,66.6 1 0 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:36.78,37.25 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:51.2,51.12 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:38.31,40.130 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:41.28,43.131 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:44.27,46.113 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:47.23,49.128 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:54.114,57.37 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:63.2,63.41 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:71.2,71.44 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:79.2,79.171 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:98.2,98.22 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:57.37,61.3 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:63.41,64.22 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:67.3,67.93 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:64.22,66.4 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:71.44,72.22 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:75.3,75.93 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:72.22,74.4 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:79.171,80.22 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:83.3,87.91 5 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:95.3,95.67 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:80.22,82.4 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:87.91,94.4 4 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:102.90,105.54 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:138.2,138.27 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:105.54,108.120 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:108.120,110.74 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:110.74,113.64 3 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:113.64,114.34 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:114.34,115.46 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:116.49,119.22 3 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:122.54,123.131 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:124.66,126.66 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:119.22,121.9 1 0 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:126.66,128.9 1 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:128.14,130.9 1 0 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:141.192,143.16 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:147.2,149.46 2 1 -e2mgr/handlers/x2setupFailureResponseToProtobuf.go:143.16,145.3 1 0 -e2mgr/handlers/delete_all_request_handler.go:41.68,47.2 1 1 -e2mgr/handlers/delete_all_request_handler.go:49.158,52.16 2 1 -e2mgr/handlers/delete_all_request_handler.go:56.2,56.26 1 1 -e2mgr/handlers/delete_all_request_handler.go:61.2,68.16 6 1 -e2mgr/handlers/delete_all_request_handler.go:72.2,72.12 1 1 -e2mgr/handlers/delete_all_request_handler.go:52.16,54.3 1 1 -e2mgr/handlers/delete_all_request_handler.go:56.26,58.3 1 1 -e2mgr/handlers/delete_all_request_handler.go:68.16,70.3 1 0 -e2mgr/handlers/delete_all_request_handler.go:75.116,78.16 2 1 -e2mgr/handlers/delete_all_request_handler.go:83.2,83.30 1 1 -e2mgr/handlers/delete_all_request_handler.go:87.2,87.42 1 1 -e2mgr/handlers/delete_all_request_handler.go:105.2,106.18 2 1 -e2mgr/handlers/delete_all_request_handler.go:78.16,81.3 2 1 -e2mgr/handlers/delete_all_request_handler.go:83.30,85.3 1 1 -e2mgr/handlers/delete_all_request_handler.go:87.42,91.17 2 1 -e2mgr/handlers/delete_all_request_handler.go:97.3,97.20 1 1 -e2mgr/handlers/delete_all_request_handler.go:102.3,102.55 1 1 -e2mgr/handlers/delete_all_request_handler.go:91.17,94.12 2 1 -e2mgr/handlers/delete_all_request_handler.go:97.20,100.12 2 1 -e2mgr/handlers/delete_all_request_handler.go:109.142,112.18 2 1 -e2mgr/handlers/delete_all_request_handler.go:116.2,120.16 3 1 -e2mgr/handlers/delete_all_request_handler.go:126.2,126.27 1 1 -e2mgr/handlers/delete_all_request_handler.go:112.18,114.3 1 1 -e2mgr/handlers/delete_all_request_handler.go:120.16,124.3 2 1 -e2mgr/handlers/delete_all_request_handler.go:126.27,129.3 1 0 -e2mgr/handlers/delete_all_request_handler.go:132.146,134.65 1 1 -e2mgr/handlers/delete_all_request_handler.go:138.2,138.70 1 1 -e2mgr/handlers/delete_all_request_handler.go:143.2,147.16 3 1 -e2mgr/handlers/delete_all_request_handler.go:153.2,153.137 1 1 -e2mgr/handlers/delete_all_request_handler.go:134.65,136.3 1 1 -e2mgr/handlers/delete_all_request_handler.go:138.70,141.3 2 0 -e2mgr/handlers/delete_all_request_handler.go:147.16,151.3 2 1 diff --git a/E2Manager/go.mod b/E2Manager/go.mod index 704fd19..e9e73e4 100644 --- a/E2Manager/go.mod +++ b/E2Manager/go.mod @@ -1,9 +1,9 @@ module e2mgr require ( - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.18 - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.18 - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.18 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.19 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.19 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.19 gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.2.0 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/go-ozzo/ozzo-validation v3.5.0+incompatible diff --git a/E2Manager/go.sum b/E2Manager/go.sum index 899696d..dde69c2 100644 --- a/E2Manager/go.sum +++ b/E2Manager/go.sum @@ -11,6 +11,8 @@ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.17 h1:yaAQwkAkgDTbWDQA5 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.17/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.18 h1:JuWtnrDLcqEnZz3cMLQkJ/2cy/3AscuZuef8jkvidHs= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.18/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.19 h1:b6ggNQ4PdWxCkQupfus80nsCs0YD84u+cGc+nQ2W560= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.19/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.8 h1:25mglk3nUhSkVYnpxJH2SF9SccY2ecLio/OGBsJLNjk= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.8/go.mod h1:GXiXLz4ORBeIr0FLIbzENRykgh3Po5uPkX2jICxnRF0= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.9 h1:433mb6o1LXwDDxuq2k8NOWbo68HHgdlfxZo0s8X6n7g= @@ -23,6 +25,8 @@ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.17 h1:cigXR/l8U2NNXg2 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.17/go.mod h1:GXiXLz4ORBeIr0FLIbzENRykgh3Po5uPkX2jICxnRF0= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.18 h1:BKszWTZv/JpYn0vadQXUg8Ol8qqIrjFHs9BY58BHTtw= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.18/go.mod h1:GXiXLz4ORBeIr0FLIbzENRykgh3Po5uPkX2jICxnRF0= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.19 h1:5VGHtsiGnR/VfcsqhbKVScUTLBgoePp1KhSVylwlFKM= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.19/go.mod h1:GXiXLz4ORBeIr0FLIbzENRykgh3Po5uPkX2jICxnRF0= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.8 h1:nvJjn4VyRGuyp5irasfFSPKW4zNDTh12sfky53UaqL4= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.8/go.mod h1:wqyKCJkXzU/UqeuRBUv3QrMHYVI544wdoMav3aeJXdE= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.9 h1:ziuiw/eX0zBqdEGTz3Jdvp9KbirFt5mwjk6bx7c20pc= @@ -35,6 +39,8 @@ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.17 h1:VnCLibET0jepZUBMp gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.17/go.mod h1:kdgMqHn3InTc9qj24qbzXJo6zAyF1YTKDI/rca868pQ= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.18 h1:pkpyFGLV7hPd8AnheMnDl6r5a5gtIANjXhqLZmMxUz8= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.18/go.mod h1:kdgMqHn3InTc9qj24qbzXJo6zAyF1YTKDI/rca868pQ= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.19 h1:WwUWG3mp2uU9ouqAzj4d6dUGZUA+2HmutQBiH4s4UIw= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.19/go.mod h1:7fQ7/R9hBsCi5g6444ySaavYLB+/aCsCyDEiqWK+L34= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.1.1 h1:D2fU0/YXdqSNYsmptSBbkDfG76uBFKjnhQiq5cD4WT4= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.1.1/go.mod h1:2Y8gw2jqj9urI8VFqFQn7BX0J3A852+YrXVV9V8gOt4= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.2.0 h1:7edCLIQtk9xCwxTtLRUlXr8wQ6nmr/Mo4ZoqjF3m0NE= diff --git a/E2Manager/handlers/ranLostConnectionHandler.go b/E2Manager/handlers/ranLostConnectionHandler.go index 33c4948..7e14080 100644 --- a/E2Manager/handlers/ranLostConnectionHandler.go +++ b/E2Manager/handlers/ranLostConnectionHandler.go @@ -19,61 +19,28 @@ package handlers import ( "e2mgr/logger" + "e2mgr/managers" "e2mgr/models" - "e2mgr/rNibWriter" "e2mgr/sessions" - "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" ) -type RanLostConnectionHandler struct{ - rnibReaderProvider func() reader.RNibReader - rnibWriterProvider func() rNibWriter.RNibWriter +type RanLostConnectionHandler struct { + ranReconnectionManager *managers.RanReconnectionManager } -func NewRanLostConnectionHandler(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) RanLostConnectionHandler { +func NewRanLostConnectionHandler(ranReconnectionManager *managers.RanReconnectionManager) RanLostConnectionHandler { return RanLostConnectionHandler{ - rnibReaderProvider: rnibReaderProvider, - rnibWriterProvider: rnibWriterProvider, + ranReconnectionManager: ranReconnectionManager, } } -func (src RanLostConnectionHandler) Handle(logger *logger.Logger, e2Sessions sessions.E2Sessions, - request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) { +func (handler RanLostConnectionHandler) Handle(logger *logger.Logger, e2Sessions sessions.E2Sessions, request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) { logger.Warnf("#ranLostConnectionHandler.Handle - Received lost connection (transaction id = %s): %s", request.TransactionId, request.Payload) - var nb *entities.NodebInfo - var rNibErr common.IRNibError - if nb, rNibErr = src.rnibReaderProvider().GetNodeb(request.RanName); rNibErr != nil { - logger.Errorf("#ranLostConnectionHandler.Handle - transactionId %s: rNib reader failed to retrieve nb entity with RanName: %s. Error: %s", request.TransactionId, request.RanName, rNibErr.Error()) - } else { - logger.Debugf("#ranLostConnectionHandler.Handle - transactionId %s: nb entity has been retrieved. RanName %s, ConnectionStatus %s", request.TransactionId, nb.RanName, nb.ConnectionStatus) - changeNodebState(logger, nb) - nbIdentity := &entities.NbIdentity{InventoryName:nb.RanName, GlobalNbId:nb.GlobalNbId} - if rNibErr = src.rnibWriterProvider().SaveNodeb(nbIdentity, nb); rNibErr != nil { - logger.Errorf("#ranLostConnectionHandler.Handle - transactionId %s: rNibWriter failed to save nb entity %s. Error: %s", request.TransactionId, nb.RanName, rNibErr.Error()) - } else { - logger.Infof("#ranLostConnectionHandler.Handle - transactionId %s: saved to rNib. RanName %s, ConnectionStatus %v", request.TransactionId, nb.RanName, nb.ConnectionStatus) - } - } - e2session, ok := e2Sessions[request.TransactionId] - printHandlingSetupResponseElapsedTimeInMs(logger, "#ranLostConnectionHandler.Handle - Summary: Elapsed time for receiving and handling sctp error response from E2 terminator", request.StartTime) - if ok { - printHandlingSetupResponseElapsedTimeInMs(logger, fmt.Sprintf("#ranLostConnectionHandler.Handle- Summary: Total roundtrip elapsed time for transactionId %s", request.TransactionId), e2session.SessionStart) - delete(e2Sessions, request.TransactionId) // Avoid pinning memory (help GC) - } - -} + err := handler.ranReconnectionManager.ReconnectRan(request.RanName) -func changeNodebState(logger *logger.Logger, nb *entities.NodebInfo) { - switch nb.ConnectionStatus{ - case entities.ConnectionStatus_CONNECTED, entities.ConnectionStatus_CONNECTING, entities.ConnectionStatus_CONNECTED_SETUP_FAILED: - nb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - case entities.ConnectionStatus_DISCONNECTED: - logger.Infof("#ranLostConnectionHandler.changeNodebState - nb entity with ConnectionStatus %v occurred. RanName: %s", nb.ConnectionStatus, nb.RanName) - default: - nb.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN + if err != nil { + logger.Errorf("#ranLostConnectionHandler.Handle - An error occurred while trying to reconnect RAN, %v", err) + return } } diff --git a/E2Manager/handlers/ranLostConnectionHandler_test.go b/E2Manager/handlers/ranLostConnectionHandler_test.go index c54899b..0a315ff 100644 --- a/E2Manager/handlers/ranLostConnectionHandler_test.go +++ b/E2Manager/handlers/ranLostConnectionHandler_test.go @@ -1,328 +1,328 @@ +//// +//// 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. +//// // -// Copyright 2019 AT&T Intellectual Property -// Copyright 2019 Nokia +package handlers // -// 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 +//import ( +// "e2mgr/logger" +// "e2mgr/mocks" +// "e2mgr/models" +// "e2mgr/rNibWriter" +// "e2mgr/rmrCgo" +// "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/stretchr/testify/mock" +// "testing" +// "time" +//) // -// http://www.apache.org/licenses/LICENSE-2.0 +///* +// * Test an error response while in an x2 setup request session +// */ +//func TestHandleInSession(t *testing.T){ +// log, err := logger.InitLogger(logger.InfoLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleInSession - failed to initialize logger, error: %s", err) +// } // -// 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. +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) // - -package handlers - -import ( - "e2mgr/logger" - "e2mgr/mocks" - "e2mgr/models" - "e2mgr/rNibWriter" - "e2mgr/rmrCgo" - "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/stretchr/testify/mock" - "testing" - "time" -) - -/* - * Test an error response while in an x2 setup request session - */ -func TestHandleInSession(t *testing.T){ - log, err := logger.InitLogger(logger.InfoLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleInSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - xaction := []byte(fmt.Sprintf("%32s", "1234")) - e2Sessions[string(xaction)] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, - StartTime: time.Now(), TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} - var rnibErr common.IRNibError - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} - writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) - - 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) ) - } -} - -/* - * Test an error response triggered by the E2 Term - */ - -func TestHandleNoSession(t *testing.T){ - log, err := logger.InitLogger(logger.InfoLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - transactionId := "1234" - xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) - e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), - TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} - var rnibErr common.IRNibError - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} - writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) - - h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) - - if _, ok := e2Sessions[transactionId]; !ok { - t.Errorf("want: session entry for %s, got: no session entry", transactionId ) - } -} -/* - * Test an error response triggered by the E2 Term - */ -func TestHandleUnsolicitedDisconnectionConnectedSuccess(t *testing.T){ - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - transactionId := "1234" - xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) - e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), - TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} - var rnibErr common.IRNibError - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} - writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) - - h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) -} - -func TestHandleUnsolicitedDisconnectionNotConnectedSuccess(t *testing.T){ - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - transactionId := "1234" - xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) - e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), - TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} - var rnibErr common.IRNibError - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} - writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) - - h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) -} - -func TestHandleUnsolicitedDisconnectionShuttingDownSuccess(t *testing.T){ - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - transactionId := "1234" - xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) - e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), - TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} - var rnibErr common.IRNibError - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) - - h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) -} - -func TestHandleUnsolicitedDisconnectionShutDownSuccess(t *testing.T){ - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - transactionId := "1234" - xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) - e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), - TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - var rnibErr common.IRNibError - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} - writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) - - h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) -} - -func TestHandleUnsolicitedDisconnectionReaderFailure(t *testing.T){ - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - transactionId := "1234" - xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) - e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), - TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - var nb *entities.NodebInfo - rnibErr := common.RNibError{} - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) -} - -func TestHandleUnsolicitedDisconnectionWriterFailure(t *testing.T){ - log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ - t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) - } - - readerMock :=&mocks.RnibReaderMock{} - rnibReaderProvider := func() reader.RNibReader { - return readerMock - } - writerMock := &mocks.RnibWriterMock{} - rnibWriterProvider := func() rNibWriter.RNibWriter { - return writerMock - } - h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) - - e2Sessions := make(sessions.E2Sessions) - transactionId := "1234" - xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) - e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} - payload := []byte("Error") - mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) - notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), - TransactionId: string(xaction)} - var messageChannel chan<- *models.NotificationResponse - - nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} - var rnibErr common.IRNibError - readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) - updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} - writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(common.RNibError{}) - - h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) -} +// e2Sessions := make(sessions.E2Sessions) +// xaction := []byte(fmt.Sprintf("%32s", "1234")) +// e2Sessions[string(xaction)] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, +// StartTime: time.Now(), TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} +// var rnibErr common.IRNibError +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} +// writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) +// +// 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) ) +// } +//} +// +///* +// * Test an error response triggered by the E2 Term +// */ +// +//func TestHandleNoSession(t *testing.T){ +// log, err := logger.InitLogger(logger.InfoLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) +// } +// +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) +// +// e2Sessions := make(sessions.E2Sessions) +// transactionId := "1234" +// xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) +// e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), +// TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} +// var rnibErr common.IRNibError +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} +// writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) +// +// h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) +// +// if _, ok := e2Sessions[transactionId]; !ok { +// t.Errorf("want: session entry for %s, got: no session entry", transactionId ) +// } +//} +///* +// * Test an error response triggered by the E2 Term +// */ +//func TestHandleUnsolicitedDisconnectionConnectedSuccess(t *testing.T){ +// log, err := logger.InitLogger(logger.DebugLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) +// } +// +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) +// +// e2Sessions := make(sessions.E2Sessions) +// transactionId := "1234" +// xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) +// e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), +// TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} +// var rnibErr common.IRNibError +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} +// writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) +// +// h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) +//} +// +//func TestHandleUnsolicitedDisconnectionNotConnectedSuccess(t *testing.T){ +// log, err := logger.InitLogger(logger.DebugLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) +// } +// +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) +// +// e2Sessions := make(sessions.E2Sessions) +// transactionId := "1234" +// xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) +// e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), +// TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} +// var rnibErr common.IRNibError +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} +// writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) +// +// h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) +//} +// +//func TestHandleUnsolicitedDisconnectionShuttingDownSuccess(t *testing.T){ +// log, err := logger.InitLogger(logger.DebugLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) +// } +// +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) +// +// e2Sessions := make(sessions.E2Sessions) +// transactionId := "1234" +// xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) +// e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), +// TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUTTING_DOWN,} +// var rnibErr common.IRNibError +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} +// writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) +// +// h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) +//} +// +//func TestHandleUnsolicitedDisconnectionShutDownSuccess(t *testing.T){ +// log, err := logger.InitLogger(logger.DebugLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) +// } +// +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) +// +// e2Sessions := make(sessions.E2Sessions) +// transactionId := "1234" +// xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) +// e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), +// TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} +// var rnibErr common.IRNibError +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_SHUT_DOWN,} +// writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(rnibErr) +// +// h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) +//} +// +//func TestHandleUnsolicitedDisconnectionReaderFailure(t *testing.T){ +// log, err := logger.InitLogger(logger.DebugLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) +// } +// +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) +// +// e2Sessions := make(sessions.E2Sessions) +// transactionId := "1234" +// xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) +// e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), +// TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// var nb *entities.NodebInfo +// rnibErr := common.RNibError{} +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) +//} +// +//func TestHandleUnsolicitedDisconnectionWriterFailure(t *testing.T){ +// log, err := logger.InitLogger(logger.DebugLevel) +// if err!=nil{ +// t.Errorf("#sctp_errors_notification_handler_test.TestHandleNoSession - failed to initialize logger, error: %s", err) +// } +// +// readerMock :=&mocks.RnibReaderMock{} +// rnibReaderProvider := func() reader.RNibReader { +// return readerMock +// } +// writerMock := &mocks.RnibWriterMock{} +// rnibWriterProvider := func() rNibWriter.RNibWriter { +// return writerMock +// } +// h := NewRanLostConnectionHandler(rnibReaderProvider,rnibWriterProvider) +// +// e2Sessions := make(sessions.E2Sessions) +// transactionId := "1234" +// xaction := []byte(fmt.Sprintf("%32s", transactionId+"6")) +// e2Sessions[transactionId] = sessions.E2SessionDetails{SessionStart: time.Now()} +// payload := []byte("Error") +// mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction) +// notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload, StartTime: time.Now(), +// TransactionId: string(xaction)} +// var messageChannel chan<- *models.NotificationResponse +// +// nb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_CONNECTED,} +// var rnibErr common.IRNibError +// readerMock.On("GetNodeb", mBuf.Meid).Return(nb, rnibErr) +// updatedNb := &entities.NodebInfo{RanName:mBuf.Meid, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED,} +// writerMock.On("SaveNodeb", mock.Anything, updatedNb).Return(common.RNibError{}) +// +// h.Handle(log,e2Sessions, ¬ificationRequest, messageChannel) +//} diff --git a/E2Manager/handlers/setup_request_handler.go b/E2Manager/handlers/setup_request_handler.go index 146bdfb..f9c031b 100644 --- a/E2Manager/handlers/setup_request_handler.go +++ b/E2Manager/handlers/setup_request_handler.go @@ -93,24 +93,6 @@ func (SetupRequestHandler) CreateMessage(logger *logger.Logger, requestDetails * wg.Done() } -func asn1bstringToString(val []byte, numBits uint) string { - // Take the last byte - c := val[len(val)-1] - - b := numBits % 8 - - // If num bits is not evenly divisable by 8 ... - if b != 0 { - // ... shift the value to the higher bits (in our case: 0x0b -> 0xb0) - c <<= 8 - b - } - - if len(val) == 1 { - return fmt.Sprintf("%02x", c) - } - return fmt.Sprintf("%02x%02x", val[:len(val)-1], c) -} - //Expected value in RIC_ID = pLMN_Identity-eNB_ID/ //<6 hex digits>-<6 or 8 hex digits>/<18|20|21|28> //Each byte is represented by two hex digits, the value in the lowest byte of the eNB_ID must be assigned to the lowest bits diff --git a/E2Manager/main/http_server.go b/E2Manager/main/http_server.go index 4a7b969..f9b27e1 100644 --- a/E2Manager/main/http_server.go +++ b/E2Manager/main/http_server.go @@ -22,6 +22,7 @@ import ( "e2mgr/controllers" "e2mgr/logger" "e2mgr/managers" + "e2mgr/managers/notificationmanager" "e2mgr/models" "e2mgr/rNibWriter" "e2mgr/rmrCgo" @@ -35,7 +36,7 @@ import ( "os" ) -const MAX_RNIB_PULL_INSTANCES = 4 +const MAX_RNIB_POOL_INSTANCES = 4 func main() { config := configuration.ParseConfiguration() @@ -47,14 +48,18 @@ func main() { } rmrConfig := services.NewRmrConfig(config.Rmr.Port, config.Rmr.MaxMsgSize, 0, logger) var msgImpl *rmrCgo.Context - rNibWriter.Init("e2Manager", MAX_RNIB_PULL_INSTANCES) + rNibWriter.Init("e2Manager", MAX_RNIB_POOL_INSTANCES) defer rNibWriter.Close() - reader.Init("e2Manager", MAX_RNIB_PULL_INSTANCES) + reader.Init("e2Manager", MAX_RNIB_POOL_INSTANCES) defer reader.Close() - var nManager = managers.NewNotificationManager(reader.GetRNibReader, rNibWriter.GetRNibWriter) rmrResponseChannel := make(chan *models.NotificationResponse, config.NotificationResponseBuffer) rmrService := services.NewRmrService(rmrConfig, msgImpl, controllers.E2Sessions, rmrResponseChannel) + + var ranSetupManager = managers.NewRanSetupManager(logger, rmrService, reader.GetRNibReader, 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) defer rmrService.CloseContext() go rmrServiceReceiver.ListenAndHandle() @@ -79,4 +84,4 @@ func runServer(rmrService *services.RmrService, logger *logger.Logger, config *c if err := http.ListenAndServe(port, router); err != nil { log.Fatalf("#runNodebServer - fail to start http server. Error: %v", err) } -} \ No newline at end of file +} diff --git a/E2Manager/managers/notification_manager.go b/E2Manager/managers/notificationmanager/notification_manager.go similarity index 77% rename from E2Manager/managers/notification_manager.go rename to E2Manager/managers/notificationmanager/notification_manager.go index 5533c52..7955245 100644 --- a/E2Manager/managers/notification_manager.go +++ b/E2Manager/managers/notificationmanager/notification_manager.go @@ -15,12 +15,13 @@ // limitations under the License. // -package managers +package notificationmanager import ( "e2mgr/logger" + "e2mgr/managers" "e2mgr/models" - "e2mgr/providers" + "e2mgr/providers/rmrmsghandlerprovider" "e2mgr/rNibWriter" "e2mgr/rmrCgo" "e2mgr/sessions" @@ -30,11 +31,11 @@ import ( ) type NotificationManager struct { - notificationHandlerProvider *providers.NotificationHandlerProvider + notificationHandlerProvider *rmrmsghandlerprovider.NotificationHandlerProvider } -func NewNotificationManager(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *NotificationManager { - notificationHandlerProvider := providers.NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider) +func NewNotificationManager(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) *NotificationManager { + notificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) return &NotificationManager{ notificationHandlerProvider: notificationHandlerProvider, diff --git a/E2Manager/managers/ran_reconnection_manager.go b/E2Manager/managers/ran_reconnection_manager.go new file mode 100644 index 0000000..f4a3c35 --- /dev/null +++ b/E2Manager/managers/ran_reconnection_manager.go @@ -0,0 +1,87 @@ +package managers + +import ( + "e2mgr/configuration" + "e2mgr/logger" + "e2mgr/rNibWriter" + "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" +) + +type RanReconnectionManager struct { + logger *logger.Logger + config *configuration.Configuration + rnibReaderProvider func() reader.RNibReader + rnibWriterProvider func() rNibWriter.RNibWriter + ranSetupManager *RanSetupManager +} + +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: ranSetupManager, + } +} + +func (m *RanReconnectionManager) ReconnectRan(inventoryName string) error { + nodebInfo, rnibErr := m.rnibReaderProvider().GetNodeb(inventoryName) + + if rnibErr != nil { + m.logger.Errorf("#ReconnectRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, rnibErr) + return rnibErr + } + + if !m.canReconnectRan(nodebInfo) { + m.logger.Warnf("#ReconnectRan - RAN name: %s - Cannot reconnect RAN", inventoryName) + return m.setConnectionStatusOfUnconnectableRan(nodebInfo) + } + + err := m.ranSetupManager.ExecuteSetup(nodebInfo) + + if err != nil { + m.logger.Errorf("#ReconnectRan - RAN name: %s - Failed executing setup. Error: %v", inventoryName, err) + return err + } + + m.logger.Infof("#ReconnectRan - RAN name: %s - Successfully done executing setup", inventoryName) + return nil +} + +func (m *RanReconnectionManager) canReconnectRan(nodebInfo *entities.NodebInfo) bool { + connectionStatus := nodebInfo.GetConnectionStatus() + return connectionStatus != entities.ConnectionStatus_SHUT_DOWN && connectionStatus != entities.ConnectionStatus_SHUTTING_DOWN && + int(nodebInfo.GetConnectionAttempts()) < m.config.MaxConnectionAttempts +} + +func (m *RanReconnectionManager) updateNodebInfoStatus(nodebInfo *entities.NodebInfo, connectionStatus entities.ConnectionStatus) common.IRNibError { + nodebInfo.ConnectionStatus = connectionStatus; + err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo) + + if err != nil { + m.logger.Errorf("#updateNodebInfoStatus - RAN name: %s - Failed updating RAN's connection status to %s in rNib. Error: %v", nodebInfo.RanName, connectionStatus, err) + return err + } + + m.logger.Infof("#updateNodebInfoStatus - RAN name: %s - Successfully updated RAN's connection status to %s in rNib", nodebInfo.RanName, connectionStatus) + return nil +} + +func (m *RanReconnectionManager) setConnectionStatusOfUnconnectableRan(nodebInfo *entities.NodebInfo) common.IRNibError { + connectionStatus := nodebInfo.GetConnectionStatus() + m.logger.Warnf("#setConnectionStatusOfUnconnectableRan - RAN name: %s, RAN's connection status: %s, RAN's connection attempts: %d", nodebInfo.RanName, nodebInfo.ConnectionStatus, nodebInfo.ConnectionAttempts) + + if connectionStatus == entities.ConnectionStatus_SHUTTING_DOWN { + return m.updateNodebInfoStatus(nodebInfo, entities.ConnectionStatus_SHUT_DOWN) + } + + if int(nodebInfo.GetConnectionAttempts()) >= m.config.MaxConnectionAttempts { + m.logger.Warnf("#setConnectionStatusOfUnconnectableRan - RAN name: %s - RAN's connection attempts are greater than %d", nodebInfo.RanName, m.config.MaxConnectionAttempts) + return m.updateNodebInfoStatus(nodebInfo, entities.ConnectionStatus_DISCONNECTED) + } + + return nil +} diff --git a/E2Manager/managers/ran_setup_manager.go b/E2Manager/managers/ran_setup_manager.go new file mode 100644 index 0000000..6551abc --- /dev/null +++ b/E2Manager/managers/ran_setup_manager.go @@ -0,0 +1,28 @@ +package managers + +import ( + "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" +) + +type RanSetupManager struct { + logger *logger.Logger + rnibReaderProvider func() reader.RNibReader + rnibWriterProvider func() rNibWriter.RNibWriter + rmrService *services.RmrService +} + +func NewRanSetupManager(logger *logger.Logger, rmrService *services.RmrService, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *RanSetupManager { + return &RanSetupManager{ + logger: logger, + rnibReaderProvider: rnibReaderProvider, + rnibWriterProvider: rnibWriterProvider, + } +} + +func (m *RanSetupManager) ExecuteSetup(nodebInfo *entities.NodebInfo) error { + return nil +} diff --git a/E2Manager/mocks/rnibWriterMock.go b/E2Manager/mocks/rnibWriterMock.go index cae77cd..cb17fe1 100644 --- a/E2Manager/mocks/rnibWriterMock.go +++ b/E2Manager/mocks/rnibWriterMock.go @@ -39,6 +39,18 @@ func (rnibWriterMock *RnibWriterMock) SaveNodeb(nbIdentity *entities.NbIdentity, return nil } +func (rnibWriterMock *RnibWriterMock) UpdateNodebInfo(nodebInfo *entities.NodebInfo) common.IRNibError { + args := rnibWriterMock.Called(nodebInfo) + + errArg := args.Get(0) + + if errArg != nil { + return errArg.(common.IRNibError) + } + + return nil +} + func (rnibWriterMock *RnibWriterMock) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) common.IRNibError { args := rnibWriterMock.Called(inventoryName, ranLoadInformation) @@ -50,4 +62,3 @@ func (rnibWriterMock *RnibWriterMock) SaveRanLoadInformation(inventoryName strin return nil } - diff --git a/E2Manager/providers/incoming_request_handler_provider.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go similarity index 78% rename from E2Manager/providers/incoming_request_handler_provider.go rename to E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go index dc42966..e461bfc 100644 --- a/E2Manager/providers/incoming_request_handler_provider.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go @@ -15,7 +15,7 @@ // limitations under the License. // -package providers +package httpmsghandlerprovider import ( "e2mgr/configuration" @@ -29,31 +29,31 @@ import ( type IncomingRequest string -const( +const ( ShutdownRequest IncomingRequest = "Shutdown" - ResetRequest IncomingRequest = "Reset" + ResetRequest IncomingRequest = "Reset" ) -type IncomingRequestHandlerProvider struct{ +type IncomingRequestHandlerProvider struct { requestMap map[IncomingRequest]handlers.RequestHandler - logger *logger.Logger + logger *logger.Logger } func NewIncomingRequestHandlerProvider(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter, rNibReaderProvider func() reader.RNibReader) *IncomingRequestHandlerProvider { return &IncomingRequestHandlerProvider{ - requestMap: initRequestHandlerMap(rmrService, config, rNibWriterProvider, rNibReaderProvider), - logger: logger, + requestMap: initRequestHandlerMap(rmrService, config, rNibWriterProvider, rNibReaderProvider), + logger: logger, } } -func initRequestHandlerMap(rmrService *services.RmrService,config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter, +func initRequestHandlerMap(rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter, rNibReaderProvider func() reader.RNibReader) map[IncomingRequest]handlers.RequestHandler { return map[IncomingRequest]handlers.RequestHandler{ ShutdownRequest: handlers.NewDeleteAllRequestHandler(rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer - ResetRequest: handlers.NewX2ResetRequestHandler(rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer + ResetRequest: handlers.NewX2ResetRequestHandler(rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer } } diff --git a/E2Manager/providers/incoming_request_handler_provider_test.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go similarity index 95% rename from E2Manager/providers/incoming_request_handler_provider_test.go rename to E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go index 481309c..718704b 100644 --- a/E2Manager/providers/incoming_request_handler_provider_test.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go @@ -15,7 +15,7 @@ // limitations under the License. // -package providers +package httpmsghandlerprovider import ( "e2mgr/configuration" @@ -39,7 +39,7 @@ func getRmrService(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) 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) + return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, make(sessions.E2Sessions), messageChannel) } func TestNewIncomingRequestHandlerProvider(t *testing.T) { @@ -106,7 +106,7 @@ func TestGetShutdownHandlerFailure(t *testing.T) { expected := &e2managererrors.InternalError{} assert.NotNil(t, actual) - if reflect.TypeOf(actual) != reflect.TypeOf(expected){ + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { t.Errorf("Error actual = %v, and Expected = %v.", actual, expected) } } @@ -117,4 +117,4 @@ func initLog(t *testing.T) *logger.Logger { t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err) } return log -} \ No newline at end of file +} diff --git a/E2Manager/providers/request_handler_provider.go b/E2Manager/providers/httpmsghandlerprovider/request_handler_provider.go similarity index 98% rename from E2Manager/providers/request_handler_provider.go rename to E2Manager/providers/httpmsghandlerprovider/request_handler_provider.go index a29f980..ce9f397 100644 --- a/E2Manager/providers/request_handler_provider.go +++ b/E2Manager/providers/httpmsghandlerprovider/request_handler_provider.go @@ -15,7 +15,7 @@ // limitations under the License. // -package providers +package httpmsghandlerprovider import ( "e2mgr/handlers" diff --git a/E2Manager/providers/request_handler_provider_test.go b/E2Manager/providers/httpmsghandlerprovider/request_handler_provider_test.go similarity index 98% rename from E2Manager/providers/request_handler_provider_test.go rename to E2Manager/providers/httpmsghandlerprovider/request_handler_provider_test.go index d8d4e74..f610126 100644 --- a/E2Manager/providers/request_handler_provider_test.go +++ b/E2Manager/providers/httpmsghandlerprovider/request_handler_provider_test.go @@ -15,7 +15,7 @@ // limitations under the License. // -package providers +package httpmsghandlerprovider import ( "e2mgr/handlers" diff --git a/E2Manager/providers/notification_handler_provider.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go similarity index 70% rename from E2Manager/providers/notification_handler_provider.go rename to E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go index cb9862e..f65dee3 100644 --- a/E2Manager/providers/notification_handler_provider.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go @@ -15,39 +15,40 @@ // limitations under the License. // -package providers +package rmrmsghandlerprovider import ( "e2mgr/handlers" + "e2mgr/managers" "e2mgr/rNibWriter" "e2mgr/rmrCgo" "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" ) -type NotificationHandlerProvider struct{ +type NotificationHandlerProvider struct { notificationHandlers map[int]handlers.NotificationHandler } -func NewNotificationHandlerProvider(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *NotificationHandlerProvider { +func NewNotificationHandlerProvider(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) *NotificationHandlerProvider { return &NotificationHandlerProvider{ - notificationHandlers: initNotificationHandlersMap(rnibReaderProvider, rnibWriterProvider), + notificationHandlers: initNotificationHandlersMap(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager), } } -func initNotificationHandlersMap(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) map[int]handlers.NotificationHandler{ - return map[int]handlers.NotificationHandler{ +func initNotificationHandlersMap(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) map[int]handlers.NotificationHandler { + return map[int]handlers.NotificationHandler{ //TODO change handlers.NotificationHandler to *handlers.NotificationHandler rmrCgo.RIC_X2_SETUP_RESP: handlers.X2SetupResponseNotificationHandler{}, rmrCgo.RIC_X2_SETUP_FAILURE: handlers.X2SetupFailureResponseNotificationHandler{}, rmrCgo.RIC_ENDC_X2_SETUP_RESP: handlers.EndcX2SetupResponseNotificationHandler{}, rmrCgo.RIC_ENDC_X2_SETUP_FAILURE: handlers.EndcX2SetupFailureResponseNotificationHandler{}, - rmrCgo.RIC_SCTP_CONNECTION_FAILURE: handlers.NewRanLostConnectionHandler(rnibReaderProvider, rnibWriterProvider), + rmrCgo.RIC_SCTP_CONNECTION_FAILURE: handlers.NewRanLostConnectionHandler(ranReconnectionManager), rmrCgo.RIC_ENB_LOAD_INFORMATION: handlers.NewEnbLoadInformationNotificationHandler(rnibWriterProvider), - rmrCgo.RIC_ENB_CONF_UPDATE: handlers.X2EnbConfigurationUpdateHandler{}, - rmrCgo.RIC_ENDC_CONF_UPDATE: handlers.EndcConfigurationUpdateHandler{}, - rmrCgo.RIC_X2_RESET_RESP: handlers.NewX2ResetResponseHandler(rnibReaderProvider), - rmrCgo.RIC_X2_RESET: handlers.NewX2ResetRequestNotificationHandler(rnibReaderProvider), + rmrCgo.RIC_ENB_CONF_UPDATE: handlers.X2EnbConfigurationUpdateHandler{}, + rmrCgo.RIC_ENDC_CONF_UPDATE: handlers.EndcConfigurationUpdateHandler{}, + rmrCgo.RIC_X2_RESET_RESP: handlers.NewX2ResetResponseHandler(rnibReaderProvider), + rmrCgo.RIC_X2_RESET: handlers.NewX2ResetRequestNotificationHandler(rnibReaderProvider), } } @@ -55,7 +56,7 @@ func (provider NotificationHandlerProvider) GetNotificationHandler(messageType i handler, ok := provider.notificationHandlers[messageType] if !ok { - return nil, fmt.Errorf("notification handler not found for message %d",messageType) + return nil, fmt.Errorf("notification handler not found for message %d", messageType) } return handler, nil diff --git a/E2Manager/providers/notification_handler_provider_test.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go similarity index 67% rename from E2Manager/providers/notification_handler_provider_test.go rename to E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go index 974de02..8c05615 100644 --- a/E2Manager/providers/notification_handler_provider_test.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go @@ -15,11 +15,18 @@ // limitations under the License. // -package providers +package rmrmsghandlerprovider import ( + "e2mgr/configuration" + "e2mgr/logger" + "e2mgr/managers" "e2mgr/mocks" + "e2mgr/models" "e2mgr/rNibWriter" + "e2mgr/services" + "e2mgr/sessions" + "e2mgr/tests" "fmt" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader" "strings" @@ -34,6 +41,10 @@ import ( */ func TestGetNotificationHandlerSuccess(t *testing.T) { + + logger := initLog(t) + rmrService := getRmrService(&mocks.RmrMessengerMock{}, logger) + readerMock := &mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock @@ -42,6 +53,10 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } + + ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibReaderProvider, rnibWriterProvider) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) + var testCases = []struct { msgType int handler handlers.NotificationHandler @@ -50,14 +65,15 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { {rmrCgo.RIC_X2_SETUP_FAILURE /*unsuccessful x2 setup response*/, handlers.X2SetupFailureResponseNotificationHandler{}}, {rmrCgo.RIC_ENDC_X2_SETUP_RESP /*successful en-dc x2 setup response*/, handlers.EndcX2SetupResponseNotificationHandler{}}, {rmrCgo.RIC_ENDC_X2_SETUP_FAILURE /*unsuccessful en-dc x2 setup response*/, handlers.EndcX2SetupFailureResponseNotificationHandler{}}, - {rmrCgo.RIC_SCTP_CONNECTION_FAILURE /*sctp errors*/, handlers.NewRanLostConnectionHandler(rnibReaderProvider, rnibWriterProvider)}, + {rmrCgo.RIC_SCTP_CONNECTION_FAILURE /*sctp errors*/, handlers.NewRanLostConnectionHandler(ranReconnectionManager)}, {rmrCgo.RIC_ENB_LOAD_INFORMATION, handlers.NewEnbLoadInformationNotificationHandler(rnibWriterProvider)}, {rmrCgo.RIC_ENB_CONF_UPDATE, handlers.X2EnbConfigurationUpdateHandler{}}, {rmrCgo.RIC_ENDC_CONF_UPDATE, handlers.EndcConfigurationUpdateHandler{}}, } + for _, tc := range testCases { - provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider) + provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) { handler, err := provider.GetNotificationHandler(tc.msgType) if err != nil { @@ -77,6 +93,10 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { */ func TestGetNotificationHandlerFailure(t *testing.T) { + + logger := initLog(t) + rmrService := getRmrService(&mocks.RmrMessengerMock{}, logger) + var testCases = []struct { msgType int errorText string @@ -92,7 +112,11 @@ func TestGetNotificationHandlerFailure(t *testing.T) { rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider) + + ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibReaderProvider, rnibWriterProvider) + 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) { _, err := provider.GetNotificationHandler(tc.msgType) if err == nil { @@ -104,3 +128,20 @@ func TestGetNotificationHandlerFailure(t *testing.T) { }) } } + +// TODO: extract to test_utils +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) +} + +// TODO: extract to test_utils +func initLog(t *testing.T) *logger.Logger { + log, err := logger.InitLogger(logger.InfoLevel) + if err != nil { + t.Errorf("#delete_all_request_handler_test.TestHandleSuccessFlow - failed to initialize logger, error: %s", err) + } + return log +} diff --git a/E2Manager/rNibWriter/rNibWriter.go b/E2Manager/rNibWriter/rNibWriter.go index 66a299e..1a0b60b 100644 --- a/E2Manager/rNibWriter/rNibWriter.go +++ b/E2Manager/rNibWriter/rNibWriter.go @@ -18,32 +18,33 @@ package rNibWriter import ( - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "errors" "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/sdlgo" "github.com/golang/protobuf/proto" ) - - var writerPool *common.Pool type rNibWriterInstance struct { sdl *common.ISdlInstance namespace string } + /* RNibWriter interface allows saving data to the redis DB - */ +*/ type RNibWriter interface { SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) common.IRNibError + UpdateNodebInfo(nodebInfo *entities.NodebInfo) common.IRNibError SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) common.IRNibError } + /* Init initializes the infrastructure required for the RNibWriter instance - */ +*/ func Init(namespace string, poolSize int) { initPool(poolSize, func() interface{} { @@ -54,27 +55,30 @@ func Init(namespace string, poolSize int) { (*obj.(*rNibWriterInstance).sdl).Close() }) } + /* InitPool initializes the writer's instances pool - */ +*/ func initPool(poolSize int, newObj func() interface{}, destroyObj func(interface{})) { writerPool = common.NewPool(poolSize, newObj, destroyObj) } + /* GetRNibWriter returns RNibWriter instance from the pool - */ +*/ func GetRNibWriter() RNibWriter { return writerPool.Get().(RNibWriter) } + /* SaveNodeb saves nodeB entity data in the redis DB according to the specified data model - */ +*/ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity *entities.NodebInfo) common.IRNibError { isNotEmptyIdentity := isNotEmpty(nbIdentity) - if isNotEmptyIdentity && entity.GetNodeType() == entities.Node_UNKNOWN{ - return common.NewValidationError(errors.New( fmt.Sprintf("#rNibWriter.saveNodeB - Unknown responding node type, entity: %v", entity))) + if isNotEmptyIdentity && entity.GetNodeType() == entities.Node_UNKNOWN { + return common.NewValidationError(errors.New(fmt.Sprintf("#rNibWriter.saveNodeB - Unknown responding node type, entity: %v", entity))) } defer writerPool.Put(w) data, err := proto.Marshal(entity) @@ -83,14 +87,14 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity * } var pairs []interface{} key, rNibErr := common.ValidateAndBuildNodeBNameKey(nbIdentity.InventoryName) - if rNibErr != nil{ + if rNibErr != nil { return rNibErr } pairs = append(pairs, key, data) if isNotEmptyIdentity { key, rNibErr = common.ValidateAndBuildNodeBIdKey(entity.GetNodeType().String(), nbIdentity.GlobalNbId.GetPlmnId(), nbIdentity.GlobalNbId.GetNbId()) - if rNibErr != nil{ + if rNibErr != nil { return rNibErr } pairs = append(pairs, key, data) @@ -98,13 +102,13 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity * if entity.GetEnb() != nil { pairs, rNibErr = appendEnbCells(nbIdentity, entity.GetEnb().GetServedCells(), pairs) - if rNibErr != nil{ + if rNibErr != nil { return rNibErr } } if entity.GetGnb() != nil { pairs, rNibErr = appendGnbCells(nbIdentity, entity.GetGnb().GetServedNrCells(), pairs) - if rNibErr != nil{ + if rNibErr != nil { return rNibErr } } @@ -115,7 +119,7 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity * ranNameIdentity := &entities.NbIdentity{InventoryName: nbIdentity.InventoryName} - if isNotEmptyIdentity{ + if isNotEmptyIdentity { nbIdData, err := proto.Marshal(ranNameIdentity) if err != nil { return common.NewInternalError(err) @@ -139,6 +143,42 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity * return nil } +/* +UpdateNodebInfo... +*/ +func (w *rNibWriterInstance) UpdateNodebInfo(nodebInfo *entities.NodebInfo) common.IRNibError { + + defer writerPool.Put(w) + + nodebNameKey, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.GetRanName()) + + if rNibErr != nil { + return rNibErr + } + + nodebIdKey, rNibErr := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId()) + + if rNibErr != nil { + return rNibErr + } + + data, err := proto.Marshal(nodebInfo) + + if err != nil { + return common.NewInternalError(err) + } + + var pairs []interface{} + pairs = append(pairs, nodebNameKey, data, nodebIdKey, data) + err = (*w.sdl).Set(pairs) + + if err != nil { + return common.NewInternalError(err) + } + + return nil +} + /* SaveRanLoadInformation stores ran load information for the provided ran */ @@ -146,7 +186,7 @@ func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoa defer writerPool.Put(w) - key, rnibErr:= common.ValidateAndBuildRanLoadInformationKey(inventoryName) + key, rnibErr := common.ValidateAndBuildRanLoadInformationKey(inventoryName) if rnibErr != nil { return rnibErr @@ -172,25 +212,25 @@ func (w *rNibWriterInstance) SaveRanLoadInformation(inventoryName string, ranLoa /* Close closes writer's pool - */ -func Close(){ +*/ +func Close() { writerPool.Close() } func appendEnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedCellInfo, pairs []interface{}) ([]interface{}, common.IRNibError) { for _, cell := range cells { - cellEntity := entities.Cell{Type:entities.Cell_LTE_CELL, Cell:&entities.Cell_ServedCellInfo{ServedCellInfo:cell}} + cellEntity := entities.Cell{Type: entities.Cell_LTE_CELL, Cell: &entities.Cell_ServedCellInfo{ServedCellInfo: cell}} cellData, err := proto.Marshal(&cellEntity) if err != nil { return pairs, common.NewInternalError(err) } key, rNibErr := common.ValidateAndBuildCellIdKey(cell.GetCellId()) - if rNibErr != nil{ + if rNibErr != nil { return pairs, rNibErr } pairs = append(pairs, key, cellData) key, rNibErr = common.ValidateAndBuildCellNamePciKey(nbIdentity.InventoryName, cell.GetPci()) - if rNibErr != nil{ + if rNibErr != nil { return pairs, rNibErr } pairs = append(pairs, key, cellData) @@ -198,20 +238,20 @@ func appendEnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedCel return pairs, nil } -func appendGnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedNRCell, pairs []interface{}) ([]interface{}, common.IRNibError) { +func appendGnbCells(nbIdentity *entities.NbIdentity, cells []*entities.ServedNRCell, pairs []interface{}) ([]interface{}, common.IRNibError) { for _, cell := range cells { - cellEntity := entities.Cell{Type:entities.Cell_NR_CELL, Cell:&entities.Cell_ServedNrCell{ServedNrCell:cell}} + cellEntity := entities.Cell{Type: entities.Cell_NR_CELL, Cell: &entities.Cell_ServedNrCell{ServedNrCell: cell}} cellData, err := proto.Marshal(&cellEntity) if err != nil { return pairs, common.NewInternalError(err) } key, rNibErr := common.ValidateAndBuildNrCellIdKey(cell.GetServedNrCellInformation().GetCellId()) - if rNibErr != nil{ + if rNibErr != nil { return pairs, rNibErr } pairs = append(pairs, key, cellData) key, rNibErr = common.ValidateAndBuildCellNamePciKey(nbIdentity.InventoryName, cell.GetServedNrCellInformation().GetNrPci()) - if rNibErr != nil{ + if rNibErr != nil { return pairs, rNibErr } pairs = append(pairs, key, cellData) diff --git a/E2Manager/rNibWriter/rNibWriter_test.go b/E2Manager/rNibWriter/rNibWriter_test.go index 92a0918..14abb1a 100644 --- a/E2Manager/rNibWriter/rNibWriter_test.go +++ b/E2Manager/rNibWriter/rNibWriter_test.go @@ -71,6 +71,95 @@ func initSdlInstanceMock(namespace string, poolSize int) *mocks.MockSdlInstance return sdlInstanceMock } +func TestUpdateNodebInfoSuccess(t *testing.T) { + inventoryName := "name" + plmnId := "02f829" + nbId := "4a952a0a" + writerPool = nil + sdlInstanceMock := initSdlInstanceMock(namespace, 1) + w := GetRNibWriter() + nodebInfo := &entities.NodebInfo{} + nodebInfo.RanName = inventoryName + nodebInfo.GlobalNbId = &entities.GlobalNbId{PlmnId: plmnId, NbId: nbId} + nodebInfo.NodeType = entities.Node_ENB + nodebInfo.ConnectionStatus = 1 + enb := entities.Enb{} + nodebInfo.Configuration = &entities.NodebInfo_Enb{Enb: &enb} + data, err := proto.Marshal(nodebInfo) + if err != nil { + t.Errorf("#rNibWriter_test.TestSaveEnb - Failed to marshal NodeB entity. Error: %v", err) + } + var e error + var setExpected []interface{} + + nodebNameKey := fmt.Sprintf("RAN:%s", inventoryName) + nodebIdKey := fmt.Sprintf("ENB:%s:%s", plmnId, nbId) + setExpected = append(setExpected, nodebNameKey, data) + setExpected = append(setExpected, nodebIdKey, data) + + sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) + + rNibErr := w.UpdateNodebInfo(nodebInfo) + assert.Nil(t, rNibErr) +} + +func TestUpdateNodebInfoMissingInventoryNameFailure(t *testing.T) { + inventoryName := "name" + plmnId := "02f829" + nbId := "4a952a0a" + writerPool = nil + sdlInstanceMock := initSdlInstanceMock(namespace, 1) + w := GetRNibWriter() + nodebInfo := &entities.NodebInfo{} + data, err := proto.Marshal(nodebInfo) + if err != nil { + t.Errorf("#rNibWriter_test.TestSaveEnb - Failed to marshal NodeB entity. Error: %v", err) + } + var e error + var setExpected []interface{} + + nodebNameKey := fmt.Sprintf("RAN:%s", inventoryName) + nodebIdKey := fmt.Sprintf("ENB:%s:%s", plmnId, nbId) + setExpected = append(setExpected, nodebNameKey, data) + setExpected = append(setExpected, nodebIdKey, data) + + sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) + + rNibErr := w.UpdateNodebInfo(nodebInfo) + + assert.NotNil(t, rNibErr) + assert.Equal(t, common.VALIDATION_ERROR, rNibErr.GetCode()) +} + +func TestUpdateNodebInfoMissingGlobalNbIdFailure(t *testing.T) { + inventoryName := "name" + plmnId := "02f829" + nbId := "4a952a0a" + writerPool = nil + sdlInstanceMock := initSdlInstanceMock(namespace, 1) + w := GetRNibWriter() + nodebInfo := &entities.NodebInfo{} + nodebInfo.RanName = inventoryName + data, err := proto.Marshal(nodebInfo) + if err != nil { + t.Errorf("#rNibWriter_test.TestSaveEnb - Failed to marshal NodeB entity. Error: %v", err) + } + var e error + var setExpected []interface{} + + nodebNameKey := fmt.Sprintf("RAN:%s", inventoryName) + nodebIdKey := fmt.Sprintf("ENB:%s:%s", plmnId, nbId) + setExpected = append(setExpected, nodebNameKey, data) + setExpected = append(setExpected, nodebIdKey, data) + + sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) + + rNibErr := w.UpdateNodebInfo(nodebInfo) + + assert.NotNil(t, rNibErr) + assert.Equal(t, common.VALIDATION_ERROR, rNibErr.GetCode()) +} + func TestSaveEnb(t *testing.T) { name := "name" ranName := "RAN:" + name @@ -83,10 +172,10 @@ func TestSaveEnb(t *testing.T) { nb.Ip = "localhost" nb.Port = 5656 enb := entities.Enb{} - cell := &entities.ServedCellInfo{CellId:"aaff", Pci:3} - cellEntity := entities.Cell{Type:entities.Cell_LTE_CELL, Cell:&entities.Cell_ServedCellInfo{ServedCellInfo:cell}} + cell := &entities.ServedCellInfo{CellId: "aaff", Pci: 3} + cellEntity := entities.Cell{Type: entities.Cell_LTE_CELL, Cell: &entities.Cell_ServedCellInfo{ServedCellInfo: cell}} enb.ServedCells = []*entities.ServedCellInfo{cell} - nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb} + nb.Configuration = &entities.NodebInfo_Enb{Enb: &enb} data, err := proto.Marshal(&nb) if err != nil { t.Errorf("#rNibWriter_test.TestSaveEnb - Failed to marshal NodeB entity. Error: %v", err) @@ -111,7 +200,7 @@ func TestSaveEnb(t *testing.T) { } sdlInstanceMock.On("RemoveMember", entities.Node_UNKNOWN.String(), []interface{}{nbIdData}).Return(e) - nbIdentity := &entities.NbIdentity{InventoryName:name, GlobalNbId:&entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}} + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}} nbIdData, err = proto.Marshal(nbIdentity) if err != nil { t.Errorf("#rNibWriter_test.TestSaveEnb - Failed to marshal NodeB Identity entity. Error: %v", err) @@ -133,11 +222,11 @@ func TestSaveEnbCellIdValidationFailure(t *testing.T) { nb.Ip = "localhost" nb.Port = 5656 enb := entities.Enb{} - cell := &entities.ServedCellInfo{Pci:3} + cell := &entities.ServedCellInfo{Pci: 3} enb.ServedCells = []*entities.ServedCellInfo{cell} - nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb} + nb.Configuration = &entities.NodebInfo_Enb{Enb: &enb} - nbIdentity := &entities.NbIdentity{InventoryName:name, GlobalNbId:&entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}} + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}} rNibErr := w.SaveNodeb(nbIdentity, &nb) assert.NotNil(t, rNibErr) assert.Equal(t, common.VALIDATION_ERROR, rNibErr.GetCode()) @@ -154,11 +243,11 @@ func TestSaveEnbInventoryNameValidationFailure(t *testing.T) { nb.Ip = "localhost" nb.Port = 5656 enb := entities.Enb{} - cell := &entities.ServedCellInfo{CellId:"aaa",Pci:3} + cell := &entities.ServedCellInfo{CellId: "aaa", Pci: 3} enb.ServedCells = []*entities.ServedCellInfo{cell} - nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb} + nb.Configuration = &entities.NodebInfo_Enb{Enb: &enb} - nbIdentity := &entities.NbIdentity{InventoryName:"", GlobalNbId:&entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}} + nbIdentity := &entities.NbIdentity{InventoryName: "", GlobalNbId: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}} rNibErr := w.SaveNodeb(nbIdentity, &nb) assert.NotNil(t, rNibErr) assert.Equal(t, common.VALIDATION_ERROR, rNibErr.GetCode()) @@ -176,7 +265,7 @@ func TestSaveEnbOnClosedPool(t *testing.T) { nb.Ip = "localhost" nb.Port = 5656 enb := entities.Enb{} - nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb} + nb.Configuration = &entities.NodebInfo_Enb{Enb: &enb} data, err := proto.Marshal(&nb) if err != nil { t.Errorf("#rNibWriter_test.TestSaveEnbOnClosedPool - Failed to marshal NodeB entity. Error: %v", err) @@ -186,7 +275,7 @@ func TestSaveEnbOnClosedPool(t *testing.T) { sdlInstanceMock.On("Set", setExpected).Return(e) writerPool.Close() nbIdentity := &entities.NbIdentity{} - assert.Panics(t, func(){w.SaveNodeb(nbIdentity, &nb)}) + assert.Panics(t, func() { w.SaveNodeb(nbIdentity, &nb) }) } func TestSaveGnbCellIdValidationFailure(t *testing.T) { @@ -200,12 +289,12 @@ func TestSaveGnbCellIdValidationFailure(t *testing.T) { nb.Ip = "localhost" nb.Port = 5656 gnb := entities.Gnb{} - cellInfo:= &entities.ServedNRCellInformation{NrPci:2} - cell := &entities.ServedNRCell{ServedNrCellInformation:cellInfo} + cellInfo := &entities.ServedNRCellInformation{NrPci: 2} + cell := &entities.ServedNRCell{ServedNrCellInformation: cellInfo} gnb.ServedNrCells = []*entities.ServedNRCell{cell} - nb.Configuration = &entities.NodebInfo_Gnb{Gnb:&gnb} + nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &gnb} - nbIdentity := &entities.NbIdentity{InventoryName:name, GlobalNbId:&entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}} + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}} rNibErr := w.SaveNodeb(nbIdentity, &nb) assert.NotNil(t, rNibErr) assert.Equal(t, common.VALIDATION_ERROR, rNibErr.GetCode()) @@ -224,18 +313,17 @@ func TestSaveGnb(t *testing.T) { nb.Ip = "localhost" nb.Port = 5656 gnb := entities.Gnb{} - cellInfo:= &entities.ServedNRCellInformation{NrPci:2,CellId:"ccdd"} - cell := &entities.ServedNRCell{ServedNrCellInformation:cellInfo} - cellEntity := entities.Cell{Type:entities.Cell_NR_CELL, Cell:&entities.Cell_ServedNrCell{ServedNrCell:cell}} + cellInfo := &entities.ServedNRCellInformation{NrPci: 2, CellId: "ccdd"} + cell := &entities.ServedNRCell{ServedNrCellInformation: cellInfo} + cellEntity := entities.Cell{Type: entities.Cell_NR_CELL, Cell: &entities.Cell_ServedNrCell{ServedNrCell: cell}} gnb.ServedNrCells = []*entities.ServedNRCell{cell} - nb.Configuration = &entities.NodebInfo_Gnb{Gnb:&gnb} + nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &gnb} data, err := proto.Marshal(&nb) if err != nil { t.Errorf("#rNibWriter_test.TestSaveGnb - Failed to marshal NodeB entity. Error: %v", err) } var e error - cellData, err := proto.Marshal(&cellEntity) if err != nil { t.Errorf("#rNibWriter_test.TestSaveGnb - Failed to marshal Cell entity. Error: %v", err) @@ -247,7 +335,7 @@ func TestSaveGnb(t *testing.T) { setExpected = append(setExpected, fmt.Sprintf("PCI:%s:%02x", name, cell.GetServedNrCellInformation().GetNrPci()), cellData) sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) - nbIdentity := &entities.NbIdentity{InventoryName:name, GlobalNbId:&entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}} + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}} nbIdData, err := proto.Marshal(nbIdentity) if err != nil { t.Errorf("#rNibWriter_test.TestSaveGnb - Failed to marshal NodeB Identity entity. Error: %v", err) @@ -276,7 +364,6 @@ func TestSaveRanLoadInformationSuccess(t *testing.T) { sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibWriter() - ranLoadInformation := generateRanLoadInformation() data, err := proto.Marshal(ranLoadInformation) @@ -289,7 +376,6 @@ func TestSaveRanLoadInformationSuccess(t *testing.T) { setExpected = append(setExpected, loadKey, data) sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) - rNibErr := w.SaveRanLoadInformation(inventoryName, ranLoadInformation) assert.Nil(t, rNibErr) } @@ -301,7 +387,7 @@ func TestSaveRanLoadInformationMarshalNilFailure(t *testing.T) { w := GetRNibWriter() expectedErr := common.NewInternalError(errors.New("proto: Marshal called with nil")) - err:= w.SaveRanLoadInformation(inventoryName, nil) + err := w.SaveRanLoadInformation(inventoryName, nil) assert.Equal(t, expectedErr, err) } @@ -311,7 +397,7 @@ func TestSaveRanLoadInformationEmptyInventoryNameFailure(t *testing.T) { initSdlInstanceMock(namespace, 1) w := GetRNibWriter() - err:= w.SaveRanLoadInformation(inventoryName, nil) + err := w.SaveRanLoadInformation(inventoryName, nil) assert.NotNil(t, err) assert.Equal(t, common.VALIDATION_ERROR, err.GetCode()) } @@ -325,7 +411,6 @@ func TestSaveRanLoadInformationSdlFailure(t *testing.T) { t.Errorf("#rNibWriter_test.TestSaveRanLoadInformationSuccess - Failed to build ran load infromation key. Error: %v", validationErr) } - writerPool = nil sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibWriter() @@ -337,13 +422,11 @@ func TestSaveRanLoadInformationSdlFailure(t *testing.T) { t.Errorf("#rNibWriter_test.TestSaveRanLoadInformation - Failed to marshal RanLoadInformation entity. Error: %v", err) } - expectedErr := errors.New("expected error") var setExpected []interface{} setExpected = append(setExpected, loadKey, data) sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(expectedErr) - rNibErr := w.SaveRanLoadInformation(inventoryName, ranLoadInformation) assert.NotNil(t, rNibErr) assert.Equal(t, common.INTERNAL_ERROR, rNibErr.GetCode()) @@ -359,54 +442,54 @@ func generateCellLoadInformation() *entities.CellLoadInformation { cellLoadInformation.UlInterferenceOverloadIndications = []entities.UlInterferenceOverloadIndication{ulInterferenceOverloadIndication} ulHighInterferenceInformation := entities.UlHighInterferenceInformation{ - TargetCellId:"456", - UlHighInterferenceIndication:"xxx", + TargetCellId: "456", + UlHighInterferenceIndication: "xxx", } - cellLoadInformation.UlHighInterferenceInfos = []*entities.UlHighInterferenceInformation{&ulHighInterferenceInformation } + cellLoadInformation.UlHighInterferenceInfos = []*entities.UlHighInterferenceInformation{&ulHighInterferenceInformation} cellLoadInformation.RelativeNarrowbandTxPower = &entities.RelativeNarrowbandTxPower{ - RntpPerPrb:"xxx", - RntpThreshold:entities.RntpThreshold_NEG_4, + RntpPerPrb: "xxx", + RntpThreshold: entities.RntpThreshold_NEG_4, NumberOfCellSpecificAntennaPorts: entities.NumberOfCellSpecificAntennaPorts_V1_ANT_PRT, - PB: 1, - PdcchInterferenceImpact:2, + PB: 1, + PdcchInterferenceImpact: 2, EnhancedRntp: &entities.EnhancedRntp{ - EnhancedRntpBitmap:"xxx", - RntpHighPowerThreshold:entities.RntpThreshold_NEG_2, - EnhancedRntpStartTime: &entities.StartTime{StartSfn:500,StartSubframeNumber:5}, + EnhancedRntpBitmap: "xxx", + RntpHighPowerThreshold: entities.RntpThreshold_NEG_2, + EnhancedRntpStartTime: &entities.StartTime{StartSfn: 500, StartSubframeNumber: 5}, }, } cellLoadInformation.AbsInformation = &entities.AbsInformation{ - Mode: entities.AbsInformationMode_ABS_INFO_FDD, - AbsPatternInfo:"xxx", - NumberOfCellSpecificAntennaPorts:entities.NumberOfCellSpecificAntennaPorts_V2_ANT_PRT, - MeasurementSubset:"xxx", + Mode: entities.AbsInformationMode_ABS_INFO_FDD, + AbsPatternInfo: "xxx", + NumberOfCellSpecificAntennaPorts: entities.NumberOfCellSpecificAntennaPorts_V2_ANT_PRT, + MeasurementSubset: "xxx", } cellLoadInformation.InvokeIndication = entities.InvokeIndication_ABS_INFORMATION cellLoadInformation.ExtendedUlInterferenceOverloadInfo = &entities.ExtendedUlInterferenceOverloadInfo{ - AssociatedSubframes:"xxx", - ExtendedUlInterferenceOverloadIndications:cellLoadInformation.UlInterferenceOverloadIndications, + AssociatedSubframes: "xxx", + ExtendedUlInterferenceOverloadIndications: cellLoadInformation.UlInterferenceOverloadIndications, } compInformationItem := &entities.CompInformationItem{ - CompHypothesisSets: []*entities.CompHypothesisSet{&entities.CompHypothesisSet{CellId: "789", CompHypothesis:"xxx"}}, - BenefitMetric:50, + CompHypothesisSets: []*entities.CompHypothesisSet{&entities.CompHypothesisSet{CellId: "789", CompHypothesis: "xxx"}}, + BenefitMetric: 50, } cellLoadInformation.CompInformation = &entities.CompInformation{ - CompInformationItems:[]*entities.CompInformationItem{compInformationItem}, - CompInformationStartTime:&entities.StartTime{StartSfn:123,StartSubframeNumber:456}, + CompInformationItems: []*entities.CompInformationItem{compInformationItem}, + CompInformationStartTime: &entities.StartTime{StartSfn: 123, StartSubframeNumber: 456}, } cellLoadInformation.DynamicDlTransmissionInformation = &entities.DynamicDlTransmissionInformation{ - State: entities.NaicsState_NAICS_ACTIVE, - TransmissionModes:"xxx", - PB: 2, - PAList:[]entities.PA{entities.PA_DB_NEG_3}, + State: entities.NaicsState_NAICS_ACTIVE, + TransmissionModes: "xxx", + PB: 2, + PAList: []entities.PA{entities.PA_DB_NEG_3}, } return &cellLoadInformation @@ -417,7 +500,6 @@ func generateRanLoadInformation() *entities.RanLoadInformation { ranLoadInformation.LoadTimestamp = uint64(time.Now().UnixNano()) - cellLoadInformation := generateCellLoadInformation() ranLoadInformation.CellLoadInfos = []*entities.CellLoadInformation{cellLoadInformation} @@ -439,7 +521,7 @@ func TestSaveUnknownTypeEntityFailure(t *testing.T) { initSdlInstanceMock(namespace, 1) w := GetRNibWriter() expectedErr := common.NewValidationError(errors.New("#rNibWriter.saveNodeB - Unknown responding node type, entity: ip:\"localhost\" port:5656 ")) - nbIdentity := &entities.NbIdentity{InventoryName:"name", GlobalNbId:&entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"}} + nbIdentity := &entities.NbIdentity{InventoryName: "name", GlobalNbId: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"}} nb := &entities.NodebInfo{} nb.Port = 5656 nb.Ip = "localhost" @@ -461,9 +543,9 @@ func TestSaveEntityFailure(t *testing.T) { if err != nil { t.Errorf("#rNibWriter_test.TestSaveEntityFailure - Failed to marshal NodeB entity. Error: %v", err) } - nbIdentity := &entities.NbIdentity{InventoryName:name, GlobalNbId:&entities.GlobalNbId{PlmnId:plmnId, NbId:nbId}} + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: plmnId, NbId: nbId}} setExpected := []interface{}{"RAN:" + name, data} - setExpected = append(setExpected,"GNB:" + plmnId + ":" + nbId, data) + setExpected = append(setExpected, "GNB:"+plmnId+":"+nbId, data) expectedErr := errors.New("expected error") sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(expectedErr) rNibErr := w.SaveNodeb(nbIdentity, &gnb) @@ -472,7 +554,7 @@ func TestSaveEntityFailure(t *testing.T) { func TestGetRNibWriterPoolNotInitializedFailure(t *testing.T) { writerPool = nil - assert.Panics(t, func(){GetRNibWriter()}) + assert.Panics(t, func() { GetRNibWriter() }) } func TestGetRNibWriter(t *testing.T) { @@ -515,7 +597,7 @@ func TestCloseOnClosedPoolFailure(t *testing.T) { var e error instanceMock.On("Close").Return(e) Close() - assert.Panics(t, func(){Close()}) + assert.Panics(t, func() { Close() }) } func TestCloseFailure(t *testing.T) { @@ -613,4 +695,4 @@ func TestInit(t *testing.T) { // if err != nil{ // t.Errorf("#rNibWriter_test.TestSaveRanLoadInformationInteg - Failed to save RanLoadInformation entity. Error: %v", err) // } -//} \ No newline at end of file +//} diff --git a/E2Manager/resources/configuration.yaml b/E2Manager/resources/configuration.yaml index 94d9fc1..ee8b279 100644 --- a/E2Manager/resources/configuration.yaml +++ b/E2Manager/resources/configuration.yaml @@ -7,3 +7,4 @@ rmr: maxMsgSize: 4096 notificationResponseBuffer: 100 bigRedButtonTimeoutSec: 5 +maxConnectionAttempts: 20 diff --git a/E2Manager/services/receivers/rmr_service_receiver.go b/E2Manager/services/receivers/rmr_service_receiver.go index b2a1a08..6dcc01e 100644 --- a/E2Manager/services/receivers/rmr_service_receiver.go +++ b/E2Manager/services/receivers/rmr_service_receiver.go @@ -18,18 +18,18 @@ package receivers import ( - "e2mgr/managers" + "e2mgr/managers/notificationmanager" "e2mgr/services" ) // RmrService holds an instance of RMR messenger as well as its configuration type RmrServiceReceiver struct { services.RmrService - nManager *managers.NotificationManager + nManager *notificationmanager.NotificationManager } // NewRmrService instantiates a new Rmr service instance -func NewRmrServiceReceiver(rmrService services.RmrService, nManager *managers.NotificationManager) *RmrServiceReceiver { +func NewRmrServiceReceiver(rmrService services.RmrService, nManager *notificationmanager.NotificationManager) *RmrServiceReceiver { return &RmrServiceReceiver{ RmrService: rmrService, diff --git a/E2Manager/services/receivers/rmr_service_receiver_test.go b/E2Manager/services/receivers/rmr_service_receiver_test.go index 937a7c5..45a50c9 100644 --- a/E2Manager/services/receivers/rmr_service_receiver_test.go +++ b/E2Manager/services/receivers/rmr_service_receiver_test.go @@ -18,8 +18,10 @@ package receivers import ( + "e2mgr/configuration" "e2mgr/logger" "e2mgr/managers" + "e2mgr/managers/notificationmanager" "e2mgr/mocks" "e2mgr/models" "e2mgr/rNibWriter" @@ -33,9 +35,9 @@ import ( "time" ) -func TestListenAndHandle(t *testing.T){ +func TestListenAndHandle(t *testing.T) { log, err := logger.InitLogger(logger.DebugLevel) - if err!=nil{ + if err != nil { t.Errorf("#rmr_service_test.TestListenAndHandle - failed to initialize logger, error: %s", err) } rmrMessengerMock := &mocks.RmrMessengerMock{} @@ -44,20 +46,20 @@ func TestListenAndHandle(t *testing.T){ e := fmt.Errorf("test error") rmrMessengerMock.On("RecvMsg").Return(buf, e) - go getRmrServiceReceiver(rmrMessengerMock,log).ListenAndHandle() + go getRmrServiceReceiver(rmrMessengerMock, log).ListenAndHandle() - time.Sleep(time.Microsecond*10) + time.Sleep(time.Microsecond * 10) } 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) + return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, make(sessions.E2Sessions), messageChannel) } -func getRmrServiceReceiver(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *RmrServiceReceiver { - readerMock :=&mocks.RnibReaderMock{} +func getRmrServiceReceiver(rmrMessengerMock *mocks.RmrMessengerMock, logger *logger.Logger) *RmrServiceReceiver { + readerMock := &mocks.RnibReaderMock{} rnibReaderProvider := func() reader.RNibReader { return readerMock } @@ -65,7 +67,12 @@ func getRmrServiceReceiver(rmrMessengerMock *mocks.RmrMessengerMock, log *logger rnibWriterProvider := func() rNibWriter.RNibWriter { return writerMock } - nManager := managers.NewNotificationManager(rnibReaderProvider, rnibWriterProvider) - rmrService := getRmrService(rmrMessengerMock,log) + + rmrService := getRmrService(rmrMessengerMock, logger) + + ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibReaderProvider, rnibWriterProvider) + ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager) + nManager := notificationmanager.NewNotificationManager(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager) + return NewRmrServiceReceiver(*rmrService, nManager) -} \ No newline at end of file +} -- 2.16.6