Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | |
| 3 | # shellcheck disable=SC1091 |
| 4 | . ../../lib/sh-test-lib |
| 5 | OUTPUT="$(pwd)/output" |
| 6 | RESULT_FILE="${OUTPUT}/result.txt" |
| 7 | export RESULT_FILE |
| 8 | IMAGE="alpine:latest" |
| 9 | SKIP_INSTALL="True" |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 10 | NETWORK_TYPE="bridge" |
| 11 | HOST_INTERFACE="eth0" |
Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 12 | |
| 13 | usage() { |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 14 | 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 Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 18 | exit 1 |
| 19 | } |
| 20 | |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 21 | while getopts "i:s:n:b:h" o; do |
Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 22 | case "$o" in |
| 23 | i) IMAGE="${OPTARG}" ;; |
| 24 | s) SKIP_INSTALL="${OPTARG}";; |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 25 | n) NETWORK_TYPE="${OPTARG}";; |
| 26 | b) HOST_INTERFACE="${OPTARG}";; |
Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 27 | h|*) usage ;; |
| 28 | esac |
| 29 | done |
| 30 | |
| 31 | ! check_root && error_msg "You need to be root to run this script." |
| 32 | create_out_dir "${OUTPUT}" |
| 33 | cd "${OUTPUT}" || exit |
| 34 | |
| 35 | install_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 Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 53 | remove_one_from_skiplist() { |
| 54 | echo "$1" | cut -f2- -d" " |
| 55 | } |
| 56 | |
Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 57 | if [ "${SKIP_INSTALL}" = "True" ] || [ "${SKIP_INSTALL}" = "true" ]; then |
| 58 | info_msg "Installation skipped" |
| 59 | else |
| 60 | install_docker |
| 61 | fi |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 62 | |
| 63 | HOST_IP=$(ip addr show dev "${HOST_INTERFACE}" | grep "inet " | awk '{ print $2 }' | awk -F "/" '{print $1}') |
| 64 | |
Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 65 | # verify that docker is available |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 66 | for 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}" |
| 68 | done |
Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 69 | docker --version |
| 70 | exit_on_fail "docker-version" "${skip_list}" |
| 71 | |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 72 | for 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 Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 77 | |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 78 | # 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 Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 82 | |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 83 | # 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 Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 87 | |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 88 | 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 Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 111 | |
Milosz Wasilewski | e725467 | 2025-05-12 10:58:42 +0100 | [diff] [blame^] | 112 | 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 |
| 124 | done |
Milosz Wasilewski | a3aa2eb | 2021-07-13 11:01:56 +0100 | [diff] [blame] | 125 | |
Milosz Wasilewski | cb6dd47 | 2021-05-25 10:27:33 +0100 | [diff] [blame] | 126 | exit 0 |