mirror of https://github.com/k3s-io/k3s
Merge pull request #55665 from brendandburns/path
Automatic merge from submit-queue (batch tested with PRs 55908, 55829, 55293, 55653, 55665). 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>. If mountPath is missing, prefix with root dir. If `mountPath` is not absolute, add the os-specific root directory as a prefix. Ref: https://github.com/kubernetes/kubernetes/pull/51240 https://groups.google.com/forum/#!topic/kubernetes-sig-storage/k_0Wr2kYkpU @thockin @saad-ali @andyzhangx Note to @thockin I left the validation in place, in seems like it is a net win, since it will give a decent error message to most people, but the fall-back defaulting is there if it doesn't catch 'c:' I'm happy to rip out the validation if that is preferable to everyone. Let me know. ```release-note If a non-absolute mountPath is passed to the kubelet, prefix it with the appropriate root path. ```pull/6/head
commit
01c74145c7
|
@ -1530,7 +1530,9 @@ type VolumeMount struct {
|
|||
// Optional: Defaults to false (read-write).
|
||||
// +optional
|
||||
ReadOnly bool
|
||||
// Required. Must not contain ':'.
|
||||
// Required. If the path is not an absolute path (e.g. some/path) it
|
||||
// will be prepended with the appropriate root prefix for the operating
|
||||
// system. On Linux this is '/', on Windows this is 'C:\'.
|
||||
MountPath string
|
||||
// Path within the volume from which the container's volume should be mounted.
|
||||
// Defaults to "" (volume's root).
|
||||
|
|
|
@ -1965,13 +1965,6 @@ func ValidateVolumeMounts(mounts []core.VolumeMount, volumes sets.String, contai
|
|||
if mountpoints.Has(mnt.MountPath) {
|
||||
allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must be unique"))
|
||||
}
|
||||
if !path.IsAbs(mnt.MountPath) {
|
||||
// also allow windows absolute path
|
||||
p := mnt.MountPath
|
||||
if len(p) < 2 || ((p[0] < 'A' || p[0] > 'Z') && (p[0] < 'a' || p[0] > 'z')) || p[1] != ':' {
|
||||
allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must be an absolute path"))
|
||||
}
|
||||
}
|
||||
mountpoints.Insert(mnt.MountPath)
|
||||
if len(mnt.SubPath) > 0 {
|
||||
allErrs = append(allErrs, validateLocalDescendingPath(mnt.SubPath, fldPath.Child("subPath"))...)
|
||||
|
|
|
@ -3849,10 +3849,8 @@ func TestValidateVolumeMounts(t *testing.T) {
|
|||
"empty name": {{Name: "", MountPath: "/foo"}},
|
||||
"name not found": {{Name: "", MountPath: "/foo"}},
|
||||
"empty mountpath": {{Name: "abc", MountPath: ""}},
|
||||
"relative mountpath": {{Name: "abc", MountPath: "bar"}},
|
||||
"mountpath collision": {{Name: "foo", MountPath: "/path/a"}, {Name: "bar", MountPath: "/path/a"}},
|
||||
"absolute subpath": {{Name: "abc", MountPath: "/bar", SubPath: "/baz"}},
|
||||
"windows absolute subpath": {{Name: "abc", MountPath: "D", SubPath: ""}},
|
||||
"subpath in ..": {{Name: "abc", MountPath: "/bar", SubPath: "../baz"}},
|
||||
"subpath contains ..": {{Name: "abc", MountPath: "/bar", SubPath: "baz/../bat"}},
|
||||
"subpath ends in ..": {{Name: "abc", MountPath: "/bar", SubPath: "./.."}},
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue