59 lines
3.1 KiB
Python
59 lines
3.1 KiB
Python
"""通过新商务原生任务 HTTP 重跑指定日期,要求已有分区备份并保持任务禁用。"""
|
|
|
|
import argparse
|
|
import json
|
|
import time
|
|
from pathlib import Path
|
|
|
|
from sw_write_verify import Rehearsal
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument("--runtime", type=Path, required=True)
|
|
parser.add_argument("--config", type=Path, default=Path("configs/config.yaml"))
|
|
parser.add_argument("--old-url", default="http://127.0.0.1:18080")
|
|
parser.add_argument("--new-url", default="http://127.0.0.1:19001")
|
|
parser.add_argument("--output", type=Path, required=True)
|
|
parser.add_argument("--date", default="2026-11-03")
|
|
parser.add_argument("--backup", type=Path, required=True)
|
|
parser.add_argument("--methods", nargs="+", choices=("swReportDayBackfillTask", "swReportServerDayBackfillTask", "alertTriggerTask"),
|
|
default=["swReportDayBackfillTask", "swReportServerDayBackfillTask"])
|
|
args = parser.parse_args()
|
|
backup = json.loads(args.backup.read_text(encoding="utf-8"))
|
|
if backup["date"] != args.date:
|
|
raise ValueError("已有备份的日期与任务不符")
|
|
run = Rehearsal(args)
|
|
ids = []
|
|
try:
|
|
for method in args.methods:
|
|
name = "迁移核对-" + method + "-" + str(int(time.time()))
|
|
run.call("new", "admin", "POST", "/timedTask/createTimedTask", {"name": name, "spec": "@daily", "executorType": "method", "methodName": method,
|
|
"params": {"startDate": args.date, "endDate": args.date, "_execution": {"timeoutSeconds": 1800}}, "enabled": False})
|
|
task = run.query("SELECT id,enabled FROM sw9.sys_timed_tasks WHERE name=%s AND deleted_at IS NULL", (name,))[0]
|
|
ids.append(task["id"])
|
|
(args.runtime / "report-rehearsal-task-ids.json").write_text(json.dumps(ids), encoding="utf-8")
|
|
run.check(method + " 创建且保持禁用", task["enabled"] == 0)
|
|
started = time.monotonic()
|
|
run.call("new", "admin", "POST", "/timedTask/triggerTimedTask", {"id": task["id"]})
|
|
while time.monotonic() - started < 1830:
|
|
value = run.call("new", "admin", "GET", f"/timedTask/getTimedTaskLogList?taskId={task['id']}&page=1&pageSize=1")["data"]
|
|
logs = value.get("list", [])
|
|
if logs and logs[0].get("status") not in ("running", "pending"):
|
|
(args.runtime / (method + "-execution.json")).write_text(json.dumps(logs[0], ensure_ascii=False, indent=2), encoding="utf-8")
|
|
run.check(method + " 真实执行完成", logs[0]["status"] == "success", status=logs[0]["status"], elapsed_seconds=round(time.monotonic() - started, 2))
|
|
break
|
|
time.sleep(2)
|
|
else:
|
|
run.check(method + " 等待执行完成", False, reason="timeout")
|
|
except Exception as error:
|
|
if all(check["passed"] for check in run.checks):
|
|
run.check("报表重跑执行异常", False, error_type=type(error).__name__)
|
|
raise
|
|
finally:
|
|
run.db.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|