#!/usr/bin/env bash # Lobster travel full-chain validation (calls running fs-saas-company :8006). # Usage: # cd java/scripts && chmod +x lobster_travel_full_validation.sh # ./lobster_travel_full_validation.sh # API_BASE=http://127.0.0.1:8006 COMPANY_ID=338 TENANT_ID=33 ./lobster_travel_full_validation.sh # SKIP_STRESS=1 ./lobster_travel_full_validation.sh set -euo pipefail API_BASE="${API_BASE:-http://127.0.0.1:8006}" COMPANY_ID="${COMPANY_ID:-338}" TENANT_ID="${TENANT_ID:-33}" OPS_SECRET="${OPS_SECRET:-lobster-dev-ops}" SKIP_STRESS="${SKIP_STRESS:-0}" DIALOGUE_INDUSTRY="${DIALOGUE_INDUSTRY:-travel}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPORT_DIR="${SCRIPT_DIR}/reports" STAMP="$(date +%Y%m%d-%H%M%S)" REPORT_FILE="${REPORT_DIR}/lobster-travel-validation-${STAMP}.json" mkdir -p "${REPORT_DIR}" echo "=== Lobster Travel Full Validation ===" echo "ApiBase=${API_BASE} CompanyId=${COMPANY_ID} TenantId=${TENANT_ID} DialogueIndustry=${DIALOGUE_INDUSTRY}" if ! curl -sf -H "X-Lobster-Ops-Secret: ${OPS_SECRET}" \ "${API_BASE}/api/lobster/admin/phase2/verify/${COMPANY_ID}?tenantId=${TENANT_ID}" >/dev/null; then echo "FAIL service not reachable at ${API_BASE}" echo "Start fs-saas-company on port 8006 first." exit 1 fi echo "OK service reachable" INCLUDE_STRESS="true" if [[ "${SKIP_STRESS}" == "1" || "${SKIP_STRESS}" == "true" ]]; then INCLUDE_STRESS="false" fi URI="${API_BASE%/}/api/lobster/admin/validation/travel-full/${COMPANY_ID}?tenantId=${TENANT_ID}&includeStress=${INCLUDE_STRESS}&dialogueIndustry=${DIALOGUE_INDUSTRY}" echo "POST ${URI}" echo "Running validation (may take 2-4 min)..." HTTP_CODE="$(curl -sS -o "${REPORT_FILE}" -w '%{http_code}' \ -X POST \ -H "Content-Type: application/json" \ -H "X-Lobster-Ops-Secret: ${OPS_SECRET}" \ --max-time 900 \ "${URI}")" if [[ "${HTTP_CODE}" -lt 200 || "${HTTP_CODE}" -ge 300 ]]; then echo "FAIL HTTP ${HTTP_CODE}" cat "${REPORT_FILE}" || true exit 1 fi cp -f "${REPORT_FILE}" "${REPORT_DIR}/lobster-travel-validation-latest.json" echo "Report saved: ${REPORT_FILE}" if command -v python3 >/dev/null 2>&1; then python3 - <<'PY' "${REPORT_FILE}" import json, sys path = sys.argv[1] with open(path, encoding="utf-8-sig") as f: j = json.load(f) print("\n--- Section Summary ---") sections = j.get("sections") or {} for name, sec in sections.items(): if name == "stress" and isinstance(sec, dict): print(" stress:") for k, st in sec.items(): if isinstance(st, dict) and "passed" in st: print(f" {k}: {st.get('passed')}") elif isinstance(sec, dict) and "passed" in sec: print(f" {name}: {sec.get('passed')} ({sec.get('message', '')})") print(f"\nDuration: {j.get('durationMs')}ms Overall: {j.get('passed')}") if j.get("passed") is True: print("\nPASSED all checks") sys.exit(0) print("\nFAILED some checks did not pass") for f in j.get("failures") or []: print(f" - {f}") sys.exit(1) PY else PASSED="$(grep -o '"passed"[[:space:]]*:[[:space:]]*true' "${REPORT_FILE}" | head -1 || true)" if [[ -n "${PASSED}" ]] && grep -q '"passed"[[:space:]]*:[[:space:]]*true' "${REPORT_FILE}"; then echo "PASSED (install python3 for detailed summary)" exit 0 fi echo "FAILED (install python3 for detailed summary)" exit 1 fi