diff --git a/script/qemu/README.base.md b/script/qemu/README.base.md index cca9e41..240ac2c 100644 --- a/script/qemu/README.base.md +++ b/script/qemu/README.base.md @@ -179,11 +179,14 @@ Catalog, per architecture (`deploy_qemu.py` is the source of truth): |---|---|:-:|:-:|:-:| | ubuntu | `24.04` (default), `25.10`, `26.04` | ✔ | ✔ | ✔ | | debian | `11`, `12` (default), `13` | ✔ | ✔ | — | -| fedora | `41`, `42` (default), `43`, `44` | ✔ | ✔ | — | +| fedora | `41`, `42` (default), `43`, `44` | ✔ | ✔ | `43` only | | almalinux | `9` (default), `10` | ✔ | ✔ | ✔ | | rocky | `9`, `10` (default) | ✔ | ✔ | ✔ | | arch | `latest` | ✔ | — | — | +Fedora builds s390x only for the current release, and on a separate tree +(`fedora-secondary`) — hence the single version there. + Provide an explicit image path as a positional argument to override the automatic download location. @@ -201,11 +204,14 @@ Catalogue, par architecture (`deploy_qemu.py` fait autorité) : |---|---|:-:|:-:|:-:| | ubuntu | `24.04` (défaut), `25.10`, `26.04` | ✔ | ✔ | ✔ | | debian | `11`, `12` (défaut), `13` | ✔ | ✔ | — | -| fedora | `41`, `42` (défaut), `43`, `44` | ✔ | ✔ | — | +| fedora | `41`, `42` (défaut), `43`, `44` | ✔ | ✔ | `43` seule | | almalinux | `9` (défaut), `10` | ✔ | ✔ | ✔ | | rocky | `9`, `10` (défaut) | ✔ | ✔ | ✔ | | arch | `latest` | ✔ | — | — | +Fedora ne construit s390x que pour la version courante, et sur une +arborescence à part (`fedora-secondary`) — d'où la version unique. + Fournissez un chemin d'image en argument positionnel pour surcharger l'emplacement de téléchargement automatique. diff --git a/script/qemu/README.fr.md b/script/qemu/README.fr.md index 19c022f..063279b 100644 --- a/script/qemu/README.fr.md +++ b/script/qemu/README.fr.md @@ -98,11 +98,14 @@ Catalogue, par architecture (`deploy_qemu.py` fait autorité) : |---|---|:-:|:-:|:-:| | ubuntu | `24.04` (défaut), `25.10`, `26.04` | ✔ | ✔ | ✔ | | debian | `11`, `12` (défaut), `13` | ✔ | ✔ | — | -| fedora | `41`, `42` (défaut), `43`, `44` | ✔ | ✔ | — | +| fedora | `41`, `42` (défaut), `43`, `44` | ✔ | ✔ | `43` seule | | almalinux | `9` (défaut), `10` | ✔ | ✔ | ✔ | | rocky | `9`, `10` (défaut) | ✔ | ✔ | ✔ | | arch | `latest` | ✔ | — | — | +Fedora ne construit s390x que pour la version courante, et sur une +arborescence à part (`fedora-secondary`) — d'où la version unique. + Fournissez un chemin d'image en argument positionnel pour surcharger l'emplacement de téléchargement automatique. diff --git a/script/qemu/README.md b/script/qemu/README.md index a4163a7..0ca3842 100644 --- a/script/qemu/README.md +++ b/script/qemu/README.md @@ -92,11 +92,14 @@ Catalog, per architecture (`deploy_qemu.py` is the source of truth): |---|---|:-:|:-:|:-:| | ubuntu | `24.04` (default), `25.10`, `26.04` | ✔ | ✔ | ✔ | | debian | `11`, `12` (default), `13` | ✔ | ✔ | — | -| fedora | `41`, `42` (default), `43`, `44` | ✔ | ✔ | — | +| fedora | `41`, `42` (default), `43`, `44` | ✔ | ✔ | `43` only | | almalinux | `9` (default), `10` | ✔ | ✔ | ✔ | | rocky | `9`, `10` (default) | ✔ | ✔ | ✔ | | arch | `latest` | ✔ | — | — | +Fedora builds s390x only for the current release, and on a separate tree +(`fedora-secondary`) — hence the single version there. + Provide an explicit image path as a positional argument to override the automatic download location. diff --git a/script/qemu/deploy_qemu.py b/script/qemu/deploy_qemu.py index 21c9a72..267c0ef 100755 --- a/script/qemu/deploy_qemu.py +++ b/script/qemu/deploy_qemu.py @@ -146,7 +146,27 @@ NON_X86_ARCHES: tuple[str, ...] = ("arm64", "s390x") # - s390x (IBM Z) : Ubuntu seulement (Debian/Fedora : 404 ; Arch : x86/arm). # - arm64/aarch64 : Ubuntu, Debian, Fedora (Arch : pas d'image cloud officielle # aarch64 sur geo.mirror.pkgbuild.com). -S390X_DISTROS: tuple[str, ...] = ("ubuntu", "almalinux", "rocky") +S390X_DISTROS: tuple[str, ...] = ("ubuntu", "almalinux", "rocky", "fedora") + +# Une distro peut ne publier qu'une PARTIE de ses versions sur une +# architecture. Déclaration POSITIVE : hors de cette table, toutes les versions +# du catalogue sont réputées disponibles. +# +# Fedora ne construit s390x que pour la version courante, et sur une +# arborescence à part (« fedora-secondary ») : la 41 et la 42 y sont retirées +# (404 sur le miroir maître), la 44 n'est pour l'instant que sur certains +# miroirs tiers. Seule la 43 est servie par dl.fedoraproject.org — vérifié. +ARCH_ONLY_VERSIONS: dict[str, dict[str, tuple[str, ...]]] = { + "s390x": {"fedora": ("43",)}, +} + + +def arch_versions(distro: str, arch: str, versions) -> list[str]: + """Versions de `distro` réellement publiées pour `arch`.""" + only = ARCH_ONLY_VERSIONS.get(arch, {}).get(distro) + return [v for v in versions if only is None or v in only] + + ARM64_DISTROS: tuple[str, ...] = ( "ubuntu", "debian", @@ -197,6 +217,15 @@ FEDORA_BASE = "https://download.fedoraproject.org/pub/fedora/linux/releases" # redirecteur envoie sur un miroir incomplet (fréquent en déploiement # PARALLÈLE : chaque requête peut tomber sur un miroir différent/désynchronisé). FEDORA_BASE_MASTER = "https://dl.fedoraproject.org/pub/fedora/linux/releases" +# s390x est une architecture SECONDAIRE chez Fedora : ses images ne sont PAS +# sous /pub/fedora/linux/ mais sous /pub/fedora-secondary/, et seule la +# version courante y est construite. +FEDORA_SECONDARY = ( + "https://download.fedoraproject.org/pub/fedora-secondary/releases" +) +FEDORA_SECONDARY_MASTER = ( + "https://dl.fedoraproject.org/pub/fedora-secondary/releases" +) # Répertoire de cache par défaut des images cloud (cohérent avec --disk-dir / # --seed-dir). L'écriture y nécessite root : le déploiement tourne de toute @@ -275,12 +304,18 @@ def resolve_fedora_url(version: str, arch: str, dry_run: bool) -> str: pattern = re.compile( rf"Fedora-Cloud-Base-Generic-{version}-[0-9.]+\.{a}\.qcow2" ) + # Architecture secondaire (s390x, ppc64le) : autre arborescence. + primary, master = ( + (FEDORA_SECONDARY, FEDORA_SECONDARY_MASTER) + if arch == "s390x" + else (FEDORA_BASE, FEDORA_BASE_MASTER) + ) if dry_run: - index = f"{FEDORA_BASE}/{version}/Cloud/{a}/images/" + index = f"{primary}/{version}/Cloud/{a}/images/" return index + f"Fedora-Cloud-Base-Generic-{version}-.{a}.qcow2" # On essaie le redirecteur (2 fois : chaque requête peut viser un miroir # différent) puis le serveur maître (toujours complet). - bases = [FEDORA_BASE, FEDORA_BASE, FEDORA_BASE_MASTER] + bases = [primary, primary, master] last_err = "" for base in bases: index = f"{base}/{version}/Cloud/{a}/images/" @@ -2173,6 +2208,14 @@ def main() -> None: f"Architecture {args.arch} indisponible pour {args.distro!r} : " f"images cloud publiées seulement pour {', '.join(supported)}." ) + # Toutes les versions d'une distro ne sont pas publiées sur toutes les + # architectures : le dire ici plutôt que d'échouer au téléchargement. + ok_versions = arch_versions(args.distro, args.arch, versions) + if args.version not in ok_versions: + sys.exit( + f"{args.distro} {args.version} n'est pas publié en {args.arch}.\n" + f" Versions disponibles : {', '.join(ok_versions) or 'aucune'}." + ) code, default_osinfo, min_ram, min_disk = versions[args.version] if args.codename: code = args.codename diff --git a/script/todo/todo.py b/script/todo/todo.py index b9bf152..c3709f3 100755 --- a/script/todo/todo.py +++ b/script/todo/todo.py @@ -1074,7 +1074,7 @@ class TODO: # Distros publiant des images cloud par architecture (cohérent avec # S390X_DISTROS / ARM64_DISTROS de deploy_qemu.py). amd64 : toutes. - _QEMU_S390X_DISTROS = ("ubuntu", "almalinux", "rocky") + _QEMU_S390X_DISTROS = ("ubuntu", "almalinux", "rocky", "fedora") _QEMU_ARM64_DISTROS = ( "ubuntu", "debian", @@ -5186,10 +5186,17 @@ class TODO: déployable, aussi bien pour la liste granulaire de la CLI que pour la liste à cocher du formulaire TUI.""" flat = [] + # Une distro peut ne publier qu'une partie de ses versions sur une + # architecture (Fedora ne construit que la courante en s390x). La + # table vit dans deploy_qemu.py, qui refuse aussi ces combinaisons : + # une seule source, donc aucun écran n'offre un choix rejeté ensuite. + only = getattr(mod, "arch_versions", None) for d in distros: versions_map, default_v = mod.DISTROS[d] for v, (_c, _o, ram, disk) in versions_map.items(): for a in self._qemu_arches_for(d, arch): + if only and v not in only(d, a, versions_map): + continue flat.append( { "distro": d,