openenv / validate.sh
shxam's picture
initial commit for openenv
14cbaba
Raw History Blame Contribute Delete
5.31 kB
#!/usr/bin/env bash
#
# validate-submission.sh β€” OpenEnv Submission Validator
#
# Run this in Git Bash (Windows) or any terminal (Mac/Linux):
#
# bash validate-submission.sh <your-hf-space-url> .
#
# Example:
# bash validate-submission.sh https://sham-gst-recon-env.hf.space .
#
set -uo pipefail
DOCKER_BUILD_TIMEOUT=600
if [ -t 1 ]; then
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BOLD='\033[1m'; NC='\033[0m'
else
RED=''; GREEN=''; YELLOW=''; BOLD=''; NC=''
fi
run_with_timeout() {
local secs="$1"; shift
if command -v timeout &>/dev/null; then timeout "$secs" "$@"
elif command -v gtimeout &>/dev/null; then gtimeout "$secs" "$@"
else "$@"; fi
}
portable_mktemp() {
mktemp "${TMPDIR:-/tmp}/validate-XXXXXX" 2>/dev/null || mktemp
}
CLEANUP_FILES=()
cleanup() { rm -f "${CLEANUP_FILES[@]+"${CLEANUP_FILES[@]}"}"; }
trap cleanup EXIT
PING_URL="${1:-}"
REPO_DIR="${2:-.}"
if [ -z "$PING_URL" ]; then
printf "Usage: bash validate-submission.sh <hf_space_url> [repo_dir]\n"
printf "\nExample: bash validate-submission.sh https://sham-gst-recon-env.hf.space .\n"
exit 1
fi
if ! REPO_DIR="$(cd "$REPO_DIR" 2>/dev/null && pwd)"; then
printf "Error: directory '%s' not found\n" "${2:-.}"; exit 1
fi
PING_URL="${PING_URL%/}"
PASS=0
log() { printf "[%s] %b\n" "$(date -u +%H:%M:%S)" "$*"; }
pass() { log "${GREEN}PASSED${NC} -- $1"; PASS=$((PASS + 1)); }
fail() { log "${RED}FAILED${NC} -- $1"; }
hint() { printf " ${YELLOW}Hint:${NC} %b\n" "$1"; }
stop_at() {
printf "\n${RED}${BOLD}Stopped at %s.${NC} Fix the above before continuing.\n" "$1"
exit 1
}
printf "\n${BOLD}========================================${NC}\n"
printf "${BOLD} OpenEnv Submission Validator${NC}\n"
printf "${BOLD}========================================${NC}\n"
log "Repo: $REPO_DIR"
log "Ping URL: $PING_URL"
printf "\n"
# ── Step 1: Ping HF Space ────────────────────────────────────────────────────
log "${BOLD}Step 1/3: Pinging HF Space${NC} ($PING_URL/reset) ..."
CURL_OUTPUT=$(portable_mktemp "validate-curl")
CLEANUP_FILES+=("$CURL_OUTPUT")
HTTP_CODE=$(curl -s -o "$CURL_OUTPUT" -w "%{http_code}" \
-X POST -H "Content-Type: application/json" \
-d '{"task_id":"task1_easy"}' \
"$PING_URL/reset" --max-time 30 2>/dev/null || printf "000")
if [ "$HTTP_CODE" = "200" ]; then
pass "HF Space is live and responds to /reset"
elif [ "$HTTP_CODE" = "422" ]; then
# 422 means the server is up but rejected the empty body β€” that's fine, server is alive
pass "HF Space is live (responds to /reset with 422 β€” server is running)"
elif [ "$HTTP_CODE" = "000" ]; then
fail "HF Space not reachable (connection failed or timed out)"
hint "Make sure your Space shows 'Running' status on huggingface.co"
hint "Try opening $PING_URL in your browser first"
stop_at "Step 1"
else
fail "HF Space /reset returned HTTP $HTTP_CODE (expected 200 or 422)"
hint "Check your Space's Build Logs on huggingface.co for errors"
stop_at "Step 1"
fi
# ── Step 2: Docker build ─────────────────────────────────────────────────────
log "${BOLD}Step 2/3: Running docker build${NC} ..."
if ! command -v docker &>/dev/null; then
fail "docker command not found"
hint "Install Docker Desktop: docker.com/products/docker-desktop"
stop_at "Step 2"
fi
if [ -f "$REPO_DIR/Dockerfile" ]; then
DOCKER_CONTEXT="$REPO_DIR"
elif [ -f "$REPO_DIR/server/Dockerfile" ]; then
DOCKER_CONTEXT="$REPO_DIR/server"
else
fail "No Dockerfile found in repo root or server/"
stop_at "Step 2"
fi
log " Found Dockerfile in $DOCKER_CONTEXT"
BUILD_OK=false
BUILD_OUTPUT=$(run_with_timeout "$DOCKER_BUILD_TIMEOUT" docker build "$DOCKER_CONTEXT" 2>&1) && BUILD_OK=true
if [ "$BUILD_OK" = true ]; then
pass "Docker build succeeded"
else
fail "Docker build failed (timeout=${DOCKER_BUILD_TIMEOUT}s)"
printf "%s\n" "$BUILD_OUTPUT" | tail -20
stop_at "Step 2"
fi
# ── Step 3: openenv validate ─────────────────────────────────────────────────
log "${BOLD}Step 3/3: Running openenv validate${NC} ..."
if ! command -v openenv &>/dev/null; then
fail "openenv command not found"
hint "Run: pip install openenv-core"
hint "Then re-run this script"
stop_at "Step 3"
fi
VALIDATE_OK=false
VALIDATE_OUTPUT=$(cd "$REPO_DIR" && openenv validate 2>&1) && VALIDATE_OK=true
if [ "$VALIDATE_OK" = true ]; then
pass "openenv validate passed"
[ -n "$VALIDATE_OUTPUT" ] && log " $VALIDATE_OUTPUT"
else
fail "openenv validate failed"
printf "%s\n" "$VALIDATE_OUTPUT"
stop_at "Step 3"
fi
# ── Summary ──────────────────────────────────────────────────────────────────
printf "\n${BOLD}========================================${NC}\n"
printf "${GREEN}${BOLD} All 3/3 checks passed!${NC}\n"
printf "${GREEN}${BOLD} Your submission is ready.${NC}\n"
printf "${BOLD}========================================${NC}\n\n"
exit 0