Upraveno. Portál už nečte ani neinterpretuje READY/NOT READY z textu výstupu a nepřidává žádnou logiku pro disk, backup, Gitea ani Registry.

Změny:
migration_readiness.py (line 140) teď určuje READY pouze jako returncode == 0; chybějící nebo nenulový return code je NOT READY.
Preflight UI v routes/migration_readiness.py (line 85) zobrazuje Return code, summary OK/WARN/FAIL a oddělené raw stdout / stderr.
Odstraněná vlastní logika, která hledala READY/NOT READY ve výstupu skriptu.
This commit is contained in:
JiriUhlir
2026-06-08 08:15:27 +02:00
parent 2571e6e50e
commit f101d91821
2 changed files with 39 additions and 39 deletions
+24 -32
View File
@@ -137,32 +137,6 @@ def _first_int(data: dict[str, Any], keys: tuple[str, ...]) -> int | None:
return None return None
def _readiness_from_script_output(result_data: dict[str, Any], combined_text: str) -> bool:
ready_value = result_data.get("ready")
if isinstance(ready_value, bool):
return ready_value
readiness_value = str(
result_data.get("readiness")
or result_data.get("migration_readiness")
or result_data.get("migrationReadiness")
or ""
).strip().upper()
if readiness_value == "READY":
return True
if readiness_value == "NOT READY":
return False
upper_text = combined_text.upper()
if re.search(r"(?<![A-Z0-9_])NOT\s+READY(?![A-Z0-9_])", upper_text):
return False
if re.search(r"(?<![A-Z0-9_])READY(?![A-Z0-9_])", upper_text):
return True
return False
def summarize_readiness(job: dict[str, Any] | None) -> dict[str, Any]: def summarize_readiness(job: dict[str, Any] | None) -> dict[str, Any]:
if not job: if not job:
return { return {
@@ -170,18 +144,34 @@ def summarize_readiness(job: dict[str, Any] | None) -> dict[str, Any]:
"ok_count": 0, "ok_count": 0,
"warn_count": 0, "warn_count": 0,
"fail_count": 0, "fail_count": 0,
"raw_output": "", "return_code": None,
"stdout": "",
"stderr": "",
"job": None, "job": None,
} }
raw_output = get_job_log_output(int(job["id"]))
result_data = _result_data(job) result_data = _result_data(job)
return_code = _result_value(job, ("returncode", "return_code", "exit_code", "exitCode"))
stdout = _result_value(job, ("stdout", "out"))
stderr = _result_value(job, ("stderr", "err"))
if stdout is None:
stdout = get_job_log_output(int(job["id"]), stream="stdout", include_stream=False)
if stderr is None:
stderr = get_job_log_output(int(job["id"]), stream="stderr", include_stream=False)
error_text = job.get("error_text") or ""
if error_text:
stderr = f"{stderr}\n{error_text}" if stderr else error_text
stdout = _redact_sensitive_text(str(stdout or ""))
stderr = _redact_sensitive_text(str(stderr or ""))
combined_text = "\n".join( combined_text = "\n".join(
value value
for value in ( for value in (
raw_output, stdout,
stderr,
job.get("result_json") or "", job.get("result_json") or "",
job.get("error_text") or "",
) )
if value if value
) )
@@ -198,11 +188,13 @@ def summarize_readiness(job: dict[str, Any] | None) -> dict[str, Any]:
fail_count = _count_token(combined_text, "FAIL") fail_count = _count_token(combined_text, "FAIL")
return { return {
"ready": _readiness_from_script_output(result_data, combined_text), "ready": return_code == 0,
"ok_count": ok_count, "ok_count": ok_count,
"warn_count": warn_count, "warn_count": warn_count,
"fail_count": fail_count, "fail_count": fail_count,
"raw_output": raw_output, "return_code": return_code,
"stdout": stdout,
"stderr": stderr,
"job": job, "job": job,
} }
+14 -6
View File
@@ -85,25 +85,27 @@ def migration_readiness_page(request: Request, user=Depends(require_user)):
job_rows = '<tr><td colspan="2">Zatím není uložený žádný výsledek preflight kontroly.</td></tr>' job_rows = '<tr><td colspan="2">Zatím není uložený žádný výsledek preflight kontroly.</td></tr>'
if job: if job:
job_id = html.escape(str(job.get("id", ""))) job_id = html.escape(str(job.get("id", "")))
return_code = summary.get("return_code")
return_code_label = "" if return_code is None else html.escape(str(return_code))
job_rows = f""" job_rows = f"""
<tr><th>Úloha</th><td><a href="/portal/jobs/{job_id}">#{job_id}</a></td></tr> <tr><th>Úloha</th><td><a href="/portal/jobs/{job_id}">#{job_id}</a></td></tr>
<tr><th>Stav úlohy</th><td>{render_job_status(job.get("status"))}</td></tr> <tr><th>Stav úlohy</th><td>{render_job_status(job.get("status"))}</td></tr>
<tr><th>Return code</th><td>{return_code_label}</td></tr>
<tr><th>Vytvořeno</th><td>{html.escape(job.get("created_at", "") or "")}</td></tr> <tr><th>Vytvořeno</th><td>{html.escape(job.get("created_at", "") or "")}</td></tr>
<tr><th>Spuštěno</th><td>{html.escape(job.get("started_at", "") or "")}</td></tr> <tr><th>Spuštěno</th><td>{html.escape(job.get("started_at", "") or "")}</td></tr>
<tr><th>Dokončeno</th><td>{html.escape(job.get("finished_at", "") or "")}</td></tr> <tr><th>Dokončeno</th><td>{html.escape(job.get("finished_at", "") or "")}</td></tr>
<tr><th>Worker</th><td>{html.escape(job.get("worker_id", "") or "")}</td></tr> <tr><th>Worker</th><td>{html.escape(job.get("worker_id", "") or "")}</td></tr>
""" """
raw_output = html.escape(summary.get("raw_output") or "") stdout = html.escape(summary.get("stdout") or "Zatím není uložený žádný stdout log.")
if not raw_output: stderr = html.escape(summary.get("stderr") or "Zatím není uložený žádný stderr log.")
raw_output = "Zatím není uložený žádný log výstup."
return page( return page(
"Migration Readiness", "Migration Readiness",
f""" f"""
<div class="card"> <div class="card">
<h2>Migration Readiness</h2> <h2>Migration Readiness</h2>
<p class="muted">Poslední výsledek maintenance skriptu {html.escape(PREFLIGHT_SCRIPT)} uložený v databázi. Stav vychází pouze z výstupu skriptu.</p> <p class="muted">Poslední výsledek maintenance skriptu {html.escape(PREFLIGHT_SCRIPT)} uložený v databázi. Stav READY / NOT READY vychází pouze z return code jobu.</p>
<div class="inline-form"> <div class="inline-form">
<form method="post" action="/portal/migration-readiness/run"> <form method="post" action="/portal/migration-readiness/run">
<button type="submit">Spustit preflight kontrolu</button> <button type="submit">Spustit preflight kontrolu</button>
@@ -152,9 +154,15 @@ def migration_readiness_page(request: Request, user=Depends(require_user)):
</table> </table>
</div> </div>
<div class="grid">
<div class="card"> <div class="card">
<h2>Raw preflight log výstup</h2> <h2>Raw preflight stdout</h2>
<pre class="log-viewer log-stdout">{raw_output}</pre> <pre class="log-viewer log-stdout">{stdout}</pre>
</div>
<div class="card">
<h2>Raw preflight stderr</h2>
<pre class="log-viewer log-stderr">{stderr}</pre>
</div>
</div> </div>
{render_script_result("Poslední výsledek Bootstrap v2", BOOTSTRAP_SCRIPT, bootstrap_summary)} {render_script_result("Poslední výsledek Bootstrap v2", BOOTSTRAP_SCRIPT, bootstrap_summary)}