Integrate claude, improve selenium and support qemu #1

Open
mathben wants to merge 224 commits from develop into master
2 changed files with 60 additions and 4 deletions
Showing only changes of commit 74ee584ffa - Show all commits

View file

@ -689,7 +689,30 @@ def kernel_modules_stale() -> str:
)
def setup_host(runner: Runner, assume_yes: bool, no_install: bool) -> None:
def schedule_reboot(runner: Runner) -> None:
"""Programme un redémarrage DIFFÉRÉ et détaché de la session courante.
Un « systemctl reboot » immédiat tuerait le SSH de l'installation, et
l'orchestrateur compterait la VM en échec alors que tout s'est bien passé.
On laisse donc quelques secondes pour que la commande distante rende la
main proprement.
"""
if shutil.which("systemd-run"):
runner.run(
["systemd-run", "--on-active=5", "systemctl", "reboot"],
privileged=True,
check=False,
)
return
runner.run(["shutdown", "-r", "+1"], privileged=True, check=False)
def setup_host(
runner: Runner,
assume_yes: bool,
no_install: bool,
reboot_if_needed: bool = False,
) -> None:
"""Prépare l'hôte à faire tourner des VM : paquets, démon, groupe, réseau.
Point d'entrée unique du profil d'installation « ERPLibre Déploiement ».
@ -725,6 +748,21 @@ def setup_host(runner: Runner, assume_yes: bool, no_install: bool) -> None:
f"{'actif' if active else 'INACTIF'}"
f" / {'autostart' if autostart else 'PAS autostart'}"
)
if not active and stale:
# Le réseau est déjà « autostart » : après le redémarrage, libvirt le
# monte tout seul avec les modules du nouveau noyau. Un seul reboot
# suffit donc à rendre l'hôte utilisable, sans repasser par ici.
if reboot_if_needed:
print(
"\n↻ Redémarrage programmé (dans quelques secondes) : c'est la"
" SEULE façon de retrouver les modules du noyau.\n"
" Au retour, le réseau « default » démarrera seul"
" (autostart déjà actif)."
)
schedule_reboot(runner)
return
sys.exit(f"Erreur : l'hôte n'est pas prêt.\n {stale}")
if not (ok and active):
sys.exit(
"Erreur : l'hôte n'est pas prêt.\n"
@ -1428,10 +1466,18 @@ def virt_install(
# déverse un « Logging error » (le pavé « Fetched capabilities … »). On
# force un cache/HOME ÉCRIVABLE via « env VAR=… » (traverse sudo) pour
# que le journal s'écrive silencieusement.
# Chemin propre à l'UID : un répertoire partagé finit créé par root lors
# d'un premier passage sous sudo, puis devient illisible pour l'utilisateur
# (« Error setting up logfile: No write access to … /virt-manager »).
cache_dir = f"/var/tmp/erplibre-virtinst-{os.getuid()}"
try:
os.makedirs(cache_dir, mode=0o700, exist_ok=True)
except OSError:
pass
log_env = [
"env",
"XDG_CACHE_HOME=/var/tmp/erplibre-virtinst",
"HOME=/var/tmp/erplibre-virtinst",
f"XDG_CACHE_HOME={cache_dir}",
f"HOME={cache_dir}",
]
runner.run(log_env + cmd, privileged=True)
@ -1717,6 +1763,12 @@ def build_parser() -> argparse.ArgumentParser:
help="Prépare l'hôte (paquets QEMU/libvirt, démon, groupe libvirt, "
"réseau default) puis quitte. Ne déploie aucune VM.",
)
g_run.add_argument(
"--reboot-if-needed",
action="store_true",
help="Avec --setup-host : redémarre si le noyau a été mis à jour "
"depuis le démarrage (sinon libvirt ne peut pas créer virbr0).",
)
g_run.add_argument(
"--list-images",
action="store_true",
@ -1773,6 +1825,7 @@ def main() -> None:
),
args.assume_yes,
args.no_install_deps,
args.reboot_if_needed,
)
return

View file

@ -3078,7 +3078,10 @@ class TODO:
# Sans le groupe, virt-install retombe sur qemu:///session où « default »
# n'existe pas : la VM échoue alors que tous les paquets sont installés.
# L'ancien one-liner finissait par « || true » et masquait ses erreurs.
_QEMU_QEMU_PKGS = "./script/qemu/deploy_qemu.py --setup-host --assume-yes"
_QEMU_QEMU_PKGS = (
"./script/qemu/deploy_qemu.py --setup-host --assume-yes"
" --reboot-if-needed"
)
def _qemu_ask_prod(self):
"""Environnement cible : dev (défaut) ou prod. En PROD : ERPLibre est