From: naman.gupta Date: Thu, 6 Apr 2023 10:57:12 +0000 (+0530) Subject: Send notification for Under reset status X-Git-Tag: 6.0.2~11 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;ds=inline;h=refs%2Fchanges%2F59%2F10859%2F3;p=ric-plt%2Fe2mgr.git Send notification for Under reset status Send notification for Under reset status. Signed-off-by: naman.gupta Change-Id: I41450010b3b55daa8472a89af5eaeed7774ff1f4 --- diff --git a/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go index 5fb36c8..4e1e3f4 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler.go @@ -21,6 +21,7 @@ package rmrmsghandlers import ( "e2mgr/configuration" "e2mgr/logger" + "e2mgr/managers" "e2mgr/models" "e2mgr/rmrCgo" "e2mgr/services" @@ -43,14 +44,16 @@ type E2ResetRequestNotificationHandler struct { rnibDataService services.RNibDataService config *configuration.Configuration rmrSender *rmrsender.RmrSender + ranResetManager *managers.RanResetManager } -func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration, rmrSender *rmrsender.RmrSender) *E2ResetRequestNotificationHandler { +func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration, rmrSender *rmrsender.RmrSender, ranResetManager *managers.RanResetManager) *E2ResetRequestNotificationHandler { return &E2ResetRequestNotificationHandler{ logger: logger, rnibDataService: rnibDataService, config: config, rmrSender: rmrSender, + ranResetManager: ranResetManager, } } @@ -71,7 +74,21 @@ func (e *E2ResetRequestNotificationHandler) Handle(request *models.NotificationR nodebInfo.ConnectionStatus = entities.ConnectionStatus_UNDER_RESET - err = e.rnibDataService.UpdateNodebInfoAndPublish(nodebInfo) + ranName := request.RanName + isResetDone, err := e.ranResetManager.ResetRan(ranName) + if err != nil { + e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update and notify connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error()) + } else { + if isResetDone { + nodebInfoupdated, err1 := e.getNodebInfo(request.RanName) + if err1 != nil { + e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to get updated nodeB entity. RanName: %s. Error: %s", request.RanName, err1.Error()) + } + e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Done Successfully ran: %s , Connection status updated : %s", ranName, nodebInfoupdated.ConnectionStatus) + } else { + e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Failed") + } + } if err != nil { e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error()) @@ -83,7 +100,6 @@ func (e *E2ResetRequestNotificationHandler) Handle(request *models.NotificationR e.waitfortimertimeout(request) - ranName := request.RanName resetRequest, err := e.parseE2ResetMessage(request.Payload) if err != nil { e.logger.Errorf(err.Error()) diff --git a/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler_test.go index 56efae9..cc9722e 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_reset_request_handler_test.go @@ -20,18 +20,16 @@ package rmrmsghandlers import ( "e2mgr/configuration" + "e2mgr/managers" "e2mgr/mocks" "e2mgr/models" "e2mgr/rmrCgo" - - // "e2mgr/rmrCgo" "e2mgr/services" "e2mgr/tests" "e2mgr/utils" "testing" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - // "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) @@ -53,7 +51,11 @@ func initE2ResetMocks(t *testing.T) (*E2ResetRequestNotificationHandler, *mocks. readerMock := &mocks.RnibReaderMock{} writerMock := &mocks.RnibWriterMock{} rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) - handler := NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender) + ranListManager := managers.NewRanListManager(logger, rnibDataService) + ranAlarmService := &mocks.RanAlarmServiceMock{} + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService) + ranResetManager := managers.NewRanResetManager(logger, rnibDataService, ranConnectStatusChangeManager) + handler := NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender, ranResetManager) return handler, readerMock, writerMock, rmrMessengerMock } @@ -71,6 +73,8 @@ func TestE2ResettNotificationHandler(t *testing.T) { } readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil) writerMock.On("UpdateNodebInfoAndPublish", mock.Anything).Return(nil) + var rnibErr error + writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) var errEmpty error rmrMessage := &rmrCgo.MBuf{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) @@ -78,7 +82,8 @@ func TestE2ResettNotificationHandler(t *testing.T) { handler.Handle(notificationRequest) readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) - rmrMessengerMock.AssertNotCalled(t, "SendMsg") + rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true) + } func TestE2ResettNotificationHandler_UpdateStatus_Connected(t *testing.T) { @@ -95,6 +100,37 @@ func TestE2ResettNotificationHandler_UpdateStatus_Connected(t *testing.T) { } readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil) writerMock.On("UpdateNodebInfoAndPublish", mock.Anything).Return(nil) + var rnibErr error + writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) + nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED + readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil) + + var errEmpty error + rmrMessage := &rmrCgo.MBuf{} + rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) + notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(""), e2ResetXml...)} + handler.Handle(notificationRequest) + readerMock.AssertCalled(t, "GetNodeb", mock.Anything) + writerMock.AssertCalled(t, "UpdateNodebInfoAndPublish", mock.Anything) + readerMock.AssertCalled(t, "GetNodeb", mock.Anything) +} + +func TestE2ResettNotificationHandler_Successful_Reset_Response(t *testing.T) { + e2ResetXml := utils.ReadXmlFile(t, E2ResetXmlPath) + handler, readerMock, writerMock, rmrMessengerMock := initE2ResetMocks(t) + var nodebInfo = &entities.NodebInfo{ + RanName: gnbNodebRanName, + AssociatedE2TInstanceAddress: e2tInstanceFullAddress, + ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, + NodeType: entities.Node_GNB, + Configuration: &entities.NodebInfo_Gnb{ + Gnb: &entities.Gnb{}, + }, + } + readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil) + writerMock.On("UpdateNodebInfoAndPublish", mock.Anything).Return(nil) + var rnibErr error + writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil) diff --git a/E2Manager/managers/e2_reset_status_change_manager.go b/E2Manager/managers/e2_reset_status_change_manager.go new file mode 100644 index 0000000..6f1639d --- /dev/null +++ b/E2Manager/managers/e2_reset_status_change_manager.go @@ -0,0 +1,63 @@ +// +// Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved. +// +// 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 managers + +import ( + "e2mgr/logger" + "e2mgr/services" + + "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" +) + +type IRanResetManager interface { + ResetRan(inventoryName string) error +} + +type RanResetManager struct { + logger *logger.Logger + rnibDataService services.RNibDataService + ranConnectStatusChangeManager IRanConnectStatusChangeManager +} + +func NewRanResetManager(logger *logger.Logger, rnibDataService services.RNibDataService, ranConnectStatusChangeManager IRanConnectStatusChangeManager) *RanResetManager { + return &RanResetManager{ + logger: logger, + rnibDataService: rnibDataService, + ranConnectStatusChangeManager: ranConnectStatusChangeManager, + } +} + +func (m *RanResetManager) ResetRan(inventoryName string) (bool, error) { + nodebInfo, err := m.rnibDataService.GetNodeb(inventoryName) + + if err != nil { + m.logger.Errorf("#RanResetManager.ResetRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, err) + return false, err + } + + connectionStatus := nodebInfo.GetConnectionStatus() + m.logger.Infof("#RanResetManager.ResetRan - RAN name: %s - RAN's connection status: %s", nodebInfo.RanName, connectionStatus) + + ranConnectStatusChange, err := m.ranConnectStatusChangeManager.ChangeStatus(nodebInfo, entities.ConnectionStatus_UNDER_RESET) + + if err != nil { + return ranConnectStatusChange, err + } + return ranConnectStatusChange, nil +} diff --git a/E2Manager/managers/e2_reset_status_change_manager_test.go b/E2Manager/managers/e2_reset_status_change_manager_test.go new file mode 100644 index 0000000..7b2a1ce --- /dev/null +++ b/E2Manager/managers/e2_reset_status_change_manager_test.go @@ -0,0 +1,63 @@ +// +// Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved. +// +// 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 managers + +import ( + "e2mgr/configuration" + "e2mgr/logger" + "e2mgr/mocks" + "e2mgr/services" + "testing" + + "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func initE2ResetStatusChangeTest(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *RanResetManager) { + logger, err := logger.InitLogger(logger.DebugLevel) + if err != nil { + t.Errorf("#... - failed to initialize logger, error: %s", err) + } + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} + + rmrMessengerMock := &mocks.RmrMessengerMock{} + readerMock := &mocks.RnibReaderMock{} + writerMock := &mocks.RnibWriterMock{} + rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) + ranListManager := NewRanListManager(logger, rnibDataService) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService) + e2ResetStatusChangeManager := NewRanResetManager(logger, rnibDataService, ranConnectStatusChangeManager) + return logger, rmrMessengerMock, readerMock, writerMock, e2ResetStatusChangeManager +} + +func TestE2ResetStatusChangeSucceeds(t *testing.T) { + logger, _, readerMock, writerMock, e2ResetStatusChangeManager := initE2ResetStatusChangeTest(t) + logger.Infof("#TestRanResetManager.ResetRan - RAN name") + origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING} + var rnibErr error + readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr) + updatedNodebInfo1 := *origNodebInfo + updatedNodebInfo1.ConnectionStatus = entities.ConnectionStatus_UNDER_RESET + writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr) + _, err := e2ResetStatusChangeManager.ResetRan(ranName) + assert.Nil(t, err) + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) +} diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go index 92f7e09..b38f35a 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go @@ -73,6 +73,7 @@ func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config // Init managers ranReconnectionManager := managers.NewRanDisconnectionManager(logger, config, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager) + ranResetChangeManager := managers.NewRanResetManager(logger, rnibDataService, ranConnectStatusChangeManager) ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender) x2SetupResponseManager := managers.NewX2SetupResponseManager(x2SetupResponseConverter) x2SetupFailureResponseManager := managers.NewX2SetupFailureResponseManager(x2SetupFailureResponseConverter) @@ -95,7 +96,7 @@ func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config e2SetupRequestNotificationHandler := rmrmsghandlers.NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManager, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager) ricServiceUpdateHandler := rmrmsghandlers.NewRicServiceUpdateHandler(logger, rmrSender, rnibDataService, ranListManager) ricE2nodeConfigUpdateHandler := rmrmsghandlers.NewE2nodeConfigUpdateNotificationHandler(logger, rnibDataService, rmrSender) - e2ResetRequestNotificationHandler := rmrmsghandlers.NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender) + e2ResetRequestNotificationHandler := rmrmsghandlers.NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender, ranResetChangeManager) provider.Register(rmrCgo.RIC_X2_SETUP_RESP, x2SetupResponseHandler) provider.Register(rmrCgo.RIC_X2_SETUP_FAILURE, x2SetupFailureResponseHandler) diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go index 43e08c8..d631dce 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go @@ -58,7 +58,6 @@ func initTestCase(t *testing.T) (*logger.Logger, *configuration.Configuration, s ranAlarmService := services.NewRanAlarmService(logger, config) ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService) e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) - return logger, config, rnibDataService, rmrSender, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager } @@ -68,6 +67,7 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager) ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender) + ranResetManager := managers.NewRanResetManager(logger, rnibDataService, ranConnectStatusChangeManager) x2SetupResponseConverter := converters.NewX2SetupResponseConverter(logger) x2SetupResponseManager := managers.NewX2SetupResponseManager(x2SetupResponseConverter) @@ -99,7 +99,7 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { {rmrCgo.RIC_X2_RESET, rmrmsghandlers.NewX2ResetRequestNotificationHandler(logger, rnibDataService, ranStatusChangeManager, rmrSender)}, {rmrCgo.RIC_SERVICE_UPDATE, rmrmsghandlers.NewRicServiceUpdateHandler(logger, rmrSender, rnibDataService, ranListManager)}, {rmrCgo.RIC_E2NODE_CONFIG_UPDATE, rmrmsghandlers.NewE2nodeConfigUpdateNotificationHandler(logger, rnibDataService, rmrSender)}, - {rmrCgo.RIC_E2_RESET_REQ, rmrmsghandlers.NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender)}, + {rmrCgo.RIC_E2_RESET_REQ, rmrmsghandlers.NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender, ranResetManager)}, } for _, tc := range testCases {