# Modifications Frontend - Filtrage des Playbooks ## Date : 5 décembre 2024 ## Résumé Le frontend a été modifié pour implémenter le filtrage des playbooks selon la compatibilité host/group. Les playbooks sont maintenant filtrés automatiquement en fonction de la cible sélectionnée. ## Modifications Apportées ### 1. Fonction `showPlaybookModalForHost(hostName)` **Fichier :** `app/main.js` (ligne ~1126) **Avant :** ```javascript async showPlaybookModalForHost(hostName) { // Récupérer la liste des playbooks disponibles try { const pbResult = await this.apiCall('/api/ansible/playbooks'); const playbooks = (pbResult && pbResult.playbooks) ? pbResult.playbooks : []; ``` **Après :** ```javascript async showPlaybookModalForHost(hostName) { // Récupérer la liste des playbooks compatibles avec cet hôte try { const pbResult = await this.apiCall(`/api/ansible/playbooks?target=${encodeURIComponent(hostName)}`); const playbooks = (pbResult && pbResult.playbooks) ? pbResult.playbooks : []; ``` **Changement :** - Ajout du paramètre `?target=` dans l'appel API - L'API retourne maintenant uniquement les playbooks compatibles avec l'hôte **Message informatif ajouté :** ```html
Seuls les playbooks compatibles avec cet hôte sont affichés (X disponibles)
``` --- ### 2. Fonction `executePlaybookOnGroup()` **Fichier :** `app/main.js` (ligne ~1883) **Avant :** ```javascript executePlaybookOnGroup() { const currentGroup = this.currentGroupFilter; // Générer la liste des playbooks groupés par catégorie let playbooksByCategory = {}; this.playbooks.forEach(pb => { const cat = pb.category || 'general'; if (!playbooksByCategory[cat]) playbooksByCategory[cat] = []; playbooksByCategory[cat].push(pb); }); ``` **Après :** ```javascript async executePlaybookOnGroup() { const currentGroup = this.currentGroupFilter; // Charger les playbooks compatibles avec ce groupe let compatiblePlaybooks = []; try { const pbResult = await this.apiCall(`/api/ansible/playbooks?target=${encodeURIComponent(currentGroup)}`); compatiblePlaybooks = (pbResult && pbResult.playbooks) ? pbResult.playbooks : []; } catch (error) { this.showNotification(`Erreur chargement playbooks: ${error.message}`, 'error'); return; } // Générer la liste des playbooks groupés par catégorie let playbooksByCategory = {}; compatiblePlaybooks.forEach(pb => { const cat = pb.category || 'general'; if (!playbooksByCategory[cat]) playbooksByCategory[cat] = []; playbooksByCategory[cat].push(pb); }); ``` **Changements :** - Fonction maintenant `async` - Appel API avec paramètre `?target=` pour filtrer par groupe - Utilisation de `compatiblePlaybooks` au lieu de `this.playbooks` - Gestion d'erreur si l'API échoue **Message informatif ajouté :** ```html
Seuls les playbooks compatibles avec ce groupe sont affichés (X disponibles)
``` --- ## Comportement Attendu ### Scénario 1 : Hôte `raspi.4gb.home` (membre de `role_sbc`) **Action :** Cliquer sur "Playbook" pour cet hôte **Résultat :** - ✅ Affiche : `bootstrap-host`, `health-check`, `vm-upgrade`, `vm-reboot`, etc. (hosts: all) - ❌ N'affiche PAS : `backup-proxmox-config` (hosts: role_proxmox) ### Scénario 2 : Hôte `ali2v.xeon.home` (membre de `role_proxmox`) **Action :** Cliquer sur "Playbook" pour cet hôte **Résultat :** - ✅ Affiche : `backup-proxmox-config` (hosts: role_proxmox) - ✅ Affiche : `bootstrap-host`, `health-check`, etc. (hosts: all) ### Scénario 3 : Groupe `env_lab` **Action :** Cliquer sur "Playbook" pour ce groupe **Résultat :** - ✅ Affiche uniquement les playbooks compatibles avec `env_lab` - ❌ N'affiche PAS : `backup-proxmox-config` (hosts: role_proxmox) ### Scénario 4 : Groupe `role_proxmox` **Action :** Cliquer sur "Playbook" pour ce groupe **Résultat :** - ✅ Affiche : `backup-proxmox-config` (hosts: role_proxmox) - ✅ Affiche : tous les playbooks avec `hosts: all` --- ## Protection Supplémentaire (Backend) Même si l'interface filtre correctement, le backend valide également : ```javascript // Si l'utilisateur tente d'exécuter un playbook incompatible POST /api/ansible/execute { "playbook": "backup-proxmox-config.yml", "target": "raspi.4gb.home" } // Réponse : HTTP 400 { "detail": "Le playbook 'backup-proxmox-config.yml' (hosts: role_proxmox) n'est pas compatible avec la cible 'raspi.4gb.home'. Ce playbook ne peut être exécuté que sur: role_proxmox" } ``` --- ## Tests Recommandés ### Test 1 : Filtrage par Hôte 1. Sélectionner un hôte du groupe `role_sbc` (ex: `raspi.4gb.home`) 2. Cliquer sur "Playbook" 3. Vérifier que `backup-proxmox-config` n'apparaît PAS dans la liste ### Test 2 : Filtrage par Groupe 1. Sélectionner le groupe `env_lab` 2. Cliquer sur "Playbook" 3. Vérifier que seuls les playbooks compatibles sont affichés ### Test 3 : Hôte Proxmox 1. Sélectionner un hôte du groupe `role_proxmox` (ex: `ali2v.xeon.home`) 2. Cliquer sur "Playbook" 3. Vérifier que `backup-proxmox-config` APPARAÎT dans la liste ### Test 4 : Compteur de Playbooks 1. Vérifier que le message informatif affiche le bon nombre de playbooks disponibles 2. Comparer avec différents hôtes/groupes --- ## Compatibilité - ✅ Fonctionne avec tous les navigateurs modernes - ✅ Gestion d'erreur si l'API ne répond pas - ✅ Messages informatifs clairs pour l'utilisateur - ✅ Encodage URL correct pour les noms d'hôtes/groupes spéciaux --- ## Notes Techniques ### Encodage des Paramètres ```javascript encodeURIComponent(hostName) ``` Assure que les noms avec caractères spéciaux (points, tirets) sont correctement encodés dans l'URL. ### Gestion Asynchrone La fonction `executePlaybookOnGroup()` est maintenant `async` pour permettre l'appel API. JavaScript gère automatiquement les fonctions async dans les `onclick`. ### Compteur Dynamique ```javascript ${playbooks.length} disponible${playbooks.length > 1 ? 's' : ''} ``` Affiche "1 disponible" ou "X disponibles" selon le nombre. --- ## Fichiers Modifiés - ✅ `app/main.js` - Deux fonctions modifiées - `showPlaybookModalForHost()` - ligne ~1126 - `executePlaybookOnGroup()` - ligne ~1883 --- ## Prochaines Étapes (Optionnel) ### Amélioration 1 : Indicateur Visuel Ajouter un badge sur chaque playbook indiquant le champ `hosts` : ```html hosts: role_proxmox ``` ### Amélioration 2 : Tooltip Explicatif Ajouter un tooltip expliquant pourquoi certains playbooks ne sont pas disponibles : ```html
Ce playbook nécessite le groupe role_proxmox
``` ### Amélioration 3 : Statistiques Afficher dans l'interface : - Nombre total de playbooks - Nombre de playbooks compatibles avec la cible actuelle - Pourcentage de compatibilité --- ## Conclusion ✅ **Implémentation complète à 100%** Le filtrage des playbooks est maintenant entièrement fonctionnel : 1. ✅ Backend : API avec paramètre `?target=` 2. ✅ Frontend : Appels API modifiés 3. ✅ UX : Messages informatifs ajoutés 4. ✅ Validation : Protection backend en cas d'incompatibilité Les utilisateurs ne verront plus que les playbooks qu'ils peuvent réellement exécuter sur leurs hôtes/groupes sélectionnés.