bittorrent-benchmarks/docker/bin/kubectl-wait-job

101 lines
3.3 KiB
Plaintext
Raw Normal View History

2024-12-18 14:34:22 -03:00
#!/bin/bash
#
# This is copied from: https://github.com/brianpursley/kubectl-wait-job
#
# This code is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
# To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/
#
# Attribution: This code was inspired by an answer on Stack Overflow licensed under CC BY-SA 4.0.
# Original answer: https://stackoverflow.com/a/60286538/5074828 by Sebastian N (https://stackoverflow.com/users/3745474/sebastian-n)
#
# Check if --help is specified in the arguments and display help text
for arg in "$@"; do
if [[ "$arg" == "--help" ]]; then
echo "Usage: kubectl wait-job [ARGS] [OPTIONS]"
echo ""
echo "This plugin waits for a Kubernetes job to either complete or fail."
echo ""
echo "Arguments:"
echo " [kubectl args] Any args will be passed to kubectl wait."
echo ""
echo "Options:"
echo " [kubectl options] Any options will be passed to kubectl wait."
echo ""
echo "Example:"
echo " kubectl wait-job job-name"
echo ""
exit 0
fi
done
# Make sure there is no --for flag
for arg in "$@"; do
if [[ "$arg" == "--for" || "$arg" == --for=* ]]; then
echo "Error: The '--for' flag cannot be used with this plugin."
exit 2
fi
done
# Cleanup
cleanup() {
if [[ -n $COMPLETE_STDERR ]]; then
rm -f "$COMPLETE_STDERR" 2> /dev/null
fi
if [[ -n $FAILED_STDERR ]]; then
rm -f "$FAILED_STDERR" 2> /dev/null
fi
if [[ -n $COMPLETE_PID ]]; then
kill "$COMPLETE_PID" 2> /dev/null
fi
if [[ -n $FAILED_PID ]]; then
kill "$FAILED_PID" 2> /dev/null
fi
}
trap cleanup EXIT
# Create temporary files to store stderr output
COMPLETE_STDERR=$(mktemp -t kubectl-wait-job-stderr.XXXXXXXXXX) || { echo "error: failed to create temp file"; exit 3; }
FAILED_STDERR=$(mktemp -t kubectl-wait-job-stderr.XXXXXXXXXX) || { echo "error: failed to create temp file"; exit 3; }
# Wait for complete and failed conditions in parallel
kubectl wait job "$@" --for=condition=complete > /dev/null 2> "$COMPLETE_STDERR" &
COMPLETE_PID=$!
kubectl wait job "$@" --for=condition=failed > /dev/null 2> "$FAILED_STDERR" &
FAILED_PID=$!
# Wait for one of the processes to exit (using loop instead of wait -n for compatibility)
while true; do
# Check if the process waiting for the job to complete has exited
unset COMPLETE_RESULT
if ! kill -0 "$COMPLETE_PID" 2>/dev/null; then
wait $COMPLETE_PID;
COMPLETE_RESULT=$?
if [[ $COMPLETE_RESULT -eq 0 ]]; then
echo "Job completed successfully"
exit 0
fi
fi
# Check if the process waiting for the job to fail has exited
unset FAILED_RESULT
if ! kill -0 "$FAILED_PID" 2>/dev/null; then
wait $FAILED_PID
FAILED_RESULT=$?
if [[ $FAILED_RESULT -eq 0 ]]; then
echo "Job failed"
exit 1
fi
fi
# If either process failed, print the stderr output and exit
if [[ -n $COMPLETE_RESULT || -n $FAILED_RESULT ]]; then
cat "$COMPLETE_STDERR" 2> /dev/null
cat "$FAILED_STDERR" 2> /dev/null
echo "error: kubectl wait failed"
exit 3
fi
# Sleep for a short time before checking again
sleep 0.1
done