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 fi
# Make sure socket is closed # 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" die "Socket still seems open"
fi fi
} }

View File

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

View File

@ -284,7 +284,7 @@ function random_free_port() {
local port local port
for port in $(shuf -i ${range}); do 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 echo $port
return return
fi fi
@ -293,6 +293,35 @@ function random_free_port() {
die "Could not find open port in range $range" 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 # wait_for_port # Returns once port is available on host
################### ###################