thread-master/scripts/test-job-cancel.sh

76 lines
2.0 KiB
Bash
Raw Permalink Normal View History

2026-06-26 08:37:04 +00:00
#!/usr/bin/env bash
# 示範 job 建立與取消running 時會透過 Redis jobs:cancel:<id> 戳 worker
#
# 用法:
# ./scripts/test-job-cancel.sh
set -u
BASE_URL="${BASE_URL:-http://127.0.0.1:8890}"
SCOPE="${SCOPE:-user}"
SCOPE_ID="${SCOPE_ID:-demo_user_1}"
require_cmd() {
command -v "$1" >/dev/null 2>&1 || { echo "missing command: $1"; exit 1; }
}
require_cmd curl
require_cmd jq
echo "== create demo_long_task =="
CREATE_BODY="$(curl -sS -X POST "${BASE_URL}/api/v1/jobs" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg scope "$SCOPE" --arg scope_id "$SCOPE_ID" '{
template_type: "demo_long_task",
scope: $scope,
scope_id: $scope_id,
payload: {target: "demo"}
}')")"
echo "$CREATE_BODY" | jq .
JOB_ID="$(echo "$CREATE_BODY" | jq -r '.data.id // empty')"
if [[ -z "$JOB_ID" ]]; then
echo "failed to create job"
exit 1
fi
echo ""
echo "== wait until running (max 10s) =="
for _ in $(seq 1 20); do
STATUS="$(curl -sS "${BASE_URL}/api/v1/jobs/${JOB_ID}" | jq -r '.data.status')"
echo "status: $STATUS"
if [[ "$STATUS" == "running" || "$STATUS" == "cancel_requested" ]]; then
break
fi
if [[ "$STATUS" == "succeeded" || "$STATUS" == "cancelled" ]]; then
echo "job finished before cancel test: $STATUS"
exit 0
fi
sleep 0.5
done
echo ""
echo "== cancel while worker is active =="
CANCEL_BODY="$(curl -sS -X POST "${BASE_URL}/api/v1/jobs/${JOB_ID}/cancel" \
-H "Content-Type: application/json" \
-d '{"reason":"demo cancel from script"}')"
echo "$CANCEL_BODY" | jq .
echo ""
echo "== poll until cancelled (max 20s) =="
for _ in $(seq 1 40); do
BODY="$(curl -sS "${BASE_URL}/api/v1/jobs/${JOB_ID}")"
STATUS="$(echo "$BODY" | jq -r '.data.status')"
PHASE="$(echo "$BODY" | jq -r '.data.phase')"
SUMMARY="$(echo "$BODY" | jq -r '.data.progress.summary')"
echo "status=$STATUS phase=$PHASE summary=$SUMMARY"
if [[ "$STATUS" == "cancelled" ]]; then
echo ""
echo "ok: worker acknowledged cancel"
exit 0
fi
sleep 0.5
done
echo "timeout waiting for cancelled status"
exit 1