blob: b5c45abd07a72fefe3d3b07fb37d395b32be6ef1 [file] [log] [blame]
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +01001#!/bin/bash
2
3# shellcheck disable=SC1091
4. ../../lib/sh-test-lib
5OUTPUT="$(pwd)/output"
6RESULT_FILE="${OUTPUT}/result.txt"
7export RESULT_FILE
8IMAGE="alpine:latest"
9SKIP_INSTALL="True"
Milosz Wasilewskie7254672025-05-12 10:58:42 +010010NETWORK_TYPE="bridge"
11HOST_INTERFACE="eth0"
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010012
13usage() {
Milosz Wasilewskie7254672025-05-12 10:58:42 +010014 echo "$0 [-i <image>] [-n <bridge|host|none>] [-s true|false] [-b eth0]" 1>&2
15 echo " -n option can be a combination of bridge, host and none." 1>&2
16 echo " Options should be space separated." 1>&2
17 echo " In case there are more than one, all tests will be executed." 1>&2
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010018 exit 1
19}
20
Milosz Wasilewskie7254672025-05-12 10:58:42 +010021while getopts "i:s:n:b:h" o; do
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010022 case "$o" in
23 i) IMAGE="${OPTARG}" ;;
24 s) SKIP_INSTALL="${OPTARG}";;
Milosz Wasilewskie7254672025-05-12 10:58:42 +010025 n) NETWORK_TYPE="${OPTARG}";;
26 b) HOST_INTERFACE="${OPTARG}";;
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010027 h|*) usage ;;
28 esac
29done
30
31! check_root && error_msg "You need to be root to run this script."
32create_out_dir "${OUTPUT}"
33cd "${OUTPUT}" || exit
34
35install_docker() {
36 command -v docker && return
37
38 dist_name
39 # shellcheck disable=SC2154
40 case "${dist}" in
41 debian|ubuntu|fedora|centos)
42 install_deps curl jq
43 curl -fsSL get.docker.com -o get-docker.sh
44 sh get-docker.sh
45 ;;
46 *)
47 warn_msg "No package installation support on ${dist}"
48 error_msg "And docker not pre-installed, exiting..."
49 ;;
50 esac
51}
52
Milosz Wasilewskie7254672025-05-12 10:58:42 +010053remove_one_from_skiplist() {
54 echo "$1" | cut -f2- -d" "
55}
56
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010057if [ "${SKIP_INSTALL}" = "True" ] || [ "${SKIP_INSTALL}" = "true" ]; then
58 info_msg "Installation skipped"
59else
60 install_docker
61fi
Milosz Wasilewskie7254672025-05-12 10:58:42 +010062
63HOST_IP=$(ip addr show dev "${HOST_INTERFACE}" | grep "inet " | awk '{ print $2 }' | awk -F "/" '{print $1}')
64
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010065# verify that docker is available
Milosz Wasilewskie7254672025-05-12 10:58:42 +010066for NETWORK in ${NETWORK_TYPE}; do
67 skip_list="${skip_list} docker-network-list-${NETWORK} docker-start-container-${NETWORK} docker-network-inspect-${NETWORK} docker-network-${NETWORK} ping-container-test-${NETWORK} docker-kill-container-${NETWORK} docker-ping-host-network-${NETWORK}"
68done
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010069docker --version
70exit_on_fail "docker-version" "${skip_list}"
71
Milosz Wasilewskie7254672025-05-12 10:58:42 +010072for NETWORK in ${NETWORK_TYPE}; do
73 # check if bridge network is present
74 skip_list=$(remove_one_from_skiplist "${skip_list}")
75 docker network ls -f name="${NETWORK}" | grep "${NETWORK}"
76 exit_on_fail "docker-network-list" "${skip_list}"
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010077
Milosz Wasilewskie7254672025-05-12 10:58:42 +010078 # start simple alpine container
79 skip_list=$(remove_one_from_skiplist "${skip_list}")
80 docker run --name ping_test_container --network "${NETWORK}" --rm -d "${IMAGE}" /bin/sleep 90
81 exit_on_fail "docker-start-container" "${skip_list}"
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010082
Milosz Wasilewskie7254672025-05-12 10:58:42 +010083 # container should join NETWORK network
84 skip_list=$(remove_one_from_skiplist "${skip_list}")
85 DOCKER_INSPECT=$(docker network inspect "${NETWORK}")
86 exit_on_fail "docker-network-inspect-${NETWORK}" "${skip_list}"
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +010087
Milosz Wasilewskie7254672025-05-12 10:58:42 +010088 skip_list=$(remove_one_from_skiplist "${skip_list}")
89 if [ "${NETWORK}" = "bridge" ]; then
90 echo "$DOCKER_INSPECT" | jq '.[0]["Containers"][]'
91 IP_ADDR=$(echo "$DOCKER_INSPECT" | jq '.[0]["Containers"][] | select(.Name=="ping_test_container") | .IPv4Address | split("/")[0]')
92 echo "${IP_ADDR}"
93 if [ -n "$IP_ADDR" ]; then
94 report_pass "docker-network-${NETWORK}"
95 eval "ping -c4 $IP_ADDR"
96 skip_list=$(remove_one_from_skiplist "${skip_list}")
97 check_return "ping-container-test-${NETWORK}"
98 else
99 report_fail "docker-network-${NETWORK}"
100 skip_list=$(remove_one_from_skiplist "${skip_list}")
101 report_skip "ping-container-test-${NETWORK}"
102 fi
103 else
104 report_pass "docker-network-${NETWORK}"
105 skip_list=$(remove_one_from_skiplist "${skip_list}")
106 report_skip "ping-container-test-${NETWORK}"
107 fi
108 skip_list=$(remove_one_from_skiplist "${skip_list}")
109 docker kill ping_test_container
110 check_return "docker-kill-container-${NETWORK}"
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +0100111
Milosz Wasilewskie7254672025-05-12 10:58:42 +0100112 skip_list=$(remove_one_from_skiplist "${skip_list}")
113 if [ -n "${HOST_IP}" ]; then
114 xfail=""
115 if [ "${NETWORK}" = none ]; then
116 # ping should fail with disabled networking
117 xfail="xfail"
118 fi
119 docker run --name ping_localhost_host_network --network "${NETWORK}" --rm "${IMAGE}" ping -4 -c 4 "${HOST_IP}"
120 check_return "docker-ping-host-network-${NETWORK}" "${xfail}"
121 else
122 report_skip "docker-ping-host-network-${NETWORK}"
123 fi
124done
Milosz Wasilewskia3aa2eb2021-07-13 11:01:56 +0100125
Milosz Wasilewskicb6dd472021-05-25 10:27:33 +0100126exit 0