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:
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)}
|
||||||
|
|||||||
Reference in New Issue
Block a user