lobster_travel_full_validation.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env bash
  2. # Lobster travel full-chain validation (calls running fs-saas-company :8006).
  3. # Usage:
  4. # cd java/scripts && chmod +x lobster_travel_full_validation.sh
  5. # ./lobster_travel_full_validation.sh
  6. # API_BASE=http://127.0.0.1:8006 COMPANY_ID=338 TENANT_ID=33 ./lobster_travel_full_validation.sh
  7. # SKIP_STRESS=1 ./lobster_travel_full_validation.sh
  8. set -euo pipefail
  9. API_BASE="${API_BASE:-http://127.0.0.1:8006}"
  10. COMPANY_ID="${COMPANY_ID:-338}"
  11. TENANT_ID="${TENANT_ID:-33}"
  12. OPS_SECRET="${OPS_SECRET:-lobster-dev-ops}"
  13. SKIP_STRESS="${SKIP_STRESS:-0}"
  14. DIALOGUE_INDUSTRY="${DIALOGUE_INDUSTRY:-travel}"
  15. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  16. REPORT_DIR="${SCRIPT_DIR}/reports"
  17. STAMP="$(date +%Y%m%d-%H%M%S)"
  18. REPORT_FILE="${REPORT_DIR}/lobster-travel-validation-${STAMP}.json"
  19. mkdir -p "${REPORT_DIR}"
  20. echo "=== Lobster Travel Full Validation ==="
  21. echo "ApiBase=${API_BASE} CompanyId=${COMPANY_ID} TenantId=${TENANT_ID} DialogueIndustry=${DIALOGUE_INDUSTRY}"
  22. if ! curl -sf -H "X-Lobster-Ops-Secret: ${OPS_SECRET}" \
  23. "${API_BASE}/api/lobster/admin/phase2/verify/${COMPANY_ID}?tenantId=${TENANT_ID}" >/dev/null; then
  24. echo "FAIL service not reachable at ${API_BASE}"
  25. echo "Start fs-saas-company on port 8006 first."
  26. exit 1
  27. fi
  28. echo "OK service reachable"
  29. INCLUDE_STRESS="true"
  30. if [[ "${SKIP_STRESS}" == "1" || "${SKIP_STRESS}" == "true" ]]; then
  31. INCLUDE_STRESS="false"
  32. fi
  33. URI="${API_BASE%/}/api/lobster/admin/validation/travel-full/${COMPANY_ID}?tenantId=${TENANT_ID}&includeStress=${INCLUDE_STRESS}&dialogueIndustry=${DIALOGUE_INDUSTRY}"
  34. echo "POST ${URI}"
  35. echo "Running validation (may take 2-4 min)..."
  36. HTTP_CODE="$(curl -sS -o "${REPORT_FILE}" -w '%{http_code}' \
  37. -X POST \
  38. -H "Content-Type: application/json" \
  39. -H "X-Lobster-Ops-Secret: ${OPS_SECRET}" \
  40. --max-time 900 \
  41. "${URI}")"
  42. if [[ "${HTTP_CODE}" -lt 200 || "${HTTP_CODE}" -ge 300 ]]; then
  43. echo "FAIL HTTP ${HTTP_CODE}"
  44. cat "${REPORT_FILE}" || true
  45. exit 1
  46. fi
  47. cp -f "${REPORT_FILE}" "${REPORT_DIR}/lobster-travel-validation-latest.json"
  48. echo "Report saved: ${REPORT_FILE}"
  49. if command -v python3 >/dev/null 2>&1; then
  50. python3 - <<'PY' "${REPORT_FILE}"
  51. import json, sys
  52. path = sys.argv[1]
  53. with open(path, encoding="utf-8-sig") as f:
  54. j = json.load(f)
  55. print("\n--- Section Summary ---")
  56. sections = j.get("sections") or {}
  57. for name, sec in sections.items():
  58. if name == "stress" and isinstance(sec, dict):
  59. print(" stress:")
  60. for k, st in sec.items():
  61. if isinstance(st, dict) and "passed" in st:
  62. print(f" {k}: {st.get('passed')}")
  63. elif isinstance(sec, dict) and "passed" in sec:
  64. print(f" {name}: {sec.get('passed')} ({sec.get('message', '')})")
  65. print(f"\nDuration: {j.get('durationMs')}ms Overall: {j.get('passed')}")
  66. if j.get("passed") is True:
  67. print("\nPASSED all checks")
  68. sys.exit(0)
  69. print("\nFAILED some checks did not pass")
  70. for f in j.get("failures") or []:
  71. print(f" - {f}")
  72. sys.exit(1)
  73. PY
  74. else
  75. PASSED="$(grep -o '"passed"[[:space:]]*:[[:space:]]*true' "${REPORT_FILE}" | head -1 || true)"
  76. if [[ -n "${PASSED}" ]] && grep -q '"passed"[[:space:]]*:[[:space:]]*true' "${REPORT_FILE}"; then
  77. echo "PASSED (install python3 for detailed summary)"
  78. exit 0
  79. fi
  80. echo "FAILED (install python3 for detailed summary)"
  81. exit 1
  82. fi