From fe8355be7f367593fe2527fb523d1830770ff66c Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 28 Jun 2023 12:48:29 +1000 Subject: [PATCH] pasta: Fix pasta tests to work on hosts with multiple interfaces At various points the pasta bats tests need to know the name of the interface that pasta will use by default, and the host addresses it will use by default. Currently we use the pre-existing helper functions ether_get_name and ipv[46]_get_addr_global to retreive that. However, those just pick the first non-loopback interface or address, which may not be the one that pasta uses if there are multiple connected host interfaces. Replace those helpers with local ones which examine the routing table to more closely match pasta's internal logic about which interface to select. This allows the tests to run successfully on a host with multiple interfaces. Closes: https://github.com/containers/podman/issues/19007 Signed-off-by: David Gibson --- test/system/505-networking-pasta.bats | 32 ++++++++++++++++++--------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/test/system/505-networking-pasta.bats b/test/system/505-networking-pasta.bats index d5b1890641..257da40dc8 100644 --- a/test/system/505-networking-pasta.bats +++ b/test/system/505-networking-pasta.bats @@ -18,6 +18,21 @@ function setup() { XFER_FILE="${PODMAN_TMPDIR}/pasta.bin" } +function default_ifname() { + local ip_ver="${1}" + + local expr='[.[] | select(.dst == "default").dev] | .[0]' + ip -j -"${ip_ver}" route show | jq -rM "${expr}" +} + +function default_addr() { + local ip_ver="${1}" + local ifname="${2:-$(default_ifname "${ip_ver}")}" + + local expr='.[0] | .addr_info[0].local' + ip -j -"${ip_ver}" addr show "${ifname}" | jq -rM "${expr}" +} + # pasta_test_do() - Run tests involving clients and servers # $1: IP version: 4 or 6 # $2: Interface type: "tap" or "loopback" @@ -38,29 +53,26 @@ function pasta_test_do() { # Calculate and set addresses, if [ ${ip_ver} -eq 4 ]; then skip_if_no_ipv4 "IPv4 not routable on the host" - if [ ${iftype} = "loopback" ]; then - local addr="127.0.0.1" - else - local addr="$(ipv4_get_addr_global)" - fi elif [ ${ip_ver} -eq 6 ]; then skip_if_no_ipv6 "IPv6 not routable on the host" if [ ${iftype} = "loopback" ]; then + local ifname="lo" local addr="::1" else - local addr="$(ipv6_get_addr_global)" + local addr="$(ipv6_get_addr_default)" fi else skip "Unsupported IP version" fi - # interface names, if [ ${iftype} = "loopback" ]; then local ifname="lo" else - local ifname="$(ether_get_name)" + local ifname="$(default_ifname "${ip_ver}")" fi + local addr="$(default_addr "${ip_ver}" "${ifname}")" + # ports, if [ ${range} -gt 1 ]; then local port="$(random_free_port_range ${range} ${addr} ${proto})" @@ -168,7 +180,7 @@ function teardown() { run_podman run --net=pasta $IMAGE ip -j -4 address show local container_address="$(ipv4_get_addr_global "${output}")" - local host_address="$(ipv4_get_addr_global)" + local host_address="$(default_addr 4)" assert "${container_address}" = "${host_address}" \ "Container address not matching host" @@ -203,7 +215,7 @@ function teardown() { run_podman run --net=pasta $IMAGE ip -j -6 address show local container_address="$(ipv6_get_addr_global "${output}")" - local host_address="$(ipv6_get_addr_global)" + local host_address="$(default_addr 6)" assert "${container_address}" = "${host_address}" \ "Container address not matching host"