Send notification for Under reset status.
Signed-off-by: naman.gupta <naman.gupta@samsung.com>
Change-Id: I41450010b3b55daa8472a89af5eaeed7774ff1f4
import (\r
"e2mgr/configuration"\r
"e2mgr/logger"\r
+ "e2mgr/managers"\r
"e2mgr/models"\r
"e2mgr/rmrCgo"\r
"e2mgr/services"\r
rnibDataService services.RNibDataService\r
config *configuration.Configuration\r
rmrSender *rmrsender.RmrSender\r
+ ranResetManager *managers.RanResetManager\r
}\r
\r
-func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration, rmrSender *rmrsender.RmrSender) *E2ResetRequestNotificationHandler {\r
+func NewE2ResetRequestNotificationHandler(logger *logger.Logger, rnibDataService services.RNibDataService, config *configuration.Configuration, rmrSender *rmrsender.RmrSender, ranResetManager *managers.RanResetManager) *E2ResetRequestNotificationHandler {\r
return &E2ResetRequestNotificationHandler{\r
logger: logger,\r
rnibDataService: rnibDataService,\r
config: config,\r
rmrSender: rmrSender,\r
+ ranResetManager: ranResetManager,\r
}\r
}\r
\r
\r
nodebInfo.ConnectionStatus = entities.ConnectionStatus_UNDER_RESET\r
\r
- err = e.rnibDataService.UpdateNodebInfoAndPublish(nodebInfo)\r
+ ranName := request.RanName\r
+ isResetDone, err := e.ranResetManager.ResetRan(ranName)\r
+ if err != nil {\r
+ e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update and notify connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error())\r
+ } else {\r
+ if isResetDone {\r
+ nodebInfoupdated, err1 := e.getNodebInfo(request.RanName)\r
+ if err1 != nil {\r
+ e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to get updated nodeB entity. RanName: %s. Error: %s", request.RanName, err1.Error())\r
+ }\r
+ e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Done Successfully ran: %s , Connection status updated : %s", ranName, nodebInfoupdated.ConnectionStatus)\r
+ } else {\r
+ e.logger.Debugf("#E2ResetRequestNotificationHandler.Handle - Reset Failed")\r
+ }\r
+ }\r
\r
if err != nil {\r
e.logger.Errorf("#E2ResetRequestNotificationHandler.Handle - failed to update connection status of nodeB entity. RanName: %s. Error: %s", request.RanName, err.Error())\r
\r
e.waitfortimertimeout(request)\r
\r
- ranName := request.RanName\r
resetRequest, err := e.parseE2ResetMessage(request.Payload)\r
if err != nil {\r
e.logger.Errorf(err.Error())\r
\r
import (\r
"e2mgr/configuration"\r
+ "e2mgr/managers"\r
"e2mgr/mocks"\r
"e2mgr/models"\r
"e2mgr/rmrCgo"\r
-\r
- // "e2mgr/rmrCgo"\r
"e2mgr/services"\r
"e2mgr/tests"\r
"e2mgr/utils"\r
"testing"\r
\r
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"\r
- // "github.com/stretchr/testify/assert"\r
"github.com/stretchr/testify/mock"\r
)\r
\r
readerMock := &mocks.RnibReaderMock{}\r
writerMock := &mocks.RnibWriterMock{}\r
rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)\r
- handler := NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender)\r
+ ranListManager := managers.NewRanListManager(logger, rnibDataService)\r
+ ranAlarmService := &mocks.RanAlarmServiceMock{}\r
+ ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)\r
+ ranResetManager := managers.NewRanResetManager(logger, rnibDataService, ranConnectStatusChangeManager)\r
+ handler := NewE2ResetRequestNotificationHandler(logger, rnibDataService, config, rmrSender, ranResetManager)\r
return handler, readerMock, writerMock, rmrMessengerMock\r
}\r
\r
}\r
readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)\r
writerMock.On("UpdateNodebInfoAndPublish", mock.Anything).Return(nil)\r
+ var rnibErr error\r
+ writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr)\r
var errEmpty error\r
rmrMessage := &rmrCgo.MBuf{}\r
rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)\r
handler.Handle(notificationRequest)\r
readerMock.AssertExpectations(t)\r
writerMock.AssertExpectations(t)\r
- rmrMessengerMock.AssertNotCalled(t, "SendMsg")\r
+ rmrMessengerMock.AssertCalled(t, "SendMsg", mock.Anything, true)\r
+\r
}\r
\r
func TestE2ResettNotificationHandler_UpdateStatus_Connected(t *testing.T) {\r
}\r
readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)\r
writerMock.On("UpdateNodebInfoAndPublish", mock.Anything).Return(nil)\r
+ var rnibErr error\r
+ writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr)\r
+ nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED\r
+ readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)\r
+\r
+ var errEmpty error\r
+ rmrMessage := &rmrCgo.MBuf{}\r
+ rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty)\r
+ notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(""), e2ResetXml...)}\r
+ handler.Handle(notificationRequest)\r
+ readerMock.AssertCalled(t, "GetNodeb", mock.Anything)\r
+ writerMock.AssertCalled(t, "UpdateNodebInfoAndPublish", mock.Anything)\r
+ readerMock.AssertCalled(t, "GetNodeb", mock.Anything)\r
+}\r
+\r
+func TestE2ResettNotificationHandler_Successful_Reset_Response(t *testing.T) {\r
+ e2ResetXml := utils.ReadXmlFile(t, E2ResetXmlPath)\r
+ handler, readerMock, writerMock, rmrMessengerMock := initE2ResetMocks(t)\r
+ var nodebInfo = &entities.NodebInfo{\r
+ RanName: gnbNodebRanName,\r
+ AssociatedE2TInstanceAddress: e2tInstanceFullAddress,\r
+ ConnectionStatus: entities.ConnectionStatus_DISCONNECTED,\r
+ NodeType: entities.Node_GNB,\r
+ Configuration: &entities.NodebInfo_Gnb{\r
+ Gnb: &entities.Gnb{},\r
+ },\r
+ }\r
+ readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)\r
+ writerMock.On("UpdateNodebInfoAndPublish", mock.Anything).Return(nil)\r
+ var rnibErr error\r
+ writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr)\r
nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED\r
readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)\r
\r
--- /dev/null
+//\r
+// Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved.\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+// This source code is part of the near-RT RIC (RAN Intelligent Controller)\r
+// platform project (RICP).\r
+\r
+package managers\r
+\r
+import (\r
+ "e2mgr/logger"\r
+ "e2mgr/services"\r
+\r
+ "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"\r
+)\r
+\r
+type IRanResetManager interface {\r
+ ResetRan(inventoryName string) error\r
+}\r
+\r
+type RanResetManager struct {\r
+ logger *logger.Logger\r
+ rnibDataService services.RNibDataService\r
+ ranConnectStatusChangeManager IRanConnectStatusChangeManager\r
+}\r
+\r
+func NewRanResetManager(logger *logger.Logger, rnibDataService services.RNibDataService, ranConnectStatusChangeManager IRanConnectStatusChangeManager) *RanResetManager {\r
+ return &RanResetManager{\r
+ logger: logger,\r
+ rnibDataService: rnibDataService,\r
+ ranConnectStatusChangeManager: ranConnectStatusChangeManager,\r
+ }\r
+}\r
+\r
+func (m *RanResetManager) ResetRan(inventoryName string) (bool, error) {\r
+ nodebInfo, err := m.rnibDataService.GetNodeb(inventoryName)\r
+\r
+ if err != nil {\r
+ m.logger.Errorf("#RanResetManager.ResetRan - RAN name: %s - Failed fetching RAN from rNib. Error: %v", inventoryName, err)\r
+ return false, err\r
+ }\r
+\r
+ connectionStatus := nodebInfo.GetConnectionStatus()\r
+ m.logger.Infof("#RanResetManager.ResetRan - RAN name: %s - RAN's connection status: %s", nodebInfo.RanName, connectionStatus)\r
+\r
+ ranConnectStatusChange, err := m.ranConnectStatusChangeManager.ChangeStatus(nodebInfo, entities.ConnectionStatus_UNDER_RESET)\r
+\r
+ if err != nil {\r
+ return ranConnectStatusChange, err\r
+ }\r
+ return ranConnectStatusChange, nil\r
+}\r
--- /dev/null
+//\r
+// Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved.\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+// This source code is part of the near-RT RIC (RAN Intelligent Controller)\r
+// platform project (RICP).\r
+\r
+package managers\r
+\r
+import (\r
+ "e2mgr/configuration"\r
+ "e2mgr/logger"\r
+ "e2mgr/mocks"\r
+ "e2mgr/services"\r
+ "testing"\r
+\r
+ "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"\r
+ "github.com/stretchr/testify/assert"\r
+ "github.com/stretchr/testify/mock"\r
+)\r
+\r
+func initE2ResetStatusChangeTest(t *testing.T) (*logger.Logger, *mocks.RmrMessengerMock, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *RanResetManager) {\r
+ logger, err := logger.InitLogger(logger.DebugLevel)\r
+ if err != nil {\r
+ t.Errorf("#... - failed to initialize logger, error: %s", err)\r
+ }\r
+ config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3}\r
+\r
+ rmrMessengerMock := &mocks.RmrMessengerMock{}\r
+ readerMock := &mocks.RnibReaderMock{}\r
+ writerMock := &mocks.RnibWriterMock{}\r
+ rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock)\r
+ ranListManager := NewRanListManager(logger, rnibDataService)\r
+ ranAlarmService := services.NewRanAlarmService(logger, config)\r
+ ranConnectStatusChangeManager := NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService)\r
+ e2ResetStatusChangeManager := NewRanResetManager(logger, rnibDataService, ranConnectStatusChangeManager)\r
+ return logger, rmrMessengerMock, readerMock, writerMock, e2ResetStatusChangeManager\r
+}\r
+\r
+func TestE2ResetStatusChangeSucceeds(t *testing.T) {\r
+ logger, _, readerMock, writerMock, e2ResetStatusChangeManager := initE2ResetStatusChangeTest(t)\r
+ logger.Infof("#TestRanResetManager.ResetRan - RAN name")\r
+ origNodebInfo := &entities.NodebInfo{RanName: ranName, GlobalNbId: &entities.GlobalNbId{PlmnId: "xxx", NbId: "yyy"}, ConnectionStatus: entities.ConnectionStatus_CONNECTING}\r
+ var rnibErr error\r
+ readerMock.On("GetNodeb", ranName).Return(origNodebInfo, rnibErr)\r
+ updatedNodebInfo1 := *origNodebInfo\r
+ updatedNodebInfo1.ConnectionStatus = entities.ConnectionStatus_UNDER_RESET\r
+ writerMock.On("UpdateNodebInfo", mock.Anything).Return(rnibErr)\r
+ _, err := e2ResetStatusChangeManager.ResetRan(ranName)\r
+ assert.Nil(t, err)\r
+ writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1)\r
+}\r
// 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)
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)
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
}
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)
{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 {