RIC-208 - KA Decision: ask K8S to restart E2T instance - comment code of kubernetes
[ric-plt/e2mgr.git] / E2Manager / managers / e2t_shutdown_manager_test.go
index 570cf62..9e3fcc3 100644 (file)
@@ -35,6 +35,8 @@ import (
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/mock"
        "io/ioutil"
+       //"k8s.io/apimachinery/pkg/runtime"
+       //"k8s.io/client-go/kubernetes/fake"
        "net/http"
        "testing"
        "time"
@@ -42,7 +44,7 @@ import (
 
 const E2TAddress3 = "10.10.2.17:9800"
 
-func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock) {
+func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.HttpClientMock, *KubernetesManager) {
        log := initLog(t)
        config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, E2TInstanceDeletionTimeoutMs: 15000}
 
@@ -54,22 +56,26 @@ func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibR
        httpClientMock := &mocks.HttpClientMock{}
        rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock)
        associationManager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient)
+       //kubernetesManager := initKubernetesManagerTest(t)
 
-       shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager)
+       /*shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager, kubernetesManager)
 
-       return shutdownManager, readerMock, writerMock, httpClientMock
+       return shutdownManager, readerMock, writerMock, httpClientMock, kubernetesManager*/
+       shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager, nil)
+
+       return shutdownManager, readerMock, writerMock, httpClientMock, nil
 }
 
 func TestShutdownSuccess1OutOf3Instances(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_ := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test5"}
-       e2tInstance2 := entities.NewE2TInstance(E2TAddress2)
+       e2tInstance2 := entities.NewE2TInstance(E2TAddress2, PodName)
        e2tInstance2.State = entities.Active
        e2tInstance2.AssociatedRanList = []string{"test3"}
-       e2tInstance3 := entities.NewE2TInstance(E2TAddress3)
+       e2tInstance3 := entities.NewE2TInstance(E2TAddress3, PodName)
        e2tInstance3.State = entities.Active
        e2tInstance3.AssociatedRanList = []string{"test4"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -115,9 +121,9 @@ func TestShutdownSuccess1OutOf3Instances(t *testing.T) {
 }
 
 func TestShutdownSuccess1InstanceWithoutRans(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -141,9 +147,9 @@ func TestShutdownSuccess1InstanceWithoutRans(t *testing.T) {
 }
 
 func TestShutdownSuccess1Instance2Rans(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -178,13 +184,13 @@ func TestShutdownSuccess1Instance2Rans(t *testing.T) {
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
        httpClientMock.AssertExpectations(t)
-       
+
 }
 
 func TestShutdownE2tInstanceAlreadyBeingDeleted(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.ToBeDeleted
        e2tInstance1.AssociatedRanList = []string{"test1"}
        e2tInstance1.DeletionTimestamp = time.Now().UnixNano()
@@ -195,13 +201,13 @@ func TestShutdownE2tInstanceAlreadyBeingDeleted(t *testing.T) {
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
        httpClientMock.AssertExpectations(t)
-       
+
 }
 
 func TestShutdownFailureMarkInstanceAsToBeDeleted(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test5"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(e2managererrors.NewRnibDbError())
@@ -212,19 +218,19 @@ func TestShutdownFailureMarkInstanceAsToBeDeleted(t *testing.T) {
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
        httpClientMock.AssertExpectations(t)
-       
+
 }
 
 func TestShutdownFailureRoutingManagerError(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test5"}
-       e2tInstance2 := entities.NewE2TInstance(E2TAddress2)
+       e2tInstance2 := entities.NewE2TInstance(E2TAddress2, PodName)
        e2tInstance2.State = entities.Active
        e2tInstance2.AssociatedRanList = []string{"test3"}
-       e2tInstance3 := entities.NewE2TInstance(E2TAddress3)
+       e2tInstance3 := entities.NewE2TInstance(E2TAddress3, PodName)
        e2tInstance3.State = entities.Active
        e2tInstance3.AssociatedRanList = []string{"test4"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -267,13 +273,13 @@ func TestShutdownFailureRoutingManagerError(t *testing.T) {
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
        httpClientMock.AssertExpectations(t)
-       
+
 }
 
 func TestShutdownFailureInClearNodebsAssociation(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -295,9 +301,9 @@ func TestShutdownFailureInClearNodebsAssociation(t *testing.T) {
 }
 
 func TestShutdownResourceNotFoundErrorInGetNodeb(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -321,9 +327,9 @@ func TestShutdownResourceNotFoundErrorInGetNodeb(t *testing.T) {
 }
 
 func TestShutdownResourceGeneralErrorInGetNodeb(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -358,15 +364,15 @@ func TestShutdownResourceGeneralErrorInGetNodeb(t *testing.T) {
 }
 
 func TestShutdownFailureInRemoveE2TInstance(t *testing.T) {
-       shutdownManager, readerMock, writerMock, httpClientMock := initE2TShutdownManagerTest(t)
+       shutdownManager, readerMock, writerMock, httpClientMock,_  := initE2TShutdownManagerTest(t)
 
-       e2tInstance1 := entities.NewE2TInstance(E2TAddress)
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
        e2tInstance1.State = entities.Active
        e2tInstance1.AssociatedRanList = []string{"test1", "test2", "test5"}
-       e2tInstance2 := entities.NewE2TInstance(E2TAddress2)
+       e2tInstance2 := entities.NewE2TInstance(E2TAddress2, PodName)
        e2tInstance2.State = entities.Active
        e2tInstance2.AssociatedRanList = []string{"test3"}
-       e2tInstance3 := entities.NewE2TInstance(E2TAddress3)
+       e2tInstance3 := entities.NewE2TInstance(E2TAddress3, PodName)
        e2tInstance3.State = entities.Active
        e2tInstance3.AssociatedRanList = []string{"test4"}
        writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
@@ -405,4 +411,100 @@ func TestShutdownFailureInRemoveE2TInstance(t *testing.T) {
        readerMock.AssertExpectations(t)
        writerMock.AssertExpectations(t)
        httpClientMock.AssertExpectations(t)
-}
\ No newline at end of file
+}
+/*
+func TestShutdownSuccess2Instance2Rans(t *testing.T) {
+       shutdownManager, readerMock, writerMock, httpClientMock,kubernetesManager  := initE2TShutdownManagerTest(t)
+
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
+       e2tInstance1.State = entities.Active
+       e2tInstance1.AssociatedRanList = []string{"test2"}
+       writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
+
+       nodeb1 := &entities.NodebInfo{RanName:"test1", AssociatedE2TInstanceAddress:E2TAddress2, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
+       nodeb2 := &entities.NodebInfo{RanName:"test2", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
+       readerMock.On("GetNodeb", "test2").Return(nodeb2, nil)
+
+       data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test2"}, nil)
+       marshaled, _ := json.Marshal(data)
+       body := bytes.NewBuffer(marshaled)
+       respBody := ioutil.NopCloser(bytes.NewBufferString(""))
+       httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
+
+       writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil)
+       readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
+       writerMock.On("SaveE2TAddresses", []string{}).Return(nil)
+
+       nodeb1new := *nodeb1
+       nodeb1new.AssociatedE2TInstanceAddress = ""
+       nodeb1new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       nodeb2new := *nodeb2
+       nodeb2new.AssociatedE2TInstanceAddress = ""
+       nodeb2new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       writerMock.On("UpdateNodebInfo", &nodeb2new).Return(nil)
+
+       test := TestStruct{
+               description: "namespace, 2 pods in Oran",
+               namespace:   "oran",
+               objs:        []runtime.Object{pod("oran", PodName), pod("oran", "e2t_2"), pod("some-namespace", "POD_Test_1")},
+       }
+
+       t.Run(test.description, func(t *testing.T) {
+               kubernetesManager.ClientSet = fake.NewSimpleClientset(test.objs...)
+
+               err := shutdownManager.Shutdown(e2tInstance1)
+
+               assert.Nil(t, err)
+               readerMock.AssertExpectations(t)
+               writerMock.AssertExpectations(t)
+               httpClientMock.AssertExpectations(t)
+       })
+}
+
+func TestShutdownSuccess2Instance2RansNoPod(t *testing.T) {
+       shutdownManager, readerMock, writerMock, httpClientMock,kubernetesManager  := initE2TShutdownManagerTest(t)
+
+       e2tInstance1 := entities.NewE2TInstance(E2TAddress, PodName)
+       e2tInstance1.State = entities.Active
+       e2tInstance1.AssociatedRanList = []string{"test2"}
+       writerMock.On("SaveE2TInstance", mock.MatchedBy(func(e2tInstance *entities.E2TInstance) bool { return e2tInstance.Address == E2TAddress && e2tInstance.State == entities.ToBeDeleted })).Return(nil)
+
+       nodeb1 := &entities.NodebInfo{RanName:"test1", AssociatedE2TInstanceAddress:E2TAddress2, ConnectionStatus:entities.ConnectionStatus_CONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
+       nodeb2 := &entities.NodebInfo{RanName:"test2", AssociatedE2TInstanceAddress:E2TAddress, ConnectionStatus:entities.ConnectionStatus_DISCONNECTED, E2ApplicationProtocol:entities.E2ApplicationProtocol_X2_SETUP_REQUEST}
+       readerMock.On("GetNodeb", "test2").Return(nodeb2, nil)
+
+       data := models.NewRoutingManagerDeleteRequestModel(E2TAddress, []string{"test2"}, nil)
+       marshaled, _ := json.Marshal(data)
+       body := bytes.NewBuffer(marshaled)
+       respBody := ioutil.NopCloser(bytes.NewBufferString(""))
+       httpClientMock.On("Delete", "e2t", "application/json", body).Return(&http.Response{StatusCode: http.StatusCreated, Body: respBody}, nil)
+
+       writerMock.On("RemoveE2TInstance", E2TAddress).Return(nil)
+       readerMock.On("GetE2TAddresses").Return([]string{E2TAddress}, nil)
+       writerMock.On("SaveE2TAddresses", []string{}).Return(nil)
+
+       nodeb1new := *nodeb1
+       nodeb1new.AssociatedE2TInstanceAddress = ""
+       nodeb1new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       nodeb2new := *nodeb2
+       nodeb2new.AssociatedE2TInstanceAddress = ""
+       nodeb2new.ConnectionStatus = entities.ConnectionStatus_DISCONNECTED
+       writerMock.On("UpdateNodebInfo", &nodeb2new).Return(nil)
+
+       test := TestStruct{
+               description: "namespace, 2 pods in Oran",
+               namespace:   "oran",
+               objs:        []runtime.Object{pod("oran", "e2t_2"), pod("some-namespace", "POD_Test_1")},
+       }
+
+       t.Run(test.description, func(t *testing.T) {
+               kubernetesManager.ClientSet = fake.NewSimpleClientset(test.objs...)
+
+               err := shutdownManager.Shutdown(e2tInstance1)
+
+               assert.Nil(t, err)
+               readerMock.AssertExpectations(t)
+               writerMock.AssertExpectations(t)
+               httpClientMock.AssertExpectations(t)
+       })
+}*/
\ No newline at end of file