From fbd73df3e4bd575816d4c6444807879a8bf54c7f Mon Sep 17 00:00:00 2001 From: Irina Date: Wed, 5 Aug 2020 15:43:45 +0000 Subject: [PATCH] [RIC-430] - Update Connection Status on RAN List Change-Id: I6df4bad90b1639785465ce4cce78fdcb66c24bfa Signed-off-by: Irina --- E2Manager/container-tag.yaml | 2 +- .../delete_all_request_handler_test.go | 173 +++++++++++++----- .../e2_setup_request_notification_handler_test.go | 110 +++++++++--- .../e2_term_init_notification_handler_test.go | 168 ++++++++++++++++-- .../managers/ran_connect_status_change_manager.go | 5 +- .../ran_connect_status_change_manager_test.go | 14 +- E2Manager/managers/ran_list_manager.go | 33 +++- E2Manager/mocks/rnibWriterMock.go | 5 + E2Manager/rNibWriter/rNibWriter.go | 41 ++++- E2Manager/rNibWriter/rNibWriter_test.go | 196 +++++++++++++-------- E2Manager/services/rnib_data_service.go | 10 ++ 11 files changed, 580 insertions(+), 177 deletions(-) diff --git a/E2Manager/container-tag.yaml b/E2Manager/container-tag.yaml index 007b8d0..a6108c8 100644 --- a/E2Manager/container-tag.yaml +++ b/E2Manager/container-tag.yaml @@ -1,4 +1,4 @@ # The Jenkins job requires a tag to build the Docker image. # Global-JJB script assumes this file is in the repo root. --- -tag: 5.4.4 +tag: 5.4.5 diff --git a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go index 86c5bb9..3853dc5 100644 --- a/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go +++ b/E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go @@ -107,7 +107,8 @@ func TestGetE2TAddressesFailure(t *testing.T) { func TestOneRanGetE2TAddressesEmptyList(t *testing.T) { h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} + oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + nbIdentityList := []*entities.NbIdentity{oldNbIdentity} readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) err := ranListManager.InitNbIdentityMap() @@ -116,10 +117,13 @@ func TestOneRanGetE2TAddressesEmptyList(t *testing.T) { } readerMock.On("GetE2TAddresses").Return([]string{}, nil) - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) - updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + _, err = h.Handle(nil) assert.Nil(t, err) readerMock.AssertExpectations(t) @@ -130,19 +134,24 @@ func TestTwoRansGetE2TAddressesEmptyListOneGetNodebFailure(t *testing.T) { h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t) readerMock.On("GetE2TAddresses").Return([]string{}, nil) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2} + readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil) _ = ranListManager.InitNbIdentityMap() var err error - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, err) updatedNb1 := *nb1 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + var nb2 *entities.NodebInfo readerMock.On("GetNodeb", "RanName_2").Return(nb2, common.NewInternalError(errors.New("error"))) _, err = h.Handle(nil) @@ -157,15 +166,17 @@ func TestUpdateNodebInfoOnConnectionStatusInversionFailure(t *testing.T) { h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t) readerMock.On("GetE2TAddresses").Return([]string{}, nil) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2} + readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil) _ = ranListManager.InitNbIdentityMap() - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) - nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN} + nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil) writerMock.On("UpdateNodebInfo", nb2).Return(nil) @@ -173,6 +184,12 @@ func TestUpdateNodebInfoOnConnectionStatusInversionFailure(t *testing.T) { updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(common.NewInternalError(errors.New("error"))) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + + newNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2}).Return(nil) + _, err := h.Handle(nil) assert.IsType(t, &e2managererrors.RnibDbError{}, err) @@ -186,19 +203,24 @@ func TestTwoRansGetE2TAddressesEmptyListOneUpdateNodebInfoFailure(t *testing.T) h, readerMock, writerMock, _, _, ranListManager := setupDeleteAllRequestHandlerTest(t) readerMock.On("GetE2TAddresses").Return([]string{}, nil) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2} + readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil) err := ranListManager.InitNbIdentityMap() if err != nil { t.Errorf("Error cannot init identity") } - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) - updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + nb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED} readerMock.On("GetNodeb", "RanName_2").Return(nb2, nil) updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN} @@ -251,20 +273,23 @@ func TestOneRanShutDown(t *testing.T) { e2tAddresses := []string{} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) err := ranListManager.InitNbIdentityMap() if err != nil { t.Errorf("Error cannot init identity") } - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) - nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN} + nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", nb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil) _, err = h.Handle(nil) @@ -280,24 +305,27 @@ func TestOneRanTryShuttingDownSucceedsClearFails(t *testing.T) { e2tAddresses := []string{E2TAddress} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) err := ranListManager.InitNbIdentityMap() if err != nil { t.Errorf("Error cannot init identity") } - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) updatedNb1 := *nb1 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil) - nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil) readerMock.On("GetE2TInstances", []string{E2TAddress}).Return([]*entities.E2TInstance{}, common.NewInternalError(errors.New("error"))) _, err = h.Handle(nil) @@ -312,24 +340,27 @@ func TestOneRanTryShuttingDownUpdateNodebError(t *testing.T) { e2tAddresses := []string{E2TAddress} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) err := ranListManager.InitNbIdentityMap() if err != nil { t.Errorf("Error cannot init identity") } - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) updatedNb1 := *nb1 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil) - nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(common.NewInternalError(errors.New("error"))) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + _, err = h.Handle(nil) assert.IsType(t, &e2managererrors.RnibDbError{}, err) @@ -343,22 +374,22 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) { e2tAddresses := []string{E2TAddress} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) err := ranListManager.InitNbIdentityMap() if err != nil { t.Errorf("Error cannot init identity") } - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_CONNECTED, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) updatedNb1 := *nb1 updatedNb1.ConnectionStatus = entities.ConnectionStatus_SHUTTING_DOWN writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNb1, "RanName_1_DISCONNECTED").Return(nil) - nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + nodeb1NotAssociated := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", nodeb1NotAssociated).Return(nil) readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil) @@ -368,6 +399,9 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSendFails(t *testing.T) { updatedE2tInstance.AssociatedRanList = []string{} writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL} mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc()) rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, e2managererrors.NewRmrError()) @@ -433,18 +467,18 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttin e2tAddresses := []string{E2TAddress} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) err := ranListManager.InitNbIdentityMap() if err != nil { t.Errorf("Error cannot init identity") } - nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, AssociatedE2TInstanceAddress: E2TAddress} + nb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, AssociatedE2TInstanceAddress: E2TAddress, NodeType: entities.Node_GNB} readerMock.On("GetNodeb", "RanName_1").Return(nb1, nil) - updatedNb1 := *nb1 //&entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, AssociatedE2TInstanceAddress: E2TAddress} + updatedNb1 := *nb1 writerMock.On("UpdateNodebInfo", &updatedNb1).Return(nil) nodeb1NotAssociated := *nb1 @@ -459,11 +493,14 @@ func TestOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttin updatedE2tInstance.AssociatedRanList = []string{} writerMock.On("SaveE2TInstance", &updatedE2tInstance).Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + rmrMessage := models.RmrMessage{MsgType: rmrCgo.RIC_SCTP_CLEAR_ALL} mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc()) rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil) - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil) updatedNb2 := *nb1 //&entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN,} @@ -484,15 +521,16 @@ func testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttin e2tAddresses := []string{E2TAddress} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, !partial) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}} - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + + oldNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) err := ranListManager.InitNbIdentityMap() if err != nil { t.Errorf("Error cannot init identity") } - updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil) readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil) e2tInstance := entities.E2TInstance{Address: E2TAddress, AssociatedRanList: []string{"RanName_1"}} @@ -505,10 +543,17 @@ func testOneRanTryShuttingDownSucceedsClearSucceedsRmrSucceedsRanStatusIsShuttin mbuf := rmrCgo.NewMBuf(rmrMessage.MsgType, len(rmrMessage.Payload), rmrMessage.RanName, &rmrMessage.Payload, &rmrMessage.XAction, rmrMessage.GetMsgSrc()) rmrMessengerMock.On("SendMsg", mbuf, true).Return(mbuf, nil) - readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) readerMock.On("GetNodeb", "RanName_1").Return(updatedNb1, nil) - updatedNb2 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN} + updatedNb2 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil) + + newNbIdentity := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + + newNbIdentityShutDown := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentityShutDown}).Return(nil) + _, err = h.Handle(nil) assert.Nil(t, err) rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true) @@ -530,7 +575,14 @@ func TestSuccessTwoE2TInstancesSixRans(t *testing.T) { e2tAddresses := []string{E2TAddress, E2TAddress2} readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) mockHttpClientDissociateAllRans(httpClientMock, e2tAddresses, true) - nbIdentityList := []*entities.NbIdentity{{InventoryName: "RanName_1"}, {InventoryName: "RanName_2"}, {InventoryName: "RanName_3"}, {InventoryName: "RanName_4"}, {InventoryName: "RanName_5"}, {InventoryName: "RanName_6"}} + + oldNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + oldNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + oldNbIdentity3 := &entities.NbIdentity{InventoryName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId3", NbId: "nbId3"}} + oldNbIdentity4 := &entities.NbIdentity{InventoryName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId4", NbId: "nbId4"}} + oldNbIdentity5 := &entities.NbIdentity{InventoryName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId5", NbId: "nbId5"}} + oldNbIdentity6 := &entities.NbIdentity{InventoryName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId6", NbId: "nbId6"}} + nbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2, oldNbIdentity3, oldNbIdentity4, oldNbIdentity5, oldNbIdentity6} readerMock.On("GetListNodebIds").Return(nbIdentityList, nil) err := ranListManager.InitNbIdentityMap() @@ -538,17 +590,17 @@ func TestSuccessTwoE2TInstancesSixRans(t *testing.T) { t.Errorf("Error cannot init identity") } - updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + updatedNb1 := &entities.NodebInfo{RanName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb1).Return(nil) - updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + updatedNb2 := &entities.NodebInfo{RanName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb2).Return(nil) - updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + updatedNb3 := &entities.NodebInfo{RanName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb3).Return(nil) - updatedNb4 := &entities.NodebInfo{RanName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + updatedNb4 := &entities.NodebInfo{RanName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb4).Return(nil) - updatedNb5 := &entities.NodebInfo{RanName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + updatedNb5 := &entities.NodebInfo{RanName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb5).Return(nil) - updatedNb6 := &entities.NodebInfo{RanName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} + updatedNb6 := &entities.NodebInfo{RanName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, NodeType: entities.Node_GNB} writerMock.On("UpdateNodebInfo", updatedNb6).Return(nil) readerMock.On("GetE2TAddresses").Return(e2tAddresses, nil) @@ -592,6 +644,33 @@ func TestSuccessTwoE2TInstancesSixRans(t *testing.T) { updatedNb6AfterTimer := *updatedNb6 updatedNb6AfterTimer.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfo", &updatedNb6AfterTimer).Return(nil) + + newNbIdentity1 := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity1}).Return(nil) + newNbIdentity2 := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2}).Return(nil) + newNbIdentity3 := &entities.NbIdentity{InventoryName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId3", NbId: "nbId3"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity3}, []*entities.NbIdentity{newNbIdentity3}).Return(nil) + newNbIdentity4 := &entities.NbIdentity{InventoryName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId4", NbId: "nbId4"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity4}, []*entities.NbIdentity{newNbIdentity4}).Return(nil) + newNbIdentity5 := &entities.NbIdentity{InventoryName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId5", NbId: "nbId5"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity5}, []*entities.NbIdentity{newNbIdentity5}).Return(nil) + newNbIdentity6 := &entities.NbIdentity{InventoryName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId6", NbId: "nbId6"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity6}, []*entities.NbIdentity{newNbIdentity6}).Return(nil) + + newNbIdentity1ShutDown := &entities.NbIdentity{InventoryName: "RanName_1", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity1ShutDown}).Return(nil) + newNbIdentity2ShutDown := &entities.NbIdentity{InventoryName: "RanName_2", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2ShutDown}).Return(nil) + newNbIdentity3ShutDown := &entities.NbIdentity{InventoryName: "RanName_3", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId3", NbId: "nbId3"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity3}, []*entities.NbIdentity{newNbIdentity3ShutDown}).Return(nil) + newNbIdentity4ShutDown := &entities.NbIdentity{InventoryName: "RanName_4", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId4", NbId: "nbId4"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity4}, []*entities.NbIdentity{newNbIdentity4ShutDown}).Return(nil) + newNbIdentity5ShutDown := &entities.NbIdentity{InventoryName: "RanName_5", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId5", NbId: "nbId5"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity5}, []*entities.NbIdentity{newNbIdentity5ShutDown}).Return(nil) + newNbIdentity6ShutDown := &entities.NbIdentity{InventoryName: "RanName_6", ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId6", NbId: "nbId6"}} + writerMock.On("UpdateNbIdentities", updatedNb1.GetNodeType(), []*entities.NbIdentity{oldNbIdentity6}, []*entities.NbIdentity{newNbIdentity6ShutDown}).Return(nil) + _, err = h.Handle(nil) assert.Nil(t, err) rmrMessengerMock.AssertCalled(t, "SendMsg", mbuf, true) diff --git a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go index 5f2e7f6..0d58a3b 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go @@ -56,7 +56,7 @@ const ( StateChangeMessageChannel = "RAN_CONNECTION_STATUS_CHANGE" ) -func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) { +func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock, managers.RanListManager) { logger := tests.InitLog(t) config := &configuration.Configuration{ RnibRetryIntervalMs: 10, @@ -81,7 +81,7 @@ func initMocks(t *testing.T) (*E2SetupRequestNotificationHandler, *mocks.RnibRea ranConnectStatusChangeManager := managers.NewRanConnectStatusChangeManager(logger, rnibDataService, ranListManager, ranAlarmService) e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManagerMock, routingManagerClientMock, ranConnectStatusChangeManager) handler := NewE2SetupRequestNotificationHandler(logger, config, e2tInstancesManagerMock, rmrSender, rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager, ranListManager) - return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock + return handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager } func getMbuf(ranName string, msgType int, payloadStr string, request *models.NotificationRequest) *rmrCgo.MBuf { @@ -105,7 +105,7 @@ func readXmlFile(t *testing.T, xmlPath string) []byte { func TestParseGnbSetupRequest_Success(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, _, _, _, _, _ := initMocks(t) + handler, _, _, _, _, _, _ := initMocks(t) prefBytes := []byte(e2SetupMsgPrefix) request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...)) assert.Equal(t, "02F829", request.GetPlmnId()) @@ -115,7 +115,7 @@ func TestParseGnbSetupRequest_Success(t *testing.T) { func TestParseEnGnbSetupRequest_Success(t *testing.T) { enGnbXml := readXmlFile(t, EnGnbSetupRequestXmlPath) - handler, _, _, _, _, _ := initMocks(t) + handler, _, _, _, _, _, _ := initMocks(t) prefBytes := []byte(e2SetupMsgPrefix) request, _, err := handler.parseSetupRequest(append(prefBytes, enGnbXml...)) assert.Equal(t, "131014", request.GetPlmnId()) @@ -125,7 +125,7 @@ func TestParseEnGnbSetupRequest_Success(t *testing.T) { func TestParseNgEnbSetupRequest_Success(t *testing.T) { ngEnbXml := readXmlFile(t, NgEnbSetupRequestXmlPath) - handler, _, _, _, _, _ := initMocks(t) + handler, _, _, _, _, _, _ := initMocks(t) prefBytes := []byte(e2SetupMsgPrefix) request, _, err := handler.parseSetupRequest(append(prefBytes, ngEnbXml...)) assert.Equal(t, "131014", request.GetPlmnId()) @@ -135,7 +135,7 @@ func TestParseNgEnbSetupRequest_Success(t *testing.T) { func TestParseEnbSetupRequest_Success(t *testing.T) { enbXml := readXmlFile(t, EnbSetupRequestXmlPath) - handler, _, _, _, _, _ := initMocks(t) + handler, _, _, _, _, _, _ := initMocks(t) prefBytes := []byte(e2SetupMsgPrefix) request, _, err := handler.parseSetupRequest(append(prefBytes, enbXml...)) assert.Equal(t, "6359AB", request.GetPlmnId()) @@ -145,7 +145,7 @@ func TestParseEnbSetupRequest_Success(t *testing.T) { func TestParseSetupRequest_PipFailure(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, _, _, _, _, _ := initMocks(t) + handler, _, _, _, _, _, _ := initMocks(t) prefBytes := []byte("10.0.2.15:9999") request, _, err := handler.parseSetupRequest(append(prefBytes, xmlGnb...)) assert.Nil(t, request) @@ -154,7 +154,7 @@ func TestParseSetupRequest_PipFailure(t *testing.T) { } func TestParseSetupRequest_UnmarshalFailure(t *testing.T) { - handler, _, _, _, _, _ := initMocks(t) + handler, _, _, _, _, _, _ := initMocks(t) prefBytes := []byte(e2SetupMsgPrefix) request, _, err := handler.parseSetupRequest(append(prefBytes, 1, 2, 3)) assert.Nil(t, request) @@ -164,7 +164,7 @@ func TestParseSetupRequest_UnmarshalFailure(t *testing.T) { func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte("invalid_prefix"), xmlGnb...)} handler.Handle(notificationRequest) @@ -177,7 +177,7 @@ func TestE2SetupRequestNotificationHandler_HandleParseError(t *testing.T) { } func TestE2SetupRequestNotificationHandler_HandleUnmarshalError(t *testing.T) { - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), "xmlGnb"...)} handler.Handle(notificationRequest) @@ -225,6 +225,7 @@ func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing. writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", mock.Anything, mock.Anything).Return(nil) routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(nil) writerMock.On("UpdateNodebInfo", mock.Anything).Return(nil) + writerMock.On("UpdateNbIdentities", mock.Anything, mock.Anything, mock.Anything).Return(nil) e2tInstancesManagerMock.On("AddRansToInstance", mock.Anything, mock.Anything).Return(nil) var errEmpty error rmrMessage := &rmrCgo.MBuf{} @@ -242,7 +243,7 @@ func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing. } func TestExtractionOfNodeTypeFromRanName(t *testing.T) { - handler, _, _, _, _, _ := initMocks(t) + handler, _, _, _, _, _, _ := initMocks(t) validRanNames := []string{"gnb_P310_410_b5c67788", "en_gnb_P310_410_b5c67788", "ng_enB_macro_P310_410_b5c67788", "ng_enB_shortmacro_P310_410_b5c67788", "ng_enB_longmacro_P310_410_b5c67788", "enB_macro_P310_410_b5c67788", "enB_home_P310_410_b5c67788", "enB_shortmacro_P310_410_b5c67788", "enB_longmacro_P310_410_b5c67788"} for _, v := range validRanNames { nodeb := &entities.NodebInfo{RanName: v} @@ -259,7 +260,7 @@ func TestExtractionOfNodeTypeFromRanName(t *testing.T) { func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{}, common.NewInternalError(errors.New("some error"))) notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)} handler.Handle(notificationRequest) @@ -272,7 +273,7 @@ func TestE2SetupRequestNotificationHandler_GetGeneralConfigurationFailure(t *tes func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: false}, nil) notificationRequest := &models.NotificationRequest{RanName: gnbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlGnb...)} mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithMiscCause, notificationRequest) @@ -287,7 +288,7 @@ func TestE2SetupRequestNotificationHandler_EnableRicFalse(t *testing.T) { func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, common.NewResourceNotFoundError("Not found")) prefBytes := []byte(e2SetupMsgPrefix) @@ -304,7 +305,7 @@ func TestE2SetupRequestNotificationHandler_HandleGetE2TInstanceError(t *testing. func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t) + handler, readerMock, writerMock, routingManagerClientMock, e2tInstancesManagerMock, rmrMessengerMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var gnb *entities.NodebInfo @@ -324,7 +325,7 @@ func TestE2SetupRequestNotificationHandler_HandleGetNodebError(t *testing.T) { func TestE2SetupRequestNotificationHandler_HandleNewRanSaveNodebFailure(t *testing.T) { xml := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t) + handler, readerMock, writerMock, _, e2tInstancesManagerMock, _, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var gnb *entities.NodebInfo @@ -341,7 +342,7 @@ func TestE2SetupRequestNotificationHandler_HandleNewRanSaveNodebFailure(t *testi func TestE2SetupRequestNotificationHandler_HandleNewRan_invalidRanName(t *testing.T) { xml := readXmlFile(t, EnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _ := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, _, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var enb *entities.NodebInfo @@ -360,7 +361,7 @@ func TestE2SetupRequestNotificationHandler_HandleNewRan_invalidRanName(t *testin func TestE2SetupRequestNotificationHandler_HandleNewRanAddNbIdentityFailure(t *testing.T) { xml := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, _, e2tInstancesManagerMock, _ := initMocks(t) + handler, readerMock, writerMock, _, e2tInstancesManagerMock, _, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var gnb *entities.NodebInfo @@ -379,7 +380,7 @@ func TestE2SetupRequestNotificationHandler_HandleNewRanAddNbIdentityFailure(t *t func TestE2SetupRequestNotificationHandler_HandleNewRanRoutingManagerError(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) readerMock.On("GetNodeb", gnbNodebRanName).Return(&entities.NodebInfo{}, common.NewResourceNotFoundError("Not found")) @@ -392,6 +393,7 @@ func TestE2SetupRequestNotificationHandler_HandleNewRanRoutingManagerError(t *te routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error")) updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(nil) + writerMock.On("UpdateNbIdentities", mock.Anything, mock.Anything, mock.Anything).Return(nil) var errEmpty error mbuf := getMbuf(gnbNodebRanName, rmrCgo.RIC_E2_SETUP_FAILURE, E2SetupFailureResponseWithTransportCause, notificationRequest) rmrMessengerMock.On("WhSendMsg", mbuf, true).Return(&rmrCgo.MBuf{}, errEmpty) @@ -412,7 +414,7 @@ func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xml } else { ranName = enbNodebRanName } - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, _ := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var gnb *entities.NodebInfo @@ -435,6 +437,10 @@ func testE2SetupRequestNotificationHandler_HandleNewRanSuccess(t *testing.T, xml updatedNodebInfo2.ConnectionStatus = entities.ConnectionStatus_CONNECTED updatedNodebInfo2.AssociatedE2TInstanceAddress = e2tInstanceFullAddress writerMock.On("UpdateNodebInfo", &updatedNodebInfo2).Return(nil) + + newNbIdentity := &entities.NbIdentity{InventoryName: ranName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: expectedNodebInfo.GlobalNbId} + writerMock.On("UpdateNbIdentities", updatedNodebInfo2.GetNodeType(), []*entities.NbIdentity{nbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{ranName}).Return(nil) rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, nil) @@ -536,7 +542,15 @@ func getExpectedNodebForExistingRan(nodeb *entities.NodebInfo, payload []byte) * func TestE2SetupRequestNotificationHandler_HandleExistingConnectedEnbSuccess(t *testing.T) { xmlEnb := readXmlFile(t, EnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t) + + oldNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var nodebInfo = &entities.NodebInfo{ @@ -553,6 +567,8 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedEnbSuccess(t * notificationRequest := &models.NotificationRequest{RanName: enbNodebRanName, Payload: append([]byte(e2SetupMsgPrefix), xmlEnb...)} enbToUpdate := getExpectedNodebForExistingRan(nodebInfo, notificationRequest.Payload) enbToUpdate.SetupFromNetwork = true + newNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", enbToUpdate.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) writerMock.On("UpdateNodebInfo", enbToUpdate).Return(nil) e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{enbNodebRanName}).Return(nil) var errEmpty error @@ -566,7 +582,15 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedEnbSuccess(t * func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedEnbSuccess(t *testing.T) { xmlEnb := readXmlFile(t, EnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t) + + oldNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } + readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var nodebInfo = &entities.NodebInfo{ @@ -587,6 +611,10 @@ func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedEnbSuccess( enbToUpdate2.ConnectionStatus = entities.ConnectionStatus_CONNECTED enbToUpdate2.SetupFromNetwork = true writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &enbToUpdate2, enbNodebRanName+"_CONNECTED").Return(nil) + + newNbIdentity := &entities.NbIdentity{InventoryName: enbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", enbToUpdate.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + enbToUpdate3 := *enbToUpdate enbToUpdate3.ConnectionStatus = entities.ConnectionStatus_CONNECTED enbToUpdate3.SetupFromNetwork = true @@ -604,7 +632,15 @@ func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedEnbSuccess( func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t *testing.T, withFunctions bool, xmlToRead string) { xmlGnb := readXmlFile(t, xmlToRead) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t) + + oldNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } + readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var nodebInfo = &entities.NodebInfo{ @@ -630,6 +666,9 @@ func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t * if withFunctions { writerMock.On("UpdateNodebInfoAndPublish", gnbToUpdate).Return(nil) } + newNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", gnbToUpdate.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil) var errEmpty error rmrMessengerMock.On("SendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty) @@ -642,7 +681,7 @@ func testE2SetupRequestNotificationHandler_HandleExistingConnectedGnbSuccess(t * func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbRoutingManagerError(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var nodebInfo = &entities.NodebInfo{ @@ -652,6 +691,12 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbRoutingMana NodeType: entities.Node_GNB, Configuration: &entities.NodebInfo_Gnb{Gnb: &entities.Gnb{}}, } + oldNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } gnb := nodebInfo.GetGnb() gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}} @@ -667,6 +712,8 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbRoutingMana gnbToUpdate2.SetupFromNetwork = true writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &gnbToUpdate2, gnbNodebRanName+"_DISCONNECTED").Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", gnbToUpdate2.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) var errEmpty error rmrMessengerMock.On("WhSendMsg", mock.Anything, true).Return(&rmrCgo.MBuf{}, errEmpty) handler.Handle(notificationRequest) @@ -678,7 +725,7 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbRoutingMana func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidConnectionStatusError(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, _, e2tInstancesManagerMock, rmrMessengerMock := initMocks(t) + handler, readerMock, writerMock, _, e2tInstancesManagerMock, rmrMessengerMock, _ := initMocks(t) var gnb = &entities.NodebInfo{RanName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN} readerMock.On("GetNodeb", gnbNodebRanName).Return(gnb, nil) readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) @@ -706,7 +753,14 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbWithZeroFun func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess(t *testing.T) { xmlGnb := readXmlFile(t, GnbSetupRequestXmlPath) - handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock := initMocks(t) + handler, readerMock, writerMock, rmrMessengerMock, e2tInstancesManagerMock, routingManagerClientMock, ranListManager := initMocks(t) + oldNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } + readerMock.On("GetGeneralConfiguration").Return(&entities.GeneralConfiguration{EnableRic: true}, nil) e2tInstancesManagerMock.On("GetE2TInstance", e2tInstanceFullAddress).Return(&entities.E2TInstance{}, nil) var nodebInfo = &entities.NodebInfo{ @@ -731,6 +785,10 @@ func TestE2SetupRequestNotificationHandler_HandleExistingDisconnectedGnbSuccess( gnbToUpdate3.SetupFromNetwork = true gnbToUpdate3.AssociatedE2TInstanceAddress = e2tInstanceFullAddress writerMock.On("UpdateNodebInfo", &gnbToUpdate3).Return(nil) + + newNbIdentity := &entities.NbIdentity{InventoryName: gnbNodebRanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", gnbToUpdate3.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + e2tInstancesManagerMock.On("AddRansToInstance", e2tInstanceFullAddress, []string{gnbNodebRanName}).Return(nil) var errEmpty error rmrMessengerMock.On("SendMsg", mock.Anything, mock.Anything).Return(&rmrCgo.MBuf{}, errEmpty) diff --git a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go index 80557e7..ac8ee5d 100644 --- a/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go +++ b/E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go @@ -74,7 +74,7 @@ func initRanLostConnectionTest(t *testing.T) (*logger.Logger, E2TermInitNotifica return logger, handler, readerMock, writerMock, e2tInstancesManagerMock, routingManagerClientMock } -func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, *configuration.Configuration, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) { +func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger.Logger, *configuration.Configuration, E2TermInitNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock, managers.RanListManager) { logger := initLog(t) config := configuration.ParseConfiguration() @@ -94,7 +94,7 @@ func initRanLostConnectionTestWithRealE2tInstanceManager(t *testing.T) (*logger. e2tAssociationManager := managers.NewE2TAssociationManager(logger, rnibDataService, e2tInstancesManager, routingManagerClient, ranConnectStatusChangeManager) ranDisconnectionManager := managers.NewRanDisconnectionManager(logger, configuration.ParseConfiguration(), rnibDataService, e2tAssociationManager, ranConnectStatusChangeManager) handler := NewE2TermInitNotificationHandler(logger, ranDisconnectionManager, e2tInstancesManager, routingManagerClient) - return logger, config, handler, readerMock, writerMock, httpClientMock + return logger, config, handler, readerMock, writerMock, httpClientMock, ranListManager } func TestE2TermInitUnmarshalPayloadFailure(t *testing.T) { @@ -123,7 +123,7 @@ func TestE2TermInitGetE2TInstanceFailure(t *testing.T) { } func TestE2TermInitGetE2TInstanceDbFailure(t *testing.T) { - _, _, handler, readerMock, writerMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, _, handler, readerMock, writerMock, _, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) var e2tInstance *entities.E2TInstance readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewInternalError(fmt.Errorf("internal error"))) notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} @@ -132,7 +132,7 @@ func TestE2TermInitGetE2TInstanceDbFailure(t *testing.T) { } func TestE2TermInitNewE2TInstance(t *testing.T) { - _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) var e2tInstance *entities.E2TInstance readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, common.NewResourceNotFoundError("not found")) @@ -142,7 +142,7 @@ func TestE2TermInitNewE2TInstance(t *testing.T) { url := config.RoutingManager.BaseUrl + clients.AddE2TInstanceApiSuffix httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) - e2tAddresses := []string{} + var e2tAddresses []string readerMock.On("GetE2TAddresses").Return(e2tAddresses, common.NewResourceNotFoundError("")) e2tAddresses = append(e2tAddresses, e2tInstanceAddress) @@ -157,7 +157,7 @@ func TestE2TermInitNewE2TInstance(t *testing.T) { } func TestE2TermInitNewE2TInstance__RoutingManagerError(t *testing.T) { - _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) var e2tInstance *entities.E2TInstance @@ -182,7 +182,14 @@ func TestE2TermInitExistingE2TInstanceNoAssociatedRans(t *testing.T) { } func TestE2TermInitHandlerSuccessOneRan(t *testing.T) { - _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t) + + oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } var rnibErr error var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} @@ -191,6 +198,9 @@ func TestE2TermInitHandlerSuccessOneRan(t *testing.T) { var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr) @@ -217,8 +227,14 @@ func TestE2TermInitHandlerSuccessOneRan(t *testing.T) { } func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) { - _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t) + oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } var rnibErr error var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr) @@ -226,6 +242,9 @@ func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) { var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil) + newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr) @@ -251,15 +270,24 @@ func TestE2TermInitHandlerSuccessOneRan_RoutingManagerError(t *testing.T) { } func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) { - _, _, handler, readerMock, writerMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, _, handler, readerMock, writerMock, _, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t) var rnibErr error + oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } var initialNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUTTING_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr) var argNodeb = &entities.NodebInfo{RanName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} writerMock.On("UpdateNodebInfo", argNodeb).Return(rnibErr) + newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName) e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName) readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil) @@ -271,7 +299,7 @@ func TestE2TermInitHandlerSuccessOneRanShuttingdown(t *testing.T) { } func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) { - _, _, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, _, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) var rnibErr error var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol: entities.E2ApplicationProtocol_X2_SETUP_REQUEST} @@ -295,10 +323,18 @@ func TestE2TermInitHandlerSuccessOneRan_ToBeDeleted(t *testing.T) { func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) { - _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t) + test2 := "test2" + oldNbIdentity1 := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + oldNbIdentity2 := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + oldNbIdentityList := []*entities.NbIdentity{oldNbIdentity1, oldNbIdentity2} + readerMock.On("GetListNodebIds").Return(oldNbIdentityList, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } var rnibErr error - test2 := "test2" //First RAN var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} @@ -307,6 +343,8 @@ func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) { var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr) + newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity1}, []*entities.NbIdentity{newNbIdentity}).Return(nil) var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""} writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr) @@ -318,6 +356,8 @@ func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) { var updatedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: "10.0.2.15"} writerMock.On("UpdateNodebInfo", updatedSecondRan).Return(rnibErr) + newNbIdentity2 := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity2}, []*entities.NbIdentity{newNbIdentity2}).Return(nil) var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""} writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr) @@ -342,8 +382,14 @@ func TestE2TermInitHandlerSuccessTwoRans(t *testing.T) { } func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) { - _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t) + oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } var rnibErr error test2 := "test2" @@ -354,6 +400,8 @@ func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) { var updatedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} writerMock.On("UpdateNodebInfo", updatedFirstRan).Return(rnibErr) + newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedFirstRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) var updatedDisconnectedFirstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""} writerMock.On("UpdateNodebInfo", updatedDisconnectedFirstRan).Return(rnibErr) @@ -381,10 +429,16 @@ func TestE2TermInitHandlerSuccessTwoRansSecondRanShutdown(t *testing.T) { } func TestE2TermInitHandlerSuccessTwoRansFirstNotFoundFailure(t *testing.T) { - _, config, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t) - var rnibErr error test2 := "test2" + oldNbIdentity := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } + var rnibErr error //First RAN var firstRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} @@ -401,6 +455,9 @@ func TestE2TermInitHandlerSuccessTwoRansFirstNotFoundFailure(t *testing.T) { var updatedDisconnectedSecondRan = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: test2, AssociatedE2TInstanceAddress: ""} writerMock.On("UpdateNodebInfo", updatedDisconnectedSecondRan).Return(rnibErr) + newNbIdentity := &entities.NbIdentity{InventoryName: test2, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", updatedSecondRan.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(nil) + e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName) e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName) e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, test2) @@ -421,7 +478,7 @@ func TestE2TermInitHandlerSuccessTwoRansFirstNotFoundFailure(t *testing.T) { } func TestE2TermInitHandlerSuccessTwoRansFirstRnibInternalErrorFailure(t *testing.T) { - _, _, handler, readerMock, writerMock, httpClientMock := initRanLostConnectionTestWithRealE2tInstanceManager(t) + _, _, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) test2 := "test2" @@ -470,6 +527,85 @@ func TestE2TermInitHandlerFailureGetNodebInternalError(t *testing.T) { writerMock.AssertNotCalled(t, "UpdateNodebInfo") } +func TestE2TermInitHandlerOneRanNoRanInNbIdentityMap(t *testing.T) { + _, config, handler, readerMock, writerMock, httpClientMock, _ := initRanLostConnectionTestWithRealE2tInstanceManager(t) + + var rnibErr error + var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} + readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr) + + var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil) + + var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} + readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr) + + var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""} + writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr) + + e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName) + e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName) + readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil) + writerMock.On("SaveE2TInstance", mock.Anything).Return(nil) + + respBody := ioutil.NopCloser(bytes.NewBufferString("")) + url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix + httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) + + notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} + + handler.Handle(notificationRequest) + + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1) + writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1) + httpClientMock.AssertNumberOfCalls(t, "Post", 1) +} + +func TestE2TermInitHandlerOneRanUpdateNbIdentitiesFailure(t *testing.T) { + _, config, handler, readerMock, writerMock, httpClientMock, ranListManager := initRanLostConnectionTestWithRealE2tInstanceManager(t) + + oldNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + readerMock.On("GetListNodebIds").Return([]*entities.NbIdentity{oldNbIdentity}, nil) + err := ranListManager.InitNbIdentityMap() + if err != nil { + t.Errorf("Error cannot init identity") + } + + var rnibErr error + var initialNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} + readerMock.On("GetNodeb", RanName).Return(initialNodeb, rnibErr) + + var argNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} + writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", argNodeb, "test_DISCONNECTED").Return(nil) + + newNbIdentity := &entities.NbIdentity{InventoryName: RanName, ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + writerMock.On("UpdateNbIdentities", argNodeb.GetNodeType(), []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}).Return(common.NewInternalError(fmt.Errorf("internal error"))) + + var disconnectedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: "10.0.2.15"} + readerMock.On("GetNodeb", RanName).Return(disconnectedNodeb, rnibErr) + + var updatedNodeb = &entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, RanName: RanName, AssociatedE2TInstanceAddress: ""} + writerMock.On("UpdateNodebInfo", updatedNodeb).Return(rnibErr) + + e2tInstance := entities.NewE2TInstance(e2tInstanceAddress, podName) + e2tInstance.AssociatedRanList = append(e2tInstance.AssociatedRanList, RanName) + readerMock.On("GetE2TInstance", e2tInstanceAddress).Return(e2tInstance, nil).Return(e2tInstance, nil) + writerMock.On("SaveE2TInstance", mock.Anything).Return(nil) + + respBody := ioutil.NopCloser(bytes.NewBufferString("")) + url := config.RoutingManager.BaseUrl + clients.DissociateRanE2TInstanceApiSuffix + httpClientMock.On("Post", url, mock.Anything, mock.Anything).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil) + + notificationRequest := &models.NotificationRequest{RanName: RanName, Payload: []byte(e2tInitPayload)} + + handler.Handle(notificationRequest) + + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfo", 1) + writerMock.AssertNumberOfCalls(t, "UpdateNodebInfoOnConnectionStatusInversion", 1) + writerMock.AssertNumberOfCalls(t, "SaveE2TInstance", 1) + httpClientMock.AssertNumberOfCalls(t, "Post", 1) +} // TODO: extract to test_utils func initRmrSender(rmrMessengerMock *mocks.RmrMessengerMock, log *logger.Logger) *rmrsender.RmrSender { rmrMessenger := rmrCgo.RmrMessenger(rmrMessengerMock) diff --git a/E2Manager/managers/ran_connect_status_change_manager.go b/E2Manager/managers/ran_connect_status_change_manager.go index 138f089..1e3b3aa 100644 --- a/E2Manager/managers/ran_connect_status_change_manager.go +++ b/E2Manager/managers/ran_connect_status_change_manager.go @@ -76,8 +76,9 @@ func (m *RanConnectStatusChangeManager) ChangeStatus(nodebInfo *entities.NodebIn } // in any case, update RanListManager - m.logger.Infof("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s, updating RanListManager... status: %s", nodebInfo.RanName, nodebInfo.GetConnectionStatus()) - err := m.ranListManager.UpdateRanState(nodebInfo) + connectionStatus := nodebInfo.GetConnectionStatus() + m.logger.Infof("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s, updating RanListManager... status: %s", nodebInfo.RanName, connectionStatus) + err := m.ranListManager.UpdateNbIdentityConnectionStatus(nodebInfo.GetNodeType(), nodebInfo.RanName, connectionStatus) if err != nil { m.logger.Errorf("#RanConnectStatusChangeManager.ChangeStatus - RAN name: %s - Failed updating RAN's connection status by RanListManager. Error: %v", nodebInfo.RanName, err) // log and proceed... diff --git a/E2Manager/managers/ran_connect_status_change_manager_test.go b/E2Manager/managers/ran_connect_status_change_manager_test.go index a35e71e..576ce17 100644 --- a/E2Manager/managers/ran_connect_status_change_manager_test.go +++ b/E2Manager/managers/ran_connect_status_change_manager_test.go @@ -60,7 +60,7 @@ func TestChangeStatusSuccessNewRan(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil) - ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil) + ranListManagerMock.On("UpdateNbIdentityConnectionStatus", updatedNodebInfo.GetNodeType(), RanName, updatedNodebInfo.GetConnectionStatus()).Return(nil) ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(nil) _, err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED) assert.Nil(t, err) @@ -76,7 +76,7 @@ func TestChangeStatusSuccessEventNone1(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(nil) - ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil) + ranListManagerMock.On("UpdateNbIdentityConnectionStatus", updatedNodebInfo.GetNodeType(), RanName, updatedNodebInfo.GetConnectionStatus()).Return(nil) _, err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_SHUT_DOWN) assert.Nil(t, err) writerMock.AssertExpectations(t) @@ -91,7 +91,7 @@ func TestChangeStatusSuccessEventNone2(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(nil) - ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil) + ranListManagerMock.On("UpdateNbIdentityConnectionStatus", updatedNodebInfo.GetNodeType(), RanName, updatedNodebInfo.GetConnectionStatus()).Return(nil) _, err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_SHUT_DOWN) assert.Nil(t, err) writerMock.AssertExpectations(t) @@ -106,7 +106,7 @@ func TestChangeStatusSuccessEventConnected(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil) - ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil) + ranListManagerMock.On("UpdateNbIdentityConnectionStatus", updatedNodebInfo.GetNodeType(), RanName, updatedNodebInfo.GetConnectionStatus()).Return(nil) ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(nil) _, err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED) assert.Nil(t, err) @@ -122,7 +122,7 @@ func TestChangeStatusSuccessEventDisconnected(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+DISCONNECTED_RAW_EVENT).Return(nil) - ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil) + ranListManagerMock.On("UpdateNbIdentityConnectionStatus", updatedNodebInfo.GetNodeType(), RanName, updatedNodebInfo.GetConnectionStatus()).Return(nil) ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(nil) _, err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_DISCONNECTED) assert.Nil(t, err) @@ -166,7 +166,7 @@ func TestChangeStatusRanListManagerError(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_SHUT_DOWN writerMock.On("UpdateNodebInfo", &updatedNodebInfo).Return(nil) - ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(common.NewInternalError(errors.New("Error"))) + ranListManagerMock.On("UpdateNbIdentityConnectionStatus", updatedNodebInfo.GetNodeType(), ranName, updatedNodebInfo.GetConnectionStatus()).Return(common.NewInternalError(errors.New("Error"))) _, err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_SHUT_DOWN) assert.Nil(t, err) writerMock.AssertExpectations(t) @@ -181,7 +181,7 @@ func TestChangeStatusRanAlarmServiceErrorEventConnected(t *testing.T) { updatedNodebInfo := *origNodebInfo updatedNodebInfo.ConnectionStatus = entities.ConnectionStatus_CONNECTED writerMock.On("UpdateNodebInfoOnConnectionStatusInversion", &updatedNodebInfo, RanName+"_"+CONNECTED_RAW_EVENT).Return(nil) - ranListManagerMock.On("UpdateRanState", &updatedNodebInfo).Return(nil) + ranListManagerMock.On("UpdateNbIdentityConnectionStatus", updatedNodebInfo.GetNodeType(), RanName, updatedNodebInfo.GetConnectionStatus()).Return(nil) ranAlarmServiceMock.On("SetConnectivityChangeAlarm", &updatedNodebInfo).Return(common.NewInternalError(errors.New("Error"))) _, err := ranConnectStatusChangeManager.ChangeStatus(origNodebInfo, entities.ConnectionStatus_CONNECTED) assert.Nil(t, err) diff --git a/E2Manager/managers/ran_list_manager.go b/E2Manager/managers/ran_list_manager.go index 030180f..a0c9b07 100755 --- a/E2Manager/managers/ran_list_manager.go +++ b/E2Manager/managers/ran_list_manager.go @@ -20,6 +20,7 @@ package managers import ( + "e2mgr/e2managererrors" "e2mgr/logger" "e2mgr/services" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" @@ -39,7 +40,6 @@ type RanListManager interface { UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error RemoveNbIdentity(nodeType entities.Node_Type, ranName string) error GetNbIdentityList() []*entities.NbIdentity - UpdateRanState(nodebInfo *entities.NodebInfo) error // TODO: replace with UpdateNbIdentityConnectionStatus } func NewRanListManager(logger *logger.Logger, rnibDataService services.RNibDataService) RanListManager { @@ -50,12 +50,6 @@ func NewRanListManager(logger *logger.Logger, rnibDataService services.RNibDataS } } -// TODO: replace with UpdateNbIdentityConnectionStatus -func (m *ranListManagerInstance) UpdateRanState(nodebInfo *entities.NodebInfo) error { - m.logger.Infof("#ranListManagerInstance.UpdateRanState - RAN name: %s - Updating state...", nodebInfo.RanName) - return nil -} - func (m *ranListManagerInstance) InitNbIdentityMap() error { nbIds, err := m.rnibDataService.GetListNodebIds() @@ -92,7 +86,30 @@ func (m *ranListManagerInstance) AddNbIdentity(nodeType entities.Node_Type, nbId } func (m *ranListManagerInstance) UpdateNbIdentityConnectionStatus(nodeType entities.Node_Type, ranName string, connectionStatus entities.ConnectionStatus) error { - //TODO: implement + m.mux.Lock() + defer m.mux.Unlock() + + m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - updating nodeb identity connection status", ranName) + + oldNbIdentity, ok := m.nbIdentityMap[ranName] + if !ok { + m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - nodeb identity not found in nbIdentityMap", ranName) + return e2managererrors.NewInternalError() + } + + newNbIdentity := &entities.NbIdentity{ + GlobalNbId: oldNbIdentity.GlobalNbId, + InventoryName: ranName, + ConnectionStatus: connectionStatus, + } + m.nbIdentityMap[ranName] = newNbIdentity + + err := m.rnibDataService.UpdateNbIdentity(nodeType, oldNbIdentity, newNbIdentity) + if err != nil { + m.logger.Errorf("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Failed updating nodeb identity in DB. error: %s", ranName, err) + return err + } + m.logger.Infof("#ranListManagerInstance.UpdateNbIdentityConnectionStatus - RAN name: %s - Successfully updated nodeb identity", ranName) return nil } diff --git a/E2Manager/mocks/rnibWriterMock.go b/E2Manager/mocks/rnibWriterMock.go index 02237a4..b380d3a 100644 --- a/E2Manager/mocks/rnibWriterMock.go +++ b/E2Manager/mocks/rnibWriterMock.go @@ -147,3 +147,8 @@ func (rnibWriterMock *RnibWriterMock) AddEnb(nodebInfo *entities.NodebInfo) erro args := rnibWriterMock.Called(nodebInfo) return args.Error(0) } + +func (rnibWriterMock *RnibWriterMock) UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error { + args := rnibWriterMock.Called(nodeType, oldNbIdentities, newNbIdentities) + return args.Error(0) +} diff --git a/E2Manager/rNibWriter/rNibWriter.go b/E2Manager/rNibWriter/rNibWriter.go index 670ee6b..bbf485b 100644 --- a/E2Manager/rNibWriter/rNibWriter.go +++ b/E2Manager/rNibWriter/rNibWriter.go @@ -61,8 +61,8 @@ type RNibWriter interface { AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error RemoveNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error AddEnb(nodebInfo *entities.NodebInfo) error + UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error } - /* GetRNibWriter returns reference to RNibWriter */ @@ -217,6 +217,31 @@ func (w *rNibWriterInstance) AddEnb(nodebInfo *entities.NodebInfo) error { return nil } +func (w *rNibWriterInstance) UpdateNbIdentities(nodeType entities.Node_Type, oldNbIdentities []*entities.NbIdentity, newNbIdentities []*entities.NbIdentity) error { + + nbIdIdentitiesToRemove, err := w.buildNbIdentitiesMembers(oldNbIdentities) + if err != nil { + return err + } + + err = w.sdl.RemoveMember(nodeType.String(), nbIdIdentitiesToRemove[:]...) + if err != nil { + return err + } + + nbIdIdentitiesToAdd, err := w.buildNbIdentitiesMembers(newNbIdentities) + if err != nil { + return err + } + + err = w.sdl.AddMember(nodeType.String(), nbIdIdentitiesToAdd[:]...) + if err != nil { + return err + } + + return nil +} + func (w *rNibWriterInstance) UpdateGnbCells(nodebInfo *entities.NodebInfo, servedNrCells []*entities.ServedNRCell) error { pairs, err := buildUpdateNodebInfoPairs(nodebInfo) @@ -546,6 +571,20 @@ func (w *rNibWriterInstance) UpdateEnb(nodebInfo *entities.NodebInfo, servedCell return nil } +func (w *rNibWriterInstance) buildNbIdentitiesMembers(nbIdentities []*entities.NbIdentity) ([]interface{}, error) { + + var nbIdIdentitiesMembers []interface{} + for _, nbIdentity := range nbIdentities { + + nbIdData, err := proto.Marshal(nbIdentity) + if err != nil { + return nil, common.NewInternalError(err) + } + nbIdIdentitiesMembers = append(nbIdIdentitiesMembers, nbIdData) + } + + return nbIdIdentitiesMembers, nil +} /* Close the writer */ diff --git a/E2Manager/rNibWriter/rNibWriter_test.go b/E2Manager/rNibWriter/rNibWriter_test.go index f8a8201..1eef51b 100644 --- a/E2Manager/rNibWriter/rNibWriter_test.go +++ b/E2Manager/rNibWriter/rNibWriter_test.go @@ -1251,72 +1251,130 @@ func TestAddEnbInventoryNameValidationFailure(t *testing.T) { assert.Equal(t, "#utils.ValidateAndBuildNodeBNameKey - an empty inventory name received", rNibErr.Error()) } -//Integration tests -// -//func TestSaveEnbGnbInteg(t *testing.T){ -// for i := 0; i<10; i++{ -// Init("e2Manager", 1) -// w := GetRNibWriter() -// nb := entities.NodebInfo{} -// nb.NodeType = entities.Node_ENB -// nb.ConnectionStatus = entities.ConnectionStatus_CONNECTED -// nb.Ip = "localhost" -// nb.Port = uint32(5656 + i) -// enb := entities.Enb{} -// cell1 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",111 + i), Pci:uint32(11 + i)} -// cell2 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",222 + i), Pci:uint32(22 + i)} -// cell3 := &entities.ServedCellInfo{CellId:fmt.Sprintf("%02x",333 + i), Pci:uint32(33 + i)} -// enb.ServedCells = []*entities.ServedCellInfo{cell1, cell2, cell3} -// nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb} -// plmnId := 0x02f828 -// nbId := 0x4a952a0a -// nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameEnb%d" ,i), GlobalNbId:&entities.GlobalNbId{RicId:fmt.Sprintf("%02x", plmnId + i), NbId:fmt.Sprintf("%02x", nbId + i)}} -// err := w.SaveNodeb(nbIdentity, &nb) -// if err != nil{ -// t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err) -// } -// -// nb1 := entities.NodebInfo{} -// nb1.NodeType = entities.Node_GNB -// nb1.ConnectionStatus = entities.ConnectionStatus_CONNECTED -// nb1.Ip = "localhost" -// nb1.Port = uint32(6565 + i) -// gnb := entities.Gnb{} -// gCell1 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",1111 + i), NrPci:uint32(1 + i)}} -// gCell2 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",2222 + i), NrPci:uint32(2 + i)}} -// gCell3 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",3333 + i), NrPci:uint32(3 + i)}} -// gnb.ServedNrCells = []*entities.ServedNRCell{gCell1, gCell2, gCell3,} -// nb1.Configuration = &entities.NodebInfo_Gnb{Gnb:&gnb} -// nbIdentity = &entities.NbIdentity{InventoryName: fmt.Sprintf("nameGnb%d" ,i), GlobalNbId:&entities.GlobalNbId{RicId:fmt.Sprintf("%02x", plmnId - i), NbId:fmt.Sprintf("%02x", nbId - i)}} -// err = w.SaveNodeb(nbIdentity, &nb1) -// if err != nil{ -// t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err) -// } -// } -//} -// -//func TestSaveNbRanNamesInteg(t *testing.T){ -// for i := 0; i<10; i++{ -// Init("e2Manager", 1) -// w := GetRNibWriter() -// nb := entities.NodebInfo{} -// nb.ConnectionStatus = entities.ConnectionStatus_CONNECTING -// nb.Ip = "localhost" -// nb.Port = uint32(5656 + i) -// nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameOnly%d" ,i)} -// err := w.SaveNodeb(nbIdentity, &nb) -// if err != nil{ -// t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err) -// } -// } -//} -// -//func TestSaveRanLoadInformationInteg(t *testing.T){ -// Init("e2Manager", 1) -// w := GetRNibWriter() -// ranLoadInformation := generateRanLoadInformation() -// err := w.SaveRanLoadInformation("ran_integ", ranLoadInformation) -// if err != nil{ -// t.Errorf("#rNibWriter_test.TestSaveRanLoadInformationInteg - Failed to save RanLoadInformation entity. Error: %v", err) -// } -//} +func TestUpdateNbIdentityOneMemberSuccess(t *testing.T) { + w, sdlInstanceMock := initSdlInstanceMock(namespace) + + proto, nbIdentity := createNbIdentityProto(t, "ran1", "plmnId1", "nbId1", entities.ConnectionStatus_DISCONNECTED) + val := []interface{}{proto} + + sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), val).Return(nil) + + protoAdd, nbIdentityAdd := createNbIdentityProto(t, "ran1_add", "plmnId1_add", "nbId1_add", entities.ConnectionStatus_CONNECTED) + sdlInstanceMock.On("AddMember", entities.Node_ENB.String(), []interface{}{protoAdd}).Return(nil) + + newNbIdIdentities := []*entities.NbIdentity{nbIdentityAdd} + oldNbIdIdentities := []*entities.NbIdentity{nbIdentity} + + rNibErr := w.UpdateNbIdentities(entities.Node_ENB, oldNbIdIdentities, newNbIdIdentities) + assert.Nil(t, rNibErr) + sdlInstanceMock.AssertExpectations(t) +} + +func TestUpdateNbIdentitySuccess(t *testing.T) { + w, sdlInstanceMock := initSdlInstanceMock(namespace) + + var nbIdIdentitiesProtoToRemove []interface{} + protoRan1, _ := createNbIdentityProto(t, "ran1", "plmnId1", "nbId1", entities.ConnectionStatus_DISCONNECTED) + protoRan2, _ := createNbIdentityProto(t, "ran2", "plmnId2", "nbId2", entities.ConnectionStatus_DISCONNECTED) + nbIdIdentitiesProtoToRemove = append(nbIdIdentitiesProtoToRemove, protoRan1) + nbIdIdentitiesProtoToRemove = append(nbIdIdentitiesProtoToRemove, protoRan2) + sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), nbIdIdentitiesProtoToRemove).Return(nil) + + var nbIdIdentitiesProtoToAdd []interface{} + protoRan1Add, _ := createNbIdentityProto(t, "ran1_add", "plmnId1_add", "nbId1_add", entities.ConnectionStatus_CONNECTED) + protoRan2Add, _ := createNbIdentityProto(t, "ran2_add", "plmnId2_add", "nbId2_add", entities.ConnectionStatus_CONNECTED) + nbIdIdentitiesProtoToAdd = append(nbIdIdentitiesProtoToAdd, protoRan1Add) + nbIdIdentitiesProtoToAdd = append(nbIdIdentitiesProtoToAdd, protoRan2Add) + sdlInstanceMock.On("AddMember", entities.Node_ENB.String(), nbIdIdentitiesProtoToAdd).Return(nil) + + var newNbIdIdentities []*entities.NbIdentity + firstNewNbIdIdentity := &entities.NbIdentity{InventoryName: "ran1_add", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1_add", NbId: "nbId1_add"}} + secondNewNbIdIdentity := &entities.NbIdentity{InventoryName: "ran2_add", ConnectionStatus: entities.ConnectionStatus_CONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2_add", NbId: "nbId2_add"}} + newNbIdIdentities = append(newNbIdIdentities, firstNewNbIdIdentity) + newNbIdIdentities = append(newNbIdIdentities, secondNewNbIdIdentity) + + var oldNbIdIdentities []*entities.NbIdentity + firstOldNbIdIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + secondOldNbIdIdentity := &entities.NbIdentity{InventoryName: "ran2", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + oldNbIdIdentities = append(oldNbIdIdentities, firstOldNbIdIdentity) + oldNbIdIdentities = append(oldNbIdIdentities, secondOldNbIdIdentity) + + rNibErr := w.UpdateNbIdentities(entities.Node_ENB, oldNbIdIdentities, newNbIdIdentities) + assert.Nil(t, rNibErr) + sdlInstanceMock.AssertExpectations(t) +} + +func TestUpdateNbIdentityRemoveFailure(t *testing.T) { + w, sdlInstanceMock := initSdlInstanceMock(namespace) + + var nbIdIdentitiesProtoToRemove []interface{} + protoRan1, _ := createNbIdentityProto(t, "ran1", "plmnId1", "nbId1", entities.ConnectionStatus_DISCONNECTED) + nbIdIdentitiesProtoToRemove = append(nbIdIdentitiesProtoToRemove, protoRan1) + protoRan2, _ := createNbIdentityProto(t, "ran2", "plmnId2", "nbId2", entities.ConnectionStatus_DISCONNECTED) + nbIdIdentitiesProtoToRemove = append(nbIdIdentitiesProtoToRemove, protoRan2) + + sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), nbIdIdentitiesProtoToRemove).Return(fmt.Errorf("for test")) + + var oldNbIdIdentities []*entities.NbIdentity + firstOldNbIdIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + secondOldNbIdIdentity := &entities.NbIdentity{InventoryName: "ran2", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId2", NbId: "nbId2"}} + oldNbIdIdentities = append(oldNbIdIdentities, firstOldNbIdIdentity) + oldNbIdIdentities = append(oldNbIdIdentities, secondOldNbIdIdentity) + + var newNbIdIdentities []*entities.NbIdentity + + rNibErr := w.UpdateNbIdentities(entities.Node_ENB, oldNbIdIdentities, newNbIdIdentities) + assert.NotNil(t, rNibErr) + sdlInstanceMock.AssertExpectations(t) +} + +func TestUpdateNbIdentityAddFailure(t *testing.T) { + w, sdlInstanceMock := initSdlInstanceMock(namespace) + nbIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + nbIdData, err := proto.Marshal(nbIdentity) + if err != nil { + t.Errorf("#TestRemoveNbIdentitySuccess - failed to Marshal NbIdentity") + } + sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), []interface{}{nbIdData}).Return(fmt.Errorf("for test")) + + rNibErr := w.RemoveNbIdentity(entities.Node_ENB, nbIdentity) + assert.NotNil(t, rNibErr) + sdlInstanceMock.AssertExpectations(t) +} + +func TestUpdateNbIdentityNoNbIdentityToRemove(t *testing.T) { + w, sdlInstanceMock := initSdlInstanceMock(namespace) + nbIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + nbIdData, err := proto.Marshal(nbIdentity) + if err != nil { + t.Errorf("#TestRemoveNbIdentitySuccess - failed to Marshal NbIdentity") + } + sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), []interface{}{nbIdData}).Return(fmt.Errorf("for test")) + + rNibErr := w.RemoveNbIdentity(entities.Node_ENB, nbIdentity) + assert.NotNil(t, rNibErr) + sdlInstanceMock.AssertExpectations(t) +} + +func TestUpdateNbIdentityNoNbIdentityToAdd(t *testing.T) { + w, sdlInstanceMock := initSdlInstanceMock(namespace) + nbIdentity := &entities.NbIdentity{InventoryName: "ran1", ConnectionStatus: entities.ConnectionStatus_DISCONNECTED, GlobalNbId: &entities.GlobalNbId{PlmnId: "plmnId1", NbId: "nbId1"}} + nbIdData, err := proto.Marshal(nbIdentity) + if err != nil { + t.Errorf("#TestRemoveNbIdentitySuccess - failed to Marshal NbIdentity") + } + sdlInstanceMock.On("RemoveMember", entities.Node_ENB.String(), []interface{}{nbIdData}).Return(fmt.Errorf("for test")) + + rNibErr := w.RemoveNbIdentity(entities.Node_ENB, nbIdentity) + assert.NotNil(t, rNibErr) + sdlInstanceMock.AssertExpectations(t) +} + +func createNbIdentityProto(t *testing.T, ranName string, plmnId string, nbId string, connectionStatus entities.ConnectionStatus) ([]byte, *entities.NbIdentity){ + nbIdentity := &entities.NbIdentity{InventoryName: ranName, ConnectionStatus: connectionStatus, GlobalNbId: &entities.GlobalNbId{PlmnId: plmnId, NbId: nbId}} + nbIdData, err := proto.Marshal(nbIdentity) + if err != nil { + t.Errorf("#createNbIdentityProto - failed to Marshal NbIdentity") + } + return nbIdData, nbIdentity +} \ No newline at end of file diff --git a/E2Manager/services/rnib_data_service.go b/E2Manager/services/rnib_data_service.go index e2b5dc4..e489199 100644 --- a/E2Manager/services/rnib_data_service.go +++ b/E2Manager/services/rnib_data_service.go @@ -59,6 +59,7 @@ type RNibDataService interface { AddNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error RemoveNbIdentity(nodeType entities.Node_Type, nbIdentity *entities.NbIdentity) error AddEnb(nodebInfo *entities.NodebInfo) error + UpdateNbIdentity(nodeType entities.Node_Type, oldNbIdentities *entities.NbIdentity, newNbIdentities *entities.NbIdentity) error } type rNibDataService struct { @@ -392,6 +393,15 @@ func (w *rNibDataService) AddEnb(nodebInfo *entities.NodebInfo) error { return err } +func (w *rNibDataService) UpdateNbIdentity(nodeType entities.Node_Type, oldNbIdentity *entities.NbIdentity, newNbIdentity *entities.NbIdentity) error { + err := w.retry("UpdateNbIdentities", func() (err error) { + err = w.rnibWriter.UpdateNbIdentities(nodeType, []*entities.NbIdentity{oldNbIdentity}, []*entities.NbIdentity{newNbIdentity}) + return + }) + + return err +} + func (w *rNibDataService) retry(rnibFunc string, f func() error) (err error) { attempts := w.maxAttempts -- 2.16.6