UNPKG

app-wizard-cli

Version:

CLI pour gérer votre projet Nest/Angular

110 lines (109 loc) 5.07 kB
import fs from 'fs-extra'; import path from 'path'; import yaml from 'js-yaml'; /** * Service dédié à la vérification et correction des volumes dans le fichier Docker Compose. * Ce service gère le cas prod (où il faut s'assurer que le montage se fait via NFS et le driver adéquat) * et effectue un check factice en mode dev. */ export class DockerComposeVolumesService { /** * Retourne le nom du fichier docker-compose à utiliser selon l'environnement. * Pour prod, on attend par exemple "docker-compose.prod.yml". */ static getComposeFileName(env) { return env === 'prod' ? 'docker-compose.prod.yml' : 'docker-compose.dev.yml'; } /** * Charge et parse le fichier Docker Compose (YAML) de l'environnement spécifié. */ static async loadComposeFile(env) { const composeFileName = DockerComposeVolumesService.getComposeFileName(env); const composePath = path.join(process.cwd(), composeFileName); if (!(await fs.pathExists(composePath))) { throw new Error(`Fichier ${composeFileName} introuvable dans ${process.cwd()}`); } const fileContent = await fs.readFile(composePath, 'utf8'); return yaml.load(fileContent); } /** * Sauvegarde les modifications apportées aux fichiers Docker Compose. */ static async saveComposeFile(env, data) { const composeFileName = DockerComposeVolumesService.getComposeFileName(env); const composePath = path.join(process.cwd(), composeFileName); const yamlContent = yaml.dump(data); await fs.writeFile(composePath, yamlContent, 'utf8'); } /** * Calcule la configuration attendue d’un volume selon la configuration fournie par le provider. */ static computeExpectedVolumeDefinition(config) { let address; let exportPath; if (config.provider === 'google') { address = config.filestoreIp; exportPath = config.exportPath; } else { // Pour AWS address = config.efsDns; exportPath = config.exportPath || '/'; } return { driver: 'local', driver_opts: { type: 'nfs', o: `addr=${address},${config.mountOptions}`, device: `:${exportPath}` } }; } /** * Vérifie et corrige la configuration des volumes dans le fichier Docker Compose. * Si l'environnement est "dev", un simple message informatif est affiché (check factice). * Si l'environnement est "prod", la configuration des volumes est comparée à celle attendue et corrigée si nécessaire. * * @param env Environnement ('dev' ou 'prod'). * @param volumeConfig Configuration de montage pour le provider utilisé. */ static async verifyAndCorrectVolumes(env, volumeConfig) { if (env !== 'prod') { console.log("En environnement de développement, la vérification des volumes est factice. Aucun changement n'est appliqué."); return; } const composeData = await DockerComposeVolumesService.loadComposeFile(env); if (!composeData.volumes) { console.log("Aucune section 'volumes' trouvée dans le fichier docker-compose."); return; } const expected = DockerComposeVolumesService.computeExpectedVolumeDefinition(volumeConfig); let modified = false; for (const volumeName in composeData.volumes) { const currentDef = composeData.volumes[volumeName]; // Par défaut, le driver est considéré comme "local" s'il n'est pas défini. const currentDriver = currentDef.driver || 'local'; if (currentDriver !== expected.driver || !currentDef.driver_opts || currentDef.driver_opts.type !== expected.driver_opts.type || currentDef.driver_opts.o !== expected.driver_opts.o || currentDef.driver_opts.device !== expected.driver_opts.device) { console.log(`Mise à jour de la configuration du volume '${volumeName}':`); console.log(`- Driver actuel: ${currentDriver}, attendu: ${expected.driver}`); console.log(`- Options actuelles: ${JSON.stringify(currentDef.driver_opts)}, attendues: ${JSON.stringify(expected.driver_opts)}`); // On met à jour la configuration du volume. composeData.volumes[volumeName] = { driver: expected.driver, driver_opts: expected.driver_opts }; modified = true; } } if (modified) { await DockerComposeVolumesService.saveComposeFile(env, composeData); console.log("Le fichier docker-compose a été mis à jour avec la configuration correcte pour les volumes."); } else { console.log("Les volumes du fichier docker-compose sont déjà correctement configurés."); } } }