diff --git a/script/todo/qemu_deploy_form.py b/script/todo/qemu_deploy_form.py index c49511a..247891a 100644 --- a/script/todo/qemu_deploy_form.py +++ b/script/todo/qemu_deploy_form.py @@ -491,10 +491,20 @@ def run_deploy_form(ctx, run_app: bool = True): id="f_sshcfg", ) yield Static(t("Parallelism"), classes="grouptitle") + # Cochée, la case donne une exécution PAR installation : + # le plafond du nombre de CPU ne s'applique plus. Décochée, + # le nombre reprend la main, et son défaut suit l'hôte — + # la CLI comptait déjà les CPU, la TUI restait figée à 4. + yield Checkbox( + t("One run per install"), + value=defaults.get("par_per_install", True), + id="f_par_all", + ) yield Select( [(str(n), n) for n in range(1, host_cpu + 1)], - value=min(4, host_cpu), + value=host_cpu, allow_blank=False, + disabled=True, id="f_par", ) with Vertical(id="right"): @@ -674,6 +684,8 @@ def run_deploy_form(ctx, run_app: bool = True): def on_checkbox_changed(self, event) -> None: if event.checkbox.id == "f_install": self._recompute() # le disque annoncé inclut le +5 G ERPLibre + elif event.checkbox.id == "f_par_all": + self.query_one("#f_par", Select).disabled = event.value # -- actions ---------------------------------------------------- # def action_select_all(self) -> None: @@ -732,7 +744,14 @@ def run_deploy_form(ctx, run_app: bool = True): or "", "install": install, "add_ssh_config": self.query_one("#f_sshcfg", Checkbox).value, - "parallelism": self.query_one("#f_par", Select).value, + # Une exécution par installation : le nombre de VM retenues + # fait foi. Le déploiement le borne ensuite à ce même nombre, + # donc une valeur haute ne crée jamais de travailleur inutile. + "parallelism": ( + max(1, len(self.vms)) + if self.query_one("#f_par_all", Checkbox).value + else self.query_one("#f_par", Select).value + ), } def action_preview(self) -> None: diff --git a/script/todo/todo.py b/script/todo/todo.py index 6b83475..12babca 100755 --- a/script/todo/todo.py +++ b/script/todo/todo.py @@ -5581,17 +5581,28 @@ class TODO: print(t("Nothing to create - every VM already exists.")) return None - # Nombre de déploiements en parallèle. Défaut = nombre de CPU de l'hôte - # (borné par le nombre de VM). On affiche aussi le NB DE VM à déployer. - default_par = min(n_jobs, os.cpu_count() or 4) or 1 - raw = input( - f"{t('Parallel deployments (default:')} {default_par}, " - f"{n_jobs} {t('VMs')}): " - ).strip() - try: - parallelism = max(1, int(raw)) if raw else default_par - except ValueError: - parallelism = default_par + # Nombre de déploiements en parallèle. Par défaut UNE EXÉCUTION PAR + # INSTALLATION : le plafond du nombre de CPU ne s'applique pas, c'est + # le nombre de VM qui fait foi. « n » retombe sur ce plafond, et un + # chiffre vaut pour lui-même — même règle que les autres invites. + default_par = n_jobs or 1 + cpu_par = min(n_jobs, os.cpu_count() or 4) or 1 + print(f" [n] {t('limit to host cores')} ({cpu_par})") + raw = ( + input( + f"{t('Parallel deployments (default:')} {default_par}, " + f"{n_jobs} {t('VMs')}): " + ) + .strip() + .lower() + ) + if raw == "n": + parallelism = cpu_par + else: + try: + parallelism = max(1, int(raw)) if raw else default_par + except ValueError: + parallelism = default_par spec = { "res_label": res_label, diff --git a/script/todo/todo_i18n.py b/script/todo/todo_i18n.py index 5fc4a74..afc0cd2 100644 --- a/script/todo/todo_i18n.py +++ b/script/todo/todo_i18n.py @@ -2023,6 +2023,14 @@ TRANSLATIONS = { "fr": "Choix (numéro, vide = rouvrir) : ", "en": "Choice (number, blank = reopen): ", }, + "One run per install": { + "fr": "une execution par installation", + "en": "One run per install", + }, + "limit to host cores": { + "fr": "limiter au nombre de coeurs de l'hote", + "en": "limit to host cores", + }, "free value…": { "fr": "valeur libre…", "en": "free value…",