Merge pull request #16803 from cdoern/subpath
add support for subpath in play kube for named volumes
This commit is contained in:
commit
0037bffbb1
|
@ -254,6 +254,8 @@ type ContainerNamedVolume struct {
|
||||||
// IsAnonymous sets the named volume as anonymous even if it has a name
|
// IsAnonymous sets the named volume as anonymous even if it has a name
|
||||||
// This is used for emptyDir volumes from a kube yaml
|
// This is used for emptyDir volumes from a kube yaml
|
||||||
IsAnonymous bool `json:"setAnonymous,omitempty"`
|
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
|
// 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.Name = vol.Name
|
||||||
newVol.Dest = vol.Dest
|
newVol.Dest = vol.Dest
|
||||||
newVol.Options = vol.Options
|
newVol.Options = vol.Options
|
||||||
|
newVol.SubPath = vol.SubPath
|
||||||
volumes = append(volumes, newVol)
|
volumes = append(volumes, newVol)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,10 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(namedVol.SubPath) > 0 {
|
||||||
|
mountPoint = filepath.Join(mountPoint, namedVol.SubPath)
|
||||||
|
}
|
||||||
|
|
||||||
overlayFlag := false
|
overlayFlag := false
|
||||||
upperDir := ""
|
upperDir := ""
|
||||||
workDir := ""
|
workDir := ""
|
||||||
|
|
|
@ -1440,6 +1440,7 @@ func WithNamedVolumes(volumes []*ContainerNamedVolume) CtrCreateOption {
|
||||||
Dest: vol.Dest,
|
Dest: vol.Dest,
|
||||||
Options: mountOpts,
|
Options: mountOpts,
|
||||||
IsAnonymous: vol.IsAnonymous,
|
IsAnonymous: vol.IsAnonymous,
|
||||||
|
SubPath: vol.SubPath,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -404,6 +404,7 @@ func createContainerOptions(rt *libpod.Runtime, s *specgen.SpecGenerator, pod *l
|
||||||
Dest: v.Dest,
|
Dest: v.Dest,
|
||||||
Options: v.Options,
|
Options: v.Options,
|
||||||
IsAnonymous: v.IsAnonymous,
|
IsAnonymous: v.IsAnonymous,
|
||||||
|
SubPath: v.SubPath,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
options = append(options, libpod.WithNamedVolumes(vols))
|
options = append(options, libpod.WithNamedVolumes(vols))
|
||||||
|
|
|
@ -395,6 +395,7 @@ func ToSpecGen(ctx context.Context, opts *CtrSpecGenOptions) (*specgen.SpecGener
|
||||||
Dest: volume.MountPath,
|
Dest: volume.MountPath,
|
||||||
Name: volumeSource.Source,
|
Name: volumeSource.Source,
|
||||||
Options: options,
|
Options: options,
|
||||||
|
SubPath: volume.SubPath,
|
||||||
}
|
}
|
||||||
s.Volumes = append(s.Volumes, &namedVolume)
|
s.Volumes = append(s.Volumes, &namedVolume)
|
||||||
case KubeVolumeTypeConfigMap:
|
case KubeVolumeTypeConfigMap:
|
||||||
|
|
|
@ -27,6 +27,8 @@ type NamedVolume struct {
|
||||||
// IsAnonymous sets the named volume as anonymous even if it has a name
|
// IsAnonymous sets the named volume as anonymous even if it has a name
|
||||||
// This is used for emptyDir volumes from a kube yaml
|
// This is used for emptyDir volumes from a kube yaml
|
||||||
IsAnonymous bool
|
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
|
// OverlayVolume holds information about an overlay volume that will be mounted into
|
||||||
|
|
|
@ -247,6 +247,28 @@ spec:
|
||||||
- containerPort: 80
|
- 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 = `
|
var checkInfraImagePodYaml = `
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Pod
|
kind: Pod
|
||||||
|
@ -4460,4 +4482,39 @@ spec:
|
||||||
Expect(ps.OutputToStringArray()).To(HaveLen(0))
|
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"))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue