Skip to content

Commit

Permalink
Ensure mount destination is clean, no trailing slash
Browse files Browse the repository at this point in the history
Signed-off-by: Eduardo Vega <[email protected]>
  • Loading branch information
EduardoVega committed Apr 18, 2021
1 parent 6ff56ab commit 18d462c
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 3 deletions.
9 changes: 6 additions & 3 deletions pkg/specgen/generate/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,13 @@ func finalizeMounts(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Ru
}

for _, m := range s.Mounts {
if _, ok := unifiedMounts[m.Destination]; ok {
return nil, nil, nil, errors.Wrapf(errDuplicateDest, "conflict in specified mounts - multiple mounts at %q", m.Destination)
// Ensure that mount dest is clean, so that it can be
// compared against named volumes and avoid duplicate mounts.
cleanDestination := filepath.Clean(m.Destination)
if _, ok := unifiedMounts[cleanDestination]; ok {
return nil, nil, nil, errors.Wrapf(errDuplicateDest, "conflict in specified mounts - multiple mounts at %q", cleanDestination)
}
unifiedMounts[m.Destination] = m
unifiedMounts[cleanDestination] = m
}

for _, m := range commonMounts {
Expand Down
48 changes: 48 additions & 0 deletions test/e2e/play_kube_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1894,6 +1894,54 @@ spec:
Expect(inspect.OutputToString()).To(ContainSubstring(correct))
})

It("podman play kube test duplicate volume destination between host path and image volumes", func() {
// Create host test directory and file
testdir := "testdir"
testfile := "testfile"

hostPathDir := filepath.Join(tempdir, testdir)
err := os.Mkdir(hostPathDir, 0755)
Expect(err).To(BeNil())

hostPathDirFile := filepath.Join(hostPathDir, testfile)
f, err := os.Create(hostPathDirFile)
Expect(err).To(BeNil())
f.Close()

// Create container image with named volume
containerfile := fmt.Sprintf(`
FROM %s
VOLUME %s`, ALPINE, hostPathDir+"/")

image := "podman-kube-test:podman"
podmanTest.BuildImage(containerfile, image, "false")

// Create and play kube pod
ctr := getCtr(withVolumeMount(hostPathDir+"/", false), withImage(image))
pod := getPod(withCtr(ctr), withVolume(getHostPathVolume("Directory", hostPathDir+"/")))
err = generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())

kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
kube.WaitWithDefaultTimeout()
Expect(kube.ExitCode()).To(Equal(0))

result := podmanTest.Podman([]string{"exec", getCtrNameInPod(pod), "ls", hostPathDir + "/" + testfile})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))

inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod)})
inspect.WaitWithDefaultTimeout()
Expect(inspect.ExitCode()).To(Equal(0))

// If two volumes are specified and share the same destination,
// only one will be mounted. Host path volumes take precedence.
ctrJSON := inspect.InspectContainerToJSON()
Expect(len(ctrJSON[0].Mounts)).To(Equal(1))
Expect(ctrJSON[0].Mounts[0].Type).To(Equal("bind"))

})

It("podman play kube test with PersistentVolumeClaim volume", func() {
volumeName := "namedVolume"

Expand Down

0 comments on commit 18d462c

Please sign in to comment.