Merge pull request #16803 from cdoern/subpath

add support for subpath in play kube for named volumes
This commit is contained in:
OpenShift Merge Robot 2022-12-12 12:37:59 -05:00 committed by GitHub
commit 0037bffbb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 69 additions and 0 deletions

View File

@ -254,6 +254,8 @@ type ContainerNamedVolume struct {
// IsAnonymous sets the named volume as anonymous even if it has a name
// This is used for emptyDir volumes from a kube yaml
IsAnonymous bool `json:"setAnonymous,omitempty"`
// SubPath determines which part of the Source will be mounted in the container
SubPath string
}
// ContainerOverlayVolume is an overlay volume that will be mounted into the
@ -440,6 +442,7 @@ func (c *Container) NamedVolumes() []*ContainerNamedVolume {
newVol.Name = vol.Name
newVol.Dest = vol.Dest
newVol.Options = vol.Options
newVol.SubPath = vol.SubPath
volumes = append(volumes, newVol)
}

View File

@ -157,6 +157,10 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) {
return nil, err
}
if len(namedVol.SubPath) > 0 {
mountPoint = filepath.Join(mountPoint, namedVol.SubPath)
}
overlayFlag := false
upperDir := ""
workDir := ""

View File

@ -1440,6 +1440,7 @@ func WithNamedVolumes(volumes []*ContainerNamedVolume) CtrCreateOption {
Dest: vol.Dest,
Options: mountOpts,
IsAnonymous: vol.IsAnonymous,
SubPath: vol.SubPath,
})
}

View File

@ -404,6 +404,7 @@ func createContainerOptions(rt *libpod.Runtime, s *specgen.SpecGenerator, pod *l
Dest: v.Dest,
Options: v.Options,
IsAnonymous: v.IsAnonymous,
SubPath: v.SubPath,
})
}
options = append(options, libpod.WithNamedVolumes(vols))

View File

@ -395,6 +395,7 @@ func ToSpecGen(ctx context.Context, opts *CtrSpecGenOptions) (*specgen.SpecGener
Dest: volume.MountPath,
Name: volumeSource.Source,
Options: options,
SubPath: volume.SubPath,
}
s.Volumes = append(s.Volumes, &namedVolume)
case KubeVolumeTypeConfigMap:

View File

@ -27,6 +27,8 @@ type NamedVolume struct {
// IsAnonymous sets the named volume as anonymous even if it has a name
// This is used for emptyDir volumes from a kube yaml
IsAnonymous bool
// SubPath stores the sub directory of the named volume to be mounted in the container
SubPath string
}
// OverlayVolume holds information about an overlay volume that will be mounted into

View File

@ -247,6 +247,28 @@ spec:
- containerPort: 80
`
var subpathTest = `
apiVersion: v1
kind: Pod
metadata:
name: testpod
spec:
containers:
- name: testctr
image: quay.io/libpod/alpine_nginx:latest
command:
- sleep
- inf
volumeMounts:
- mountPath: /var
name: testing
subPath: testing/onlythis
volumes:
- name: testing
persistentVolumeClaim:
claimName: testvol
`
var checkInfraImagePodYaml = `
apiVersion: v1
kind: Pod
@ -4460,4 +4482,39 @@ spec:
Expect(ps.OutputToStringArray()).To(HaveLen(0))
})
It("podman play kube with named volume subpaths", func() {
SkipIfRemote("volume export does not exist on remote")
volumeCreate := podmanTest.Podman([]string{"volume", "create", "testvol1"})
volumeCreate.WaitWithDefaultTimeout()
Expect(volumeCreate).Should(Exit(0))
session := podmanTest.Podman([]string{"run", "--volume", "testvol1:/data", ALPINE, "sh", "-c", "mkdir -p /data/testing/onlythis && touch /data/testing/onlythis/123.txt && echo hi >> /data/testing/onlythis/123.txt"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
tar := filepath.Join(podmanTest.TempDir, "out.tar")
session = podmanTest.Podman([]string{"volume", "export", "--output", tar, "testvol1"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
volumeCreate = podmanTest.Podman([]string{"volume", "create", "testvol"})
volumeCreate.WaitWithDefaultTimeout()
Expect(volumeCreate).Should(Exit(0))
volumeImp := podmanTest.Podman([]string{"volume", "import", "testvol", filepath.Join(podmanTest.TempDir, "out.tar")})
volumeImp.WaitWithDefaultTimeout()
Expect(volumeImp).Should(Exit(0))
err = writeYaml(subpathTest, kubeYaml)
Expect(err).ToNot(HaveOccurred())
playKube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
playKube.WaitWithDefaultTimeout()
Expect(playKube).Should(Exit(0))
exec := podmanTest.Podman([]string{"exec", "-it", "testpod-testctr", "cat", "/var/123.txt"})
exec.WaitWithDefaultTimeout()
Expect(exec).Should(Exit(0))
Expect(exec.OutputToString()).Should(Equal("hi"))
})
})