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)
# 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
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)
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()
"e2mgr/clients"
"e2mgr/configuration"
"e2mgr/e2managererrors"
- "e2mgr/e2pdus"
"e2mgr/logger"
"e2mgr/managers"
"e2mgr/mocks"
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())
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
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=
"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()
+++ /dev/null
-//
-// 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
-}
+++ /dev/null
-//
-// 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)
-}
)
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,
}
}
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 {
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) {
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),
"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"
)
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>"
)
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
}
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")
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)
}
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)
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)
}
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)
}
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)
}
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,
},
}}},
}
nodeb := &entities.NodebInfo{
AssociatedE2TInstanceAddress: e2tInstanceFullAddress,
- ConnectionStatus: entities.ConnectionStatus_CONNECTED,
RanName: nodebRanName,
NodeType: entities.Node_GNB,
Configuration: &entities.NodebInfo_Gnb{
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)
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)
}
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{}
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)
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{}
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)
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)
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
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)
)
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,
}
}
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 {
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{}
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) {
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
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)
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"))
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
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)
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
}
NONE_RAW_EVENT = "NONE"
)
+type IRanConnectStatusChangeManager interface {
+ ChangeStatus(nodebInfo *entities.NodebInfo, nextStatus entities.ConnectionStatus) error
+}
+
type RanConnectStatusChangeManager struct {
logger *logger.Logger
rnibDataService services.RNibDataService
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
}
import (
"encoding/xml"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
- "github.com/golang/protobuf/ptypes/wrappers"
"strings"
)
}
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 {
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
}
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
}
"e2mgr/managers"
"e2mgr/services"
"e2mgr/services/rmrsender"
- "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
)
type IncomingRequest string
SetGeneralConfigurationRequest IncomingRequest = "SetGeneralConfiguration"
ShutdownRequest IncomingRequest = "Shutdown"
ResetRequest IncomingRequest = "Reset"
- X2SetupRequest IncomingRequest = "X2SetupRequest"
- EndcSetupRequest IncomingRequest = "EndcSetupRequest"
GetNodebRequest IncomingRequest = "GetNodebRequest"
GetNodebIdListRequest IncomingRequest = "GetNodebIdListRequest"
GetE2TInstancesRequest IncomingRequest = "GetE2TInstancesRequest"
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),
}
}
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)
}
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")
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)
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)
* 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}
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)
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 {
}
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 {
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)
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)
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)
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)
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)
}
-<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