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

87 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Verify scheme B: same scope_id+target blocks concurrent runs; different targets allow parallel.
#
# Usage:
# ./scripts/test-job-concurrency.sh
set -u
BASE_URL="${BASE_URL:-http://127.0.0.1:8890}"
SCOPE="${SCOPE:-user}"
SCOPE_ID="${SCOPE_ID:-concurrency_demo_user}"
TEMPLATE_TYPE="${TEMPLATE_TYPE:-demo_long_task}"
TARGET_A="${TARGET_A:-building_A}"
TARGET_B="${TARGET_B:-building_B}"
require_cmd() {
command -v "$1" >/dev/null 2>&1 || { echo "missing command: $1"; exit 1; }
}
require_cmd curl
require_cmd jq
create_job() {
local target="$1"
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" --arg template "$TEMPLATE_TYPE" --arg target "$target" '{
template_type: $template,
scope: $scope,
scope_id: $scope_id,
payload: {target: $target}
}')"
}
echo "== configure template for scheme B =="
PUT_BODY="$(curl -sS -X PUT "${BASE_URL}/api/v1/job/templates/${TEMPLATE_TYPE}" \
-H "Content-Type: application/json" \
-d "$(jq -n '{
name: "Demo Long Task",
enabled: true,
repeatable: true,
concurrency_policy: "allow_parallel",
dedupe_keys: ["scope_id", "target"],
timeout_seconds: 600,
cancel_policy: {supported: true, mode: "cooperative", grace_seconds: 30},
retry_policy: {max_attempts: 2, backoff_seconds: [30, 120]},
steps: [
{id: "prepare", name: "Prepare", worker_type: "go", timeout_seconds: 60, cancelable: true},
{id: "execute", name: "Execute", worker_type: "go", timeout_seconds: 300, cancelable: true},
{id: "finalize", name: "Finalize", worker_type: "go", timeout_seconds: 30, cancelable: false}
]
}')")"
echo "$PUT_BODY" | jq .
if [[ "$(echo "$PUT_BODY" | jq -r '.code')" != "102000" ]]; then
echo "failed to upsert template"
exit 1
fi
echo ""
echo "== same target: first create should succeed =="
FIRST="$(create_job "$TARGET_A")"
echo "$FIRST" | jq .
if [[ "$(echo "$FIRST" | jq -r '.code')" != "102000" ]]; then
echo "first create failed"
exit 1
fi
echo ""
echo "== same target: second create should fail while first is active =="
SECOND="$(create_job "$TARGET_A")"
echo "$SECOND" | jq .
if [[ "$(echo "$SECOND" | jq -r '.code')" == "102000" ]]; then
echo "expected duplicate create to fail"
exit 1
fi
echo ""
echo "== different target: should succeed in parallel =="
THIRD="$(create_job "$TARGET_B")"
echo "$THIRD" | jq .
if [[ "$(echo "$THIRD" | jq -r '.code')" != "102000" ]]; then
echo "different target create failed"
exit 1
fi
echo ""
echo "ok: scheme B concurrency behaves as expected"