Skip to content

Commit

Permalink
Merge branch 'master' into Inventory-dockerfile-GF
Browse files Browse the repository at this point in the history
  • Loading branch information
lrineau authored Nov 29, 2024
2 parents 59b4f88 + a24ef0f commit a4a5746
Showing 1 changed file with 237 additions and 0 deletions.
237 changes: 237 additions & 0 deletions list_test_runner_machines
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
#!/bin/bash

TEST_MACHINES=$(
cat <<'HEREDOC'
lrineau@bonnard
lrineau@cgal
cgaltest@friedrich
lrineau@rubens
HEREDOC
)

machine_title() {
printf '\n## %s ##\n' $1
}

machine_tested_images() {
echo
echo '```plain'
ssh $1 cat /home/$2/.config/CGAL/test_cgal_docker_images
echo '```'
}

docker_is_active_cmd() {
systemctl is-active -q docker
return $?
}
declare -xf docker_is_active_cmd

docker_cmd() {
if docker_is_active_cmd; then
docker $@
else
podman --url unix:/var/run/podman/podman.sock $@
fi
}
declare -xf docker_cmd

list_of_containers_cmd() {
docker_cmd ps -a --format '{{.Names}}' --filter name="CGAL-"
}
declare -xf list_of_containers_cmd

container_status_cmd() {
docker_cmd inspect --format '{{.State.Status}}' $1
}
declare -xf container_status_cmd

container_human_readable_status_cmd() {
docker_cmd ps --all --filter name=$1 --format '{{.Status}}'
}
declare -xf container_human_readable_status_cmd

simplify_date_cmd() {
date=$1
pattern=' \+[0-9]{4} [A-Z]{3,}$'
if [[ $date =~ $pattern ]]; then
date=${date% *}
fi
echo "$date"
}
declare -xf simplify_date_cmd

container_start_time_cmd() {
simplify_date_cmd "$(docker_cmd inspect --format '{{.State.StartedAt}}' $1)"
}
declare -xf container_start_time_cmd

container_end_time_cmd() {
simplify_date_cmd "$(docker_cmd inspect --format '{{.State.FinishedAt}}' $1)"
}
declare -xf container_end_time_cmd

container_running_time_cmd() {
start_time=$(container_start_time_cmd $1)
end_time=$(container_end_time_cmd $1)
status=$(container_status_cmd $1)
if [ "$status" = "running" ]; then
end_time=$(date -u '+%Y-%m-%dT%H:%M:%S.%NZ')
fi
secs=$(($(date -d "$end_time" +%s) - $(date -d "$start_time" +%s)))
printf '%02dh:%02dm:%02ds\n' $((secs / 3600)) $((secs % 3600 / 60)) $((secs % 60))
}
declare -xf container_running_time_cmd

display_one_container_line_cmd() {
printf '%s\t%s\t%s\t%s\t%s\n' "$1" "$2" "$3" "$4" "$5"
}
declare -xf display_one_container_line_cmd

list_cgal_test_container_cmd() {
# docker_cmd ps -a --filter name=CGAL-
display_one_container_line_cmd "CONTAINER" "START TIME" "END TIME" "RUNNING TIME" "STATUS"
for container in $(list_of_containers_cmd); do
start_time="$(container_start_time_cmd $container)"
end_time="$(container_end_time_cmd $container)"
dur=$(container_running_time_cmd $container)
status="$(container_status_cmd $container) - $(container_human_readable_status_cmd $container)"
display_one_container_line_cmd "$container" "$start_time" "$end_time" "$dur" "$status"
done
}
declare -xf list_cgal_test_container_cmd

display_all_exported_cmd_functions() {
funcs=$(declare -F | awk '/ -fx .*_cmd$/ {print $3}')
for func in $funcs; do
declare -f $func
done
}

machine_list_cgal_test_container() {
printf '\n```tsv\n'
remote_script=$(
display_all_exported_cmd_functions
echo list_cgal_test_container_cmd
)
ssh $1 bash -s <<<"$remote_script"
printf '```\n'
}

help() {
cat <<HEREDOC
Usage: $0 [OPTION]
List the test runner machines and the containers running on them.
Options:
--table output in markdown table format
--column output in column format
--bat output with bat
--plain output in plain text
If no option is given, the script will try to use bat, then column, and finally
plain text.
HEREDOC
}

error_out() {
echo "ERROR: $1"
echo
help
exit 1
}

command -v sed >/dev/null || {
error_out 'sed is required'
}


if [[ $1 == --table ]] && ! command -v pandoc >/dev/null; then
error_out 'pandoc is required for the option --table'
fi
if [[ $1 == --column ]] && ! command -v column >/dev/null; then
error_out 'column is required for the option --column'
fi
if [[ $1 == --bat ]] && ! command -v bat >/dev/null; then
error_out 'bat is required for the option --bat'
fi

set_pretty_csv_to_md_table() {
pretty_csv() (
echo
sed '/```/ d; /^$/ d' | pandoc -f tsv -t gfm
)
}

set_pretty_csv_to_column() {
pretty_csv() {
echo
column -t -s $'\t' -o $'\t' | sed 's/^\(```[^ ]*\) *\t.*/\1/'
}
}

set_pretty_csv_to_bat() {
pretty_csv() {
bat --tabs=50 --paging=never --plain -l csv
}
}

set_pretty_csv_to_cat() {
pretty_csv() {
cat
}
}

case "$1" in
--table) set_pretty_csv_to_md_table ;;
--column) set_pretty_csv_to_column ;;
--bat) set_pretty_csv_to_bat ;;
--plain) set_pretty_csv_to_cat ;;
'')
if command -v bat >/dev/null; then
set_pretty_csv_to_bat
elif command -v column >/dev/null; then
set_pretty_csv_to_column
elif command -v pandoc >/dev/null; then
set_pretty_csv_to_md_table
else
set_pretty_csv_to_cat
fi
;;
*)
error_out "Unknown option $1"
;;
esac

ERROR_MACHINES=""
for machine in $TEST_MACHINES; do
USER=${machine%@*}
HOST=${machine#*@}
ssh $HOST test -f /home/$USER/.config/CGAL/test_cgal_docker_images || {
ERROR_MACHINES="$ERROR_MACHINES $machine"
}
done
if [ -n "$ERROR_MACHINES" ]; then
for machine in $ERROR_MACHINES; do
USER=${machine%@*}
HOST=${machine#*@}
printf 'ERROR: cannot read file `/home/%s/.config/CGAL/test_cgal_docker_images` on ssh host `%s`\n' $USER $HOST
done
exit 1
fi
cat <<HEREDOC
# Test runner machines #
The following machines are used to run the tests:
HEREDOC

for machine in $TEST_MACHINES; do
USER=${machine%@*}
HOST=${machine#*@}
machine_title $machine
printf '\nusing `%s`\n' "$(ssh $HOST docker --version)"
printf '\nTested images:\n'
machine_tested_images $HOST $USER
printf '\nCGAL test containers:\n'
machine_list_cgal_test_container $HOST $USER | pretty_csv
done

0 comments on commit a4a5746

Please sign in to comment.