Allow EvalSymlinks target not to exist.

Various NsEnterMounter function need to resolve the part of the path that
exists and blindly add the part that doesn't.
This commit is contained in:
Jan Safranek 2018-05-22 12:56:25 +02:00
parent 97b5299cd7
commit 7450d1b427
2 changed files with 27 additions and 13 deletions

View File

@ -329,7 +329,7 @@ func (mounter *NsenterMounter) SafeMakeDir(pathname string, base string, perm os
} }
func (mounter *NsenterMounter) GetMountRefs(pathname string) ([]string, error) { func (mounter *NsenterMounter) GetMountRefs(pathname string) ([]string, error) {
hostpath, err := mounter.ne.EvalSymlinks(pathname) hostpath, err := mounter.ne.EvalSymlinks(pathname, true /* mustExist */)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -337,10 +337,11 @@ func (mounter *NsenterMounter) GetMountRefs(pathname string) ([]string, error) {
} }
func (mounter *NsenterMounter) GetFSGroup(pathname string) (int64, error) { func (mounter *NsenterMounter) GetFSGroup(pathname string) (int64, error) {
kubeletpath, err := mounter.ne.KubeletPath(pathname) hostPath, err := mounter.ne.EvalSymlinks(pathname, true /* mustExist */)
if err != nil { if err != nil {
return 0, err return -1, err
} }
kubeletpath := mounter.ne.KubeletPath(hostPath)
return getFSGroup(kubeletpath) return getFSGroup(kubeletpath)
} }
@ -349,9 +350,10 @@ func (mounter *NsenterMounter) GetSELinuxSupport(pathname string) (bool, error)
} }
func (mounter *NsenterMounter) GetMode(pathname string) (os.FileMode, error) { func (mounter *NsenterMounter) GetMode(pathname string) (os.FileMode, error) {
kubeletpath, err := mounter.ne.KubeletPath(pathname) hostPath, err := mounter.ne.EvalSymlinks(pathname, true /* mustExist */)
if err != nil { if err != nil {
return 0, err return 0, err
} }
kubeletpath := mounter.ne.KubeletPath(hostPath)
return getMode(kubeletpath) return getMode(kubeletpath)
} }

View File

@ -128,8 +128,23 @@ func (ne *Nsenter) SupportsSystemd() (string, bool) {
// EvalSymlinks returns the path name on the host after evaluating symlinks on the // EvalSymlinks returns the path name on the host after evaluating symlinks on the
// host. // host.
func (ne *Nsenter) EvalSymlinks(pathname string) (string, error) { // mustExist makes EvalSymlinks to return error when the path does not
args := []string{"-m", pathname} // exist. When it's false, it evaluates symlinks of the existing part and
// blindly adds the non-existing part:
// pathname: /mnt/volume/non/existing/directory
// /mnt/volume exists
// non/existing/directory does not exist
// -> It resolves symlinks in /mnt/volume to say /mnt/foo and returns
// /mnt/foo/non/existing/directory.
func (ne *Nsenter) EvalSymlinks(pathname string, mustExist bool) (string, error) {
var args []string
if mustExist {
// "realpath -e: all components of the path must exist"
args = []string{"-e", pathname}
} else {
// "realpath -m: no path components need exist or be a directory"
args = []string{"-m", pathname}
}
outBytes, err := ne.Exec("realpath", args).CombinedOutput() outBytes, err := ne.Exec("realpath", args).CombinedOutput()
if err != nil { if err != nil {
glog.Infof("failed to resolve symbolic links on %s: %v", pathname, err) glog.Infof("failed to resolve symbolic links on %s: %v", pathname, err)
@ -139,11 +154,8 @@ func (ne *Nsenter) EvalSymlinks(pathname string) (string, error) {
} }
// KubeletPath returns the path name that can be accessed by containerized // KubeletPath returns the path name that can be accessed by containerized
// kubelet, after evaluating symlinks on the host. // kubelet. It is recommended to resolve symlinks on the host by EvalSymlinks
func (ne *Nsenter) KubeletPath(pathname string) (string, error) { // before calling this function
hostpath, err := ne.EvalSymlinks(pathname) func (ne *Nsenter) KubeletPath(pathname string) string {
if err != nil { return filepath.Join(hostRootFsPath, pathname)
return "", err
}
return filepath.Join(hostRootFsPath, hostpath), nil
} }