Files
serv_benchmark/docs/FEATURE_PCI_FORM_PREFILL.md
2026-01-11 23:41:30 +01:00

251 lines
8.5 KiB
Markdown

# Pré-remplissage complet du formulaire PCI
## Contexte
Lors de l'import de périphériques PCI, certains champs n'étaient pas pré-remplis dans le formulaire:
- Le sous-type n'était pas sélectionné (select vide)
- Le Device ID (slot PCI comme 08:00.0) n'était pas rempli
- Le fabricant de carte (pour GPU) n'était pas rempli
## Problèmes résolus
### 1. Sous-type non sélectionné
**Problème**: Le champ `type_principal` était pré-rempli avec "PCI", mais le select `sous_type` restait vide car les options n'étaient pas chargées avant de tenter de sélectionner la valeur.
**Solution**: Appeler `loadPeripheralSubtypes()` après avoir défini le `type_principal`, puis définir le `sous_type`.
```javascript
// Fill type_principal and trigger sous_type loading
if (suggested.type_principal) {
document.getElementById('type_principal').value = suggested.type_principal;
// Load subtypes for this type
await loadPeripheralSubtypes();
// Then set the sous_type value
if (suggested.sous_type) {
document.getElementById('sous_type').value = suggested.sous_type;
}
}
```
### 2. Device ID manquant
**Problème**: Le slot PCI (ex: `08:00.0`) n'était pas pré-rempli dans le champ `device_id`.
**Solution**: Ajouter le slot dans les données suggérées du backend.
#### Backend - `peripherals.py`
```python
suggested = {
"nom": nom,
"type_principal": type_principal,
"sous_type": sous_type,
"marque": brand or device_info.get("vendor_name"),
"modele": model or device_info.get("device_name"),
"device_id": device_info.get("slot"), # PCI slot (e.g., 08:00.0)
"pci_device_id": device_info.get("pci_device_id"), # vendor:device (e.g., 10de:2504)
"cli_raw": device_section,
"caracteristiques_specifiques": caracteristiques_specifiques
}
```
#### Frontend - `peripherals.js`
```javascript
// Fill Device ID (PCI slot like 08:00.0)
if (suggested.device_id) {
const deviceIdField = document.getElementById('device_id');
if (deviceIdField) deviceIdField.value = suggested.device_id;
}
```
### 3. Fabricant de carte manquant
**Problème**: Pour les cartes graphiques, le fabricant de la carte (ex: Gigabyte) extrait du subsystem n'était pas pré-rempli.
**Solution**: Le backend extrait déjà le fabricant, il suffit de le pré-remplir dans le frontend.
```javascript
// Fill fabricant if present (for GPU cards)
if (suggested.fabricant) {
const fabricantField = document.getElementById('fabricant');
if (fabricantField) fabricantField.value = suggested.fabricant;
}
```
## Champs pré-remplis automatiquement
Lors de l'import d'un périphérique PCI, le formulaire pré-remplit maintenant:
### Champs de base
-**Nom**: Construit à partir de marque + modèle (ex: `NVIDIA GeForce RTX 3060 Lite Hash Rate`)
-**Type principal**: `PCI`
-**Sous-type**: Classification automatique (ex: `Carte graphique`, `SSD NVMe`, etc.)
-**Marque**: Premier mot du vendor (ex: `NVIDIA`, `Micron`)
-**Modèle**: Nom commercial du périphérique (ex: `GeForce RTX 3060 Lite Hash Rate`)
### Champs spécifiques PCI
-**Device ID**: Slot PCI (ex: `08:00.0`)
-**PCI Device ID**: Identifiant vendor:device (ex: `10de:2504`)
-**Fabricant**: Fabricant de la carte pour GPU (ex: `Gigabyte`)
### Champs techniques
-**CLI Raw**: Sortie complète de lspci pour ce périphérique
-**Caractéristiques spécifiques**: JSON avec:
- Slot PCI
- Device class
- Vendor name
- Subsystem
- Driver
- IOMMU group
- Revision
- Modules
## Exemple complet - NVIDIA RTX 3060
### Données d'entrée
```
08:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1) (prog-if 00 [VGA controller])
Subsystem: Gigabyte Technology Co., Ltd Device 4074
Flags: bus master, fast devsel, latency 0, IRQ 84, IOMMU group 16
Kernel driver in use: nvidia
```
### Formulaire pré-rempli
| Champ | Valeur | Source |
|-------|--------|--------|
| **Nom** | `NVIDIA GeForce RTX 3060 Lite Hash Rate` | `brand + model` |
| **Type principal** | `PCI` ✅ | Classification automatique |
| **Sous-type** | `Carte graphique` ✅ | Classification automatique |
| **Marque** | `NVIDIA` | Premier mot de "NVIDIA Corporation" |
| **Modèle** | `GeForce RTX 3060 Lite Hash Rate` | Contenu des brackets `[...]` |
| **Fabricant** | `Gigabyte` ✅ | Premier mot du subsystem |
| **Device ID** | `08:00.0` ✅ | Slot PCI |
| **PCI Device ID** | `10de:2504` | Vendor:device depuis lspci -n |
### Caractéristiques spécifiques (JSON)
```json
{
"slot": "08:00.0",
"device_class": "VGA compatible controller",
"vendor_name": "NVIDIA Corporation",
"subsystem": "Gigabyte Technology Co., Ltd Device 4074",
"driver": "nvidia",
"iommu_group": "16",
"revision": "a1",
"modules": "nvidia"
}
```
## Exemple complet - Micron NVMe SSD
### Données d'entrée
```
01:00.0 Non-Volatile memory controller: Micron/Crucial Technology P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD (DRAM-less) (rev 01)
Subsystem: Micron/Crucial Technology P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD (DRAM-less)
Kernel driver in use: nvme
```
### Formulaire pré-rempli
| Champ | Valeur | Source |
|-------|--------|--------|
| **Nom** | `Micron P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less)` | `brand + model` |
| **Type principal** | `PCI` ✅ | Classification automatique |
| **Sous-type** | `SSD NVMe` ✅ | Classification automatique |
| **Marque** | `Micron` | Premier mot de "Micron/Crucial Technology" |
| **Modèle** | `P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less)` | Nettoyé des brackets |
| **Device ID** | `01:00.0` ✅ | Slot PCI |
| **PCI Device ID** | `c0a9:5407` | Vendor:device depuis lspci -n |
## Workflow de pré-remplissage
```
1. User colle lspci -v et lspci -n
2. Backend détecte les périphériques
3. User sélectionne un périphérique (ex: 08:00.0)
4. Backend extrait et parse les informations
├─ Parse vendor/device name intelligemment
├─ Classifie le périphérique (type + sous-type)
├─ Extrait marque et modèle
├─ Extrait fabricant (pour GPU)
└─ Construit les caractéristiques spécifiques
5. Frontend ouvre le formulaire d'ajout
6. Pré-remplissage séquentiel:
├─ Champs de base (nom, marque, modèle)
├─ Type principal → déclenche chargement sous-types
├─ Sous-type (une fois les options chargées) ✅
├─ Fabricant (si GPU)
├─ Device ID (slot PCI) ✅
├─ PCI Device ID (vendor:device)
└─ Caractéristiques spécifiques (JSON)
7. User valide/modifie et sauvegarde
```
## Code modifié
### Backend - `peripherals.py` (ligne 1507)
```python
"device_id": device_info.get("slot"), # Ajouté: slot PCI
```
### Frontend - `peripherals.js`
**Lignes 1822-1830**: Chargement async des sous-types
```javascript
if (suggested.type_principal) {
document.getElementById('type_principal').value = suggested.type_principal;
await loadPeripheralSubtypes(); // IMPORTANT: async
if (suggested.sous_type) {
document.getElementById('sous_type').value = suggested.sous_type;
}
}
```
**Lignes 1833-1836**: Fabricant
```javascript
if (suggested.fabricant) {
const fabricantField = document.getElementById('fabricant');
if (fabricantField) fabricantField.value = suggested.fabricant;
}
```
**Lignes 1839-1842**: Device ID (slot PCI)
```javascript
if (suggested.device_id) {
const deviceIdField = document.getElementById('device_id');
if (deviceIdField) deviceIdField.value = suggested.device_id;
}
```
## Bénéfices
**Formulaire complet**: Tous les champs pertinents sont pré-remplis
**Gain de temps**: L'utilisateur n'a plus qu'à valider
**Moins d'erreurs**: Les types et sous-types sont correctement sélectionnés
**Traçabilité**: Le slot PCI permet d'identifier précisément le périphérique
**Distinction GPU**: Le fabricant de carte est séparé du fabricant du chipset
## Tests
Pour tester le pré-remplissage complet:
1. Importer un périphérique PCI (GPU ou NVMe)
2. Vérifier que le formulaire affiche:
- Type principal: `PCI`
- Sous-type: Sélectionné automatiquement ✅
- Device ID: Slot PCI (ex: `08:00.0`) ✅
- Fabricant: Pour GPU uniquement ✅
- PCI Device ID: vendor:device (ex: `10de:2504`) ✅
## Fichiers modifiés
1. **backend/app/api/endpoints/peripherals.py** - Ajout du device_id (slot)
2. **frontend/js/peripherals.js** - Pré-remplissage async du sous-type + device_id + fabricant
## Conclusion
Le formulaire d'import PCI pré-remplit maintenant tous les champs disponibles, offrant une expérience utilisateur optimale avec validation minimale requise.