summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/apiv2/10-images.at49
-rw-r--r--test/apiv2/40-pods.at6
-rw-r--r--test/buildah-bud/buildah-tests.diff42
-rw-r--r--test/e2e/build/basicalpine/Containerfile2
-rw-r--r--test/e2e/build/basicalpine/Containerfile.path2
-rw-r--r--test/e2e/build/basicalpine/Containerfile.volume2
-rw-r--r--test/e2e/build/squash/Dockerfile.squash-a2
-rw-r--r--test/e2e/build/squash/Dockerfile.squash-c2
-rw-r--r--test/e2e/build_test.go35
-rw-r--r--test/e2e/containers_conf_test.go2
-rw-r--r--test/e2e/exec_test.go4
-rw-r--r--test/e2e/generate_kube_test.go36
-rw-r--r--test/e2e/play_kube_test.go366
-rw-r--r--test/e2e/prune_test.go7
-rw-r--r--test/e2e/ps_test.go4
-rw-r--r--test/e2e/rmi_test.go19
-rw-r--r--test/e2e/run_passwd_test.go9
-rw-r--r--test/e2e/run_privileged_test.go16
-rw-r--r--test/e2e/run_security_labels_test.go7
-rw-r--r--test/e2e/run_test.go12
-rw-r--r--test/e2e/run_volume_test.go35
-rw-r--r--test/e2e/run_working_dir_test.go5
-rw-r--r--test/e2e/runlabel_test.go20
-rw-r--r--test/e2e/system_df_test.go2
-rw-r--r--test/python/docker/compat/test_images.py2
-rw-r--r--test/system/070-build.bats27
-rw-r--r--test/system/120-load.bats11
-rw-r--r--test/system/450-interactive.bats87
-rw-r--r--test/system/helpers.bash8
29 files changed, 680 insertions, 141 deletions
diff --git a/test/apiv2/10-images.at b/test/apiv2/10-images.at
index 4ebaeff45..f854d38ab 100644
--- a/test/apiv2/10-images.at
+++ b/test/apiv2/10-images.at
@@ -77,6 +77,55 @@ for i in $iid ${iid:0:12} $PODMAN_TEST_IMAGE_NAME; do
t GET "libpod/images/$i/get?compress=false" 200 '[POSIX tar archive]'
done
+#compat api list images sanity checks
+t GET images/json?filters='garb1age}' 500 \
+ .cause="invalid character 'g' looking for beginning of value"
+t GET images/json?filters='{"label":["testl' 500 \
+ .cause="unexpected end of JSON input"
+
+#libpod api list images sanity checks
+t GET libpod/images/json?filters='garb1age}' 500 \
+ .cause="invalid character 'g' looking for beginning of value"
+t GET libpod/images/json?filters='{"label":["testl' 500 \
+ .cause="unexpected end of JSON input"
+
+# Prune images - bad filter input
+t POST images/prune?filters='garb1age}' 500 \
+ .cause="invalid character 'g' looking for beginning of value"
+t POST libpod/images/prune?filters='garb1age}' 500 \
+ .cause="invalid character 'g' looking for beginning of value"
+
+## Prune images with illformed label
+t POST images/prune?filters='{"label":["tes' 500 \
+ .cause="unexpected end of JSON input"
+t POST libpod/images/prune?filters='{"label":["tes' 500 \
+ .cause="unexpected end of JSON input"
+
+
+#create, list and remove dangling image
+podman image build -t test:test -<<EOF
+from alpine
+RUN >file1
+EOF
+
+podman image build -t test:test --label xyz -<<EOF
+from alpine
+RUN >file2
+EOF
+
+t GET images/json?filters='{"dangling":["true"]}' 200 length=1
+t POST images/prune?filters='{"dangling":["true"]}' 200
+t GET images/json?filters='{"dangling":["true"]}' 200 length=0
+
+#label filter check in libpod and compat
+t GET images/json?filters='{"label":["xyz"]}' 200 length=1
+t GET libpod/images/json?filters='{"label":["xyz"]}' 200 length=1
+
+t DELETE libpod/images/test:test 200
+
+t GET images/json?filters='{"label":["xyz"]}' 200 length=0
+t GET libpod/images/json?filters='{"label":["xyz"]}' 200 length=0
+
# Export more than one image
# FIXME FIXME FIXME, this doesn't work:
# not ok 64 [10-images] GET images/get?names=alpine,busybox : status
diff --git a/test/apiv2/40-pods.at b/test/apiv2/40-pods.at
index f3272c41e..94c72dbaa 100644
--- a/test/apiv2/40-pods.at
+++ b/test/apiv2/40-pods.at
@@ -116,6 +116,12 @@ t GET libpod/pods/foo/top?ps_args=args,pid 200 \
.Titles[0]="COMMAND" \
.Titles[1]="PID" \
+#api list pods sanity checks
+t GET libpod/pods/json?filters='garb1age}' 400 \
+ .cause="invalid character 'g' looking for beginning of value"
+t GET libpod/pods/json?filters='{"label":["testl' 400 \
+ .cause="unexpected end of JSON input"
+
# FIXME: I'm not sure what 'prune' is supposed to do; as of 20200224 it
# just returns 200 (ok) with empty result list.
#t POST libpod/pods/prune 200 # FIXME: 2020-02-24 returns 200 {}
diff --git a/test/buildah-bud/buildah-tests.diff b/test/buildah-bud/buildah-tests.diff
index 92adabcac..ad35e5926 100644
--- a/test/buildah-bud/buildah-tests.diff
+++ b/test/buildah-bud/buildah-tests.diff
@@ -1,4 +1,4 @@
-From c85882a8f7fb6efbf4d59dfe8340bfbef57ccd48 Mon Sep 17 00:00:00 2001
+From a49a2e48421c6f3bb1a56ae372de1f3d1a45d1f1 Mon Sep 17 00:00:00 2001
From: Ed Santiago <santiago@redhat.com>
Date: Tue, 9 Feb 2021 17:28:05 -0700
Subject: [PATCH] tweaks for running buildah tests under podman
@@ -10,7 +10,7 @@ Signed-off-by: Ed Santiago <santiago@redhat.com>
2 files changed, 40 insertions(+), 14 deletions(-)
diff --git a/tests/bud.bats b/tests/bud.bats
-index 1efc3c58..9a39d594 100644
+index cf55d9a4..60cb6f96 100644
--- a/tests/bud.bats
+++ b/tests/bud.bats
@@ -4,7 +4,7 @@ load helpers
@@ -22,7 +22,7 @@ index 1efc3c58..9a39d594 100644
}
@test "bud with --dns* flags" {
-@@ -95,6 +95,7 @@ symlink(subdir)"
+@@ -117,6 +117,7 @@ symlink(subdir)"
}
@test "bud-flags-order-verification" {
@@ -30,7 +30,7 @@ index 1efc3c58..9a39d594 100644
run_buildah 125 bud /tmp/tmpdockerfile/ -t blabla
check_options_flag_err "-t"
-@@ -1324,13 +1325,13 @@ function _test_http() {
+@@ -1416,13 +1417,13 @@ function _test_http() {
@test "bud with dir for file but no Dockerfile in dir" {
target=alpine-image
run_buildah 125 bud --signature-policy ${TESTSDIR}/policy.json -t ${target} -f ${TESTSDIR}/bud/empty-dir ${TESTSDIR}/bud/empty-dir
@@ -46,7 +46,7 @@ index 1efc3c58..9a39d594 100644
}
@test "bud with ARG before FROM default value" {
-@@ -1742,7 +1743,9 @@ _EOF
+@@ -1834,7 +1835,9 @@ _EOF
run_buildah bud --signature-policy ${TESTSDIR}/policy.json --layers -t test-img-2 --build-arg TEST=foo -f Dockerfile4 ${TESTSDIR}/bud/build-arg
run_buildah inspect -f '{{.FromImageID}}' test-img-2
argsid="$output"
@@ -57,7 +57,7 @@ index 1efc3c58..9a39d594 100644
# Set the build-arg via an ENV in the local environment and verify that the cached layers are not used
export TEST=bar
-@@ -1795,6 +1798,7 @@ _EOF
+@@ -1887,6 +1890,7 @@ _EOF
}
@test "bud without any arguments should succeed" {
@@ -65,7 +65,7 @@ index 1efc3c58..9a39d594 100644
cd ${TESTSDIR}/bud/from-scratch
run_buildah bud --signature-policy ${TESTSDIR}/policy.json
}
-@@ -1802,7 +1806,7 @@ _EOF
+@@ -1894,7 +1898,7 @@ _EOF
@test "bud without any arguments should fail when no Dockerfile exist" {
cd $(mktemp -d)
run_buildah 125 bud --signature-policy ${TESTSDIR}/policy.json
@@ -74,7 +74,7 @@ index 1efc3c58..9a39d594 100644
}
@test "bud with specified context should fail if directory contains no Dockerfile" {
-@@ -1815,16 +1819,17 @@ _EOF
+@@ -1907,16 +1911,17 @@ _EOF
DIR=$(mktemp -d)
mkdir -p "$DIR"/Dockerfile
run_buildah 125 bud --signature-policy ${TESTSDIR}/policy.json "$DIR"
@@ -94,7 +94,7 @@ index 1efc3c58..9a39d594 100644
DIR=$(mktemp -d)
echo "FROM alpine" > "$DIR"/Dockerfile
run_buildah 0 bud --signature-policy ${TESTSDIR}/policy.json "$DIR"/Dockerfile
-@@ -1876,7 +1881,7 @@ _EOF
+@@ -1968,7 +1973,7 @@ _EOF
@test "bud-squash-hardlinks" {
_prefetch busybox
@@ -103,15 +103,7 @@ index 1efc3c58..9a39d594 100644
}
@test "bud with additional directory of devices" {
-@@ -2023,6 +2028,7 @@ _EOF
- }
-
- @test "bud pull never" {
-+ skip "FIXME: podman issue #9573"
- target=pull
- run_buildah 125 bud --signature-policy ${TESTSDIR}/policy.json -t ${target} --pull-never ${TESTSDIR}/bud/pull
- expect_output --substring "pull policy is \"never\" but \""
-@@ -2042,6 +2048,7 @@ _EOF
+@@ -2134,6 +2139,7 @@ _EOF
}
@test "bud with Containerfile should fail with nonexistent authfile" {
@@ -119,7 +111,7 @@ index 1efc3c58..9a39d594 100644
target=alpine-image
run_buildah 125 bud --authfile /tmp/nonexistent --signature-policy ${TESTSDIR}/policy.json -t ${target} ${TESTSDIR}/bud/containerfile
}
-@@ -2169,6 +2176,7 @@ EOM
+@@ -2261,6 +2267,7 @@ EOM
}
@test "bud with encrypted FROM image" {
@@ -127,7 +119,7 @@ index 1efc3c58..9a39d594 100644
_prefetch busybox
mkdir ${TESTDIR}/tmp
openssl genrsa -out ${TESTDIR}/tmp/mykey.pem 1024
-@@ -2241,8 +2249,6 @@ EOM
+@@ -2333,8 +2340,6 @@ EOM
_prefetch alpine
run_buildah bud --timestamp=0 --quiet --pull=false --signature-policy ${TESTSDIR}/policy.json -t timestamp -f Dockerfile.1 ${TESTSDIR}/bud/cache-stages
cid=$output
@@ -136,8 +128,16 @@ index 1efc3c58..9a39d594 100644
run_buildah inspect --format '{{ .OCIv1.Created }}' timestamp
expect_output --substring "1970-01-01"
run_buildah inspect --format '{{ .History }}' timestamp
+@@ -2594,6 +2599,7 @@ _EOF
+ }
+
+ @test "bud with --arch flag" {
++ skip "FIXME: for podman, emergency skip to get CI going"
+ _prefetch alpine
+ mytmpdir=${TESTDIR}/my-dir
+ mkdir -p ${mytmpdir}
diff --git a/tests/helpers.bash b/tests/helpers.bash
-index 5623a0e7..9683360f 100644
+index b28fd2c3..d42a6b82 100644
--- a/tests/helpers.bash
+++ b/tests/helpers.bash
@@ -70,7 +70,7 @@ function _prefetch() {
diff --git a/test/e2e/build/basicalpine/Containerfile b/test/e2e/build/basicalpine/Containerfile
index 67fd37901..f6e07066c 100644
--- a/test/e2e/build/basicalpine/Containerfile
+++ b/test/e2e/build/basicalpine/Containerfile
@@ -1 +1 @@
-FROM alpine
+FROM quay.io/libpod/alpine:latest
diff --git a/test/e2e/build/basicalpine/Containerfile.path b/test/e2e/build/basicalpine/Containerfile.path
index d2b03a6b8..a1349eb05 100644
--- a/test/e2e/build/basicalpine/Containerfile.path
+++ b/test/e2e/build/basicalpine/Containerfile.path
@@ -1,2 +1,2 @@
-FROM alpine
+FROM quay.io/libpod/alpine:latest
ENV PATH=/tmp:/bin:/usr/bin:/usr/sbin
diff --git a/test/e2e/build/basicalpine/Containerfile.volume b/test/e2e/build/basicalpine/Containerfile.volume
index 6a4fc8242..283d6376e 100644
--- a/test/e2e/build/basicalpine/Containerfile.volume
+++ b/test/e2e/build/basicalpine/Containerfile.volume
@@ -1,2 +1,2 @@
-FROM alpine
+FROM quay.io/libpod/alpine:latest
VOLUME "/volume0"
diff --git a/test/e2e/build/squash/Dockerfile.squash-a b/test/e2e/build/squash/Dockerfile.squash-a
index f084e093d..ade3eafce 100644
--- a/test/e2e/build/squash/Dockerfile.squash-a
+++ b/test/e2e/build/squash/Dockerfile.squash-a
@@ -1,2 +1,2 @@
-FROM busybox:latest
+FROM quay.io/libpod/busybox:latest
ADD alpinetest.tgz /data
diff --git a/test/e2e/build/squash/Dockerfile.squash-c b/test/e2e/build/squash/Dockerfile.squash-c
index df9c90388..63bf84e69 100644
--- a/test/e2e/build/squash/Dockerfile.squash-c
+++ b/test/e2e/build/squash/Dockerfile.squash-c
@@ -1,3 +1,3 @@
-FROM busybox:latest
+FROM quay.io/libpod/busybox:latest
ADD alpinetest.tgz /data
RUN rm -rf /data
diff --git a/test/e2e/build_test.go b/test/e2e/build_test.go
index e061a2154..95ed23313 100644
--- a/test/e2e/build_test.go
+++ b/test/e2e/build_test.go
@@ -1,6 +1,7 @@
package integration
import (
+ "fmt"
"io/ioutil"
"os"
"path/filepath"
@@ -150,7 +151,7 @@ var _ = Describe("Podman build", func() {
}
fakeFile := filepath.Join(os.TempDir(), "Containerfile")
- Expect(ioutil.WriteFile(fakeFile, []byte("FROM alpine"), 0755)).To(BeNil())
+ Expect(ioutil.WriteFile(fakeFile, []byte(fmt.Sprintf("FROM %s", ALPINE)), 0755)).To(BeNil())
targetFile := filepath.Join(targetPath, "Containerfile")
Expect(ioutil.WriteFile(targetFile, []byte("FROM scratch"), 0755)).To(BeNil())
@@ -219,8 +220,8 @@ var _ = Describe("Podman build", func() {
podmanTest.StartRemoteService()
}
podmanTest.AddImageToRWStore(ALPINE)
- dockerfile := `FROM quay.io/libpod/alpine:latest
-RUN printenv http_proxy`
+ dockerfile := fmt.Sprintf(`FROM %s
+RUN printenv http_proxy`, ALPINE)
dockerfilePath := filepath.Join(podmanTest.TempDir, "Dockerfile")
err := ioutil.WriteFile(dockerfilePath, []byte(dockerfile), 0755)
@@ -263,9 +264,9 @@ RUN printenv http_proxy`
err = ioutil.WriteFile(dummyFile, []byte("dummy"), 0644)
Expect(err).To(BeNil())
- containerfile := `FROM quay.io/libpod/alpine:latest
+ containerfile := fmt.Sprintf(`FROM %s
ADD . /test
-RUN find /test`
+RUN find /test`, ALPINE)
containerfilePath := filepath.Join(targetPath, "Containerfile")
err = ioutil.WriteFile(containerfilePath, []byte(containerfile), 0644)
@@ -307,7 +308,7 @@ RUN find /test`
err = os.Mkdir(targetSubPath, 0755)
Expect(err).To(BeNil())
- containerfile := `FROM quay.io/libpod/alpine:latest`
+ containerfile := fmt.Sprintf("FROM %s", ALPINE)
containerfilePath := filepath.Join(targetSubPath, "Containerfile")
err = ioutil.WriteFile(containerfilePath, []byte(containerfile), 0644)
@@ -344,9 +345,9 @@ RUN find /test`
targetPath, err := CreateTempDirInTempDir()
Expect(err).To(BeNil())
- containerfile := `FROM quay.io/libpod/alpine:latest
+ containerfile := fmt.Sprintf(`FROM %s
ADD . /testfilter/
-RUN find /testfilter/`
+RUN find /testfilter/`, ALPINE)
containerfilePath := filepath.Join(targetPath, "Containerfile")
err = ioutil.WriteFile(containerfilePath, []byte(containerfile), 0644)
@@ -428,10 +429,10 @@ subdir**`
Expect(os.Chdir(targetSubPath)).To(BeNil())
Expect(os.Symlink("dummy", "dummy-symlink")).To(BeNil())
- containerfile := `FROM quay.io/libpod/alpine:latest
+ containerfile := fmt.Sprintf(`FROM %s
ADD . /test
RUN find /test
-RUN [[ -L /test/dummy-symlink ]] && echo SYMLNKOK || echo SYMLNKERR`
+RUN [[ -L /test/dummy-symlink ]] && echo SYMLNKOK || echo SYMLNKERR`, ALPINE)
containerfilePath := filepath.Join(targetSubPath, "Containerfile")
err = ioutil.WriteFile(containerfilePath, []byte(containerfile), 0644)
@@ -475,14 +476,14 @@ RUN grep CapEff /proc/self/status`
// When
session := podmanTest.Podman([]string{
- "build", "--pull-never", "--cap-drop=all", "--cap-add=net_bind_service", "--add-host", "testhost:1.2.3.4", "--from", "alpine", targetPath,
+ "build", "--pull-never", "--cap-drop=all", "--cap-add=net_bind_service", "--add-host", "testhost:1.2.3.4", "--from", ALPINE, targetPath,
})
session.WaitWithDefaultTimeout()
// Then
Expect(session.ExitCode()).To(Equal(0))
Expect(strings.Fields(session.OutputToString())).
- To(ContainElement("alpine"))
+ To(ContainElement(ALPINE))
Expect(strings.Fields(session.OutputToString())).
To(ContainElement("testhost"))
Expect(strings.Fields(session.OutputToString())).
@@ -494,7 +495,7 @@ RUN grep CapEff /proc/self/status`
Expect(err).To(BeNil())
containerFile := filepath.Join(targetPath, "Containerfile")
- Expect(ioutil.WriteFile(containerFile, []byte("FROM alpine"), 0755)).To(BeNil())
+ Expect(ioutil.WriteFile(containerFile, []byte(fmt.Sprintf("FROM %s", ALPINE)), 0755)).To(BeNil())
defer func() {
Expect(os.RemoveAll(containerFile)).To(BeNil())
@@ -502,7 +503,7 @@ RUN grep CapEff /proc/self/status`
// When
session := podmanTest.Podman([]string{
- "build", "--pull-never", "--isolation", "oci", "--arch", "arm64", targetPath,
+ "build", "--isolation", "oci", "--arch", "arm64", targetPath,
})
session.WaitWithDefaultTimeout()
// Then
@@ -510,7 +511,7 @@ RUN grep CapEff /proc/self/status`
// When
session = podmanTest.Podman([]string{
- "build", "--pull-never", "--isolation", "chroot", "--arch", "arm64", targetPath,
+ "build", "--isolation", "chroot", "--arch", "arm64", targetPath,
})
session.WaitWithDefaultTimeout()
// Then
@@ -534,8 +535,8 @@ RUN grep CapEff /proc/self/status`
})
It("podman build --timestamp flag", func() {
- containerfile := `FROM quay.io/libpod/alpine:latest
-RUN echo hello`
+ containerfile := fmt.Sprintf(`FROM %s
+RUN echo hello`, ALPINE)
containerfilePath := filepath.Join(podmanTest.TempDir, "Containerfile")
err := ioutil.WriteFile(containerfilePath, []byte(containerfile), 0755)
diff --git a/test/e2e/containers_conf_test.go b/test/e2e/containers_conf_test.go
index aa2380c51..803124de1 100644
--- a/test/e2e/containers_conf_test.go
+++ b/test/e2e/containers_conf_test.go
@@ -91,7 +91,7 @@ var _ = Describe("Podman run", func() {
if IsRemote() {
podmanTest.RestartRemoteService()
}
- session := podmanTest.Podman([]string{"run", "busybox", "grep", "CapEff", "/proc/self/status"})
+ session := podmanTest.Podman([]string{"run", BB, "grep", "CapEff", "/proc/self/status"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
Expect(session.OutputToString()).ToNot(Equal(cap.OutputToString()))
diff --git a/test/e2e/exec_test.go b/test/e2e/exec_test.go
index 2ffb5cd2e..df86eab15 100644
--- a/test/e2e/exec_test.go
+++ b/test/e2e/exec_test.go
@@ -475,10 +475,10 @@ var _ = Describe("Podman exec", func() {
})
It("podman exec preserves container groups with --user and --group-add", func() {
- dockerfile := `FROM registry.fedoraproject.org/fedora-minimal
+ dockerfile := fmt.Sprintf(`FROM %s
RUN groupadd -g 4000 first
RUN groupadd -g 4001 second
-RUN useradd -u 1000 auser`
+RUN useradd -u 1000 auser`, fedoraMinimal)
imgName := "testimg"
podmanTest.BuildImage(dockerfile, imgName, "false")
diff --git a/test/e2e/generate_kube_test.go b/test/e2e/generate_kube_test.go
index 9cfda0e75..1c53307bd 100644
--- a/test/e2e/generate_kube_test.go
+++ b/test/e2e/generate_kube_test.go
@@ -155,6 +155,23 @@ var _ = Describe("Podman generate kube", func() {
Expect(numContainers).To(Equal(1))
})
+ It("podman generate kube multiple pods", func() {
+ pod1 := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:pod1", ALPINE, "top"})
+ pod1.WaitWithDefaultTimeout()
+ Expect(pod1.ExitCode()).To(Equal(0))
+
+ pod2 := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:pod2", ALPINE, "top"})
+ pod2.WaitWithDefaultTimeout()
+ Expect(pod2.ExitCode()).To(Equal(0))
+
+ kube := podmanTest.Podman([]string{"generate", "kube", "pod1", "pod2"})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ Expect(string(kube.Out.Contents())).To(ContainSubstring(`name: pod1`))
+ Expect(string(kube.Out.Contents())).To(ContainSubstring(`name: pod2`))
+ })
+
It("podman generate kube on pod with host network", func() {
podSession := podmanTest.Podman([]string{"pod", "create", "--name", "testHostNetwork", "--network", "host"})
podSession.WaitWithDefaultTimeout()
@@ -537,21 +554,6 @@ var _ = Describe("Podman generate kube", func() {
Expect(inspect.OutputToString()).To(ContainSubstring(`"pid"`))
})
- It("podman generate kube multiple pods should fail", func() {
- SkipIfRootlessCgroupsV1("Not supported for rootless + CGroupsV1")
- pod1 := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:pod1", ALPINE, "top"})
- pod1.WaitWithDefaultTimeout()
- Expect(pod1.ExitCode()).To(Equal(0))
-
- pod2 := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:pod2", ALPINE, "top"})
- pod2.WaitWithDefaultTimeout()
- Expect(pod2.ExitCode()).To(Equal(0))
-
- kube := podmanTest.Podman([]string{"generate", "kube", "pod1", "pod2"})
- kube.WaitWithDefaultTimeout()
- Expect(kube.ExitCode()).ToNot(Equal(0))
- })
-
It("podman generate kube with pods and containers should fail", func() {
pod1 := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:pod1", ALPINE, "top"})
pod1.WaitWithDefaultTimeout()
@@ -594,7 +596,7 @@ var _ = Describe("Podman generate kube", func() {
Expect(kube.ExitCode()).To(Equal(0))
})
- It("podman generate kube with containers in a pod should fail", func() {
+ It("podman generate kube with containers in pods should fail", func() {
pod1 := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:pod1", "--name", "top1", ALPINE, "top"})
pod1.WaitWithDefaultTimeout()
Expect(pod1.ExitCode()).To(Equal(0))
@@ -603,7 +605,7 @@ var _ = Describe("Podman generate kube", func() {
pod2.WaitWithDefaultTimeout()
Expect(pod2.ExitCode()).To(Equal(0))
- kube := podmanTest.Podman([]string{"generate", "kube", "pod1", "pod2"})
+ kube := podmanTest.Podman([]string{"generate", "kube", "top1", "top2"})
kube.WaitWithDefaultTimeout()
Expect(kube.ExitCode()).ToNot(Equal(0))
})
diff --git a/test/e2e/play_kube_test.go b/test/e2e/play_kube_test.go
index 9260d6cd2..93c8426a7 100644
--- a/test/e2e/play_kube_test.go
+++ b/test/e2e/play_kube_test.go
@@ -141,7 +141,16 @@ spec:
configMapKeyRef:
name: {{ .RefName }}
key: {{ .RefKey }}
- {{ else }}
+ optional: {{ .Optional }}
+ {{ end }}
+ {{ if (eq .ValueFrom "secret") }}
+ valueFrom:
+ secretKeyRef:
+ name: {{ .RefName }}
+ key: {{ .RefKey }}
+ optional: {{ .Optional }}
+ {{ end }}
+ {{ if (eq .ValueFrom "") }}
value: {{ .Value }}
{{ end }}
{{ end }}
@@ -151,6 +160,12 @@ spec:
{{ if (eq .From "configmap") }}
- configMapRef:
name: {{ .Name }}
+ optional: {{ .Optional }}
+ {{ end }}
+ {{ if (eq .From "secret") }}
+ - secretRef:
+ name: {{ .Name }}
+ optional: {{ .Optional }}
{{ end }}
{{ end }}
{{ end }}
@@ -340,6 +355,8 @@ var (
seccompPwdEPERM = []byte(`{"defaultAction":"SCMP_ACT_ALLOW","syscalls":[{"name":"getcwd","action":"SCMP_ACT_ERRNO"}]}`)
// CPU Period in ms
defaultCPUPeriod = 100
+ // Default secret in JSON. Note that the values ("foo" and "bar") are base64 encoded.
+ defaultSecret = []byte(`{"FOO":"Zm9v","BAR":"YmFy"}`)
)
func writeYaml(content string, fileName string) error {
@@ -357,7 +374,8 @@ func writeYaml(content string, fileName string) error {
return nil
}
-func generateKubeYaml(kind string, object interface{}, pathname string) error {
+// getKubeYaml returns a kubernetes YAML document.
+func getKubeYaml(kind string, object interface{}) (string, error) {
var yamlTemplate string
templateBytes := &bytes.Buffer{}
@@ -369,19 +387,51 @@ func generateKubeYaml(kind string, object interface{}, pathname string) error {
case "deployment":
yamlTemplate = deploymentYamlTemplate
default:
- return fmt.Errorf("unsupported kubernetes kind")
+ return "", fmt.Errorf("unsupported kubernetes kind")
}
t, err := template.New(kind).Parse(yamlTemplate)
if err != nil {
- return err
+ return "", err
}
if err := t.Execute(templateBytes, object); err != nil {
+ return "", err
+ }
+
+ return templateBytes.String(), nil
+}
+
+// generateKubeYaml writes a kubernetes YAML document.
+func generateKubeYaml(kind string, object interface{}, pathname string) error {
+ k, err := getKubeYaml(kind, object)
+ if err != nil {
return err
}
- return writeYaml(templateBytes.String(), pathname)
+ return writeYaml(k, pathname)
+}
+
+// generateMultiDocKubeYaml writes multiple kube objects in one Yaml document.
+func generateMultiDocKubeYaml(kubeObjects []string, pathname string) error {
+ var multiKube string
+
+ for _, k := range kubeObjects {
+ multiKube += "---\n"
+ multiKube += k
+ }
+
+ return writeYaml(multiKube, pathname)
+}
+
+func createSecret(podmanTest *PodmanTestIntegration, name string, value []byte) {
+ secretFilePath := filepath.Join(podmanTest.TempDir, "secret")
+ err := ioutil.WriteFile(secretFilePath, value, 0755)
+ Expect(err).To(BeNil())
+
+ secret := podmanTest.Podman([]string{"secret", "create", name, secretFilePath})
+ secret.WaitWithDefaultTimeout()
+ Expect(secret.ExitCode()).To(Equal(0))
}
// ConfigMap describes the options a kube yaml can be configured at configmap level
@@ -723,7 +773,7 @@ func withVolumeMount(mountPath string, readonly bool) ctrOption {
}
}
-func withEnv(name, value, valueFrom, refName, refKey string) ctrOption {
+func withEnv(name, value, valueFrom, refName, refKey string, optional bool) ctrOption {
return func(c *Ctr) {
e := Env{
Name: name,
@@ -731,17 +781,19 @@ func withEnv(name, value, valueFrom, refName, refKey string) ctrOption {
ValueFrom: valueFrom,
RefName: refName,
RefKey: refKey,
+ Optional: optional,
}
c.Env = append(c.Env, e)
}
}
-func withEnvFrom(name, from string) ctrOption {
+func withEnvFrom(name, from string, optional bool) ctrOption {
return func(c *Ctr) {
e := EnvFrom{
- Name: name,
- From: from,
+ Name: name,
+ From: from,
+ Optional: optional,
}
c.EnvFrom = append(c.EnvFrom, e)
@@ -799,11 +851,13 @@ type Env struct {
ValueFrom string
RefName string
RefKey string
+ Optional bool
}
type EnvFrom struct {
- Name string
- From string
+ Name string
+ From string
+ Optional bool
}
func milliCPUToQuota(milliCPU string) int {
@@ -1039,7 +1093,7 @@ var _ = Describe("Podman play kube", func() {
err := generateKubeYaml("configmap", cm, cmYamlPathname)
Expect(err).To(BeNil())
- pod := getPod(withCtr(getCtr(withEnv("FOO", "", "configmap", "foo", "FOO"))))
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "configmap", "foo", "FOO", false))))
err = generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1053,6 +1107,68 @@ var _ = Describe("Podman play kube", func() {
Expect(inspect.OutputToString()).To(ContainSubstring(`FOO=foo`))
})
+ It("podman play kube test required env value from configmap with missing key", func() {
+ SkipIfRemote("configmap list is not supported as a param")
+ cmYamlPathname := filepath.Join(podmanTest.TempDir, "foo-cm.yaml")
+ cm := getConfigMap(withConfigMapName("foo"), withConfigMapData("FOO", "foo"))
+ err := generateKubeYaml("configmap", cm, cmYamlPathname)
+ Expect(err).To(BeNil())
+
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "configmap", "foo", "MISSING_KEY", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml, "--configmap", cmYamlPathname})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Not(Equal(0)))
+ })
+
+ It("podman play kube test required env value from missing configmap", func() {
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "configmap", "missing_cm", "FOO", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Not(Equal(0)))
+ })
+
+ It("podman play kube test optional env value from configmap with missing key", func() {
+ SkipIfRemote("configmap list is not supported as a param")
+ cmYamlPathname := filepath.Join(podmanTest.TempDir, "foo-cm.yaml")
+ cm := getConfigMap(withConfigMapName("foo"), withConfigMapData("FOO", "foo"))
+ err := generateKubeYaml("configmap", cm, cmYamlPathname)
+ Expect(err).To(BeNil())
+
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "configmap", "foo", "MISSING_KEY", true))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml, "--configmap", cmYamlPathname})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "'{{ range .Config.Env }}[{{ . }}]{{end}}'"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`[FOO=]`))
+ })
+
+ It("podman play kube test optional env value from missing configmap", func() {
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "configmap", "missing_cm", "FOO", true))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "'{{ range .Config.Env }}[{{ . }}]{{end}}'"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`[FOO=]`))
+ })
+
It("podman play kube test get all key-value pairs from configmap as envs", func() {
SkipIfRemote("configmap list is not supported as a param")
cmYamlPathname := filepath.Join(podmanTest.TempDir, "foo-cm.yaml")
@@ -1060,7 +1176,7 @@ var _ = Describe("Podman play kube", func() {
err := generateKubeYaml("configmap", cm, cmYamlPathname)
Expect(err).To(BeNil())
- pod := getPod(withCtr(getCtr(withEnvFrom("foo", "configmap"))))
+ pod := getPod(withCtr(getCtr(withEnvFrom("foo", "configmap", false))))
err = generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1075,6 +1191,131 @@ var _ = Describe("Podman play kube", func() {
Expect(inspect.OutputToString()).To(ContainSubstring(`FOO2=foo2`))
})
+ It("podman play kube test get all key-value pairs from required configmap as envs", func() {
+ pod := getPod(withCtr(getCtr(withEnvFrom("missing_cm", "configmap", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Not(Equal(0)))
+ })
+
+ It("podman play kube test get all key-value pairs from optional configmap as envs", func() {
+ pod := getPod(withCtr(getCtr(withEnvFrom("missing_cm", "configmap", true))))
+ err = generateKubeYaml("pod", 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 env value from secret", func() {
+ createSecret(podmanTest, "foo", defaultSecret)
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "secret", "foo", "FOO", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "'{{ .Config.Env }}'"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`FOO=foo`))
+ })
+
+ It("podman play kube test required env value from missing secret", func() {
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "secret", "foo", "FOO", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Not(Equal(0)))
+ })
+
+ It("podman play kube test required env value from secret with missing key", func() {
+ createSecret(podmanTest, "foo", defaultSecret)
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "secret", "foo", "MISSING", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Not(Equal(0)))
+ })
+
+ It("podman play kube test optional env value from missing secret", func() {
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "secret", "foo", "FOO", true))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "'{{ range .Config.Env }}[{{ . }}]{{end}}'"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`[FOO=]`))
+ })
+
+ It("podman play kube test optional env value from secret with missing key", func() {
+ createSecret(podmanTest, "foo", defaultSecret)
+ pod := getPod(withCtr(getCtr(withEnv("FOO", "", "secret", "foo", "MISSING", true))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "'{{ range .Config.Env }}[{{ . }}]{{end}}'"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`[FOO=]`))
+ })
+
+ It("podman play kube test get all key-value pairs from secret as envs", func() {
+ createSecret(podmanTest, "foo", defaultSecret)
+ pod := getPod(withCtr(getCtr(withEnvFrom("foo", "secret", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "'{{ .Config.Env }}'"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`FOO=foo`))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`BAR=bar`))
+ })
+
+ It("podman play kube test get all key-value pairs from required secret as envs", func() {
+ pod := getPod(withCtr(getCtr(withEnvFrom("missing_secret", "secret", false))))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Not(Equal(0)))
+ })
+
+ It("podman play kube test get all key-value pairs from optional secret as envs", func() {
+ pod := getPod(withCtr(getCtr(withEnvFrom("missing_secret", "secret", true))))
+ err = generateKubeYaml("pod", 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 hostname", func() {
pod := getPod()
err := generateKubeYaml("pod", pod, kubeYaml)
@@ -1426,6 +1667,7 @@ spec:
kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
kube.WaitWithDefaultTimeout()
Expect(kube.ExitCode()).NotTo(Equal(0))
+ Expect(kube.ErrorToString()).To(ContainSubstring(defaultVolName))
})
It("podman play kube test with empty HostPath type volume", func() {
@@ -1698,4 +1940,102 @@ MemoryReservation: {{ .HostConfig.MemoryReservation }}`})
Expect(inspect.ExitCode()).To(Equal(0))
Expect(inspect.OutputToString()).To(Equal("true"))
})
+
+ // Multi doc related tests
+ It("podman play kube multi doc yaml", func() {
+ yamlDocs := []string{}
+ podNames := []string{}
+
+ serviceTemplate := `apiVersion: v1
+kind: Service
+metadata:
+ name: %s
+spec:
+ ports:
+ - port: 80
+ protocol: TCP
+ targetPort: 9376
+ selector:
+ app: %s
+`
+ // generate servies, pods and deployments
+ for i := 0; i < 2; i++ {
+ podName := fmt.Sprintf("testPod%d", i)
+ deploymentName := fmt.Sprintf("testDeploy%d", i)
+ deploymentPodName := fmt.Sprintf("%s-pod-0", deploymentName)
+
+ podNames = append(podNames, podName)
+ podNames = append(podNames, deploymentPodName)
+
+ pod := getPod(withPodName(podName))
+ podDeployment := getPod(withPodName(deploymentName))
+ deployment := getDeployment(withPod(podDeployment))
+ deployment.Name = deploymentName
+
+ // add services
+ yamlDocs = append([]string{
+ fmt.Sprintf(serviceTemplate, podName, podName),
+ fmt.Sprintf(serviceTemplate, deploymentPodName, deploymentPodName)}, yamlDocs...)
+
+ // add pods
+ k, err := getKubeYaml("pod", pod)
+ Expect(err).To(BeNil())
+ yamlDocs = append(yamlDocs, k)
+
+ // add deployments
+ k, err = getKubeYaml("deployment", deployment)
+ Expect(err).To(BeNil())
+ yamlDocs = append(yamlDocs, k)
+ }
+
+ // generate multi doc yaml
+ err = generateMultiDocKubeYaml(yamlDocs, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ for _, n := range podNames {
+ inspect := podmanTest.Podman([]string{"inspect", n, "--format", "'{{ .State }}'"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ Expect(inspect.OutputToString()).To(ContainSubstring(`Running`))
+ }
+ })
+
+ It("podman play kube invalid multi doc yaml", func() {
+ yamlDocs := []string{}
+
+ serviceTemplate := `apiVersion: v1
+kind: Service
+metadata:
+ name: %s
+spec:
+ ports:
+ - port: 80
+ protocol: TCP
+ targetPort: 9376
+ selector:
+ app: %s
+---
+invalid kube kind
+`
+ // add invalid multi doc yaml
+ yamlDocs = append(yamlDocs, fmt.Sprintf(serviceTemplate, "foo", "foo"))
+
+ // add pod
+ pod := getPod()
+ k, err := getKubeYaml("pod", pod)
+ Expect(err).To(BeNil())
+ yamlDocs = append(yamlDocs, k)
+
+ // generate multi doc yaml
+ err = generateMultiDocKubeYaml(yamlDocs, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Not(Equal(0)))
+ })
})
diff --git a/test/e2e/prune_test.go b/test/e2e/prune_test.go
index 73da77417..cbe38fc76 100644
--- a/test/e2e/prune_test.go
+++ b/test/e2e/prune_test.go
@@ -1,6 +1,7 @@
package integration
import (
+ "fmt"
"os"
. "github.com/containers/podman/v3/test/utils"
@@ -8,11 +9,11 @@ import (
. "github.com/onsi/gomega"
)
-var pruneImage = `
-FROM alpine:latest
+var pruneImage = fmt.Sprintf(`
+FROM %s
LABEL RUN podman --version
RUN apk update
-RUN apk add bash`
+RUN apk add bash`, ALPINE)
var _ = Describe("Podman prune", func() {
var (
diff --git a/test/e2e/ps_test.go b/test/e2e/ps_test.go
index ac0910a83..37b6516c1 100644
--- a/test/e2e/ps_test.go
+++ b/test/e2e/ps_test.go
@@ -351,7 +351,7 @@ var _ = Describe("Podman ps", func() {
})
It("podman --format by size", func() {
- session := podmanTest.Podman([]string{"create", "busybox", "ls"})
+ session := podmanTest.Podman([]string{"create", BB, "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
@@ -366,7 +366,7 @@ var _ = Describe("Podman ps", func() {
})
It("podman --sort by size", func() {
- session := podmanTest.Podman([]string{"create", "busybox", "ls"})
+ session := podmanTest.Podman([]string{"create", BB, "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
diff --git a/test/e2e/rmi_test.go b/test/e2e/rmi_test.go
index d8367d636..5e6d66d53 100644
--- a/test/e2e/rmi_test.go
+++ b/test/e2e/rmi_test.go
@@ -184,19 +184,20 @@ var _ = Describe("Podman rmi", func() {
It("podman rmi with cached images", func() {
podmanTest.AddImageToRWStore(cirros)
- dockerfile := `FROM quay.io/libpod/cirros:latest
+ dockerfile := fmt.Sprintf(`FROM %s
RUN mkdir hello
RUN touch test.txt
ENV foo=bar
- `
+ `, cirros)
podmanTest.BuildImage(dockerfile, "test", "true")
- dockerfile = `FROM quay.io/libpod/cirros:latest
+ dockerfile = fmt.Sprintf(`FROM %s
RUN mkdir hello
RUN touch test.txt
RUN mkdir blah
ENV foo=bar
- `
+ `, cirros)
+
podmanTest.BuildImage(dockerfile, "test2", "true")
session := podmanTest.Podman([]string{"images", "-q", "-a"})
@@ -249,14 +250,15 @@ var _ = Describe("Podman rmi", func() {
})
It("podman rmi -a with parent|child images", func() {
- dockerfile := `FROM quay.io/libpod/cirros:latest AS base
+ podmanTest.AddImageToRWStore(cirros)
+ dockerfile := fmt.Sprintf(`FROM %s AS base
RUN touch /1
ENV LOCAL=/1
RUN find $LOCAL
FROM base
RUN find $LOCAL
-`
+`, cirros)
podmanTest.BuildImage(dockerfile, "test", "true")
session := podmanTest.Podman([]string{"rmi", "-a"})
session.WaitWithDefaultTimeout()
@@ -284,14 +286,15 @@ RUN find $LOCAL
// a race, we may not hit the condition a 100 percent of times
// but ocal reproducers hit it all the time.
+ podmanTest.AddImageToRWStore(cirros)
var wg sync.WaitGroup
buildAndRemove := func(i int) {
defer GinkgoRecover()
defer wg.Done()
imageName := fmt.Sprintf("rmtest:%d", i)
- containerfile := `FROM quay.io/libpod/cirros:latest
-RUN ` + fmt.Sprintf("touch %s", imageName)
+ containerfile := fmt.Sprintf(`FROM %s
+RUN touch %s`, cirros, imageName)
podmanTest.BuildImage(containerfile, imageName, "false")
session := podmanTest.Podman([]string{"rmi", "-f", imageName})
diff --git a/test/e2e/run_passwd_test.go b/test/e2e/run_passwd_test.go
index 12b6c64df..0d5dd5f3b 100644
--- a/test/e2e/run_passwd_test.go
+++ b/test/e2e/run_passwd_test.go
@@ -1,6 +1,7 @@
package integration
import (
+ "fmt"
"os"
. "github.com/containers/podman/v3/test/utils"
@@ -60,9 +61,9 @@ var _ = Describe("Podman run passwd", func() {
})
It("podman can run container without /etc/passwd", func() {
- dockerfile := `FROM alpine
+ dockerfile := fmt.Sprintf(`FROM %s
RUN rm -f /etc/passwd /etc/shadow /etc/group
-USER 1000`
+USER 1000`, ALPINE)
imgName := "testimg"
podmanTest.BuildImage(dockerfile, imgName, "false")
session := podmanTest.Podman([]string{"run", "--rm", imgName, "ls", "/etc/"})
@@ -113,9 +114,9 @@ USER 1000`
})
It("podman run numeric group from image and no group file", func() {
- dockerfile := `FROM alpine
+ dockerfile := fmt.Sprintf(`FROM %s
RUN rm -f /etc/passwd /etc/shadow /etc/group
-USER 1000`
+USER 1000`, ALPINE)
imgName := "testimg"
podmanTest.BuildImage(dockerfile, imgName, "false")
session := podmanTest.Podman([]string{"run", "--rm", imgName, "ls", "/etc/"})
diff --git a/test/e2e/run_privileged_test.go b/test/e2e/run_privileged_test.go
index 33b3b85c5..0bf68e20b 100644
--- a/test/e2e/run_privileged_test.go
+++ b/test/e2e/run_privileged_test.go
@@ -59,7 +59,7 @@ var _ = Describe("Podman privileged container tests", func() {
})
It("podman privileged make sure sys is mounted rw", func() {
- session := podmanTest.Podman([]string{"run", "--privileged", "busybox", "mount"})
+ session := podmanTest.Podman([]string{"run", "--privileged", BB, "mount"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
ok, lines := session.GrepString("sysfs")
@@ -71,7 +71,7 @@ var _ = Describe("Podman privileged container tests", func() {
hostCap := SystemExec("awk", []string{"/^CapEff/ { print $2 }", "/proc/self/status"})
Expect(hostCap.ExitCode()).To(Equal(0))
- session := podmanTest.Podman([]string{"run", "--privileged", "busybox", "awk", "/^CapEff/ { print $2 }", "/proc/self/status"})
+ session := podmanTest.Podman([]string{"run", "--privileged", BB, "awk", "/^CapEff/ { print $2 }", "/proc/self/status"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
@@ -83,7 +83,7 @@ var _ = Describe("Podman privileged container tests", func() {
hostCap := SystemExec("awk", []string{"/^CapEff/ { print $2 }", "/proc/self/status"})
Expect(hostCap.ExitCode()).To(Equal(0))
- session := podmanTest.Podman([]string{"run", "--cap-add", "all", "busybox", "awk", "/^CapEff/ { print $2 }", "/proc/self/status"})
+ session := podmanTest.Podman([]string{"run", "--cap-add", "all", BB, "awk", "/^CapEff/ { print $2 }", "/proc/self/status"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
@@ -95,7 +95,7 @@ var _ = Describe("Podman privileged container tests", func() {
hostCap := SystemExec("awk", []string{"/^CapEff/ { print $2 }", "/proc/self/status"})
Expect(hostCap.ExitCode()).To(Equal(0))
- session := podmanTest.Podman([]string{"run", "--user=bin", "--cap-add", "all", "busybox", "awk", "/^CapEff/ { print $2 }", "/proc/self/status"})
+ session := podmanTest.Podman([]string{"run", "--user=bin", "--cap-add", "all", BB, "awk", "/^CapEff/ { print $2 }", "/proc/self/status"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
@@ -103,7 +103,7 @@ var _ = Describe("Podman privileged container tests", func() {
})
It("podman cap-drop CapEff", func() {
- session := podmanTest.Podman([]string{"run", "--cap-drop", "all", "busybox", "grep", "CapEff", "/proc/self/status"})
+ session := podmanTest.Podman([]string{"run", "--cap-drop", "all", BB, "grep", "CapEff", "/proc/self/status"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
capEff := strings.Split(session.OutputToString(), " ")
@@ -120,7 +120,7 @@ var _ = Describe("Podman privileged container tests", func() {
})
It("podman non-privileged should have very few devices", func() {
- session := podmanTest.Podman([]string{"run", "-t", "busybox", "ls", "-l", "/dev"})
+ session := podmanTest.Podman([]string{"run", "-t", BB, "ls", "-l", "/dev"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
Expect(len(session.OutputToStringArray())).To(Equal(17))
@@ -147,12 +147,12 @@ var _ = Describe("Podman privileged container tests", func() {
Skip("Can't determine NoNewPrivs")
}
- session := podmanTest.Podman([]string{"run", "busybox", "grep", "NoNewPrivs", "/proc/self/status"})
+ session := podmanTest.Podman([]string{"run", BB, "grep", "NoNewPrivs", "/proc/self/status"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
privs := strings.Split(session.OutputToString(), ":")
- session = podmanTest.Podman([]string{"run", "--security-opt", "no-new-privileges", "busybox", "grep", "NoNewPrivs", "/proc/self/status"})
+ session = podmanTest.Podman([]string{"run", "--security-opt", "no-new-privileges", BB, "grep", "NoNewPrivs", "/proc/self/status"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
diff --git a/test/e2e/run_security_labels_test.go b/test/e2e/run_security_labels_test.go
index a2e0b2aab..b714df323 100644
--- a/test/e2e/run_security_labels_test.go
+++ b/test/e2e/run_security_labels_test.go
@@ -1,6 +1,7 @@
package integration
import (
+ "fmt"
"os"
"strings"
@@ -128,9 +129,9 @@ var _ = Describe("Podman generate kube", func() {
It("podman container runlabel (podman --version)", func() {
SkipIfRemote("runlabel not supported on podman-remote")
- PodmanDockerfile := `
-FROM alpine:latest
-LABEL io.containers.capabilities=chown,kill`
+ PodmanDockerfile := fmt.Sprintf(`
+FROM %s
+LABEL io.containers.capabilities=chown,kill`, ALPINE)
image := "podman-caps:podman"
podmanTest.BuildImage(PodmanDockerfile, image, "false")
diff --git a/test/e2e/run_test.go b/test/e2e/run_test.go
index bb1f9590d..23930b4f7 100644
--- a/test/e2e/run_test.go
+++ b/test/e2e/run_test.go
@@ -489,8 +489,8 @@ var _ = Describe("Podman run", func() {
if IsRemote() {
podmanTest.RestartRemoteService()
}
- dockerfile := `FROM busybox
-USER bin`
+ dockerfile := fmt.Sprintf(`FROM %s
+USER bin`, BB)
podmanTest.BuildImage(dockerfile, "test", "false")
session := podmanTest.Podman([]string{"run", "--rm", "--user", "bin", "test", "grep", "CapBnd", "/proc/self/status"})
session.WaitWithDefaultTimeout()
@@ -898,10 +898,10 @@ USER bin`
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
- dockerfile := `FROM busybox
+ dockerfile := fmt.Sprintf(`FROM %s
RUN mkdir -p /myvol/data && chown -R mail.0 /myvol
VOLUME ["/myvol/data"]
-USER mail`
+USER mail`, BB)
podmanTest.BuildImage(dockerfile, "test", "false")
session = podmanTest.Podman([]string{"run", "--rm", "test", "ls", "-al", "/myvol/data"})
@@ -1499,8 +1499,8 @@ USER mail`
It("podman run makes workdir from image", func() {
// BuildImage does not seem to work remote
- dockerfile := `FROM busybox
-WORKDIR /madethis`
+ dockerfile := fmt.Sprintf(`FROM %s
+WORKDIR /madethis`, BB)
podmanTest.BuildImage(dockerfile, "test", "false")
session := podmanTest.Podman([]string{"run", "--rm", "test", "pwd"})
session.WaitWithDefaultTimeout()
diff --git a/test/e2e/run_volume_test.go b/test/e2e/run_volume_test.go
index 454dfdc83..9b77aaef8 100644
--- a/test/e2e/run_volume_test.go
+++ b/test/e2e/run_volume_test.go
@@ -308,9 +308,9 @@ var _ = Describe("Podman run with volumes", func() {
It("podman named volume copyup symlink", func() {
imgName := "testimg"
- dockerfile := `FROM alpine
+ dockerfile := fmt.Sprintf(`FROM %s
RUN touch /testfile
-RUN sh -c "cd /etc/apk && ln -s ../../testfile"`
+RUN sh -c "cd /etc/apk && ln -s ../../testfile"`, ALPINE)
podmanTest.BuildImage(dockerfile, imgName, "false")
baselineSession := podmanTest.Podman([]string{"run", "--rm", "-t", "-i", imgName, "ls", "/etc/apk/"})
@@ -479,9 +479,8 @@ RUN sh -c "cd /etc/apk && ln -s ../../testfile"`
It("Podman mount over image volume with trailing /", func() {
image := "podman-volume-test:trailing"
- dockerfile := `
-FROM alpine:latest
-VOLUME /test/`
+ dockerfile := fmt.Sprintf(`FROM %s
+VOLUME /test/`, ALPINE)
podmanTest.BuildImage(dockerfile, image, "false")
ctrName := "testCtr"
@@ -643,4 +642,30 @@ VOLUME /test/`
found, _ = session.GrepString("888:888")
Expect(found).Should(BeTrue())
})
+
+ It("volume permissions after run", func() {
+ imgName := "testimg"
+ dockerfile := fmt.Sprintf(`FROM %s
+RUN useradd -m testuser -u 1005
+USER testuser`, fedoraMinimal)
+ podmanTest.BuildImage(dockerfile, imgName, "false")
+
+ testString := "testuser testuser"
+
+ test1 := podmanTest.Podman([]string{"run", "-v", "testvol1:/test", imgName, "bash", "-c", "ls -al /test | grep -v root | grep -v total"})
+ test1.WaitWithDefaultTimeout()
+ Expect(test1.ExitCode()).To(Equal(0))
+ Expect(strings.Contains(test1.OutputToString(), testString)).To(BeTrue())
+
+ volName := "testvol2"
+ vol := podmanTest.Podman([]string{"volume", "create", volName})
+ vol.WaitWithDefaultTimeout()
+ Expect(vol.ExitCode()).To(Equal(0))
+
+ test2 := podmanTest.Podman([]string{"run", "-v", fmt.Sprintf("%s:/test", volName), imgName, "bash", "-c", "ls -al /test | grep -v root | grep -v total"})
+ test2.WaitWithDefaultTimeout()
+ Expect(test2.ExitCode()).To(Equal(0))
+ Expect(strings.Contains(test2.OutputToString(), testString)).To(BeTrue())
+
+ })
})
diff --git a/test/e2e/run_working_dir_test.go b/test/e2e/run_working_dir_test.go
index 2d16cdc18..de0f55134 100644
--- a/test/e2e/run_working_dir_test.go
+++ b/test/e2e/run_working_dir_test.go
@@ -1,6 +1,7 @@
package integration
import (
+ "fmt"
"os"
. "github.com/containers/podman/v3/test/utils"
@@ -46,9 +47,9 @@ var _ = Describe("Podman run", func() {
})
It("podman run a container on an image with a workdir", func() {
- dockerfile := `FROM alpine
+ dockerfile := fmt.Sprintf(`FROM %s
RUN mkdir -p /home/foobar /etc/foobar; chown bin:bin /etc/foobar
-WORKDIR /etc/foobar`
+WORKDIR /etc/foobar`, ALPINE)
podmanTest.BuildImage(dockerfile, "test", "false")
session := podmanTest.Podman([]string{"run", "test", "pwd"})
diff --git a/test/e2e/runlabel_test.go b/test/e2e/runlabel_test.go
index 2eec15c62..54fa7e2f6 100644
--- a/test/e2e/runlabel_test.go
+++ b/test/e2e/runlabel_test.go
@@ -1,6 +1,7 @@
package integration
import (
+ "fmt"
"os"
. "github.com/containers/podman/v3/test/utils"
@@ -8,18 +9,17 @@ import (
. "github.com/onsi/gomega"
)
-var PodmanDockerfile = `
-FROM alpine:latest
-LABEL RUN podman --version`
+var PodmanDockerfile = fmt.Sprintf(`
+FROM %s
+LABEL RUN podman --version`, ALPINE)
-var LsDockerfile = `
-FROM alpine:latest
-LABEL RUN ls -la`
+var LsDockerfile = fmt.Sprintf(`
+FROM %s
+LABEL RUN ls -la`, ALPINE)
-var GlobalDockerfile = `
-FROM alpine:latest
-LABEL RUN echo \$GLOBAL_OPTS
-`
+var GlobalDockerfile = fmt.Sprintf(`
+FROM %s
+LABEL RUN echo \$GLOBAL_OPTS`, ALPINE)
var _ = Describe("podman container runlabel", func() {
var (
diff --git a/test/e2e/system_df_test.go b/test/e2e/system_df_test.go
index 9daf3f8f9..9aee85ca3 100644
--- a/test/e2e/system_df_test.go
+++ b/test/e2e/system_df_test.go
@@ -44,7 +44,7 @@ var _ = Describe("podman system df", func() {
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
- session = podmanTest.Podman([]string{"create", "-v", "data:/data", "--name", "container1", "busybox"})
+ session = podmanTest.Podman([]string{"create", "-v", "data:/data", "--name", "container1", BB})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
diff --git a/test/python/docker/compat/test_images.py b/test/python/docker/compat/test_images.py
index 571b31881..1e2b531b7 100644
--- a/test/python/docker/compat/test_images.py
+++ b/test/python/docker/compat/test_images.py
@@ -158,7 +158,7 @@ class TestImages(unittest.TestCase):
def test_build_image(self):
labels = {"apple": "red", "grape": "green"}
_ = self.client.images.build(
- path="test/python/docker/build_labels", labels=labels, tag="labels"
+ path="test/python/docker/build_labels", labels=labels, tag="labels", isolation="default"
)
image = self.client.images.get("labels")
self.assertEqual(image.labels["apple"], labels["apple"])
diff --git a/test/system/070-build.bats b/test/system/070-build.bats
index 8f6cdb46b..e5b68a0d8 100644
--- a/test/system/070-build.bats
+++ b/test/system/070-build.bats
@@ -668,6 +668,33 @@ EOF
run_podman image prune -f
}
+@test "podman build --pull-never" {
+ local tmpdir=$PODMAN_TMPDIR/build-test
+ mkdir -p $tmpdir
+
+ # First, confirm that --pull-never is a NOP if image exists locally
+ local random_string=$(random_string 15)
+
+ cat >$tmpdir/Containerfile <<EOF
+FROM $IMAGE
+RUN echo $random_string
+EOF
+
+ run_podman build -t build_test --pull-never $tmpdir
+ is "$output" ".*$random_string" "pull-never is OK if image already exists"
+ run_podman rmi build_test
+
+ # Now try an image that does not exist locally nor remotely
+ cat >$tmpdir/Containerfile <<EOF
+FROM quay.io/libpod/nosuchimage:nosuchtag
+RUN echo $random_string
+EOF
+
+ run_podman 125 build -t build_test --pull-never $tmpdir
+ is "$output" ".* pull policy is .never. but .* could not be found locally" \
+ "--pull-never fails with expected error message"
+}
+
@test "podman build --logfile test" {
tmpdir=$PODMAN_TMPDIR/build-test
mkdir -p $tmpdir
diff --git a/test/system/120-load.bats b/test/system/120-load.bats
index d29be462d..67687a5b0 100644
--- a/test/system/120-load.bats
+++ b/test/system/120-load.bats
@@ -126,17 +126,6 @@ verify_iid_and_name() {
verify_iid_and_name $img_name
}
-@test "podman load - will not read from tty" {
- if [ ! -t 0 ]; then
- skip "STDIN is not a tty"
- fi
-
- run_podman 125 load
- is "$output" \
- "Error: cannot read from terminal. Use command-line redirection" \
- "Diagnostic from 'podman load' without redirection or -i"
-}
-
@test "podman load - redirect corrupt payload" {
run_podman 125 load <<< "Danger, Will Robinson!! This is a corrupt tarball!"
is "$output" \
diff --git a/test/system/450-interactive.bats b/test/system/450-interactive.bats
new file mode 100644
index 000000000..a9bf52ee8
--- /dev/null
+++ b/test/system/450-interactive.bats
@@ -0,0 +1,87 @@
+# -*- bats -*-
+#
+# tests of podman commands that require an interactive pty
+#
+
+load helpers
+
+###############################################################################
+# BEGIN setup/teardown
+
+# Each test runs with its own PTY, managed by socat.
+PODMAN_TEST_PTY=$(mktemp -u --tmpdir=${BATS_TMPDIR:-/tmp} podman_pty.XXXXXX)
+PODMAN_DUMMY=$(mktemp -u --tmpdir=${BATS_TMPDIR:-/tmp} podman_dummy.XXXXXX)
+PODMAN_SOCAT_PID=
+
+function setup() {
+ basic_setup
+
+ # Create a pty. Run under 'timeout' because BATS reaps child processes
+ # and if we exit before killing socat, bats will hang forever.
+ timeout 10 socat \
+ PTY,link=$PODMAN_TEST_PTY,raw,echo=0 \
+ PTY,link=$PODMAN_DUMMY,raw,echo=0 &
+ PODMAN_SOCAT_PID=$!
+
+ # Wait for pty
+ retries=5
+ while [[ ! -e $PODMAN_TEST_PTY ]]; do
+ retries=$(( retries - 1 ))
+ if [[ $retries -eq 0 ]]; then
+ die "Timed out waiting for $PODMAN_TEST_PTY"
+ fi
+ sleep 0.5
+ done
+}
+
+function teardown() {
+ if [[ -n $PODMAN_SOCAT_PID ]]; then
+ kill $PODMAN_SOCAT_PID
+ PODMAN_SOCAT_PID=
+ fi
+ rm -f $PODMAN_TEST_PTY $PODMAN_DUMMY_PTY
+
+ basic_teardown
+}
+
+# END setup/teardown
+###############################################################################
+# BEGIN tests
+
+@test "podman detects correct tty size" {
+ # Set the pty to a random size. Make rows/columns odd/even, to guarantee
+ # that they can never be the same
+ rows=$(( 15 + RANDOM % 60 | 1 ))
+ cols=$(( 15 + RANDOM % 60 & 126 ))
+ stty rows $rows cols $cols <$PODMAN_TEST_PTY
+
+ # ...and make sure stty under podman reads that.
+ # FIXME: 'sleep 1' is needed for podman-remote; without it, there's
+ run_podman run -it --name mystty $IMAGE sh -c 'sleep 1;stty size' <$PODMAN_TEST_PTY
+ is "$output" "$rows $cols" "stty under podman reads the correct dimensions"
+}
+
+
+@test "podman load - will not read from tty" {
+ run_podman 125 load <$PODMAN_TEST_PTY
+ is "$output" \
+ "Error: cannot read from terminal. Use command-line redirection" \
+ "Diagnostic from 'podman load' without redirection or -i"
+}
+
+
+@test "podman run --tty -i failure with no tty" {
+ run_podman run --tty -i --rm $IMAGE echo hello < /dev/null
+ is "$output" ".*The input device is not a TTY.*" "-it _without_ a tty"
+
+ run_podman run --tty -i --rm $IMAGE echo hello <$PODMAN_TEST_PTY
+ is "$output" "hello" "-it _with_ a pty"
+
+ run_podman run --tty=false -i --rm $IMAGE echo hello < /dev/null
+ is "$output" "hello" "-tty=false: no warning"
+
+ run_podman run --tty -i=false --rm $IMAGE echo hello < /dev/null
+ is "$output" "hello" "-i=false: no warning"
+}
+
+# vim: filetype=sh
diff --git a/test/system/helpers.bash b/test/system/helpers.bash
index 38e317709..823dc3376 100644
--- a/test/system/helpers.bash
+++ b/test/system/helpers.bash
@@ -72,6 +72,9 @@ function basic_setup() {
# on cleanup.
# TODO: do this outside of setup, so it carries across tests?
PODMAN_TMPDIR=$(mktemp -d --tmpdir=${BATS_TMPDIR:-/tmp} podman_bats.XXXXXX)
+
+ # In the unlikely event that a test runs is() before a run_podman()
+ MOST_RECENT_PODMAN_COMMAND=
}
# Basic teardown: remove all pods and containers
@@ -150,6 +153,9 @@ function run_podman() {
'?') expected_rc= ; shift;; # ignore exit code
esac
+ # Remember command args, for possible use in later diagnostic messages
+ MOST_RECENT_PODMAN_COMMAND="podman $*"
+
# stdout is only emitted upon error; this echo is to help a debugger
echo "$_LOG_PROMPT $PODMAN $*"
# BATS hangs if a subprocess remains and keeps FD 3 open; this happens
@@ -384,7 +390,7 @@ function die() {
function is() {
local actual="$1"
local expect="$2"
- local testname="${3:-FIXME}"
+ local testname="${3:-${MOST_RECENT_PODMAN_COMMAND:-[no test name given]}}"
if [ -z "$expect" ]; then
if [ -z "$actual" ]; then