From 3fda367151574c90af32b4ec79b4fc7177b193ef Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 12 Aug 2026 03:29:33 -0400 Subject: [PATCH] [ADD] qemu: a graphical VM name carries its desktop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit erplibre-ubuntu-2404-gnome, erplibre-ubuntu-2404-mint. A graphical VM is recognisable from a "virsh list", and its hostname says so too -- deploy_qemu uses the name as hostname when --hostname is not given. This is not only cosmetic. The name is the COLLISION KEY: a graphical VM and its server twin carried the same one, so the second was reported as "already exists" and silently skipped. They are now distinct. The suffix is applied AFTER overrides, the only point where each machine's type is known now that it is chosen VM by VM. In the form the name therefore follows the choice live, both ways. "mint" rather than "cinnamon": that is the name chosen for the fleet, the installed package still being Cinnamon from the distribution's own repositories. The suffix lives with the flavour, in _QEMU_DESKTOP, and the CLI calls the same function as the TUI rather than writing a second. --- FR --- erplibre-ubuntu-2404-gnome, erplibre-ubuntu-2404-mint. Une VM graphique se reconnaît d'un « virsh list », et son nom d'hôte le dit aussi — deploy_qemu prend le nom pour hôte quand --hostname n'est pas donné. Ce n'est pas que cosmétique. Le nom sert de CLÉ DE COLLISION : une VM graphique et sa jumelle serveur portaient le même, donc la seconde était signalée « existe déjà » et silencieusement ignorée. Elles se distinguent maintenant. Le suffixe est appliqué APRÈS les surcharges, seul moment où le type de chaque machine est connu depuis qu'il se choisit VM par VM. Dans le formulaire, le nom suit donc le choix en direct, dans les deux sens. « mint » et non « cinnamon » : c'est le nom retenu pour le parc, le paquet installé restant Cinnamon depuis les dépôts de la distribution. Le suffixe vit avec la saveur, dans _QEMU_DESKTOP, et la CLI appelle la même fonction que la TUI plutôt que d'en écrire une seconde. Assisted-by: Claude Opus 5 --- script/todo/qemu_deploy_form.py | 33 +++++++++++++++++++++++++++++++-- script/todo/todo.py | 16 ++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/script/todo/qemu_deploy_form.py b/script/todo/qemu_deploy_form.py index 101aca3..b7ad1fe 100644 --- a/script/todo/qemu_deploy_form.py +++ b/script/todo/qemu_deploy_form.py @@ -149,15 +149,40 @@ def apply_overrides(vms, entries, overrides): return vms +def vm_name(base, desktop, suffixes): + """Nom de VM, suffixé du bureau quand il y en a un. + + Le nom sert de nom d'hôte ET de clé de collision : une VM graphique et sa + jumelle serveur doivent donc porter des noms différents, sinon la seconde + est signalée « existe déjà » et silencieusement ignorée. Idempotent, le + nom étant recalculé à chaque frappe.""" + suffix = (suffixes or {}).get(desktop or "") + if not suffix or base.endswith(f"-{suffix}"): + return base + return f"{base}-{suffix}" + + def build_vms( - entries, profile, base_vcpus, host_cpu, custom, overrides, desktop="" + entries, + profile, + base_vcpus, + host_cpu, + custom, + overrides, + desktop="", + suffixes=None, ): """Catalogue choisi + profil + surcharges -> liste de VM de la spec.""" - return apply_overrides( + vms = apply_overrides( apply_profile(entries, profile, base_vcpus, host_cpu, custom, desktop), entries, overrides, ) + # APRÈS les surcharges : c'est là seulement que le type de chaque VM est + # connu, puisqu'il se choisit machine par machine. + for vm in vms: + vm["name"] = vm_name(vm["name"], vm.get("desktop"), suffixes) + return vms def vm_status(name, domains): @@ -277,6 +302,9 @@ def run_deploy_form(ctx, run_app: bool = True): desktop_disk = ctx.get("desktop_disk_gb") or 0 # [(clé, libellé)] — la liste vient de todo.py, source unique. desktops = list(ctx.get("desktops") or []) + # {clé de saveur: suffixe de nom}, fourni par todo.py qui décrit les + # saveurs — on ne le redéfinit pas ici. + desktop_suffixes = dict(ctx.get("desktop_suffixes") or {}) # Architectures pour lesquelles mise publie un binaire. mise_arches = set(ctx.get("mise_arches") or ()) # [(clé, libellé)] des magasins d'applications, et les distributions qui @@ -647,6 +675,7 @@ def run_deploy_form(ctx, run_app: bool = True): self.custom, self.overrides, self._default_desktop(), + desktop_suffixes, ) # ERPLibre et GNOME pèsent chacun sur le disque, et se cumulent. grow = 0 diff --git a/script/todo/todo.py b/script/todo/todo.py index ad78f7e..db3253e 100755 --- a/script/todo/todo.py +++ b/script/todo/todo.py @@ -4338,6 +4338,11 @@ class TODO: "pacman": "gnome gdm", "zypper": "patterns-gnome-gnome_basic gdm", "service": "gdm", + # Suffixe ajouté au nom de VM, donc au nom d'hôte. Une VM + # graphique se reconnaît alors d'un « virsh list », et deux VM de + # même distribution mais de types différents ne se marchent plus + # dessus — le nom sert aussi de clé de collision. + "suffix": "gnome", }, "cinnamon": { "label": "Cinnamon (Linux Mint)", @@ -4350,6 +4355,10 @@ class TODO: "pacman": "cinnamon lightdm lightdm-gtk-greeter", "zypper": "cinnamon lightdm", "service": "lightdm", + # « mint » plutôt que « cinnamon » : c'est le nom retenu pour le + # parc. Le paquet installé reste bien Cinnamon, depuis les dépôts + # de la distribution et non ceux de Mint. + "suffix": "mint", }, } # Ubuntu remplace trois applications par des paquets de TRANSITION dont le @@ -5708,6 +5717,7 @@ class TODO: "mise_arches": self.QEMU_MISE_ARCHES, "app_stores": [(k, t(lbl)) for k, lbl in self.QEMU_APP_STORES], "snap_distros": self.QEMU_SNAP_DISTROS, + "desktop_suffixes": self._qemu_desktop_suffixes(), "desktops": [ (k, v["label"]) for k, v in self._QEMU_DESKTOP.items() ], @@ -6109,8 +6119,14 @@ class TODO: desktop = self._qemu_ask_desktop() # La CLI ne pose qu'un type pour tout le parc : on le recopie sur chaque # VM avant de décider du magasin, qui ne concerne que les graphiques. + # Le nom suit le type, exactement comme dans le formulaire — c'est la + # même fonction, pas une seconde implémentation. + from script.todo.qemu_deploy_form import vm_name + + suffixes = self._qemu_desktop_suffixes() for _vm in vms: _vm.setdefault("desktop", desktop) + _vm["name"] = vm_name(_vm["name"], _vm.get("desktop"), suffixes) app_store = self._qemu_ask_app_store(vms) python_provider = self._qemu_ask_python_provider( [vm["arch"] for vm in vms]