r3-shortage-regression.sh 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/env bash
  2. # R3-SHORTAGE regression script — S8-REGRESSION-FIXTURE-1 重构版(dev/test only, aidopdev)。
  3. #
  4. # 演变史:
  5. # - 旧版基于 G01_TEST_SHORTAGE 旧 fixture(id=53)。当前 dev 已无 SHORTAGE demo 规则。
  6. # - 重构后:找不到 SHORTAGE demo fixture → record_skip + exit 0。
  7. # - 任务 CTO 约束 六.F:不得 FAIL;不得自动创建 SHORTAGE TEMP fixture(除非有稳定方案)。
  8. #
  9. # 为日后 SHORTAGE 演示规则上线时启用,环境变量 RULE_CODE 可指定其他 SHORTAGE rule_code。
  10. set -uo pipefail
  11. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  12. # shellcheck source=./s8-regression-common.sh
  13. source "${SCRIPT_DIR}/s8-regression-common.sh"
  14. auth_load
  15. RULE_CODE="${RULE_CODE:-G01_TEST_SHORTAGE}" # 旧 fixture,当前 dev 无;保留为默认以便 SKIP 信息明确
  16. baseline_before=$(read_baseline)
  17. echo "==== r3-shortage-regression RULE_CODE=${RULE_CODE} baseline_before=${baseline_before} ===="
  18. # 当前 dev 无 SHORTAGE demo 规则;不在本轮创建 TEMP SHORTAGE fixture。
  19. shortage_count=$(mysql_run "SELECT COUNT(*) FROM ado_s8_watch_rule WHERE rule_type='SHORTAGE' AND enabled=1 AND tenant_id=${TENANT_ID} AND factory_id=${FACTORY_ID};")
  20. if [[ "${shortage_count}" == "0" ]]; then
  21. record_skip "SHORTAGE demo fixture not present in dev (no enabled SHORTAGE rule under tenant=${TENANT_ID}/factory=${FACTORY_ID})"
  22. assert_baseline_unchanged "${baseline_before}"
  23. print_summary
  24. exit 0
  25. fi
  26. if ! require_demo_rule "${RULE_CODE}"; then
  27. record_skip "SHORTAGE rule '${RULE_CODE}' not enabled — set RULE_CODE env to active SHORTAGE rule_code to run"
  28. assert_baseline_unchanged "${baseline_before}"
  29. print_summary
  30. exit 0
  31. fi
  32. record_pass "${RULE_CODE} enabled"
  33. RULE_ID=$(get_rule_id_by_code "${RULE_CODE}")
  34. snap_enabled=$(get_rule_field "${RULE_ID}" enabled)
  35. snap_paused=$(get_rule_field "${RULE_ID}" paused_until)
  36. snap_trigger=$(get_rule_field "${RULE_ID}" trigger_count_required)
  37. snap_recover=$(get_rule_field "${RULE_ID}" recover_count_required)
  38. resp1=$(run_once_endpoint)
  39. count1=$(printf '%s' "${resp1}" | python3 -c "import json,sys;print(json.load(sys.stdin).get('count',0))")
  40. [[ "${count1}" -ge 1 ]] && record_pass "first run-once HTTP 200, count=${count1}" || record_fail "first run-once empty"
  41. before_ts=$(mysql_run "SELECT IFNULL(MAX(last_detected_at), '1970-01-01') FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0;")
  42. sleep 1
  43. run_once_endpoint >/dev/null
  44. active_count=$(mysql_run "SELECT COUNT(*) FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0;")
  45. [[ "${active_count}" -ge 1 ]] && record_pass "active SHORTAGE exception count=${active_count}" || record_fail "expected at least 1 active SHORTAGE exception, got ${active_count}"
  46. after_ts=$(mysql_run "SELECT MAX(last_detected_at) FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0;")
  47. [[ "${after_ts}" > "${before_ts}" ]] && record_pass "last_detected_at refreshed: ${before_ts} -> ${after_ts}" || record_fail "last_detected_at did not refresh"
  48. payload=$(mysql_run "SELECT source_payload FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0 ORDER BY id DESC LIMIT 1;")
  49. metadata_ok=1
  50. for field in __ruleType __sourceObjectType __sourceObjectId; do
  51. echo "${payload}" | grep -q "${field}" || { record_fail "source_payload missing ${field}"; metadata_ok=0; }
  52. done
  53. (( metadata_ok == 1 )) && record_pass "source_payload contains 3 metadata fields"
  54. final_enabled=$(get_rule_field "${RULE_ID}" enabled)
  55. final_paused=$(get_rule_field "${RULE_ID}" paused_until)
  56. final_trigger=$(get_rule_field "${RULE_ID}" trigger_count_required)
  57. final_recover=$(get_rule_field "${RULE_ID}" recover_count_required)
  58. [[ "${final_enabled}" == "${snap_enabled}" && "${final_paused}" == "${snap_paused}" \
  59. && "${final_trigger}" == "${snap_trigger}" && "${final_recover}" == "${snap_recover}" ]] \
  60. && record_pass "${RULE_CODE} 守恒" || record_fail "${RULE_CODE} 守恒失败"
  61. assert_baseline_unchanged "${baseline_before}"
  62. print_summary
  63. exit_by_summary