podman/test/system/075-exec.bats
Valentin Rothberg c63599d361 remote exec: write conmon error on hijacked connection
Make sure to write error from conmon on the hijacked http connection.
This fixes issues where errors were not reported on the client side,
for instance, when specified command was not found on the container.

To future generations: I am sorry.  The code is complex, and there are
many interdependencies among the concurrent goroutines.  I added more
complexity on top but I don't have a good idea of how to reduce
complexity in the available time.

Fixes: #8281
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
2021-01-27 09:58:27 +01:00

107 lines
3.6 KiB
Bash

#!/usr/bin/env bats -*- bats -*-
#
# Tests for podman exec
#
load helpers
@test "podman exec - basic test" {
rand_filename=$(random_string 20)
rand_content=$(random_string 50)
# Start a container. Write random content to random file, then stay
# alive as long as file exists. (This test will remove that file soon.)
run_podman run -d $IMAGE sh -c \
"echo $rand_content >/$rand_filename;echo READY;while [ -f /$rand_filename ]; do sleep 1; done"
cid="$output"
wait_for_ready $cid
run_podman exec $cid sh -c "cat /$rand_filename"
is "$output" "$rand_content" "Can exec and see file in running container"
# Specially defined situations: exec a dir, or no such command.
# We don't check the full error message because runc & crun differ.
run_podman 126 exec $cid /etc
is "$output" ".*permission denied" "podman exec /etc"
run_podman 127 exec $cid /no/such/command
is "$output" ".*such file or dir" "podman exec /no/such/command"
# Done
run_podman exec $cid rm -f /$rand_filename
run_podman wait $cid
is "$output" "0" "output from podman wait (container exit code)"
run_podman rm $cid
}
@test "podman exec - leak check" {
skip_if_remote "test is meaningless over remote"
# Start a container in the background then run exec command
# three times and make sure no any exec pid hash file leak
run_podman run -td $IMAGE /bin/sh
cid="$output"
is "$(check_exec_pid)" "" "exec pid hash file indeed doesn't exist"
for i in {1..3}; do
run_podman exec $cid /bin/true
done
is "$(check_exec_pid)" "" "there isn't any exec pid hash file leak"
run_podman stop --time 1 $cid
run_podman rm -f $cid
}
# Issue #4785 - piping to exec statement - fixed in #4818
# Issue #5046 - piping to exec truncates results (actually a conmon issue)
@test "podman exec - cat from stdin" {
skip_if_remote "FIXME: pending #7360"
run_podman run -d $IMAGE sh -c 'while [ ! -e /stop ]; do sleep 0.1;done'
cid="$output"
echo_string=$(random_string 20)
run_podman exec -i $cid cat < <(echo $echo_string)
is "$output" "$echo_string" "output read back from 'exec cat'"
# #5046 - large file content gets lost via exec
# Generate a large file with random content; get a hash of its content
local bigfile=${PODMAN_TMPDIR}/bigfile
dd if=/dev/urandom of=$bigfile bs=1024 count=1500
expect=$(sha512sum $bigfile | awk '{print $1}')
# Transfer it to container, via exec, make sure correct #bytes are sent
run_podman exec -i $cid dd of=/tmp/bigfile bs=512 <$bigfile
is "${lines[0]}" "3000+0 records in" "dd: number of records in"
is "${lines[1]}" "3000+0 records out" "dd: number of records out"
# Verify sha. '% *' strips off the path, keeping only the SHA
run_podman exec $cid sha512sum /tmp/bigfile
is "${output% *}" "$expect" "SHA of file in container"
# Clean up
run_podman exec $cid touch /stop
run_podman wait $cid
run_podman rm $cid
}
# #6829 : add username to /etc/passwd inside container if --userns=keep-id
@test "podman exec - with keep-id" {
# 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
run_podman exec $cid id -un
is "$output" "$(id -un)" "container is running as current user"
run_podman exec --user=$(id -un) $cid touch /tmp/stop
run_podman wait $cid
run_podman rm $cid
}
# vim: filetype=sh