6.3 KiB
Executable File
6.3 KiB
Executable File
Corrections Appliquées - Erreur HTTP 422
Problème Initial
Lors de l'exécution de bench.sh, erreur HTTP 422 :
{"detail":[{
"type":"int_from_float",
"loc":["body","hardware","storage","devices",0,"capacity_gb"],
"msg":"Input should be a valid integer, got a number with a fractional part",
"input":447.1
}]}
Cause
Le schéma Pydantic StorageDevice définissait capacity_gb comme int, mais le script bench.sh envoyait un float (447.1).
Solutions Appliquées
1. ✅ Schéma StorageDevice (backend/app/schemas/hardware.py)
Avant :
class StorageDevice(BaseModel):
capacity_gb: Optional[int] = None
Après :
class StorageDevice(BaseModel):
capacity_gb: Optional[float] = None # Changed from int to float
2. ✅ Schéma RAMInfo (backend/app/schemas/hardware.py)
Ajout des nouveaux champs pour les statistiques RAM :
class RAMInfo(BaseModel):
total_mb: int
used_mb: Optional[int] = None # NEW
free_mb: Optional[int] = None # NEW
shared_mb: Optional[int] = None # NEW
slots_total: Optional[int] = None
slots_used: Optional[int] = None
ecc: Optional[bool] = None
layout: Optional[List[RAMSlot]] = None
3. ✅ API Backend (backend/app/api/benchmark.py)
Sauvegarde des nouveaux champs RAM :
# RAM
ram_total_mb=hw.ram.total_mb if hw.ram else None,
ram_used_mb=hw.ram.used_mb if hw.ram else None, # NEW
ram_free_mb=hw.ram.free_mb if hw.ram else None, # NEW
ram_shared_mb=hw.ram.shared_mb if hw.ram else None, # NEW
ram_slots_total=hw.ram.slots_total if hw.ram else None,
# ...
4. ✅ Modèle de Base de Données (backend/app/models/hardware_snapshot.py)
Ajout des colonnes dans la table hardware_snapshots :
# RAM
ram_total_mb = Column(Integer, nullable=True)
ram_used_mb = Column(Integer, nullable=True) # NEW
ram_free_mb = Column(Integer, nullable=True) # NEW
ram_shared_mb = Column(Integer, nullable=True) # NEW
ram_slots_total = Column(Integer, nullable=True)
# ...
5. ✅ Migration SQL (backend/migrations/001_add_ram_stats_and_smart.sql)
Script SQL pour mettre à jour une base existante :
ALTER TABLE hardware_snapshots ADD COLUMN ram_used_mb INTEGER;
ALTER TABLE hardware_snapshots ADD COLUMN ram_free_mb INTEGER;
ALTER TABLE hardware_snapshots ADD COLUMN ram_shared_mb INTEGER;
6. ✅ Script d'Application de Migration (backend/apply_migration.py)
Script Python pour appliquer automatiquement la migration :
python3 backend/apply_migration.py
Test de Validation
# Test des schémas Pydantic
python3 -c "
from app.schemas.hardware import RAMInfo, StorageDevice
# Test RAMInfo avec nouveaux champs
ram = RAMInfo(total_mb=8000, used_mb=6000, free_mb=1500, shared_mb=500)
print('✅ RAMInfo OK')
# Test StorageDevice avec float
storage = StorageDevice(name='/dev/sda', capacity_gb=447.1)
print(f'✅ StorageDevice OK - capacity_gb={storage.capacity_gb}')
"
Résultat :
✅ RAMInfo OK
✅ StorageDevice OK - capacity_gb=447.1
Prochaines Étapes pour le Déploiement
Option 1 : Nouvelle Base de Données (Recommandé pour les tests)
# Arrêter les services
docker-compose down
# Supprimer l'ancienne base
rm -f backend/data/data.db
# Redémarrer (la base sera recréée automatiquement avec les nouveaux champs)
docker-compose up -d
Option 2 : Migration de la Base Existante (Production)
# Arrêter les services
docker-compose down
# Appliquer la migration
python3 backend/apply_migration.py
# Redémarrer
docker-compose up -d
Vérification
1. Tester avec le script bench.sh
sudo bash scripts/bench.sh
Vous devriez voir :
[8/8] Construction du payload JSON et envoi au serveur
✓ Envoi du payload vers: http://10.0.0.50:8007/api/benchmark
✓ Payload envoyé avec succès (HTTP 200)
2. Vérifier la base de données
sqlite3 backend/data/data.db
# Vérifier les nouvelles colonnes
PRAGMA table_info(hardware_snapshots);
# Voir les données
SELECT
d.hostname,
h.ram_total_mb,
h.ram_used_mb,
h.ram_free_mb,
h.ram_shared_mb
FROM hardware_snapshots h
JOIN devices d ON h.device_id = d.id
ORDER BY h.captured_at DESC
LIMIT 1;
3. Vérifier les logs backend
docker-compose logs backend | grep -i error
Pas d'erreurs = succès ! ✅
Résumé des Fichiers Modifiés
| Fichier | Modification | Status |
|---|---|---|
| backend/app/schemas/hardware.py | capacity_gb: int → float, ajout champs RAM |
✅ |
| backend/app/api/benchmark.py | Sauvegarde nouveaux champs RAM | ✅ |
| backend/app/models/hardware_snapshot.py | Ajout colonnes RAM | ✅ |
| backend/migrations/001_add_ram_stats_and_smart.sql | Migration SQL | ✅ |
| backend/apply_migration.py | Script d'application | ✅ |
Données Maintenant Collectées
Avant
{
"ram": {
"total_mb": 8000
},
"storage": {
"devices": [{
"capacity_gb": 500 // int uniquement
}]
}
}
Après
{
"ram": {
"total_mb": 7771,
"used_mb": 6123, // ✨ NOUVEAU
"free_mb": 923, // ✨ NOUVEAU
"shared_mb": 760 // ✨ NOUVEAU
},
"storage": {
"devices": [{
"capacity_gb": 447.1 // ✨ Supporte maintenant les décimales
}]
}
}
Notes
- ✅ Les modifications sont rétrocompatibles : les anciens benchmarks sans
used_mb/free_mb/shared_mbcontinueront de fonctionner - ✅ Le script
bench.shest maintenant totalement autonome et ne dépend plus descript_test.sh - ✅ Le payload JSON est conforme au format attendu par l'API
- ✅ La validation Pydantic fonctionne correctement
Support
En cas de problème, consulter :
- DEPLOYMENT_GUIDE.md - Guide complet de déploiement
- IMPLEMENTATION_STATUS.md - État d'implémentation
- Logs Docker :
docker-compose logs -f backend