mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 10:18:13 +00:00 
			
		
		
		
	Add GetPossiblyMountedVolumesForPod to let kubelet know all volumes were unmounted
podVolumesExist() should consider also uncertain volumes (where kubelet does not know if a volume was fully unmounted) when checking for pod's volumes. Added GetPossiblyMountedVolumesForPod for that. Adding uncertain mounts to GetMountedVolumesForPod would potentially break other callers (e.g. `verifyVolumesMountedFunc`).
This commit is contained in:
		| @@ -74,7 +74,7 @@ func (kl *Kubelet) ListBlockVolumesForPod(podUID types.UID) (map[string]volume.B | ||||
| // pods for the specified volume are mounted. | ||||
| func (kl *Kubelet) podVolumesExist(podUID types.UID) bool { | ||||
| 	if mountedVolumes := | ||||
| 		kl.volumeManager.GetMountedVolumesForPod( | ||||
| 		kl.volumeManager.GetPossiblyMountedVolumesForPod( | ||||
| 			volumetypes.UniquePodName(podUID)); len(mountedVolumes) > 0 { | ||||
| 		return true | ||||
| 	} | ||||
|   | ||||
| @@ -397,6 +397,9 @@ func TestVolumeAttachAndMountControllerEnabled(t *testing.T) { | ||||
|  | ||||
| 	podVolumes := kubelet.volumeManager.GetMountedVolumesForPod( | ||||
| 		util.GetUniquePodName(pod)) | ||||
| 	allPodVolumes := kubelet.volumeManager.GetPossiblyMountedVolumesForPod( | ||||
| 		util.GetUniquePodName(pod)) | ||||
| 	assert.Equal(t, podVolumes, allPodVolumes, "GetMountedVolumesForPod and GetPossiblyMountedVolumesForPod should return the same volumes") | ||||
|  | ||||
| 	expectedPodVolumes := []string{"vol1"} | ||||
| 	assert.Len(t, podVolumes, len(expectedPodVolumes), "Volumes for pod %+v", pod) | ||||
| @@ -476,6 +479,9 @@ func TestVolumeUnmountAndDetachControllerEnabled(t *testing.T) { | ||||
|  | ||||
| 	podVolumes := kubelet.volumeManager.GetMountedVolumesForPod( | ||||
| 		util.GetUniquePodName(pod)) | ||||
| 	allPodVolumes := kubelet.volumeManager.GetPossiblyMountedVolumesForPod( | ||||
| 		util.GetUniquePodName(pod)) | ||||
| 	assert.Equal(t, podVolumes, allPodVolumes, "GetMountedVolumesForPod and GetPossiblyMountedVolumesForPod should return the same volumes") | ||||
|  | ||||
| 	expectedPodVolumes := []string{"vol1"} | ||||
| 	assert.Len(t, podVolumes, len(expectedPodVolumes), "Volumes for pod %+v", pod) | ||||
| @@ -500,6 +506,9 @@ func TestVolumeUnmountAndDetachControllerEnabled(t *testing.T) { | ||||
| 	// Verify volumes unmounted | ||||
| 	podVolumes = kubelet.volumeManager.GetMountedVolumesForPod( | ||||
| 		util.GetUniquePodName(pod)) | ||||
| 	allPodVolumes = kubelet.volumeManager.GetPossiblyMountedVolumesForPod( | ||||
| 		util.GetUniquePodName(pod)) | ||||
| 	assert.Equal(t, podVolumes, allPodVolumes, "GetMountedVolumesForPod and GetPossiblyMountedVolumesForPod should return the same volumes") | ||||
|  | ||||
| 	assert.Len(t, podVolumes, 0, | ||||
| 		"Expected volumes to be unmounted and detached. But some volumes are still mounted: %#v", podVolumes) | ||||
|   | ||||
| @@ -136,6 +136,11 @@ type ActualStateOfWorld interface { | ||||
| 	// current actual state of the world. | ||||
| 	GetMountedVolumesForPod(podName volumetypes.UniquePodName) []MountedVolume | ||||
|  | ||||
| 	// GetPossiblyMountedVolumesForPod generates and returns a list of volumes for | ||||
| 	// the specified pod that either are attached and mounted or are "uncertain", | ||||
| 	// i.e. a volume plugin may be mounting the volume right now. | ||||
| 	GetPossiblyMountedVolumesForPod(podName volumetypes.UniquePodName) []MountedVolume | ||||
|  | ||||
| 	// GetGloballyMountedVolumes generates and returns a list of all attached | ||||
| 	// volumes that are globally mounted. This list can be used to determine | ||||
| 	// which volumes should be reported as "in use" in the node's VolumesInUse | ||||
| @@ -757,6 +762,26 @@ func (asw *actualStateOfWorld) GetMountedVolumesForPod( | ||||
| 	return mountedVolume | ||||
| } | ||||
|  | ||||
| func (asw *actualStateOfWorld) GetPossiblyMountedVolumesForPod( | ||||
| 	podName volumetypes.UniquePodName) []MountedVolume { | ||||
| 	asw.RLock() | ||||
| 	defer asw.RUnlock() | ||||
| 	mountedVolume := make([]MountedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */) | ||||
| 	for _, volumeObj := range asw.attachedVolumes { | ||||
| 		for mountedPodName, podObj := range volumeObj.mountedPods { | ||||
| 			if mountedPodName == podName && | ||||
| 				(podObj.volumeMountStateForPod == operationexecutor.VolumeMounted || | ||||
| 					podObj.volumeMountStateForPod == operationexecutor.VolumeMountUncertain) { | ||||
| 				mountedVolume = append( | ||||
| 					mountedVolume, | ||||
| 					getMountedVolume(&podObj, &volumeObj)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return mountedVolume | ||||
| } | ||||
|  | ||||
| func (asw *actualStateOfWorld) GetGloballyMountedVolumes() []AttachedVolume { | ||||
| 	asw.RLock() | ||||
| 	defer asw.RUnlock() | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/require" | ||||
| 	"k8s.io/api/core/v1" | ||||
| 	v1 "k8s.io/api/core/v1" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/kubernetes/pkg/volume" | ||||
| 	volumetesting "k8s.io/kubernetes/pkg/volume/testing" | ||||
| @@ -653,7 +653,18 @@ func TestUncertainVolumeMounts(t *testing.T) { | ||||
| 		} | ||||
| 	} | ||||
| 	if volumeFound { | ||||
| 		t.Fatalf("expected volume %s to be not found in asw", volumeSpec1.Name()) | ||||
| 		t.Fatalf("expected volume %s to be not found in asw.GetMountedVolumesForPod", volumeSpec1.Name()) | ||||
| 	} | ||||
|  | ||||
| 	possiblyMountedVolumes := asw.GetPossiblyMountedVolumesForPod(podName1) | ||||
| 	volumeFound = false | ||||
| 	for _, volume := range possiblyMountedVolumes { | ||||
| 		if volume.InnerVolumeSpecName == volumeSpec1.Name() { | ||||
| 			volumeFound = true | ||||
| 		} | ||||
| 	} | ||||
| 	if !volumeFound { | ||||
| 		t.Fatalf("expected volume %s to be found in aws.GetPossiblyMountedVolumesForPod", volumeSpec1.Name()) | ||||
| 	} | ||||
|  | ||||
| 	volExists, _, _ := asw.PodExistsInVolume(podName1, generatedVolumeName1) | ||||
|   | ||||
| @@ -113,6 +113,14 @@ type VolumeManager interface { | ||||
| 	// volumes. | ||||
| 	GetMountedVolumesForPod(podName types.UniquePodName) container.VolumeMap | ||||
|  | ||||
| 	// GetPossiblyMountedVolumesForPod returns a VolumeMap containing the volumes | ||||
| 	// referenced by the specified pod that are either successfully attached | ||||
| 	// and mounted or are "uncertain", i.e. a volume plugin may be mounting | ||||
| 	// them right now. The key in the map is the OuterVolumeSpecName (i.e. | ||||
| 	// pod.Spec.Volumes[x].Name). It returns an empty VolumeMap if pod has no | ||||
| 	// volumes. | ||||
| 	GetPossiblyMountedVolumesForPod(podName types.UniquePodName) container.VolumeMap | ||||
|  | ||||
| 	// GetExtraSupplementalGroupsForPod returns a list of the extra | ||||
| 	// supplemental groups for the Pod. These extra supplemental groups come | ||||
| 	// from annotations on persistent volumes that the pod depends on. | ||||
| @@ -290,6 +298,19 @@ func (vm *volumeManager) GetMountedVolumesForPod(podName types.UniquePodName) co | ||||
| 	return podVolumes | ||||
| } | ||||
|  | ||||
| func (vm *volumeManager) GetPossiblyMountedVolumesForPod(podName types.UniquePodName) container.VolumeMap { | ||||
| 	podVolumes := make(container.VolumeMap) | ||||
| 	for _, mountedVolume := range vm.actualStateOfWorld.GetPossiblyMountedVolumesForPod(podName) { | ||||
| 		podVolumes[mountedVolume.OuterVolumeSpecName] = container.VolumeInfo{ | ||||
| 			Mounter:             mountedVolume.Mounter, | ||||
| 			BlockVolumeMapper:   mountedVolume.BlockVolumeMapper, | ||||
| 			ReadOnly:            mountedVolume.VolumeSpec.ReadOnly, | ||||
| 			InnerVolumeSpecName: mountedVolume.InnerVolumeSpecName, | ||||
| 		} | ||||
| 	} | ||||
| 	return podVolumes | ||||
| } | ||||
|  | ||||
| func (vm *volumeManager) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 { | ||||
| 	podName := util.GetUniquePodName(pod) | ||||
| 	supplementalGroups := sets.NewString() | ||||
|   | ||||
| @@ -17,7 +17,7 @@ limitations under the License. | ||||
| package volumemanager | ||||
|  | ||||
| import ( | ||||
| 	"k8s.io/api/core/v1" | ||||
| 	v1 "k8s.io/api/core/v1" | ||||
| 	"k8s.io/kubernetes/pkg/kubelet/config" | ||||
| 	"k8s.io/kubernetes/pkg/kubelet/container" | ||||
| 	"k8s.io/kubernetes/pkg/volume/util/types" | ||||
| @@ -55,6 +55,11 @@ func (f *FakeVolumeManager) GetMountedVolumesForPod(podName types.UniquePodName) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // GetPossiblyMountedVolumesForPod is not implemented | ||||
| func (f *FakeVolumeManager) GetPossiblyMountedVolumesForPod(podName types.UniquePodName) container.VolumeMap { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // GetExtraSupplementalGroupsForPod is not implemented | ||||
| func (f *FakeVolumeManager) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 { | ||||
| 	return nil | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jan Safranek
					Jan Safranek