diff --git a/docs/en/rapport-pdf.md b/docs/en/rapport-pdf.md index 5fee3a5..da30561 100644 --- a/docs/en/rapport-pdf.md +++ b/docs/en/rapport-pdf.md @@ -216,7 +216,7 @@ Collection reads PBS prune jobs through `/config/prune` and displays: - schedule; - active/inactive state; - columns `Last`, `Hourly`, `Daily`, `Weekly`, `Monthly`, `Yearly`; -- `max-depth`. +- computed depth, corresponding to the sum of configured `keep-last`, `keep-hourly`, `keep-daily`, `keep-weekly`, `keep-monthly` and `keep-yearly` values. A namespace missing in PBS is displayed as `/`, meaning the root namespace. diff --git a/docs/fr/rapport-pdf.md b/docs/fr/rapport-pdf.md index cfb83fb..3c8eb00 100644 --- a/docs/fr/rapport-pdf.md +++ b/docs/fr/rapport-pdf.md @@ -216,7 +216,7 @@ La collecte lit les prune jobs PBS via `/config/prune` et affiche : - planification ; - etat actif/inactif ; - colonnes `Derniere`, `Horaire`, `Jour`, `Semaine`, `Mois`, `Annee` ; -- profondeur `max-depth`. +- profondeur calculee, correspondant a la somme des valeurs `keep-last`, `keep-hourly`, `keep-daily`, `keep-weekly`, `keep-monthly` et `keep-yearly` renseignees. Une namespace absente dans PBS est affichee comme `/`, c'est-a-dire la namespace racine. diff --git a/src/pve_backup_report/report_pdf.py b/src/pve_backup_report/report_pdf.py index 9c8ee47..78a5e73 100644 --- a/src/pve_backup_report/report_pdf.py +++ b/src/pve_backup_report/report_pdf.py @@ -438,10 +438,25 @@ def retention_policy_row(policy: object) -> list[object]: getattr(policy, "keep_weekly", None), getattr(policy, "keep_monthly", None), getattr(policy, "keep_yearly", None), - getattr(policy, "max_depth", None), + display(retention_policy_depth(policy)), ] +def retention_policy_depth(policy: object) -> int | None: + values = [ + getattr(policy, "keep_last", None), + getattr(policy, "keep_hourly", None), + getattr(policy, "keep_daily", None), + getattr(policy, "keep_weekly", None), + getattr(policy, "keep_monthly", None), + getattr(policy, "keep_yearly", None), + ] + kept_versions = [value for value in values if isinstance(value, int)] + if not kept_versions: + return None + return sum(kept_versions) + + def add_backup_jobs(story: list[object], styles: dict[str, ParagraphStyle], report_data: ReportData) -> None: rows: list[list[object]] = [["ID", "Storage", "Horaire", "Actif", "Mode", "Selection", "Exclusion"]] for job in report_data.backup_jobs: diff --git a/tests/test_report_pdf.py b/tests/test_report_pdf.py index 6cb6c46..a0bdb5a 100644 --- a/tests/test_report_pdf.py +++ b/tests/test_report_pdf.py @@ -26,6 +26,7 @@ from pve_backup_report.report_pdf import format_last_backup from pve_backup_report.report_pdf import format_size from pve_backup_report.report_pdf import pbs_datastore_usage_row from pve_backup_report.report_pdf import pbs_access_user_row +from pve_backup_report.report_pdf import retention_policy_depth from pve_backup_report.report_pdf import retention_policy_row from pve_backup_report.report_pdf import add_table_of_contents from pve_backup_report.report_pdf import unique_report_path @@ -171,10 +172,32 @@ def test_retention_policy_row_splits_columns() -> None: 8, 3, 1, - 0, + "29", ] +def test_retention_policy_depth_sums_keep_values() -> None: + policy = PbsRetentionPolicy( + policy_id="prune-prod", + server_name="PBS01", + keep_last=1, + keep_hourly=2, + keep_daily=14, + keep_weekly=8, + keep_monthly=3, + keep_yearly=1, + max_depth=0, + ) + + assert retention_policy_depth(policy) == 29 + + +def test_retention_policy_row_displays_unspecified_depth_without_keep_values() -> None: + policy = PbsRetentionPolicy(policy_id="prune-empty", server_name="PBS01", max_depth=0) + + assert retention_policy_row(policy)[-1] == "non renseigne" + + def test_find_snapshot_summary_matches_storage_namespace_and_guest() -> None: guest = Guest(vmid=100, name="srv", guest_type="qemu") item = BackupCoverage(