summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/apiv2/23-containersArchive.at81
-rw-r--r--test/apiv2/35-networks.at19
-rw-r--r--test/e2e/create_test.go32
-rw-r--r--test/e2e/network_test.go59
-rw-r--r--test/e2e/pull_test.go28
-rw-r--r--test/system/010-images.bats6
-rw-r--r--test/system/030-run.bats19
-rw-r--r--test/system/040-ps.bats47
-rw-r--r--test/system/070-build.bats17
-rw-r--r--test/system/075-exec.bats3
-rw-r--r--test/system/200-pod.bats4
11 files changed, 294 insertions, 21 deletions
diff --git a/test/apiv2/23-containersArchive.at b/test/apiv2/23-containersArchive.at
new file mode 100644
index 000000000..459800196
--- /dev/null
+++ b/test/apiv2/23-containersArchive.at
@@ -0,0 +1,81 @@
+# -*- sh -*-
+#
+# test more container-related endpoints
+#
+
+red='\e[31m'
+nc='\e[0m'
+
+podman pull $IMAGE &>/dev/null
+
+# Ensure clean slate
+podman rm -a -f &>/dev/null
+
+CTR="ArchiveTestingCtr"
+
+TMPD=$(mktemp -d)
+pushd "${TMPD}"
+echo "Hello" > "hello.txt"
+tar --format=posix -cvf "hello.tar" "hello.txt" &> /dev/null
+popd
+
+HELLO_TAR="${TMPD}/hello.tar"
+
+podman run -d --name "${CTR}" "${IMAGE}" top
+
+function cleanUpArchiveTest() {
+ podman container stop "${CTR}" &> /dev/null
+ podman container rm "${CTR}" &> /dev/null
+ rm -fr "${TMPD}" &> /dev/null
+}
+
+t HEAD "containers/nonExistentCtr/archive?path=%2F" 404
+t HEAD "containers/${CTR}/archive?path=%2Fnon%2Fexistent%2Fpath" 404
+t HEAD "containers/${CTR}/archive?path=%2Fetc%2Fpasswd" 200
+
+curl "http://$HOST:$PORT/containers/${CTR}/archive?path=%2Ftmp%2F" \
+ -X PUT \
+ -H "Content-Type: application/x-tar" \
+ --upload-file "${HELLO_TAR}" &> /dev/null
+
+if ! podman exec -it "${CTR}" "grep" "Hello" "/tmp/hello.txt" &> /dev/null ; then
+ echo -e "${red}NOK: The hello.txt file has not been uploaded.${nc}" 1>&2;
+ cleanUpArchiveTest
+ exit 1
+fi
+
+t HEAD "containers/${CTR}/archive?path=%2Ftmp%2Fhello.txt" 200
+
+curl "http://$HOST:$PORT/containers/${CTR}/archive?path=%2Ftmp%2Fhello.txt" \
+ --dump-header "${TMPD}/headers.txt" \
+ -o "${TMPD}/body.tar" \
+ -X GET &> /dev/null
+
+PATH_STAT="$(grep X-Docker-Container-Path-Stat "${TMPD}/headers.txt" | cut -d " " -f 2 | base64 -d --ignore-garbage)"
+
+ARCHIVE_TEST_ERROR=""
+
+if [ "$(echo "${PATH_STAT}" | jq ".name")" != '"hello.txt"' ]; then
+ echo -e "${red}NOK: Wrong name in X-Docker-Container-Path-Stat header.${nc}" 1>&2;
+ ARCHIVE_TEST_ERROR="1"
+fi
+
+if [ "$(echo "${PATH_STAT}" | jq ".size")" != "6" ]; then
+ echo -e "${red}NOK: Wrong size in X-Docker-Container-Path-Stat header.${nc}" 1>&2;
+ ARCHIVE_TEST_ERROR="1"
+fi
+
+if ! tar -tf "${TMPD}/body.tar" | grep "hello.txt" &> /dev/null; then
+ echo -e "${red}NOK: Body doesn't contain expected file.${nc}" 1>&2;
+ ARCHIVE_TEST_ERROR="1"
+fi
+
+if [ "$(tar -xf "${TMPD}/body.tar" hello.txt --to-stdout)" != "Hello" ]; then
+ echo -e "${red}NOK: Content of file doesn't match.${nc}" 1>&2;
+ ARCHIVE_TEST_ERROR="1"
+fi
+
+cleanUpArchiveTest
+if [[ "${ARCHIVE_TEST_ERROR}" ]] ; then
+ exit 1;
+fi
diff --git a/test/apiv2/35-networks.at b/test/apiv2/35-networks.at
index ad34511c7..d9556d59f 100644
--- a/test/apiv2/35-networks.at
+++ b/test/apiv2/35-networks.at
@@ -9,8 +9,8 @@ t GET networks/non-existing-network 404 \
t POST libpod/networks/create?name=network1 '' 200 \
.Filename~.*/network1\\.conflist
-# --data '{"Subnet":{"IP":"10.10.254.0","Mask":[255,255,255,0]}}'
-t POST libpod/networks/create?name=network2 '"Subnet":{"IP":"10.10.254.0","Mask":[255,255,255,0]}' 200 \
+# --data '{"Subnet":{"IP":"10.10.254.0","Mask":[255,255,255,0]},"Labels":{"abc":"val"}}'
+t POST libpod/networks/create?name=network2 '"Subnet":{"IP":"10.10.254.0","Mask":[255,255,255,0]},"Labels":{"abc":"val"}' 200 \
.Filename~.*/network2\\.conflist
# test for empty mask
@@ -22,7 +22,8 @@ t POST libpod/networks/create '"Subnet":{"IP":"10.10.1.0","Mask":[0,255,255,0]}'
# network list
t GET libpod/networks/json 200
-t GET libpod/networks/json?filter=name=network1 200 \
+# filters={"name":["network1"]}
+t GET libpod/networks/json?filters=%7B%22name%22%3A%5B%22network1%22%5D%7D 200 \
length=1 \
.[0].Name=network1
t GET networks 200
@@ -34,12 +35,12 @@ length=2
#filters={"name":["network"]}
t GET networks?filters=%7B%22name%22%3A%5B%22network%22%5D%7D 200 \
length=2
-# invalid filter filters={"label":"abc"}
-t GET networks?filters=%7B%22label%22%3A%5B%22abc%22%5D%7D 500 \
-.cause="only the name filter for listing networks is implemented"
-# invalid filter filters={"label":"abc","name":["network"]}
-t GET networks?filters=%7B%22label%22%3A%22abc%22%2C%22name%22%3A%5B%22network%22%5D%7D 500 \
-.cause="only the name filter for listing networks is implemented"
+# filters={"label":["abc"]}
+t GET networks?filters=%7B%22label%22%3A%5B%22abc%22%5D%7D 200 \
+length=1
+# invalid filter filters={"id":["abc"]}
+t GET networks?filters=%7B%22id%22%3A%5B%22abc%22%5D%7D 500 \
+.cause='invalid filter "id"'
# clean the network
t DELETE libpod/networks/network1 200 \
diff --git a/test/e2e/create_test.go b/test/e2e/create_test.go
index 760345a67..aaf089d97 100644
--- a/test/e2e/create_test.go
+++ b/test/e2e/create_test.go
@@ -5,6 +5,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
+ "runtime"
"strings"
. "github.com/containers/podman/v2/test/utils"
@@ -644,4 +645,35 @@ var _ = Describe("Podman create", func() {
Expect(session.ErrorToString()).To(ContainSubstring("unknown flag"))
})
+ It("podman create --platform", func() {
+ session := podmanTest.Podman([]string{"create", "--platform=linux/bogus", ALPINE})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(125))
+ expectedError := "no image found in manifest list for architecture bogus"
+ Expect(session.ErrorToString()).To(ContainSubstring(expectedError))
+
+ session = podmanTest.Podman([]string{"create", "--platform=linux/arm64", "--override-os", "windows", ALPINE})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(125))
+ expectedError = "--platform option can not be specified with --overide-arch or --override-os"
+ Expect(session.ErrorToString()).To(ContainSubstring(expectedError))
+
+ session = podmanTest.Podman([]string{"create", "-q", "--platform=linux/arm64", ALPINE})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+
+ setup := podmanTest.Podman([]string{"container", "inspect", session.OutputToString()})
+ setup.WaitWithDefaultTimeout()
+ Expect(setup.ExitCode()).To(Equal(0))
+
+ data := setup.InspectContainerToJSON()
+ setup = podmanTest.Podman([]string{"image", "inspect", data[0].Image})
+ setup.WaitWithDefaultTimeout()
+ Expect(setup.ExitCode()).To(Equal(0))
+
+ idata := setup.InspectImageJSON() // returns []inspect.ImageData
+ Expect(len(idata)).To(Equal(1))
+ Expect(idata[0].Os).To(Equal(runtime.GOOS))
+ Expect(idata[0].Architecture).To(Equal("arm64"))
+ })
})
diff --git a/test/e2e/network_test.go b/test/e2e/network_test.go
index 20e1d5b6b..ad6af61c7 100644
--- a/test/e2e/network_test.go
+++ b/test/e2e/network_test.go
@@ -66,6 +66,65 @@ var _ = Describe("Podman network", func() {
Expect(session.LineInOutputContains(name)).To(BeTrue())
})
+ It("podman network list --filter plugin and name", func() {
+ name, path := generateNetworkConfig(podmanTest)
+ defer removeConf(path)
+
+ session := podmanTest.Podman([]string{"network", "ls", "--filter", "plugin=bridge", "--filter", "name=" + name})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(ContainSubstring(name))
+ })
+
+ It("podman network list --filter two names", func() {
+ name1, path1 := generateNetworkConfig(podmanTest)
+ defer removeConf(path1)
+
+ name2, path2 := generateNetworkConfig(podmanTest)
+ defer removeConf(path2)
+
+ session := podmanTest.Podman([]string{"network", "ls", "--filter", "name=" + name1, "--filter", "name=" + name2})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(ContainSubstring(name1))
+ Expect(session.OutputToString()).To(ContainSubstring(name2))
+ })
+
+ It("podman network list --filter labels", func() {
+ net1 := "labelnet" + stringid.GenerateNonCryptoID()
+ label1 := "testlabel1=abc"
+ label2 := "abcdef"
+ session := podmanTest.Podman([]string{"network", "create", "--label", label1, net1})
+ session.WaitWithDefaultTimeout()
+ defer podmanTest.removeCNINetwork(net1)
+ Expect(session.ExitCode()).To(BeZero())
+
+ net2 := "labelnet" + stringid.GenerateNonCryptoID()
+ session = podmanTest.Podman([]string{"network", "create", "--label", label1, "--label", label2, net2})
+ session.WaitWithDefaultTimeout()
+ defer podmanTest.removeCNINetwork(net2)
+ Expect(session.ExitCode()).To(BeZero())
+
+ session = podmanTest.Podman([]string{"network", "ls", "--filter", "label=" + label1})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(ContainSubstring(net1))
+ Expect(session.OutputToString()).To(ContainSubstring(net2))
+
+ session = podmanTest.Podman([]string{"network", "ls", "--filter", "label=" + label1, "--filter", "label=" + label2})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).ToNot(ContainSubstring(net1))
+ Expect(session.OutputToString()).To(ContainSubstring(net2))
+ })
+
+ It("podman network list --filter invalid value", func() {
+ session := podmanTest.Podman([]string{"network", "ls", "--filter", "namr=ab"})
+ session.WaitWithDefaultTimeout()
+ Expect(session).To(ExitWithError())
+ Expect(session.ErrorToString()).To(ContainSubstring(`invalid filter "namr"`))
+ })
+
It("podman network list --filter failure", func() {
name, path := generateNetworkConfig(podmanTest)
defer removeConf(path)
diff --git a/test/e2e/pull_test.go b/test/e2e/pull_test.go
index f1b055d6d..c572fc5ac 100644
--- a/test/e2e/pull_test.go
+++ b/test/e2e/pull_test.go
@@ -4,6 +4,7 @@ import (
"fmt"
"os"
"path/filepath"
+ "runtime"
"strings"
. "github.com/containers/podman/v2/test/utils"
@@ -494,4 +495,31 @@ var _ = Describe("Podman pull", func() {
Expect(data[0].ID).To(Equal(image1))
}
})
+
+ It("podman pull --platform", func() {
+ session := podmanTest.Podman([]string{"pull", "--platform=linux/bogus", ALPINE})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(125))
+ expectedError := "no image found in manifest list for architecture bogus"
+ Expect(session.ErrorToString()).To(ContainSubstring(expectedError))
+
+ session = podmanTest.Podman([]string{"pull", "--platform=linux/arm64", "--override-os", "windows", ALPINE})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(125))
+ expectedError = "--platform option can not be specified with --overide-arch or --override-os"
+ Expect(session.ErrorToString()).To(ContainSubstring(expectedError))
+
+ session = podmanTest.Podman([]string{"pull", "-q", "--platform=linux/arm64", ALPINE})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+
+ setup := podmanTest.Podman([]string{"image", "inspect", session.OutputToString()})
+ setup.WaitWithDefaultTimeout()
+ Expect(setup.ExitCode()).To(Equal(0))
+
+ data := setup.InspectImageJSON() // returns []inspect.ImageData
+ Expect(len(data)).To(Equal(1))
+ Expect(data[0].Os).To(Equal(runtime.GOOS))
+ Expect(data[0].Architecture).To(Equal("arm64"))
+ })
})
diff --git a/test/system/010-images.bats b/test/system/010-images.bats
index 98bb0cc57..ee6da30ec 100644
--- a/test/system/010-images.bats
+++ b/test/system/010-images.bats
@@ -59,7 +59,8 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
@test "podman images - history output" {
# podman history is persistent: it permanently alters our base image.
# Create a dummy image here so we leave our setup as we found it.
- run_podman run --name my-container $IMAGE true
+ # Multiple --name options confirm command-line override (last one wins)
+ run_podman run --name ignore-me --name my-container $IMAGE true
run_podman commit my-container my-test-image
run_podman images my-test-image --format '{{ .History }}'
@@ -87,7 +88,8 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
}
@test "podman images - filter" {
- run_podman inspect --format '{{.ID}}' $IMAGE
+ # Multiple --format options confirm command-line override (last one wins)
+ run_podman inspect --format '{{.XYZ}}' --format '{{.ID}}' $IMAGE
iid=$output
run_podman images --noheading --filter=after=$iid
diff --git a/test/system/030-run.bats b/test/system/030-run.bats
index 71831da10..37695f205 100644
--- a/test/system/030-run.bats
+++ b/test/system/030-run.bats
@@ -449,7 +449,9 @@ json-file | f
msg=$(random_string 20)
pidfile="${PODMAN_TMPDIR}/$(random_string 20)"
- run_podman run --name myctr --log-driver journald --conmon-pidfile $pidfile $IMAGE echo $msg
+ # Multiple --log-driver options to confirm that last one wins
+ run_podman run --name myctr --log-driver=none --log-driver journald \
+ --conmon-pidfile $pidfile $IMAGE echo $msg
journalctl --output cat _PID=$(cat $pidfile)
is "$output" "$msg" "check that journalctl output equals the container output"
@@ -464,7 +466,9 @@ json-file | f
run_podman run --rm $IMAGE date -r $testfile
is "$output" "Sun Sep 13 12:26:40 UTC 2020" "podman run with no TZ"
- run_podman run --rm --tz=MST7MDT $IMAGE date -r $testfile
+ # Multiple --tz options; confirm that the last one wins
+ run_podman run --rm --tz=US/Eastern --tz=Iceland --tz=MST7MDT \
+ $IMAGE date -r $testfile
is "$output" "Sun Sep 13 06:26:40 MDT 2020" "podman run with --tz=MST7MDT"
# --tz=local pays attention to /etc/localtime, not $TZ. We set TZ anyway,
@@ -533,8 +537,15 @@ json-file | f
}
@test "podman run with --net=host and --port prints warning" {
- run_podman run -d --rm -p 8080 --net=host $IMAGE ls > /dev/null
- is "$output" ".*Port mappings have been discarded as one of the Host, Container, Pod, and None network modes are in use"
+ rand=$(random_string 10)
+
+ # Please keep the duplicate "--net" options; this tests against #8507,
+ # a regression in which subsequent --net options did not override earlier.
+ run_podman run --rm -p 8080 --net=none --net=host $IMAGE echo $rand
+ is "${lines[0]}" \
+ "Port mappings have been discarded as one of the Host, Container, Pod, and None network modes are in use" \
+ "Warning is emitted before container output"
+ is "${lines[1]}" "$rand" "Container runs successfully despite warning"
}
# vim: filetype=sh
diff --git a/test/system/040-ps.bats b/test/system/040-ps.bats
index dec2df4d5..1ed2779b2 100644
--- a/test/system/040-ps.bats
+++ b/test/system/040-ps.bats
@@ -35,4 +35,51 @@ load helpers
run_podman rm $cid
}
+@test "podman ps --filter" {
+ run_podman run -d --name runner $IMAGE top
+ cid_runner=$output
+
+ run_podman run -d --name stopped $IMAGE true
+ cid_stopped=$output
+ run_podman wait stopped
+
+ run_podman run -d --name failed $IMAGE false
+ cid_failed=$output
+ run_podman wait failed
+
+ run_podman create --name created $IMAGE echo hi
+ cid_created=$output
+
+ run_podman ps --filter name=runner --format '{{.ID}}'
+ is "$output" "${cid_runner:0:12}" "filter: name=runner"
+
+ # Stopped container should not appear (because we're not using -a)
+ run_podman ps --filter name=stopped --format '{{.ID}}'
+ is "$output" "" "filter: name=stopped (without -a)"
+
+ # Again, but with -a
+ run_podman ps -a --filter name=stopped --format '{{.ID}}'
+ is "$output" "${cid_stopped:0:12}" "filter: name=stopped (with -a)"
+
+ run_podman ps --filter status=stopped --format '{{.Names}}' --sort names
+ is "${lines[0]}" "failed" "status=stopped: 1 of 2"
+ is "${lines[1]}" "stopped" "status=stopped: 2 of 2"
+
+ run_podman ps --filter status=exited --filter exited=0 --format '{{.Names}}'
+ is "$output" "stopped" "exited=0"
+
+ run_podman ps --filter status=exited --filter exited=1 --format '{{.Names}}'
+ is "$output" "failed" "exited=1"
+
+ # Multiple statuses allowed; and test sort=created
+ run_podman ps -a --filter status=exited --filter status=running \
+ --format '{{.Names}}' --sort created
+ is "${lines[0]}" "runner" "status=stopped: 1 of 3"
+ is "${lines[1]}" "stopped" "status=stopped: 2 of 3"
+ is "${lines[2]}" "failed" "status=stopped: 3 of 3"
+
+ run_podman stop -t 1 runner
+ run_podman rm -a
+}
+
# vim: filetype=sh
diff --git a/test/system/070-build.bats b/test/system/070-build.bats
index 83bcd13eb..59da503a6 100644
--- a/test/system/070-build.bats
+++ b/test/system/070-build.bats
@@ -135,10 +135,13 @@ echo "\$1"
printenv | grep MYENV | sort | sed -e 's/^MYENV.=//'
EOF
- # For overriding with --env-file
- cat >$PODMAN_TMPDIR/env-file <<EOF
+ # For overriding with --env-file; using multiple files confirms that
+ # the --env-file option is cumulative, not last-one-wins.
+ cat >$PODMAN_TMPDIR/env-file1 <<EOF
MYENV3=$s_env3
http_proxy=http-proxy-in-env-file
+EOF
+ cat >$PODMAN_TMPDIR/env-file2 <<EOF
https_proxy=https-proxy-in-env-file
EOF
@@ -185,7 +188,8 @@ EOF
export MYENV2="$s_env2"
export MYENV3="env-file-should-override-env-host!"
run_podman run --rm \
- --env-file=$PODMAN_TMPDIR/env-file \
+ --env-file=$PODMAN_TMPDIR/env-file1 \
+ --env-file=$PODMAN_TMPDIR/env-file2 \
${ENVHOST} \
-e MYENV4="$s_env4" \
build_test
@@ -205,7 +209,9 @@ EOF
# Proxies - environment should override container, but not env-file
http_proxy=http-proxy-from-env ftp_proxy=ftp-proxy-from-env \
- run_podman run --rm --env-file=$PODMAN_TMPDIR/env-file \
+ run_podman run --rm \
+ --env-file=$PODMAN_TMPDIR/env-file1 \
+ --env-file=$PODMAN_TMPDIR/env-file2 \
build_test \
printenv http_proxy https_proxy ftp_proxy
is "${lines[0]}" "http-proxy-in-env-file" "env-file overrides env"
@@ -222,7 +228,8 @@ EOF
is "$output" "$workdir" "pwd command in container"
# Determine buildah version, so we can confirm it gets into Labels
- run_podman info --format '{{ .Host.BuildahVersion }}'
+ # Multiple --format options confirm command-line override (last one wins)
+ run_podman info --format '{{.Ignore}}' --format '{{ .Host.BuildahVersion }}'
is "$output" "[1-9][0-9.-]\+" ".Host.BuildahVersion is reasonable"
buildah_version=$output
diff --git a/test/system/075-exec.bats b/test/system/075-exec.bats
index edd7dedc4..c028e16c9 100644
--- a/test/system/075-exec.bats
+++ b/test/system/075-exec.bats
@@ -91,7 +91,8 @@ load helpers
# #6829 : add username to /etc/passwd inside container if --userns=keep-id
@test "podman exec - with keep-id" {
- run_podman run -d --userns=keep-id $IMAGE sh -c \
+ # Multiple --userns options confirm command-line override (last one wins)
+ run_podman run -d --userns=private --userns=keep-id $IMAGE sh -c \
"echo READY;while [ ! -f /tmp/stop ]; do sleep 1; done"
cid="$output"
wait_for_ready $cid
diff --git a/test/system/200-pod.bats b/test/system/200-pod.bats
index b0f645c53..51835e4a3 100644
--- a/test/system/200-pod.bats
+++ b/test/system/200-pod.bats
@@ -286,6 +286,10 @@ EOF
is "$output" "nc: bind: Address in use" \
"two containers cannot bind to same port"
+ # make sure we can ping; failure here might mean that capabilities are wrong
+ run_podman run --rm --pod mypod $IMAGE ping -c1 127.0.0.1
+ run_podman run --rm --pod mypod $IMAGE ping -c1 $hostname
+
# While the container is still running, run 'podman ps' (no --format)
# and confirm that the output includes the published port
run_podman ps --filter id=$cid