diff options
author | Peter Hunt <pehunt@redhat.com> | 2020-08-28 17:18:01 -0400 |
---|---|---|
committer | Peter Hunt <pehunt@redhat.com> | 2020-08-28 17:18:03 -0400 |
commit | 83531904da6e3fbf1593ca3c77b14058e8707a58 (patch) | |
tree | 66a90ea4f3ebf60e9420724ee2ed38da2fd0c491 | |
parent | c069e0bad9f4aa8da98c46d702f450ce41da6346 (diff) | |
download | podman-83531904da6e3fbf1593ca3c77b14058e8707a58.tar.gz podman-83531904da6e3fbf1593ca3c77b14058e8707a58.tar.bz2 podman-83531904da6e3fbf1593ca3c77b14058e8707a58.zip |
play kube: handle Socket HostPath type
as well as add test cases for it and the other HostPath types we currently support
Signed-off-by: Peter Hunt <pehunt@redhat.com>
-rw-r--r-- | pkg/domain/infra/abi/play.go | 11 | ||||
-rw-r--r-- | test/e2e/play_kube_test.go | 137 |
2 files changed, 146 insertions, 2 deletions
diff --git a/pkg/domain/infra/abi/play.go b/pkg/domain/infra/abi/play.go index 4ebc37cda..729cd143c 100644 --- a/pkg/domain/infra/abi/play.go +++ b/pkg/domain/infra/abi/play.go @@ -250,13 +250,22 @@ func (ic *ContainerEngine) playKubePod(ctx context.Context, podName string, podY if err := libpod.LabelVolumePath(hostPath.Path); err != nil { return nil, errors.Wrapf(err, "Error giving %s a label", hostPath.Path) } + case v1.HostPathSocket: + st, err := os.Stat(hostPath.Path) + if err != nil { + return nil, errors.Wrapf(err, "Error checking HostPathSocket") + } + if st.Mode()&os.ModeSocket != os.ModeSocket { + return nil, errors.Errorf("Error checking HostPathSocket: path %s is not a socket", hostPath.Path) + } + case v1.HostPathDirectory: case v1.HostPathFile: case v1.HostPathUnset: // do nothing here because we will verify the path exists in validateVolumeHostDir break default: - return nil, errors.Errorf("Directories are the only supported HostPath type") + return nil, errors.Errorf("Invalid HostPath type %v", hostPath.Type) } } diff --git a/test/e2e/play_kube_test.go b/test/e2e/play_kube_test.go index 053e27126..1379cb35d 100644 --- a/test/e2e/play_kube_test.go +++ b/test/e2e/play_kube_test.go @@ -94,6 +94,15 @@ spec: {{ end }} {{ end }} {{ end }} +{{ with .Volumes }} + volumes: + {{ range . }} + - name: {{ .Name }} + hostPath: + path: {{ .Path }} + type: {{ .Type }} + {{ end }} +{{ end }} status: {} ` @@ -186,6 +195,7 @@ var ( defaultCtrArg = []string{"-d", "1.5"} defaultCtrImage = ALPINE defaultPodName = "testPod" + defaultVolName = "testVol" defaultDeploymentName = "testDeployment" seccompPwdEPERM = []byte(`{"defaultAction":"SCMP_ACT_ALLOW","syscalls":[{"name":"getcwd","action":"SCMP_ACT_ERRNO"}]}`) ) @@ -240,6 +250,7 @@ type Pod struct { Name string Hostname string Ctrs []*Ctr + Volumes []*Volume Annotations map[string]string } @@ -247,7 +258,7 @@ type Pod struct { // and the configured options // if no containers are added, it will add the default container func getPod(options ...podOption) *Pod { - p := Pod{defaultPodName, "", make([]*Ctr, 0), make(map[string]string)} + p := Pod{defaultPodName, "", make([]*Ctr, 0), make([]*Volume, 0), make(map[string]string)} for _, option := range options { option(&p) } @@ -277,6 +288,12 @@ func withAnnotation(k, v string) podOption { } } +func withVolume(v *Volume) podOption { + return func(pod *Pod) { + pod.Volumes = append(pod.Volumes, v) + } +} + // Deployment describes the options a kube yaml can be configured at deployment level type Deployment struct { Name string @@ -412,6 +429,22 @@ func getCtrNameInPod(pod *Pod) string { return fmt.Sprintf("%s-%s", pod.Name, defaultCtrName) } +type Volume struct { + Name string + Path string + Type string +} + +// getVolume takes a type and a location for a volume +// giving it a default name of volName +func getVolume(vType, vPath string) *Volume { + return &Volume{ + Name: defaultVolName, + Path: vPath, + Type: vType, + } +} + var _ = Describe("Podman generate kube", func() { var ( tempdir string @@ -853,4 +886,106 @@ spec: Expect(inspect.ExitCode()).To(Equal(0)) Expect(inspect.OutputToString()).To(Equal("5000/tcp -> 127.0.0.100:5000")) }) + + It("podman play kube test with non-existent empty HostPath type volume", func() { + hostPathLocation := filepath.Join(tempdir, "file") + + pod := getPod(withVolume(getVolume(`""`, hostPathLocation))) + err := generatePodKubeYaml(pod, kubeYaml) + Expect(err).To(BeNil()) + + kube := podmanTest.Podman([]string{"play", "kube", kubeYaml}) + kube.WaitWithDefaultTimeout() + Expect(kube.ExitCode()).NotTo(Equal(0)) + }) + + It("podman play kube test with empty HostPath type volume", func() { + hostPathLocation := filepath.Join(tempdir, "file") + f, err := os.Create(hostPathLocation) + Expect(err).To(BeNil()) + f.Close() + + pod := getPod(withVolume(getVolume(`""`, hostPathLocation))) + err = generatePodKubeYaml(pod, kubeYaml) + Expect(err).To(BeNil()) + + kube := podmanTest.Podman([]string{"play", "kube", kubeYaml}) + kube.WaitWithDefaultTimeout() + Expect(kube.ExitCode()).To(Equal(0)) + }) + + It("podman play kube test with non-existent File HostPath type volume", func() { + hostPathLocation := filepath.Join(tempdir, "file") + + pod := getPod(withVolume(getVolume("File", hostPathLocation))) + err := generatePodKubeYaml(pod, kubeYaml) + Expect(err).To(BeNil()) + + kube := podmanTest.Podman([]string{"play", "kube", kubeYaml}) + kube.WaitWithDefaultTimeout() + Expect(kube.ExitCode()).NotTo(Equal(0)) + }) + + It("podman play kube test with File HostPath type volume", func() { + hostPathLocation := filepath.Join(tempdir, "file") + f, err := os.Create(hostPathLocation) + Expect(err).To(BeNil()) + f.Close() + + pod := getPod(withVolume(getVolume("File", hostPathLocation))) + err = generatePodKubeYaml(pod, kubeYaml) + Expect(err).To(BeNil()) + + kube := podmanTest.Podman([]string{"play", "kube", kubeYaml}) + kube.WaitWithDefaultTimeout() + Expect(kube.ExitCode()).To(Equal(0)) + }) + + It("podman play kube test with FileOrCreate HostPath type volume", func() { + hostPathLocation := filepath.Join(tempdir, "file") + + pod := getPod(withVolume(getVolume("FileOrCreate", hostPathLocation))) + err := generatePodKubeYaml(pod, kubeYaml) + Expect(err).To(BeNil()) + + kube := podmanTest.Podman([]string{"play", "kube", kubeYaml}) + kube.WaitWithDefaultTimeout() + Expect(kube.ExitCode()).To(Equal(0)) + + // the file should have been created + _, err = os.Stat(hostPathLocation) + Expect(err).To(BeNil()) + }) + + It("podman play kube test with DirectoryOrCreate HostPath type volume", func() { + hostPathLocation := filepath.Join(tempdir, "file") + + pod := getPod(withVolume(getVolume("DirectoryOrCreate", hostPathLocation))) + err := generatePodKubeYaml(pod, kubeYaml) + Expect(err).To(BeNil()) + + kube := podmanTest.Podman([]string{"play", "kube", kubeYaml}) + kube.WaitWithDefaultTimeout() + Expect(kube.ExitCode()).To(Equal(0)) + + // the file should have been created + st, err := os.Stat(hostPathLocation) + Expect(err).To(BeNil()) + Expect(st.Mode().IsDir()).To(Equal(true)) + }) + + It("podman play kube test with Socket HostPath type volume should fail if not socket", func() { + hostPathLocation := filepath.Join(tempdir, "file") + f, err := os.Create(hostPathLocation) + Expect(err).To(BeNil()) + f.Close() + + pod := getPod(withVolume(getVolume("Socket", hostPathLocation))) + err = generatePodKubeYaml(pod, kubeYaml) + Expect(err).To(BeNil()) + + kube := podmanTest.Podman([]string{"play", "kube", kubeYaml}) + kube.WaitWithDefaultTimeout() + Expect(kube.ExitCode()).NotTo(Equal(0)) + }) }) |