mirror of
https://github.com/optim-enterprises-bv/kubernetes.git
synced 2025-11-01 18:58:18 +00:00
Mark VolumeInUse before checking if it is Attached
Ensure that kublet marks VolumeInUse before checking if it is Attached. Also ensures that the attach/detach controller always fetches a fresh copy of the node object before detach (instead ofKubelet relying on node informer cache).
This commit is contained in:
@@ -597,7 +597,7 @@ func TestVolumeUnmountAndDetachControllerDisabled(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify volumes detached and no longer reported as in use
|
||||
err = waitForVolumeDetach(kubelet.volumeManager)
|
||||
err = waitForVolumeDetach(api.UniqueVolumeName("fake/vol1"), kubelet.volumeManager)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@@ -611,7 +611,6 @@ func TestVolumeUnmountAndDetachControllerDisabled(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestVolumeAttachAndMountControllerEnabled(t *testing.T) {
|
||||
@@ -657,6 +656,13 @@ func TestVolumeAttachAndMountControllerEnabled(t *testing.T) {
|
||||
}()
|
||||
|
||||
kubelet.podManager.SetPods([]*api.Pod{pod})
|
||||
|
||||
// Fake node status update
|
||||
go simulateVolumeInUseUpdate(
|
||||
api.UniqueVolumeName("fake/vol1"),
|
||||
stopCh,
|
||||
kubelet.volumeManager)
|
||||
|
||||
err := kubelet.volumeManager.WaitForAttachAndMount(pod)
|
||||
if err != nil {
|
||||
t.Errorf("Expected success: %v", err)
|
||||
@@ -747,6 +753,12 @@ func TestVolumeUnmountAndDetachControllerEnabled(t *testing.T) {
|
||||
// Add pod
|
||||
kubelet.podManager.SetPods([]*api.Pod{pod})
|
||||
|
||||
// Fake node status update
|
||||
go simulateVolumeInUseUpdate(
|
||||
api.UniqueVolumeName("fake/vol1"),
|
||||
stopCh,
|
||||
kubelet.volumeManager)
|
||||
|
||||
// Verify volumes attached
|
||||
err := kubelet.volumeManager.WaitForAttachAndMount(pod)
|
||||
if err != nil {
|
||||
@@ -815,7 +827,7 @@ func TestVolumeUnmountAndDetachControllerEnabled(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify volumes detached and no longer reported as in use
|
||||
err = waitForVolumeDetach(kubelet.volumeManager)
|
||||
err = waitForVolumeDetach(api.UniqueVolumeName("fake/vol1"), kubelet.volumeManager)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@@ -828,7 +840,6 @@ func TestVolumeUnmountAndDetachControllerEnabled(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestPodVolumesExist(t *testing.T) {
|
||||
@@ -4987,19 +4998,15 @@ func waitForVolumeUnmount(
|
||||
}
|
||||
|
||||
func waitForVolumeDetach(
|
||||
volumeName api.UniqueVolumeName,
|
||||
volumeManager kubeletvolume.VolumeManager) error {
|
||||
attachedVolumes := []api.UniqueVolumeName{}
|
||||
err := retryWithExponentialBackOff(
|
||||
time.Duration(50*time.Millisecond),
|
||||
func() (bool, error) {
|
||||
// Verify volumes detached
|
||||
attachedVolumes = volumeManager.GetVolumesInUse()
|
||||
|
||||
if len(attachedVolumes) != 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return true, nil
|
||||
volumeAttached := volumeManager.VolumeIsAttached(volumeName)
|
||||
return !volumeAttached, nil
|
||||
},
|
||||
)
|
||||
|
||||
@@ -5020,3 +5027,20 @@ func retryWithExponentialBackOff(initialDuration time.Duration, fn wait.Conditio
|
||||
}
|
||||
return wait.ExponentialBackoff(backoff, fn)
|
||||
}
|
||||
|
||||
func simulateVolumeInUseUpdate(
|
||||
volumeName api.UniqueVolumeName,
|
||||
stopCh <-chan struct{},
|
||||
volumeManager kubeletvolume.VolumeManager) {
|
||||
ticker := time.NewTicker(100 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
volumeManager.MarkVolumesAsReportedInUse(
|
||||
[]api.UniqueVolumeName{volumeName})
|
||||
case <-stopCh:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user