diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index 7a5063e44a1..58e8dc59e7d 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -111,6 +111,23 @@ func (kl *Kubelet) makeDevices(pod *v1.Pod, container *v1.Container) ([]kubecont return devices, nil } +func makeAbsolutePath(goos, path string) string { + if goos != "windows" { + return "/" + path + } + // These are all for windows + // If there is a colon, give up. + if strings.Contains(path, ":") { + return path + } + // If there is a slash, but no drive, add 'c:' + if strings.HasPrefix(path, "/") || strings.HasPrefix(path, "\\") { + return "c:" + path + } + // Otherwise, add 'c:\' + return "c:\\" + path +} + // makeMounts determines the mount points for the given container. func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, hostDomain, podIP string, podVolumes kubecontainer.VolumeMap) ([]kubecontainer.Mount, error) { // Kubernetes only mounts on /etc/hosts if: @@ -187,9 +204,9 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h if (strings.HasPrefix(hostPath, "/") || strings.HasPrefix(hostPath, "\\")) && !strings.Contains(hostPath, ":") { hostPath = "c:" + hostPath } - if (strings.HasPrefix(containerPath, "/") || strings.HasPrefix(containerPath, "\\")) && !strings.Contains(containerPath, ":") { - containerPath = "c:" + containerPath - } + } + if !filepath.IsAbs(containerPath) { + containerPath = makeAbsolutePath(runtime.GOOS, containerPath) } propagation, err := translateMountPropagation(mount.MountPropagation) diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index 5b759d5d1a5..79e1f15361a 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -49,6 +49,52 @@ import ( "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" ) +func TestMakeAbsolutePath(t *testing.T) { + tests := []struct { + goos string + path string + expectedPath string + name string + }{ + { + goos: "linux", + path: "non-absolute/path", + expectedPath: "/non-absolute/path", + name: "basic linux", + }, + { + goos: "windows", + path: "some\\path", + expectedPath: "c:\\some\\path", + name: "basic windows", + }, + { + goos: "windows", + path: "/some/path", + expectedPath: "c:/some/path", + name: "linux path on windows", + }, + { + goos: "windows", + path: "\\some\\path", + expectedPath: "c:\\some\\path", + name: "windows path no drive", + }, + { + goos: "windows", + path: "\\:\\some\\path", + expectedPath: "\\:\\some\\path", + name: "windows path with colon", + }, + } + for _, test := range tests { + path := makeAbsolutePath(test.goos, test.path) + if path != test.expectedPath { + t.Errorf("[%s] Expected %s saw %s", test.name, test.expectedPath, path) + } + } +} + func TestMakeMounts(t *testing.T) { bTrue := true propagationHostToContainer := v1.MountPropagationHostToContainer