Skip to content

Commit

Permalink
fix: allow mountPaths with traling slash (argoproj#5521)
Browse files Browse the repository at this point in the history
Signed-off-by: Riccardo Piccoli <riccardo.piccoli@gmail.com>
  • Loading branch information
rccrdpccl authored Mar 30, 2021
1 parent 4c3b0ac commit 872897f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 12 deletions.
24 changes: 14 additions & 10 deletions workflow/common/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"net/http"
"os/exec"
"runtime"
"sort"
"strings"
"time"

Expand All @@ -34,18 +35,21 @@ import (
// user specified volumeMounts in the template, and returns the deepest volumeMount
// (if any). A return value of nil indicates the path is not under any volumeMount.
func FindOverlappingVolume(tmpl *wfv1.Template, path string) *apiv1.VolumeMount {
var volMnt *apiv1.VolumeMount
deepestLen := 0
for _, mnt := range tmpl.GetVolumeMounts() {
if path != mnt.MountPath && !strings.HasPrefix(path, mnt.MountPath+"/") {
continue
}
if len(mnt.MountPath) > deepestLen {
volMnt = &mnt
deepestLen = len(mnt.MountPath)
volumeMounts := tmpl.GetVolumeMounts()
sort.Slice(volumeMounts, func(i, j int) bool {
return len(volumeMounts[i].MountPath) > len(volumeMounts[j].MountPath)
})
for _, mnt := range volumeMounts {
normalizedMountPath := strings.TrimRight(mnt.MountPath, "/")
if path == normalizedMountPath || isSubPath(path, normalizedMountPath) {
return &mnt
}
}
return volMnt
return nil
}

func isSubPath(path string, normalizedMountPath string) bool {
return strings.HasPrefix(path, normalizedMountPath+"/")
}

type RoundTripCallback func(conn *websocket.Conn, resp *http.Response, err error) error
Expand Down
28 changes: 26 additions & 2 deletions workflow/common/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,38 @@ func TestFindOverlappingVolume(t *testing.T) {
Name: "workdir",
MountPath: "/user-mount",
}
volMntTrailing := corev1.VolumeMount{
Name: "aux",
MountPath: "/trailing-slash/",
}
templateWithVolMount := &wfv1.Template{
Container: &corev1.Container{
VolumeMounts: []corev1.VolumeMount{volMnt},
VolumeMounts: []corev1.VolumeMount{volMnt, volMntTrailing},
},
}

deeperVolMnt := corev1.VolumeMount{
Name: "workdir",
MountPath: "/user-mount/deeper",
}

templateWithDeeperVolMount := &wfv1.Template{
Container: &corev1.Container{
VolumeMounts: []corev1.VolumeMount{volMnt, deeperVolMnt},
},
}

assert.Equal(t, &volMnt, FindOverlappingVolume(templateWithVolMount, "/user-mount"))
assert.Equal(t, &volMnt, FindOverlappingVolume(templateWithVolMount, "/user-mount/subdir"))
assert.Nil(t, FindOverlappingVolume(templateWithVolMount, "/user-mount-coincidental-prefix"))
assert.Equal(t, &volMnt, FindOverlappingVolume(templateWithVolMount, "/user-mount/"))

assert.Equal(t, &deeperVolMnt, FindOverlappingVolume(templateWithDeeperVolMount, "/user-mount/deeper"))
assert.Equal(t, &deeperVolMnt, FindOverlappingVolume(templateWithDeeperVolMount, "/user-mount/deeper/with-subdir"))

assert.Equal(t, &volMntTrailing, FindOverlappingVolume(templateWithVolMount, "/trailing-slash/"))
assert.Equal(t, &volMntTrailing, FindOverlappingVolume(templateWithVolMount, "/trailing-slash/with-subpath"))

assert.Nil(t, FindOverlappingVolume(templateWithVolMount, "/user-mount-coincidental-prefix/"))
}

func TestUnknownFieldEnforcerForWorkflowStep(t *testing.T) {
Expand Down

0 comments on commit 872897f

Please sign in to comment.