NotificationResponseBuffer int
BigRedButtonTimeoutSec int
MaxConnectionAttempts int
+ MaxRnibConnectionAttempts int
+ RnibRetryIntervalMs int
}
func ParseConfiguration() *Configuration{
config.NotificationResponseBuffer = viper.GetInt("notificationResponseBuffer")
config.BigRedButtonTimeoutSec = viper.GetInt("bigRedButtonTimeoutSec")
config.MaxConnectionAttempts = viper.GetInt("maxConnectionAttempts")
+ config.MaxConnectionAttempts = viper.GetInt("maxRnibConnectionAttempts")
+ config.MaxConnectionAttempts = viper.GetInt("rnibRetryIntervalMs")
return &config
}
"e2mgr/managers"
"e2mgr/models"
"e2mgr/providers/httpmsghandlerprovider"
- "e2mgr/rNibWriter"
"e2mgr/services"
"encoding/json"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
"github.com/gorilla/mux"
"io"
"io/ioutil"
handlerProvider *httpmsghandlerprovider.IncomingRequestHandlerProvider
}
-func NewController(logger *logger.Logger, rmrService *services.RmrService, rNibReaderProvider func() reader.RNibReader, rNibWriterProvider func() rNibWriter.RNibWriter,
+func NewController(logger *logger.Logger, rmrService *services.RmrService, rnibDataService services.RNibDataService,
config *configuration.Configuration, ranSetupManager *managers.RanSetupManager) *Controller {
- provider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider, ranSetupManager)
+ provider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrService, config, rnibDataService, ranSetupManager)
return &Controller{
logger: logger,
handlerProvider: provider,
"e2mgr/providers/httpmsghandlerprovider"
"e2mgr/rNibWriter"
"e2mgr/rmrCgo"
+ "e2mgr/services"
"e2mgr/tests"
"encoding/json"
"fmt"
"testing"
)
-func TestX2SetupInvalidBody(t *testing.T) {
-
- readerMock, writerMock, rmrMessengerMock, ranSetupManager := initTest(t)
+func setupControllerTest(t *testing.T) (*Controller, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock){
log := initLog(t)
+ config := configuration.ParseConfiguration()
+ rmrMessengerMock := &mocks.RmrMessengerMock{}
+ readerMock := &mocks.RnibReaderMock{}
readerProvider := func() reader.RNibReader {
return readerMock
}
+ writerMock := &mocks.RnibWriterMock{}
writerProvider := func() rNibWriter.RNibWriter {
return writerMock
}
+ rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
+
+ ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rnibDataService)
+ controller := NewController(log, getRmrService(rmrMessengerMock, log), rnibDataService, config, ranSetupManager)
+ return controller, readerMock, writerMock, rmrMessengerMock
+}
+
+func TestX2SetupInvalidBody(t *testing.T) {
+
+ controller, _, _, _ := setupControllerTest(t)
header := http.Header{}
header.Set("Content-Type", "application/json")
httpRequest.Header = header
writer := httptest.NewRecorder()
- config := configuration.ParseConfiguration()
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
controller.X2SetupHandler(writer, httpRequest)
var errorResponse = parseJsonRequest(t, writer.Body)
func TestX2SetupSuccess(t *testing.T) {
- readerMock, writerMock, rmrMessengerMock, ranSetupManager := initTest(t)
- log := initLog(t)
-
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
+ controller, readerMock, writerMock, rmrMessengerMock := setupControllerTest(t)
ranName := "test"
nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
httpRequest.Header = header
writer := httptest.NewRecorder()
- config := configuration.ParseConfiguration()
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
controller.X2SetupHandler(writer, httpRequest)
assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
func TestEndcSetupSuccess(t *testing.T) {
- readerMock, writerMock, rmrMessengerMock, ranSetupManager := initTest(t)
- log := initLog(t)
-
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
+ controller, readerMock, writerMock, rmrMessengerMock := setupControllerTest(t)
ranName := "test"
nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
httpRequest.Header = header
writer := httptest.NewRecorder()
- config := configuration.ParseConfiguration()
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
controller.EndcSetupHandler(writer, httpRequest)
assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
}
func TestShutdownHandlerRnibError(t *testing.T) {
- log := initLog(t)
- config := configuration.ParseConfiguration()
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
+ controller, readerMock, _, _:= setupControllerTest(t)
rnibErr := &common.ResourceNotFoundError{}
var nbIdentityList []*entities.NbIdentity
readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibErr)
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
+
controller.ShutdownHandler(writer, tests.GetHttpRequest())
var errorResponse = parseJsonRequest(t, writer.Body)
}
func TestHeaderValidationFailed(t *testing.T) {
- log := initLog(t)
- config := configuration.ParseConfiguration()
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
+ controller, _, _, _ := setupControllerTest(t)
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
header := &http.Header{}
}
func TestShutdownStatusNoContent(t *testing.T) {
- log := initLog(t)
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- config := configuration.ParseConfiguration()
+ controller, readerMock, _, _ := setupControllerTest(t)
var rnibError error
nbIdentityList := []*entities.NbIdentity{}
readerMock.On("GetListNodebIds").Return(nbIdentityList, rnibError)
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
controller.ShutdownHandler(writer, tests.GetHttpRequest())
assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode)
}
func TestHandleInternalError(t *testing.T) {
- log := initLog(t)
- config := configuration.ParseConfiguration()
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
+ controller, _, _, _ := setupControllerTest(t)
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
err := e2managererrors.NewInternalError()
controller.handleErrorResponse(err, writer)
}
func TestHandleCommandAlreadyInProgressError(t *testing.T) {
- log := initLog(t)
- config := configuration.ParseConfiguration()
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
+ controller, _, _, _ := setupControllerTest(t)
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
err := e2managererrors.NewCommandAlreadyInProgressError()
controller.handleErrorResponse(err, writer)
}
func TestValidateHeaders(t *testing.T) {
- log := initLog(t)
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- config := configuration.ParseConfiguration()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, getRmrService(rmrMessengerMock, log), readerProvider, writerProvider, config, ranSetupManager)
+ controller, _, _, _ := setupControllerTest(t)
header := http.Header{}
header.Set("Content-Type", "application/json")
}
func TestX2ResetHandleSuccessfulRequestedCause(t *testing.T) {
- log := initLog(t)
+ controller, readerMock, _, rmrMessengerMock := setupControllerTest(t)
ranName := "test1"
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
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)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
- config := configuration.ParseConfiguration()
- rmrService := getRmrService(rmrMessengerMock, log)
-
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager)
var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
}
func TestX2ResetHandleSuccessfulRequestedDefault(t *testing.T) {
- log := initLog(t)
+ controller, readerMock, _, rmrMessengerMock := setupControllerTest(t)
ranName := "test1"
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
// o&m intervention
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)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
- config := configuration.ParseConfiguration()
- rmrService := getRmrService(rmrMessengerMock, log)
-
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager)
var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
}
func TestX2ResetHandleFailureInvalidBody(t *testing.T) {
- log := initLog(t)
+ controller, _, _, _ := setupControllerTest(t)
ranName := "test1"
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- config := configuration.ParseConfiguration()
- rmrService := getRmrService(rmrMessengerMock, log)
-
writer := httptest.NewRecorder()
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager)
// Invalid json: attribute name without quotes (should be "cause":).
b := strings.NewReader("{cause:\"protocol:transfer-syntax-error\"")
}
func TestHandleErrorResponse(t *testing.T) {
- log := initLog(t)
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- config := configuration.ParseConfiguration()
- rmrService := getRmrService(rmrMessengerMock, log)
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- controller := NewController(log, rmrService, readerProvider, writerProvider, config, ranSetupManager)
+ controller, _, _, _ := setupControllerTest(t)
writer := httptest.NewRecorder()
controller.handleErrorResponse(e2managererrors.NewRnibDbError(), writer)
writer = httptest.NewRecorder()
controller.handleErrorResponse(fmt.Errorf("ErrorError"), writer)
assert.Equal(t, http.StatusInternalServerError, writer.Result().StatusCode)
-}
-
-func initTest(t *testing.T)(*mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanSetupManager) {
- log := initLog(t)
-
- readerMock := &mocks.RnibReaderMock{}
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- rmrService := getRmrService(rmrMessengerMock, log)
-
- ranSetupManager := managers.NewRanSetupManager(log, rmrService, writerProvider)
-
- return readerMock, writerMock, rmrMessengerMock, ranSetupManager
}
\ No newline at end of file
import (
"e2mgr/logger"
"e2mgr/models"
- "e2mgr/rNibWriter"
"e2mgr/services"
"e2mgr/utils"
"encoding/json"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
"github.com/golang/protobuf/jsonpb"
"github.com/gorilla/mux"
"net/http"
type NodebController struct {
rmrService *services.RmrService
Logger *logger.Logger
- rnibReaderProvider func() reader.RNibReader
- rnibWriterProvider func() rNibWriter.RNibWriter
+ rnibDataService services.RNibDataService
}
-func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *NodebController {
+func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibDataService services.RNibDataService) *NodebController {
messageChannel = make(chan *models.E2RequestMessage)
errorChannel = make(chan error)
return &NodebController{
rmrService: rmrService,
Logger: logger,
- rnibReaderProvider: rnibReaderProvider,
- rnibWriterProvider: rnibWriterProvider,
+ rnibDataService: rnibDataService,
}
}
func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *http.Request) {
startTime := time.Now()
- rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider)
- nodebIdList, rnibError := rnibReaderService.GetNodebIdList()
+ nodebIdList, rnibError := rc.rnibDataService.GetListNodebIds()
if rnibError != nil {
rc.Logger.Errorf("%v", rnibError);
startTime := time.Now()
vars := mux.Vars(request)
ranName := vars["ranName"]
- // WAS: respondingNode, rnibError := reader.GetRNibReader().GetNodeb(ranName)
- rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider)
- respondingNode, rnibError := rnibReaderService.GetNodeb(ranName)
+ respondingNode, rnibError := rc.rnibDataService.GetNodeb(ranName)
if rnibError != nil {
rc.Logger.Errorf("%v", rnibError)
httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError)
package controllers
import (
+ "e2mgr/configuration"
"e2mgr/logger"
"e2mgr/mocks"
"e2mgr/models"
"testing"
)
-func TestNewRequestController(t *testing.T) {
+func setupNodebControllerTest(t *testing.T) (*logger.Logger, services.RNibDataService, *mocks.RnibReaderMock){
+ logger, err := logger.InitLogger(logger.DebugLevel)
+ if err != nil {
+ t.Errorf("#... - failed to initialize logger, error: %s", err)
+ }
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
+ readerMock := &mocks.RnibReaderMock{}
rnibReaderProvider := func() reader.RNibReader {
- return &mocks.RnibReaderMock{}
+ return readerMock
}
rnibWriterProvider := func() rNibWriter.RNibWriter {
return &mocks.RnibWriterMock{}
}
+ rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
+ return logger, rnibDataService, readerMock
+}
- assert.NotNil(t, NewNodebController(&logger.Logger{}, &services.RmrService{}, rnibReaderProvider, rnibWriterProvider))
+func TestNewRequestController(t *testing.T) {
+ logger, rnibDataService, _ := setupNodebControllerTest(t)
+ assert.NotNil(t, NewNodebController(logger, &services.RmrService{}, rnibDataService))
}
func TestHandleHealthCheckRequest(t *testing.T) {
- rc := NewNodebController(nil, nil, nil, nil)
+ rc := NewNodebController(nil, nil, nil)
writer := httptest.NewRecorder()
rc.HandleHealthCheckRequest(writer, nil)
assert.Equal(t, writer.Result().StatusCode, http.StatusOK)
return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, messageChannel)
}
-func executeGetNodeb(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibReaderProvider func() reader.RNibReader) {
+func executeGetNodeb(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibDataService services.RNibDataService) {
req, _ := http.NewRequest("GET", "/nodeb", nil)
req = mux.SetURLVars(req, map[string]string{"ranName": "testNode"})
- NewNodebController(logger, nil, rnibReaderProvider, nil).GetNodeb(writer, req)
+ NewNodebController(logger, nil, rnibDataService).GetNodeb(writer, req)
}
func TestNodebController_GetNodeb_Success(t *testing.T) {
- log, err := logger.InitLogger(logger.InfoLevel)
-
- if err != nil {
- t.Errorf("#nodeb_controller_test.TestNodebController_GetNodeb_Success - failed to initialize logger, error: %s", err)
- }
+ logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t)
writer := httptest.NewRecorder()
- rnibReaderMock := mocks.RnibReaderMock{}
var rnibError error
rnibReaderMock.On("GetNodeb", "testNode").Return(&entities.NodebInfo{}, rnibError)
- rnibReaderProvider := func() reader.RNibReader {
- return &rnibReaderMock
- }
-
- executeGetNodeb(log, writer, rnibReaderProvider)
+ executeGetNodeb(logger, writer, rnibDataService)
assert.Equal(t, writer.Result().StatusCode, http.StatusOK)
}
func TestNodebController_GetNodeb_NotFound(t *testing.T) {
- log, err := logger.InitLogger(logger.InfoLevel)
-
- if err != nil {
- t.Errorf("#nodeb_controller_test.TestNodebController_GetNodeb_NotFound - failed to initialize logger, error: %s", err)
- }
+ logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t)
writer := httptest.NewRecorder()
- rnibReaderMock := mocks.RnibReaderMock{}
rnibError := common.NewResourceNotFoundErrorf("#reader.GetNodeb - responding node %s not found", "testNode")
var nodebInfo *entities.NodebInfo
rnibReaderMock.On("GetNodeb", "testNode").Return(nodebInfo, rnibError)
- rnibReaderProvider := func() reader.RNibReader {
- return &rnibReaderMock
- }
-
- executeGetNodeb(log, writer, rnibReaderProvider)
+ executeGetNodeb(logger, writer, rnibDataService)
assert.Equal(t, writer.Result().StatusCode, http.StatusNotFound)
}
func TestNodebController_GetNodeb_InternalError(t *testing.T) {
- log, err := logger.InitLogger(logger.InfoLevel)
-
- if err != nil {
- t.Errorf("#nodeb_controller_test.TestNodebController_GetNodeb_InternalError - failed to initialize logger, error: %s", err)
- }
+ logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t)
writer := httptest.NewRecorder()
- rnibReaderMock := mocks.RnibReaderMock{}
-
rnibError := common.NewInternalError(errors.New("#reader.GetNodeb - Internal Error"))
var nodebInfo *entities.NodebInfo
rnibReaderMock.On("GetNodeb", "testNode").Return(nodebInfo, rnibError)
- rnibReaderProvider := func() reader.RNibReader {
- return &rnibReaderMock
- }
-
- executeGetNodeb(log, writer, rnibReaderProvider)
+ executeGetNodeb(logger, writer, rnibDataService)
assert.Equal(t, writer.Result().StatusCode, http.StatusInternalServerError)
}
-func executeGetNodebIdList(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibReaderProvider func() reader.RNibReader) {
+func executeGetNodebIdList(logger *logger.Logger, writer *httptest.ResponseRecorder, rnibDataService services.RNibDataService) {
req, _ := http.NewRequest("GET", "/nodeb-ids", nil)
- NewNodebController(logger, nil, rnibReaderProvider, nil).GetNodebIdList(writer, req)
+ NewNodebController(logger, nil, rnibDataService).GetNodebIdList(writer,req)
}
func TestNodebController_GetNodebIdList_Success(t *testing.T) {
- logger, err := logger.InitLogger(logger.InfoLevel)
-
- if err != nil {
- t.Errorf("#nodeb_controller_test.TestNodebController_GetNodebIdList_Success - failed to initialize logger, error: %s", err)
- }
-
+ logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t)
writer := httptest.NewRecorder()
- rnibReaderMock := mocks.RnibReaderMock{}
var rnibError error
nbList := []*entities.NbIdentity{
}
rnibReaderMock.On("GetListNodebIds").Return(nbList, rnibError)
- rnibReaderProvider := func() reader.RNibReader {
- return &rnibReaderMock
- }
-
- executeGetNodebIdList(logger, writer, rnibReaderProvider)
+ executeGetNodebIdList(logger, writer, rnibDataService)
assert.Equal(t, writer.Result().StatusCode, http.StatusOK)
- bodyBytes, err := ioutil.ReadAll(writer.Body)
+ bodyBytes, _ := ioutil.ReadAll(writer.Body)
assert.Equal(t, "[{\"inventoryName\":\"test1\",\"globalNbId\":{\"plmnId\":\"plmnId1\",\"nbId\":\"nbId1\"}},{\"inventoryName\":\"test2\",\"globalNbId\":{\"plmnId\":\"plmnId2\",\"nbId\":\"nbId2\"}},{\"inventoryName\":\"test3\",\"globalNbId\":{}}]", string(bodyBytes))
}
func TestNodebController_GetNodebIdList_EmptyList(t *testing.T) {
- log, err := logger.InitLogger(logger.InfoLevel)
-
- if err != nil {
- t.Errorf("#nodeb_controller_test.TestNodebController_GetNodebIdList_EmptyList - failed to initialize logger, error: %s", err)
- }
+ logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t)
writer := httptest.NewRecorder()
- rnibReaderMock := mocks.RnibReaderMock{}
-
var rnibError error
nbList := []*entities.NbIdentity{}
rnibReaderMock.On("GetListNodebIds").Return(nbList, rnibError)
- rnibReaderProvider := func() reader.RNibReader {
- return &rnibReaderMock
- }
- executeGetNodebIdList(log, writer, rnibReaderProvider)
+ executeGetNodebIdList(logger, writer, rnibDataService)
assert.Equal(t, writer.Result().StatusCode, http.StatusOK)
- bodyBytes, err := ioutil.ReadAll(writer.Body)
+ bodyBytes, _ := ioutil.ReadAll(writer.Body)
assert.Equal(t, "[]", string(bodyBytes))
}
func TestNodebController_GetNodebIdList_InternalError(t *testing.T) {
- logger, err := logger.InitLogger(logger.InfoLevel)
-
- if err != nil {
- t.Errorf("#nodeb_controller_test.TestNodebController_GetNodebIdList_InternalError - failed to initialize logger, error: %s", err)
- }
+ logger, rnibDataService, rnibReaderMock := setupNodebControllerTest(t)
writer := httptest.NewRecorder()
- rnibReaderMock := mocks.RnibReaderMock{}
-
rnibError := common.NewInternalError(errors.New("#reader.GetEnbIdList - Internal Error"))
var nbList []*entities.NbIdentity
rnibReaderMock.On("GetListNodebIds").Return(nbList, rnibError)
- rnibReaderProvider := func() reader.RNibReader {
- return &rnibReaderMock
- }
-
- executeGetNodebIdList(logger, writer, rnibReaderProvider)
+ executeGetNodebIdList(logger, writer, rnibDataService)
assert.Equal(t, writer.Result().StatusCode, http.StatusInternalServerError)
}
import (
"e2mgr/e2pdus"
"e2mgr/logger"
- "e2mgr/rNibWriter"
"fmt"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"strings"
logger, _ := logger.InitLogger(logger.InfoLevel)
var testCases = []struct {
- saveToRNib bool
- response string
- packedPdu string
- failure error
+ response string
+ packedPdu string
+ failure error
}{
{
- saveToRNib: false, //TODO: use MOCK?
- response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics:<procedure_code:33 triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
+ response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics:<procedure_code:33 triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
/**** shares the same code with x2setup failure response to protobuf ****/
}
- initDb_f := true
for _, tc := range testCases {
t.Run(tc.packedPdu, func(t *testing.T) {
t.Errorf("want: response=[%s], got: [%s]", tc.response, respStr)
}
- // Save to rNib
- if tc.saveToRNib {
- if initDb_f {
- rNibWriter.Init("e2Manager", 1)
- initDb_f = false
- }
- nbIdentity := &entities.NbIdentity{InventoryName: "RanName"}
- if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil {
- if tc.failure == nil {
- t.Errorf("rNibWriter failed to save ENB. Error: %s\n", rNibErr.Error())
- } else {
- if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 {
- t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error())
- }
- }
- }
- }
}
})
}
import (
"e2mgr/e2pdus"
"e2mgr/logger"
- "e2mgr/rNibWriter"
"fmt"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"strings"
logger, _ := logger.InitLogger(logger.InfoLevel)
var testCases = []struct {
- saveToRNib bool
- key *entities.GlobalNbId
- gnb string
- packedPdu string
- failure error
+ key *entities.GlobalNbId
+ gnb string
+ packedPdu string
+ failure error
}{
{
- saveToRNib: false, //TODO: use MOCK?
- key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"},
- gnb: "CONNECTED [served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" stac5g:\"3d44d3\" configured_stac:\"4e4f\" served_plmns:\"3e4e5e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS60 ncnrb:NRB107 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS30 ncnrb:NRB133 > > > > served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" stac5g:\"3d44d3\" configured_stac:\"4e4f\" served_plmns:\"3e4e5e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB121 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB132 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"1e3f27:1f2e3d4ff0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB11 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > > > > ]",
+ key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"},
+ gnb: "CONNECTED [served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" stac5g:\"3d44d3\" configured_stac:\"4e4f\" served_plmns:\"3e4e5e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS60 ncnrb:NRB107 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS30 ncnrb:NRB133 > > > > served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" stac5g:\"3d44d3\" configured_stac:\"4e4f\" served_plmns:\"3e4e5e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB121 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB132 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"1e3f27:1f2e3d4ff0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB11 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > > > > ]",
/*
E2AP-PDU:
successfulOutcome_t
*/
packedPdu: "202400808e00000100f600808640000200fc00090002f829504a952a0a00fd007200010c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000211e148033e4e5e4c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a00021a0044033e4e5e000000002c001e3f271f2e3d4ff0031e3f274400010000150400000a00020000"},
{
- saveToRNib: false,
- key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"},
- gnb: "CONNECTED [served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" stac5g:\"3d44d3\" configured_stac:\"4e4f\" served_plmns:\"3e4e5e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS30 ncnrb:NRB107 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB121 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"1e3f27:1f2e3d4ff0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:5 sulInformation:<sul_ar_fcn:6 sul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB18 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > > > > ]",
+ key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"},
+ gnb: "CONNECTED [served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" stac5g:\"3d44d3\" configured_stac:\"4e4f\" served_plmns:\"3e4e5e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS30 ncnrb:NRB107 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB121 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"1e3f27:1f2e3d4ff0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:5 sulInformation:<sul_ar_fcn:6 sul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB18 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > > > > ]",
/*
E2AP-PDU:
successfulOutcome_t
packedPdu: "2024006500000100f6005e40000200fc00090002f829504a952a0a00fd004a00004c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000209e040033e4e5e000000002c001e3f271f2e3d4ff0031e3f274400050000150400000a00061820"},
{
- saveToRNib: false,
- key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"},
+ key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"},
gnb: "CONNECTED [served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" stac5g:\"3d44d3\" configured_stac:\"4e4f\" served_plmns:\"3e4e5e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS60 ncnrb:NRB107 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS30 ncnrb:NRB133 > > > > served_nr_cell_information:<nr_pci:8 cell_id:\"2e3f45:1f2e3d4ff0\" stac5g:\"4faa3c\" configured_stac:\"1a2f\" served_plmns:\"50321e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:4 sulInformation:<sul_ar_fcn:8 sul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB121 > > frequency_bands:<nr_frequency_band:7 supported_sul_bands:3 > > transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB132 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"1e3f27:1f2e3d4ff0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:1 sulInformation:<sul_ar_fcn:2 sul_transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB11 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > > > > ]",
/*
E2AP-PDU:
packedPdu: "202400808e00000100f600808640000200fc00090002f829504a952a0a00fd007200010c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000211e148033e4e5e4c0008002e3f451f2e3d4ff04faa3c1a2f0050321e4400040000060400000200081a00440350321e000000002c001e3f271f2e3d4ff0031e3f274400010000150400000a00020000"},
{
- saveToRNib: false,
- key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952a0a"},
- gnb: "CONNECTED [served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" served_plmns:\"3e4e5e\" nr_mode:FDD choice_nr_mode:<fdd:<ul_freq_info:<nr_ar_fcn:5 frequency_bands:<nr_frequency_band:44 supported_sul_bands:33 > > dl_freq_info:<nr_ar_fcn:1 frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > ul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB11 > dl_transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB135 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"1e3f27:1f2e3d4ff0\" nr_mode:FDD choice_nr_mode:<fdd:<ular_fcn_freq_info:<nr_ar_fcn:5 frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > dlar_fcn_freq_info:<nr_ar_fcn:1 frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > > > > ]",
+ key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952a0a"},
+ gnb: "CONNECTED [served_nr_cell_information:<nr_pci:5 cell_id:\"1e3f27:1f2e3d4ff0\" served_plmns:\"3e4e5e\" nr_mode:FDD choice_nr_mode:<fdd:<ul_freq_info:<nr_ar_fcn:5 frequency_bands:<nr_frequency_band:44 supported_sul_bands:33 > > dl_freq_info:<nr_ar_fcn:1 frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > ul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB11 > dl_transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB135 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"1e3f27:1f2e3d4ff0\" nr_mode:FDD choice_nr_mode:<fdd:<ular_fcn_freq_info:<nr_ar_fcn:5 frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > dlar_fcn_freq_info:<nr_ar_fcn:1 frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > > > > ]",
/*
E2AP-PDU:
successfulOutcome_t
{
- saveToRNib: false,
- key: &entities.GlobalNbId{PlmnId:"04a5c1", NbId:"4fc52bff"},
- gnb: "CONNECTED [served_nr_cell_information:<nr_pci:9 cell_id:\"aeafa7:2a3e3b4cd0\" stac5g:\"7d4773\" configured_stac:\"477f\" served_plmns:\"7e7e7e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:8 sulInformation:<sul_ar_fcn:9 sul_transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB121 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS60 ncnrb:NRB18 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"5a5ff1:2a3e3b4cd0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:5 sulInformation:<sul_ar_fcn:6 sul_transmission_bandwidth:<nrscs:SCS30 ncnrb:NRB18 > > frequency_bands:<nr_frequency_band:4 supported_sul_bands:3 > > > > > nr_neighbour_infos:<nr_pci:9 nr_cgi:\"5d5caa:af3e354ac0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:7 sulInformation:<sul_ar_fcn:8 sul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB25 > > frequency_bands:<nr_frequency_band:3 supported_sul_bands:1 > > > > > ]",
+ key: &entities.GlobalNbId{PlmnId: "04a5c1", NbId: "4fc52bff"},
+ gnb: "CONNECTED [served_nr_cell_information:<nr_pci:9 cell_id:\"aeafa7:2a3e3b4cd0\" stac5g:\"7d4773\" configured_stac:\"477f\" served_plmns:\"7e7e7e\" nr_mode:TDD choice_nr_mode:<tdd:<nr_freq_info:<nr_ar_fcn:8 sulInformation:<sul_ar_fcn:9 sul_transmission_bandwidth:<nrscs:SCS15 ncnrb:NRB121 > > frequency_bands:<nr_frequency_band:22 supported_sul_bands:11 > > transmission_bandwidth:<nrscs:SCS60 ncnrb:NRB18 > > > > nr_neighbour_infos:<nr_pci:44 nr_cgi:\"5a5ff1:2a3e3b4cd0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:5 sulInformation:<sul_ar_fcn:6 sul_transmission_bandwidth:<nrscs:SCS30 ncnrb:NRB18 > > frequency_bands:<nr_frequency_band:4 supported_sul_bands:3 > > > > > nr_neighbour_infos:<nr_pci:9 nr_cgi:\"5d5caa:af3e354ac0\" nr_mode:TDD choice_nr_mode:<tdd:<ar_fcn_nr_freq_info:<nr_ar_fcn:7 sulInformation:<sul_ar_fcn:8 sul_transmission_bandwidth:<nrscs:SCS120 ncnrb:NRB25 > > frequency_bands:<nr_frequency_band:3 supported_sul_bands:1 > > > > > ]",
/*
E2AP-PDU:
successfulOutcome_t
*/
packedPdu: "202400808200000100f6007b40000200fc00090004a5c1504fc52bff00fd006700004c000900aeafa72a3e3b4cd07d4773477f007e7e7e4400080000150400000a0009020204037e7e7e000100002c005a5ff12a3e3b4cd0035a5ff144000500000304000002000608200009005d5caaaf3e354ac0035d5caa4400070000020400000000081860"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"4a952aaa"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "4a952aaa"},
/*
E2AP-PDU:
successfulOutcome_t
failure: fmt.Errorf("getList for path [successfulOutcome_t ENDCX2SetupResponse protocolIEs_t ProtocolIE_Container_elm RespondingNodeType-EndcX2Setup respond_en_gNB_t ProtocolIE_Container_elm ServedNRcellsENDCX2ManagementList ServedNRcellsENDCX2ManagementList_elm servedNRCellInfo_t nrpCI_t] failed, rc = 1" /*NO_ITEMS*/),},
}
- initDb_f := true
for _, tc := range testCases {
t.Run(tc.packedPdu, func(t *testing.T) {
if tc.failure == nil {
t.Errorf("want: success, got: error: %v\n", err)
} else {
- if strings.Compare(err.Error(), tc.failure.Error()) != 0 {
- t.Errorf("want: %s, got: %s", tc.failure, err)
- }
+ if strings.Compare(err.Error(), tc.failure.Error()) != 0 {
+ t.Errorf("want: %s, got: %s", tc.failure, err)
+ }
}
}
t.Errorf("want: key=%v, got: empty key", tc.key)
}
} else {
- if strings.Compare(key.PlmnId, tc.key.PlmnId) != 0 || strings.Compare(key.NbId, tc.key.NbId) != 0{
+ if strings.Compare(key.PlmnId, tc.key.PlmnId) != 0 || strings.Compare(key.NbId, tc.key.NbId) != 0 {
t.Errorf("want: key=%v, got: %v", tc.key, key)
}
}
} else {
nb := &entities.NodebInfo{}
nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- nb.Configuration = &entities.NodebInfo_Gnb{Gnb:gnb}
+ nb.Configuration = &entities.NodebInfo_Gnb{Gnb: gnb}
gnbStr := fmt.Sprintf("%s %s", nb.ConnectionStatus, gnb.ServedNrCells)
if !strings.EqualFold(gnbStr, tc.gnb) {
t.Errorf("want: enb=%s, got: %s", tc.gnb, gnbStr)
}
- // Save to rNib
- if tc.saveToRNib {
- if initDb_f {
- rNibWriter.Init("e2Manager", 1)
- initDb_f = false
- }
- nbIdentity := &entities.NbIdentity{InventoryName:"RanName", GlobalNbId:key}
- if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil {
- if tc.failure == nil {
- t.Errorf("rNibWriter failed to save ENB. Error: %v\n", rNibErr.Error())
- } else {
- if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 {
- t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error())
- }
- }
- }
- }
}
})
}
}
-
import (
"e2mgr/e2pdus"
"e2mgr/logger"
- "e2mgr/rNibWriter"
"fmt"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"strings"
logger, _ := logger.InitLogger(logger.InfoLevel)
var testCases = []struct {
- saveToRNib bool
- response string
- packedPdu string
- failure error
+ response string
+ packedPdu string
+ failure error
}{
{
- saveToRNib: false, //TODO: use MOCK?
- response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics:<procedure_code:33 triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
+ response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics:<procedure_code:33 triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
*/
packedPdu: "4006001a0000030005400200000016400100001140087821a00000008040"},
{
- saveToRNib: false,
- response: "CONNECTED_SETUP_FAILED transport_layer_cause:TRANSPORT_RESOURCE_UNAVAILABLE criticality_diagnostics:<procedure_code:33 triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
+ response: "CONNECTED_SETUP_FAILED transport_layer_cause:TRANSPORT_RESOURCE_UNAVAILABLE criticality_diagnostics:<procedure_code:33 triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
*/
packedPdu: "400600140000020005400120001140087821a00000008040"},
{
- saveToRNib: false,
- response: "CONNECTED_SETUP_FAILED protocol_cause:ABSTRACT_SYNTAX_ERROR_IGNORE_AND_NOTIFY criticality_diagnostics:<triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
+ response: "CONNECTED_SETUP_FAILED protocol_cause:ABSTRACT_SYNTAX_ERROR_IGNORE_AND_NOTIFY criticality_diagnostics:<triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
packedPdu: "400600130000020005400144001140073a800000008040"},
{
- saveToRNib: false,
- response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics:<procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
+ response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics:<procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
packedPdu: "400600120000020005400168001140061a0000008040"},
{
- saveToRNib: false,
- response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics:<information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > information_element_criticality_diagnostics:<ie_criticality:NOTIFY ie_id:255 type_of_error:NOT_UNDERSTOOD > > ",
+ response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics:<information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > information_element_criticality_diagnostics:<ie_criticality:NOTIFY ie_id:255 type_of_error:NOT_UNDERSTOOD > > ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
{
- saveToRNib: false,
- response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics:<procedure_code:33 > ",
+ response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED criticality_diagnostics:<procedure_code:33 > ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
packedPdu: "4006000e0000020005400168001140024021"},
{
- saveToRNib: false,
- response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED ",
+ response: "CONNECTED_SETUP_FAILED miscellaneous_cause:UNSPECIFIED ",
/*
E2AP-PDU:
unsuccessfulOutcome_t
*/
packedPdu: "400600080000010005400168"},
{
- saveToRNib: false,
response: "CONNECTED_SETUP_FAILED network_layer_cause:HANDOVER_DESIRABLE_FOR_RADIO_REASONS time_to_wait:V1S criticality_diagnostics:<procedure_code:33 triggering_message:UNSUCCESSFUL_OUTCOME procedure_criticality:NOTIFY information_element_criticality_diagnostics:<ie_criticality:REJECT ie_id:128 type_of_error:MISSING > > ",
/*
E2AP-PDU:
},
}
- initDb_f := true
for _, tc := range testCases {
t.Run(tc.packedPdu, func(t *testing.T) {
} else {
nb := &entities.NodebInfo{}
nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED_SETUP_FAILED
- nb.SetupFailure = response
+ nb.SetupFailure = response
nb.FailureType = entities.Failure_X2_SETUP_FAILURE
respStr := fmt.Sprintf("%s %s", nb.ConnectionStatus, response)
if !strings.EqualFold(respStr, tc.response) {
t.Errorf("want: response=[%s], got: [%s]", tc.response, respStr)
}
- // Save to rNib
- if tc.saveToRNib {
- if initDb_f {
- rNibWriter.Init("e2Manager", 1)
- initDb_f = false
- }
- nbIdentity := &entities.NbIdentity{InventoryName:"RanName"}
- if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil {
- if tc.failure == nil {
- t.Errorf("rNibWriter failed to save ENB. Error: %s\n", rNibErr.Error())
- } else {
- if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 {
- t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error())
- }
- }
- }
- }
}
})
}
}
-
import (
"e2mgr/e2pdus"
"e2mgr/logger"
- "e2mgr/rNibWriter"
"fmt"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"strings"
logger, _ := logger.InitLogger(logger.InfoLevel)
var testCases = []struct {
- saveToRNib bool
- key *entities.GlobalNbId
- enb string
- packedPdu string
- failure error
+ key *entities.GlobalNbId
+ enb string
+ packedPdu string
+ failure error
}{
{
- saveToRNib: false, //TODO: use MOCK?
- key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
- enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD ] []",
+ key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
+ enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD ] []",
/*
X2AP-PDU:
successfulOutcome_t
*/
packedPdu: "2006002a000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829000001000133"},
{
- key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD ] []",
/*
X2AP-PDU:
*/
packedPdu: "20060043000002001500080002f82900007a8000140030010000630002f8290007ab50102002f8290000010001330000640002f9290007ac50203202f82902f929000002000344"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD ] []",
/*
X2AP-PDU:
EARFCNExtension = 0x2
*/
packedPdu: "20060033000002001500080002f82900007a8000140020000000630002f8290007ab50102002f8291000010001330000005f0003800102"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD ] [02f729:0203 02f929:0304]",
/*
X2AP-PDU:
*/
packedPdu: "2006003a000003001500080002f82900007a8000140017000000630002f8290007ab50102002f8290000010001330018000c1002f72902030002f9290304"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<tdd:<ear_fcn:1 transmission_bandwidth:BW50 subframe_assignment:SA2 special_subframe_info:<special_subframe_patterns:SSP4 cyclic_prefix_dl:NORMAL cyclic_prefix_ul:EXTENDED > > > eutra_mode:TDD ] []",
/*
X2AP-PDU:
cyclicPrefixUL_t = 0x1
*/
packedPdu: "2006002a000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829400001320820"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<tdd:<ear_fcn:1 transmission_bandwidth:BW50 subframe_assignment:SA2 special_subframe_info:<special_subframe_patterns:SSP4 cyclic_prefix_dl:EXTENDED cyclic_prefix_ul:NORMAL > additional_special_subframe_info:<additional_special_subframe_patterns:SSP9 cyclic_prefix_dl:NORMAL cyclic_prefix_ul:EXTENDED > > > eutra_mode:TDD ] []",
/*
X2AP-PDU:
*/
packedPdu: "20060032000002001500080002f82900007a800014001f000000630002f8290007ab50102002f8295000013208800000006140021220"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<tdd:<ear_fcn:2 transmission_bandwidth:BW50 subframe_assignment:SA2 special_subframe_info:<special_subframe_patterns:SSP4 cyclic_prefix_dl:EXTENDED cyclic_prefix_ul:NORMAL > > > eutra_mode:TDD ] []",
/*
X2AP-PDU:
*/
packedPdu: "20060033000002001500080002f82900007a8000140020000000630002f8290007ab50102002f8295000013208800000005e0003800102"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<tdd:<ear_fcn:1 transmission_bandwidth:BW50 subframe_assignment:SA2 special_subframe_info:<special_subframe_patterns:SSP4 cyclic_prefix_dl:EXTENDED cyclic_prefix_ul:NORMAL > additional_special_subframe_extension_info:<additional_special_subframe_patterns_extension:SSP10 cyclic_prefix_dl:NORMAL cyclic_prefix_ul:NORMAL > > > eutra_mode:TDD ] []",
/*
X2AP-PDU:
*/
packedPdu: "20060031000002001500080002f82900007a800014001e000000630002f8290007ab50102002f829500001320880000000b3400100"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<tdd:<ear_fcn:2 transmission_bandwidth:BW50 subframe_assignment:SA2 special_subframe_info:<special_subframe_patterns:SSP4 cyclic_prefix_dl:EXTENDED cyclic_prefix_ul:NORMAL > additional_special_subframe_info:<additional_special_subframe_patterns:SSP9 cyclic_prefix_dl:NORMAL cyclic_prefix_ul:EXTENDED > additional_special_subframe_extension_info:<additional_special_subframe_patterns_extension:SSP10 cyclic_prefix_dl:NORMAL cyclic_prefix_ul:NORMAL > > > eutra_mode:TDD ] []",
/*
X2AP-PDU:
*/
packedPdu: "2006003e000002001500080002f82900007a800014002b000000630002f8290007ab50102002f829500001320880000200b3400100006140021220005e0003800102"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80b0"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80b0"},
enb: "CONNECTED HOME_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD ] []",
/*
X2AP-PDU:
*/
packedPdu: "2006004b000002001500090002f82940007a80b000140037010800630002f8290007ab50102002f829000001000133000000294001000000640002f9290007ac50203202f82902f929000002000344"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"},
- enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD prach_configuration:<root_sequence_index:15 zero_correlation_zone_configuration:7 high_speed_flag:true prach_frequency_offset:30 > ] []",
- /*
- X2AP-PDU:
- successfulOutcome_t
- procedureCode_t = 0x6
- criticality_t = 0
- X2SetupResponse
- protocolIEs_t:
- ProtocolIE_Container_elm
- id_t = 0x15
- criticality_t = 0
- GlobalENB-ID
- pLMN_Identity_t = 02 f8 29
- eNB_ID_t:
- short_Macro_eNB_ID_t = 00 7a 40 (18 bits)
- ProtocolIE_Container_elm
- id_t = 0x14
- criticality_t = 0
- ServedCells:
- ServedCells_elm
- servedCellInfo_t
- pCI_t = 0x63
- cellId_t
- pLMN_Identity_t = 02 f8 29
- eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits)
- tAC_t = 01 02
- broadcastPLMNs_t:
- BroadcastPLMNs_Item_elm = 02 f8 29
- eUTRA_Mode_Info_t:
- fDD_t
- uL_EARFCN_t = 0x1
- dL_EARFCN_t = 0x1
- uL_Transmission_Bandwidth_t = 0x3
- dL_Transmission_Bandwidth_t = 0x3
- iE_Extensions_t:
- ProtocolExtensionContainer_elm
- id_t = 0x29
- criticality_t = 0x1
- Number-of-Antennaports = 0
- ServedCells_elm
- servedCellInfo_t
- pCI_t = 0x64
- cellId_t
- pLMN_Identity_t = 02 f9 29
- eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits)
- tAC_t = 02 03
- broadcastPLMNs_t:
- BroadcastPLMNs_Item_elm = 02 f8 29
- BroadcastPLMNs_Item_elm = 02 f9 29
- eUTRA_Mode_Info_t:
- fDD_t
- uL_EARFCN_t = 0x2
- dL_EARFCN_t = 0x3
- uL_Transmission_Bandwidth_t = 0x4
- dL_Transmission_Bandwidth_t = 0x4
- iE_Extensions_t:
- ProtocolExtensionContainer_elm
- id_t = 0x37
- criticality_t = 0x1
- PRACH-Configuration
- rootSequenceIndex_t = 0xf
- zeroCorrelationIndex_t = 0x7
- highSpeedFlag_t = true
- prach_FreqOffset_t = 0x1e
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"},
+ enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD prach_configuration:<root_sequence_index:15 zero_correlation_zone_configuration:7 high_speed_flag:true prach_frequency_offset:30 > ] []",
+ /*
+ X2AP-PDU:
+ successfulOutcome_t
+ procedureCode_t = 0x6
+ criticality_t = 0
+ X2SetupResponse
+ protocolIEs_t:
+ ProtocolIE_Container_elm
+ id_t = 0x15
+ criticality_t = 0
+ GlobalENB-ID
+ pLMN_Identity_t = 02 f8 29
+ eNB_ID_t:
+ short_Macro_eNB_ID_t = 00 7a 40 (18 bits)
+ ProtocolIE_Container_elm
+ id_t = 0x14
+ criticality_t = 0
+ ServedCells:
+ ServedCells_elm
+ servedCellInfo_t
+ pCI_t = 0x63
+ cellId_t
+ pLMN_Identity_t = 02 f8 29
+ eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits)
+ tAC_t = 01 02
+ broadcastPLMNs_t:
+ BroadcastPLMNs_Item_elm = 02 f8 29
+ eUTRA_Mode_Info_t:
+ fDD_t
+ uL_EARFCN_t = 0x1
+ dL_EARFCN_t = 0x1
+ uL_Transmission_Bandwidth_t = 0x3
+ dL_Transmission_Bandwidth_t = 0x3
+ iE_Extensions_t:
+ ProtocolExtensionContainer_elm
+ id_t = 0x29
+ criticality_t = 0x1
+ Number-of-Antennaports = 0
+ ServedCells_elm
+ servedCellInfo_t
+ pCI_t = 0x64
+ cellId_t
+ pLMN_Identity_t = 02 f9 29
+ eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits)
+ tAC_t = 02 03
+ broadcastPLMNs_t:
+ BroadcastPLMNs_Item_elm = 02 f8 29
+ BroadcastPLMNs_Item_elm = 02 f9 29
+ eUTRA_Mode_Info_t:
+ fDD_t
+ uL_EARFCN_t = 0x2
+ dL_EARFCN_t = 0x3
+ uL_Transmission_Bandwidth_t = 0x4
+ dL_Transmission_Bandwidth_t = 0x4
+ iE_Extensions_t:
+ ProtocolExtensionContainer_elm
+ id_t = 0x37
+ criticality_t = 0x1
+ PRACH-Configuration
+ rootSequenceIndex_t = 0xf
+ zeroCorrelationIndex_t = 0x7
+ highSpeedFlag_t = true
+ prach_FreqOffset_t = 0x1e
- */
- packedPdu: "20060056000002001500090002f8298003007a4000140042010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f92900000200034400000037400500000f79e0"},
+ */
+ packedPdu: "20060056000002001500090002f8298003007a4000140042010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f92900000200034400000037400500000f79e0"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"},
- enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD mbsfn_subframe_infos:<radioframe_allocation_period:N8 radioframe_allocation_offset:3 subframe_allocation:\"28\" subframe_allocation_type:ONE_FRAME > ] []",
- /*
- X2AP-PDU:
- successfulOutcome_t
- procedureCode_t = 0x6
- criticality_t = 0
- X2SetupResponse
- protocolIEs_t:
- ProtocolIE_Container_elm
- id_t = 0x15
- criticality_t = 0
- GlobalENB-ID
- pLMN_Identity_t = 02 f8 29
- eNB_ID_t:
- short_Macro_eNB_ID_t = 00 7a 40 (18 bits)
- ProtocolIE_Container_elm
- id_t = 0x14
- criticality_t = 0
- ServedCells:
- ServedCells_elm
- servedCellInfo_t
- pCI_t = 0x63
- cellId_t
- pLMN_Identity_t = 02 f8 29
- eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits)
- tAC_t = 01 02
- broadcastPLMNs_t:
- BroadcastPLMNs_Item_elm = 02 f8 29
- eUTRA_Mode_Info_t:
- fDD_t
- uL_EARFCN_t = 0x1
- dL_EARFCN_t = 0x1
- uL_Transmission_Bandwidth_t = 0x3
- dL_Transmission_Bandwidth_t = 0x3
- iE_Extensions_t:
- ProtocolExtensionContainer_elm
- id_t = 0x29
- criticality_t = 0x1
- Number-of-Antennaports = 0
- ServedCells_elm
- servedCellInfo_t
- pCI_t = 0x64
- cellId_t
- pLMN_Identity_t = 02 f9 29
- eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits)
- tAC_t = 02 03
- broadcastPLMNs_t:
- BroadcastPLMNs_Item_elm = 02 f8 29
- BroadcastPLMNs_Item_elm = 02 f9 29
- eUTRA_Mode_Info_t:
- fDD_t
- uL_EARFCN_t = 0x2
- dL_EARFCN_t = 0x3
- uL_Transmission_Bandwidth_t = 0x4
- dL_Transmission_Bandwidth_t = 0x4
- iE_Extensions_t:
- ProtocolExtensionContainer_elm
- id_t = 0x38
- criticality_t = 0x1
- MBSFN-Subframe-Infolist:
- MBSFN_Subframe_Infolist_elm
- radioframeAllocationPeriod_t = 0x3
- radioframeAllocationOffset_t = 0x3
- subframeAllocation_t:
- oneframe_t = 28 (6 bits)
- */
- packedPdu: "20060054000002001500090002f8298003007a4000140040010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f929000002000344000000384003019850"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"},
+ enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD number_of_antenna_ports:AN1 pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD mbsfn_subframe_infos:<radioframe_allocation_period:N8 radioframe_allocation_offset:3 subframe_allocation:\"28\" subframe_allocation_type:ONE_FRAME > ] []",
+ /*
+ X2AP-PDU:
+ successfulOutcome_t
+ procedureCode_t = 0x6
+ criticality_t = 0
+ X2SetupResponse
+ protocolIEs_t:
+ ProtocolIE_Container_elm
+ id_t = 0x15
+ criticality_t = 0
+ GlobalENB-ID
+ pLMN_Identity_t = 02 f8 29
+ eNB_ID_t:
+ short_Macro_eNB_ID_t = 00 7a 40 (18 bits)
+ ProtocolIE_Container_elm
+ id_t = 0x14
+ criticality_t = 0
+ ServedCells:
+ ServedCells_elm
+ servedCellInfo_t
+ pCI_t = 0x63
+ cellId_t
+ pLMN_Identity_t = 02 f8 29
+ eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits)
+ tAC_t = 01 02
+ broadcastPLMNs_t:
+ BroadcastPLMNs_Item_elm = 02 f8 29
+ eUTRA_Mode_Info_t:
+ fDD_t
+ uL_EARFCN_t = 0x1
+ dL_EARFCN_t = 0x1
+ uL_Transmission_Bandwidth_t = 0x3
+ dL_Transmission_Bandwidth_t = 0x3
+ iE_Extensions_t:
+ ProtocolExtensionContainer_elm
+ id_t = 0x29
+ criticality_t = 0x1
+ Number-of-Antennaports = 0
+ ServedCells_elm
+ servedCellInfo_t
+ pCI_t = 0x64
+ cellId_t
+ pLMN_Identity_t = 02 f9 29
+ eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits)
+ tAC_t = 02 03
+ broadcastPLMNs_t:
+ BroadcastPLMNs_Item_elm = 02 f8 29
+ BroadcastPLMNs_Item_elm = 02 f9 29
+ eUTRA_Mode_Info_t:
+ fDD_t
+ uL_EARFCN_t = 0x2
+ dL_EARFCN_t = 0x3
+ uL_Transmission_Bandwidth_t = 0x4
+ dL_Transmission_Bandwidth_t = 0x4
+ iE_Extensions_t:
+ ProtocolExtensionContainer_elm
+ id_t = 0x38
+ criticality_t = 0x1
+ MBSFN-Subframe-Infolist:
+ MBSFN_Subframe_Infolist_elm
+ radioframeAllocationPeriod_t = 0x3
+ radioframeAllocationOffset_t = 0x3
+ subframeAllocation_t:
+ oneframe_t = 28 (6 bits)
+ */
+ packedPdu: "20060054000002001500090002f8298003007a4000140040010800630002f8290007ab50102002f829000001000133000000294001000800640002f9290007ac50203202f82902f929000002000344000000384003019850"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"},
enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD number_of_antenna_ports:AN1 mbsfn_subframe_infos:<radioframe_allocation_period:N8 radioframe_allocation_offset:3 subframe_allocation:\"28\" subframe_allocation_type:ONE_FRAME > pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD ] []",
/*
X2AP-PDU:
dL_Transmission_Bandwidth_t = 0x4
*/
packedPdu: "20060052000002001500090002f8298003007a400014003e010800630002f8290007ab50102002f82900000100013300010029400100003840030198500000640002f9290007ac50203202f82902f929000002000344"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a40"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a40"},
enb: "CONNECTED SHORT_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD number_of_antenna_ports:AN1 prach_configuration:<root_sequence_index:15 zero_correlation_zone_configuration:7 high_speed_flag:true prach_frequency_offset:30 > pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD ] []",
/*
X2AP-PDU:
dL_Transmission_Bandwidth_t = 0x4
*/
packedPdu: "20060054000002001500090002f8298003007a4000140040010800630002f8290007ab50102002f829000001000133000100294001000037400500000f79e00000640002f9290007ac50203202f82902f929000002000344"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a08"},
- enb: "CONNECTED LONG_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD prach_configuration:<root_sequence_index:15 zero_correlation_zone_configuration:7 high_speed_flag:true prach_frequency_offset:30 prach_configuration_index:60 > pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD ] []",
- /*
- X2AP-PDU:
- successfulOutcome_t
- procedureCode_t = 0x6
- criticality_t = 0
- X2SetupResponse
- protocolIEs_t:
- ProtocolIE_Container_elm
- id_t = 0x15
- criticality_t = 0
- GlobalENB-ID
- pLMN_Identity_t = 02 f8 29
- eNB_ID_t:
- long_Macro_eNB_ID_t = 00 7a 08 (21 bits)
- ProtocolIE_Container_elm
- id_t = 0x14
- criticality_t = 0
- ServedCells:
- ServedCells_elm
- servedCellInfo_t
- pCI_t = 0x63
- cellId_t
- pLMN_Identity_t = 02 f8 29
- eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits)
- tAC_t = 01 02
- broadcastPLMNs_t:
- BroadcastPLMNs_Item_elm = 02 f8 29
- eUTRA_Mode_Info_t:
- fDD_t
- uL_EARFCN_t = 0x1
- dL_EARFCN_t = 0x1
- uL_Transmission_Bandwidth_t = 0x3
- dL_Transmission_Bandwidth_t = 0x3
- iE_Extensions_t:
- ProtocolExtensionContainer_elm
- id_t = 0x37
- criticality_t = 0x1
- PRACH-Configuration
- rootSequenceIndex_t = 0xf
- zeroCorrelationIndex_t = 0x7
- highSpeedFlag_t = true
- prach_FreqOffset_t = 0x1e
- prach_ConfigIndex_t = 0x3c
- ServedCells_elm
- servedCellInfo_t
- pCI_t = 0x64
- cellId_t
- pLMN_Identity_t = 02 f9 29
- eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits)
- tAC_t = 02 03
- broadcastPLMNs_t:
- BroadcastPLMNs_Item_elm = 02 f8 29
- BroadcastPLMNs_Item_elm = 02 f9 29
- eUTRA_Mode_Info_t:
- fDD_t
- uL_EARFCN_t = 0x2
- dL_EARFCN_t = 0x3
- uL_Transmission_Bandwidth_t = 0x4
- dL_Transmission_Bandwidth_t = 0x4
- */
- //packedPdu: "20060050000002001500090002f8298103007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"},
- packedPdu: "20060050000002001500090002f829c003007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a08"},
+ enb: "CONNECTED LONG_MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD prach_configuration:<root_sequence_index:15 zero_correlation_zone_configuration:7 high_speed_flag:true prach_frequency_offset:30 prach_configuration_index:60 > pci:100 cell_id:\"02f929:0007ac50\" tac:\"0203\" broadcast_plmns:\"02f829\" broadcast_plmns:\"02f929\" choice_eutra_mode:<fdd:<ulear_fcn:2 dlear_fcn:3 ul_transmission_bandwidth:BW75 dl_transmission_bandwidth:BW75 > > eutra_mode:FDD ] []",
+ /*
+ X2AP-PDU:
+ successfulOutcome_t
+ procedureCode_t = 0x6
+ criticality_t = 0
+ X2SetupResponse
+ protocolIEs_t:
+ ProtocolIE_Container_elm
+ id_t = 0x15
+ criticality_t = 0
+ GlobalENB-ID
+ pLMN_Identity_t = 02 f8 29
+ eNB_ID_t:
+ long_Macro_eNB_ID_t = 00 7a 08 (21 bits)
+ ProtocolIE_Container_elm
+ id_t = 0x14
+ criticality_t = 0
+ ServedCells:
+ ServedCells_elm
+ servedCellInfo_t
+ pCI_t = 0x63
+ cellId_t
+ pLMN_Identity_t = 02 f8 29
+ eUTRANcellIdentifier_t = 00 07 ab 50 (28 bits)
+ tAC_t = 01 02
+ broadcastPLMNs_t:
+ BroadcastPLMNs_Item_elm = 02 f8 29
+ eUTRA_Mode_Info_t:
+ fDD_t
+ uL_EARFCN_t = 0x1
+ dL_EARFCN_t = 0x1
+ uL_Transmission_Bandwidth_t = 0x3
+ dL_Transmission_Bandwidth_t = 0x3
+ iE_Extensions_t:
+ ProtocolExtensionContainer_elm
+ id_t = 0x37
+ criticality_t = 0x1
+ PRACH-Configuration
+ rootSequenceIndex_t = 0xf
+ zeroCorrelationIndex_t = 0x7
+ highSpeedFlag_t = true
+ prach_FreqOffset_t = 0x1e
+ prach_ConfigIndex_t = 0x3c
+ ServedCells_elm
+ servedCellInfo_t
+ pCI_t = 0x64
+ cellId_t
+ pLMN_Identity_t = 02 f9 29
+ eUTRANcellIdentifier_t = 00 07 ac 50 (28 bits)
+ tAC_t = 02 03
+ broadcastPLMNs_t:
+ BroadcastPLMNs_Item_elm = 02 f8 29
+ BroadcastPLMNs_Item_elm = 02 f9 29
+ eUTRA_Mode_Info_t:
+ fDD_t
+ uL_EARFCN_t = 0x2
+ dL_EARFCN_t = 0x3
+ uL_Transmission_Bandwidth_t = 0x4
+ dL_Transmission_Bandwidth_t = 0x4
+ */
+ //packedPdu: "20060050000002001500090002f8298103007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"},
+ packedPdu: "20060050000002001500090002f829c003007a080014003c010800630002f8290007ab50102002f82900000100013300000037400640000f79ef000000640002f9290007ac50203202f82902f929000002000344"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD csg_id:\"0007aba0\" freq_band_indicator_priority:BROADCASTED bandwidth_reduced_si:SCHEDULED ] []",
/*
X2AP-PDU:
*/
packedPdu: "2006003e000002001500080002f82900007a800014002b000800630002f8290007ab50102002f8290000010001330002004640040007aba000a040014000b4400100"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD mbms_service_area_identities:\"02f8\" mbms_service_area_identities:\"03f9\" multiband_infos:1 multiband_infos:2 multiband_infos:3 freq_band_indicator_priority:NOT_BROADCASTED ] []",
/*
X2AP-PDU:
freqBandIndicator_t = 0x3
*/
packedPdu: "20060044000002001500080002f82900007a8000140031000800630002f8290007ab50102002f8290000010001330002004f40050102f803f900a040010000544006200000010002"},
- { key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD neighbour_infos:<ecgi:\"02f829:0007ab50\" pci:99 ear_fcn:1 > neighbour_infos:<ecgi:\"03f930:0008bc50\" pci:100 ear_fcn:2 > ] []",
/*
X2AP-PDU:
*/
packedPdu: "20060044000002001500080002f82900007a8000140031004000630002f8290007ab50102002f82900000100013300020002f8290007ab50006300010003f9300008bc5000640002"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD neighbour_infos:<ecgi:\"02f829:0007ab50\" pci:99 ear_fcn:1 tac:\"0102\" > neighbour_infos:<ecgi:\"03f930:0008bc50\" pci:100 ear_fcn:3 > ] []",
/*
X2AP-PDU:
*/
packedPdu: "20060055000002001500080002f82900007a8000140042004000630002f8290007ab50102002f82900000100013300024002f8290007ab50006300010000004c400201024003f9300008bc50006400020000005e0003800103"},
- {key: &entities.GlobalNbId{PlmnId:"02f829", NbId:"007a80"},
+ {key: &entities.GlobalNbId{PlmnId: "02f829", NbId: "007a80"},
enb: "CONNECTED MACRO_ENB [pci:99 cell_id:\"02f829:0007ab50\" tac:\"0102\" broadcast_plmns:\"02f829\" choice_eutra_mode:<fdd:<ulear_fcn:1 dlear_fcn:1 ul_transmission_bandwidth:BW50 dl_transmission_bandwidth:BW50 > > eutra_mode:FDD neighbour_infos:<ecgi:\"02f829:0007ab50\" pci:99 ear_fcn:1 tac:\"0102\" > neighbour_infos:<ecgi:\"03f930:0008bc50\" pci:100 ear_fcn:3 > ] []",
/*
X2AP-PDU:
EARFCNExtension = 0x3
*/
packedPdu: "20060055000002001500080002f82900007a8000140042004000630002f8290007ab50102002f82900000100013300024002f8290007ab50006300010000004c400201024003f9300008bc50006400020000005e0003800103",
- /*failure: fmt.Errorf("getAtom for path [successfulOutcome_t X2SetupResponse protocolIEs_t ProtocolIE_Container_elm GlobalENB-ID pLMN_Identity_t] failed, rc = 2" /NO_SPACE_LEFT),*/},
+ /*failure: fmt.Errorf("getAtom for path [successfulOutcome_t X2SetupResponse protocolIEs_t ProtocolIE_Container_elm GlobalENB-ID pLMN_Identity_t] failed, rc = 2" /NO_SPACE_LEFT),*/ },
}
- initDb_f := true
for _, tc := range testCases {
t.Run(tc.packedPdu, func(t *testing.T) {
} else {
nb := &entities.NodebInfo{}
nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- nb.Configuration = &entities.NodebInfo_Enb{Enb:enb}
+ nb.Configuration = &entities.NodebInfo_Enb{Enb: enb}
embStr := fmt.Sprintf("%s %s %s %s", nb.ConnectionStatus, enb.EnbType, enb.ServedCells, enb.GuGroupIds)
if !strings.EqualFold(embStr, tc.enb) {
t.Errorf("want: enb=%s, got: %s", tc.enb, embStr)
}
-
- // Save to rNib
- if tc.saveToRNib {
- if initDb_f {
- rNibWriter.Init("e2Manager", 1)
- initDb_f = false
- }
- nbIdentity := &entities.NbIdentity{InventoryName:"RanName", GlobalNbId:key}
- if rNibErr := rNibWriter.GetRNibWriter().SaveNodeb(nbIdentity, nb); rNibErr != nil {
- if tc.failure == nil {
- t.Errorf("rNibWriter failed to save ENB. Error: %s\n", rNibErr.Error())
- } else {
- if strings.Compare(rNibErr.Error(), tc.failure.Error()) != 0 {
- t.Errorf("want: %s, got: %s", tc.failure, rNibErr.Error())
- }
- }
- }
- }
}
})
}
}
-
"e2mgr/e2managererrors"
"e2mgr/logger"
"e2mgr/models"
- "e2mgr/rNibWriter"
"e2mgr/rmrCgo"
"e2mgr/services"
"e2mgr/stateMachine"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
"time"
)
type DeleteAllRequestHandler struct {
- readerProvider func() reader.RNibReader
- writerProvider func() rNibWriter.RNibWriter
- rmrService *services.RmrService
- config *configuration.Configuration
+ rnibDataService services.RNibDataService
+ rmrService *services.RmrService
+ config *configuration.Configuration
logger *logger.Logger
}
-func NewDeleteAllRequestHandler(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, writerProvider func() rNibWriter.RNibWriter,
- readerProvider func() reader.RNibReader) *DeleteAllRequestHandler {
+func NewDeleteAllRequestHandler(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rnibDataService services.RNibDataService) *DeleteAllRequestHandler {
return &DeleteAllRequestHandler{
logger: logger,
- readerProvider: readerProvider,
- writerProvider: writerProvider,
+ rnibDataService: rnibDataService,
rmrService: rmrService,
config: config,
}
}
func (handler *DeleteAllRequestHandler) updateNodebStates(timeoutExpired bool) (error, bool) {
- nbIdentityList, err := handler.readerProvider().GetListNodebIds()
+ nbIdentityList, err := handler.rnibDataService.GetListNodebIds()
if err != nil {
handler.logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodes list from RNIB. Error: %s", err.Error())
numOfRanToShutDown := 0
for _, nbIdentity := range nbIdentityList {
- node, err := handler.readerProvider().GetNodeb((*nbIdentity).GetInventoryName())
+ node, err := handler.rnibDataService.GetNodeb((*nbIdentity).GetInventoryName())
if err != nil {
handler.logger.Errorf("#DeleteAllRequestHandler.updateNodebStates - failed to get nodeB entity for ran name: %v from RNIB. Error: %s",
node.ConnectionStatus = nextStatus
- err := handler.writerProvider().SaveNodeb(nbIdentity, node)
+ err := handler.rnibDataService.SaveNodeb(nbIdentity, node)
if err != nil {
handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebNextState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s",
node.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
- err := handler.writerProvider().SaveNodeb(nbIdentity, node)
+ err := handler.rnibDataService.SaveNodeb(nbIdentity, node)
if err != nil {
handler.logger.Errorf("#DeleteAllRequestHandler.saveNodebShutDownState - failed to save nodeB entity for inventory name: %v to RNIB. Error: %s",
"testing"
)
-func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T) {
+func setupTest(t *testing.T) (*logger.Logger, *configuration.Configuration, *mocks.RnibReaderMock, *mocks.RnibWriterMock, services.RNibDataService, *mocks.RmrMessengerMock) {
log := initLog(t)
+ config := configuration.ParseConfiguration()
readerMock := &mocks.RnibReaderMock{}
readerProvider := func() reader.RNibReader {
writerProvider := func() rNibWriter.RNibWriter {
return writerMock
}
+ rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
rmrMessengerMock := &mocks.RmrMessengerMock{}
+ return log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock
+}
- config := configuration.ParseConfiguration()
+func TestHandleBeforeTimerGetListNodebIdsFailedFlow(t *testing.T){
+ log, config, readerMock, _, rnibDataService, rmrMessengerMock := setupTest(t)
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
rnibErr := &common.ResourceNotFoundError{}
var nbIdentityList []*entities.NbIdentity
}
}
-func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T) {
- log := initLog(t)
+func TestHandleAfterTimerGetListNodebIdsFailedFlow(t *testing.T){
+ log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(t)
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
config.BigRedButtonTimeoutSec = 1
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
rnibErr := &common.ResourceNotFoundError{}
//Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown
}
}
-func TestHandleSuccessFlow(t *testing.T) {
- log := initLog(t)
+func TestHandleSuccessFlow(t *testing.T){
+ log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(t)
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
config.BigRedButtonTimeoutSec = 1
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
//Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown
nbIdentityList := createIdentityList()
assert.Nil(t, actual)
}
-func TestHandleSuccessGetNextStatusFlow(t *testing.T) {
- log := initLog(t)
+func TestHandleSuccessGetNextStatusFlow(t *testing.T){
+ log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(t)
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
config.BigRedButtonTimeoutSec = 1
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
assert.Nil(t, actual)
}
-func TestHandleShuttingDownStatusFlow(t *testing.T) {
- log := initLog(t)
+func TestHandleShuttingDownStatusFlow(t *testing.T){
+ log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(t)
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
config.BigRedButtonTimeoutSec = 1
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}}
readerMock.On("GetListNodebIds").Return(nbIdentityList, nil)
assert.Nil(t, actual)
}
-func TestHandleGetNodebFailedFlow(t *testing.T) {
- log := initLog(t)
+func TestHandleGetNodebFailedFlow(t *testing.T){
+ log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(t)
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
config.BigRedButtonTimeoutSec = 1
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
//Before timer: Disconnected->ShutDown(will fail), ShuttingDown->Ignore, Connected->ShuttingDown
nbIdentityList := createIdentityList()
assert.Nil(t, actual)
}
-func TestHandleSaveFailedFlow(t *testing.T) {
- log := initLog(t)
+func TestHandleSaveFailedFlow(t *testing.T){
+ log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(t)
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
config.BigRedButtonTimeoutSec = 1
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
//Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail)
nbIdentityList := createIdentityList()
assert.Nil(t, actual)
}
-func TestHandleSendRmrFailedFlow(t *testing.T) {
- log := initLog(t)
+func TestHandleSendRmrFailedFlow(t *testing.T){
+ log, config, readerMock, writerMock, rnibDataService, rmrMessengerMock := setupTest(t)
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
config.BigRedButtonTimeoutSec = 1
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
//Before timer: Disconnected->ShutDown, ShuttingDown->Ignore, Connected->ShuttingDown(will fail)
nbIdentityList := createIdentityList()
}
}
-func TestHandleGetListEnbIdsEmptyFlow(t *testing.T) {
- log := initLog(t)
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- config := configuration.ParseConfiguration()
+func TestHandleGetListEnbIdsEmptyFlow(t *testing.T){
+ log, config, readerMock, _, rnibDataService, rmrMessengerMock := setupTest(t)
- handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, writerProvider, readerProvider)
+ handler := NewDeleteAllRequestHandler(log, getRmrService(rmrMessengerMock, log), config, rnibDataService)
var rnibError error
nbIdentityList := []*entities.NbIdentity{}
"e2mgr/logger"
"e2mgr/managers"
"e2mgr/models"
- "e2mgr/rNibWriter"
"e2mgr/rnibBuilders"
+ "e2mgr/services"
"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/go-ozzo/ozzo-validation"
"github.com/go-ozzo/ozzo-validation/is"
)
)
type SetupRequestHandler struct {
- readerProvider func() reader.RNibReader
- writerProvider func() rNibWriter.RNibWriter
+ rNibDataService services.RNibDataService
logger *logger.Logger
ranSetupManager *managers.RanSetupManager
protocol entities.E2ApplicationProtocol
}
-func NewSetupRequestHandler(logger *logger.Logger, writerProvider func() rNibWriter.RNibWriter, readerProvider func() reader.RNibReader,
+func NewSetupRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService,
ranSetupManager *managers.RanSetupManager, protocol entities.E2ApplicationProtocol) *SetupRequestHandler {
return &SetupRequestHandler{
logger: logger,
- readerProvider: readerProvider,
- writerProvider: writerProvider,
+ rNibDataService: rNibDataService,
ranSetupManager: ranSetupManager,
protocol: protocol,
}
return err
}
- nodebInfo, err := handler.readerProvider().GetNodeb(setupRequest.RanName)
+ nodebInfo, err := handler.rNibDataService.GetNodeb(setupRequest.RanName)
if err != nil {
_, ok := err.(*common.ResourceNotFoundError)
if !ok {
nodebInfo, nodebIdentity := rnibBuilders.CreateInitialNodeInfo(request, protocol)
- rNibErr := handler.writerProvider().SaveNodeb(nodebIdentity, nodebInfo)
+ rNibErr := handler.rNibDataService.SaveNodeb(nodebIdentity, nodebInfo)
if rNibErr != nil {
handler.logger.Errorf("#SetupRequestHandler.connectNewRan - failed to initial nodeb entity for ran name: %v in RNIB. Error: %s", request.RanName, rNibErr.Error())
return e2managererrors.NewRnibDbError()
package httpmsghandlers
import (
+ "e2mgr/configuration"
"e2mgr/e2managererrors"
"e2mgr/e2pdus"
"e2mgr/managers"
"e2mgr/rNibWriter"
"e2mgr/rmrCgo"
"e2mgr/rnibBuilders"
+ "e2mgr/services"
"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"
func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol)(*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock) {
log := initLog(t)
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
readerMock := &mocks.RnibReaderMock{}
readerProvider := func() reader.RNibReader {
rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrService := getRmrService(rmrMessengerMock, log)
- ranSetupManager := managers.NewRanSetupManager(log, rmrService, writerProvider)
- handler := NewSetupRequestHandler(log, writerProvider, readerProvider, ranSetupManager, protocol)
+ rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
+
+ ranSetupManager := managers.NewRanSetupManager(log, rmrService, rnibDataService)
+ handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol)
return readerMock, writerMock, handler, rmrMessengerMock
}
\ No newline at end of file
"e2mgr/e2pdus"
"e2mgr/logger"
"e2mgr/models"
- "e2mgr/rNibWriter"
"e2mgr/rmrCgo"
"e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
)
const (
)
type X2ResetRequestHandler struct {
- readerProvider func() reader.RNibReader
- writerProvider func() rNibWriter.RNibWriter
+ rNibDataService services.RNibDataService
rmrService *services.RmrService
logger *logger.Logger
}
-func NewX2ResetRequestHandler(logger *logger.Logger, rmrService *services.RmrService, writerProvider func() rNibWriter.RNibWriter,
- readerProvider func() reader.RNibReader) *X2ResetRequestHandler {
+func NewX2ResetRequestHandler(logger *logger.Logger, rmrService *services.RmrService, rNibDataService services.RNibDataService) *X2ResetRequestHandler {
return &X2ResetRequestHandler{
- readerProvider: readerProvider,
- writerProvider: writerProvider,
+ rNibDataService: rNibDataService,
rmrService: rmrService,
logger: logger,
}
return e2managererrors.NewRequestValidationError()
}
- nodeb, err := handler.readerProvider().GetNodeb(resetRequest.RanName)
+ nodeb, err := handler.rNibDataService.GetNodeb(resetRequest.RanName)
if err != nil {
handler.logger.Errorf("#reset_request_handler.Handle - failed to get status of RAN: %s from RNIB. Error: %s", resetRequest.RanName, err.Error())
_, ok := err.(*common.ResourceNotFoundError)
package httpmsghandlers
import (
+ "e2mgr/configuration"
"e2mgr/e2managererrors"
"e2mgr/mocks"
"e2mgr/models"
"e2mgr/rNibWriter"
"e2mgr/rmrCgo"
+ "e2mgr/services"
"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"
"testing"
)
-func TestHandleSuccessfulDefaultCause(t *testing.T) {
+func setupX2ResetRequestHandlerTest(t *testing.T) (*X2ResetRequestHandler, *mocks.RmrMessengerMock, *mocks.RnibReaderMock){
log := initLog(t)
-
- ranName := "test1"
-
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
readerMock := &mocks.RnibReaderMock{}
readerProvider := func() reader.RNibReader {
return readerMock
writerProvider := func() rNibWriter.RNibWriter {
return writerMock
}
+ rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
+ rmrMessengerMock := &mocks.RmrMessengerMock{}
+ rmrService := getRmrService(rmrMessengerMock, log)
+ handler := NewX2ResetRequestHandler(log, rmrService, rnibDataService)
+
+ return handler, rmrMessengerMock, readerMock
+}
+func TestHandleSuccessfulDefaultCause(t *testing.T) {
+ handler, rmrMessengerMock, readerMock := setupX2ResetRequestHandlerTest(t)
+
+ ranName := "test1"
// o&m intervention
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)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
- rmrService := getRmrService(rmrMessengerMock, log)
- handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider)
+ rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
}
func TestHandleSuccessfulRequestedCause(t *testing.T) {
- log := initLog(t)
+ handler, rmrMessengerMock, readerMock := setupX2ResetRequestHandlerTest(t)
ranName := "test1"
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
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)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(msg, nil)
- rmrService := getRmrService(rmrMessengerMock, log)
- handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider)
-
var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
}
func TestHandleFailureUnknownCause(t *testing.T) {
- log := initLog(t)
+ handler, _, readerMock := setupX2ResetRequestHandlerTest(t)
ranName := "test1"
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- rmrService := getRmrService(rmrMessengerMock, log)
- handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider)
-
var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
}
func TestHandleFailureWrongState(t *testing.T) {
- log := initLog(t)
+ handler, _, readerMock := setupX2ResetRequestHandlerTest(t)
ranName := "test1"
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- rmrService := getRmrService(rmrMessengerMock, log)
- handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider)
-
var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
}
func TestHandleFailureRanNotFound(t *testing.T) {
- log := initLog(t)
+ handler, _, readerMock := setupX2ResetRequestHandlerTest(t)
ranName := "test1"
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- rmrService := getRmrService(rmrMessengerMock, log)
- handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider)
-
readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("nodeb not found"))
actual := handler.Handle(models.ResetRequest{RanName: ranName})
}
func TestHandleFailureRnibError(t *testing.T) {
- log := initLog(t)
+ handler, _, readerMock := setupX2ResetRequestHandlerTest(t)
ranName := "test1"
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- rmrService := getRmrService(rmrMessengerMock, log)
- handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider)
-
readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{}, common.NewInternalError(fmt.Errorf("internal error")))
actual := handler.Handle(models.ResetRequest{RanName: ranName})
}
func TestHandleFailureRmrError(t *testing.T) {
- log := initLog(t)
+ handler, rmrMessengerMock, readerMock := setupX2ResetRequestHandlerTest(t)
ranName := "test1"
-
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
// o&m intervention
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)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", msg, mock.Anything).Return(&rmrCgo.MBuf{}, fmt.Errorf("rmr error"))
- rmrService := getRmrService(rmrMessengerMock, log)
- handler := NewX2ResetRequestHandler(log, rmrService, writerProvider, readerProvider)
-
var nodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED}
readerMock.On("GetNodeb", ranName).Return(nodeb, nil)
"e2mgr/logger"
"e2mgr/managers"
"e2mgr/models"
+ "e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
)
type E2TermInitNotificationHandler struct {
- rnibReaderProvider func() reader.RNibReader
+ rnibDataService services.RNibDataService
ranReconnectionManager *managers.RanReconnectionManager
}
-func NewE2TermInitNotificationHandler(ranReconnectionManager *managers.RanReconnectionManager, rnibReaderProvider func() reader.RNibReader) E2TermInitNotificationHandler {
+func NewE2TermInitNotificationHandler(ranReconnectionManager *managers.RanReconnectionManager, rnibDataService services.RNibDataService) E2TermInitNotificationHandler {
return E2TermInitNotificationHandler{
- rnibReaderProvider: rnibReaderProvider,
+ rnibDataService: rnibDataService,
ranReconnectionManager: ranReconnectionManager,
}
}
func (handler E2TermInitNotificationHandler) Handle(logger *logger.Logger, request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) {
-logger.Infof("#E2TermInitNotificationHandler.Handle - Handling E2_TERM_INIT")
+ logger.Infof("#E2TermInitNotificationHandler.Handle - Handling E2_TERM_INIT")
- nbIdentityList, err := handler.rnibReaderProvider().GetListNodebIds()
+ nbIdentityList, err := handler.rnibDataService.GetListNodebIds()
if err != nil {
logger.Errorf("#E2TermInitNotificationHandler.Handle - Failed to get nodes list from RNIB. Error: %s", err.Error())
return
"testing"
)
-func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *managers.RanReconnectionManager) {
+func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock) {
logger := initLog(t)
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrService := getRmrService(rmrMessengerMock, logger)
rnibWriterProvider := func() rNibWriter.RNibWriter {
return writerMock
}
- ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibWriterProvider)
- ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager)
- return logger, readerMock, writerMock, rmrMessengerMock, ranReconnectionManager
+ rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
+ ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibDataService)
+ ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager)
+ handler := NewE2TermInitNotificationHandler(ranReconnectionManager, rnibDataService)
+ return logger, handler, readerMock, writerMock, rmrMessengerMock
}
func TestE2TerminInitHandlerSuccessOneRan(t *testing.T) {
- log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
+ log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
var rnibErr error
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
ids := []*entities.NbIdentity{{InventoryName: "test1"}}
readerMock.On("GetListNodebIds").Return(ids, rnibErr)
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
- handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
handler.Handle(log, nil, nil)
writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
}
func TestE2TerminInitHandlerSuccessTwoRans(t *testing.T) {
- log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
+ log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
var rnibErr error
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}}
readerMock.On("GetListNodebIds").Return(ids, rnibErr)
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
- handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
handler.Handle(log, nil, nil)
writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 2)
}
func TestE2TerminInitHandlerSuccessThreeRansFirstRmrFailure(t *testing.T) {
- log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
+ log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
var rnibErr error
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
readerMock.On("GetListNodebIds").Return(ids, rnibErr)
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, fmt.Errorf("RMR Error"))
- handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
handler.Handle(log, nil, nil)
//test1 (before send +1, after failure +1), test2 (0) test3 (0)
}
func TestE2TerminInitHandlerSuccessThreeRansSecondNotFoundFailure(t *testing.T) {
- log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
+ log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
var rnibErr error
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
readerMock.On("GetListNodebIds").Return(ids, rnibErr)
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
- handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
handler.Handle(log, nil, nil)
readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
}
func TestE2TerminInitHandlerSuccessThreeRansSecondRnibInternalErrorFailure(t *testing.T) {
- log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
+ log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
var rnibErr error
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
ids := []*entities.NbIdentity{{InventoryName: "test1"}, {InventoryName: "test2"}, {InventoryName: "test3"}}
readerMock.On("GetListNodebIds").Return(ids, rnibErr)
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg0, nil)
- handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
handler.Handle(log, nil, nil)
readerMock.AssertNumberOfCalls(t, "GetNodeb", 2)
}
func TestE2TerminInitHandlerSuccessZeroRans(t *testing.T) {
- log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
+ log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
var rnibErr error
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, rnibErr)
- handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
handler.Handle(log, nil, nil)
writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
}
func TestE2TerminInitHandlerFailureGetListNodebIds(t *testing.T) {
- log, readerMock, writerMock, rmrMessengerMock, ranReconnectMgr := initRanLostConnectionTest(t)
-
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
+ log, handler, readerMock, writerMock, rmrMessengerMock := initRanLostConnectionTest(t)
readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{}, common.NewInternalError(fmt.Errorf("internal error")))
- handler := NewE2TermInitNotificationHandler(ranReconnectMgr, readerProvider)
handler.Handle(log, nil, nil)
writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 0)
"e2mgr/e2pdus"
"e2mgr/logger"
"e2mgr/models"
- "e2mgr/rNibWriter"
+ "e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"time"
)
type EnbLoadInformationNotificationHandler struct {
- rnibWriterProvider func() rNibWriter.RNibWriter
+ rnibDataService services.RNibDataService
}
-func NewEnbLoadInformationNotificationHandler(rnibWriterProvider func() rNibWriter.RNibWriter) EnbLoadInformationNotificationHandler {
+func NewEnbLoadInformationNotificationHandler(rnibDataService services.RNibDataService) EnbLoadInformationNotificationHandler {
return EnbLoadInformationNotificationHandler{
- rnibWriterProvider: rnibWriterProvider,
+ rnibDataService: rnibDataService,
}
}
logger.Debugf("#EnbLoadInformationNotificationHandler.Handle - RAN name: %s - Successfully done with extracting and building RAN load information. elapsed: %f ms", request.RanName, elapsed(request.StartTime))
- rnibErr := src.rnibWriterProvider().SaveRanLoadInformation(request.RanName, ranLoadInformation)
+ rnibErr := src.rnibDataService.SaveRanLoadInformation(request.RanName, ranLoadInformation)
if rnibErr != nil {
logger.Errorf("#EnbLoadInformationNotificationHandler.Handle - RAN name: %s - Failed saving RAN load information. Error: %v", request.RanName, rnibErr)
"e2mgr/logger"
"e2mgr/managers"
"e2mgr/models"
- "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 SetupResponseNotificationHandler struct {
- rnibReaderProvider func() reader.RNibReader
- rnibWriterProvider func() rNibWriter.RNibWriter
+ rnibDataService services.RNibDataService
setupResponseManager managers.ISetupResponseManager
notificationType string
}
-func NewSetupResponseNotificationHandler(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, setupResponseManager managers.ISetupResponseManager, notificationType string) SetupResponseNotificationHandler {
+func NewSetupResponseNotificationHandler(rnibDataService services.RNibDataService, setupResponseManager managers.ISetupResponseManager, notificationType string) SetupResponseNotificationHandler {
return SetupResponseNotificationHandler{
- rnibReaderProvider: rnibReaderProvider,
- rnibWriterProvider: rnibWriterProvider,
+ rnibDataService: rnibDataService,
setupResponseManager: setupResponseManager,
notificationType: notificationType,
}
inventoryName := request.RanName
- nodebInfo, rnibErr := h.rnibReaderProvider().GetNodeb(inventoryName)
+ nodebInfo, rnibErr := h.rnibDataService.GetNodeb(inventoryName)
if rnibErr != nil {
logger.Errorf("#SetupResponseNotificationHandler - RAN name: %s - Error fetching RAN from rNib: %v", request.RanName, rnibErr)
return
}
- rnibErr = h.rnibWriterProvider().SaveNodeb(nbIdentity, nodebInfo)
+ rnibErr = h.rnibDataService.SaveNodeb(nbIdentity, nodebInfo)
if rnibErr != nil {
logger.Errorf("#SetupResponseNotificationHandler - RAN name: %s - Error saving RAN to rNib: %v", request.RanName, rnibErr)
package rmrmsghandlers
import (
+ "e2mgr/configuration"
"e2mgr/logger"
"e2mgr/managers"
"e2mgr/mocks"
"e2mgr/models"
"e2mgr/rNibWriter"
+ "e2mgr/services"
"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"
logger *logger.Logger
readerMock *mocks.RnibReaderMock
writerMock *mocks.RnibWriterMock
- rnibReaderProvider func() reader.RNibReader
- rnibWriterProvider func() rNibWriter.RNibWriter
+ rnibDataService services.RNibDataService
setupResponseManager managers.ISetupResponseManager
}
func NewSetupResponseTestContext(manager managers.ISetupResponseManager) *setupResponseTestContext {
logger, _ := logger.InitLogger(logger.InfoLevel)
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
readerMock := &mocks.RnibReaderMock{}
writerMock := &mocks.RnibWriterMock{}
+ rnibReaderProvider := func() reader.RNibReader {
+ return readerMock
+ }
+ rnibWriterProvider := func() rNibWriter.RNibWriter {
+ return writerMock
+ }
+ rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
return &setupResponseTestContext{
- logger: logger,
- readerMock: readerMock,
- writerMock: writerMock,
- rnibReaderProvider: func() reader.RNibReader {
- return readerMock
- },
- rnibWriterProvider: func() rNibWriter.RNibWriter {
- return writerMock
- },
+ logger: logger,
+ readerMock: readerMock,
+ writerMock: writerMock,
+ rnibDataService: rnibDataService,
setupResponseManager: manager,
}
}
func TestSetupResponseGetNodebFailure(t *testing.T) {
notificationRequest := models.NotificationRequest{RanName: RanName}
testContext := NewSetupResponseTestContext(nil)
- handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response")
+ handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, &managers.X2SetupResponseManager{}, "X2 Setup Response")
testContext.readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewInternalError(errors.New("Error")))
handler.Handle(testContext.logger, ¬ificationRequest, nil)
testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
ranName := "test"
notificationRequest := models.NotificationRequest{RanName: ranName}
testContext := NewSetupResponseTestContext(nil)
- handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response")
+ handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, &managers.X2SetupResponseManager{}, "X2 Setup Response")
var rnibErr error
testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}, rnibErr)
handler.Handle(testContext.logger, ¬ificationRequest, nil)
notificationRequest := models.NotificationRequest{RanName: RanName, Payload: payload}
testContext := NewSetupResponseTestContext(setupResponseManager)
- handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, testContext.setupResponseManager, notificationType)
+ handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, testContext.setupResponseManager, notificationType)
var rnibErr error
ranName := "test"
notificationRequest := models.NotificationRequest{RanName: ranName, Payload: []byte("123")}
testContext := NewSetupResponseTestContext(nil)
- handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response")
+ handler := NewSetupResponseNotificationHandler(testContext.rnibDataService, &managers.X2SetupResponseManager{}, "X2 Setup Response")
var rnibErr error
testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 1}, rnibErr)
handler.Handle(testContext.logger, ¬ificationRequest, nil)
"e2mgr/logger"
"e2mgr/models"
"e2mgr/rmrCgo"
+ "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"
"unsafe"
)
type X2ResetRequestNotificationHandler struct {
- rnibReaderProvider func() reader.RNibReader
+ rnibDataService services.RNibDataService
}
-func NewX2ResetRequestNotificationHandler(rnibReaderProvider func() reader.RNibReader) X2ResetRequestNotificationHandler {
+func NewX2ResetRequestNotificationHandler(rnibDataService services.RNibDataService) X2ResetRequestNotificationHandler {
return X2ResetRequestNotificationHandler{
- rnibReaderProvider: rnibReaderProvider,
+ rnibDataService: rnibDataService,
}
}
logger.Debugf("#X2ResetRequestNotificationHandler.Handle - Ran name: %s", request.RanName)
- nb, rNibErr := src.rnibReaderProvider().GetNodeb(request.RanName)
+ nb, rNibErr := src.rnibDataService.GetNodeb(request.RanName)
if rNibErr != nil {
logger.Errorf("#X2ResetRequestNotificationHandler.Handle - failed to retrieve nodeB entity. RanName: %s. Error: %s", request.RanName, rNibErr.Error())
printHandlingSetupResponseElapsedTimeInMs(logger, "#X2ResetRequestNotificationHandler.Handle - Summary: Elapsed time for receiving and handling reset request message from E2 terminator", request.StartTime)
package rmrmsghandlers
import (
+ "e2mgr/configuration"
+ "e2mgr/logger"
"e2mgr/mocks"
"e2mgr/models"
"e2mgr/rmrCgo"
+ "e2mgr/services"
"e2mgr/tests"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"time"
)
-func TestX2ResetRequestNotifSuccess(t *testing.T) {
+func initX2ResetRequestNotifHandlerTest(t *testing.T) (*logger.Logger, X2ResetRequestNotificationHandler, *mocks.RnibReaderMock) {
log := initLog(t)
- payload := []byte("payload")
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
readerMock := &mocks.RnibReaderMock{}
readerProvider := func() reader.RNibReader {
return readerMock
}
+ rnibDataService := services.NewRnibDataService(log, config, readerProvider, nil)
+
+ h := NewX2ResetRequestNotificationHandler(rnibDataService)
+ return log, h, readerMock
+}
- h := NewX2ResetRequestNotificationHandler(readerProvider)
+func TestX2ResetRequestNotifSuccess(t *testing.T) {
+ log, h, readerMock := initX2ResetRequestNotifHandlerTest(t)
+
+ payload := []byte("payload")
xaction := []byte("RanName")
mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction)
}
func TestHandleX2ResetRequestNotifShuttingDownStatus(t *testing.T) {
- log := initLog(t)
+ log, h, readerMock := initX2ResetRequestNotifHandlerTest(t)
var payload []byte
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
- h := NewX2ResetRequestNotificationHandler(readerProvider)
xaction := []byte("RanName")
mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction)
}
func TestHandleX2ResetRequestNotifDisconnectStatus(t *testing.T) {
- log := initLog(t)
+ log, h, readerMock := initX2ResetRequestNotifHandlerTest(t)
var payload []byte
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
- h := NewX2ResetRequestNotificationHandler(readerProvider)
xaction := []byte("RanName")
mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction)
func TestHandleX2ResetRequestNotifGetNodebFailed(t *testing.T) {
- log := initLog(t)
+ log, h, readerMock := initX2ResetRequestNotifHandlerTest(t)
var payload []byte
- readerMock := &mocks.RnibReaderMock{}
- readerProvider := func() reader.RNibReader {
- return readerMock
- }
-
- h := NewX2ResetRequestNotificationHandler(readerProvider)
xaction := []byte("RanName")
mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload), "RanName", &payload, &xaction)
notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload,
"e2mgr/e2pdus"
"e2mgr/logger"
"e2mgr/models"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
+ "e2mgr/services"
)
type X2ResetResponseHandler struct {
- rnibReaderProvider func() reader.RNibReader
+ rnibDataService services.RNibDataService
}
-func NewX2ResetResponseHandler(rnibReaderProvider func() reader.RNibReader) X2ResetResponseHandler {
+func NewX2ResetResponseHandler(rnibDataService services.RNibDataService) X2ResetResponseHandler {
return X2ResetResponseHandler{
- rnibReaderProvider: rnibReaderProvider,
+ rnibDataService: rnibDataService,
}
}
logger.Infof("#x2ResetResponseHandler.Handle - received reset response. Payload: %x", request.Payload)
- if nb, rNibErr := src.rnibReaderProvider().GetNodeb(request.RanName); rNibErr != nil {
+ if nb, rNibErr := src.rnibDataService.GetNodeb(request.RanName); rNibErr != nil {
logger.Errorf("#x2ResetResponseHandler.Handle - failed to retrieve nb entity. RanName: %s. Error: %s", request.RanName, rNibErr.Error())
} else {
logger.Debugf("#x2ResetResponseHandler.Handle - nb entity retrieved. RanName %s, ConnectionStatus %s", nb.RanName, nb.ConnectionStatus)
- refinedMessage, err := converters.UnpackX2apPduAndRefine(logger, e2pdus.MaxAsn1CodecAllocationBufferSize , request.Len, request.Payload, e2pdus.MaxAsn1CodecMessageBufferSize /*message buffer*/)
+ refinedMessage, err := converters.UnpackX2apPduAndRefine(logger, e2pdus.MaxAsn1CodecAllocationBufferSize, request.Len, request.Payload, e2pdus.MaxAsn1CodecMessageBufferSize /*message buffer*/)
if err != nil {
logger.Errorf("#x2ResetResponseHandler.Handle - failed to unpack reset response message. RanName %s, Payload: %s", request.RanName, request.Payload)
} else {
package rmrmsghandlers
import (
+ "e2mgr/configuration"
"e2mgr/logger"
"e2mgr/mocks"
"e2mgr/models"
"e2mgr/rmrCgo"
+ "e2mgr/services"
"e2mgr/tests"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"time"
)
-func TestX2ResetResponseSuccess(t *testing.T) {
- payload, err := tests.BuildPackedX2ResetResponse()
- if err != nil {
- t.Errorf("#x2_reset_response_handler_test.TestX2resetResponse - failed to build and pack X2ResetResponse. Error %x", err)
- }
+func initX2ResetResponseHandlerTest(t *testing.T) (*logger.Logger, X2ResetResponseHandler, *mocks.RnibReaderMock) {
log, err := logger.InitLogger(logger.DebugLevel)
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
if err!=nil{
t.Errorf("#sctp_errors_notification_handler_test.TestHandleInSession - failed to initialize logger, error: %s", err)
}
rnibReaderProvider := func() reader.RNibReader {
return readerMock
}
+ rnibDataService := services.NewRnibDataService(log, config, rnibReaderProvider, nil)
+
+ h := NewX2ResetResponseHandler(rnibDataService)
+ return log, h, readerMock
+}
+
+func TestX2ResetResponseSuccess(t *testing.T) {
+ log, h, readerMock := initX2ResetResponseHandlerTest(t)
+
+ payload, err := tests.BuildPackedX2ResetResponse()
+ if err != nil {
+ t.Errorf("#x2_reset_response_handler_test.TestX2resetResponse - failed to build and pack X2ResetResponse. Error %x", err)
+ }
- h := NewX2ResetResponseHandler(rnibReaderProvider)
xaction := []byte("RanName")
mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction)
notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload,
}
func TestX2ResetResponseReaderFailure(t *testing.T) {
- var payload []byte
- log, err := logger.InitLogger(logger.DebugLevel)
- if err!=nil{
- t.Errorf("#sctp_errors_notification_handler_test.TestX2ResetResponseReaderFailure - failed to initialize logger, error: %s", err)
- }
- readerMock :=&mocks.RnibReaderMock{}
- rnibReaderProvider := func() reader.RNibReader {
- return readerMock
- }
+ log, h, readerMock := initX2ResetResponseHandlerTest(t)
- h := NewX2ResetResponseHandler(rnibReaderProvider)
+ var payload []byte
xaction := []byte("RanName")
mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction)
notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload,
}
func TestX2ResetResponseUnpackFailure(t *testing.T) {
- payload := []byte("not valid payload")
- log, err := logger.InitLogger(logger.DebugLevel)
- if err!=nil{
- t.Errorf("#sctp_errors_notification_handler_test.TestX2ResetResponseUnpackFailure - failed to initialize logger, error: %s", err)
- }
- readerMock :=&mocks.RnibReaderMock{}
- rnibReaderProvider := func() reader.RNibReader {
- return readerMock
- }
+ log, h, readerMock := initX2ResetResponseHandlerTest(t)
- h := NewX2ResetResponseHandler(rnibReaderProvider)
+ payload := []byte("not valid payload")
xaction := []byte("RanName")
mBuf := rmrCgo.NewMBuf(tests.MessageType, len(payload),"RanName", &payload, &xaction)
notificationRequest := models.NotificationRequest{RanName: mBuf.Meid, Len: mBuf.Len, Payload: *mBuf.Payload,
reader.Init("e2Manager", MAX_RNIB_POOL_INSTANCES)
defer reader.Close()
+ rnibDataService := services.NewRnibDataService(logger, config, reader.GetRNibReader, rNibWriter.GetRNibWriter)
rmrResponseChannel := make(chan *models.NotificationResponse, config.NotificationResponseBuffer)
rmrService := services.NewRmrService(rmrConfig, msgImpl, rmrResponseChannel)
- var ranSetupManager = managers.NewRanSetupManager(logger, rmrService, rNibWriter.GetRNibWriter)
- var ranReconnectionManager = managers.NewRanReconnectionManager(logger, config, reader.GetRNibReader, rNibWriter.GetRNibWriter, ranSetupManager)
- var nManager = notificationmanager.NewNotificationManager(reader.GetRNibReader, rNibWriter.GetRNibWriter, ranReconnectionManager)
+ var ranSetupManager = managers.NewRanSetupManager(logger, rmrService, rnibDataService)
+ var ranReconnectionManager = managers.NewRanReconnectionManager(logger, config, rnibDataService, ranSetupManager)
+ var nManager = notificationmanager.NewNotificationManager(rnibDataService, ranReconnectionManager)
rmrServiceReceiver := receivers.NewRmrServiceReceiver(*rmrService, nManager)
defer rmrService.CloseContext()
go rmrServiceReceiver.ListenAndHandle()
go rmrService.SendResponse()
- controller := controllers.NewNodebController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter)
- newController := controllers.NewController(logger, rmrService, reader.GetRNibReader, rNibWriter.GetRNibWriter, config, ranSetupManager)
+ controller := controllers.NewNodebController(logger, rmrService, rnibDataService)
+ newController := controllers.NewController(logger, rmrService, rnibDataService, config, ranSetupManager)
runServer(config.Http.Port, controller, newController)
}
"e2mgr/managers"
"e2mgr/models"
"e2mgr/providers/rmrmsghandlerprovider"
- "e2mgr/rNibWriter"
"e2mgr/rmrCgo"
+ "e2mgr/services"
"fmt"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
"time"
)
notificationHandlerProvider *rmrmsghandlerprovider.NotificationHandlerProvider
}
-func NewNotificationManager(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) *NotificationManager {
- notificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager)
+func NewNotificationManager(rnibDataService services.RNibDataService, ranReconnectionManager *managers.RanReconnectionManager) *NotificationManager {
+ notificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider(rnibDataService, ranReconnectionManager)
return &NotificationManager{
notificationHandlerProvider: notificationHandlerProvider,
import (
"e2mgr/configuration"
"e2mgr/logger"
- "e2mgr/rNibWriter"
+ "e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
)
type IRanReconnectionManager interface {
}
type RanReconnectionManager struct {
- logger *logger.Logger
- config *configuration.Configuration
- rnibReaderProvider func() reader.RNibReader
- rnibWriterProvider func() rNibWriter.RNibWriter
- ranSetupManager *RanSetupManager
+ logger *logger.Logger
+ config *configuration.Configuration
+ rnibDataService services.RNibDataService
+ ranSetupManager *RanSetupManager
}
-func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader,
- rnibWriterProvider func() rNibWriter.RNibWriter, ranSetupManager *RanSetupManager) *RanReconnectionManager {
+func NewRanReconnectionManager(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, ranSetupManager *RanSetupManager) *RanReconnectionManager {
return &RanReconnectionManager{
- logger: logger,
- config: config,
- rnibReaderProvider: rnibReaderProvider,
- rnibWriterProvider: rnibWriterProvider,
- ranSetupManager: ranSetupManager,
+ logger: logger,
+ config: config,
+ rnibDataService: rnibDataService,
+ ranSetupManager: ranSetupManager,
}
}
func (m *RanReconnectionManager) ReconnectRan(inventoryName string) error {
- nodebInfo, rnibErr := m.rnibReaderProvider().GetNodeb(inventoryName)
+ nodebInfo, rnibErr := m.rnibDataService.GetNodeb(inventoryName)
if rnibErr != nil {
m.logger.Errorf("#RanReconnectionManager.ReconnectRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, rnibErr)
}
nodebInfo.ConnectionStatus = connectionStatus;
- err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo)
+ err := m.rnibDataService.UpdateNodebInfo(nodebInfo)
if err != nil {
m.logger.Errorf("#RanReconnectionManager.updateNodebInfoStatus - RAN name: %s - Failed updating RAN's connection status to %s in rNib. Error: %v", nodebInfo.RanName, connectionStatus, err)
if err != nil {
t.Errorf("#... - failed to initialize logger, error: %s", err)
}
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrService := getRmrService(rmrMessengerMock, logger)
rnibWriterProvider := func() rNibWriter.RNibWriter {
return writerMock
}
- ranSetupManager := NewRanSetupManager(logger, rmrService, rnibWriterProvider)
- ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager)
+ rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
+ ranSetupManager := NewRanSetupManager(logger, rmrService, rnibDataService)
+ ranReconnectionManager := NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager)
return logger, rmrMessengerMock, readerMock, writerMock, ranReconnectionManager
}
"e2mgr/e2pdus"
"e2mgr/logger"
"e2mgr/models"
- "e2mgr/rNibWriter"
"e2mgr/rmrCgo"
"e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
type RanSetupManager struct {
logger *logger.Logger
- rnibWriterProvider func() rNibWriter.RNibWriter
+ rnibDataService services.RNibDataService
rmrService *services.RmrService
}
-func NewRanSetupManager(logger *logger.Logger, rmrService *services.RmrService, rnibWriterProvider func() rNibWriter.RNibWriter) *RanSetupManager {
+func NewRanSetupManager(logger *logger.Logger, rmrService *services.RmrService, rnibDataService services.RNibDataService) *RanSetupManager {
return &RanSetupManager{
logger: logger,
- rnibWriterProvider: rnibWriterProvider,
+ rnibDataService: rnibDataService,
rmrService: rmrService,
}
}
// Update retries and connection status
nodebInfo.ConnectionStatus = status
nodebInfo.ConnectionAttempts++
- err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo)
+ err := m.rnibDataService.UpdateNodebInfo(nodebInfo)
if err != nil {
m.logger.Errorf("#RanSetupManager.updateConnectionStatus - Ran name: %s - Failed updating RAN's connection status to %v : %s", nodebInfo.RanName, status, err)
} else {
// Update retries and connection status
nodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
nodebInfo.ConnectionAttempts--
- err := m.rnibWriterProvider().UpdateNodebInfo(nodebInfo)
+ err := m.rnibDataService.UpdateNodebInfo(nodebInfo)
if err != nil {
m.logger.Errorf("#RanSetupManager.updateConnectionStatusDisconnected - Ran name: %s - Failed updating RAN's connection status to DISCONNECTED : %s", nodebInfo.RanName, err)
} else {
package managers
import (
+ "e2mgr/configuration"
"e2mgr/e2managererrors"
"e2mgr/e2pdus"
"e2mgr/logger"
"e2mgr/mocks"
"e2mgr/rNibWriter"
"e2mgr/rmrCgo"
+ "e2mgr/services"
"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/assert"
"github.com/stretchr/testify/mock"
"testing"
)
-func TestExecuteSetupConnectingX2Setup(t *testing.T) {
- log := initLog(t)
+func initRanSetupManagerTest(t *testing.T) (*mocks.RmrMessengerMock, *mocks.RnibWriterMock, *RanSetupManager) {
+ logger, err := logger.InitLogger(logger.DebugLevel)
+ if err != nil {
+ t.Errorf("#... - failed to initialize logger, error: %s", err)
+ }
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
- ranName := "test1"
+ rmrMessengerMock := &mocks.RmrMessengerMock{}
+ rmrService := getRmrService(rmrMessengerMock, logger)
+ readerMock := &mocks.RnibReaderMock{}
+ rnibReaderProvider := func() reader.RNibReader {
+ return readerMock
+ }
writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
+ rnibWriterProvider := func() rNibWriter.RNibWriter {
return writerMock
}
+ rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
+ ranSetupManager := NewRanSetupManager(logger, rmrService, rnibDataService)
+ return rmrMessengerMock, writerMock, ranSetupManager
+}
+
+func TestExecuteSetupConnectingX2Setup(t *testing.T) {
+ rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
+
+ ranName := "test1"
var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
payload := e2pdus.PackedX2setupRequest
xaction := []byte(ranName)
msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
- rmrService := getRmrService(rmrMessengerMock, log)
- mgr := NewRanSetupManager(log, rmrService, writerProvider)
if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil {
t.Errorf("want: success, got: error: %s", err)
}
}
func TestExecuteSetupConnectingEndcX2Setup(t *testing.T) {
- log := initLog(t)
+ rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
ranName := "test1"
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
- var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
+ var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST}
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, ConnectionAttempts: 1}
var rnibErr error
writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr)
payload := e2pdus.PackedEndcX2setupRequest
xaction := []byte(ranName)
msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
- rmrService := getRmrService(rmrMessengerMock, log)
- mgr := NewRanSetupManager(log, rmrService, writerProvider)
if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err != nil {
t.Errorf("want: success, got: error: %s", err)
}
}
func TestExecuteSetupDisconnected(t *testing.T) {
- log := initLog(t)
+ rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
ranName := "test1"
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
payload := []byte{0}
xaction := []byte(ranName)
msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure"))
- rmrService := getRmrService(rmrMessengerMock, log)
- mgr := NewRanSetupManager(log, rmrService, writerProvider)
if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
t.Errorf("want: failure, got: success")
}
}
func TestExecuteSetupConnectingRnibError(t *testing.T) {
- log := initLog(t)
+ rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
ranName := "test1"
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
payload := []byte{0}
xaction := []byte(ranName)
msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure"))
- rmrService := getRmrService(rmrMessengerMock, log)
- mgr := NewRanSetupManager(log, rmrService, writerProvider)
if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
t.Errorf("want: failure, got: success")
} else {
}
func TestExecuteSetupDisconnectedRnibError(t *testing.T) {
- log := initLog(t)
+ rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
ranName := "test1"
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 1}
var argNodebDisconnected = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, ConnectionAttempts: 0}
payload := []byte{0}
xaction := []byte(ranName)
msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, fmt.Errorf("send failure"))
- rmrService := getRmrService(rmrMessengerMock, log)
- mgr := NewRanSetupManager(log, rmrService, writerProvider)
if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
t.Errorf("want: failure, got: success")
} else {
}
func TestExecuteSetupUnsupportedProtocol(t *testing.T) {
- log := initLog(t)
+ rmrMessengerMock, writerMock, mgr := initRanSetupManagerTest(t)
ranName := "test1"
- writerMock := &mocks.RnibWriterMock{}
- writerProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL}
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_UNKNOWN_E2_APPLICATION_PROTOCOL, ConnectionAttempts: 1}
var rnibErr error
payload := e2pdus.PackedX2setupRequest
xaction := []byte(ranName)
msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xaction)
- rmrMessengerMock := &mocks.RmrMessengerMock{}
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(msg, nil)
- rmrService := getRmrService(rmrMessengerMock, log)
- mgr := NewRanSetupManager(log, rmrService, writerProvider)
if err := mgr.ExecuteSetup(initialNodeb, entities.ConnectionStatus_CONNECTING); err == nil {
t.Errorf("want: error, got: success")
}
"e2mgr/handlers/httpmsghandlers"
"e2mgr/logger"
"e2mgr/managers"
- "e2mgr/rNibWriter"
"e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
)
type IncomingRequest string
logger *logger.Logger
}
-func NewIncomingRequestHandlerProvider(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter,
- rNibReaderProvider func() reader.RNibReader, ranSetupManager *managers.RanSetupManager) *IncomingRequestHandlerProvider {
+func NewIncomingRequestHandlerProvider(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibDataService services.RNibDataService, ranSetupManager *managers.RanSetupManager) *IncomingRequestHandlerProvider {
return &IncomingRequestHandlerProvider{
- requestMap: initRequestHandlerMap(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider, ranSetupManager),
+ requestMap: initRequestHandlerMap(logger, rmrService, config, rNibDataService, ranSetupManager),
logger: logger,
}
}
-func initRequestHandlerMap(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibWriterProvider func() rNibWriter.RNibWriter,
- rNibReaderProvider func() reader.RNibReader, ranSetupManager *managers.RanSetupManager) map[IncomingRequest]httpmsghandlers.RequestHandler {
+func initRequestHandlerMap(logger *logger.Logger, rmrService *services.RmrService, config *configuration.Configuration, rNibDataService services.RNibDataService, ranSetupManager *managers.RanSetupManager) map[IncomingRequest]httpmsghandlers.RequestHandler {
return map[IncomingRequest]httpmsghandlers.RequestHandler{
- ShutdownRequest: httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrService, config, rNibWriterProvider, rNibReaderProvider), //TODO change to pointer
- ResetRequest: httpmsghandlers.NewX2ResetRequestHandler(logger, rmrService, rNibWriterProvider, rNibReaderProvider),
- X2SetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibWriterProvider, rNibReaderProvider, ranSetupManager, entities.E2ApplicationProtocol_X2_SETUP_REQUEST),
- EndcSetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibWriterProvider, rNibReaderProvider, ranSetupManager, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST), //TODO change to pointer
+ ShutdownRequest: httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrService, config, rNibDataService), //TODO change to pointer
+ ResetRequest: httpmsghandlers.NewX2ResetRequestHandler(logger, rmrService, rNibDataService),
+ X2SetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_X2_SETUP_REQUEST),
+ EndcSetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST), //TODO change to pointer
}
}
return services.NewRmrService(services.NewRmrConfig(tests.Port, tests.MaxMsgSize, tests.Flags, log), rmrMessenger, messageChannel)
}
-func TestNewIncomingRequestHandlerProvider(t *testing.T) {
+func setupTest(t *testing.T) *IncomingRequestHandlerProvider {
rmrMessengerMock := &mocks.RmrMessengerMock{}
-
log := initLog(t)
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
readerProvider := func() reader.RNibReader {
return &mocks.RnibReaderMock{}
}
writerProvider := func() rNibWriter.RNibWriter {
return &mocks.RnibWriterMock{}
}
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager)
+ rnibDataService := services.NewRnibDataService(log, config, readerProvider, writerProvider)
+ ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rnibDataService)
+ return NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), rnibDataService, ranSetupManager)
+}
+
+func TestNewIncomingRequestHandlerProvider(t *testing.T) {
+ provider := setupTest(t)
assert.NotNil(t, provider)
}
func TestShutdownRequestHandler(t *testing.T) {
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- log := initLog(t)
- readerProvider := func() reader.RNibReader {
- return &mocks.RnibReaderMock{}
- }
- writerProvider := func() rNibWriter.RNibWriter {
- return &mocks.RnibWriterMock{}
- }
-
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager)
-
+ provider := setupTest(t)
handler, err := provider.GetHandler(ShutdownRequest)
assert.NotNil(t, provider)
}
func TestX2SetupRequestHandler(t *testing.T) {
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- log := initLog(t)
- readerProvider := func() reader.RNibReader {
- return &mocks.RnibReaderMock{}
- }
- writerProvider := func() rNibWriter.RNibWriter {
- return &mocks.RnibWriterMock{}
- }
-
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager)
-
+ provider := setupTest(t)
handler, err := provider.GetHandler(X2SetupRequest)
assert.NotNil(t, provider)
}
func TestEndcSetupRequestHandler(t *testing.T) {
- rmrMessengerMock := &mocks.RmrMessengerMock{}
-
- log := initLog(t)
- readerProvider := func() reader.RNibReader {
- return &mocks.RnibReaderMock{}
- }
- writerProvider := func() rNibWriter.RNibWriter {
- return &mocks.RnibWriterMock{}
- }
-
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager)
-
+ provider := setupTest(t)
handler, err := provider.GetHandler(EndcSetupRequest)
assert.NotNil(t, provider)
}
func TestGetShutdownHandlerFailure(t *testing.T) {
- rmrMessengerMock := &mocks.RmrMessengerMock{}
- log := initLog(t)
- readerProvider := func() reader.RNibReader {
- return &mocks.RnibReaderMock{}
- }
- writerProvider := func() rNibWriter.RNibWriter {
- return &mocks.RnibWriterMock{}
- }
-
- ranSetupManager := managers.NewRanSetupManager(log, getRmrService(rmrMessengerMock, log), rNibWriter.GetRNibWriter)
- provider := NewIncomingRequestHandlerProvider(log, getRmrService(rmrMessengerMock, log), configuration.ParseConfiguration(), writerProvider, readerProvider, ranSetupManager)
-
+ provider := setupTest(t)
_, actual := provider.GetHandler("test")
expected := &e2managererrors.InternalError{}
import (
"e2mgr/handlers/rmrmsghandlers"
"e2mgr/managers"
- "e2mgr/rNibWriter"
"e2mgr/rmrCgo"
+ "e2mgr/services"
"fmt"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
)
type NotificationHandlerProvider struct {
notificationHandlers map[int]rmrmsghandlers.NotificationHandler
}
-func NewNotificationHandlerProvider(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) *NotificationHandlerProvider {
+func NewNotificationHandlerProvider(rnibDataService services.RNibDataService, ranReconnectionManager *managers.RanReconnectionManager) *NotificationHandlerProvider {
return &NotificationHandlerProvider{
- notificationHandlers: initNotificationHandlersMap(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager),
+ notificationHandlers: initNotificationHandlersMap(rnibDataService, ranReconnectionManager),
}
}
//TODO change handlers.NotificationHandler to *handlers.NotificationHandler
-func initNotificationHandlersMap(rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter, ranReconnectionManager *managers.RanReconnectionManager) map[int]rmrmsghandlers.NotificationHandler {
+func initNotificationHandlersMap(rnibDataService services.RNibDataService, ranReconnectionManager *managers.RanReconnectionManager) map[int]rmrmsghandlers.NotificationHandler {
return map[int]rmrmsghandlers.NotificationHandler{
- rmrCgo.RIC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupResponseManager(), "X2 Setup Response"),
- rmrCgo.RIC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response"),
- rmrCgo.RIC_ENDC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupResponseManager(), "ENDC Setup Response"),
- rmrCgo.RIC_ENDC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"),
+ rmrCgo.RIC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupResponseManager(), "X2 Setup Response"),
+ rmrCgo.RIC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response"),
+ rmrCgo.RIC_ENDC_X2_SETUP_RESP: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupResponseManager(), "ENDC Setup Response"),
+ rmrCgo.RIC_ENDC_X2_SETUP_FAILURE: rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"),
rmrCgo.RIC_SCTP_CONNECTION_FAILURE: rmrmsghandlers.NewRanLostConnectionHandler(ranReconnectionManager),
- rmrCgo.RIC_ENB_LOAD_INFORMATION: rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibWriterProvider),
+ rmrCgo.RIC_ENB_LOAD_INFORMATION: rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibDataService),
rmrCgo.RIC_ENB_CONF_UPDATE: rmrmsghandlers.NewX2EnbConfigurationUpdateHandler(),
rmrCgo.RIC_ENDC_CONF_UPDATE: rmrmsghandlers.NewEndcConfigurationUpdateHandler(),
- rmrCgo.RIC_X2_RESET_RESP: rmrmsghandlers.NewX2ResetResponseHandler(rnibReaderProvider),
- rmrCgo.RIC_X2_RESET: rmrmsghandlers.NewX2ResetRequestNotificationHandler(rnibReaderProvider),
- rmrCgo.RIC_E2_TERM_INIT: rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibReaderProvider),
+ rmrCgo.RIC_X2_RESET_RESP: rmrmsghandlers.NewX2ResetResponseHandler(rnibDataService),
+ rmrCgo.RIC_X2_RESET: rmrmsghandlers.NewX2ResetRequestNotificationHandler(rnibDataService),
+ rmrCgo.RIC_E2_TERM_INIT: rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibDataService),
}
}
* Verify support for known providers.
*/
-func TestGetNotificationHandlerSuccess(t *testing.T) {
-
+func initTestCase(t *testing.T) (services.RNibDataService, *managers.RanReconnectionManager) {
logger := initLog(t)
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
readerMock := &mocks.RnibReaderMock{}
rnibReaderProvider := func() reader.RNibReader {
rnibWriterProvider := func() rNibWriter.RNibWriter {
return writerMock
}
- ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rNibWriter.GetRNibWriter)
- ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager)
+ rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
+ ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rnibDataService)
+ ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager)
+ return rnibDataService, ranReconnectionManager
+}
+
+func TestGetNotificationHandlerSuccess(t *testing.T) {
+
+ rnibDataService, ranReconnectionManager := initTestCase(t)
var testCases = []struct {
msgType int
handler rmrmsghandlers.NotificationHandler
}{
- {rmrCgo.RIC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupResponseManager(), "X2 Setup Response")},
- {rmrCgo.RIC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response")},
- {rmrCgo.RIC_ENDC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupResponseManager(), "ENDC Setup Response")},
- {rmrCgo.RIC_ENDC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibReaderProvider, rnibWriterProvider, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"),},
+ {rmrCgo.RIC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupResponseManager(), "X2 Setup Response")},
+ {rmrCgo.RIC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewX2SetupFailureResponseManager(), "X2 Setup Failure Response")},
+ {rmrCgo.RIC_ENDC_X2_SETUP_RESP, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupResponseManager(), "ENDC Setup Response")},
+ {rmrCgo.RIC_ENDC_X2_SETUP_FAILURE, rmrmsghandlers.NewSetupResponseNotificationHandler(rnibDataService, managers.NewEndcSetupFailureResponseManager(), "ENDC Setup Failure Response"),},
{rmrCgo.RIC_SCTP_CONNECTION_FAILURE, rmrmsghandlers.NewRanLostConnectionHandler(ranReconnectionManager)},
- {rmrCgo.RIC_ENB_LOAD_INFORMATION, rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibWriterProvider)},
+ {rmrCgo.RIC_ENB_LOAD_INFORMATION, rmrmsghandlers.NewEnbLoadInformationNotificationHandler(rnibDataService)},
{rmrCgo.RIC_ENB_CONF_UPDATE, rmrmsghandlers.X2EnbConfigurationUpdateHandler{}},
{rmrCgo.RIC_ENDC_CONF_UPDATE, rmrmsghandlers.EndcConfigurationUpdateHandler{}},
- {rmrCgo.RIC_E2_TERM_INIT, rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibReaderProvider)},
+ {rmrCgo.RIC_E2_TERM_INIT, rmrmsghandlers.NewE2TermInitNotificationHandler(ranReconnectionManager, rnibDataService)},
}
for _, tc := range testCases {
- provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager)
+ provider := NewNotificationHandlerProvider(rnibDataService, ranReconnectionManager)
t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) {
handler, err := provider.GetNotificationHandler(tc.msgType)
if err != nil {
func TestGetNotificationHandlerFailure(t *testing.T) {
- logger := initLog(t)
-
var testCases = []struct {
msgType int
errorText string
{9999 /*unknown*/, "notification handler not found"},
}
for _, tc := range testCases {
- readerMock := &mocks.RnibReaderMock{}
- rnibReaderProvider := func() reader.RNibReader {
- return readerMock
- }
- writerMock := &mocks.RnibWriterMock{}
- rnibWriterProvider := func() rNibWriter.RNibWriter {
- return writerMock
- }
-
- ranSetupManager := managers.NewRanSetupManager(logger, getRmrService(&mocks.RmrMessengerMock{}, logger), rNibWriter.GetRNibWriter)
- ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager)
-
- provider := NewNotificationHandlerProvider(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager)
+
+ rnibDataService, ranReconnectionManager := initTestCase(t)
+ provider := NewNotificationHandlerProvider(rnibDataService, ranReconnectionManager)
t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) {
_, err := provider.GetNotificationHandler(tc.msgType)
if err == nil {
notificationResponseBuffer: 100
bigRedButtonTimeoutSec: 5
maxConnectionAttempts: 3
+maxRnibConnectionAttempts: 3
+rnibRetryIntervalMs: 10
}
func getRmrServiceReceiver(rmrMessengerMock *mocks.RmrMessengerMock, logger *logger.Logger) *RmrServiceReceiver {
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
+
readerMock := &mocks.RnibReaderMock{}
rnibReaderProvider := func() reader.RNibReader {
return readerMock
return writerMock
}
+ rnibDataService := services.NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
rmrService := getRmrService(rmrMessengerMock, logger)
- ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rNibWriter.GetRNibWriter)
- ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibReaderProvider, rnibWriterProvider, ranSetupManager)
- nManager := notificationmanager.NewNotificationManager(rnibReaderProvider, rnibWriterProvider, ranReconnectionManager)
+ ranSetupManager := managers.NewRanSetupManager(logger, rmrService, rnibDataService)
+ ranReconnectionManager := managers.NewRanReconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, ranSetupManager)
+ nManager := notificationmanager.NewNotificationManager(rnibDataService, ranReconnectionManager)
return NewRmrServiceReceiver(*rmrService, nManager)
}
--- /dev/null
+package services
+
+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"
+ "net"
+ "time"
+)
+
+type RNibDataService interface {
+ SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error
+ UpdateNodebInfo(nodebInfo *entities.NodebInfo) error
+ SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error
+ GetNodeb(ranName string) (*entities.NodebInfo, error)
+ GetListNodebIds() ([]*entities.NbIdentity, error)
+}
+
+type rNibDataService struct {
+ logger *logger.Logger
+ rnibReaderProvider func() reader.RNibReader
+ rnibWriterProvider func() rNibWriter.RNibWriter
+ maxAttempts int
+ retryInterval time.Duration
+}
+
+func NewRnibDataService(logger *logger.Logger, config *configuration.Configuration, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *rNibDataService {
+ return &rNibDataService{
+ logger: logger,
+ rnibReaderProvider: rnibReaderProvider,
+ rnibWriterProvider: rnibWriterProvider,
+ maxAttempts: config.MaxRnibConnectionAttempts,
+ retryInterval: time.Duration(config.RnibRetryIntervalMs) * time.Millisecond,
+ }
+}
+
+func (w *rNibDataService) UpdateNodebInfo(nodebInfo *entities.NodebInfo) error {
+ w.logger.Infof("#RnibDataService.UpdateNodebInfo - nodebInfo: %s", nodebInfo)
+
+ err := w.retry("UpdateNodebInfo", func() (err error) {
+ err = w.rnibWriterProvider().UpdateNodebInfo(nodebInfo)
+ return
+ })
+
+ return err
+}
+
+func (w *rNibDataService) SaveNodeb(nbIdentity *entities.NbIdentity, nb *entities.NodebInfo) error {
+ w.logger.Infof("#RnibDataService.SaveNodeb - nbIdentity: %s, nodebInfo: %s", nbIdentity, nb)
+
+ err := w.retry("SaveNodeb", func() (err error) {
+ err = w.rnibWriterProvider().SaveNodeb(nbIdentity, nb)
+ return
+ })
+
+ return err
+}
+
+func (w *rNibDataService) SaveRanLoadInformation(inventoryName string, ranLoadInformation *entities.RanLoadInformation) error {
+ w.logger.Infof("#RnibDataService.SaveRanLoadInformation - inventoryName: %s, ranLoadInformation: %s", inventoryName, ranLoadInformation)
+
+ err := w.retry("SaveRanLoadInformation", func() (err error) {
+ err = w.rnibWriterProvider().SaveRanLoadInformation(inventoryName, ranLoadInformation)
+ return
+ })
+
+ return err
+}
+
+func (w *rNibDataService) GetNodeb(ranName string) (*entities.NodebInfo, error) {
+ w.logger.Infof("#RnibDataService.GetNodeb - ranName: %s", ranName)
+
+ var nodeb *entities.NodebInfo = nil
+
+ err := w.retry("GetNodeb", func() (err error) {
+ nodeb, err = w.rnibReaderProvider().GetNodeb(ranName)
+ return
+ })
+
+ return nodeb, err
+}
+
+func (w *rNibDataService) GetListNodebIds() ([]*entities.NbIdentity, error) {
+ w.logger.Infof("#RnibDataService.GetListNodebIds")
+
+ var nodeIds []*entities.NbIdentity = nil
+
+ err := w.retry("GetListNodebIds", func() (err error) {
+ nodeIds, err = w.rnibReaderProvider().GetListNodebIds()
+ return
+ })
+
+ return nodeIds, err
+}
+
+func (w *rNibDataService) retry(rnibFunc string, f func() error) (err error) {
+ attempts := w.maxAttempts
+
+ for i := 1; ; i++ {
+ err = f()
+ if err == nil {
+ return
+ }
+ if !w.isConnError(err) {
+ return err
+ }
+ if i >= attempts {
+ w.logger.Errorf("#RnibDataService.retry - after %d attempts of %s, last error: %s", attempts, rnibFunc, err)
+ return err
+ }
+ time.Sleep(w.retryInterval)
+
+ w.logger.Infof("#RnibDataService.retry - retrying %d %s after error: %s", i, rnibFunc, err)
+ }
+}
+
+func (w *rNibDataService) isConnError(err error) bool {
+ internalErr, ok := err.(common.InternalError)
+ if !ok {
+ return false
+ }
+ _, ok = internalErr.Err.(*net.OpError)
+
+ return ok
+}
--- /dev/null
+package services
+
+import (
+ "e2mgr/configuration"
+ "e2mgr/logger"
+ "e2mgr/mocks"
+ "e2mgr/rNibWriter"
+ "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/assert"
+ "net"
+ "strings"
+ "testing"
+)
+
+func setupTest(t *testing.T) (*rNibDataService, *mocks.RnibReaderMock, *mocks.RnibWriterMock) {
+ logger, err := logger.InitLogger(logger.DebugLevel)
+ if err != nil {
+ t.Errorf("#... - failed to initialize logger, error: %s", err)
+ }
+
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
+
+ readerMock := &mocks.RnibReaderMock{}
+ rnibReaderProvider := func() reader.RNibReader {
+ return readerMock
+ }
+
+ writerMock := &mocks.RnibWriterMock{}
+ rnibWriterProvider := func() rNibWriter.RNibWriter {
+ return writerMock
+ }
+
+ rnibDataService := NewRnibDataService(logger, config, rnibReaderProvider, rnibWriterProvider)
+ assert.NotNil(t, rnibDataService)
+
+ return rnibDataService, readerMock, writerMock
+}
+
+func TestSuccessfulSaveNodeb(t *testing.T) {
+ rnibDataService, _, writerMock := setupTest(t)
+
+ nodebInfo := &entities.NodebInfo{}
+ nbIdentity := &entities.NbIdentity{}
+ writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
+
+ rnibDataService.SaveNodeb(nbIdentity, nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
+}
+
+func TestConnFailureSaveNodeb(t *testing.T) {
+ rnibDataService, _, writerMock := setupTest(t)
+
+ nodebInfo := &entities.NodebInfo{}
+ nbIdentity := &entities.NbIdentity{}
+ mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}}
+ writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(mockErr)
+
+ rnibDataService.SaveNodeb(nbIdentity, nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "SaveNodeb", 3)
+}
+
+func TestNonConnFailureSaveNodeb(t *testing.T) {
+ rnibDataService, _, writerMock := setupTest(t)
+
+ nodebInfo := &entities.NodebInfo{}
+ nbIdentity := &entities.NbIdentity{}
+ mockErr := common.InternalError{Err: fmt.Errorf("non connection failure")}
+ writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(mockErr)
+
+ rnibDataService.SaveNodeb(nbIdentity, nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "SaveNodeb", 1)
+}
+
+func TestSuccessfulUpdateNodebInfo(t *testing.T) {
+ rnibDataService, _, writerMock := setupTest(t)
+
+ nodebInfo := &entities.NodebInfo{}
+ writerMock.On("UpdateNodebInfo", nodebInfo).Return(nil)
+
+ rnibDataService.UpdateNodebInfo(nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)
+}
+
+func TestConnFailureUpdateNodebInfo(t *testing.T) {
+ rnibDataService, _, writerMock := setupTest(t)
+
+ nodebInfo := &entities.NodebInfo{}
+ mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}}
+ writerMock.On("UpdateNodebInfo", nodebInfo).Return(mockErr)
+
+ rnibDataService.UpdateNodebInfo(nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 3)
+}
+
+func TestSuccessfulSaveRanLoadInformation(t *testing.T) {
+ rnibDataService, _, writerMock := setupTest(t)
+
+ var ranName string = "abcd"
+ ranLoadInformation := &entities.RanLoadInformation{}
+ writerMock.On("SaveRanLoadInformation", ranName, ranLoadInformation).Return(nil)
+
+ rnibDataService.SaveRanLoadInformation(ranName, ranLoadInformation)
+ writerMock.AssertNumberOfCalls(t, "SaveRanLoadInformation", 1)
+}
+
+func TestConnFailureSaveRanLoadInformation(t *testing.T) {
+ rnibDataService, _, writerMock := setupTest(t)
+
+ var ranName string = "abcd"
+ ranLoadInformation := &entities.RanLoadInformation{}
+ mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}}
+ writerMock.On("SaveRanLoadInformation", ranName, ranLoadInformation).Return(mockErr)
+
+ rnibDataService.SaveRanLoadInformation(ranName, ranLoadInformation)
+ writerMock.AssertNumberOfCalls(t, "SaveRanLoadInformation", 3)
+}
+
+func TestSuccessfulGetNodeb(t *testing.T) {
+ rnibDataService, readerMock, _ := setupTest(t)
+
+ invName := "abcd"
+ nodebInfo := &entities.NodebInfo{}
+ readerMock.On("GetNodeb", invName).Return(nodebInfo, nil)
+
+ res, err := rnibDataService.GetNodeb(invName)
+ readerMock.AssertNumberOfCalls(t, "GetNodeb", 1)
+ assert.Equal(t, nodebInfo, res)
+ assert.Nil(t, err)
+}
+
+func TestConnFailureGetNodeb(t *testing.T) {
+ rnibDataService, readerMock, _ := setupTest(t)
+
+ invName := "abcd"
+ var nodeb *entities.NodebInfo = nil
+ mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}}
+ readerMock.On("GetNodeb", invName).Return(nodeb, mockErr)
+
+ res, err := rnibDataService.GetNodeb(invName)
+ readerMock.AssertNumberOfCalls(t, "GetNodeb", 3)
+ assert.True(t, strings.Contains(err.Error(), "connection error", ))
+ assert.Equal(t, nodeb, res)
+}
+
+func TestSuccessfulGetNodebIdList(t *testing.T) {
+ rnibDataService, readerMock, _ := setupTest(t)
+
+ nodeIds := []*entities.NbIdentity{}
+ readerMock.On("GetListNodebIds").Return(nodeIds, nil)
+
+ res, err := rnibDataService.GetListNodebIds()
+ readerMock.AssertNumberOfCalls(t, "GetListNodebIds", 1)
+ assert.Equal(t, nodeIds, res)
+ assert.Nil(t, err)
+}
+
+func TestConnFailureGetNodebIdList(t *testing.T) {
+ rnibDataService, readerMock, _ := setupTest(t)
+
+ var nodeIds []*entities.NbIdentity = nil
+ mockErr := common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}}
+ readerMock.On("GetListNodebIds").Return(nodeIds, mockErr)
+
+ res, err := rnibDataService.GetListNodebIds()
+ readerMock.AssertNumberOfCalls(t, "GetListNodebIds", 3)
+ assert.True(t, strings.Contains(err.Error(), "connection error", ))
+ assert.Equal(t, nodeIds, res)
+}
+
+//func TestConnFailureThenSuccessGetNodebIdList(t *testing.T) {
+// rnibDataService, readerMock, _ := setupTest(t)
+//
+// var nilNodeIds []*entities.NbIdentity = nil
+// nodeIds := []*entities.NbIdentity{}
+// mockErr := common.InternalError{Err: &net.OpError{Err:fmt.Errorf("connection error")}}
+// //readerMock.On("GetListNodebIds").Return(nilNodeIds, mockErr)
+// //readerMock.On("GetListNodebIds").Return(nodeIds, nil)
+//
+// res, err := rnibDataService.GetListNodebIds()
+// readerMock.AssertNumberOfCalls(t, "GetListNodebIds", 2)
+// assert.True(t, strings.Contains(err.Error(),"connection failure", ))
+// assert.Equal(t, nodeIds, res)
+//}
+++ /dev/null
-//
-// Copyright 2019 AT&T Intellectual Property
-// Copyright 2019 Nokia
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-package services
-
-import (
- "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 RnibReaderService struct {
- rnibReaderProvider func() reader.RNibReader
-}
-
-func NewRnibReaderService(rnibReaderProvider func() reader.RNibReader) *RnibReaderService{
- return &RnibReaderService{rnibReaderProvider}
-}
-
-func (s RnibReaderService) GetNodeb(ranName string) (*entities.NodebInfo, error) {
- return s.rnibReaderProvider().GetNodeb(ranName)
-}
-
-func (s RnibReaderService) GetNodebIdList()([]*entities.NbIdentity, error) {
- return s.rnibReaderProvider().GetListNodebIds()
-}
-
-