From 3bf8fc2972c08ff92784d5c8e3d668534023c6a6 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 28 Jul 2026 07:35:25 +0000 Subject: [PATCH] =?UTF-8?q?[IMP]=20script=20todo:=20infra=20deploy=20?= =?UTF-8?q?=E2=80=94=20option=20granulaire=20+=20choix=20d'architecture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Menu « Déployer l'infra ERPLibre » : - Nouveau choix [granulaire] dans la sélection des distributions : affiche la liste À PLAT de TOUTES les versions du catalogue (distro + version, défauts marqués d'un *) et permet d'en choisir plusieurs par leurs numéros séparés par des virgules (ex. « 1,3,12 »). Complète [all] et [principal]. - Demande l'ARCHITECTURE du parc en début de flux, par défaut l'architecture NATIVE de l'hôte (amd64/arm64/s390x via uname -m). s390x est proposé mais émulé (lent) et n'a d'images cloud que pour Ubuntu -> le catalogue est alors restreint à Ubuntu (les autres distros sont ignorées avec un avertissement). --arch est transmis à deploy_qemu.py quand ≠ amd64. Co-Authored-By: Claude Opus 4.8 (1M context) --- script/todo/todo.py | 106 +++++++++++++++++++++++++++++++++++++-- script/todo/todo_i18n.py | 39 ++++++++++++++ 2 files changed, 141 insertions(+), 4 deletions(-) diff --git a/script/todo/todo.py b/script/todo/todo.py index 18e7d1e..6bad29e 100755 --- a/script/todo/todo.py +++ b/script/todo/todo.py @@ -880,6 +880,56 @@ class TODO: return "s390x" return "amd64" + @staticmethod + def _native_arch(): + """Architecture native de l'hôte, en jeton de deploy_qemu.py + (amd64/arm64/s390x). Défaut amd64 si indéterminée.""" + try: + machine = os.uname().machine + except (AttributeError, OSError): + machine = "" + return { + "x86_64": "amd64", + "amd64": "amd64", + "aarch64": "arm64", + "arm64": "arm64", + "s390x": "s390x", + }.get(machine, "amd64") + + def _qemu_prompt_infra_arch(self): + """Demande l'architecture du parc (défaut : native de l'hôte). s390x + est proposé mais ÉMULÉ (lent) et limité à Ubuntu (seule distro avec + des images cloud s390x).""" + native = self._native_arch() + opts = [native] + if native != "s390x": + opts.append("s390x") # émulé, disponible en plus du natif + print(f"\n{t('Architecture:')}") + for i, a in enumerate(opts, 1): + tag = f" ({t('native')}) *" if a == native else "" + extra = "" + if a == "s390x": + extra = f" ({t('IBM Z — emulated, slow on x86; Ubuntu only')})" + print(f" [{i}] {a}{tag}{extra}") + sel = ( + input(f"{t('Choice (number or name, blank = native):')} ") + .strip() + .lower() + ) + if not sel: + return native + for i, a in enumerate(opts, 1): + if sel == str(i) or sel == a: + if a == "s390x": + warn = t( + "s390x is emulated (TCG): boot and install are much " + "slower than x86." + ) + print(f"⚠ {warn}") + return a + print(f"{t('Invalid selection, using')} {native}") + return native + def _qemu_list_images(self): """Affiche la liste des distros/versions et leurs specs.""" cmd = f"{self._qemu_script_path()} --list-images" @@ -1863,8 +1913,26 @@ class TODO: return distros = list(mod.DISTROS) - # 1) Distributions : multi-sélection, catalogue complet, ou principal - # (la version par défaut de chaque distro, marquée d'un *). + # 0) Architecture du parc (défaut : native de l'hôte). s390x n'a des + # images cloud que pour Ubuntu -> on restreint le catalogue. + arch = self._qemu_prompt_infra_arch() + if arch == "s390x": + keep = [d for d in distros if d in self._QEMU_S390X_DISTROS] + dropped = [d for d in distros if d not in keep] + if dropped: + print( + f" ⚠ {t('s390x images only exist for:')} " + f"{', '.join(self._QEMU_S390X_DISTROS)} " + f"({t('ignored:')} {', '.join(dropped)})" + ) + distros = keep + if not distros: + print(t("Nothing selected.")) + return + + # 1) Distributions : multi-sélection, catalogue complet, principal (la + # version par défaut de chaque distro, marquée d'un *), ou granulaire + # (liste à plat de TOUTES les versions, choix par virgules). print(f"\n{t('Distributions:')}") for i, d in enumerate(distros, 1): default_v = mod.DISTROS[d][1] @@ -1876,18 +1944,46 @@ class TODO: print( f" [principal] {t('The main version of each distro (marked *)')}" ) + print( + f" [granulaire] {t('Pick exact versions (comma-separated list)')}" + ) raw = ( input( - t("Selection (numbers, 'all' or 'principal', default: all): ") + t( + "Selection (numbers, 'all', 'principal' or 'granulaire'," + " default: all): " + ) ) .strip() .lower() ) catalog_all = raw in ("", "all", "*") principal = raw in ("principal", "each", "p") + granular = raw in ("granulaire", "granular", "g") selected = [] # (distro, version, ram_mb, disk_str) - if principal: + if granular: + # Liste APLATIE de toutes les versions (distro + version) : on choisit + # des versions précises par leurs numéros, séparés par des virgules. + flat = [] # (distro, version, ram, disk, is_default) + for d in distros: + versions_map, default_v = mod.DISTROS[d] + for v, (_c, _o, ram, disk) in versions_map.items(): + flat.append((d, v, ram, disk, v == default_v)) + print(f"\n{t('All versions:')}") + for i, (d, v, ram, disk, isdef) in enumerate(flat, 1): + star = " *" if isdef else "" + print(f" [{i}] {d} {v}{star} (RAM≥{ram}Mo, {disk})") + r = ( + input(t("Selection (comma-separated numbers): ")) + .strip() + .lower() + ) + for d, v, ram, disk, _isdef in self._parse_index_selection( + r, flat + ): + selected.append((d, v, ram, disk)) + elif principal: # Une VM par distro : sa version par défaut. for d in distros: versions_map, default_v = mod.DISTROS[d] @@ -2014,6 +2110,8 @@ class TODO: "erplibre", "--no-wait-ip", ] + if arch and arch != "amd64": + parts += ["--arch", arch] if ssh_key: parts += ["--ssh-key", ssh_key] if install_branch: diff --git a/script/todo/todo_i18n.py b/script/todo/todo_i18n.py index 0df972b..3d08e78 100644 --- a/script/todo/todo_i18n.py +++ b/script/todo/todo_i18n.py @@ -1166,6 +1166,45 @@ TRANSLATIONS = { "fr": "Architecture :", "en": "Architecture:", }, + "native": { + "fr": "native", + "en": "native", + }, + "IBM Z — emulated, slow on x86; Ubuntu only": { + "fr": "IBM Z — émulé, lent sur x86 ; Ubuntu uniquement", + "en": "IBM Z — emulated, slow on x86; Ubuntu only", + }, + "Choice (number or name, blank = native):": { + "fr": "Choix (numéro ou nom, vide = native) :", + "en": "Choice (number or name, blank = native):", + }, + "Pick exact versions (comma-separated list)": { + "fr": "Choisir des versions précises (liste séparée par des virgules)", + "en": "Pick exact versions (comma-separated list)", + }, + "Selection (numbers, 'all', 'principal' or 'granulaire'," + " default: all): ": { + "fr": "Sélection (numéros, « all », « principal » ou « granulaire »," + " défaut : all) : ", + "en": "Selection (numbers, 'all', 'principal' or 'granulaire'," + " default: all): ", + }, + "All versions:": { + "fr": "Toutes les versions :", + "en": "All versions:", + }, + "Selection (comma-separated numbers): ": { + "fr": "Sélection (numéros séparés par des virgules) : ", + "en": "Selection (comma-separated numbers): ", + }, + "s390x images only exist for:": { + "fr": "images s390x disponibles seulement pour :", + "en": "s390x images only exist for:", + }, + "ignored:": { + "fr": "ignoré :", + "en": "ignored:", + }, "IBM Z — emulated, slow on x86": { "fr": "IBM Z — émulé, lent sur x86", "en": "IBM Z — emulated, slow on x86",