From 6e716af89ee59f9058e7a9d98365a6fa6f1764c1 Mon Sep 17 00:00:00 2001 From: David Zhu Date: Thu, 14 Nov 2019 23:29:42 -0800 Subject: [PATCH] Add CSINodes to AttachDetachControllerRecovery test --- .../attach_detach_controller_test.go | 26 ++++++++++++++++++- .../volume/attachdetach/testing/BUILD | 1 + .../attachdetach/testing/testvolumespec.go | 21 +++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/pkg/controller/volume/attachdetach/attach_detach_controller_test.go b/pkg/controller/volume/attachdetach/attach_detach_controller_test.go index 5758916185c..d7bfe34d848 100644 --- a/pkg/controller/volume/attachdetach/attach_detach_controller_test.go +++ b/pkg/controller/volume/attachdetach/attach_detach_controller_test.go @@ -154,6 +154,7 @@ func attachDetachRecoveryTestCase(t *testing.T, extraPods1 []*v1.Pod, extraPods2 plugins := controllervolumetesting.CreateTestPlugin() var prober volume.DynamicPluginProber = nil // TODO (#51147) inject mock nodeInformer := informerFactory.Core().V1().Nodes().Informer() + csiNodeInformer := informerFactory.Storage().V1().CSINodes().Informer() podInformer := informerFactory.Core().V1().Pods().Informer() var podsNum, extraPodsNum, nodesNum, i int @@ -179,11 +180,21 @@ func attachDetachRecoveryTestCase(t *testing.T, extraPods1 []*v1.Pod, extraPods2 nodesNum++ } + csiNodes, err := fakeKubeClient.StorageV1().CSINodes().List(metav1.ListOptions{}) + if err != nil { + t.Fatalf("Run failed with error. Expected: Actual: %v", err) + } + for _, csiNode := range csiNodes.Items { + csiNodeToAdd := csiNode + csiNodeInformer.GetIndexer().Add(&csiNodeToAdd) + } + informerFactory.Start(stopCh) if !kcache.WaitForNamedCacheSync("attach detach", stopCh, informerFactory.Core().V1().Pods().Informer().HasSynced, - informerFactory.Core().V1().Nodes().Informer().HasSynced) { + informerFactory.Core().V1().Nodes().Informer().HasSynced, + informerFactory.Storage().V1().CSINodes().Informer().HasSynced) { t.Fatalf("Error waiting for the informer caches to sync") } @@ -214,6 +225,19 @@ func attachDetachRecoveryTestCase(t *testing.T, extraPods1 []*v1.Pod, extraPods2 podList, err = informerFactory.Core().V1().Pods().Lister().List(labels.Everything()) i++ } + i = 0 + csiNodesList, err := informerFactory.Storage().V1().CSINodes().Lister().List(labels.Everything()) + for len(csiNodesList) < nodesNum { + if err != nil { + t.Fatalf("Error getting list of csi nodes %v", err) + } + if i > 100 { + t.Fatalf("Time out while waiting for the csinodes informer sync: found %d csinodes, expected %d csinodes", len(csiNodesList), nodesNum) + } + time.Sleep(100 * time.Millisecond) + csiNodesList, err = informerFactory.Storage().V1().CSINodes().Lister().List(labels.Everything()) + i++ + } // Create the controller adcObj, err := NewAttachDetachController( diff --git a/pkg/controller/volume/attachdetach/testing/BUILD b/pkg/controller/volume/attachdetach/testing/BUILD index 1d52155d522..e063b6b5fe2 100644 --- a/pkg/controller/volume/attachdetach/testing/BUILD +++ b/pkg/controller/volume/attachdetach/testing/BUILD @@ -13,6 +13,7 @@ go_library( "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/pkg/controller/volume/attachdetach/testing/testvolumespec.go b/pkg/controller/volume/attachdetach/testing/testvolumespec.go index f402c2c6f2d..86b66f8f244 100644 --- a/pkg/controller/volume/attachdetach/testing/testvolumespec.go +++ b/pkg/controller/volume/attachdetach/testing/testvolumespec.go @@ -22,6 +22,7 @@ import ( "time" "k8s.io/api/core/v1" + storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -122,6 +123,26 @@ func CreateTestClient() *fake.Clientset { extraPods.Items = append(extraPods.Items, *pod) return true, createAction.GetObject(), nil }) + fakeClient.AddReactor("list", "csinodes", func(action core.Action) (handled bool, ret runtime.Object, err error) { + obj := &storagev1.CSINodeList{} + nodeNamePrefix := "mynode" + for i := 0; i < 5; i++ { + var nodeName string + if i != 0 { + nodeName = fmt.Sprintf("%s-%d", nodeNamePrefix, i) + } else { + // We want also the "mynode" node since all the testing pods live there + nodeName = nodeNamePrefix + } + csiNode := storagev1.CSINode{ + ObjectMeta: metav1.ObjectMeta{ + Name: nodeName, + }, + } + obj.Items = append(obj.Items, csiNode) + } + return true, obj, nil + }) fakeClient.AddReactor("list", "nodes", func(action core.Action) (handled bool, ret runtime.Object, err error) { obj := &v1.NodeList{} nodeNamePrefix := "mynode"