Files
PlantAI-rag-new/tests/smoke_upstreams.sh
T
jerryandClaude Fable 5 0875bb036c P0/M1: 四部分重构——frontend→ui、backend→sdk 改名 + 引用修复 + 骨架
- git mv 保留历史:ui/(Vue3+Vite)、sdk/(BFF 中间层)
- 路径语义修正:db_path/figures_cache 改相对 sdk/(BFF cwd),
  历史库 sdk/backend/data 迁移至 sdk/data/(会话/图片缓存无损)
- 引用修复 ~15 处:config.py、deploy/*.sh、vitest/playwright 配置、
  单测导入路径、docs、README、gitignore、.env.example
- 骨架:agent/{qa,methodology,legacy-rag,vendor}、knowledge/manifest.yaml、
  tooling/{compile,kb,crypto,assemble,audit,tools,scripts} + README
- 门禁验证:sdk pytest 125 通过、ui vitest 158 通过、
  生产 BFF 脚本重启四上游全绿 + 静态托管 + 会话库无损

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 12:56:47 +08:00

128 lines
5.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# smoke_upstreams.sh —— L2s 上游连通性冒烟(T 归属,TEST_PLAN §1/§7)。
# 只读探测远端机上四个服务的健康契约,输出 PASS/FAIL 表。不改任何状态。
# 运行处:远端 plantai-bff 机(上游只绑 127.0.0.1,须在本机执行);Mac 本地经 SSH 隧道
# 运行时用环境变量改 URL(见文末「远程探测」注释)。
# 非 CI 常驻:仅集成点(M2)与验收前手动执行一次。
#
# 环境变量覆盖:
# QA_URL QA 服务根,默认 http://127.0.0.1:7920
# EXTRACT_URL 抽取服务根,默认 http://127.0.0.1:8000
# ALT_URL 回落抽取服务根,默认 http://127.0.0.1:7900
# MOCK_URL mock server 根,默认 http://127.0.0.1:8099
# NEO4J_HTTP Neo4j HTTP 根,默认 http://127.0.0.1:18575(direct-v1-full 实例,DISCOVERY.md §1)
# NEO4J_USER / NEO4J_PASSWORD Neo4j 认证,默认 neo4j / <NEO4J_PASSWORD from sdk/.env>(DISCOVERY.md §2.1)
# TIMEOUT curl 超时秒,默认 4
#
# 注意:不探测 QA /search 与 /chat/stream —— 实测单次 37~92s(DISCOVERY.md §4),
# 冒烟只验证 /health 与 /info 可达。
set -u
QA_URL="${QA_URL:-http://127.0.0.1:7920}"
EXTRACT_URL="${EXTRACT_URL:-http://127.0.0.1:8000}"
ALT_URL="${ALT_URL:-http://127.0.0.1:7900}"
MOCK_URL="${MOCK_URL:-http://127.0.0.1:8099}"
NEO4J_HTTP="${NEO4J_HTTP:-http://127.0.0.1:18575}"
TIMEOUT="${TIMEOUT:-4}"
PASS=0
FAIL=0
FAILED_LINES=()
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT
# check_http <名称> <URL> [预期子串]
check_http() {
local name="$1" url="$2" expect="${3:-}"
local out code
out=$(curl -s -m "$TIMEOUT" -o "$TMP" -w '%{http_code}' "$url" 2>/dev/null)
code=$?
if [ "$code" -ne 0 ]; then
printf '%-16s FAIL 连接失败(curl exit %s)\n' "$name" "$code"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if [ "$out" != "200" ]; then
printf '%-16s FAIL HTTP %s\n' "$name" "$out"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if [ -n "$expect" ] && ! grep -q "$expect" "$TMP"; then
printf '%-16s FAIL HTTP 200 但响应不含「%s」\n' "$name" "$expect"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
printf '%-16s PASS HTTP 200\n' "$name"
PASS=$((PASS+1))
}
# check_neo4j <名称> <HTTP 根>:POST db/neo4j/tx/commit 一条最小只读 Cypher。
# 契约(DISCOVERY.md §2.1):direct-v1-full 需要 Basic auth(neo4j/<NEO4J_PASSWORD from sdk/.env>);
# 凭据经环境变量 NEO4J_USER/NEO4J_PASSWORD 覆盖(默认指向当选实例)。
check_neo4j() {
local name="$1" base="$2"
local user="${NEO4J_USER:-neo4j}"
local pass="${NEO4J_PASSWORD:-<NEO4J_PASSWORD from sdk/.env>}"
local out code
out=$(curl -s -m "$TIMEOUT" -o "$TMP" -w '%{http_code}' \
-u "$user:$pass" \
-X POST -H 'Content-Type: application/json' \
-d '{"statements":[{"statement":"MATCH (e:SRT2CanonicalEntity) RETURN e.name LIMIT 1"}]}' \
"$base/db/neo4j/tx/commit" 2>/dev/null)
code=$?
if [ "$code" -ne 0 ]; then
printf '%-16s FAIL 连接失败(curl exit %s)\n' "$name" "$code"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if [ "$out" != "200" ]; then
printf '%-16s FAIL HTTP %s(认证或实例异常,检查 NEO4J_USER/NEO4J_PASSWORD)\n' "$name" "$out"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if grep -q '"errors":\[\]' "$TMP" && grep -q '"results"' "$TMP"; then
printf '%-16s PASS HTTP 200(Cypher 查询有结果)\n' "$name"
PASS=$((PASS+1))
else
printf '%-16s FAIL HTTP 200 但 Cypher 查询返回错误/空 results\n' "$name"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
fi
}
echo "== 上游连通性冒烟(timeout ${TIMEOUT}s,$(date '+%F %T'))=="
echo
echo "-- QA (7920),契约:DISCOVERY.md §4 --"
check_http "QA health" "$QA_URL/api/v1/qa-v1-1-73/health" '"status":"ok"'
check_http "QA info" "$QA_URL/api/v1/qa-v1-1-73/info" 'version'
echo "-- 抽取 (8000),契约:DISCOVERY.md §3 --"
check_http "抽取 health" "$EXTRACT_URL/health" '"status":"healthy"'
check_http "抽取 jobs" "$EXTRACT_URL/api/v1/methodology/extract-jobs?limit=1" '"jobs"'
echo "-- 抽取回落 (7900),契约:DISCOVERY.md §3.7 --"
check_http "7900 health" "$ALT_URL/health"
echo "-- Neo4j (bolt 18788 ↔ HTTP 18575),契约:DISCOVERY.md §2 --"
check_neo4j "Neo4j 查询" "$NEO4J_HTTP"
echo "-- mock (8099),契约:ARCHITECTURE.md §6 / API.md --"
check_http "mock health" "$MOCK_URL/api/health" '"upstreams"'
echo
echo "== 汇总 =="
echo "PASS: $PASS | FAIL: $FAIL"
if [ "$FAIL" -gt 0 ]; then
echo "失败项: ${FAILED_LINES[*]}"
exit 1
fi
exit 0
# ---- 远程探测(Mac 本地运行,经 SSH 隧道)----
# 远端上游只绑 127.0.0.1,本地需先起隧道(以 QA 7920 与 Neo4j 18575 为例):
# ssh -N -L 7920:127.0.0.1:7920 -L 18575:127.0.0.1:18575 xzq@100.109.52.26
# 然后:
# QA_URL=http://127.0.0.1:7920 NEO4J_HTTP=http://127.0.0.1:18575 \
# bash tests/smoke_upstreams.sh
# 注意:隧道只解决了连通,Neo4j 数据源真实内容仍以远端为准。