UNPKG

dockest

Version:

Dockest is an integration testing tool aimed at alleviating the process of evaluating unit tests whilst running multi-container Docker applications.

83 lines 3.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createLogWriter = void 0; const fs_1 = require("fs"); const path_1 = require("path"); const execa_1 = __importDefault(require("execa")); /* eslint-disable-line import/default */ const constants_1 = require("../constants"); const errors_1 = require("../errors"); const logger_1 = require("../logger"); const DEFAULT_LOG_SYMBOL = Symbol('DEFAULT_LOG'); const createLogWriter = ({ mode, logPath, serviceNameFilter, }) => { const writeStreamMap = new Map(); if (mode.includes('aggregate')) { const writeStream = (0, fs_1.createWriteStream)((0, path_1.join)(logPath, `dockest.log`)); writeStreamMap.set(DEFAULT_LOG_SYMBOL, writeStream); } const getDefaultWriteStream = () => { const stream = writeStreamMap.get(DEFAULT_LOG_SYMBOL); if (!stream) { throw new errors_1.DockestError('Could not find default log stream.'); } return stream; }; const createOrGetFileStream = (serviceName) => { let stream = writeStreamMap.get(serviceName); if (!stream) { stream = (0, fs_1.createWriteStream)((0, path_1.join)(logPath, `${serviceName}.dockest.log`)); writeStreamMap.set(serviceName, stream); stream.on('error', (error) => { throw new errors_1.DockestError('Unexpected error thrown for stream\n\n.' + String(error), { error }); }); } return stream; }; const getWriteStream = (serviceName) => { return createOrGetFileStream(serviceName); }; const register = (serviceName, containerId) => { if (serviceNameFilter && serviceNameFilter.includes(serviceName) === false) { logger_1.Logger.debug(`Skip log collection for service ${serviceName} with containerId: ${containerId}.`); return; } logger_1.Logger.debug(`Registering log collection for ${serviceName} with containerId: ${containerId}`); const logCollectionProcess = (0, execa_1.default)(`docker-compose`, [ '-f', constants_1.GENERATED_COMPOSE_FILE_PATH, 'logs', '-f', '--no-color', serviceName, ]); if (!logCollectionProcess.stdout) { throw new errors_1.DockestError('Process has no stdout.'); } if (mode.includes('pipe-stdout')) { logCollectionProcess.stdout.pipe(process.stdout, { end: false }); } if (mode.includes('per-service')) { const writeStream = getWriteStream(serviceName); logCollectionProcess.stdout.pipe(writeStream, { end: false }); } if (mode.includes('aggregate')) { const writeStream = getDefaultWriteStream(); logCollectionProcess.stdout.pipe(writeStream, { end: false }); } // execa returns a lazy promise. logCollectionProcess.then(() => undefined); }; const destroy = async () => { for (const stream of writeStreamMap.values()) { stream.end(); } }; return { register, destroy, }; }; exports.createLogWriter = createLogWriter; //# sourceMappingURL=log-writer.js.map