249 lines
6.3 KiB
Markdown
Executable File
249 lines
6.3 KiB
Markdown
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](backend/app/schemas/hardware.py:59))
|
|
|
|
**Avant** :
|
|
```python
|
|
class StorageDevice(BaseModel):
|
|
capacity_gb: Optional[int] = None
|
|
```
|
|
|
|
**Après** :
|
|
```python
|
|
class StorageDevice(BaseModel):
|
|
capacity_gb: Optional[float] = None # Changed from int to float
|
|
```
|
|
|
|
### 2. ✅ Schéma RAMInfo ([backend/app/schemas/hardware.py](backend/app/schemas/hardware.py:35-44))
|
|
|
|
Ajout des nouveaux champs pour les statistiques RAM :
|
|
|
|
```python
|
|
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](backend/app/api/benchmark.py:72-80))
|
|
|
|
Sauvegarde des nouveaux champs RAM :
|
|
|
|
```python
|
|
# 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](backend/app/models/hardware_snapshot.py:35-43))
|
|
|
|
Ajout des colonnes dans la table `hardware_snapshots` :
|
|
|
|
```python
|
|
# 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](backend/migrations/001_add_ram_stats_and_smart.sql))
|
|
|
|
Script SQL pour mettre à jour une base existante :
|
|
|
|
```sql
|
|
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](backend/apply_migration.py))
|
|
|
|
Script Python pour appliquer automatiquement la migration :
|
|
|
|
```bash
|
|
python3 backend/apply_migration.py
|
|
```
|
|
|
|
## Test de Validation
|
|
|
|
```bash
|
|
# 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)
|
|
|
|
```bash
|
|
# 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)
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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](backend/app/schemas/hardware.py) | `capacity_gb: int` → `float`, ajout champs RAM | ✅ |
|
|
| [backend/app/api/benchmark.py](backend/app/api/benchmark.py) | Sauvegarde nouveaux champs RAM | ✅ |
|
|
| [backend/app/models/hardware_snapshot.py](backend/app/models/hardware_snapshot.py) | Ajout colonnes RAM | ✅ |
|
|
| [backend/migrations/001_add_ram_stats_and_smart.sql](backend/migrations/001_add_ram_stats_and_smart.sql) | Migration SQL | ✅ |
|
|
| [backend/apply_migration.py](backend/apply_migration.py) | Script d'application | ✅ |
|
|
|
|
## Données Maintenant Collectées
|
|
|
|
### Avant
|
|
```json
|
|
{
|
|
"ram": {
|
|
"total_mb": 8000
|
|
},
|
|
"storage": {
|
|
"devices": [{
|
|
"capacity_gb": 500 // int uniquement
|
|
}]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Après
|
|
```json
|
|
{
|
|
"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_mb` continueront de fonctionner
|
|
- ✅ Le script `bench.sh` est maintenant **totalement autonome** et ne dépend plus de `script_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 :
|
|
1. [DEPLOYMENT_GUIDE.md](DEPLOYMENT_GUIDE.md) - Guide complet de déploiement
|
|
2. [IMPLEMENTATION_STATUS.md](IMPLEMENTATION_STATUS.md) - État d'implémentation
|
|
3. Logs Docker : `docker-compose logs -f backend`
|