#!/usr/bin/env bash # Smoke-check /health and capability endpoints for a built image (DOCKER-44-003) # Usage: ./verify_health_endpoints.sh [port] # Requires: docker, curl or wget set -euo pipefail IMAGE=${1:?"image ref required"} PORT=${2:-8080} CONTAINER_NAME="healthcheck-$$" TIMEOUT=30 SLEEP=1 have_curl=1 if ! command -v curl >/dev/null 2>&1; then have_curl=0 fi req() { local path=$1 local url="http://127.0.0.1:${PORT}${path}" if [[ $have_curl -eq 1 ]]; then curl -fsS --max-time 3 "$url" >/dev/null else wget -qO- --timeout=3 "$url" >/dev/null fi } cleanup() { docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true } trap cleanup EXIT echo "[info] starting container ${IMAGE} on port ${PORT}" >&2 cleanup if ! docker run -d --rm --name "$CONTAINER_NAME" -p "${PORT}:${PORT}" "$IMAGE" >/dev/null; then echo "[error] failed to start image ${IMAGE}" >&2 exit 1 fi # wait for readiness start=$(date +%s) while true; do if req /health/liveness 2>/dev/null; then break; fi now=$(date +%s) if (( now - start > TIMEOUT )); then echo "[error] liveness endpoint did not come up in ${TIMEOUT}s" >&2 exit 1 fi sleep $SLEEP done # verify endpoints fail=0 for path in /health/liveness /health/readiness /version /metrics; do if ! req "$path"; then echo "[error] missing or failing ${path}" >&2 fail=1 fi done # capability endpoint optional; if present ensure merge=false for Concelier/Excititor if req /capabilities 2>/dev/null; then body="$(curl -fsS "http://127.0.0.1:${PORT}/capabilities" 2>/dev/null || true)" if echo "$body" | grep -q '"merge"[[:space:]]*:[[:space:]]*false'; then : else echo "[warn] /capabilities present but merge flag not false" >&2 fi fi exit $fail