# The Jenkins job requires a tag to build the Docker image.
# Global-JJB script assumes this file is in the repo root.
---
-tag: 5.2.16
+tag: 5.2.17
return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager, ranListManager
}
+func setupDeleteEnbControllerTest(t *testing.T, preAddNbIdentity bool) (*NodebController, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *entities.NbIdentity) {
+ log := initLog(t)
+ config := configuration.ParseConfiguration()
+
+ rmrMessengerMock := &mocks.RmrMessengerMock{}
+ readerMock := &mocks.RnibReaderMock{}
+
+ writerMock := &mocks.RnibWriterMock{}
+
+ rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
+ rmrSender := getRmrSender(rmrMessengerMock, log)
+ e2tInstancesManager := &mocks.E2TInstancesManagerMock{}
+ httpClientMock := &mocks.HttpClientMock{}
+ rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
+ ranListManager := managers.NewRanListManager(log, rnibDataService)
+ var nbIdentity *entities.NbIdentity
+ if preAddNbIdentity {
+ nbIdentity = &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
+ writerMock.On("AddNbIdentity", entities.Node_ENB, nbIdentity).Return(nil)
+ ranListManager.AddNbIdentity(entities.Node_ENB, nbIdentity)
+ }
+ ranAlarmService := &mocks.RanAlarmServiceMock{}
+ ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService)
+ nodebValidator := managers.NewNodebValidator()
+ updateEnbManager := managers.NewUpdateEnbManager(log, rnibDataService, nodebValidator)
+
+ handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager, nodebValidator, updateEnbManager, ranListManager)
+ controller := NewNodebController(log, handlerProvider)
+ return controller, readerMock, writerMock, nbIdentity
+}
+
func TestShutdownHandlerRnibError(t *testing.T) {
controller, _, _, _, e2tInstancesManagerMock, _ := setupControllerTest(t)
e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, e2managererrors.NewRnibDbError())
assertControllerAddEnb(t, context, writer, readerMock, writerMock)
}
-func controllerDeleteEnbTestExecuter(t *testing.T, context *controllerDeleteEnbTestContext) {
- controller, readerMock, writerMock, _, _, _ := setupControllerTest(t)
+func controllerDeleteEnbTestExecuter(t *testing.T, context *controllerDeleteEnbTestContext, preAddNbIdentity bool) {
+ controller, readerMock, writerMock, nbIdentity := setupDeleteEnbControllerTest(t, preAddNbIdentity)
readerMock.On("GetNodeb", RanName).Return(context.getNodebInfoResult.nodebInfo, context.getNodebInfoResult.rnibError)
if context.getNodebInfoResult.rnibError == nil && context.getNodebInfoResult.nodebInfo.GetNodeType() == entities.Node_ENB {
writerMock.On("RemoveEnb", context.getNodebInfoResult.nodebInfo).Return(nil)
+ if preAddNbIdentity {
+ writerMock.On("RemoveNbIdentity", entities.Node_ENB, nbIdentity).Return(nil)
+ }
}
writer := httptest.NewRecorder()
r, _ := http.NewRequest(http.MethodDelete, AddEnbUrl+"/"+RanName, nil)
expectedJsonResponse: RnibErrorJson,
}
- controllerDeleteEnbTestExecuter(t, &context)
+ controllerDeleteEnbTestExecuter(t, &context, false)
}
func TestControllerDeleteEnbNodebNotExistsFailure(t *testing.T) {
expectedJsonResponse: ResourceNotFoundJson,
}
- controllerDeleteEnbTestExecuter(t, &context)
+ controllerDeleteEnbTestExecuter(t, &context, false)
}
func TestControllerDeleteEnbNodebNotEnb(t *testing.T) {
expectedJsonResponse: ValidationFailureJson,
}
- controllerDeleteEnbTestExecuter(t, &context)
+ controllerDeleteEnbTestExecuter(t, &context, false)
}
func TestControllerDeleteEnbSuccess(t *testing.T) {
context := controllerDeleteEnbTestContext{
getNodebInfoResult: &getNodebInfoResult{
- nodebInfo: &entities.NodebInfo{RanName: "ran1", NodeType: entities.Node_ENB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
+ nodebInfo: &entities.NodebInfo{RanName: RanName, NodeType: entities.Node_ENB, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED},
rnibError: nil,
},
expectedStatusCode: http.StatusNoContent,
expectedJsonResponse: "",
}
- controllerDeleteEnbTestExecuter(t, &context)
+ controllerDeleteEnbTestExecuter(t, &context, true)
}
func getJsonRequestAsBuffer(requestJson map[string]interface{}) *bytes.Buffer {
module e2mgr
require (
- gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.45
- gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.45
- gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.45
+ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.46
+ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.46
+ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.46
gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.5.2
github.com/golang/protobuf v1.4.2
github.com/gorilla/mux v1.7.0
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.44/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.45 h1:2zwckksGVcIkXJeymAPvtyaO3bb+8UCyRENY8/q1yZs=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.45/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.46 h1:mUn8CsJYcliKK35Xm7xMjkrTnhksZ9AinPkTu44ABKA=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.46/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.44 h1:/Kye3C5ZAJkK1ux1mNrQEE4Jph537EV6DJ1qOCtKPqQ=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.44/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.45 h1:YuNGHpf6UsHkvi4qqxbE6ijuceRqoz5+qdWe6nUTNIU=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.45/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.46 h1:bd1nDjy20ia7vUWw3Dqvxf9shMSAtJOObSotr4iwGxM=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.46/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.44 h1:VCOBMhSZJE3hZJLA+eJOZCrCoifCDi7ZmR3aMdV5mP8=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.44/go.mod h1:eRI+ExoQG8rEzexqRtW5Shn2tT/7w9l+WqaiPZqOsEA=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.45 h1:p+yPMhomeiQy+qermMGzBhwh/i9T2gaL8cWOT3V5DG4=
gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.45/go.mod h1:3p1bZS4GA2MGVg5CHZEnMlCuO7KXpfW3Y38HTAbo6/4=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.46 h1:GlwpSMYc0wuARKfiEfF0p0ttsinWhmvKVpFZknGor24=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.46/go.mod h1:O83fcA6x8B7tPBgr2ihBXsfRkcL0m3NWYMLsD/gvGWU=
gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2 h1:UK7awyRKIkVdokWvvkYvazlg3EWIfMnIqCcJxTnLlDA=
gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2/go.mod h1:y2WhrCvdLkAKdH+ySdHSOSehACJkTMyZghCGVcqoZzc=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
import (
"e2mgr/e2managererrors"
"e2mgr/logger"
+ "e2mgr/managers"
"e2mgr/models"
"e2mgr/services"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
type DeleteEnbRequestHandler struct {
logger *logger.Logger
rNibDataService services.RNibDataService
+ ranListManager managers.RanListManager
}
-func NewDeleteEnbRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService) *DeleteEnbRequestHandler {
+func NewDeleteEnbRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService, ranListManager managers.RanListManager) *DeleteEnbRequestHandler {
return &DeleteEnbRequestHandler{
logger: logger,
rNibDataService: rNibDataService,
+ ranListManager: ranListManager,
}
}
return nil, e2managererrors.NewRequestValidationError()
}
-
err = h.rNibDataService.RemoveEnb(nodebInfo)
-
if err != nil {
h.logger.Errorf("#DeleteEnbRequestHandler.Handle - RAN name: %s - failed to delete nodeb entity in RNIB. Error: %s", deleteEnbRequest.RanName, err)
return nil, e2managererrors.NewRnibDbError()
}
+ err = h.ranListManager.RemoveNbIdentity(entities.Node_ENB, deleteEnbRequest.RanName)
+ if err != nil {
+ h.logger.Errorf("#DeleteEnbRequestHandler.Handle - RAN name: %s - failed to delete nbIdentity in RNIB. Error: %s", deleteEnbRequest.RanName, err)
+ return nil, e2managererrors.NewRnibDbError()
+ }
+
h.logger.Infof("#DeleteEnbRequestHandler.Handle - RAN name: %s - deleted successfully.", deleteEnbRequest.RanName)
return models.NewNodebResponse(nodebInfo), nil
}
-
import (
"e2mgr/configuration"
+ "e2mgr/managers"
"e2mgr/mocks"
"e2mgr/models"
"e2mgr/services"
"testing"
)
-func setupDeleteEnbRequestHandlerTest(t *testing.T) (*DeleteEnbRequestHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock) {
+func setupDeleteEnbRequestHandlerTest(t *testing.T, emptyList bool) (*DeleteEnbRequestHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock) {
log := initLog(t)
config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}
readerMock := &mocks.RnibReaderMock{}
writerMock := &mocks.RnibWriterMock{}
rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock)
- handler := NewDeleteEnbRequestHandler(log, rnibDataService)
+ ranListManager := managers.NewRanListManager(log, rnibDataService)
+ if !emptyList {
+ nbIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
+ writerMock.On("AddNbIdentity", entities.Node_ENB, nbIdentity).Return(nil)
+ if err := ranListManager.AddNbIdentity(entities.Node_ENB, nbIdentity); err != nil {
+ t.Errorf("#setupDeleteEnbRequestHandlerTest - Failed to add nbIdentity prior to DeleteEnb test")
+ }
+ }
+ handler := NewDeleteEnbRequestHandler(log, rnibDataService, ranListManager)
return handler, readerMock, writerMock
}
func TestHandleDeleteEnbSuccess(t *testing.T) {
- handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t)
+ handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t, false)
- ranName := "test1"
+ ranName := "ran1"
+ var rnibError error
+ nodebInfo := &entities.NodebInfo{RanName: ranName, NodeType: entities.Node_ENB}
+ readerMock.On("GetNodeb", ranName).Return(nodebInfo, rnibError)
+ writerMock.On("RemoveEnb", nodebInfo).Return(nil)
+ writerMock.On("RemoveNbIdentity", entities.Node_ENB, &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}).Return(nil)
+ result, err := handler.Handle(&models.DeleteEnbRequest{RanName: ranName})
+ assert.Nil(t, err)
+ assert.NotNil(t, result)
+ assert.IsType(t, &models.NodebResponse{}, result)
+ readerMock.AssertExpectations(t)
+ writerMock.AssertExpectations(t)
+}
+
+func TestHandleDeleteEnbSuccessNoEnb(t *testing.T) {
+ handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t, true)
+
+ ranName := "ran1"
var rnibError error
nodebInfo := &entities.NodebInfo{RanName: ranName, NodeType: entities.Node_ENB}
readerMock.On("GetNodeb", ranName).Return(nodebInfo, rnibError)
}
func TestHandleDeleteEnbInternalGetNodebError(t *testing.T) {
- handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t)
+ handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t, false)
- ranName := "test1"
+ ranName := "ran1"
rnibError := errors.New("for test")
var nodebInfo *entities.NodebInfo
readerMock.On("GetNodeb", ranName).Return(nodebInfo, rnibError)
}
func TestHandleDeleteEnbInternalRemoveEnbError(t *testing.T) {
- handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t)
+ handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t, false)
- ranName := "test1"
+ ranName := "ran1"
rnibError := errors.New("for test")
nodebInfo := &entities.NodebInfo{RanName: ranName, NodeType: entities.Node_ENB}
readerMock.On("GetNodeb", ranName).Return(nodebInfo, nil)
writerMock.AssertExpectations(t)
}
+func TestHandleDeleteEnbInternalRemoveNbIdentityError(t *testing.T) {
+ handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t, false)
+
+ ranName := "ran1"
+ rnibError := errors.New("for test")
+ nodebInfo := &entities.NodebInfo{RanName: ranName, NodeType: entities.Node_ENB}
+ readerMock.On("GetNodeb", ranName).Return(nodebInfo, nil)
+ writerMock.On("RemoveEnb", nodebInfo).Return(nil)
+ writerMock.On("RemoveNbIdentity", entities.Node_ENB, &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}).Return(rnibError)
+ result, err := handler.Handle(&models.DeleteEnbRequest{RanName: ranName})
+ assert.NotNil(t, err)
+ assert.Nil(t, result)
+ readerMock.AssertExpectations(t)
+ writerMock.AssertExpectations(t)
+}
+
func TestHandleDeleteEnbResourceNotFoundError(t *testing.T) {
- handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t)
+ handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t, false)
- ranName := "test1"
+ ranName := "ran1"
rnibError := common.NewResourceNotFoundError("for test")
var nodebInfo *entities.NodebInfo
readerMock.On("GetNodeb", ranName).Return(nodebInfo, rnibError)
}
func TestHandleDeleteEnbNodeTypeNotEnbError(t *testing.T) {
- handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t)
+ handler, readerMock, writerMock := setupDeleteEnbRequestHandlerTest(t, false)
- ranName := "test1"
+ ranName := "ran1"
nodebInfo := &entities.NodebInfo{RanName: ranName, NodeType: entities.Node_GNB}
readerMock.On("GetNodeb", ranName).Return(nodebInfo, nil)
result, err := handler.Handle(&models.DeleteEnbRequest{RanName: ranName})
}
func (m *ranListManagerInstance) RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error {
- //TODO: implement
+ m.mux.Lock()
+ defer m.mux.Unlock()
+
+ m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - deleting nodeb identity from memory and db...", ranName)
+
+ nbIdentity, ok := m.nbIdentityMap[ranName]
+ if !ok {
+ m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - nodeb identity not found", ranName)
+ return nil
+ }
+
+ delete(m.nbIdentityMap, ranName)
+
+ err := m.rnibDataService.RemoveNbIdentity(nodeType, nbIdentity)
+ if err != nil {
+ m.logger.Errorf("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Failed removing nodeb identity from DB. error: %s", ranName, err)
+ return err
+ }
+
+ m.logger.Infof("#ranListManagerInstance.RemoveNbIdentity - RAN name: %s - Successfully deleted nodeb identity", ranName)
return nil
}
UpdateGnbRequest: httpmsghandlers.NewUpdateGnbRequestHandler(logger, rNibDataService),
UpdateEnbRequest: httpmsghandlers.NewUpdateNodebRequestHandler(logger, rNibDataService, updateEnbManager),
AddEnbRequest: httpmsghandlers.NewAddEnbRequestHandler(logger, rNibDataService, nodebValidator, ranListManager),
- DeleteEnbRequest: httpmsghandlers.NewDeleteEnbRequestHandler(logger, rNibDataService),
+ DeleteEnbRequest: httpmsghandlers.NewDeleteEnbRequestHandler(logger, rNibDataService, ranListManager),
}
}
sdlInstanceMock.AssertExpectations(t)
}
+func TestRemoveNbIdentitySuccess(t *testing.T) {
+ w, sdlInstanceMock := initSdlInstanceMock(namespace)
+ nbIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
+ nbIdData, err := proto.Marshal(nbIdentity)
+ if err != nil {
+ t.Errorf("#TestRemoveNbIdentitySuccess - failed to Marshal NbIdentity")
+ }
+
+ sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), []interface{}{nbIdData}).Return(nil)
+
+ rNibErr := w.RemoveNbIdentity(entities.Node_ENB, nbIdentity)
+ assert.Nil(t, rNibErr)
+ sdlInstanceMock.AssertExpectations(t)
+}
+
+func TestRemoveNbIdentityError(t *testing.T) {
+ w, sdlInstanceMock := initSdlInstanceMock(namespace)
+ nbIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}}
+ nbIdData, err := proto.Marshal(nbIdentity)
+ if err != nil {
+ t.Errorf("#TestRemoveNbIdentitySuccess - failed to Marshal NbIdentity")
+ }
+
+ sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), []interface{}{nbIdData}).Return(fmt.Errorf("for test"))
+
+ rNibErr := w.RemoveNbIdentity(entities.Node_ENB, nbIdentity)
+ assert.NotNil(t, rNibErr)
+ sdlInstanceMock.AssertExpectations(t)
+}
+
//Integration tests
//
//func TestSaveEnbGnbInteg(t *testing.T){
RemoveServedCells(inventoryName string, servedCells []*entities.ServedCellInfo) error
UpdateEnb(nodebInfo *entities.NodebInfo, servedCells []*entities.ServedCellInfo) error
AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
+ RemoveNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error
}
type rNibDataService struct {
return err
}
+func (w *rNibDataService) RemoveNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error{
+ w.logger.Infof("#RnibDataService.RemoveNbIdentity - nbIdentity: %s", nbIdentity)
+
+ err := w.retry("RemoveNbIdentity", func() (err error) {
+ err = w.rnibWriter.RemoveNbIdentity(nodeType, nbIdentity)
+ return
+ })
+
+ return err
+}
+
func (w *rNibDataService) RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error {
err := w.retry("RemoveServedNrCells", func() (err error) {
err = w.rnibWriter.RemoveServedNrCells(inventoryName, servedNrCells)