diff --git a/pkg/kubelet/volumemanager/reconciler/reconciler.go b/pkg/kubelet/volumemanager/reconciler/reconciler.go index 0de32ca6812b..e78752b94070 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconciler.go +++ b/pkg/kubelet/volumemanager/reconciler/reconciler.go @@ -341,7 +341,7 @@ func (rc *reconciler) StatesHasBeenSynced() bool { type podVolume struct { podName volumetypes.UniquePodName volumeSpecName string - mountPath string + volumePath string pluginName string volumeMode v1.PersistentVolumeMode } @@ -477,7 +477,7 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, pod.UID, volume.podName, volume.volumeSpecName, - volume.mountPath, + volume.volumePath, volume.pluginName) if err != nil { return nil, err @@ -492,15 +492,6 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, } else { uniqueVolumeName = util.GetUniqueVolumeNameFromSpecWithPod(volume.podName, plugin, volumeSpec) } - // Check existence of mount point for filesystem volume or symbolic link for block volume - isExist, checkErr := rc.operationExecutor.CheckVolumeExistenceOperation(volumeSpec, volume.mountPath, volumeSpec.Name(), rc.mounter, uniqueVolumeName, volume.podName, pod.UID, attachablePlugin) - if checkErr != nil { - return nil, checkErr - } - // If mount or symlink doesn't exist, volume reconstruction should be failed - if !isExist { - return nil, fmt.Errorf("Volume: %q is not mounted", uniqueVolumeName) - } volumeMounter, newMounterErr := plugin.NewMounter( volumeSpec, @@ -516,6 +507,16 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, newMounterErr) } + // Check existence of mount point for filesystem volume or symbolic link for block volume + isExist, checkErr := rc.operationExecutor.CheckVolumeExistenceOperation(volumeSpec, volumeMounter.GetPath(), volumeSpec.Name(), rc.mounter, uniqueVolumeName, volume.podName, pod.UID, attachablePlugin) + if checkErr != nil { + return nil, checkErr + } + // If mount or symlink doesn't exist, volume reconstruction should be failed + if !isExist { + return nil, fmt.Errorf("Volume: %q is not mounted", uniqueVolumeName) + } + // TODO: remove feature gate check after no longer needed var volumeMapper volumepkg.BlockVolumeMapper if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) && volume.volumeMode == v1.PersistentVolumeBlock { @@ -680,12 +681,12 @@ func getVolumesFromPodDir(podDir string) ([]podVolume, error) { } unescapePluginName := utilstrings.UnescapeQualifiedName(pluginName) for _, volumeName := range volumePluginDirs { - mountPath := path.Join(volumePluginPath, volumeName) - klog.V(5).Infof("podName: %v, mount path from volume plugin directory: %v, ", podName, mountPath) + volumePath := path.Join(volumePluginPath, volumeName) + klog.V(5).Infof("podName: %v, volume path from volume plugin directory: %v, ", podName, volumePath) volumes = append(volumes, podVolume{ podName: volumetypes.UniquePodName(podName), volumeSpecName: volumeName, - mountPath: mountPath, + volumePath: volumePath, pluginName: unescapePluginName, volumeMode: volumeMode, }) diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index 90b7efd9502f..128b84db44d2 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -139,10 +139,10 @@ type VolumePlugin interface { NewUnmounter(name string, podUID types.UID) (Unmounter, error) // ConstructVolumeSpec constructs a volume spec based on the given volume name - // and mountPath. The spec may have incomplete information due to limited + // and volumePath. The spec may have incomplete information due to limited // information from input. This function is used by volume manager to reconstruct // volume spec by reading the volume directories from disk - ConstructVolumeSpec(volumeName, mountPath string) (*Spec, error) + ConstructVolumeSpec(volumeName, volumePath string) (*Spec, error) // SupportsMountOption returns true if volume plugins supports Mount options // Specifying mount options in a volume plugin that doesn't support @@ -275,7 +275,7 @@ type BlockVolumePlugin interface { // The spec may have incomplete information due to limited information // from input. This function is used by volume manager to reconstruct // volume spec by reading the volume directories from disk. - ConstructBlockVolumeSpec(podUID types.UID, volumeName, mountPath string) (*Spec, error) + ConstructBlockVolumeSpec(podUID types.UID, volumeName, volumePath string) (*Spec, error) } // VolumeHost is an interface that plugins can use to access the kubelet. diff --git a/pkg/volume/util/operationexecutor/operation_executor.go b/pkg/volume/util/operationexecutor/operation_executor.go index ad24f1c1ef69..4061ca1d7682 100644 --- a/pkg/volume/util/operationexecutor/operation_executor.go +++ b/pkg/volume/util/operationexecutor/operation_executor.go @@ -145,7 +145,7 @@ type OperationExecutor interface { // ExpandVolumeFSWithoutUnmounting will resize volume's file system to expected size without unmounting the volume. ExpandVolumeFSWithoutUnmounting(volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater) error // ReconstructVolumeOperation construct a new volumeSpec and returns it created by plugin - ReconstructVolumeOperation(volumeMode v1.PersistentVolumeMode, plugin volume.VolumePlugin, mapperPlugin volume.BlockVolumePlugin, uid types.UID, podName volumetypes.UniquePodName, volumeSpecName string, mountPath string, pluginName string) (*volume.Spec, error) + ReconstructVolumeOperation(volumeMode v1.PersistentVolumeMode, plugin volume.VolumePlugin, mapperPlugin volume.BlockVolumePlugin, uid types.UID, podName volumetypes.UniquePodName, volumeSpecName string, volumePath string, pluginName string) (*volume.Spec, error) // CheckVolumeExistenceOperation checks volume existence CheckVolumeExistenceOperation(volumeSpec *volume.Spec, mountPath, volumeName string, mounter mount.Interface, uniqueVolumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName, podUID types.UID, attachable volume.AttachableVolumePlugin) (bool, error) } @@ -862,14 +862,14 @@ func (oe *operationExecutor) ReconstructVolumeOperation( uid types.UID, podName volumetypes.UniquePodName, volumeSpecName string, - mountPath string, + volumePath string, pluginName string) (*volume.Spec, error) { // Filesystem Volume case if volumeMode == v1.PersistentVolumeFilesystem { // Create volumeSpec from mount path klog.V(5).Infof("Starting operationExecutor.ReconstructVolumepodName") - volumeSpec, err := plugin.ConstructVolumeSpec(volumeSpecName, mountPath) + volumeSpec, err := plugin.ConstructVolumeSpec(volumeSpecName, volumePath) if err != nil { return nil, err } @@ -886,17 +886,17 @@ func (oe *operationExecutor) ReconstructVolumeOperation( podName, uid) } - // mountPath contains volumeName on the path. In the case of block volume, {volumeName} is symbolic link + // volumePath contains volumeName on the path. In the case of block volume, {volumeName} is symbolic link // corresponding to raw block device. - // ex. mountPath: pods/{podUid}}/{DefaultKubeletVolumeDevicesDirName}/{escapeQualifiedPluginName}/{volumeName} - volumeSpec, err := mapperPlugin.ConstructBlockVolumeSpec(uid, volumeSpecName, mountPath) + // ex. volumePath: pods/{podUid}}/{DefaultKubeletVolumeDevicesDirName}/{escapeQualifiedPluginName}/{volumeName} + volumeSpec, err := mapperPlugin.ConstructBlockVolumeSpec(uid, volumeSpecName, volumePath) if err != nil { return nil, err } return volumeSpec, nil } -// CheckVolumeExistenceOperation return a func() to check mount path directory if volume still exists +// CheckVolumeExistenceOperation checks mount path directory if volume still exists func (oe *operationExecutor) CheckVolumeExistenceOperation( volumeSpec *volume.Spec, mountPath, volumeName string,