mirror of https://github.com/k3s-io/k3s
Correctly handle named pipe host mounts for Windows
Signed-off-by: Deep Debroy <ddebroy@docker.com>pull/58/head
parent
2f349d58df
commit
b4bb5dd430
|
@ -215,14 +215,15 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h
|
|||
}
|
||||
}
|
||||
|
||||
// Docker Volume Mounts fail on Windows if it is not of the form C:/
|
||||
// Docker Volume Mounts fail on Windows if it is not of the form C:/ nor a named pipe starting with \\.\pipe\
|
||||
containerPath := mount.MountPath
|
||||
if runtime.GOOS == "windows" {
|
||||
if (strings.HasPrefix(hostPath, "/") || strings.HasPrefix(hostPath, "\\")) && !strings.Contains(hostPath, ":") {
|
||||
if !volumeutil.IsWindowsNamedPipe(runtime.GOOS, hostPath) && (strings.HasPrefix(hostPath, "/") || strings.HasPrefix(hostPath, "\\")) && !strings.Contains(hostPath, ":") {
|
||||
hostPath = "c:" + hostPath
|
||||
}
|
||||
}
|
||||
if !filepath.IsAbs(containerPath) {
|
||||
// IsAbs returns false for named pipes (\\.\pipe\...) in Windows. So check for it specifically and skip MakeAbsolutePath
|
||||
if !volumeutil.IsWindowsNamedPipe(runtime.GOOS, containerPath) && !filepath.IsAbs(containerPath) {
|
||||
containerPath = volumeutil.MakeAbsolutePath(runtime.GOOS, containerPath)
|
||||
}
|
||||
|
||||
|
|
|
@ -945,6 +945,13 @@ func CheckPersistentVolumeClaimModeBlock(pvc *v1.PersistentVolumeClaim) bool {
|
|||
return utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) && pvc.Spec.VolumeMode != nil && *pvc.Spec.VolumeMode == v1.PersistentVolumeBlock
|
||||
}
|
||||
|
||||
func IsWindowsNamedPipe(goos, path string) bool {
|
||||
if goos == "windows" && strings.HasPrefix(path, `\\.\pipe\`) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// MakeAbsolutePath convert path to absolute path according to GOOS
|
||||
func MakeAbsolutePath(goos, path string) string {
|
||||
if goos != "windows" {
|
||||
|
|
|
@ -2373,6 +2373,47 @@ func TestGetWindowsPath(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestIsWindowsNamedPipe(t *testing.T) {
|
||||
tests := []struct {
|
||||
goos string
|
||||
path string
|
||||
isNamedPipe bool
|
||||
}{
|
||||
{
|
||||
goos: "linux",
|
||||
path: `/usr/bin`,
|
||||
isNamedPipe: false,
|
||||
},
|
||||
{
|
||||
goos: "linux",
|
||||
path: `\\.\pipe\foo`,
|
||||
isNamedPipe: false,
|
||||
},
|
||||
{
|
||||
goos: "windows",
|
||||
path: `C:\foo`,
|
||||
isNamedPipe: false,
|
||||
},
|
||||
{
|
||||
goos: "windows",
|
||||
path: `\\.\invalid`,
|
||||
isNamedPipe: false,
|
||||
},
|
||||
{
|
||||
goos: "windows",
|
||||
path: `\\.\pipe\valid_pipe`,
|
||||
isNamedPipe: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
result := IsWindowsNamedPipe(test.goos, test.path)
|
||||
if result != test.isNamedPipe {
|
||||
t.Errorf("IsWindowsNamedPipe(%v) returned (%v), expected (%v)", test.path, result, test.isNamedPipe)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestMakeAbsolutePath(t *testing.T) {
|
||||
tests := []struct {
|
||||
goos string
|
||||
|
|
Loading…
Reference in New Issue