GetNodebIdList(writer http.ResponseWriter, r *http.Request)
SetGeneralConfiguration(writer http.ResponseWriter, r *http.Request)
AddEnb(writer http.ResponseWriter, r *http.Request)
+ DeleteEnb(writer http.ResponseWriter, r *http.Request)
}
type NodebController struct {
c.handleRequest(writer, &r.Header, httpmsghandlerprovider.AddEnbRequest, &addEnbRequest, true, http.StatusCreated)
}
+func (c *NodebController) DeleteEnb(writer http.ResponseWriter, r *http.Request) {
+ c.logger.Infof("[Client -> E2 Manager] #NodebController.DeleteEnb - request: %v", c.prettifyRequest(r))
+ vars := mux.Vars(r)
+ ranName := vars["ranName"]
+ request := models.DeleteEnbRequest{RanName: ranName}
+ c.handleRequest(writer, &r.Header, httpmsghandlerprovider.DeleteEnbRequest, request, true, http.StatusNoContent)
+}
+
func (c *NodebController) SetGeneralConfiguration(writer http.ResponseWriter, r *http.Request) {
c.logger.Infof("[Client -> E2 Manager] #NodebController.SetGeneralConfiguration - request: %v", c.prettifyRequest(r))
updatedNb1 := *nb1
updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RAN_CONNECTION_STATUS_CHANGE", "RanName_1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}
writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
updatedNb1 := *nb1
updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RAN_CONNECTION_STATUS_CHANGE", "RanName_1_DISCONNECTED").Return(common.NewInternalError(errors.New("error")))
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(common.NewInternalError(errors.New("error")))
_, err := h.Handle(nil)
updatedNb1 := *nb1
updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RAN_CONNECTION_STATUS_CHANGE", "RanName_1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
updatedNb1 := *nb1
updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RAN_CONNECTION_STATUS_CHANGE", "RanName_1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(common.NewInternalError(errors.New("error")))
updatedNb1 := *nb1
updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RAN_CONNECTION_STATUS_CHANGE", "RanName_1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,}
writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil)
--- /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.
+
+// This source code is part of the near-RT RIC (RAN Intelligent Controller)
+// platform project (RICP).
+
+package httpmsghandlers
+
+import (
+ "e2mgr/e2managererrors"
+ "e2mgr/logger"
+ "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/entities"
+)
+
+type DeleteEnbRequestHandler struct {
+ logger *logger.Logger
+ rNibDataService services.RNibDataService
+}
+
+func NewDeleteEnbRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService) *AddEnbRequestHandler {
+ return &AddEnbRequestHandler{
+ logger: logger,
+ rNibDataService: rNibDataService,
+ }
+}
+
+func (h *DeleteEnbRequestHandler) Handle(request models.Request) (models.IResponse, error) {
+
+ deleteEnbRequest := request.(*models.DeleteEnbRequest)
+
+ h.logger.Infof("#DeleteEnbRequestHandler.Handle - Ran name: %s", deleteEnbRequest.RanName)
+
+ nodebInfo, err := h.rNibDataService.GetNodeb(deleteEnbRequest.RanName)
+
+ if err != nil {
+ _, ok := err.(*common.ResourceNotFoundError)
+ if !ok {
+ h.logger.Errorf("#DeleteEnbRequestHandler.Handle - RAN name: %s - failed to get nodeb entity from RNIB. Error: %s", deleteEnbRequest.RanName, err)
+ return nil, e2managererrors.NewRnibDbError()
+ }
+
+ h.logger.Errorf("#DeleteEnbRequestHandler.Handle - RAN name: %s - RAN not found on RNIB. Error: %s", deleteEnbRequest.RanName, err)
+ return nil, e2managererrors.NewResourceNotFoundError()
+ }
+
+ if nodebInfo.NodeType != entities.Node_ENB {
+ h.logger.Errorf("#DeleteEnbRequestHandler.Handle - RAN name: %s - RAN is not eNB.", deleteEnbRequest.RanName)
+ 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()
+ }
+
+ return models.NewDeleteEnbResponse(nodebInfo), nil
+}
+
writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil)
updatedNodebInfo := *nodebInfo
updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
updatedNodebInfo2 := *nodebInfo
updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
writerMock.On("UpdateNodebInfo", gnbToUpdate).Return(nil)
gnbToUpdate2 := *gnbToUpdate
gnbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, nodebRanName+"_CONNECTED").Return(nil)
gnbToUpdate3 := *gnbToUpdate
gnbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED
gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress
writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil)
updatedNodebInfo := *nodebInfo
updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, StateChangeMessageChannel, nodebRanName+"_CONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, nodebRanName+"_CONNECTED").Return(nil)
writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
updatedNodebInfo2 := *nodebInfo
updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, StateChangeMessageChannel, nodebRanName+"_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo2, nodebRanName+"_DISCONNECTED").Return(nil)
var errEmpty error
mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest)
rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty)
var gnb *entities.NodebInfo
readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found"))
writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil)
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, StateChangeMessageChannel, mock.Anything).Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil)
routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil)
writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil)
e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil)
readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "RAN_CONNECTION_STATUS_CHANGE", "test_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr)
var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "RAN_CONNECTION_STATUS_CHANGE", "test_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil)
var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"}
readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr)
readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr)
updatedNodebInfo1 := *origNodebInfo
updatedNodebInfo1.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo1, StateChangeMessageChannel, ranName+"_DISCONNECTED").Return(rnibErr)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo1, ranName+"_DISCONNECTED").Return(rnibErr)
updatedNodebInfo2 := *origNodebInfo
updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
updatedNodebInfo2.AssociatedE2TInstanceAddress = ""
rr.HandleFunc("/ids", nodebController.GetNodebIdList).Methods(http.MethodGet)
rr.HandleFunc("/{ranName}", nodebController.GetNodeb).Methods(http.MethodGet)
rr.HandleFunc("/enb", nodebController.AddEnb).Methods(http.MethodPost)
+ rr.HandleFunc("/enb/{ranName}", nodebController.DeleteEnb).Methods(http.MethodDelete)
rr.HandleFunc("/{ranName}/update", nodebController.UpdateGnb).Methods(http.MethodPut)
rr.HandleFunc("/shutdown", nodebController.Shutdown).Methods(http.MethodPut)
rr.HandleFunc("/parameters", nodebController.SetGeneralConfiguration).Methods(http.MethodPut)
nodebControllerMock.On("GetNodeb").Return(nil)
nodebControllerMock.On("GetNodebIdList").Return(nil)
nodebControllerMock.On("SetGeneralConfiguration").Return(nil)
+ nodebControllerMock.On("DeleteEnb").Return(nil)
+ nodebControllerMock.On("AddEnb").Return(nil)
e2tControllerMock := &mocks.E2TControllerMock{}
assert.Equal(t, 200, resp.StatusCode)
}
+func TestRouteAddEnb(t *testing.T) {
+ router, _, nodebControllerMock, _ := setupRouterAndMocks()
+
+ req, err := http.NewRequest("POST", "/v1/nodeb/enb", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ rr := httptest.NewRecorder()
+ router.ServeHTTP(rr, req)
+
+ assert.Equal(t, http.StatusCreated, rr.Code, "handler returned wrong status code")
+ nodebControllerMock.AssertNumberOfCalls(t, "AddEnb", 1)
+}
+
+func TestRouteDeleteEnb(t *testing.T) {
+ router, _, nodebControllerMock, _ := setupRouterAndMocks()
+
+ req, err := http.NewRequest("DELETE", "/v1/nodeb/enb/ran1", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ rr := httptest.NewRecorder()
+ router.ServeHTTP(rr, req)
+
+ assert.Equal(t, http.StatusNoContent, rr.Code, "handler returned wrong status code")
+ nodebControllerMock.AssertNumberOfCalls(t, "DeleteEnb", 1)
+}
+
func initLog(t *testing.T) *logger.Logger {
log, err := logger.InitLogger(logger.InfoLevel)
if err != nil {
nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
updatedNb := *nb
updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, StateChangeMessageChannel, RanName+"_CONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, RanName+"_CONNECTED").Return(nil)
updatedNb2 := *nb
updatedNb2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
updatedNb2.AssociatedE2TInstanceAddress = E2TAddress
nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""}
updatedNb := *nb
updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, StateChangeMessageChannel, RanName+"_CONNECTED").Return(common.NewInternalError(fmt.Errorf("for tests")))
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, RanName+"_CONNECTED").Return(common.NewInternalError(fmt.Errorf("for tests")))
err := manager.AssociateRan(E2TAddress, nb)
updatedNb := *nb
updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, StateChangeMessageChannel, RanName+"_CONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, RanName+"_CONNECTED").Return(nil)
updatedNb2 := *nb
updatedNb2.ConnectionStatus = entities.ConnectionStatus_CONNECTED
updatedNb2.AssociatedE2TInstanceAddress = E2TAddress
updatedNb := *nb
updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, StateChangeMessageChannel, RanName+"_CONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, RanName+"_CONNECTED").Return(nil)
updatedNb2 := *nb
updatedNb2.AssociatedE2TInstanceAddress = E2TAddress
updatedNb := *nb
updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, StateChangeMessageChannel, RanName+"_CONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, ranName+"_CONNECTED").Return(nil)
updatedNb2 := *nb
updatedNb2.AssociatedE2TInstanceAddress = E2TAddress
/*** nodeb 1 ***/
nodeb1connected := *nodeb1
nodeb1connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1connected, "RAN_CONNECTION_STATUS_CHANGE", "test1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1connected, "test1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := *nodeb1
nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
/*** nodeb 5 ***/
nodeb5connected := *nodeb5
nodeb5connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb5connected, "RAN_CONNECTION_STATUS_CHANGE", "test5_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb5connected, "test5_DISCONNECTED").Return(nil)
nodeb5NotAssociated := *nodeb5
nodeb5NotAssociated.AssociatedE2TInstanceAddress = ""
/*** nodeb 1 connected ***/
nodeb1new := *nodeb1
nodeb1new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "RAN_CONNECTION_STATUS_CHANGE", "test1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "test1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := *nodeb1
nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
/*** nodeb 1 connected ***/
nodeb1connected := *nodeb1
nodeb1connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1connected, "RAN_CONNECTION_STATUS_CHANGE", "test1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1connected, "test1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := *nodeb1
nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
/*** nodeb 5 connected ***/
nodeb5connected := *nodeb5
nodeb5connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb5connected, "RAN_CONNECTION_STATUS_CHANGE", "test5_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb5connected, "test5_DISCONNECTED").Return(nil)
nodeb5NotAssociated := *nodeb5
nodeb5NotAssociated.AssociatedE2TInstanceAddress = ""
nodeb1new := *nodeb1
nodeb1new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "RAN_CONNECTION_STATUS_CHANGE", "test1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "test1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := *nodeb1
nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
nodeb1new := *nodeb1
nodeb1new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "RAN_CONNECTION_STATUS_CHANGE", "test1_DISCONNECTED").Return(common.NewInternalError(fmt.Errorf("for tests")))
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "test1_DISCONNECTED").Return(common.NewInternalError(fmt.Errorf("for tests")))
err := shutdownManager.Shutdown(e2tInstance1)
nodeb1new := *nodeb1
nodeb1new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "RAN_CONNECTION_STATUS_CHANGE", "test1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1new, "test1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := *nodeb1
nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
/*** nodeb 1 connected ***/
nodeb1connected := *nodeb1
nodeb1connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1connected, "RAN_CONNECTION_STATUS_CHANGE", "test1_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb1connected, "test1_DISCONNECTED").Return(nil)
nodeb1NotAssociated := *nodeb1
nodeb1NotAssociated.AssociatedE2TInstanceAddress = ""
/*** nodeb 5 connected ***/
nodeb5connected := *nodeb5
nodeb5connected.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb5connected, "RAN_CONNECTION_STATUS_CHANGE", "test5_DISCONNECTED").Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &nodeb5connected, "test5_DISCONNECTED").Return(nil)
nodeb5NotAssociated := *nodeb5
nodeb5NotAssociated.AssociatedE2TInstanceAddress = ""
origNodebInfo := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_UNKNOWN_CONNECTION_STATUS}
updatedNodebInfo := *origNodebInfo
updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, EventChannelForTest, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil)
ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil)
ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(nil)
err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED)
origNodebInfo := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
updatedNodebInfo := *origNodebInfo
updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, EventChannelForTest, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil)
ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil)
ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(nil)
err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED)
origNodebInfo := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED}
updatedNodebInfo := *origNodebInfo
updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, EventChannelForTest, RanName+"_"+DISCONNECTED_RAW_EVENT).Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+DISCONNECTED_RAW_EVENT).Return(nil)
ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil)
ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(nil)
err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_DISCONNECTED)
origNodebInfo := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
updatedNodebInfo := *origNodebInfo
updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, EventChannelForTest, RanName+"_"+CONNECTED_RAW_EVENT).Return(common.NewInternalError(errors.New("Error")))
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+CONNECTED_RAW_EVENT).Return(common.NewInternalError(errors.New("Error")))
err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED)
assert.NotNil(t, err)
writerMock.AssertExpectations(t)
origNodebInfo := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED}
updatedNodebInfo := *origNodebInfo
updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, EventChannelForTest, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil)
ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil)
ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(common.NewInternalError(errors.New("Error")))
err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED)
func (c *NodebControllerMock) AddEnb(writer http.ResponseWriter, r *http.Request) {
writer.Header().Set("Content-Type", "application/json")
- writer.WriteHeader(http.StatusOK)
+ writer.WriteHeader(http.StatusCreated)
+ c.Called()
+}
+
+func (c *NodebControllerMock) DeleteEnb(writer http.ResponseWriter, r *http.Request) {
+ writer.Header().Set("Content-Type", "application/json")
+ writer.WriteHeader(http.StatusNoContent)
c.Called()
}
return args.Error(0)
}
-func (rnibWriterMock *RnibWriterMock) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, stateChangeMessageChannel string, event string) error {
- args := rnibWriterMock.Called(nodebInfo, stateChangeMessageChannel, event)
+func (rnibWriterMock *RnibWriterMock) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error {
+ args := rnibWriterMock.Called(nodebInfo, event)
return args.Error(0)
}
func (rnibWriterMock *RnibWriterMock) SaveGeneralConfiguration(config *entities.GeneralConfiguration) error {
args := rnibWriterMock.Called(config)
+ return args.Error(0)
+}
+
+func (rnibWriterMock *RnibWriterMock) RemoveEnb(nodebInfo *entities.NodebInfo) error {
+ args := rnibWriterMock.Called(nodebInfo)
+
return args.Error(0)
}
\ No newline at end of file
--- /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.
+
+// This source code is part of the near-RT RIC (RAN Intelligent Controller)
+// platform project (RICP).
+
+
+package models
+
+type DeleteEnbRequest struct {
+ RanName string
+}
--- /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.
+
+// This source code is part of the near-RT RIC (RAN Intelligent Controller)
+// platform project (RICP).
+
+package models
+
+import (
+ "e2mgr/e2managererrors"
+ "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
+ "github.com/golang/protobuf/jsonpb"
+)
+
+type DeleteEnbResponse struct {
+ nodebInfo *entities.NodebInfo
+}
+
+func NewDeleteEnbResponse(nodebInfo *entities.NodebInfo) *DeleteEnbResponse {
+ return &DeleteEnbResponse{
+ nodebInfo: nodebInfo,
+ }
+}
+
+func (response *DeleteEnbResponse) Marshal() ([]byte, error) {
+ m := jsonpb.Marshaler{}
+ result, err := m.MarshalToString(response.nodebInfo)
+
+ if err != nil {
+ return nil, e2managererrors.NewInternalError()
+ }
+
+ return []byte(result), nil
+}
GetE2TInstancesRequest IncomingRequest = "GetE2TInstancesRequest"
UpdateGnbRequest IncomingRequest = "UpdateGnbRequest"
AddEnbRequest IncomingRequest = "AddEnbRequest"
+ DeleteEnbRequest IncomingRequest = "DeleteEnbRequest"
)
type IncomingRequestHandlerProvider struct {
GetE2TInstancesRequest: httpmsghandlers.NewGetE2TInstancesRequestHandler(logger, e2tInstancesManager),
UpdateGnbRequest: httpmsghandlers.NewUpdateGnbRequestHandler(logger, rNibDataService),
AddEnbRequest: httpmsghandlers.NewAddEnbRequestHandler(logger, rNibDataService, nodebValidator),
+ DeleteEnbRequest: httpmsghandlers.NewDeleteEnbRequestHandler(logger, rNibDataService),
}
}
RemoveE2TInstance(e2tAddress string) error
UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error
RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error
- UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, stateChangeMessageChannel string, event string) error
+ UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, ent string) error
SaveGeneralConfiguration(config *entities.GeneralConfiguration) error
+ RemoveEnb(nodebInfo *entities.NodebInfo) error
}
/*
}
func (w *rNibWriterInstance) RemoveServedNrCells(inventoryName string, servedNrCells []*entities.ServedNRCell) error {
- cellKeysToRemove := buildCellKeysToRemove(inventoryName, servedNrCells)
+ cellKeysToRemove := buildServedNRCellKeysToRemove(inventoryName, servedNrCells)
err := w.sdl.Remove(cellKeysToRemove)
if err != nil {
ranNameIdentity := &entities.NbIdentity{InventoryName: nbIdentity.InventoryName}
if isNotEmptyIdentity {
- nbIdData, err := proto.Marshal(ranNameIdentity)
- if err != nil {
- return common.NewInternalError(err)
- }
- err = w.sdl.RemoveMember(entities.Node_UNKNOWN.String(), nbIdData)
+ err := w.removeNbIdentity(entities.Node_UNKNOWN, ranNameIdentity)
if err != nil {
return common.NewInternalError(err)
}
return nil
}
-func buildCellKeysToRemove(inventoryName string, servedNrCellsToRemove []*entities.ServedNRCell) []string {
+func buildServedNRCellKeysToRemove(inventoryName string, servedNrCellsToRemove []*entities.ServedNRCell) []string {
cellKeysToRemove := []string{}
return cellKeysToRemove
}
+func buildServedCellInfoKeysToRemove(inventoryName string, servedCellsToRemove []*entities.ServedCellInfo) []string {
+
+ cellKeysToRemove := []string{}
+
+ for _, cell := range servedCellsToRemove {
+
+ key, _ := common.ValidateAndBuildCellIdKey(cell.GetCellId())
+
+ if len(key) != 0 {
+ cellKeysToRemove = append(cellKeysToRemove, key)
+ }
+
+ key, _ = common.ValidateAndBuildCellNamePciKey(inventoryName, cell.GetPci())
+
+ if len(key) != 0 {
+ cellKeysToRemove = append(cellKeysToRemove, key)
+ }
+ }
+
+ return cellKeysToRemove
+}
+
func buildUpdateNodebInfoPairs(nodebInfo *entities.NodebInfo) ([]interface{}, error) {
nodebNameKey, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.GetRanName())
return pairs, nil
}
+func (w *rNibWriterInstance) buildRemoveEnbKeys(nodebInfo *entities.NodebInfo) ([]string, error) {
+ keys := buildServedCellInfoKeysToRemove(nodebInfo.GetRanName(), nodebInfo.GetEnb().GetServedCells())
+
+ nodebNameKey, rNibErr := common.ValidateAndBuildNodeBNameKey(nodebInfo.GetRanName())
+
+ if rNibErr != nil {
+ return []string{}, rNibErr
+ }
+
+ keys = append(keys, nodebNameKey)
+
+ nodebIdKey, buildNodebIdKeyError := common.ValidateAndBuildNodeBIdKey(nodebInfo.GetNodeType().String(), nodebInfo.GlobalNbId.GetPlmnId(), nodebInfo.GlobalNbId.GetNbId())
+
+ if buildNodebIdKeyError == nil {
+ keys = append(keys, nodebIdKey)
+ }
+
+ return keys, nil
+}
+
+func (w *rNibWriterInstance) removeNbIdentity(nodeType entities.Node_Type ,nbIdentity *entities.NbIdentity) error {
+ nbIdData, err := proto.Marshal(nbIdentity)
+ if err != nil {
+ return common.NewInternalError(err)
+ }
+ err = w.sdl.RemoveMember(nodeType.String(), nbIdData)
+ if err != nil {
+ return common.NewInternalError(err)
+ }
+ return nil
+}
+
/*
UpdateNodebInfo...
*/
/*
UpdateNodebInfoOnConnectionStatusInversion...
*/
-func (w *rNibWriterInstance) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, stateChangeMessageChannel string, event string) error {
+func (w *rNibWriterInstance) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error {
pairs, err := buildUpdateNodebInfoPairs(nodebInfo)
return err
}
- err = w.sdl.SetAndPublish([]string{stateChangeMessageChannel, event}, pairs)
+ err = w.sdl.SetAndPublish([]string{w.rnibWriterConfig.StateChangeMessageChannel, event}, pairs)
+
+ if err != nil {
+ return common.NewInternalError(err)
+ }
+
+ return nil
+}
+
+func (w *rNibWriterInstance) RemoveEnb(nodebInfo *entities.NodebInfo) error {
+ ranNameIdentity := &entities.NbIdentity{InventoryName: nodebInfo.RanName, GlobalNbId: nodebInfo.GetGlobalNbId()}
+ err := w.removeNbIdentity(entities.Node_ENB, ranNameIdentity)
+ if err != nil {
+ return err
+ }
+
+ keysToRemove, err := w.buildRemoveEnbKeys(nodebInfo)
+ if err != nil {
+ return err
+ }
+
+ err = w.sdl.RemoveAndPublish([]string{w.rnibWriterConfig.RanManipulationMessageChannel, fmt.Sprintf("%s_%s", nodebInfo.RanName, RanDeletedEvent)}, keysToRemove)
if err != nil {
return common.NewInternalError(err)
func TestRemoveServedNrCellsSuccess(t *testing.T) {
w, sdlInstanceMock := initSdlInstanceMock(namespace)
servedNrCellsToRemove := generateServedNrCells("whatever1", "whatever2")
- sdlInstanceMock.On("Remove", buildCellKeysToRemove(RanName, servedNrCellsToRemove)).Return(nil)
+ sdlInstanceMock.On("Remove", buildServedNRCellKeysToRemove(RanName, servedNrCellsToRemove)).Return(nil)
err := w.RemoveServedNrCells(RanName, servedNrCellsToRemove)
assert.Nil(t, err)
}
func TestRemoveServedNrCellsFailure(t *testing.T) {
w, sdlInstanceMock := initSdlInstanceMock(namespace)
servedNrCellsToRemove := generateServedNrCells("whatever1", "whatever2")
- sdlInstanceMock.On("Remove", buildCellKeysToRemove(RanName, servedNrCellsToRemove)).Return(errors.New("expected error"))
+ sdlInstanceMock.On("Remove", buildServedNRCellKeysToRemove(RanName, servedNrCellsToRemove)).Return(errors.New("expected error"))
err := w.RemoveServedNrCells(RanName, servedNrCellsToRemove)
assert.IsType(t, &common.InternalError{}, err)
}
inventoryName := "name"
plmnId := "02f829"
nbId := "4a952a0a"
- channelName := "RAN_CONNECT_STATE_CHANGE"
+ channelName := "RAN_CONNECTION_STATUS_CHANGE"
eventName := inventoryName + "_" + "CONNECTED"
w, sdlInstanceMock := initSdlInstanceMock(namespace)
nodebInfo := generateNodebInfo(inventoryName, entities.Node_ENB, plmnId, nbId)
sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e)
- rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, channelName, eventName)
+ rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, eventName)
assert.Nil(t, rNibErr)
}
inventoryName := "name"
plmnId := "02f829"
nbId := "4a952a0a"
- channelName := "RAN_CONNECT_STATE_CHANGE"
+ channelName := "RAN_CONNECTION_STATUS_CHANGE"
eventName := inventoryName + "_" + "CONNECTED"
w, sdlInstanceMock := initSdlInstanceMock(namespace)
nodebInfo := &entities.NodebInfo{}
sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e)
- rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, channelName, eventName)
+ rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, eventName)
assert.NotNil(t, rNibErr)
assert.IsType(t, &common.ValidationError{}, rNibErr)
func TestUpdateNodebInfoOnConnectionStatusInversionMissingGlobalNbId(t *testing.T) {
inventoryName := "name"
- channelName := "RAN_CONNECT_STATE_CHANGE"
+ channelName := "RAN_CONNECTION_STATUS_CHANGE"
eventName := inventoryName + "_" + "CONNECTED"
w, sdlInstanceMock := initSdlInstanceMock(namespace)
nodebInfo := &entities.NodebInfo{}
setExpected = append(setExpected, nodebNameKey, data)
sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e)
- rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, channelName, eventName)
+ rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, eventName)
assert.Nil(t, rNibErr)
}
GetGeneralConfiguration() (*entities.GeneralConfiguration, error)
UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error
SaveGeneralConfiguration(config *entities.GeneralConfiguration) error
+ RemoveEnb(nodebInfo *entities.NodebInfo) error
}
type rNibDataService struct {
rnibWriter rNibWriter.RNibWriter
maxAttempts int
retryInterval time.Duration
- rnibWriterConfig configuration.RnibWriterConfig
}
func NewRnibDataService(logger *logger.Logger, config *configuration.Configuration, rnibReader reader.RNibReader, rnibWriter rNibWriter.RNibWriter) *rNibDataService {
rnibWriter: rnibWriter,
maxAttempts: config.MaxRnibConnectionAttempts,
retryInterval: time.Duration(config.RnibRetryIntervalMs) * time.Millisecond,
- rnibWriterConfig: config.RnibWriter,
}
}
return err
}
+func (w *rNibDataService) RemoveEnb(nodebInfo *entities.NodebInfo) error {
+ err := w.retry("RemoveEnb", func() (err error) {
+ err = w.rnibWriter.RemoveEnb(nodebInfo)
+ return
+ })
+
+ return err
+}
+
func (w *rNibDataService) UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error {
w.logger.Infof("#RnibDataService.UpdateGnbCells - nodebInfo: %s, servedNrCells: %s", nodebInfo, servedNrCells)
}
func (w *rNibDataService) UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error {
- w.logger.Infof("#RnibDataService.UpdateNodebInfoOnConnectionStatusInversion - stateChangeMessageChannel: %s, event: %s, nodebInfo: %s", w.rnibWriterConfig.StateChangeMessageChannel, event, nodebInfo)
+ w.logger.Infof("#RnibDataService.UpdateNodebInfoOnConnectionStatusInversion - event: %s, nodebInfo: %s", event, nodebInfo)
err := w.retry("UpdateNodebInfoOnConnectionStatusInversion", func() (err error) {
- err = w.rnibWriter.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, w.rnibWriterConfig.StateChangeMessageChannel, event)
+ err = w.rnibWriter.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, event)
return
})
event := "event"
nodebInfo := &entities.NodebInfo{}
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", nodebInfo, "RAN_CONNECTION_STATUS_CHANGE", event).Return(nil)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", nodebInfo, event).Return(nil)
rnibDataService.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, event)
writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1)
nodebInfo := &entities.NodebInfo{}
mockErr := &common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}}
- writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", nodebInfo, "RAN_CONNECTION_STATUS_CHANGE", event).Return(mockErr)
+ writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", nodebInfo, event).Return(mockErr)
rnibDataService.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, event)
writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 3)
assert.Nil(t, res)
assert.NotNil(t, err)
}
+
+func TestRemoveEnbConnFailure(t *testing.T) {
+ rnibDataService, _, writerMock := setupRnibDataServiceTest(t)
+
+ mockErr := &common.InternalError{Err: &net.OpError{Err: fmt.Errorf("connection error")}}
+ nodebInfo := &entities.NodebInfo{}
+ writerMock.On("RemoveEnb", nodebInfo).Return(mockErr)
+
+ err := rnibDataService.RemoveEnb(nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "RemoveEnb", 3)
+ assert.NotNil(t, err)
+}
+
+func TestRemoveEnbOkNoError(t *testing.T) {
+ rnibDataService, _, writerMock := setupRnibDataServiceTest(t)
+
+ nodebInfo := &entities.NodebInfo{}
+ writerMock.On("RemoveEnb", nodebInfo).Return(nil)
+
+ err := rnibDataService.RemoveEnb(nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "RemoveEnb", 1)
+ assert.Nil(t, err)
+}
+
+func TestRemoveEnbOtherError(t *testing.T) {
+ rnibDataService, _, writerMock := setupRnibDataServiceTest(t)
+
+ mockErr := &common.InternalError{Err: fmt.Errorf("non connection error")}
+ nodebInfo := &entities.NodebInfo{}
+ writerMock.On("RemoveEnb", nodebInfo).Return(mockErr)
+
+ err := rnibDataService.RemoveEnb(nodebInfo)
+ writerMock.AssertNumberOfCalls(t, "RemoveEnb", 1)
+ assert.NotNil(t, err)
+}
\ No newline at end of file