mirror of
https://github.com/containers/podman.git
synced 2025-05-20 00:27:03 +08:00
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:
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
###################
|
||||
|
Reference in New Issue
Block a user