Skip to content

[P1] services/doctor.py atteint 1227 lignes et concentre quatorze familles de contrôles #199

Description

@stephrobert

État vérifié

wc -l src/dsoxlab/services/doctor.py1227 lignes, en croissance
continue : les contrôles egress et incus_pool viennent de s'y ajouter.

Le module porte aujourd'hui, dans un seul fichier : python, pytest, shell, git,
docker, terraform, ansible, kvm, libvirt, incus, pool libvirt, pool incus,
virtualisation matérielle, architecture CPU, ressources, accès sortant, outil
ISO, labs, lab_home — plus le modèle (Check, Fix, FixKind,
DoctorReport), le classement requis/informatif, et la remédiation.

Ce n'est pas du mauvais code : il est très commenté et le raisonnement s'y suit.
Le risque est la régression croisée, et le coût de test : éprouver une
famille demande de construire l'état de toutes les autres — c'est déjà ce qui a
obligé test_doctor.py à neutraliser six sondes dans une fixture autouse.

Découpage proposé

services/doctor/
├── model.py         Check, Fix, FixKind, DoctorReport, les états
├── runner.py        collect_checks, le classement requis/informatif
├── outillage.py     python, pytest, shell, git, terraform, ansible
├── conteneurs.py    docker
├── kvm.py           virsh, pool libvirt, hw_virt, cpu_arch, iso
├── incus.py         client, daemon, groupe, pool
└── systeme.py       ressources, accès sortant

collect_checks reste le point d'entrée, et rien ne change pour les appelants.

Ce qu'il faut préserver

  • Le classement requis / informatif est le cœur de l'agnosticisme : il ne
    dépend que de quatre faits du dépôt. Le découpage ne doit pas le disperser —
    d'où runner.py séparé des familles.
  • Les trois états (ok, failed, unknown) et leur sémantique.
  • Les tests existants doivent passer sans réécriture, sinon le refactoring
    change le comportement au lieu de le déplacer.

Critères d'acceptation

  • Aucun fichier du paquet ne dépasse ~400 lignes.
  • collect_checks garde sa signature ; les imports publics restent valides.
  • La suite passe sans modification des tests — c'est le seul contrôle qui
    prouve qu'un refactoring n'est qu'un déplacement.
  • Chaque famille devient testable sans neutraliser les autres.

Relevé en confrontant au code une analyse externe du dépôt, le 2026-08-24.
Le chiffre annoncé par cette analyse (1112 lignes) était déjà dépassé.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions