diff --git a/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go b/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go index 32a6c974095..79bbc520fe1 100644 --- a/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go +++ b/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go @@ -456,15 +456,9 @@ func Test_Run_OneVolumeAttachAndDetachMultipleNodesWithReadWriteOnce(t *testing. nodesForVolume := asw.GetNodesForVolume(generatedVolumeName) // check if multiattach is marked - // at least one volume should be marked with multiattach error + // at least one volume+node should be marked with multiattach error nodeAttachedTo := nodesForVolume[0] - for _, volumeToAttach := range dsw.GetVolumesToAttach() { - if volumeToAttach.NodeName != nodeAttachedTo { - if !volumeToAttach.MultiAttachErrorReported { - t.Fatalf("Expected volume %q on node %q to have multiattach error", volumeToAttach.VolumeName, volumeToAttach.NodeName) - } - } - } + waitForMultiAttachErrorOnNode(t, nodeAttachedTo, dsw) // Act podToDelete := "" @@ -495,6 +489,28 @@ func Test_Run_OneVolumeAttachAndDetachMultipleNodesWithReadWriteOnce(t *testing. waitForTotalAttachCallCount(t, 2 /* expectedAttachCallCount */, fakePlugin) } +func waitForMultiAttachErrorOnNode( + t *testing.T, + attachedNode k8stypes.NodeName, + dsow cache.DesiredStateOfWorld) { + multAttachCheckFunc := func() (bool, error) { + for _, volumeToAttach := range dsow.GetVolumesToAttach() { + if volumeToAttach.NodeName != attachedNode { + if volumeToAttach.MultiAttachErrorReported { + return true, nil + } + } + } + t.Logf("Warning: MultiAttach error not yet set on Node. Will retry.") + return false, nil + } + + err := retryWithExponentialBackOff(100*time.Millisecond, multAttachCheckFunc) + if err != nil { + t.Fatalf("Timed out waiting for MultiAttach Error to be set on non-attached node") + } +} + func waitForNewAttacherCallCount( t *testing.T, expectedCallCount int,