From 7ee62407b766884d184a5d75f5ca547a1a951ade Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Tue, 8 Sep 2026 15:32:58 +0200 Subject: [PATCH] Mehrplatten-Heuristik: target_disk_rank in Bereitstellungsvorlagen Neues Feld installation_directives.partitioning.target_disk_rank (Default 1 = groesste Platte) auf CreateBereitstellungsvorlageRequest/ create_bereitstellungsvorlage() - ersetzt den bisherigen impliziten Default in backends/mint-image/backend.sh ("erste Platte in lsblk-Erkennungsreihenfolge", nicht deterministisch bei mehreren internen Datentraegern). Migration 0026 setzt den neuen Default in der partitioning-Spalte und zieht bestehende Zeilen nach. Siehe platform-docs/roadmap/multi-distro-merkmal-workspace-creator.md, Phase 0 (Mehrplatten-Heuristik), 08.09.2026 mit dem Nutzer entschieden. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01LpNs8yZeQkHgMWx6WNT1QH --- app.py | 16 +++++++++++- ...ereitstellungsvorlage_target_disk_rank.sql | 25 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 migrations/0026_bereitstellungsvorlage_target_disk_rank.sql diff --git a/app.py b/app.py index 42fbf81..ef4eb49 100644 --- a/app.py +++ b/app.py @@ -188,6 +188,11 @@ class CreateBereitstellungsvorlageRequest(BaseModel): disk_encryption: bool = False root_filesystem: str = "ext4" secure_boot_required: bool = False + # Rang nach Plattengroesse (1 = groesste Platte) fuer Geraete mit + # mehreren internen Datentraegern - siehe backends/mint-image/backend.sh + # _mint_image_detect_target_disk() und platform-docs/roadmap/ + # multi-distro-merkmal-workspace-creator.md, Phase 0 (08.09.2026). + target_disk_rank: int = 1 class CreateEnrollmentSessionRequest(BaseModel): @@ -593,6 +598,7 @@ def create_bereitstellungsvorlage( disk_encryption: bool, root_filesystem: str, secure_boot_required: bool, + target_disk_rank: int = 1, ) -> dict: """ Bislang gab es dafuer keinen API-/UI-Weg - Bereitstellungsvorlagen kamen @@ -605,7 +611,11 @@ def create_bereitstellungsvorlage( """ vorlage_id = uuid4() - partitioning = {"scheme": "single", "root_filesystem": root_filesystem} + partitioning = { + "scheme": "single", + "root_filesystem": root_filesystem, + "target_disk_rank": target_disk_rank, + } with get_database_connection() as conn: with conn.cursor() as cur: @@ -3332,6 +3342,9 @@ def create_bereitstellungsvorlage_endpoint( if not payload.label.strip(): return {"success": False, "error": "invalid_request", "message": "label darf nicht leer sein."} + if payload.target_disk_rank < 1: + return {"success": False, "error": "invalid_request", "message": "target_disk_rank muss mindestens 1 sein."} + vorlage = create_bereitstellungsvorlage( organization_id, payload.workspace_id, @@ -3341,6 +3354,7 @@ def create_bereitstellungsvorlage_endpoint( payload.disk_encryption, payload.root_filesystem, payload.secure_boot_required, + payload.target_disk_rank, ) return {"success": True, "bereitstellungsvorlage": vorlage} diff --git a/migrations/0026_bereitstellungsvorlage_target_disk_rank.sql b/migrations/0026_bereitstellungsvorlage_target_disk_rank.sql new file mode 100644 index 0000000..0e29aa7 --- /dev/null +++ b/migrations/0026_bereitstellungsvorlage_target_disk_rank.sql @@ -0,0 +1,25 @@ +BEGIN; + +-- target_disk_rank in installation_directives.partitioning (JSONB) - Rang +-- nach Plattengroesse fuer Geraete mit mehreren internen Datentraegern +-- (1 = groesste Platte, absteigend sortiert, mit deterministischem +-- Tiebreak per Geraetepfad bei gleich grossen Platten). Ersetzt den +-- bisherigen impliziten Default "immer die erste Platte in +-- lsblk-Erkennungsreihenfolge" in +-- backends/mint-image/backend.sh:_mint_image_detect_target_disk() - jene +-- Reihenfolge war nicht deterministisch (abhaengig von Bus-Typ/Anschluss/ +-- Erkennungszufall). Siehe platform-docs/roadmap/ +-- multi-distro-merkmal-workspace-creator.md, Phase 0 (Mehrplatten- +-- Heuristik), 08.09.2026 entschieden+umgesetzt. +ALTER TABLE bereitstellungsvorlagen + ALTER COLUMN partitioning SET DEFAULT + '{"scheme": "single", "root_filesystem": "ext4", "target_disk_rank": 1}'::jsonb; + +-- Bestehende Zeilen explizit nachziehen statt sich auf den Laufzeit- +-- Fallback "// 1" im Backend zu verlassen - self-documenting statt +-- stillschweigend implizit. +UPDATE bereitstellungsvorlagen + SET partitioning = partitioning || '{"target_disk_rank": 1}'::jsonb + WHERE NOT (partitioning ? 'target_disk_rank'); + +COMMIT;