diff --git a/pkg/volume/csi/csi_attacher_test.go b/pkg/volume/csi/csi_attacher_test.go index adf1bb2e31a..37ae0417f4b 100644 --- a/pkg/volume/csi/csi_attacher_test.go +++ b/pkg/volume/csi/csi_attacher_test.go @@ -47,7 +47,10 @@ import ( volumetypes "k8s.io/kubernetes/pkg/volume/util/types" ) -const testWatchTimeout = 10 * time.Second +const ( + testWatchTimeout = 10 * time.Second + testWatchFailTimeout = 2 * time.Second +) var ( bFalse = false @@ -121,6 +124,7 @@ func TestAttacherAttach(t *testing.T) { spec *volume.Spec injectAttacherError bool shouldFail bool + watchTimeout time.Duration }{ { name: "test ok 1", @@ -139,31 +143,34 @@ func TestAttacherAttach(t *testing.T) { spec: volume.NewSpecFromPersistentVolume(makeTestPV("pv01", 10, "driver02", "vol02"), false), }, { - name: "mismatch vol", - nodeName: "node02", - driverName: "driver02", - volumeName: "vol01", - attachID: getAttachmentName("vol02", "driver02", "node02"), - spec: volume.NewSpecFromPersistentVolume(makeTestPV("pv01", 10, "driver02", "vol01"), false), - shouldFail: true, + name: "mismatch vol", + nodeName: "node02", + driverName: "driver02", + volumeName: "vol01", + attachID: getAttachmentName("vol02", "driver02", "node02"), + spec: volume.NewSpecFromPersistentVolume(makeTestPV("pv01", 10, "driver02", "vol01"), false), + shouldFail: true, + watchTimeout: testWatchFailTimeout, }, { - name: "mismatch driver", - nodeName: "node02", - driverName: "driver000", - volumeName: "vol02", - attachID: getAttachmentName("vol02", "driver02", "node02"), - spec: volume.NewSpecFromPersistentVolume(makeTestPV("pv01", 10, "driver01", "vol02"), false), - shouldFail: true, + name: "mismatch driver", + nodeName: "node02", + driverName: "driver000", + volumeName: "vol02", + attachID: getAttachmentName("vol02", "driver02", "node02"), + spec: volume.NewSpecFromPersistentVolume(makeTestPV("pv01", 10, "driver01", "vol02"), false), + shouldFail: true, + watchTimeout: testWatchFailTimeout, }, { - name: "mismatch node", - nodeName: "node000", - driverName: "driver000", - volumeName: "vol02", - attachID: getAttachmentName("vol02", "driver02", "node02"), - spec: volume.NewSpecFromPersistentVolume(makeTestPV("pv01", 10, "driver02", "vol02"), false), - shouldFail: true, + name: "mismatch node", + nodeName: "node000", + driverName: "driver000", + volumeName: "vol02", + attachID: getAttachmentName("vol02", "driver02", "node02"), + spec: volume.NewSpecFromPersistentVolume(makeTestPV("pv01", 10, "driver02", "vol02"), false), + shouldFail: true, + watchTimeout: testWatchFailTimeout, }, { name: "attacher error", @@ -207,7 +214,7 @@ func TestAttacherAttach(t *testing.T) { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) var wg sync.WaitGroup wg.Add(1) @@ -251,6 +258,7 @@ func TestAttacherAttachWithInline(t *testing.T) { spec *volume.Spec injectAttacherError bool shouldFail bool + watchTimeout time.Duration }{ { name: "test ok 1 with PV", @@ -293,7 +301,7 @@ func TestAttacherAttachWithInline(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) var wg sync.WaitGroup wg.Add(1) @@ -328,6 +336,7 @@ func TestAttacherWithCSIDriver(t *testing.T) { name string driver string expectVolumeAttachment bool + watchTimeout time.Duration }{ { name: "CSIDriver not attachable", @@ -365,7 +374,7 @@ func TestAttacherWithCSIDriver(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, test.watchTimeout) spec := volume.NewSpecFromPersistentVolume(makeTestPV("test-pv", 10, test.driver, "test-vol"), false) pluginCanAttach, err := plug.CanAttach(spec) @@ -411,9 +420,10 @@ func TestAttacherWaitForVolumeAttachmentWithCSIDriver(t *testing.T) { // we do not instantiate any VolumeAttachment. So if the plugin does not skip attach, WaitForVolumeAttachment // will return an error that volume attachment was not found. tests := []struct { - name string - driver string - expectError bool + name string + driver string + expectError bool + watchTimeout time.Duration }{ { name: "CSIDriver not attachable -> success", @@ -457,7 +467,7 @@ func TestAttacherWaitForVolumeAttachmentWithCSIDriver(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, test.watchTimeout) spec := volume.NewSpecFromPersistentVolume(makeTestPV("test-pv", 10, test.driver, "test-vol"), false) pluginCanAttach, err := plug.CanAttach(spec) @@ -488,6 +498,7 @@ func TestAttacherWaitForAttach(t *testing.T) { spec *volume.Spec expectedAttachID string expectError bool + watchTimeout time.Duration }{ { name: "successful attach", @@ -532,7 +543,7 @@ func TestAttacherWaitForAttach(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, test.watchTimeout) if test.makeAttachment != nil { attachment := test.makeAttachment() @@ -571,6 +582,7 @@ func TestAttacherWaitForAttachWithInline(t *testing.T) { spec *volume.Spec expectedAttachID string expectError bool + watchTimeout time.Duration }{ { name: "successful attach with PV", @@ -615,7 +627,7 @@ func TestAttacherWaitForAttachWithInline(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, test.watchTimeout) if test.makeAttachment != nil { attachment := test.makeAttachment() @@ -653,6 +665,7 @@ func TestAttacherWaitForVolumeAttachment(t *testing.T) { finalAttachErr *storage.VolumeError timeout time.Duration shouldFail bool + watchTimeout time.Duration }{ { name: "attach success at get", @@ -706,7 +719,7 @@ func TestAttacherWaitForVolumeAttachment(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) t.Logf("running test: %v", tc.name) pvName := fmt.Sprintf("test-pv-%d", i) @@ -763,10 +776,11 @@ func TestAttacherVolumesAreAttached(t *testing.T) { testCases := []struct { name string attachedSpecs []attachedSpec + watchTimeout time.Duration }{ { - "attach and detach", - []attachedSpec{ + name: "attach and detach", + attachedSpecs: []attachedSpec{ {"vol0", volume.NewSpecFromPersistentVolume(makeTestPV("pv0", 10, testDriver, "vol0"), false), true}, {"vol1", volume.NewSpecFromPersistentVolume(makeTestPV("pv1", 20, testDriver, "vol1"), false), true}, {"vol2", volume.NewSpecFromPersistentVolume(makeTestPV("pv2", 10, testDriver, "vol2"), false), false}, @@ -775,23 +789,23 @@ func TestAttacherVolumesAreAttached(t *testing.T) { }, }, { - "all detached", - []attachedSpec{ + name: "all detached", + attachedSpecs: []attachedSpec{ {"vol0", volume.NewSpecFromPersistentVolume(makeTestPV("pv0", 10, testDriver, "vol0"), false), false}, {"vol1", volume.NewSpecFromPersistentVolume(makeTestPV("pv1", 20, testDriver, "vol1"), false), false}, {"vol2", volume.NewSpecFromPersistentVolume(makeTestPV("pv2", 10, testDriver, "vol2"), false), false}, }, }, { - "all attached", - []attachedSpec{ + name: "all attached", + attachedSpecs: []attachedSpec{ {"vol0", volume.NewSpecFromPersistentVolume(makeTestPV("pv0", 10, testDriver, "vol0"), false), true}, {"vol1", volume.NewSpecFromPersistentVolume(makeTestPV("pv1", 20, testDriver, "vol1"), false), true}, }, }, { - "include non-attable", - []attachedSpec{ + name: "include non-attable", + attachedSpecs: []attachedSpec{ {"vol0", volume.NewSpecFromPersistentVolume(makeTestPV("pv0", 10, testDriver, "vol0"), false), true}, {"vol1", volume.NewSpecFromVolume(makeTestVol("pv1", testDriver)), false}, }, @@ -807,7 +821,7 @@ func TestAttacherVolumesAreAttached(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) nodeName := "fakeNode" var specs []*volume.Spec @@ -856,10 +870,11 @@ func TestAttacherVolumesAreAttachedWithInline(t *testing.T) { testCases := []struct { name string attachedSpecs []attachedSpec + watchTimeout time.Duration }{ { - "attach and detach with volume sources", - []attachedSpec{ + name: "attach and detach with volume sources", + attachedSpecs: []attachedSpec{ {"vol0", volume.NewSpecFromPersistentVolume(makeTestPV("pv0", 10, testDriver, "vol0"), false), true}, {"vol1", volume.NewSpecFromVolume(makeTestVol("pv1", testDriver)), false}, {"vol2", volume.NewSpecFromPersistentVolume(makeTestPV("pv2", 10, testDriver, "vol2"), false), true}, @@ -878,7 +893,7 @@ func TestAttacherVolumesAreAttachedWithInline(t *testing.T) { if err != nil { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) nodeName := "fakeNode" var specs []*volume.Spec @@ -920,11 +935,12 @@ func TestAttacherVolumesAreAttachedWithInline(t *testing.T) { func TestAttacherDetach(t *testing.T) { nodeName := "fakeNode" testCases := []struct { - name string - volID string - attachID string - shouldFail bool - reactor func(action core.Action) (handled bool, ret runtime.Object, err error) + name string + volID string + attachID string + shouldFail bool + reactor func(action core.Action) (handled bool, ret runtime.Object, err error) + watchTimeout time.Duration }{ {name: "normal test", volID: "vol-001", attachID: getAttachmentName("vol-001", testDriver, nodeName)}, {name: "normal test 2", volID: "vol-002", attachID: getAttachmentName("vol-002", testDriver, nodeName)}, @@ -959,7 +975,7 @@ func TestAttacherDetach(t *testing.T) { if err0 != nil { t.Fatalf("failed to create new attacher: %v", err0) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) pv := makeTestPV("test-pv", 10, testDriver, tc.volID) spec := volume.NewSpecFromPersistentVolume(pv, pv.Spec.PersistentVolumeSource.CSI.ReadOnly) @@ -1004,7 +1020,7 @@ func TestAttacherGetDeviceMountPath(t *testing.T) { if err0 != nil { t.Fatalf("failed to create new attacher: %v", err0) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, testWatchTimeout) pluginDir := csiAttacher.plugin.host.GetPluginDir(plug.GetPluginName()) @@ -1067,6 +1083,7 @@ func TestAttacherMountDevice(t *testing.T) { populateDeviceMountPath bool exitError error spec *volume.Spec + watchTimeout time.Duration }{ { testName: "normal PV", @@ -1187,7 +1204,7 @@ func TestAttacherMountDevice(t *testing.T) { if err0 != nil { t.Fatalf("failed to create new attacher: %v", err0) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) csiAttacher.csiClient = setupClient(t, tc.stageUnstageSet) if tc.deviceMountPath != "" { @@ -1309,6 +1326,7 @@ func TestAttacherMountDeviceWithInline(t *testing.T) { stageUnstageSet bool shouldFail bool spec *volume.Spec + watchTimeout time.Duration }{ { testName: "normal PV", @@ -1387,7 +1405,7 @@ func TestAttacherMountDeviceWithInline(t *testing.T) { if err0 != nil { t.Fatalf("failed to create new attacher: %v", err0) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) csiAttacher.csiClient = setupClient(t, tc.stageUnstageSet) if tc.deviceMountPath != "" { @@ -1461,6 +1479,7 @@ func TestAttacherUnmountDevice(t *testing.T) { createPV bool stageUnstageSet bool shouldFail bool + watchTimeout time.Duration }{ { testName: "normal, json file exists", @@ -1523,7 +1542,7 @@ func TestAttacherUnmountDevice(t *testing.T) { if err0 != nil { t.Fatalf("failed to create new attacher: %v", err0) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, tc.watchTimeout) csiAttacher.csiClient = setupClient(t, tc.stageUnstageSet) if tc.deviceMountPath != "" { @@ -1603,26 +1622,38 @@ func TestAttacherUnmountDevice(t *testing.T) { } } -func getCsiAttacherFromVolumeAttacher(attacher volume.Attacher) *csiAttacher { +func getCsiAttacherFromVolumeAttacher(attacher volume.Attacher, watchTimeout time.Duration) *csiAttacher { + if watchTimeout == 0 { + watchTimeout = testWatchTimeout + } csiAttacher := attacher.(*csiAttacher) - csiAttacher.watchTimeout = testWatchTimeout + csiAttacher.watchTimeout = watchTimeout return csiAttacher } -func getCsiAttacherFromVolumeDetacher(detacher volume.Detacher) *csiAttacher { +func getCsiAttacherFromVolumeDetacher(detacher volume.Detacher, watchTimeout time.Duration) *csiAttacher { + if watchTimeout == 0 { + watchTimeout = testWatchTimeout + } csiAttacher := detacher.(*csiAttacher) - csiAttacher.watchTimeout = testWatchTimeout + csiAttacher.watchTimeout = watchTimeout return csiAttacher } -func getCsiAttacherFromDeviceMounter(deviceMounter volume.DeviceMounter) *csiAttacher { +func getCsiAttacherFromDeviceMounter(deviceMounter volume.DeviceMounter, watchTimeout time.Duration) *csiAttacher { + if watchTimeout == 0 { + watchTimeout = testWatchTimeout + } csiAttacher := deviceMounter.(*csiAttacher) - csiAttacher.watchTimeout = testWatchTimeout + csiAttacher.watchTimeout = watchTimeout return csiAttacher } -func getCsiAttacherFromDeviceUnmounter(deviceUnmounter volume.DeviceUnmounter) *csiAttacher { +func getCsiAttacherFromDeviceUnmounter(deviceUnmounter volume.DeviceUnmounter, watchTimeout time.Duration) *csiAttacher { + if watchTimeout == 0 { + watchTimeout = testWatchTimeout + } csiAttacher := deviceUnmounter.(*csiAttacher) - csiAttacher.watchTimeout = testWatchTimeout + csiAttacher.watchTimeout = watchTimeout return csiAttacher } diff --git a/pkg/volume/csi/csi_plugin_test.go b/pkg/volume/csi/csi_plugin_test.go index 8cfd5db58b2..3632df8a3d6 100644 --- a/pkg/volume/csi/csi_plugin_test.go +++ b/pkg/volume/csi/csi_plugin_test.go @@ -910,7 +910,7 @@ func TestPluginNewAttacher(t *testing.T) { t.Fatalf("failed to create new attacher: %v", err) } - csiAttacher := getCsiAttacherFromVolumeAttacher(attacher) + csiAttacher := getCsiAttacherFromVolumeAttacher(attacher, testWatchTimeout) if csiAttacher.plugin == nil { t.Error("plugin not set for attacher") } @@ -931,7 +931,7 @@ func TestPluginNewDetacher(t *testing.T) { t.Fatalf("failed to create new detacher: %v", err) } - csiDetacher := getCsiAttacherFromVolumeDetacher(detacher) + csiDetacher := getCsiAttacherFromVolumeDetacher(detacher, testWatchTimeout) if csiDetacher.plugin == nil { t.Error("plugin not set for detacher") } diff --git a/pkg/volume/csi/csi_test.go b/pkg/volume/csi/csi_test.go index e6a004ed83d..94408c64e9b 100644 --- a/pkg/volume/csi/csi_test.go +++ b/pkg/volume/csi/csi_test.go @@ -60,6 +60,7 @@ func TestCSI_VolumeAll(t *testing.T) { shouldFail bool disableFSGroupPolicyFeatureGate bool driverSpec *storage.CSIDriverSpec + watchTimeout time.Duration }{ { name: "PersistentVolume", @@ -396,7 +397,7 @@ func TestCSI_VolumeAll(t *testing.T) { } if devMounter != nil { - csiDevMounter := getCsiAttacherFromDeviceMounter(devMounter) + csiDevMounter := getCsiAttacherFromDeviceMounter(devMounter, test.watchTimeout) csiDevMounter.csiClient = csiClient devMountPath, err := csiDevMounter.GetDeviceMountPath(volSpec) if err != nil { @@ -559,8 +560,8 @@ func TestCSI_VolumeAll(t *testing.T) { } if devMounter != nil && devUnmounter != nil { - csiDevMounter := getCsiAttacherFromDeviceMounter(devMounter) - csiDevUnmounter := getCsiAttacherFromDeviceUnmounter(devUnmounter) + csiDevMounter := getCsiAttacherFromDeviceMounter(devMounter, test.watchTimeout) + csiDevUnmounter := getCsiAttacherFromDeviceUnmounter(devUnmounter, test.watchTimeout) csiDevUnmounter.csiClient = csiClient devMountPath, err := csiDevMounter.GetDeviceMountPath(volSpec) @@ -601,7 +602,7 @@ func TestCSI_VolumeAll(t *testing.T) { if err != nil { t.Fatal("csiTest.VolumeAll volumePlugin.GetVolumeName failed:", err) } - csiDetacher := getCsiAttacherFromVolumeDetacher(volDetacher) + csiDetacher := getCsiAttacherFromVolumeDetacher(volDetacher, test.watchTimeout) csiDetacher.csiClient = csiClient if err := csiDetacher.Detach(volName, attachDetachVolumeHost.GetNodeName()); err != nil { t.Fatal("csiTest.VolumeAll detacher.Detach failed:", err)