diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go index fe7dcbd7ef9d..3c6638328f69 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go @@ -140,6 +140,10 @@ func (m *execMounter) ExistsPath(pathname string) (bool, error) { return m.wrappedMounter.ExistsPath(pathname) } +func (m *execMounter) EvalHostSymlinks(pathname string) (string, error) { + return m.wrappedMounter.EvalHostSymlinks(pathname) +} + func (m *execMounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { return m.wrappedMounter.PrepareSafeSubpath(subPath) } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go index 6854b32b26c9..d5a1fdc58c6a 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go @@ -87,6 +87,10 @@ func (mounter *execMounter) ExistsPath(pathname string) (bool, error) { return true, errors.New("not implemented") } +func (m *execMounter) EvalHostSymlinks(pathname string) (string, error) { + return "", errors.New("not implemented") +} + func (mounter *execMounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { return subPath.Path, nil, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go b/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go index 10832fd321b0..8aaf69a7f60f 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go @@ -205,6 +205,10 @@ func (f *FakeMounter) ExistsPath(pathname string) (bool, error) { return false, errors.New("not implemented") } +func (f *FakeMounter) EvalHostSymlinks(pathname string) (string, error) { + return pathname, nil +} + func (f *FakeMounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { return subPath.Path, nil, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go index f5ce194cac63..ea9cbe1c690a 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go @@ -96,6 +96,9 @@ type Interface interface { // Will operate in the host mount namespace if kubelet is running in a container. // Error is returned on any other error than "file not found". ExistsPath(pathname string) (bool, error) + // EvalHostSymlinks returns the path name after evaluating symlinks. + // Will operate in the host mount namespace if kubelet is running in a container. + EvalHostSymlinks(pathname string) (string, error) // CleanSubPaths removes any bind-mounts created by PrepareSafeSubpath in given // pod volume directory. CleanSubPaths(podDir string, volumeName string) error diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go index e80dad590adb..70b85eb6276b 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go @@ -454,6 +454,10 @@ func (mounter *Mounter) ExistsPath(pathname string) (bool, error) { return utilfile.FileExists(pathname) } +func (mounter *Mounter) EvalHostSymlinks(pathname string) (string, error) { + return filepath.EvalSymlinks(pathname) +} + // formatAndMount uses unix utils to format and mount the given disk func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, fstype string, options []string) error { readOnly := false diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go index 6143aec18270..261cd8c25b5f 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go @@ -112,6 +112,10 @@ func (mounter *Mounter) ExistsPath(pathname string) (bool, error) { return true, errors.New("not implemented") } +func (mounter *Mounter) EvalHostSymlinks(pathname string) (string, error) { + return "", unsupportedErr +} + func (mounter *Mounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { return subPath.Path, nil, unsupportedErr } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go index 5c57a57d0647..c658d70a948e 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go @@ -242,6 +242,11 @@ func (mounter *Mounter) ExistsPath(pathname string) (bool, error) { return utilfile.FileExists(pathname) } +// EvalHostSymlinks returns the path name after evaluating symlinks +func (mounter *Mounter) EvalHostSymlinks(pathname string) (string, error) { + return filepath.EvalSymlinks(pathname) +} + // check whether hostPath is within volume path // this func will lock all intermediate subpath directories, need to close handle outside of this func after container started func lockAndCheckSubPath(volumePath, hostPath string) ([]uintptr, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go index a122411cec23..bf2dbf630b12 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go @@ -287,6 +287,10 @@ func (mounter *NsenterMounter) ExistsPath(pathname string) (bool, error) { return utilfile.FileExists(kubeletpath) } +func (mounter *NsenterMounter) EvalHostSymlinks(pathname string) (string, error) { + return mounter.ne.EvalSymlinks(pathname, true) +} + func (mounter *NsenterMounter) CleanSubPaths(podDir string, volumeName string) error { return doCleanSubPaths(mounter, podDir, volumeName) } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go index f417ba9bc15d..87c2e9ec73d7 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go @@ -89,6 +89,10 @@ func (*NsenterMounter) ExistsPath(pathname string) (bool, error) { return true, errors.New("not implemented") } +func (*NsenterMounter) EvalHostSymlinks(pathname string) (string, error) { + return "", errors.New("not implemented") +} + func (*NsenterMounter) SafeMakeDir(pathname string, base string, perm os.FileMode) error { return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go index 51f321ae9d45..680851637010 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go @@ -866,6 +866,16 @@ func (og *operationGenerator) GenerateMapVolumeFunc( return volumeToMount.GenerateError("MapVolume failed", fmt.Errorf("Device path of the volume is empty")) } + // When kubelet is containerized, devicePath may be a symlink at a place unavailable to + // kubelet, so evaluate it on the host and expect that it links to a device in /dev, + // which will be available to containerized kubelet. If still it does not exist, + // AttachFileDevice will fail. If kubelet is not containerized, eval it anyway. + mounter := og.GetVolumePluginMgr().Host.GetMounter(blockVolumePlugin.GetPluginName()) + devicePath, err = mounter.EvalHostSymlinks(devicePath) + if err != nil { + return volumeToMount.GenerateError("MapVolume.EvalHostSymlinks failed", err) + } + // Map device to global and pod device map path volumeMapPath, volName := blockVolumeMapper.GetPodDeviceMapPath() mapErr = blockVolumeMapper.MapDevice(devicePath, globalMapPath, volumeMapPath, volName, volumeToMount.Pod.UID)