[RIC-433] Add DeleteEnb implementation 37/4337/1
authorAmichai <amichai.sichel@intl.att.com>
Tue, 7 Jul 2020 15:49:07 +0000 (15:49 +0000)
committerAmichai <amichai.sichel@intl.att.com>
Tue, 7 Jul 2020 15:49:29 +0000 (15:49 +0000)
Change-Id: I638cd6e047115a4f2e74fd2ede1aaf0f41f76f9b
Signed-off-by: Amichai <amichai.sichel@intl.att.com>
20 files changed:
E2Manager/controllers/nodeb_controller.go
E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go
E2Manager/handlers/httpmsghandlers/delete_enb_request_handler.go [new file with mode: 0644]
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go
E2Manager/httpserver/http_server.go
E2Manager/httpserver/http_server_test.go
E2Manager/managers/e2t_association_manager_test.go
E2Manager/managers/e2t_shutdown_manager_test.go
E2Manager/managers/ran_connect_status_change_manager_test.go
E2Manager/mocks/nodeb_controller_mock.go
E2Manager/mocks/rnibWriterMock.go
E2Manager/models/delete_enb_request.go [new file with mode: 0644]
E2Manager/models/delete_enb_response.go [new file with mode: 0644]
E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go
E2Manager/rNibWriter/rNibWriter.go
E2Manager/rNibWriter/rNibWriter_test.go
E2Manager/services/rnib_data_service.go
E2Manager/services/rnib_data_service_test.go

index 96d0067..ed13a66 100644 (file)
@@ -51,6 +51,7 @@ type INodebController interface {
        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 {
@@ -121,6 +122,14 @@ func (c *NodebController) AddEnb(writer http.ResponseWriter, r *http.Request) {
        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))
 
index bc5bba9..f2c5e15 100644 (file)
@@ -129,7 +129,7 @@ func TestTwoRansGetE2TAddressesEmptyListOneGetNodebFailure(t *testing.T) {
 
        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)
@@ -153,7 +153,7 @@ func TestUpdateNodebInfoOnConnectionStatusInversionFailure(t *testing.T) {
 
        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)
 
@@ -277,7 +277,7 @@ func TestOneRanTryShuttingDownSucceedsClearFails(t *testing.T) {
 
        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)
@@ -303,7 +303,7 @@ func TestOneRanTryShuttingDownUpdateNodebError(t *testing.T) {
 
        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")))
@@ -327,7 +327,7 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) {
 
        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)
diff --git a/E2Manager/handlers/httpmsghandlers/delete_enb_request_handler.go b/E2Manager/handlers/httpmsghandlers/delete_enb_request_handler.go
new file mode 100644 (file)
index 0000000..dbe23d6
--- /dev/null
@@ -0,0 +1,77 @@
+//
+// 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
+}
+
index c8b49eb..137464b 100644 (file)
@@ -192,7 +192,7 @@ func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xml
        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
@@ -290,7 +290,7 @@ func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(
        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
@@ -411,13 +411,13 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T)
        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)
@@ -462,7 +462,7 @@ func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.
        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)
index a4c2312..20e5a73 100644 (file)
@@ -189,7 +189,7 @@ func TestE2TermInitHandlerSuccessOneRan(t *testing.T) {
        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)
@@ -224,7 +224,7 @@ func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) {
        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)
index f3cfc49..c9c7366 100644 (file)
@@ -120,7 +120,7 @@ func TestLostConnectionHandlerConnectedRanSuccess(t *testing.T) {
        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 = ""
index 10df4ee..1d29dcd 100644 (file)
@@ -48,6 +48,7 @@ func initializeRoutes(router *mux.Router, rootController controllers.IRootContro
        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)
index cdca134..05173f1 100644 (file)
@@ -40,6 +40,8 @@ func setupRouterAndMocks() (*mux.Router, *mocks.RootControllerMock, *mocks.Nodeb
        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{}
 
@@ -149,6 +151,34 @@ func TestRun(t *testing.T) {
        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 {
index 1264769..3f8cad9 100644 (file)
@@ -81,7 +81,7 @@ func TestAssociateRanSuccess(t *testing.T) {
        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
@@ -106,7 +106,7 @@ func TestAssociateRan_RnibError(t *testing.T) {
        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)
 
@@ -138,7 +138,7 @@ func TestAssociateRanUpdateNodebError(t *testing.T) {
 
        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
@@ -160,7 +160,7 @@ func TestAssociateRanGetE2tInstanceError(t *testing.T) {
 
        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
@@ -185,7 +185,7 @@ func TestAssociateRanSaveE2tInstanceError(t *testing.T) {
 
        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
index a8c4c3b..fcf8649 100644 (file)
@@ -101,7 +101,7 @@ func TestShutdownSuccess1OutOf3Instances(t *testing.T) {
        /*** 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 = ""
@@ -121,7 +121,7 @@ func TestShutdownSuccess1OutOf3Instances(t *testing.T) {
        /*** 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 = ""
@@ -188,7 +188,7 @@ func TestShutdownSuccess1Instance2Rans(t *testing.T) {
        /*** 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 = ""
@@ -281,7 +281,7 @@ func TestShutdownFailureRoutingManagerError(t *testing.T) {
        /*** 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 = ""
@@ -301,7 +301,7 @@ func TestShutdownFailureRoutingManagerError(t *testing.T) {
        /*** 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 = ""
@@ -329,7 +329,7 @@ func TestShutdownFailureInClearNodebsAssociation(t *testing.T) {
 
        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 = ""
@@ -357,7 +357,7 @@ func TestShutdownFailureInClearNodebsAssociation_UpdateConnectionStatus(t *testi
 
        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)
 
@@ -382,7 +382,7 @@ func TestShutdownResourceNotFoundErrorInGetNodeb(t *testing.T) {
 
        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 = ""
@@ -470,7 +470,7 @@ func TestShutdownFailureInRemoveE2TInstance(t *testing.T) {
        /*** 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 = ""
@@ -490,7 +490,7 @@ func TestShutdownFailureInRemoveE2TInstance(t *testing.T) {
        /*** 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 = ""
index 33e611e..53921a1 100644 (file)
@@ -59,7 +59,7 @@ func TestChangeStatusSuccessNewRan(t *testing.T) {
        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)
@@ -105,7 +105,7 @@ func TestChangeStatusSuccessEventConnected(t *testing.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(nil)
        err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED)
@@ -121,7 +121,7 @@ func TestChangeStatusSuccessEventDisconnected(t *testing.T) {
        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)
@@ -151,7 +151,7 @@ func TestChangeStatusRnibErrorEventConnected(t *testing.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(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)
@@ -180,7 +180,7 @@ func TestChangeStatusRanAlarmServiceErrorEventConnected(t *testing.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)
index 31499ef..2f1a15d 100644 (file)
@@ -70,7 +70,13 @@ func (c *NodebControllerMock) UpdateGnb(writer http.ResponseWriter, r *http.Requ
 
 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()
 }
 
index 3503d10..292e455 100644 (file)
@@ -92,8 +92,8 @@ func (rnibWriterMock *RnibWriterMock) RemoveServedNrCells(inventoryName string,
        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)
 }
@@ -101,5 +101,11 @@ func (rnibWriterMock *RnibWriterMock) UpdateNodebInfoOnConnectionStatusInversion
 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
diff --git a/E2Manager/models/delete_enb_request.go b/E2Manager/models/delete_enb_request.go
new file mode 100644 (file)
index 0000000..ecc4009
--- /dev/null
@@ -0,0 +1,25 @@
+//
+// 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
+}
diff --git a/E2Manager/models/delete_enb_response.go b/E2Manager/models/delete_enb_response.go
new file mode 100644 (file)
index 0000000..708fd25
--- /dev/null
@@ -0,0 +1,47 @@
+//
+// 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
+}
index b56fb69..b5e0d1d 100644 (file)
@@ -41,6 +41,7 @@ const (
        GetE2TInstancesRequest         IncomingRequest = "GetE2TInstancesRequest"
        UpdateGnbRequest               IncomingRequest = "UpdateGnbRequest"
        AddEnbRequest                  IncomingRequest = "AddEnbRequest"
+       DeleteEnbRequest               IncomingRequest = "DeleteEnbRequest"
 )
 
 type IncomingRequestHandlerProvider struct {
@@ -69,6 +70,7 @@ func initRequestHandlerMap(logger *logger.Logger, rmrSender *rmrsender.RmrSender
                GetE2TInstancesRequest:         httpmsghandlers.NewGetE2TInstancesRequestHandler(logger, e2tInstancesManager),
                UpdateGnbRequest:               httpmsghandlers.NewUpdateGnbRequestHandler(logger, rNibDataService),
                AddEnbRequest:                  httpmsghandlers.NewAddEnbRequestHandler(logger, rNibDataService, nodebValidator),
+               DeleteEnbRequest:               httpmsghandlers.NewDeleteEnbRequestHandler(logger, rNibDataService),
        }
 }
 
index 71913bf..c73cc37 100644 (file)
@@ -52,8 +52,9 @@ type RNibWriter interface {
        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
 }
 
 /*
@@ -65,7 +66,7 @@ func GetRNibWriter(sdl common.ISdlInstance, rnibWriterConfig configuration.RnibW
 }
 
 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 {
@@ -149,11 +150,7 @@ func (w *rNibWriterInstance) SaveNodeb(nbIdentity *entities.NbIdentity, entity *
        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)
                }
@@ -198,7 +195,7 @@ func (w *rNibWriterInstance) UpdateGnbCells(nodebInfo *entities.NodebInfo, serve
        return nil
 }
 
-func buildCellKeysToRemove(inventoryName string, servedNrCellsToRemove []*entities.ServedNRCell) []string {
+func buildServedNRCellKeysToRemove(inventoryName string, servedNrCellsToRemove []*entities.ServedNRCell) []string {
 
        cellKeysToRemove := []string{}
 
@@ -220,6 +217,28 @@ func buildCellKeysToRemove(inventoryName string, servedNrCellsToRemove []*entiti
        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())
 
@@ -244,6 +263,38 @@ func buildUpdateNodebInfoPairs(nodebInfo *entities.NodebInfo) ([]interface{}, er
        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...
 */
@@ -375,7 +426,7 @@ func (w *rNibWriterInstance) SaveWithKeyAndMarshal(key string, entity interface{
 /*
 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)
 
@@ -383,7 +434,28 @@ func (w *rNibWriterInstance) UpdateNodebInfoOnConnectionStatusInversion(nodebInf
                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)
index 618eb4b..31e4745 100644 (file)
@@ -90,7 +90,7 @@ func generateServedNrCells(cellIds ...string) []*entities.ServedNRCell {
 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)
 }
@@ -98,7 +98,7 @@ func TestRemoveServedNrCellsSuccess(t *testing.T) {
 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)
 }
@@ -749,7 +749,7 @@ func TestUpdateNodebInfoOnConnectionStatusInversionSuccess(t *testing.T) {
        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)
@@ -767,7 +767,7 @@ func TestUpdateNodebInfoOnConnectionStatusInversionSuccess(t *testing.T) {
 
        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)
 }
 
@@ -775,7 +775,7 @@ func TestUpdateNodebInfoOnConnectionStatusInversionMissingInventoryNameFailure(t
        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{}
@@ -793,7 +793,7 @@ func TestUpdateNodebInfoOnConnectionStatusInversionMissingInventoryNameFailure(t
 
        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)
@@ -801,7 +801,7 @@ func TestUpdateNodebInfoOnConnectionStatusInversionMissingInventoryNameFailure(t
 
 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{}
@@ -817,7 +817,7 @@ func TestUpdateNodebInfoOnConnectionStatusInversionMissingGlobalNbId(t *testing.
        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)
 }
index 902466d..2ab34d2 100644 (file)
@@ -52,6 +52,7 @@ type RNibDataService interface {
        GetGeneralConfiguration() (*entities.GeneralConfiguration, error)
        UpdateNodebInfoOnConnectionStatusInversion(nodebInfo *entities.NodebInfo, event string) error
        SaveGeneralConfiguration(config *entities.GeneralConfiguration) error
+       RemoveEnb(nodebInfo *entities.NodebInfo) error
 }
 
 type rNibDataService struct {
@@ -60,7 +61,6 @@ 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 {
@@ -70,7 +70,6 @@ func NewRnibDataService(logger *logger.Logger, config *configuration.Configurati
                rnibWriter:       rnibWriter,
                maxAttempts:      config.MaxRnibConnectionAttempts,
                retryInterval:    time.Duration(config.RnibRetryIntervalMs) * time.Millisecond,
-               rnibWriterConfig: config.RnibWriter,
        }
 }
 
@@ -83,6 +82,15 @@ func (w *rNibDataService) RemoveServedNrCells(inventoryName string, servedNrCell
        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)
 
@@ -304,10 +312,10 @@ func (w *rNibDataService) PingRnib() bool {
 }
 
 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
        })
 
index ddc6540..07e2c45 100644 (file)
@@ -262,7 +262,7 @@ func TestSuccessfulUpdateNodebInfoOnConnectionStatusInversion(t *testing.T) {
        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)
@@ -274,7 +274,7 @@ func TestConnFailureUpdateNodebInfoOnConnectionStatusInversion(t *testing.T) {
 
        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)
@@ -335,3 +335,38 @@ func TestGetE2TInstanceOkOtherError(t *testing.T) {
        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