Merge pull request #63272 from andyzhangx/IsLikelyNotMountPoint-windows-fix
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. fix mount unmount failure for a Windows pod **What this PR does / why we need it**: `IsLikelyNotMountPoint` func does not return correctly, for invalid symlink, it should return true(not a mount point), now it will always return false:7711d88661/pkg/util/mount/mount_windows.go (L141-L148)7711d88661/pkg/volume/util/util.go (L147-L163)**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes #63249 **Special notes for your reviewer**: **Release note**: ``` fix mount unmount failure for a Windows pod ``` /sig windows /assign @msau42
This commit is contained in:
		@@ -145,7 +145,11 @@ func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) {
 | 
			
		||||
	}
 | 
			
		||||
	// If current file is a symlink, then it is a mountpoint.
 | 
			
		||||
	if stat.Mode()&os.ModeSymlink != 0 {
 | 
			
		||||
		return false, nil
 | 
			
		||||
		target, err := os.Readlink(file)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return true, fmt.Errorf("Readlink error: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		return !mounter.ExistsPath(target), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -629,3 +629,94 @@ func TestGetFileType(t *testing.T) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestIsLikelyNotMountPoint(t *testing.T) {
 | 
			
		||||
	mounter := Mounter{"fake/path"}
 | 
			
		||||
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		fileName       string
 | 
			
		||||
		targetLinkName string
 | 
			
		||||
		setUp          func(base, fileName, targetLinkName string) error
 | 
			
		||||
		expectedResult bool
 | 
			
		||||
		expectError    bool
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			"Dir",
 | 
			
		||||
			"",
 | 
			
		||||
			func(base, fileName, targetLinkName string) error {
 | 
			
		||||
				return os.Mkdir(filepath.Join(base, fileName), 0750)
 | 
			
		||||
			},
 | 
			
		||||
			true,
 | 
			
		||||
			false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"InvalidDir",
 | 
			
		||||
			"",
 | 
			
		||||
			func(base, fileName, targetLinkName string) error {
 | 
			
		||||
				return nil
 | 
			
		||||
			},
 | 
			
		||||
			true,
 | 
			
		||||
			true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ValidSymLink",
 | 
			
		||||
			"targetSymLink",
 | 
			
		||||
			func(base, fileName, targetLinkName string) error {
 | 
			
		||||
				targeLinkPath := filepath.Join(base, targetLinkName)
 | 
			
		||||
				if err := os.Mkdir(targeLinkPath, 0750); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				filePath := filepath.Join(base, fileName)
 | 
			
		||||
				if err := makeLink(filePath, targeLinkPath); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				return nil
 | 
			
		||||
			},
 | 
			
		||||
			false,
 | 
			
		||||
			false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"InvalidSymLink",
 | 
			
		||||
			"targetSymLink2",
 | 
			
		||||
			func(base, fileName, targetLinkName string) error {
 | 
			
		||||
				targeLinkPath := filepath.Join(base, targetLinkName)
 | 
			
		||||
				if err := os.Mkdir(targeLinkPath, 0750); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				filePath := filepath.Join(base, fileName)
 | 
			
		||||
				if err := makeLink(filePath, targeLinkPath); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				return removeLink(targeLinkPath)
 | 
			
		||||
			},
 | 
			
		||||
			true,
 | 
			
		||||
			false,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		base, err := ioutil.TempDir("", test.fileName)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf(err.Error())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		defer os.RemoveAll(base)
 | 
			
		||||
 | 
			
		||||
		if err := test.setUp(base, test.fileName, test.targetLinkName); err != nil {
 | 
			
		||||
			t.Fatalf("unexpected error in setUp(%s, %s): %v", test.fileName, test.targetLinkName, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		filePath := filepath.Join(base, test.fileName)
 | 
			
		||||
		result, err := mounter.IsLikelyNotMountPoint(filePath)
 | 
			
		||||
		assert.Equal(t, result, test.expectedResult, "Expect result not equal with IsLikelyNotMountPoint(%s) return: %q, expected: %q",
 | 
			
		||||
			filePath, result, test.expectedResult)
 | 
			
		||||
 | 
			
		||||
		if test.expectError {
 | 
			
		||||
			assert.NotNil(t, err, "Expect error during IsLikelyNotMountPoint(%s)", filePath)
 | 
			
		||||
		} else {
 | 
			
		||||
			assert.Nil(t, err, "Expect error is nil during IsLikelyNotMountPoint(%s)", filePath)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user