[RIC-430] - Update Connection Status on RAN List 12/4512/1
authorIrina <ib565x@intl.att.com>
Wed, 5 Aug 2020 15:43:45 +0000 (15:43 +0000)
committerIrina <ib565x@intl.att.com>
Wed, 5 Aug 2020 15:43:54 +0000 (15:43 +0000)
Change-Id: I6df4bad90b1639785465ce4cce78fdcb66c24bfa
Signed-off-by: Irina <ib565x@intl.att.com>
E2Manager/container-tag.yaml
E2Manager/handlers/httpmsghandlers/delete_all_request_handler_test.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go
E2Manager/handlers/rmrmsghandlers/e2_term_init_notification_handler_test.go
E2Manager/managers/ran_connect_status_change_manager.go
E2Manager/managers/ran_connect_status_change_manager_test.go
E2Manager/managers/ran_list_manager.go
E2Manager/mocks/rnibWriterMock.go
E2Manager/rNibWriter/rNibWriter.go
E2Manager/rNibWriter/rNibWriter_test.go
E2Manager/services/rnib_data_service.go

index 007b8d0..a6108c8 100644 (file)
@@ -1,4 +1,4 @@
 # The Jenkins job requires a tag to build the Docker image.
 # Global-JJB script assumes this file is in the repo root.
 ---
-tag: 5.4.4
+tag: 5.4.5
index 86c5bb9..3853dc5 100644 (file)
@@ -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)
index 5f2e7f6..0d58a3b 100644 (file)
@@ -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)
index 80557e7..ac8ee5d 100644 (file)
@@ -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)
index 138f089..1e3b3aa 100644 (file)
@@ -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...
index a35e71e..576ce17 100644 (file)
@@ -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)
index 030180f..a0c9b07 100755 (executable)
@@ -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
 }
 
index 02237a4..b380d3a 100644 (file)
@@ -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)
+}
index 670ee6b..bbf485b 100644 (file)
@@ -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
 */
index f8a8201..1eef51b 100644 (file)
@@ -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
index e2b5dc4..e489199 100644 (file)
@@ -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