[RIC-475] [RIC-507] Inject RanStatusChangeManager | Enhance E2 Setup flow | Remove... 62/4162/1
authoridanshal <idan.shalom@intl.att.com>
Wed, 17 Jun 2020 11:53:06 +0000 (14:53 +0300)
committeridanshal <idan.shalom@intl.att.com>
Wed, 17 Jun 2020 11:53:14 +0000 (14:53 +0300)
Change-Id: Id119385f81adc1b9237e87f7bf51c4235b3f6ac1
Signed-off-by: idanshal <idan.shalom@intl.att.com>
28 files changed:
E2Manager/app/main.go
E2Manager/container-tag.yaml
E2Manager/controllers/nodeb_controller.go
E2Manager/controllers/nodeb_controller_test.go
E2Manager/go.mod
E2Manager/go.sum
E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go
E2Manager/handlers/httpmsghandlers/setup_request_handler.go [deleted file]
E2Manager/handlers/httpmsghandlers/setup_request_handler_test.go [deleted file]
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/ran_lost_connection_handler_test.go
E2Manager/managers/e2t_association_manager.go
E2Manager/managers/e2t_association_manager_test.go
E2Manager/managers/e2t_shutdown_manager_test.go
E2Manager/managers/notificationmanager/notification_manager_test.go
E2Manager/managers/ran_connect_status_change_manager.go
E2Manager/managers/ran_disconnection_manager_test.go
E2Manager/models/e2_setup_request_message.go
E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider.go
E2Manager/providers/httpmsghandlerprovider/incoming_request_handler_provider_test.go
E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider.go
E2Manager/providers/rmrmsghandlerprovider/notification_handler_provider_test.go
E2Manager/rNibWriter/rNibWriter.go
E2Manager/rNibWriter/rNibWriter_test.go
E2Manager/services/rmrreceiver/rmr_receiver_test.go
E2Manager/tests/resources/setupRequest_gnb.xml

index d5e16a2..8eb5a64 100644 (file)
@@ -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)
index 273b7ac..3e5978b 100644 (file)
@@ -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
index 49e821d..45fdb3f 100644 (file)
@@ -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()
 
index 1543674..5541517 100644 (file)
@@ -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())
index 3be5810..c14dbc0 100644 (file)
@@ -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
index 5756914..5c019c4 100644 (file)
@@ -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=
index a1cea80..e7f8686 100644 (file)
@@ -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 (file)
index dae75a9..0000000
+++ /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 (file)
index 9b9880d..0000000
+++ /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)
-}
index 7420a29..c5f5e4a 100644 (file)
@@ -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),
index 41ddcca..f49eec5 100644 (file)
@@ -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    = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><misc><om-intervention/></misc></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
+       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      = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><misc><om-intervention/></misc></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
        E2SetupFailureResponseWithTransportCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><transport><transport-resource-unavailable/></transport></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
 )
 
@@ -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)
index 8a74eff..6277b4d 100644 (file)
@@ -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
index b1d3546..933ed92 100644 (file)
@@ -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)
 
index 8958241..8ed5ec1 100644 (file)
@@ -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 {
index d515cd5..11e8a07 100644 (file)
@@ -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
index 9e3fcc3..eaceeb5 100644 (file)
@@ -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)
index ded3f27..27431a3 100644 (file)
@@ -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
 }
index 26d12b2..ecb645c 100644 (file)
@@ -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
index 6ef0f54..7c44b80 100644 (file)
@@ -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
 }
index e61d498..f7088b8 100644 (file)
@@ -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
 }
index 9e45372..d32a894 100644 (file)
@@ -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),
        }
 }
 
index 3a04f0b..f359788 100644 (file)
@@ -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")
index 8a93331..1c14966 100644 (file)
@@ -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)
index 8415547..dc8d99b 100644 (file)
@@ -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 {
index 3186d70..7322035 100644 (file)
@@ -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)
index ec21c3f..ab67b80 100644 (file)
@@ -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)
 
index b79c581..d3c45a6 100644 (file)
@@ -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)
 }
index faf4fc2..847df6a 100644 (file)
@@ -1 +1,87 @@
-<E2AP-PDU><initiatingMessage><procedureCode>1</procedureCode><criticality><reject /></criticality><value><E2setupRequest><protocolIEs><E2setupRequestIEs><id>3</id><criticality><reject /></criticality><value><GlobalE2node-ID><gNB><global-gNB-ID><plmn-id>02 F8 29</plmn-id><gnb-id><gnb-ID>                                                001100000011000000110000                                            </gnb-ID></gnb-id></global-gNB-ID></gNB></GlobalE2node-ID></value></E2setupRequestIEs><E2setupRequestIEs><id>10</id><criticality><reject /></criticality><value><RANfunctions-List><ProtocolIE-SingleContainer><id>8</id><criticality><ignore /></criticality><value><RANfunction-Item><ranFunctionID>1</ranFunctionID><ranFunctionDefinition><E2SM-gNB-NRT-RANfunction-Definition>    <ranFunction-Name>        <ranFunction-ShortName>gNB-X2</ranFunction-ShortName>        <ranFunction-E2SM-OID>1.3.6.1.4.1.28458.99.0.21.3.3.1.2</ranFunction-E2SM-OID>        <ranFunction-Description>gNB X2 Network Interface</ranFunction-Description>        <ranFunction-Instance>0</ranFunction-Instance>    </ranFunction-Name>    <ric-EventTriggerStyle-List>        <RIC-EventTriggerStyle-List>            <ric-EventTriggerStyle-Type>1</ric-EventTriggerStyle-Type>            <ric-EventTriggerStyle-Name>Message Type only</ric-EventTriggerStyle-Name>            <ric-EventTriggerFormat-Type>1</ric-EventTriggerFormat-Type>        </RIC-EventTriggerStyle-List>    </ric-EventTriggerStyle-List>    <ric-ReportStyle-List>        <RIC-ReportStyle-List>            <ric-ReportStyle-Type>1</ric-ReportStyle-Type>            <ric-ReportStyle-Name>Complete message</ric-ReportStyle-Name>            <ric-ReportActionFormat-Type>1</ric-ReportActionFormat-Type>            <ric-ReportRanParameterDef-List>                <RANparameterDef-Item>                    <ranParameter-ID>1</ranParameter-ID>                    <ranParameter-Name>AddTimestamp</ranParameter-Name>                    <ranParameter-Type><boolean/></ranParameter-Type>                </RANparameterDef-Item>            </ric-ReportRanParameterDef-List>            <ric-IndicationHeaderFormat-Type>1</ric-IndicationHeaderFormat-Type>            <ric-IndicationMessageFormat-Type>1</ric-IndicationMessageFormat-Type>        </RIC-ReportStyle-List>    </ric-ReportStyle-List>    <ric-InsertStyle-List>        <RIC-InsertStyle-List>            <ric-InsertStyle-Type>1</ric-InsertStyle-Type>            <ric-InsertStyle-Name>Complete message</ric-InsertStyle-Name>            <ric-InsertActionFormat-Type>1</ric-InsertActionFormat-Type>            <ric-InsertRanParameterDef-List>                <RANparameterDef-Item>                    <ranParameter-ID>1</ranParameter-ID>                    <ranParameter-Name>AddTimestamp</ranParameter-Name>                    <ranParameter-Type><boolean/></ranParameter-Type>                </RANparameterDef-Item>            </ric-InsertRanParameterDef-List>            <ric-IndicationHeaderFormat-Type>1</ric-IndicationHeaderFormat-Type>            <ric-IndicationMessageFormat-Type>1</ric-IndicationMessageFormat-Type>            <ric-CallProcessIDFormat-Type>1</ric-CallProcessIDFormat-Type>        </RIC-InsertStyle-List>    </ric-InsertStyle-List>    <ric-ControlStyle-List>        <RIC-ControlStyle-List>            <ric-ControlStyle-Type>1</ric-ControlStyle-Type>            <ric-ControlStyle-Name>Complete message</ric-ControlStyle-Name>            <ric-ControlHeaderFormat-Type>1</ric-ControlHeaderFormat-Type>            <ric-ControlMessageFormat-Type>1</ric-ControlMessageFormat-Type>            <ric-CallProcessIDFormat-Type>1</ric-CallProcessIDFormat-Type>        </RIC-ControlStyle-List>    </ric-ControlStyle-List></E2SM-gNB-NRT-RANfunction-Definition></ranFunctionDefinition><ranFunctionRevision>1</ranFunctionRevision></RANfunction-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>8</id><criticality><ignore /></criticality><value><RANfunction-Item><ranFunctionID>2</ranFunctionID><ranFunctionDefinition><E2SM-gNB-NRT-RANfunction-Definition>    <ranFunction-Name>        <ranFunction-ShortName>gNB-NRT</ranFunction-ShortName>        <ranFunction-E2SM-OID>1.3.6.1.4.1.28458.99.0.21.3.3.3.3</ranFunction-E2SM-OID>        <ranFunction-Description>gNB Neighbour Relation Table</ranFunction-Description>    </ranFunction-Name>    <ric-EventTriggerStyle-List>        <RIC-EventTriggerStyle-List>            <ric-EventTriggerStyle-Type>1</ric-EventTriggerStyle-Type>            <ric-EventTriggerStyle-Name>Notification</ric-EventTriggerStyle-Name>            <ric-EventTriggerFormat-Type>1</ric-EventTriggerFormat-Type>        </RIC-EventTriggerStyle-List>    </ric-EventTriggerStyle-List>    <ric-ReportStyle-List>        <RIC-ReportStyle-List>            <ric-ReportStyle-Type>1</ric-ReportStyle-Type>            <ric-ReportStyle-Name>Complete table</ric-ReportStyle-Name>            <ric-ReportActionFormat-Type>1</ric-ReportActionFormat-Type>            <ric-ReportRanParameterDef-List>                <RANparameterDef-Item>                    <ranParameter-ID>1</ranParameter-ID>                    <ranParameter-Name>AddTimestamp</ranParameter-Name>                    <ranParameter-Type><boolean/></ranParameter-Type>                </RANparameterDef-Item>            </ric-ReportRanParameterDef-List>            <ric-IndicationHeaderFormat-Type>1</ric-IndicationHeaderFormat-Type>            <ric-IndicationMessageFormat-Type>1</ric-IndicationMessageFormat-Type>        </RIC-ReportStyle-List>    </ric-ReportStyle-List>    <ric-ControlStyle-List>        <RIC-ControlStyle-List>            <ric-ControlStyle-Type>1</ric-ControlStyle-Type>            <ric-ControlStyle-Name>NRT modification</ric-ControlStyle-Name>            <ric-ControlHeaderFormat-Type>1</ric-ControlHeaderFormat-Type>            <ric-ControlMessageFormat-Type>1</ric-ControlMessageFormat-Type>            <ric-CallProcessIDFormat-Type>0</ric-CallProcessIDFormat-Type>        </RIC-ControlStyle-List>    </ric-ControlStyle-List></E2SM-gNB-NRT-RANfunction-Definition></ranFunctionDefinition><ranFunctionRevision>1</ranFunctionRevision></RANfunction-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>8</id><criticality><ignore /></criticality><value><RANfunction-Item><ranFunctionID>3</ranFunctionID><ranFunctionDefinition><E2SM-gNB-NRT-RANfunction-Definition>    <ranFunction-Name>        <ranFunction-ShortName>gNB-X2</ranFunction-ShortName>        <ranFunction-E2SM-OID>1.3.6.1.4.1.28458.99.0.21.3.3.1.2</ranFunction-E2SM-OID>        <ranFunction-Description>gNB X2 Network Interface</ranFunction-Description>        <ranFunction-Instance>1</ranFunction-Instance>    </ranFunction-Name>    <ric-EventTriggerStyle-List>        <RIC-EventTriggerStyle-List>            <ric-EventTriggerStyle-Type>1</ric-EventTriggerStyle-Type>            <ric-EventTriggerStyle-Name>Message Type only</ric-EventTriggerStyle-Name>            <ric-EventTriggerFormat-Type>1</ric-EventTriggerFormat-Type>        </RIC-EventTriggerStyle-List>    </ric-EventTriggerStyle-List>    <ric-PolicyStyle-List>        <RIC-PolicyStyle-List>            <ric-PolicyStyle-Type>1</ric-PolicyStyle-Type>            <ric-PolicyStyle-Name>Message Admission</ric-PolicyStyle-Name>            <ric-PolicyActionFormat-Type>2</ric-PolicyActionFormat-Type>            <ric-PolicyRanParameterDef-List>                <RANparameterDef-Item>                    <ranParameter-ID>1</ranParameter-ID>                    <ranParameter-Name>QCI1</ranParameter-Name>                    <ranParameter-Type><integer/></ranParameter-Type>                </RANparameterDef-Item>                <RANparameterDef-Item>                    <ranParameter-ID>2</ranParameter-ID>                    <ranParameter-Name>ARP1</ranParameter-Name>                    <ranParameter-Type><integer/></ranParameter-Type>                </RANparameterDef-Item>                <RANparameterDef-Item>                    <ranParameter-ID>3</ranParameter-ID>                    <ranParameter-Name>SPID</ranParameter-Name>                    <ranParameter-Type><integer/></ranParameter-Type>                </RANparameterDef-Item>                <RANparameterDef-Item>                    <ranParameter-ID>4</ranParameter-ID>                    <ranParameter-Name>U-TEID1</ranParameter-Name>                    <ranParameter-Type><octet-string/></ranParameter-Type>                </RANparameterDef-Item>                <RANparameterDef-Item>                    <ranParameter-ID>10</ranParameter-ID>                    <ranParameter-Name>Load_offset</ranParameter-Name>                    <ranParameter-Type><integer/></ranParameter-Type>                </RANparameterDef-Item>            </ric-PolicyRanParameterDef-List>        </RIC-PolicyStyle-List>    </ric-PolicyStyle-List></E2SM-gNB-NRT-RANfunction-Definition></ranFunctionDefinition><ranFunctionRevision>1</ranFunctionRevision></RANfunction-Item></value></ProtocolIE-SingleContainer></RANfunctions-List></value></E2setupRequestIEs></protocolIEs></E2setupRequest></value></initiatingMessage></E2AP-PDU>
\ No newline at end of file
+<E2AP-PDU>
+    <initiatingMessage>
+        <procedureCode>1</procedureCode>
+        <criticality>
+            <reject/>
+        </criticality>
+        <value>
+            <E2setupRequest>
+                <protocolIEs>
+                    <E2setupRequestIEs>
+                        <id>3</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <GlobalE2node-ID>
+                                <gNB>
+                                    <global-gNB-ID>
+                                        <plmn-id>02 F8 29</plmn-id>
+                                        <gnb-id>
+                                            <gnb-ID>001100000011000000110000</gnb-ID>
+                                        </gnb-id>
+                                    </global-gNB-ID>
+                                </gNB>
+                            </GlobalE2node-ID>
+                        </value>
+                    </E2setupRequestIEs>
+                    <E2setupRequestIEs>
+                        <id>10</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <RANfunctions-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>8</id>
+                                    <criticality>
+                                        <ignore/>
+                                    </criticality>
+                                    <value>
+                                        <RANfunction-Item>
+                                            <ranFunctionID>1</ranFunctionID>
+                                            <ranFunctionDefinition>
+                                                790280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010000010108004D6573736167652054797065206F6E6C7901010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D7020010101010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D70200101010101010001010780436F6D706C657465206D657373616765010101010101
+                                            </ranFunctionDefinition>
+                                            <ranFunctionRevision>1</ranFunctionRevision>
+                                        </RANfunction-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                                <ProtocolIE-SingleContainer>
+                                    <id>8</id>
+                                    <criticality>
+                                        <ignore/>
+                                    </criticality>
+                                    <value>
+                                        <RANfunction-Item>
+                                            <ranFunctionID>2</ranFunctionID>
+                                            <ranFunctionDefinition>
+                                                680300674E422D4E5254000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E332E330D80674E42204E65696768626F75722052656C6174696F6E205461626C6500010105804E6F74696669636174696F6E01010001010680436F6D706C657465207461626C650101000001058041646454696D657374616D70200101010100010107804E5254206D6F64696669636174696F6E010101010100
+                                            </ranFunctionDefinition>
+                                            <ranFunctionRevision>1</ranFunctionRevision>
+                                        </RANfunction-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                                <ProtocolIE-SingleContainer>
+                                    <id>8</id>
+                                    <criticality>
+                                        <ignore/>
+                                    </criticality>
+                                    <value>
+                                        <RANfunction-Item>
+                                            <ranFunctionID>3</ranFunctionID>
+                                            <ranFunctionDefinition>
+                                                450280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010100010108004D6573736167652054797065206F6E6C79010100010108004D6573736167652041646D697373696F6E01020400010180514349310002018041525031000301805350494400040300552D5445494431400A05004C6F61645F6F666673657400
+                                            </ranFunctionDefinition>
+                                            <ranFunctionRevision>1</ranFunctionRevision>
+                                        </RANfunction-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </RANfunctions-List>
+                        </value>
+                    </E2setupRequestIEs>
+                </protocolIEs>
+            </E2setupRequest>
+        </value>
+    </initiatingMessage>
+</E2AP-PDU>
\ No newline at end of file