Bruno Charest 6d8432169b
Some checks failed
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled
Add enhanced terminal history panel UI with animations, keyboard navigation, advanced filtering, search highlighting, and improved storage metrics display with detailed filesystem tables and ZFS/LVM support
2025-12-21 12:31:08 -05:00

242 lines
5.9 KiB
Markdown

# Stockage Détaillé - Documentation Technique
## Vue d'ensemble
La fonctionnalité "Stockage Détaillé" fournit une vue complète et normalisée des informations de stockage pour tous les hôtes, avec support multi-OS (Linux Alpine/Debian, TrueNAS CORE, TrueNAS SCALE).
## Architecture
### Backend
```
app/
├── models/host_metrics.py # Colonne storage_details (JSON)
├── schemas/host_metrics.py # Schéma Pydantic avec storage_details
├── services/builtin_playbooks.py # Définition du builtin playbook
└── routes/builtin_playbooks.py # API endpoints
ansible/playbooks/builtin/
└── _builtin_collect_storage_details.yml # Playbook de collecte
```
### Frontend
```
app/
└── main.js
├── renderStorageDetailsSection() # Rendu de l'accordion
├── toggleStorageDetails() # Toggle accordion
└── toggleStorageInspector() # Toggle mode inspecteur
```
## Schéma de Données
### StorageDetails v1
```json
{
"os_type": "linux-debian|linux-alpine|truenas-core|truenas-scale|linux-generic",
"status": "ok|partial|error",
"collected_at": "2025-12-19T10:00:00Z",
"commands_run": [
{"cmd": "lsblk", "status": "ok"},
{"cmd": "df", "status": "ok"}
],
"partial_failures": [],
"summary": {
"total_bytes": 500107862016,
"used_bytes": 125026965504,
"free_bytes": 349600112640,
"used_pct": 25.0
},
"block_devices": [...],
"mounts": [...],
"filesystems": [...],
"lvm": {
"pvs": [...],
"vgs": [...],
"lvs": [...]
},
"zfs": {
"pools": [...],
"datasets": [...]
},
"feature_flags": {
"has_lvm": false,
"has_zfs": false,
"has_lsblk": true,
"has_findmnt": true
}
}
```
## Commandes par OS
### Linux (Alpine/Debian)
| Commande | Description | Fallback |
|----------|-------------|----------|
| `lsblk -J -b -o ...` | Block devices avec JSON | Options réduites |
| `findmnt -J -b` | Points de montage fiables | df seul |
| `df -B1 -PT` | Filesystems usage | Toujours disponible |
| `pvs/vgs/lvs --reportformat json` | LVM info | Ignoré si absent |
### TrueNAS CORE (FreeBSD)
| Commande | Description | Notes |
|----------|-------------|-------|
| `df -k -T` | Filesystems | Conversion bytes nécessaire |
| `zpool list -H -p` | ZFS pools | Parsable output |
| `zfs list -H -p` | ZFS datasets | Avec bytes |
### TrueNAS SCALE (Linux + ZFS)
Combine les commandes Linux + ZFS.
## Interface Utilisateur
### Accordion "Stockage détaillé"
L'accordion est replié par défaut et affiche un résumé compact :
```
[icon] Stockage détaillé [OK] [4 FS] [ZFS] 25% utilisé • 116 GB / 465 GB [i] [v]
```
Éléments :
- **Icône** : `fa-database` (indigo)
- **Badge statut** : OK (vert), Partiel (jaune), Erreur (rouge)
- **Chips** : Nombre de filesystems, ZFS, LVM si présents
- **Résumé** : % utilisé et tailles
- **Bouton inspecteur** : `fa-info-circle`
- **Chevron** : expand/collapse
### Contenu de l'accordion
1. **Table Filesystems** :
- Colonnes : Mount, Device, FS, Taille, Utilisé, %
- Seuils de warning : 75% jaune, 90% rouge
- Fond rouge léger pour partitions > 85%
2. **Section ZFS** (si présent) :
- Pools avec santé (ONLINE/DEGRADED/FAULTED)
- Barre de progression usage
- Liste des datasets
3. **Section LVM** (si présent) :
- Volume Groups avec taille/free
- Liste des LVs
### Mode Inspecteur
Drawer affichant les métadonnées de collecte :
- OS détecté
- Timestamp de collecte
- Statut de collecte
- Liste des commandes exécutées avec statut
- Avertissements (partial failures)
## API Endpoints
### Exécuter la collecte
```http
POST /api/builtin-playbooks/execute
Content-Type: application/json
{
"builtin_id": "collect_storage_details",
"target": "hostname"
}
```
### Collecte sur tous les hôtes
```http
POST /api/builtin-playbooks/collect-all
```
## Migration Base de Données
Migration `0016_add_storage_details_column.py` :
```python
def upgrade():
op.add_column('host_metrics',
sa.Column('storage_details', sa.JSON(), nullable=True))
```
## Tests
### Backend
```bash
pytest tests/backend/test_storage_details.py -v
```
Couverture :
- Validation schéma
- Parsing données par OS
- Feature flags
- Seuils de warning
- Métadonnées de collecte
### Frontend
```bash
npm run test -- tests/frontend/storage_details.test.js
```
Couverture :
- Rendu accordion
- Table filesystems avec warnings
- Sections ZFS/LVM
- Mode inspecteur
- Formatage bytes
## Checklist de Validation
- [ ] Section "Stockage détaillé" visible sur un host (repliée par défaut)
- [ ] Summary correct (chips, usage, tailles)
- [ ] Linux : filesystems/mounts affichés correctement
- [ ] TrueNAS CORE : df + ZFS pools/datasets affichés
- [ ] TrueNAS SCALE : Linux + ZFS affichés
- [ ] LVM affiché si présent
- [ ] Seuils de warning appliqués (75% jaune, 90% rouge)
- [ ] Mode inspecteur affiche les commandes et statuts
- [ ] Gestion gracieuse des erreurs partielles
- [ ] Données collectées dans le même run que les autres métriques
## Compatibilité
### Commandes Manquantes
| OS | Commande | Comportement |
|----|----------|--------------|
| Alpine | `findmnt` | Fallback df seul, status=partial |
| FreeBSD | `lsblk` | Non utilisé, block_devices=[] |
| Tout | LVM | Ignoré si absent |
| Tout | ZFS | Ignoré si absent |
### Fallbacks
1. Si `lsblk -J -O -b` échoue → essai avec options réduites
2. Si `findmnt -J` échoue → utilise `df` seul
3. Si LVM absent → `lvm_info` vide, pas d'erreur
4. Si ZFS absent → `zfs` vide, pas d'erreur
## Performance
- Timeouts implicites via Ansible (task timeout)
- Commandes légères (lecture seule)
- Pas d'opérations bloquantes
- Collecte parallèle multi-hôtes possible
## Sécurité
- Toutes les commandes sont en lecture seule
- Pas de commandes destructives
- Pas d'exposition de données sensibles (mots de passe, clés)
- Les serial numbers de disques sont optionnels