Fix "podman run port forward range" flake

The test must ensure that all ports in the range are free not just
the first. This flakes often because port 5355 is always in use by
systemd-resolved on fedora.

Fixes #14716

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
Paul Holzinger
2022-06-24 15:21:27 +02:00
parent 3176b3fe01
commit 345778ece0
3 changed files with 35 additions and 6 deletions

View File

@ -314,7 +314,7 @@ function _test_skopeo_credential_sharing() {
fi
# Make sure socket is closed
if { exec 3<> /dev/tcp/127.0.0.1/${PODMAN_LOGIN_REGISTRY_PORT}; } &>/dev/null; then
if ! port_is_free $PODMAN_LOGIN_REGISTRY_PORT; then
die "Socket still seems open"
fi
}

View File

@ -676,12 +676,12 @@ EOF
@test "podman run port forward range" {
for netmode in bridge slirp4netns:port_handler=slirp4netns slirp4netns:port_handler=rootlesskit; do
local port=$(random_free_port)
local end_port=$(( $port + 2 ))
local range="$port-$end_port:$port-$end_port"
local range=$(random_free_port_range 3)
local port="${test%-*}"
local end_port="${test#-*}"
local random=$(random_string)
run_podman run --network $netmode -p "$range" -d $IMAGE sleep inf
run_podman run --network $netmode -p "$range:$range" -d $IMAGE sleep inf
cid="$output"
for port in $(seq $port $end_port); do
run_podman exec -d $cid nc -l -p $port -e /bin/cat

View File

@ -284,7 +284,7 @@ function random_free_port() {
local port
for port in $(shuf -i ${range}); do
if ! { exec {unused_fd}<> /dev/tcp/127.0.0.1/$port; } &>/dev/null; then
if port_is_free $port; then
echo $port
return
fi
@ -293,6 +293,35 @@ function random_free_port() {
die "Could not find open port in range $range"
}
function random_free_port_range() {
local size=${1?Usage: random_free_port_range SIZE (as in, number of ports)}
local maxtries=10
while [[ $maxtries -gt 0 ]]; do
local firstport=$(random_free_port)
local all_ports_free=1
for i in $(seq 2 $size); do
if ! port_is_free $((firstport + $i)); then
all_ports_free=
break
fi
done
if [[ -n "$all_ports_free" ]]; then
echo "$firstport-$((firstport + $size - 1))"
return
fi
maxtries=$((maxtries - 1))
done
die "Could not find free port range with size $size"
}
function port_is_free() {
local port=${1?Usage: port_is_free PORT}
! { exec {unused_fd}<> /dev/tcp/127.0.0.1/$port; } &>/dev/null
}
###################
# wait_for_port # Returns once port is available on host
###################