Skip to content
Snippets Groups Projects
Commit 06f4fcdc authored by michael.minelli's avatar michael.minelli
Browse files

ExerciseDockerCompose => Add dangling image removing

parent e8b67ee2
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,7 @@ import { TypedEmitter } from 'tiny-typed-emitter';
import ExerciseRunningEvents from '../../types/Dojo/ExerciseRunningEvents';
import { spawn } from 'child_process';
import ExerciseCheckerError from '../../../shared/types/Dojo/ExerciseCheckerError';
import { ChildProcessWithoutNullStreams } from 'node:child_process';
class ExerciseDockerCompose {
......@@ -28,6 +29,20 @@ class ExerciseDockerCompose {
});
}
private registerChildProcess(childProcess: ChildProcessWithoutNullStreams, resolve: (value: (number | PromiseLike<number>)) => void, reject: (reason?: unknown) => void) {
childProcess.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, false);
});
childProcess.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, false);
});
childProcess.on('exit', (code) => {
code !== null ? resolve(code) : reject();
});
}
run(doDown: boolean = false) {
(async () => {
let containerExitCode: number = -1;
......@@ -52,17 +67,7 @@ class ExerciseDockerCompose {
}
});
dockerCompose.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, true);
});
dockerCompose.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, true);
});
dockerCompose.on('exit', (code) => {
code !== null ? resolve(code) : reject();
});
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_RUN', `Error while running the docker compose file`, true);
......@@ -77,7 +82,7 @@ class ExerciseDockerCompose {
try {
this.events.emit('step', 'COMPOSE_LOGS', 'Linked services logs acquisition');
await new Promise<void>((resolve, reject) => {
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Other Services Logs #######################################################\n', false, false);
......@@ -86,17 +91,7 @@ class ExerciseDockerCompose {
shell: true
});
dockerCompose.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, false);
});
dockerCompose.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, false);
});
dockerCompose.on('exit', (code) => {
code !== null ? resolve() : reject();
});
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_LOGS', `Error while getting the linked services logs`, true);
......@@ -112,33 +107,49 @@ class ExerciseDockerCompose {
try {
this.events.emit('step', 'COMPOSE_DOWN', 'Stopping and removing containers');
await new Promise<void>((resolve, reject) => {
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Stop and remove containers #######################################################\n', false, false);
const dockerCompose = spawn(`${ dockerComposeCommand } down --volumes`, {
const dockerCompose = spawn(`${ dockerComposeCommand } down --volumes --rmi`, {
cwd : this.executionFolder,
shell: true
});
dockerCompose.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, false);
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_DOWN', `Error stop and remove containers`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_DOWN_ERROR);
return;
}
this.events.emit('endStep', 'COMPOSE_DOWN', `Containers stopped and removed`, false);
}
}
dockerCompose.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, false);
});
// Remove images if asked
{
if ( doDown ) {
try {
this.events.emit('step', 'COMPOSE_REMOVE_DANGLING', 'Removing dangling images');
dockerCompose.on('exit', (code) => {
code !== null ? resolve() : reject();
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Remove dangling images #######################################################\n', false, false);
const dockerCompose = spawn(`docker image prune --force`, {
cwd : this.executionFolder,
shell: true
});
this.registerChildProcess(dockerCompose, resolve, reject);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_DOWN', `Error stop and remove containers`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_DOWN_ERROR);
this.events.emit('endStep', 'COMPOSE_REMOVE_DANGLING', `Error while removing dangling images`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_REMOVE_DANGLING_ERROR);
return;
}
this.events.emit('endStep', 'COMPOSE_DOWN', `Containers stopped and removed`, false);
this.events.emit('endStep', 'COMPOSE_REMOVE_DANGLING', `Dangling images removed`, false);
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment