From: Amichai Date: Tue, 7 Jul 2020 15:49:07 +0000 (+0000) Subject: [RIC-433] Add DeleteEnb implementation X-Git-Tag: R5_RC~54 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=7e2e493acba882641329f867cccb73b3d2a2d2d8;p=ric-plt%2Fe2mgr.git [RIC-433] Add DeleteEnb implementation Change-Id: I638cd6e047115a4f2e74fd2ede1aaf0f41f76f9b Signed-off-by: Amichai --- diff --git a/E2Manager/controllers/nodeb_controller.go b/E2Manager/controllers/nodeb_controller.go index 96d0067..ed13a66 100644 --- a/E2Manager/controllers/nodeb_controller.go +++ b/E2Manager/controllers/nodeb_controller.go @@ -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)) diff --git a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go index bc5bba9..f2c5e15 100644 --- a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go @@ -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 index 0000000..dbe23d6 --- /dev/null +++ b/E2Manager/handlers/httpmsghandlers/delete_enb_request_handler.go @@ -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 +} + diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go index c8b49eb..137464b 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -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) diff --git a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go index a4c2312..20e5a73 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go @@ -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) diff --git a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go index f3cfc49..c9c7366 100644 --- a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go @@ -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 = "" diff --git a/E2Manager/httpserver/http_server.go b/E2Manager/httpserver/http_server.go index 10df4ee..1d29dcd 100644 --- a/E2Manager/httpserver/http_server.go +++ b/E2Manager/httpserver/http_server.go @@ -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) diff --git a/E2Manager/httpserver/http_server_test.go b/E2Manager/httpserver/http_server_test.go index cdca134..05173f1 100644 --- a/E2Manager/httpserver/http_server_test.go +++ b/E2Manager/httpserver/http_server_test.go @@ -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 { diff --git a/E2Manager/managers/e2t_association_manager_test.go b/E2Manager/managers/e2t_association_manager_test.go index 1264769..3f8cad9 100644 --- a/E2Manager/managers/e2t_association_manager_test.go +++ b/E2Manager/managers/e2t_association_manager_test.go @@ -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 diff --git a/E2Manager/managers/e2t_shutdown_manager_test.go b/E2Manager/managers/e2t_shutdown_manager_test.go index a8c4c3b..fcf8649 100644 --- a/E2Manager/managers/e2t_shutdown_manager_test.go +++ b/E2Manager/managers/e2t_shutdown_manager_test.go @@ -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 = "" diff --git a/E2Manager/managers/ran_connect_status_change_manager_test.go b/E2Manager/managers/ran_connect_status_change_manager_test.go index 33e611e..53921a1 100644 --- a/E2Manager/managers/ran_connect_status_change_manager_test.go +++ b/E2Manager/managers/ran_connect_status_change_manager_test.go @@ -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) diff --git a/E2Manager/mocks/nodeb_controller_mock.go b/E2Manager/mocks/nodeb_controller_mock.go index 31499ef..2f1a15d 100644 --- a/E2Manager/mocks/nodeb_controller_mock.go +++ b/E2Manager/mocks/nodeb_controller_mock.go @@ -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() } diff --git a/E2Manager/mocks/rnibWriterMock.go b/E2Manager/mocks/rnibWriterMock.go index 3503d10..292e455 100644 --- a/E2Manager/mocks/rnibWriterMock.go +++ b/E2Manager/mocks/rnibWriterMock.go @@ -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 index 0000000..ecc4009 --- /dev/null +++ b/E2Manager/models/delete_enb_request.go @@ -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 index 0000000..708fd25 --- /dev/null +++ b/E2Manager/models/delete_enb_response.go @@ -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 +} diff --git a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go index b56fb69..b5e0d1d 100644 --- a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go @@ -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), } } diff --git a/E2Manager/rNibWriter/rNibWriter.go b/E2Manager/rNibWriter/rNibWriter.go index 71913bf..c73cc37 100644 --- a/E2Manager/rNibWriter/rNibWriter.go +++ b/E2Manager/rNibWriter/rNibWriter.go @@ -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) diff --git a/E2Manager/rNibWriter/rNibWriter_test.go b/E2Manager/rNibWriter/rNibWriter_test.go index 618eb4b..31e4745 100644 --- a/E2Manager/rNibWriter/rNibWriter_test.go +++ b/E2Manager/rNibWriter/rNibWriter_test.go @@ -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) } diff --git a/E2Manager/services/rnib_data_service.go b/E2Manager/services/rnib_data_service.go index 902466d..2ab34d2 100644 --- a/E2Manager/services/rnib_data_service.go +++ b/E2Manager/services/rnib_data_service.go @@ -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 }) diff --git a/E2Manager/services/rnib_data_service_test.go b/E2Manager/services/rnib_data_service_test.go index ddc6540..07e2c45 100644 --- a/E2Manager/services/rnib_data_service_test.go +++ b/E2Manager/services/rnib_data_service_test.go @@ -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