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
JavaScript
;
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