Skip to content

Commit f85161c

Browse files
authored
fix(0.5.5): deux défauts trouvés en construisant un catalogue (#325)
Deux défauts dont aucun ne se voyait depuis le dépôt du moteur. `dnsutils` faisait sortir tout provisionnement Debian 13 et Ubuntu 26 en `status: error` : paquet de transition retiré de ces distributions, sans candidat. cloud-init échoue alors sur tout son module de paquets, et le provisionnement continue en annonçant ses hôtes prêts. Mesuré sur une VM Debian 13.7. `dsoxlab new lab` annonçait une section et écrivait dans une autre : la recherche de `labs: []` portait sur tout le fichier alors que le nom lu était celui de la première section. La position dont le message parlait est l'ordre pédagogique dont `next` se sert. Plus `scripts/campagnes/`, un descripteur par catalogue, parce qu'une campagne a produit 59 faux ROUGE sur kubernetes et 16 sur iam alors que les deux causes étaient écrites dans le CLAUDE.md du catalogue concerné. Cinq tests ajoutés, dont quatre prouvés par mutation ; le cinquième est un garde-fou de non-régression et ne prétend pas prouver le défaut.
1 parent ab33e7b commit f85161c

20 files changed

Lines changed: 1024 additions & 4 deletions

‎CHANGELOG.fr.md‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,58 @@ Toutes les modifications notables du projet sont documentées dans ce fichier.
77
Le format s'appuie sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
88
et le projet suit le [versionnage sémantique](https://semver.org/lang/fr/).
99

10+
## [0.5.5] - 2026-10-19
11+
12+
### Corrigé
13+
14+
- **`dsoxlab new lab` annonçait une section et écrivait dans une autre.**
15+
`_inscrire_dans_une_section` lisait le nom de la PREMIÈRE section, puis
16+
cherchait `labs: []` dans TOUT le reste du fichier. Sur un catalogue à
17+
plusieurs sections dont une vide, le lab partait dans cette section vide
18+
pendant que le message nommait la première.
19+
20+
Ce n'est pas un défaut de rangement, c'est un message qui mentait, et la
21+
position dont il parlait EST l'ordre pédagogique : `discovery/scanner.py` en
22+
dérive `bloc_order`, et `next` s'en sert. Mesuré le même jour sur
23+
bdd-dsoxlab-training : deux labs sont partis dans une autre section que celle
24+
annoncée, et ce sont exactement les deux créés tant qu'une section vide
25+
subsistait.
26+
27+
La recherche est désormais bornée à la première section. Le défaut demande
28+
DEUX sections dont une vide pour se montrer, et un `meta.yml` d'une seule
29+
section ne le montre jamais : c'est ce qui lui a permis de survivre.
30+
31+
Trois tests de `tests/test_scaffold.py` tiennent l'invariant : la section
32+
annoncée est toujours celle qui a reçu le lab. Deux d'entre eux rougissent
33+
quand on retire la borne.
34+
35+
- **Tout provisionnement Debian 13 ou Ubuntu 26 sortait avec un cloud-init en
36+
`status: error`, et aucun `dig` sur les VM.** Les gabarits cloud-init
37+
packagés pour Debian et Ubuntu citaient `dnsutils`, qui n'était qu'un paquet
38+
de transition : il a été retiré de Debian 13 et d'Ubuntu 26, où il n'a donc
39+
plus de candidat. cloud-init échoue alors sur tout son module de paquets,
40+
signale l'erreur, et le provisionnement continue en annonçant ses hôtes
41+
prêts.
42+
43+
Mesuré sur une VM Debian 13.7 fraîchement provisionnée : `apt-cache policy
44+
dnsutils` répond `Candidate: (none)`, là où `bind9-dnsutils` répond
45+
`1:9.20.29-1~deb13u1`. Les autres paquets de la liste étaient bien installés,
46+
donc le dégât est borné à l'absence de `dig` et `nslookup`, plus un message
47+
d'erreur à chaque provisionnement. Un message qu'on apprend à ignorer ne
48+
protège plus personne, et le prochain paquet retiré se cacherait derrière le
49+
même bruit.
50+
51+
`bind9-dnsutils` existe depuis Debian 11 et Ubuntu 21.04 : il couvre donc
52+
aussi les distributions plus anciennes du contrat (`debian12`, `ubuntu22`).
53+
54+
`tests/test_cloud_init_templates.py` refuse désormais un paquet de transition
55+
connu pour avoir disparu dans n'importe quel cloud-init packagé, et exige un
56+
outil de résolution DNS dans ceux de Debian et d'Ubuntu. C'est un lint, pas
57+
une mesure : rien ici n'interroge un miroir, donc il dit seulement qu'aucun
58+
paquet connu pour avoir disparu ne figure dans la liste. Elle s'allonge d'un
59+
nom chaque fois qu'un provisionnement en désigne un, ce qui est la façon dont
60+
celui-ci a été trouvé.
61+
1062
## [0.5.4] - 2026-10-19
1163

1264
### Corrigé

‎CHANGELOG.md‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,55 @@ All notable changes to this project are documented in this file.
77
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
88
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
99

10+
## [0.5.5] - 2026-10-19
11+
12+
### Fixed
13+
14+
- **`dsoxlab new lab` announced one section and wrote into another.**
15+
`_inscrire_dans_une_section` read the name of the FIRST section, then looked
16+
for `labs: []` across the WHOLE rest of the file. On a catalog with several
17+
sections of which one was empty, the lab went into that empty one while the
18+
message named the first.
19+
20+
It is not a filing mistake, it is a message that lied, and the position it
21+
spoke of IS the teaching order: `discovery/scanner.py` derives `bloc_order`
22+
from it, and `next` uses that. Measured on bdd-dsoxlab-training the same day:
23+
two labs went into a section other than the announced one, and they are
24+
exactly the two created while an empty section still remained.
25+
26+
The search is now bounded to the first section. The defect needs TWO sections
27+
of which one is empty in order to show, and a single-section `meta.yml` never
28+
shows it, which is how it survived.
29+
30+
Three tests in `tests/test_scaffold.py` hold the invariant: the announced
31+
section is always the one that received the lab. Two of them go red when the
32+
bound is removed.
33+
34+
- **Every Debian 13 and Ubuntu 26 provision ended with cloud-init in
35+
`status: error`, and no `dig` on any VM.** The packaged cloud-init templates
36+
for Debian and Ubuntu listed `dnsutils`, which was only a transitional
37+
package: it was removed from Debian 13 and Ubuntu 26, so it has no candidate
38+
there. cloud-init then fails its whole package module, reports the error, and
39+
the provision carries on and announces its hosts as ready.
40+
41+
Measured on a freshly provisioned Debian 13.7 VM: `apt-cache policy dnsutils`
42+
answers `Candidate: (none)`, while `bind9-dnsutils` answers
43+
`1:9.20.29-1~deb13u1`. The other packages on the list were installed, so the
44+
damage is bounded to `dig` and `nslookup` being absent, plus an error message
45+
printed on every provision. A message one learns to ignore protects nobody,
46+
and the next removed package would hide behind the same noise.
47+
48+
`bind9-dnsutils` has existed since Debian 11 and Ubuntu 21.04, so it also
49+
covers the older distributions the contract declares (`debian12`,
50+
`ubuntu22`).
51+
52+
`tests/test_cloud_init_templates.py` now refuses a known-removed transitional
53+
package in any packaged cloud-init, and requires a DNS resolution tool in the
54+
Debian and Ubuntu ones. It is a lint, not a measurement: nothing here queries
55+
a mirror, so it only says that no package known to have disappeared is
56+
listed. The list gains a name each time a provision names one, which is how
57+
this one was found.
58+
1059
## [0.5.4] - 2026-10-19
1160

1261
### Fixed

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "dsoxlab"
7-
version = "0.5.4"
7+
version = "0.5.5"
88
description = "Turn declarative exercises into reproducible, runnable and verifiable lab environments"
99
readme = "README.md"
1010
requires-python = ">=3.11"

0 commit comments

Comments
 (0)