From 76709204dfd7968156b5fa81190f146a8991812d Mon Sep 17 00:00:00 2001 From: idanshal Date: Wed, 17 Jun 2020 14:53:06 +0300 Subject: [PATCH] [RIC-475] [RIC-507] Inject RanStatusChangeManager | Enhance E2 Setup flow | Remove Old Setup Flows | Change ran function definition to string Change-Id: Id119385f81adc1b9237e87f7bf51c4235b3f6ac1 Signed-off-by: idanshal --- E2Manager/app/main.go | 7 +- E2Manager/container-tag.yaml | 2 +- E2Manager/controllers/nodeb_controller.go | 26 -- E2Manager/controllers/nodeb_controller_test.go | 87 +--- E2Manager/go.mod | 6 +- E2Manager/go.sum | 6 + .../delete_all_request_handler_test.go | 3 + .../httpmsghandlers/setup_request_handler.go | 221 ---------- .../httpmsghandlers/setup_request_handler_test.go | 462 --------------------- .../e2_setup_request_notification_handler.go | 52 ++- .../e2_setup_request_notification_handler_test.go | 116 ++++-- .../e2_term_init_notification_handler_test.go | 11 +- .../ran_lost_connection_handler_test.go | 6 +- E2Manager/managers/e2t_association_manager.go | 50 ++- E2Manager/managers/e2t_association_manager_test.go | 43 +- E2Manager/managers/e2t_shutdown_manager_test.go | 6 +- .../notification_manager_test.go | 7 +- .../managers/ran_connect_status_change_manager.go | 4 + .../managers/ran_disconnection_manager_test.go | 5 +- E2Manager/models/e2_setup_request_message.go | 314 +------------- .../incoming_request_handler_provider.go | 7 +- .../incoming_request_handler_provider_test.go | 29 +- .../notification_handler_provider.go | 7 +- .../notification_handler_provider_test.go | 17 +- E2Manager/rNibWriter/rNibWriter.go | 4 +- E2Manager/rNibWriter/rNibWriter_test.go | 12 +- .../services/rmrreceiver/rmr_receiver_test.go | 7 +- E2Manager/tests/resources/setupRequest_gnb.xml | 88 +++- 28 files changed, 349 insertions(+), 1256 deletions(-) delete mode 100644 E2Manager/handlers/httpmsghandlers/setup_request_handler.go delete mode 100644 E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go diff --git a/E2Manager/app/main.go b/E2Manager/app/main.go index d5e16a2..8eb5a64 100644 --- a/E2Manager/app/main.go +++ b/E2Manager/app/main.go @@ -61,11 +61,14 @@ func main() { ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService) e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) routingManagerClient := clients.NewRoutingManagerClient(logger, config, clients.NewHttpClient()) - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) + ranListManager := managers.NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) e2tShutdownManager := managers.NewE2TShutdownManager(logger, config, rnibDataService, e2tInstancesManager, e2tAssociationManager, kubernetes) e2tKeepAliveWorker := managers.NewE2TKeepAliveWorker(logger, rmrSender, e2tInstancesManager, e2tShutdownManager, config) rmrNotificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider() - rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager) + rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager) notificationManager := notificationmanager.NewNotificationManager(logger, rmrNotificationHandlerProvider) rmrReceiver := rmrreceiver.NewRmrReceiver(logger, rmrMessenger, notificationManager) diff --git a/E2Manager/container-tag.yaml b/E2Manager/container-tag.yaml index 273b7ac..3e5978b 100644 --- a/E2Manager/container-tag.yaml +++ b/E2Manager/container-tag.yaml @@ -1,4 +1,4 @@ # The Jenkins job requires a tag to build the Docker image. # Global-JJB script assumes this file is in the repo root. --- -tag: 5.2.0 +tag: 5.2.1 diff --git a/E2Manager/controllers/nodeb_controller.go b/E2Manager/controllers/nodeb_controller.go index 49e821d..45fdb3f 100644 --- a/E2Manager/controllers/nodeb_controller.go +++ b/E2Manager/controllers/nodeb_controller.go @@ -46,8 +46,6 @@ const ContentType = "Content-Type" type INodebController interface { Shutdown(writer http.ResponseWriter, r *http.Request) X2Reset(writer http.ResponseWriter, r *http.Request) - X2Setup(writer http.ResponseWriter, r *http.Request) - EndcSetup(writer http.ResponseWriter, r *http.Request) GetNodeb(writer http.ResponseWriter, r *http.Request) UpdateGnb(writer http.ResponseWriter, r *http.Request) GetNodebIdList(writer http.ResponseWriter, r *http.Request) @@ -127,30 +125,6 @@ func (c *NodebController) X2Reset(writer http.ResponseWriter, r *http.Request) { c.handleRequest(writer, &r.Header, httpmsghandlerprovider.ResetRequest, request, false) } -func (c *NodebController) X2Setup(writer http.ResponseWriter, r *http.Request) { - c.logger.Infof("[Client -> E2 Manager] #NodebController.X2Setup - request: %v", c.prettifyRequest(r)) - - request := models.SetupRequest{} - - if !c.extractJsonBody(r, &request, writer) { - return - } - - c.handleRequest(writer, &r.Header, httpmsghandlerprovider.X2SetupRequest, request, true) -} - -func (c *NodebController) EndcSetup(writer http.ResponseWriter, r *http.Request) { - c.logger.Infof("[Client -> E2 Manager] #NodebController.EndcSetup - request: %v", c.prettifyRequest(r)) - - request := models.SetupRequest{} - - if !c.extractJsonBody(r, &request, writer) { - return - } - - c.handleRequest(writer, &r.Header, httpmsghandlerprovider.EndcSetupRequest, request, true) -} - func (c *NodebController) extractRequestBodyToProto(r *http.Request, pb proto.Message , writer http.ResponseWriter) bool { defer r.Body.Close() diff --git a/E2Manager/controllers/nodeb_controller_test.go b/E2Manager/controllers/nodeb_controller_test.go index 1543674..5541517 100644 --- a/E2Manager/controllers/nodeb_controller_test.go +++ b/E2Manager/controllers/nodeb_controller_test.go @@ -24,7 +24,6 @@ import ( "e2mgr/clients" "e2mgr/configuration" "e2mgr/e2managererrors" - "e2mgr/e2pdus" "e2mgr/logger" "e2mgr/managers" "e2mgr/mocks" @@ -177,92 +176,16 @@ func setupControllerTest(t *testing.T) (*NodebController, *mocks.RnibReaderMock, e2tInstancesManager := &mocks.E2TInstancesManagerMock{} httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) - e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) + ranListManager := &mocks.RanListManagerMock{} + ranAlarmService := &mocks.RanAlarmServiceMock{} + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService, ranListManager, ranAlarmService) + + e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager) handlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(log, rmrSender, config, rnibDataService, ranSetupManager, e2tInstancesManager, e2tAssociationManager, rmClient) controller := NewNodebController(log, handlerProvider) return controller, readerMock, writerMock, rmrMessengerMock, e2tInstancesManager } -func TestX2SetupInvalidBody(t *testing.T) { - - controller, _, _, _, _ := setupControllerTest(t) - - header := http.Header{} - header.Set("Content-Type", "application/json") - httpRequest, _ := http.NewRequest("POST", "http://localhost:3800/v1/nodeb/x2-setup", strings.NewReader("{}{}")) - httpRequest.Header = header - - writer := httptest.NewRecorder() - controller.X2Setup(writer, httpRequest) - - var errorResponse = parseJsonRequest(t, writer.Body) - - assert.Equal(t, http.StatusBadRequest, writer.Result().StatusCode) - assert.Equal(t, e2managererrors.NewInvalidJsonError().Code, errorResponse.Code) -} - -func TestX2SetupSuccess(t *testing.T) { - - controller, readerMock, writerMock, rmrMessengerMock, _ := setupControllerTest(t) - - ranName := "test" - nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} - readerMock.On("GetNodeb", ranName).Return(nb, nil) - var nbUpdated = *nb - writerMock.On("UpdateNodebInfo", &nbUpdated).Return(nil) - - var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} - writerMock.On("UpdateNodebInfo", nbUpdated2).Return(nil) - - payload := e2pdus.PackedX2setupRequest - var xAction []byte - var msgSrc unsafe.Pointer - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) - - header := http.Header{} - header.Set("Content-Type", "application/json") - httpRequest := tests.GetHttpRequest() - httpRequest.Header = header - - writer := httptest.NewRecorder() - controller.X2Setup(writer, httpRequest) - - assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) -} - -func TestEndcSetupSuccess(t *testing.T) { - - controller, readerMock, writerMock, rmrMessengerMock, _ := setupControllerTest(t) - - ranName := "test" - nb := &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} - readerMock.On("GetNodeb", ranName).Return(nb, nil) - var nbUpdated = *nb - writerMock.On("UpdateNodebInfo", &nbUpdated).Return(nil) - - var nbUpdated2 = &entities.NodebInfo{RanName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTING, E2ApplicationProtocol: entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, AssociatedE2TInstanceAddress: "10.0.2.15:8989"} - writerMock.On("UpdateNodebInfo", nbUpdated2).Return(nil) - - payload := e2pdus.PackedEndcX2setupRequest - var xAction []byte - var msgSrc unsafe.Pointer - msg := rmrCgo.NewMBuf(rmrCgo.RIC_ENDC_X2_SETUP_REQ, len(payload), ranName, &payload, &xAction, msgSrc) - - rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(msg, nil) - - header := http.Header{} - header.Set("Content-Type", "application/json") - httpRequest := tests.GetHttpRequest() - httpRequest.Header = header - - writer := httptest.NewRecorder() - controller.EndcSetup(writer, httpRequest) - - assert.Equal(t, http.StatusNoContent, writer.Result().StatusCode) -} - func TestShutdownHandlerRnibError(t *testing.T) { controller, _, _, _, e2tInstancesManagerMock := setupControllerTest(t) e2tInstancesManagerMock.On("GetE2TAddresses").Return([]string{}, e2managererrors.NewRnibDbError()) diff --git a/E2Manager/go.mod b/E2Manager/go.mod index 3be5810..c14dbc0 100644 --- a/E2Manager/go.mod +++ b/E2Manager/go.mod @@ -1,9 +1,9 @@ module e2mgr require ( - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.42 - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.42 - gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.42 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.43 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.43 + gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.43 gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.5.2 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/go-ozzo/ozzo-validation v3.5.0+incompatible diff --git a/E2Manager/go.sum b/E2Manager/go.sum index 5756914..5c019c4 100644 --- a/E2Manager/go.sum +++ b/E2Manager/go.sum @@ -3,10 +3,16 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.42 h1:k3Qpj1BiBPgu+HnMJl3TAi6MlcNwxgij3nY8Kw4NYW0= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.42/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.43 h1:6ZTWb5cAXLEEz8aOs1AiwhBHNhvWogL/9csVjJWkPWQ= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.43/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.42 h1:EPdPmvU3iXgB4b91lNN8wl+WSpXCLi7gDm4yJTOrl/o= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.42/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.43 h1:wUuNSKXzHrFwkuUQkBd4kxmrhvORjqQUmKLvUdyQmZU= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.43/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.42 h1:PyAnsgqXVV3w+1utUrtvh1KfxuVMCYvUXGYOFarChto= gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.42/go.mod h1:K0P3Xh2NXHCwdIDY47IxeElCBVZdT4KqapPBpS7g3JU= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.43 h1:Uhp/SPVK1CByoT6v+qAg4zD6EkaBFf/tc1iyHCdAMao= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.43/go.mod h1:aky9q0dXRlIT1wb63/fOL0/kH4AH6Evs/8FH2tYO1kM= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2 h1:UK7awyRKIkVdokWvvkYvazlg3EWIfMnIqCcJxTnLlDA= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2/go.mod h1:y2WhrCvdLkAKdH+ySdHSOSehACJkTMyZghCGVcqoZzc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= diff --git a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go index a1cea80..e7f8686 100644 --- a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go @@ -42,6 +42,9 @@ import ( "testing" ) +const E2TAddress = "10.0.2.15:8989" +const BaseRMUrl = "http://10.10.2.15:12020/routingmanager" + func setupDeleteAllRequestHandlerTest(t *testing.T) (*DeleteAllRequestHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.HttpClientMock) { log := initLog(t) config := configuration.ParseConfiguration() diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler.go deleted file mode 100644 index dae75a9..0000000 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler.go +++ /dev/null @@ -1,221 +0,0 @@ -// -// 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/managers" - "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" - "github.com/go-ozzo/ozzo-validation" - "github.com/go-ozzo/ozzo-validation/is" -) - -const ( - X2SetupActivityName = "X2_SETUP" - EndcSetupActivityName = "ENDC_SETUP" -) - -type SetupRequestHandler struct { - rNibDataService services.RNibDataService - logger *logger.Logger - ranSetupManager managers.IRanSetupManager - protocol entities.E2ApplicationProtocol - e2tAssociationManager *managers.E2TAssociationManager - e2tInstancesManager managers.IE2TInstancesManager -} - -func NewSetupRequestHandler(logger *logger.Logger, rNibDataService services.RNibDataService, - ranSetupManager managers.IRanSetupManager, protocol entities.E2ApplicationProtocol, e2tInstancesManager managers.IE2TInstancesManager, e2tAssociationManager *managers.E2TAssociationManager) *SetupRequestHandler { - return &SetupRequestHandler{ - logger: logger, - rNibDataService: rNibDataService, - ranSetupManager: ranSetupManager, - protocol: protocol, - e2tAssociationManager: e2tAssociationManager, - e2tInstancesManager: e2tInstancesManager, - } -} - -func (h *SetupRequestHandler) Handle(request models.Request) (models.IResponse, error) { - - setupRequest := request.(models.SetupRequest) - - err := h.validateRequestDetails(setupRequest) - if err != nil { - return nil, err - } - - nodebInfo, err := h.rNibDataService.GetNodeb(setupRequest.RanName) - - if err != nil { - _, ok := err.(*common.ResourceNotFoundError) - if !ok { - h.logger.Errorf("#SetupRequestHandler.Handle - failed to get nodeB entity for ran name: %v from RNIB. Error: %s", setupRequest.RanName, err) - return nil, e2managererrors.NewRnibDbError() - } - - result := h.connectNewRan(&setupRequest, h.protocol) - return nil, result - } - - if nodebInfo.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN { - h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithAssociatedE2TAddress - RAN: %s in wrong state (%s)", nodebInfo.RanName, entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)]) - result := e2managererrors.NewWrongStateError(h.getActivityName(h.protocol), entities.ConnectionStatus_name[int32(nodebInfo.ConnectionStatus)]) - return nil, result - } - - if len(nodebInfo.AssociatedE2TInstanceAddress) != 0 { - result := h.connectExistingRanWithAssociatedE2TAddress(nodebInfo) - return nil, result - } - - result := h.connectExistingRanWithoutAssociatedE2TAddress(nodebInfo) - return nil, result -} - -func createInitialNodeInfo(requestDetails *models.SetupRequest, protocol entities.E2ApplicationProtocol) (*entities.NodebInfo, *entities.NbIdentity) { - - nodebInfo := &entities.NodebInfo{ - Ip: requestDetails.RanIp, - Port: uint32(requestDetails.RanPort), - ConnectionStatus: entities.ConnectionStatus_CONNECTING, - E2ApplicationProtocol: protocol, - RanName: requestDetails.RanName, - } - - nbIdentity := &entities.NbIdentity{ - InventoryName: requestDetails.RanName, - } - - return nodebInfo, nbIdentity -} - -func (h *SetupRequestHandler) connectExistingRanWithoutAssociatedE2TAddress(nodebInfo *entities.NodebInfo) error { - e2tAddress, err := h.e2tInstancesManager.SelectE2TInstance() - - if err != nil { - h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithoutAssociatedE2TAddress - RAN name: %s - failed selecting E2T instance", nodebInfo.RanName) - - if nodebInfo.ConnectionStatus == entities.ConnectionStatus_DISCONNECTED{ - return err - } - - nodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - updateError := h.rNibDataService.UpdateNodebInfo(nodebInfo) - - if updateError != nil { - h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithoutAssociatedE2TAddress - RAN name: %s - failed updating nodeb. error: %s", nodebInfo.RanName, updateError) - } - - return err - } - - err = h.e2tAssociationManager.AssociateRan(e2tAddress, nodebInfo) - - if err != nil { - h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithoutAssociatedE2TAddress - RAN name: %s - failed associating ran to e2t address %s. error: %s", nodebInfo.RanName, e2tAddress, err) - return err - } - - h.logger.Infof("#SetupRequestHandler.connectExistingRanWithoutAssociatedE2TAddress - RAN name: %s - successfully updated nodeb in rNib", nodebInfo.RanName) - - result := h.ranSetupManager.ExecuteSetup(nodebInfo, entities.ConnectionStatus_CONNECTING) - return result -} - -func (h *SetupRequestHandler) connectExistingRanWithAssociatedE2TAddress(nodebInfo *entities.NodebInfo) error { - status := entities.ConnectionStatus_CONNECTING - if nodebInfo.ConnectionStatus == entities.ConnectionStatus_CONNECTED { - status = nodebInfo.ConnectionStatus - } - err := h.rNibDataService.UpdateNodebInfo(nodebInfo) - - if err != nil { - h.logger.Errorf("#SetupRequestHandler.connectExistingRanWithAssociatedE2TAddress - RAN name: %s - failed resetting connection attempts of RAN. error: %s", nodebInfo.RanName, err) - return e2managererrors.NewRnibDbError() - } - - h.logger.Infof("#SetupRequestHandler.connectExistingRanWithAssociatedE2TAddress - RAN name: %s - successfully reset connection attempts of RAN", nodebInfo.RanName) - - result := h.ranSetupManager.ExecuteSetup(nodebInfo, status) - return result -} - -func (h *SetupRequestHandler) connectNewRan(request *models.SetupRequest, protocol entities.E2ApplicationProtocol) error { - - e2tAddress, err := h.e2tInstancesManager.SelectE2TInstance() - - if err != nil { - h.logger.Errorf("#SetupRequestHandler.connectNewRan - RAN name: %s - failed selecting E2T instance", request.RanName) - return err - } - - nodebInfo, nodebIdentity := createInitialNodeInfo(request, protocol) - - err = h.rNibDataService.SaveNodeb(nodebIdentity, nodebInfo) - - if err != nil { - h.logger.Errorf("#SetupRequestHandler.connectNewRan - RAN name: %s - failed to save initial nodeb entity in RNIB. error: %s", request.RanName, err) - return e2managererrors.NewRnibDbError() - } - - h.logger.Infof("#SetupRequestHandler.connectNewRan - RAN name: %s - initial nodeb entity was saved to rNib", request.RanName) - - err = h.e2tAssociationManager.AssociateRan(e2tAddress, nodebInfo) - - if err != nil { - h.logger.Errorf("#SetupRequestHandler.connectNewRan - RAN name: %s - failed associating ran to e2t address %s. error: %s", request.RanName, e2tAddress, err) - return err - } - - result := h.ranSetupManager.ExecuteSetup(nodebInfo, entities.ConnectionStatus_CONNECTING) - - return result -} - -func (handler *SetupRequestHandler) validateRequestDetails(request models.SetupRequest) error { - - if request.RanPort == 0 { - handler.logger.Errorf("#SetupRequestHandler.validateRequestDetails - validation failure: port cannot be zero") - return e2managererrors.NewRequestValidationError() - } - err := validation.ValidateStruct(&request, - validation.Field(&request.RanIp, validation.Required, is.IP), - validation.Field(&request.RanName, validation.Required), - ) - - if err != nil { - handler.logger.Errorf("#SetupRequestHandler.validateRequestDetails - validation failure, error: %v", err) - return e2managererrors.NewRequestValidationError() - } - - return nil -} - -func (handler *SetupRequestHandler) getActivityName(protocol entities.E2ApplicationProtocol) string { - if protocol == entities.E2ApplicationProtocol_X2_SETUP_REQUEST { - return X2SetupActivityName - } - return EndcSetupActivityName -} diff --git a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go deleted file mode 100644 index 9b9880d..0000000 --- a/E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go +++ /dev/null @@ -1,462 +0,0 @@ -// -// 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 ( - "bytes" - "e2mgr/clients" - "e2mgr/configuration" - "e2mgr/e2managererrors" - "e2mgr/e2pdus" - "e2mgr/managers" - "e2mgr/mocks" - "e2mgr/models" - "e2mgr/rmrCgo" - "e2mgr/services" - "encoding/json" - "fmt" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "io/ioutil" - "net/http" - "testing" -) - -const E2TAddress = "10.0.2.15:8989" -const RanName = "test" -const BaseRMUrl = "http://10.10.2.15:12020/routingmanager" - -func initSetupRequestTest(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.E2TInstancesManagerMock, *mocks.RanSetupManagerMock, *mocks.HttpClientMock) { - log := initLog(t) - config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} - config.RoutingManager.BaseUrl = BaseRMUrl - - readerMock := &mocks.RnibReaderMock{} - writerMock := &mocks.RnibWriterMock{} - - rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock) - - ranSetupManagerMock := &mocks.RanSetupManagerMock{} - e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} - httpClientMock := &mocks.HttpClientMock{} - mockHttpClientAssociateRan(httpClientMock) - rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) - e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManagerMock, rmClient) - handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManagerMock, protocol, e2tInstancesManagerMock, e2tAssociationManager) - - return readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock -} - -func initSetupRequestTestBasicMocks(t *testing.T, protocol entities.E2ApplicationProtocol) (*mocks.RnibReaderMock, *mocks.RnibWriterMock, *SetupRequestHandler, *mocks.RmrMessengerMock, *mocks.HttpClientMock, *mocks.E2TInstancesManagerMock) { - log := initLog(t) - config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} - config.RoutingManager.BaseUrl = BaseRMUrl - readerMock := &mocks.RnibReaderMock{} - writerMock := &mocks.RnibWriterMock{} - - rnibDataService := services.NewRnibDataService(log, config, readerMock, writerMock) - - rmrMessengerMock := &mocks.RmrMessengerMock{} - rmrSender := getRmrSender(rmrMessengerMock, log) - ranSetupManager := managers.NewRanSetupManager(log, rmrSender, rnibDataService) - e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} - httpClientMock := &mocks.HttpClientMock{} - rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) - e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManagerMock, rmClient) - handler := NewSetupRequestHandler(log, rnibDataService, ranSetupManager, protocol, e2tInstancesManagerMock, e2tAssociationManager) - - return readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock -} - -func mockHttpClientAssociateRan(httpClientMock *mocks.HttpClientMock) { - data := models.RoutingManagerE2TDataList{models.NewRoutingManagerE2TData(E2TAddress, RanName)} - marshaled, _ := json.Marshal(data) - body := bytes.NewBuffer(marshaled) - url := BaseRMUrl + clients.AssociateRanToE2TInstanceApiSuffix - respBody := ioutil.NopCloser(bytes.NewBufferString("")) - httpClientMock.On("Post", url, "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) -} - -func TestX2SetupHandleNoPortError(t *testing.T) { - readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - - sr := models.SetupRequest{"127.0.0.1", 0, RanName,} - _, err := handler.Handle(sr) - assert.IsType(t, &e2managererrors.RequestValidationError{}, err) - readerMock.AssertNotCalled(t, "GetNodeb") -} - -func TestX2SetupHandleNoRanNameError(t *testing.T) { - readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - - sr := models.SetupRequest{RanPort: 8080, RanIp: "127.0.0.1"} - _, err := handler.Handle(sr) - assert.IsType(t, &e2managererrors.RequestValidationError{}, err) - readerMock.AssertNotCalled(t, "GetNodeb") -} - -func TestX2SetupHandleNoIpError(t *testing.T) { - readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - - sr := models.SetupRequest{RanPort: 8080, RanName: RanName} - _, err := handler.Handle(sr) - assert.IsType(t, &e2managererrors.RequestValidationError{}, err) - readerMock.AssertNotCalled(t, "GetNodeb") -} - -func TestX2SetupHandleInvalidIpError(t *testing.T) { - readerMock, _, handler, _, _, _:= initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - - sr := models.SetupRequest{RanPort: 8080, RanName: RanName, RanIp: "invalid ip"} - _, err := handler.Handle(sr) - assert.IsType(t, &e2managererrors.RequestValidationError{}, err) - readerMock.AssertNotCalled(t, "GetNodeb") -} - -func TestSetupGetNodebFailure(t *testing.T) { - readerMock, _, handler, _, _, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - - rnibErr := &common.ValidationError{} - nb := &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN,} - readerMock.On("GetNodeb", RanName).Return(nb, rnibErr) - - sr := models.SetupRequest{"127.0.0.1", 8080, RanName,} - _, err := handler.Handle(sr) - assert.IsType(t, &e2managererrors.RnibDbError{}, err) -} - -func TestSetupNewRanSelectE2TInstancesDbError(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewRnibDbError()) - _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.IsType(t, &e2managererrors.RnibDbError{}, err) - e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance") - writerMock.AssertNotCalled(t, "SaveNodeb") - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -func TestSetupNewRanSelectE2TInstancesNoInstances(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - nodebInfo, _ := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) - updatedNb := *nodebInfo - updatedNb.AssociatedE2TInstanceAddress = E2TAddress - updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) - ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil) - _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.Nil(t, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - e2tInstancesManagerMock.AssertExpectations(t) - ranSetupManagerMock.AssertExpectations(t) -} - -func TestSetupNewRanAssociateRanFailure(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, httpClientMock := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError()) - setupRequest := &models.SetupRequest{"127.0.0.1", 8080, RanName,} - nb, nbIdentity := createInitialNodeInfo(setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("SaveNodeb", nbIdentity, mock.Anything).Return(nil) - writerMock.On("UpdateNodebInfo", nb).Return(nil) - nb.AssociatedE2TInstanceAddress = E2TAddress - mockHttpClientAssociateRan(httpClientMock) - updatedNb := *nb - updatedNb.AssociatedE2TInstanceAddress = E2TAddress - - _, err := handler.Handle(*setupRequest) - assert.NotNil(t, err) - assert.IsType(t, &e2managererrors.RnibDbError{}, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - e2tInstancesManagerMock.AssertExpectations(t) - ranSetupManagerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) -} - -func TestSetupNewRanSaveNodebFailure(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(common.NewInternalError(fmt.Errorf(""))) - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.RnibDbError{}, err) - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -func TestSetupNewRanSetupDbError(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError()) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) - updatedNb := *nodebInfo - updatedNb.AssociatedE2TInstanceAddress = E2TAddress - updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) - _, err := handler.Handle(setupRequest) - assert.NotNil(t, err) - assert.IsType(t, &e2managererrors.RnibDbError{}, err) - readerMock.AssertExpectations(t) - writerMock.AssertExpectations(t) - ranSetupManagerMock.AssertExpectations(t) -} - -func TestSetupNewRanSetupRmrError(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) - updatedNb := *nodebInfo - updatedNb.AssociatedE2TInstanceAddress = E2TAddress - updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) - ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRmrError()) - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.RmrError{}, err) -} - -func TestSetupNewRanSetupSuccess(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("")) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - nodebInfo, nbIdentity := createInitialNodeInfo(&setupRequest, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) - updatedNb := *nodebInfo - updatedNb.AssociatedE2TInstanceAddress = E2TAddress - updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) - ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil) - _, err := handler.Handle(setupRequest) - assert.Nil(t, err) -} - -func TestX2SetupExistingRanShuttingDown(t *testing.T) { - readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock , _:= initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.WrongStateError{}, err) - e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance") - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -func TestEndcSetupExistingRanShuttingDown(t *testing.T) { - readerMock, _, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST) - readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN}, nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.WrongStateError{}, err) - e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance") - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -func TestSetupExistingRanWithoutAssocE2TInstanceSelectDbError(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewRnibDbError()) - updatedNb := *nb - updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.RnibDbError{}, err) - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceError(t *testing.T) { - readerMock, writerMock, handler, rmrMessengerMock, httpClientMock,e2tInstancesManagerMock:= initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - readerMock.On("GetE2TAddresses").Return([]string{}, nil) - writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - e2tInstancesManagerMock.On("AddRansToInstance", "10.0.2.15:8989", []string{"test"}).Return(nil) - mockHttpClientAssociateRan(httpClientMock) - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.InternalError{}, err) - rmrMessengerMock.AssertNotCalled(t, "SendMsg") - writerMock.AssertExpectations(t) -} - -func TestSetupExistingRanWithoutAssocE2TInstanceSelectNoInstanceErrorUpdateFailure(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - e2tInstancesManagerMock.On("SelectE2TInstance").Return("", e2managererrors.NewE2TInstanceAbsenceError()) - updatedNb := *nb - updatedNb.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf(""))) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err) - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -func TestSetupExistingRanWithoutAssocE2TInstanceSelectErrorAlreadyDisconnected(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, e2managererrors.NewE2TInstanceAbsenceError()) - setupRequest := models.SetupRequest{"127.0.0.1", 8080, RanName,} - _, err := handler.Handle(setupRequest) - assert.IsType(t, &e2managererrors.E2TInstanceAbsenceError{}, err) - writerMock.AssertNotCalled(t, "UpdateNodebInfo") - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -//func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanFailure(t *testing.T) { -// readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) -// nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} -// readerMock.On("GetNodeb", RanName).Return(nb, nil) -// e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) -// e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(e2managererrors.NewRnibDbError()) -// writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) -// _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) -// assert.IsType(t, &e2managererrors.RnibDbError{}, err) -// writerMock.AssertNotCalled(t, "UpdateNodebInfo") -// ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -//} - -//func TestSetupExistingRanWithoutAssocE2TInstanceAssociateRanSucceedsUpdateNodebFails(t *testing.T) { -// readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) -// nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} -// readerMock.On("GetNodeb", RanName).Return(nb, nil) -// e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) -// e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) -// updatedNb := *nb -// updatedNb.AssociatedE2TInstanceAddress = E2TAddress -// writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf(""))) -// _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) -// assert.IsType(t, /* &e2managererrors.RnibDbError{} */&common.InternalError{}, err) -// ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -//} - -//func TestSetupExistingRanWithoutAssocE2TInstanceExecuteSetupFailure(t *testing.T) { -// readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) -// nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} -// readerMock.On("GetNodeb", RanName).Return(nb, nil) -// e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) -// e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) -// updatedNb := *nb -// updatedNb.AssociatedE2TInstanceAddress = E2TAddress -// writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) -// ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(e2managererrors.NewRnibDbError()) -// _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) -// assert.IsType(t, &e2managererrors.RnibDbError{}, err) -//} -// -//func TestSetupExistingRanWithoutAssocE2TInstanceSuccess(t *testing.T) { -// readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) -// nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} -// readerMock.On("GetNodeb", RanName).Return(nb, nil) -// e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) -// e2tInstancesManagerMock.On("AddRansToInstance", E2TAddress, []string{RanName}).Return(nil) -// updatedNb := *nb -// updatedNb.AssociatedE2TInstanceAddress = E2TAddress -// writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) -// ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTING).Return(nil) -// _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) -// assert.Nil(t, err) -//} - -func TestSetupExistingRanWithAssocE2TInstanceUpdateNodebFailure(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - updatedNb := *nb - writerMock.On("UpdateNodebInfo", &updatedNb).Return(common.NewInternalError(fmt.Errorf(""))) - _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.IsType(t, &e2managererrors.RnibDbError{}, err) - e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance") - e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance") - ranSetupManagerMock.AssertNotCalled(t, "ExecuteSetup") -} - -func TestSetupExistingRanWithAssocE2TInstanceExecuteSetupRmrError(t *testing.T) { - readerMock, writerMock, handler, rmrMessengerMock, _, _ := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - updatedNb := *nb - updatedNb3 := updatedNb - updatedNb3.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) - payload := e2pdus.PackedX2setupRequest - xaction := []byte(RanName) - msg := rmrCgo.NewMBuf(rmrCgo.RIC_X2_SETUP_REQ, len(payload), RanName, &payload, &xaction, nil) - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, e2managererrors.NewRmrError()) - writerMock.On("UpdateNodebInfo", &updatedNb3).Return(nil) - _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.IsType(t, &e2managererrors.RmrError{}, err) - writerMock.AssertExpectations(t) -} - -func TestSetupExistingRanWithAssocE2TInstanceConnectedSuccess(t *testing.T) { - readerMock, writerMock, handler, e2tInstancesManagerMock, ranSetupManagerMock, _ := initSetupRequestTest(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: E2TAddress, ConnectionStatus: entities.ConnectionStatus_CONNECTED} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - updatedNb := *nb - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) - ranSetupManagerMock.On("ExecuteSetup", &updatedNb, entities.ConnectionStatus_CONNECTED).Return(nil) - _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.Nil(t, err) - e2tInstancesManagerMock.AssertNotCalled(t, "SelectE2TInstance") - e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance") -} - -func TestSetupExistingRanWithoutAssocE2TInstanceExecuteRoutingManagerError(t *testing.T) { - readerMock, writerMock, handler, rmrMessengerMock, httpClientMock, e2tInstancesManagerMock := initSetupRequestTestBasicMocks(t, entities.E2ApplicationProtocol_X2_SETUP_REQUEST) - nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: "", ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST} - readerMock.On("GetNodeb", RanName).Return(nb, nil) - writerMock.On("UpdateNodebInfo", nb).Return(nil) - e2tInstancesManagerMock.On("SelectE2TInstance").Return(E2TAddress, nil) - mockHttpClientAssociateRan(httpClientMock) - e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) - msg := &rmrCgo.MBuf{} - var errNIl error - rmrMessengerMock.On("SendMsg",mock.Anything, true).Return(msg, errNIl) - _, err := handler.Handle(models.SetupRequest{"127.0.0.1", 8080, RanName,}) - assert.Nil(t, err) - writerMock.AssertExpectations(t) - readerMock.AssertExpectations(t) - httpClientMock.AssertExpectations(t) -} diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go index 7420a29..c5f5e4a 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go @@ -44,22 +44,24 @@ var ( ) type E2SetupRequestNotificationHandler struct { - logger *logger.Logger - config *configuration.Configuration - e2tInstancesManager managers.IE2TInstancesManager - rmrSender *rmrsender.RmrSender - rNibDataService services.RNibDataService - e2tAssociationManager *managers.E2TAssociationManager + logger *logger.Logger + config *configuration.Configuration + e2tInstancesManager managers.IE2TInstancesManager + rmrSender *rmrsender.RmrSender + rNibDataService services.RNibDataService + e2tAssociationManager *managers.E2TAssociationManager + ranConnectStatusChangeManager managers.IRanConnectStatusChangeManager } -func NewE2SetupRequestNotificationHandler(logger *logger.Logger, config *configuration.Configuration, e2tInstancesManager managers.IE2TInstancesManager, rmrSender *rmrsender.RmrSender, rNibDataService services.RNibDataService, e2tAssociationManager *managers.E2TAssociationManager) *E2SetupRequestNotificationHandler { +func NewE2SetupRequestNotificationHandler(logger *logger.Logger, config *configuration.Configuration, e2tInstancesManager managers.IE2TInstancesManager, rmrSender *rmrsender.RmrSender, rNibDataService services.RNibDataService, e2tAssociationManager *managers.E2TAssociationManager, ranConnectStatusChangeManager managers.IRanConnectStatusChangeManager) *E2SetupRequestNotificationHandler { return &E2SetupRequestNotificationHandler{ - logger: logger, - config: config, - e2tInstancesManager: e2tInstancesManager, - rmrSender: rmrSender, - rNibDataService: rNibDataService, - e2tAssociationManager: e2tAssociationManager, + logger: logger, + config: config, + e2tInstancesManager: e2tInstancesManager, + rmrSender: rmrSender, + rNibDataService: rNibDataService, + e2tAssociationManager: e2tAssociationManager, + ranConnectStatusChangeManager: ranConnectStatusChangeManager, } } @@ -148,17 +150,21 @@ func (h *E2SetupRequestNotificationHandler) handleNewRan(ranName string, e2tIpAd return nil, err } + err = h.ranConnectStatusChangeManager.ChangeStatus(nodebInfo, entities.ConnectionStatus_CONNECTED) + + if err != nil { + return nil, err + } + return nodebInfo, nil } -func (h *E2SetupRequestNotificationHandler) setGnbFunctions(nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) error { +func (h *E2SetupRequestNotificationHandler) setGnbFunctions(nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) { ranFunctions := setupRequest.ExtractRanFunctionsList() if ranFunctions != nil { nodebInfo.GetGnb().RanFunctions = ranFunctions } - - return nil } func (h *E2SetupRequestNotificationHandler) handleExistingRan(ranName string, nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) error { @@ -167,8 +173,9 @@ func (h *E2SetupRequestNotificationHandler) handleExistingRan(ranName string, no return errors.New("nodeB entity in incorrect state") } - err := h.setGnbFunctions(nodebInfo, setupRequest) - return err + h.setGnbFunctions(nodebInfo, setupRequest) + + return h.rNibDataService.UpdateNodebInfo(nodebInfo) } func (h *E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(ranName string, req *models.NotificationRequest, cause models.Cause) { @@ -283,30 +290,29 @@ func normalizeXml(payload []byte) []byte { return []byte(normalized) } -func (h E2SetupRequestNotificationHandler) buildNodebInfo(ranName string, e2tAddress string, request *models.E2SetupRequestMessage) (*entities.NodebInfo, error) { +func (h *E2SetupRequestNotificationHandler) buildNodebInfo(ranName string, e2tAddress string, request *models.E2SetupRequestMessage) (*entities.NodebInfo, error) { var err error nodebInfo := &entities.NodebInfo{ AssociatedE2TInstanceAddress: e2tAddress, - ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: ranName, NodeType: entities.Node_GNB, Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}}, GlobalNbId: h.buildGlobalNbId(request), } - err = h.setGnbFunctions(nodebInfo, request) + h.setGnbFunctions(nodebInfo, request) return nodebInfo, err } -func (h E2SetupRequestNotificationHandler) buildGlobalNbId(setupRequest *models.E2SetupRequestMessage) *entities.GlobalNbId { +func (h *E2SetupRequestNotificationHandler) buildGlobalNbId(setupRequest *models.E2SetupRequestMessage) *entities.GlobalNbId { return &entities.GlobalNbId{ PlmnId: setupRequest.GetPlmnId(), NbId: setupRequest.GetNbId(), } } -func (h E2SetupRequestNotificationHandler) buildNbIdentity(ranName string, setupRequest *models.E2SetupRequestMessage) *entities.NbIdentity { +func (h *E2SetupRequestNotificationHandler) buildNbIdentity(ranName string, setupRequest *models.E2SetupRequestMessage) *entities.NbIdentity { return &entities.NbIdentity{ InventoryName: ranName, GlobalNbId: h.buildGlobalNbId(setupRequest), 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 41ddcca..f49eec5 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -32,7 +32,6 @@ import ( "errors" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "github.com/golang/protobuf/ptypes/wrappers" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "io/ioutil" @@ -41,15 +40,15 @@ import ( ) const ( - prefix = "10.0.2.15:9999|" - e2tInstanceFullAddress = "10.0.2.15:9999" - nodebRanName = "gnb:310-410-b5c67788" - GnbSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb.xml" - EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml" - NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml" - EnbSetupRequestXmlPath = "../../tests/resources/setupRequest_enb.xml" - GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb_without_functions.xml" - E2SetupFailureResponseWithMiscCause = "1131" + prefix = "10.0.2.15:9999|" + e2tInstanceFullAddress = "10.0.2.15:9999" + nodebRanName = "gnb:310-410-b5c67788" + GnbSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb.xml" + EnGnbSetupRequestXmlPath = "../../tests/resources/setupRequest_en-gNB.xml" + NgEnbSetupRequestXmlPath = "../../tests/resources/setupRequest_ng-eNB.xml" + EnbSetupRequestXmlPath = "../../tests/resources/setupRequest_enb.xml" + GnbWithoutFunctionsSetupRequestXmlPath = "../../tests/resources/setupRequest_gnb_without_functions.xml" + E2SetupFailureResponseWithMiscCause = "1131" E2SetupFailureResponseWithTransportCause = "1131" ) @@ -140,7 +139,7 @@ func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *tes func getMbuf(msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf { payload := []byte(payloadStr) - mbuf := rmrCgo.NewMBuf(msgType, len(payload), nodebRanName,&payload,&request.TransactionId, request.GetMsgSrc() ) + mbuf := rmrCgo.NewMBuf(msgType, len(payload), nodebRanName, &payload, &request.TransactionId, request.GetMsgSrc()) return mbuf } @@ -152,7 +151,7 @@ func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) { mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest) rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, nil) handler.Handle(notificationRequest) - rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf,true ) + rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true) e2tInstancesManagerMock.AssertNotCalled(t, "GetE2TInstance") routingManagerClientMock.AssertNotCalled(t, "AssociateRanToE2TInstance") readerMock.AssertNotCalled(t, "GetNodeb") @@ -168,13 +167,16 @@ func TestE2SetupRequestNotificationHandler_HandleNewGnbSuccess(t *testing.T) { readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload) - writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil) + nbIdentity := &entities.NbIdentity{InventoryName: nodebRanName, GlobalNbId: &entities.GlobalNbId{PlmnId: "02F829", NbId: "001100000011000000110000"}} + writerMock.On("SaveNodeb", nbIdentity, nodebInfo).Return(nil) + updatedNodebInfo := *nodebInfo + updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").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) rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil) handler.Handle(notificationRequest) - writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } @@ -188,6 +190,9 @@ func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload) writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil) + updatedNodebInfo := *nodebInfo + updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").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) @@ -195,7 +200,6 @@ func TestE2SetupRequestNotificationHandler_HandleNewGnbWithoutFunctionsSuccess(t rmrMessage := &rmrCgo.MBuf{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) handler.Handle(notificationRequest) - writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo) assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } @@ -206,15 +210,19 @@ func TestE2SetupRequestNotificationHandler_HandleNewEnGnbSuccess(t *testing.T) { e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var gnb *entities.NodebInfo readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) - writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlEnGnb...)} + nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload) + writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil) + updatedNodebInfo := *nodebInfo + updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").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) var errEmpty error rmrMessage := &rmrCgo.MBuf{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) - prefBytes := []byte(prefix) - notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlEnGnb...)} handler.Handle(notificationRequest) assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } @@ -226,15 +234,19 @@ func TestE2SetupRequestNotificationHandler_HandleNewNgEnbSuccess(t *testing.T) { e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var gnb *entities.NodebInfo readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) - writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlNgEnb...)} + nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload) + writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil) + updatedNodebInfo := *nodebInfo + updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_CONNECTED").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) var errEmpty error rmrMessage := &rmrCgo.MBuf{} rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(rmrMessage, errEmpty) - prefBytes := []byte(prefix) - notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append(prefBytes, xmlNgEnb...)} handler.Handle(notificationRequest) assertNewNodebSuccessCalls(readerMock, t, e2tInstancesManagerMock, writerMock, routingManagerClientMock, rmrMessengerMock) } @@ -279,8 +291,8 @@ func TestE2SetupRequestNotificationHandler_HandleExistingGnbWithFunctionsSuccess NodeType: entities.Node_GNB, Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{RanFunctions: []*entities.RanFunction{ { - RanFunctionId: &wrappers.UInt32Value{Value: 2}, - RanFunctionRevision: &wrappers.UInt32Value{Value: 2}, + RanFunctionId: 2, + RanFunctionRevision: 2, }, }}}, } @@ -314,7 +326,6 @@ func getExpectedNodebWithFunctionsForNewRan(payload []byte) *entities.NodebInfo nodeb := &entities.NodebInfo{ AssociatedE2TInstanceAddress: e2tInstanceFullAddress, - ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: nodebRanName, NodeType: entities.Node_GNB, Configuration: &entities.NodebInfo_Gnb{ @@ -401,12 +412,19 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var gnb *entities.NodebInfo readerMock.On("GetNodeb", mock.Anything).Return(gnb, common.NewResourceNotFoundError("Not found")) - writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(nil) + notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} + nodebInfo := getExpectedNodebWithFunctionsForNewRan(notificationRequest.Payload) + writerMock.On("SaveNodeb", mock.Anything, nodebInfo).Return(nil) + updatedNodebInfo := *nodebInfo + updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, "RAN_CONNECTION_STATUS_CHANGE", 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, "RAN_CONNECTION_STATUS_CHANGE", nodebRanName+"_DISCONNECTED").Return(nil) var errEmpty error - notificationRequest := &models.NotificationRequest{RanName: nodebRanName, Payload: append([]byte(prefix), xmlGnb...)} mbuf := getMbuf(rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest) rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty) handler.Handle(notificationRequest) @@ -414,7 +432,6 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress) writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything) routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything) - writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything) e2tInstancesManagerMock.AssertNotCalled(t, "AddRansToInstance", mock.Anything, mock.Anything) rmrMessengerMock.AssertCalled(t, "WhSendMsg", mbuf, true) } @@ -422,11 +439,15 @@ func TestE2SetupRequestNotificationHandler_HandleAssociationError(t *testing.T) func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.T) { xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath) logger := tests.InitLog(t) - config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct { - RicId string - Mcc string - Mnc string - }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}} + config := &configuration.Configuration{ + RnibRetryIntervalMs: 10, + MaxRnibConnectionAttempts: 3, + StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE", + GlobalRicId: struct { + RicId string + Mcc string + Mnc string + }{Mcc: "327", Mnc: "94", RicId: "10011001101010101011"}} rmrMessengerMock := &mocks.RmrMessengerMock{} rmrSender := tests.InitRmrSender(rmrMessengerMock, logger) readerMock := &mocks.RnibReaderMock{} @@ -434,13 +455,18 @@ func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing. routingManagerClientMock := &mocks.RoutingManagerClientMock{} rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock) - handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager) + ranListManager := managers.NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService) + + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager) + handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) 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, "RAN_CONNECTION_STATUS_CHANGE", 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) @@ -480,11 +506,15 @@ func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) { logger := tests.InitLog(t) - config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct { - RicId string - Mcc string - Mnc string - }{Mcc: "327", Mnc: "94", RicId: "AACCE"}} + config := &configuration.Configuration{ + RnibRetryIntervalMs: 10, + MaxRnibConnectionAttempts: 3, + StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE", + GlobalRicId: struct { + RicId string + Mcc string + Mnc string + }{Mcc: "327", Mnc: "94", RicId: "AACCE"}} rmrMessengerMock := &mocks.RmrMessengerMock{} rmrSender := tests.InitRmrSender(rmrMessengerMock, logger) readerMock := &mocks.RnibReaderMock{} @@ -492,14 +522,16 @@ func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibRea routingManagerClientMock := &mocks.RoutingManagerClientMock{} rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock) - handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager) + ranListManager := managers.NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService) + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager) + handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager) return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock } func assertNewNodebSuccessCalls(readerMock *mocks.RnibReaderMock, t *testing.T, e2tInstancesManagerMock *mocks.E2TInstancesManagerMock, writerMock *mocks.RnibWriterMock, routingManagerClientMock *mocks.RoutingManagerClientMock, rmrMessengerMock *mocks.RmrMessengerMock) { readerMock.AssertCalled(t, "GetNodeb", mock.Anything) - writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, mock.Anything) e2tInstancesManagerMock.AssertCalled(t, "GetE2TInstance", e2tInstanceFullAddress) routingManagerClientMock.AssertCalled(t, "AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything) writerMock.AssertCalled(t, "UpdateNodebInfo", mock.Anything) 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 8a74eff..6277b4d 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go @@ -62,7 +62,11 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotifica rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) e2tInstancesManagerMock := &mocks.E2TInstancesManagerMock{} - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock) + + ranListManager := &mocks.RanListManagerMock{} + ranAlarmService := &mocks.RanAlarmServiceMock{} + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager) ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManagerMock, routingManagerClientMock) @@ -84,7 +88,10 @@ func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger. rnibDataService := services.NewRnibDataService(logger, config, readerMock, writerMock) e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) + ranListManager := managers.NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManager, routingManagerClient) return logger, config, handler, readerMock, writerMock, httpClientMock diff --git a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go index b1d3546..933ed92 100644 --- a/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go @@ -70,7 +70,11 @@ func setupLostConnectionHandlerTestWithRealDisconnectionManager(t *testing.T, is e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) httpClientMock := &mocks.HttpClientMock{} routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClientMock) - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) + ranListManager := managers.NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService) + + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) handler := NewRanLostConnectionHandler(logger, ranDisconnectionManager) diff --git a/E2Manager/managers/e2t_association_manager.go b/E2Manager/managers/e2t_association_manager.go index 8958241..8ed5ec1 100644 --- a/E2Manager/managers/e2t_association_manager.go +++ b/E2Manager/managers/e2t_association_manager.go @@ -28,18 +28,20 @@ import ( ) type E2TAssociationManager struct { - logger *logger.Logger - rnibDataService services.RNibDataService - e2tInstanceManager IE2TInstancesManager - rmClient clients.IRoutingManagerClient + logger *logger.Logger + rnibDataService services.RNibDataService + e2tInstanceManager IE2TInstancesManager + rmClient clients.IRoutingManagerClient + ranConnectStatusChangeManager IRanConnectStatusChangeManager } -func NewE2TAssociationManager(logger *logger.Logger, rnibDataService services.RNibDataService, e2tInstanceManager IE2TInstancesManager, rmClient clients.IRoutingManagerClient) *E2TAssociationManager { +func NewE2TAssociationManager(logger *logger.Logger, rnibDataService services.RNibDataService, e2tInstanceManager IE2TInstancesManager, rmClient clients.IRoutingManagerClient, ranConnectStatusChangeManager IRanConnectStatusChangeManager) *E2TAssociationManager { return &E2TAssociationManager{ - logger: logger, - rnibDataService: rnibDataService, - e2tInstanceManager: e2tInstanceManager, - rmClient: rmClient, + logger: logger, + rnibDataService: rnibDataService, + e2tInstanceManager: e2tInstanceManager, + rmClient: rmClient, + ranConnectStatusChangeManager: ranConnectStatusChangeManager, } } @@ -64,23 +66,27 @@ func (m *E2TAssociationManager) AssociateRan(e2tAddress string, nodebInfo *entit func (m *E2TAssociationManager) associateRanAndUpdateNodeb(e2tAddress string, nodebInfo *entities.NodebInfo) error { rmErr := m.rmClient.AssociateRanToE2TInstance(e2tAddress, nodebInfo.RanName) + if rmErr != nil { - nodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED - } else { - nodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED - nodebInfo.AssociatedE2TInstanceAddress = e2tAddress + _ = m.ranConnectStatusChangeManager.ChangeStatus(nodebInfo, entities.ConnectionStatus_DISCONNECTED) + return e2managererrors.NewRoutingManagerError() } - rNibErr := m.rnibDataService.UpdateNodebInfo(nodebInfo) - if rNibErr != nil { - m.logger.Errorf("#E2TAssociationManager.associateRanAndUpdateNodeb - RAN name: %s - Failed to update nodeb entity in rNib. Error: %s", nodebInfo.RanName, rNibErr) + + rnibErr := m.ranConnectStatusChangeManager.ChangeStatus(nodebInfo, entities.ConnectionStatus_CONNECTED) + + if rnibErr != nil { + return e2managererrors.NewRnibDbError() } - var err error - if rmErr != nil { - err = e2managererrors.NewRoutingManagerError() - } else if rNibErr != nil{ - err = e2managererrors.NewRnibDbError() + + nodebInfo.AssociatedE2TInstanceAddress = e2tAddress + rnibErr = m.rnibDataService.UpdateNodebInfo(nodebInfo) + + if rnibErr != nil { + m.logger.Errorf("#E2TAssociationManager.associateRanAndUpdateNodeb - RAN name: %s - Failed updating nodeb. Error: %s", nodebInfo.RanName, rnibErr) + return e2managererrors.NewRnibDbError() } - return err + + return nil } func (m *E2TAssociationManager) DissociateRan(e2tAddress string, ranName string) error { diff --git a/E2Manager/managers/e2t_association_manager_test.go b/E2Manager/managers/e2t_association_manager_test.go index d515cd5..11e8a07 100644 --- a/E2Manager/managers/e2t_association_manager_test.go +++ b/E2Manager/managers/e2t_association_manager_test.go @@ -40,7 +40,7 @@ const RanName = "test" func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) { log := initLog(t) - config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} + config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, StateChangeMessageChannel: "RAN_CONNECTION_STATUS_CHANGE"} readerMock := &mocks.RnibReaderMock{} writerMock := &mocks.RnibWriterMock{} @@ -49,9 +49,11 @@ func initE2TAssociationManagerTest(t *testing.T) (*E2TAssociationManager, *mocks e2tInstancesManager := NewE2TInstancesManager(rnibDataService, log) httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) - manager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) - - return manager, readerMock, writerMock, httpClientMock + ranListManager := NewRanListManager(log) + ranAlarmService := services.NewRanAlarmService(log, config) + ranConnectStatusChangeManager := NewRanConnectStatusChangeManager(log, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager) + return e2tAssociationManager, readerMock, writerMock, httpClientMock } func mockHttpClient(httpClientMock *mocks.HttpClientMock, apiSuffix string, isSuccessful bool) { @@ -73,9 +75,12 @@ func TestAssociateRanSuccess(t *testing.T) { mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} updatedNb := *nb - updatedNb.AssociatedE2TInstanceAddress = E2TAddress updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, "RAN_CONNECTION_STATUS_CHANGE", RanName+"_CONNECTED").Return(nil) + updatedNb2 := *nb + updatedNb2.ConnectionStatus = entities.ConnectionStatus_CONNECTED + updatedNb2.AssociatedE2TInstanceAddress = E2TAddress + writerMock.On("UpdateNodebInfo", &updatedNb2).Return(nil) e2tInstance := &entities.E2TInstance{Address: E2TAddress} readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil) updatedE2tInstance := *e2tInstance @@ -108,10 +113,14 @@ func TestAssociateRanUpdateNodebError(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} + updatedNb := *nb - updatedNb.AssociatedE2TInstanceAddress = E2TAddress updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(e2managererrors.NewRnibDbError()) + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, "RAN_CONNECTION_STATUS_CHANGE", RanName+"_CONNECTED").Return(nil) + updatedNb2 := *nb + updatedNb2.ConnectionStatus = entities.ConnectionStatus_CONNECTED + updatedNb2.AssociatedE2TInstanceAddress = E2TAddress + writerMock.On("UpdateNodebInfo", &updatedNb2).Return(e2managererrors.NewRnibDbError()) err := manager.AssociateRan(E2TAddress, nb) @@ -126,10 +135,15 @@ func TestAssociateRanGetE2tInstanceError(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} + updatedNb := *nb - updatedNb.AssociatedE2TInstanceAddress = E2TAddress updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, "RAN_CONNECTION_STATUS_CHANGE", RanName+"_CONNECTED").Return(nil) + + updatedNb2 := *nb + updatedNb2.AssociatedE2TInstanceAddress = E2TAddress + updatedNb2.ConnectionStatus = entities.ConnectionStatus_CONNECTED + writerMock.On("UpdateNodebInfo", &updatedNb2).Return(nil) var e2tInstance *entities.E2TInstance readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, errors.New("test")) @@ -146,10 +160,15 @@ func TestAssociateRanSaveE2tInstanceError(t *testing.T) { manager, readerMock, writerMock, httpClientMock := initE2TAssociationManagerTest(t) mockHttpClient(httpClientMock, clients.AssociateRanToE2TInstanceApiSuffix, true) nb := &entities.NodebInfo{RanName: RanName, AssociatedE2TInstanceAddress: ""} + updatedNb := *nb - updatedNb.AssociatedE2TInstanceAddress = E2TAddress updatedNb.ConnectionStatus = entities.ConnectionStatus_CONNECTED - writerMock.On("UpdateNodebInfo", &updatedNb).Return(nil) + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb, "RAN_CONNECTION_STATUS_CHANGE", RanName+"_CONNECTED").Return(nil) + + updatedNb2 := *nb + updatedNb2.AssociatedE2TInstanceAddress = E2TAddress + updatedNb2.ConnectionStatus = entities.ConnectionStatus_CONNECTED + writerMock.On("UpdateNodebInfo", &updatedNb2).Return(nil) e2tInstance := &entities.E2TInstance{Address: E2TAddress} readerMock.On("GetE2TInstance", E2TAddress).Return(e2tInstance, nil) updatedE2tInstance := *e2tInstance diff --git a/E2Manager/managers/e2t_shutdown_manager_test.go b/E2Manager/managers/e2t_shutdown_manager_test.go index 9e3fcc3..eaceeb5 100644 --- a/E2Manager/managers/e2t_shutdown_manager_test.go +++ b/E2Manager/managers/e2t_shutdown_manager_test.go @@ -55,7 +55,11 @@ func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibR e2tInstancesManager := NewE2TInstancesManager(rnibDataService, log) httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) - associationManager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) + + ranListManager := NewRanListManager(log) + ranAlarmService := services.NewRanAlarmService(log, config) + ranConnectStatusChangeManager := NewRanConnectStatusChangeManager(log, rnibDataService,ranListManager, ranAlarmService) + associationManager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager) //kubernetesManager := initKubernetesManagerTest(t) /*shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager, kubernetesManager) diff --git a/E2Manager/managers/notificationmanager/notification_manager_test.go b/E2Manager/managers/notificationmanager/notification_manager_test.go index ded3f27..27431a3 100644 --- a/E2Manager/managers/notificationmanager/notification_manager_test.go +++ b/E2Manager/managers/notificationmanager/notification_manager_test.go @@ -49,9 +49,12 @@ func initNotificationManagerTest(t *testing.T) (*logger.Logger, *mocks.RnibReade ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService) e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient) - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) + ranListManager := managers.NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) rmrNotificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider() - rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager,routingManagerClient, e2tAssociationManager) + rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager,routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager) notificationManager := NewNotificationManager(logger, rmrNotificationHandlerProvider ) return logger, readerMock, notificationManager } diff --git a/E2Manager/managers/ran_connect_status_change_manager.go b/E2Manager/managers/ran_connect_status_change_manager.go index 26d12b2..ecb645c 100644 --- a/E2Manager/managers/ran_connect_status_change_manager.go +++ b/E2Manager/managers/ran_connect_status_change_manager.go @@ -31,6 +31,10 @@ const ( NONE_RAW_EVENT = "NONE" ) +type IRanConnectStatusChangeManager interface { + ChangeStatus(nodebInfo *entities.NodebInfo, nextStatus entities.ConnectionStatus) error +} + type RanConnectStatusChangeManager struct { logger *logger.Logger rnibDataService services.RNibDataService diff --git a/E2Manager/managers/ran_disconnection_manager_test.go b/E2Manager/managers/ran_disconnection_manager_test.go index 6ef0f54..7c44b80 100644 --- a/E2Manager/managers/ran_disconnection_manager_test.go +++ b/E2Manager/managers/ran_disconnection_manager_test.go @@ -52,7 +52,10 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, *mocks.RmrMessenge e2tInstancesManager := NewE2TInstancesManager(rnibDataService, logger) httpClient := &mocks.HttpClientMock{} routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient) - e2tAssociationManager := NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) + ranListManager := NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) ranDisconnectionManager := NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) return logger, rmrMessengerMock, readerMock, writerMock, ranDisconnectionManager, httpClient } diff --git a/E2Manager/models/e2_setup_request_message.go b/E2Manager/models/e2_setup_request_message.go index e61d498..f7088b8 100644 --- a/E2Manager/models/e2_setup_request_message.go +++ b/E2Manager/models/e2_setup_request_message.go @@ -22,7 +22,6 @@ package models import ( "encoding/xml" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" - "github.com/golang/protobuf/ptypes/wrappers" "strings" ) @@ -132,119 +131,10 @@ type E2SetupRequestMessage struct { } type RanFunctionItem struct { - Text string `xml:",chardata"` - RanFunctionID uint32 `xml:"ranFunctionID"` - RanFunctionDefinition RanFunctionDefinition `xml:"ranFunctionDefinition"` - RanFunctionRevision uint32 `xml:"ranFunctionRevision"` -} - -type RanFunctionDefinition struct { - Text string `xml:",chardata"` - E2smGnbNrtRanFunctionDefinition E2smGnbNrtRanFunctionDefinition `xml:"E2SM-gNB-NRT-RANfunction-Definition"` -} - -type RanFunctionName struct { - Text string `xml:",chardata"` - RanFunctionShortName string `xml:"ranFunction-ShortName"` - RanFunctionE2smOid string `xml:"ranFunction-E2SM-OID"` - RanFunctionDescription string `xml:"ranFunction-Description"` - RanFunctionInstance *uint32 `xml:"ranFunction-Instance"` -} - -type RicEventTriggerStyleList struct { - Text string `xml:",chardata"` - RicEventTriggerStyleType uint32 `xml:"ric-EventTriggerStyle-Type"` - RicEventTriggerStyleName string `xml:"ric-EventTriggerStyle-Name"` - RicEventTriggerFormatType uint32 `xml:"ric-EventTriggerFormat-Type"` -} - -type RanParameterDefItem struct { - Text string `xml:",chardata"` - RanParameterID uint32 `xml:"ranParameter-ID"` - RanParameterName string `xml:"ranParameter-Name"` - RanParameterType RanParameterType `xml:"ranParameter-Type"` -} - -type RanParameterType struct { - Text string `xml:",chardata"` - Boolean *struct{} `xml:"boolean,omitempty"` - Integer *struct{} `xml:"integer,omitempty"` - Enumerated *struct{} `xml:"enumerated,omitempty"` - BitString *struct{} `xml:"bit-string,omitempty"` - OctetString *struct{} `xml:"octet-string,omitempty"` - PrintableString *struct{} `xml:"printable-string,omitempty"` -} - -type RicReportStyleList struct { - Text string `xml:",chardata"` - RicReportStyleType uint32 `xml:"ric-ReportStyle-Type"` - RicReportStyleName string `xml:"ric-ReportStyle-Name"` - RicReportActionFormatType uint32 `xml:"ric-ReportActionFormat-Type"` - RicReportRanParameterDefList struct { - Text string `xml:",chardata"` - RanParameterDefItem []RanParameterDefItem `xml:"RANparameterDef-Item"` - } `xml:"ric-ReportRanParameterDef-List"` - RicIndicationHeaderFormatType uint32 `xml:"ric-IndicationHeaderFormat-Type"` - RicIndicationMessageFormatType uint32 `xml:"ric-IndicationMessageFormat-Type"` -} - -type RicInsertStyleList struct { - Text string `xml:",chardata"` - RicInsertStyleType uint32 `xml:"ric-InsertStyle-Type"` - RicInsertStyleName string `xml:"ric-InsertStyle-Name"` - RicInsertActionFormatType uint32 `xml:"ric-InsertActionFormat-Type"` - RicInsertRanParameterDefList struct { - Text string `xml:",chardata"` - RanParameterDefItem []RanParameterDefItem `xml:"RANparameterDef-Item"` - } `xml:"ric-InsertRanParameterDef-List"` - RicIndicationHeaderFormatType uint32 `xml:"ric-IndicationHeaderFormat-Type"` - RicIndicationMessageFormatType uint32 `xml:"ric-IndicationMessageFormat-Type"` - RicCallProcessIdFormatType uint32 `xml:"ric-CallProcessIDFormat-Type"` -} - -type RicControlStyleList struct { - Text string `xml:",chardata"` - RicControlStyleType uint32 `xml:"ric-ControlStyle-Type"` - RicControlStyleName string `xml:"ric-ControlStyle-Name"` - RicControlHeaderFormatType uint32 `xml:"ric-ControlHeaderFormat-Type"` - RicControlMessageFormatType uint32 `xml:"ric-ControlMessageFormat-Type"` - RicCallProcessIdFormatType uint32 `xml:"ric-CallProcessIDFormat-Type"` -} - -type RicPolicyStyleList struct { - Text string `xml:",chardata"` - RicPolicyStyleType uint32 `xml:"ric-PolicyStyle-Type"` - RicPolicyStyleName string `xml:"ric-PolicyStyle-Name"` - RicPolicyActionFormatType uint32 `xml:"ric-PolicyActionFormat-Type"` - RicPolicyRanParameterDefList struct { - Text string `xml:",chardata"` - RanParameterDefItem []RanParameterDefItem `xml:"RANparameterDef-Item"` - } `xml:"ric-PolicyRanParameterDef-List"` -} - -type E2smGnbNrtRanFunctionDefinition struct { - Text string `xml:",chardata"` - RanFunctionName RanFunctionName `xml:"ranFunction-Name"` - RicEventTriggerStyleList struct { - Text string `xml:",chardata"` - RicEventTriggerStyleList []RicEventTriggerStyleList `xml:"RIC-EventTriggerStyle-List"` - } `xml:"ric-EventTriggerStyle-List"` - RicReportStyleList struct { - Text string `xml:",chardata"` - RicReportStyleList []RicReportStyleList `xml:"RIC-ReportStyle-List"` - } `xml:"ric-ReportStyle-List"` - RicInsertStyleList struct { - Text string `xml:",chardata"` - RicInsertStyleList []RicInsertStyleList `xml:"RIC-InsertStyle-List"` - } `xml:"ric-InsertStyle-List"` - RicControlStyleList struct { - Text string `xml:",chardata"` - RicControlStyleList []RicControlStyleList `xml:"RIC-ControlStyle-List"` - } `xml:"ric-ControlStyle-List"` - RicPolicyStyleList struct { - Text string `xml:",chardata"` - RicPolicyStyleList []RicPolicyStyleList `xml:"RIC-PolicyStyle-List"` - } `xml:"ric-PolicyStyle-List"` + Text string `xml:",chardata"` + RanFunctionID uint32 `xml:"ranFunctionID"` + RanFunctionDefinition string `xml:"ranFunctionDefinition"` + RanFunctionRevision uint32 `xml:"ranFunctionRevision"` } type RANfunctionsList struct { @@ -266,7 +156,7 @@ type RANfunctionsList struct { func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction { // TODO: verify e2SetupRequestIEs structure with Adi e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs - if len(e2SetupRequestIes) < 2 { + if len(e2SetupRequestIes) < 2 { return nil } @@ -276,202 +166,14 @@ func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunctio ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem funcs[i] = &entities.RanFunction{ - RanFunctionId: &wrappers.UInt32Value{Value: ranFunctionItem.RanFunctionID}, - RanFunctionDefinition: m.buildRanFunctionDefinitionProto(&ranFunctionItem.RanFunctionDefinition), - RanFunctionRevision: &wrappers.UInt32Value{Value: ranFunctionItem.RanFunctionRevision}, + RanFunctionId: ranFunctionItem.RanFunctionID, + RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition, + RanFunctionRevision: ranFunctionItem.RanFunctionRevision, } } return funcs } -func (m *E2SetupRequestMessage) buildRanFunctionDefinitionProto(def *RanFunctionDefinition) *entities.RanFunctionDefinition { - return &entities.RanFunctionDefinition{ - E2SmGnbNrtRanFunctionDefinition: &entities.E2SmGnbNrtRanFunctionDefinition{ - RanFunctionName: buildRanFunctionNameProto(def), - RicEventTriggerStyles: buildRicEventTriggerStylesProto(def), - RicReportStyles: buildRicReportStylesProto(def), - RicInsertStyles: buildRicInsertStylesProto(def), - RicControlStyles: buildRicControlStylesProto(def), - RicPolicyStyles: buildRicPolicyStylesProto(def), - }, - } -} - -func buildRanFunctionNameProto(def *RanFunctionDefinition) *entities.RanFunctionName { - defRanFunctionName := def.E2smGnbNrtRanFunctionDefinition.RanFunctionName - ranFunctionName := &entities.RanFunctionName{ - RanFunctionShortName: &wrappers.StringValue{Value: defRanFunctionName.RanFunctionShortName}, - RanFunctionE2SmOid: &wrappers.StringValue{Value: defRanFunctionName.RanFunctionE2smOid}, - RanFunctionDescription: &wrappers.StringValue{Value: defRanFunctionName.RanFunctionDescription}, - } - - if defRanFunctionName.RanFunctionInstance != nil { - ranFunctionName.OptionalRanFunctionInstance = &entities.RanFunctionName_RanFunctionInstance{ - RanFunctionInstance: *defRanFunctionName.RanFunctionInstance, - } - } - - return ranFunctionName -} - -func buildRicEventTriggerStylesProto(def *RanFunctionDefinition) []*entities.RicEventTriggerStyle { - defRicEventTriggerStyleList := def.E2smGnbNrtRanFunctionDefinition.RicEventTriggerStyleList.RicEventTriggerStyleList - ricEventTriggerStyles := make([]*entities.RicEventTriggerStyle, len(defRicEventTriggerStyleList)) - - for i, v := range defRicEventTriggerStyleList { - ricEventTriggerStyles[i] = &entities.RicEventTriggerStyle{ - RicEventTriggerStyleType: &wrappers.UInt32Value{Value: v.RicEventTriggerStyleType}, - RicEventTriggerStyleName: &wrappers.StringValue{Value: v.RicEventTriggerStyleName}, - RicEventTriggerFormatType: &wrappers.UInt32Value{Value: v.RicEventTriggerFormatType}, - } - } - - return ricEventTriggerStyles -} - -func buildRicReportStylesProto(def *RanFunctionDefinition) []*entities.RicReportStyle { - defRicReportStyleList := def.E2smGnbNrtRanFunctionDefinition.RicReportStyleList.RicReportStyleList - ricReportStyles := make([]*entities.RicReportStyle, len(defRicReportStyleList)) - - for i, v := range defRicReportStyleList { - ricReportStyles[i] = &entities.RicReportStyle{ - RicReportStyleType: &wrappers.UInt32Value{Value: v.RicReportStyleType}, - RicReportStyleName: &wrappers.StringValue{Value: v.RicReportStyleName}, - RicReportActionFormatType: &wrappers.UInt32Value{Value: v.RicReportActionFormatType}, - RicReportRanParameterDefs: buildRicReportRanParameterDefsProto(v), - RicIndicationHeaderFormatType: &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType}, - RicIndicationMessageFormatType: &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType}, - } - } - - return ricReportStyles -} - -func buildRicReportRanParameterDefsProto(ricReportStyleList RicReportStyleList) []*entities.RanParameterDef { - ricReportRanParameterDefList := ricReportStyleList.RicReportRanParameterDefList.RanParameterDefItem - ranParameterDefs := make([]*entities.RanParameterDef, len(ricReportRanParameterDefList)) - - for i, v := range ricReportRanParameterDefList { - ranParameterDefs[i] = &entities.RanParameterDef{ - RanParameterId: &wrappers.UInt32Value{Value: v.RanParameterID}, - RanParameterName: &wrappers.StringValue{Value: v.RanParameterName}, - RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType), - } - } - - return ranParameterDefs -} - -func getRanParameterTypeEnumValue(ranParameterType RanParameterType) entities.RanParameterType { - if ranParameterType.Boolean != nil { - return entities.RanParameterType_BOOLEAN - } - - if ranParameterType.BitString != nil { - return entities.RanParameterType_BIT_STRING - } - - if ranParameterType.Enumerated != nil { - return entities.RanParameterType_ENUMERATED - } - - if ranParameterType.Integer != nil { - return entities.RanParameterType_INTEGER - } - - if ranParameterType.OctetString != nil { - return entities.RanParameterType_OCTET_STRING - } - - if ranParameterType.PrintableString != nil { - return entities.RanParameterType_PRINTABLE_STRING - } - - return entities.RanParameterType_UNKNOWN_RAN_PARAMETER_TYPE -} - -func buildRicInsertStylesProto(def *RanFunctionDefinition) []*entities.RicInsertStyle { - defRicInsertStyleList := def.E2smGnbNrtRanFunctionDefinition.RicInsertStyleList.RicInsertStyleList - ricInsertStyles := make([]*entities.RicInsertStyle, len(defRicInsertStyleList)) - - for i, v := range defRicInsertStyleList { - ricInsertStyles[i] = &entities.RicInsertStyle{ - RicInsertStyleType: &wrappers.UInt32Value{Value: v.RicInsertStyleType}, - RicInsertStyleName: &wrappers.StringValue{Value: v.RicInsertStyleName}, - RicInsertActionFormatType: &wrappers.UInt32Value{Value: v.RicInsertActionFormatType}, - RicInsertRanParameterDefs: buildRicInsertRanParameterDefsProto(v), - RicIndicationHeaderFormatType: &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType}, - RicIndicationMessageFormatType: &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType}, - RicCallProcessIdFormatType: &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType}, - } - } - - return ricInsertStyles -} - -func buildRicInsertRanParameterDefsProto(ricInsertStyleList RicInsertStyleList) []*entities.RanParameterDef { - ricInsertRanParameterDefList := ricInsertStyleList.RicInsertRanParameterDefList.RanParameterDefItem - ranParameterDefs := make([]*entities.RanParameterDef, len(ricInsertRanParameterDefList)) - - for i, v := range ricInsertRanParameterDefList { - ranParameterDefs[i] = &entities.RanParameterDef{ - RanParameterId: &wrappers.UInt32Value{Value: v.RanParameterID}, - RanParameterName: &wrappers.StringValue{Value: v.RanParameterName}, - RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType), - } - } - - return ranParameterDefs -} - -func buildRicControlStylesProto(def *RanFunctionDefinition) []*entities.RicControlStyle { - defRicControlStyleList := def.E2smGnbNrtRanFunctionDefinition.RicControlStyleList.RicControlStyleList - ricControlStyles := make([]*entities.RicControlStyle, len(defRicControlStyleList)) - - for i, v := range defRicControlStyleList { - ricControlStyles[i] = &entities.RicControlStyle{ - RicControlStyleType: &wrappers.UInt32Value{Value: v.RicControlStyleType}, - RicControlStyleName: &wrappers.StringValue{Value: v.RicControlStyleName}, - RicControlHeaderFormatType: &wrappers.UInt32Value{Value: v.RicControlHeaderFormatType}, - RicControlMessageFormatType: &wrappers.UInt32Value{Value: v.RicControlMessageFormatType}, - RicCallProcessIdFormatType: &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType}, - } - } - - return ricControlStyles -} - -func buildRicPolicyRanParameterDefsProto(ricPolicyStyleList RicPolicyStyleList) []*entities.RanParameterDef { - ricPolicyRanParameterDefList := ricPolicyStyleList.RicPolicyRanParameterDefList.RanParameterDefItem - ranParameterDefs := make([]*entities.RanParameterDef, len(ricPolicyRanParameterDefList)) - - for i, v := range ricPolicyRanParameterDefList { - ranParameterDefs[i] = &entities.RanParameterDef{ - RanParameterId: &wrappers.UInt32Value{Value: v.RanParameterID}, - RanParameterName: &wrappers.StringValue{Value: v.RanParameterName}, - RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType), - } - } - - return ranParameterDefs -} - -func buildRicPolicyStylesProto(def *RanFunctionDefinition) []*entities.RicPolicyStyle { - defRicPolicyStyleList := def.E2smGnbNrtRanFunctionDefinition.RicPolicyStyleList.RicPolicyStyleList - ricPolicyStyles := make([]*entities.RicPolicyStyle, len(defRicPolicyStyleList)) - - for i, v := range defRicPolicyStyleList { - ricPolicyStyles[i] = &entities.RicPolicyStyle{ - RicPolicyStyleType: &wrappers.UInt32Value{Value: v.RicPolicyStyleType}, - RicPolicyStyleName: &wrappers.StringValue{Value: v.RicPolicyStyleName}, - RicPolicyActionFormatType: &wrappers.UInt32Value{Value: v.RicPolicyActionFormatType}, - RicPolicyRanParameterDefs: buildRicPolicyRanParameterDefsProto(v), - } - } - - return ricPolicyStyles -} - func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId { return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID } diff --git a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go index 9e45372..d32a894 100644 --- a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go @@ -28,7 +28,6 @@ import ( "e2mgr/managers" "e2mgr/services" "e2mgr/services/rmrsender" - "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" ) type IncomingRequest string @@ -37,8 +36,6 @@ const ( SetGeneralConfigurationRequest IncomingRequest = "SetGeneralConfiguration" ShutdownRequest IncomingRequest = "Shutdown" ResetRequest IncomingRequest = "Reset" - X2SetupRequest IncomingRequest = "X2SetupRequest" - EndcSetupRequest IncomingRequest = "EndcSetupRequest" GetNodebRequest IncomingRequest = "GetNodebRequest" GetNodebIdListRequest IncomingRequest = "GetNodebIdListRequest" GetE2TInstancesRequest IncomingRequest = "GetE2TInstancesRequest" @@ -63,13 +60,11 @@ func initRequestHandlerMap(logger *logger.Logger, rmrSender *rmrsender.RmrSender return map[IncomingRequest]httpmsghandlers.RequestHandler{ ShutdownRequest: httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrSender, config, rNibDataService, e2tInstancesManager, rmClient), ResetRequest: httpmsghandlers.NewX2ResetRequestHandler(logger, rmrSender, rNibDataService), - X2SetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_X2_SETUP_REQUEST, e2tInstancesManager, e2tAssociationManager), - EndcSetupRequest: httpmsghandlers.NewSetupRequestHandler(logger, rNibDataService, ranSetupManager, entities.E2ApplicationProtocol_ENDC_X2_SETUP_REQUEST, e2tInstancesManager, e2tAssociationManager), + SetGeneralConfigurationRequest: httpmsghandlers.NewSetGeneralConfigurationHandler(logger, rNibDataService), GetNodebRequest: httpmsghandlers.NewGetNodebRequestHandler(logger, rNibDataService), GetNodebIdListRequest: httpmsghandlers.NewGetNodebIdListRequestHandler(logger, rNibDataService), GetE2TInstancesRequest: httpmsghandlers.NewGetE2TInstancesRequestHandler(logger, e2tInstancesManager), UpdateGnbRequest: httpmsghandlers.NewUpdateGnbRequestHandler(logger, rNibDataService), - SetGeneralConfigurationRequest: httpmsghandlers.NewSetGeneralConfigurationHandler(logger, rNibDataService), } } diff --git a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go index 3a04f0b..f359788 100644 --- a/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go +++ b/E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go @@ -56,7 +56,10 @@ func setupTest(t *testing.T) *IncomingRequestHandlerProvider { e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, log) httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) - e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) + ranListManager := managers.NewRanListManager(log) + ranAlarmService := services.NewRanAlarmService(log, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(log, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := managers.NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient, ranConnectStatusChangeManager) return NewIncomingRequestHandlerProvider(log, rmrSender, configuration.ParseConfiguration(), rnibDataService, ranSetupManager, e2tInstancesManager, e2tAssociationManager, rmClient) } @@ -90,30 +93,6 @@ func TestSetGeneralConfigurationHandler(t *testing.T) { assert.True(t, ok) } -func TestX2SetupRequestHandler(t *testing.T) { - provider := setupTest(t) - handler, err := provider.GetHandler(X2SetupRequest) - - assert.NotNil(t, provider) - assert.Nil(t, err) - - _, ok := handler.(*httpmsghandlers.SetupRequestHandler) - - assert.True(t, ok) -} - -func TestEndcSetupRequestHandler(t *testing.T) { - provider := setupTest(t) - handler, err := provider.GetHandler(EndcSetupRequest) - - assert.NotNil(t, provider) - assert.Nil(t, err) - - _, ok := handler.(*httpmsghandlers.SetupRequestHandler) - - assert.True(t, ok) -} - func TestGetShutdownHandlerFailure(t *testing.T) { provider := setupTest(t) _, actual := provider.GetHandler("test") diff --git a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go index 8a93331..1c14966 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go @@ -57,7 +57,10 @@ func (provider *NotificationHandlerProvider) Register(msgType int, handler rmrms provider.notificationHandlers[msgType] = handler } -func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config *configuration.Configuration, rnibDataService services.RNibDataService, rmrSender *rmrsender.RmrSender, ranSetupManager *managers.RanSetupManager, e2tInstancesManager managers.IE2TInstancesManager, routingManagerClient clients.IRoutingManagerClient, e2tAssociationManager *managers.E2TAssociationManager) { +func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config *configuration.Configuration, + rnibDataService services.RNibDataService, rmrSender *rmrsender.RmrSender, ranSetupManager *managers.RanSetupManager, + e2tInstancesManager managers.IE2TInstancesManager, routingManagerClient clients.IRoutingManagerClient, + e2tAssociationManager *managers.E2TAssociationManager, ranConnectStatusChangeManager managers.IRanConnectStatusChangeManager) { // Init converters x2SetupResponseConverter := converters.NewX2SetupResponseConverter(logger) @@ -88,7 +91,7 @@ func (provider *NotificationHandlerProvider) Init(logger *logger.Logger, config x2ResetRequestNotificationHandler := rmrmsghandlers.NewX2ResetRequestNotificationHandler(logger, rnibDataService, ranStatusChangeManager, rmrSender) e2TermInitNotificationHandler := rmrmsghandlers.NewE2TermInitNotificationHandler(logger, ranReconnectionManager, e2tInstancesManager, routingManagerClient) e2TKeepAliveResponseHandler := rmrmsghandlers.NewE2TKeepAliveResponseHandler(logger, rnibDataService, e2tInstancesManager) - e2SetupRequestNotificationHandler := rmrmsghandlers.NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManager, rmrSender, rnibDataService, e2tAssociationManager) + e2SetupRequestNotificationHandler := rmrmsghandlers.NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManager, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager) 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 8415547..dc8d99b 100644 --- a/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go +++ b/E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go @@ -42,7 +42,7 @@ import ( * Verify support for known providers. */ -func initTestCase(t *testing.T) (*logger.Logger, *configuration.Configuration, services.RNibDataService, *rmrsender.RmrSender, *managers.RanSetupManager, managers.IE2TInstancesManager, clients.IRoutingManagerClient, *managers.E2TAssociationManager) { +func initTestCase(t *testing.T) (*logger.Logger, *configuration.Configuration, services.RNibDataService, *rmrsender.RmrSender, *managers.RanSetupManager, managers.IE2TInstancesManager, clients.IRoutingManagerClient, *managers.E2TAssociationManager, managers.IRanConnectStatusChangeManager) { logger := initLog(t) config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3} @@ -55,14 +55,17 @@ func initTestCase(t *testing.T) (*logger.Logger, *configuration.Configuration, s ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService) e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient) - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) + ranListManager := managers.NewRanListManager(logger) + 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, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager + return logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager } func TestGetNotificationHandlerSuccess(t *testing.T) { - logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager := initTestCase(t) + logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager := initTestCase(t) ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager) ranStatusChangeManager := managers.NewRanStatusChangeManager(logger, rmrSender) @@ -102,7 +105,7 @@ func TestGetNotificationHandlerSuccess(t *testing.T) { for _, tc := range testCases { provider := NewNotificationHandlerProvider() - provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager) + provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager) t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) { handler, err := provider.GetNotificationHandler(tc.msgType) if err != nil { @@ -131,9 +134,9 @@ func TestGetNotificationHandlerFailure(t *testing.T) { } for _, tc := range testCases { - logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager := initTestCase(t) + logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager := initTestCase(t) provider := NewNotificationHandlerProvider() - provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager) + provider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager) t.Run(fmt.Sprintf("%d", tc.msgType), func(t *testing.T) { _, err := provider.GetNotificationHandler(tc.msgType) if err == nil { diff --git a/E2Manager/rNibWriter/rNibWriter.go b/E2Manager/rNibWriter/rNibWriter.go index 3186d70..7322035 100644 --- a/E2Manager/rNibWriter/rNibWriter.go +++ b/E2Manager/rNibWriter/rNibWriter.go @@ -359,7 +359,9 @@ func (w *rNibWriterInstance) UpdateNodebInfoOnConnectionStatusInversion(nodebInf return err } - err = w.sdl.SetAndPublish([]string{stateChangeMessageChannel, event}, pairs) + //TODO: Handle "Redis deployment doesn't support MSETMPUB command" when executing SetAndPublish + //err = w.sdl.SetAndPublish([]string{stateChangeMessageChannel, event}, pairs) + err = w.sdl.Set(pairs) if err != nil { return common.NewInternalError(err) diff --git a/E2Manager/rNibWriter/rNibWriter_test.go b/E2Manager/rNibWriter/rNibWriter_test.go index ec21c3f..ab67b80 100644 --- a/E2Manager/rNibWriter/rNibWriter_test.go +++ b/E2Manager/rNibWriter/rNibWriter_test.go @@ -762,7 +762,9 @@ func TestUpdateNodebInfoOnConnectionStatusInversionSuccess(t *testing.T) { setExpected = append(setExpected, nodebNameKey, data) setExpected = append(setExpected, nodebIdKey, data) - sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e) + sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) + // TODO: after SetAndPublish problem is solved, bring back this line + // sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e) rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, channelName, eventName) assert.Nil(t, rNibErr) @@ -788,7 +790,9 @@ func TestUpdateNodebInfoOnConnectionStatusInversionMissingInventoryNameFailure(t setExpected = append(setExpected, nodebNameKey, data) setExpected = append(setExpected, nodebIdKey, data) - sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e) + sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) + // TODO: after SetAndPublish problem is solved, bring back this line + //sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e) rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, channelName, eventName) @@ -812,7 +816,9 @@ func TestUpdateNodebInfoOnConnectionStatusInversionMissingGlobalNbId(t *testing. nodebNameKey := fmt.Sprintf("RAN:%s", inventoryName) setExpected = append(setExpected, nodebNameKey, data) - sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e) + sdlInstanceMock.On("Set", []interface{}{setExpected}).Return(e) + // TODO: after SetAndPublish problem is solved, bring back this line + //sdlInstanceMock.On("SetAndPublish", []string{channelName, eventName}, []interface{}{setExpected}).Return(e) rNibErr := w.UpdateNodebInfoOnConnectionStatusInversion(nodebInfo, channelName, eventName) diff --git a/E2Manager/services/rmrreceiver/rmr_receiver_test.go b/E2Manager/services/rmrreceiver/rmr_receiver_test.go index b79c581..d3c45a6 100644 --- a/E2Manager/services/rmrreceiver/rmr_receiver_test.go +++ b/E2Manager/services/rmrreceiver/rmr_receiver_test.go @@ -72,9 +72,12 @@ func initRmrReceiver(logger *logger.Logger) *RmrReceiver { ranSetupManager := managers.NewRanSetupManager(logger, rmrSender, rnibDataService) e2tInstancesManager := managers.NewE2TInstancesManager(rnibDataService, logger) routingManagerClient := clients.NewRoutingManagerClient(logger, config, httpClient) - e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient) + ranListManager := managers.NewRanListManager(logger) + ranAlarmService := services.NewRanAlarmService(logger, config) + ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService,ranListManager, ranAlarmService) + e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) rmrNotificationHandlerProvider := rmrmsghandlerprovider.NewNotificationHandlerProvider() - rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager) + rmrNotificationHandlerProvider.Init(logger, config, rnibDataService, rmrSender, ranSetupManager, e2tInstancesManager, routingManagerClient, e2tAssociationManager, ranConnectStatusChangeManager) notificationManager := notificationmanager.NewNotificationManager(logger, rmrNotificationHandlerProvider) return NewRmrReceiver(logger, rmrMessenger, notificationManager) } diff --git a/E2Manager/tests/resources/setupRequest_gnb.xml b/E2Manager/tests/resources/setupRequest_gnb.xml index faf4fc2..847df6a 100644 --- a/E2Manager/tests/resources/setupRequest_gnb.xml +++ b/E2Manager/tests/resources/setupRequest_gnb.xml @@ -1 +1,87 @@ -1302 F8 29 001100000011000000110000 1081 gNB-X2 1.3.6.1.4.1.28458.99.0.21.3.3.1.2 gNB X2 Network Interface 0 1 Message Type only 1 1 Complete message 1 1 AddTimestamp 1 1 1 Complete message 1 1 AddTimestamp 1 1 1 1 Complete message 1 1 1 182 gNB-NRT 1.3.6.1.4.1.28458.99.0.21.3.3.3.3 gNB Neighbour Relation Table 1 Notification 1 1 Complete table 1 1 AddTimestamp 1 1 1 NRT modification 1 1 0 183 gNB-X2 1.3.6.1.4.1.28458.99.0.21.3.3.1.2 gNB X2 Network Interface 1 1 Message Type only 1 1 Message Admission 2 1 QCI1 2 ARP1 3 SPID 4 U-TEID1 10 Load_offset 1 \ No newline at end of file + + + 1 + + + + + + + + 3 + + + + + + + + 02 F8 29 + + 001100000011000000110000 + + + + + + + + 10 + + + + + + + 8 + + + + + + 1 + + 790280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010000010108004D6573736167652054797065206F6E6C7901010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D7020010101010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D70200101010101010001010780436F6D706C657465206D657373616765010101010101 + + 1 + + + + + 8 + + + + + + 2 + + 680300674E422D4E5254000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E332E330D80674E42204E65696768626F75722052656C6174696F6E205461626C6500010105804E6F74696669636174696F6E01010001010680436F6D706C657465207461626C650101000001058041646454696D657374616D70200101010100010107804E5254206D6F64696669636174696F6E010101010100 + + 1 + + + + + 8 + + + + + + 3 + + 450280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010100010108004D6573736167652054797065206F6E6C79010100010108004D6573736167652041646D697373696F6E01020400010180514349310002018041525031000301805350494400040300552D5445494431400A05004C6F61645F6F666673657400 + + 1 + + + + + + + + + + + \ No newline at end of file -- 2.16.6