Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
Loading items

Target

Select target project
  • dojo_project/projects/shared/nodeclientsharedcode
1 result
Select Git revision
Loading items
Show changes
Commits on Source (1)
......@@ -16,6 +16,8 @@ class ExerciseDockerCompose {
public success: boolean = false;
public exitCode: number = -1;
private currentStep: string = 'NOT_RUNNING';
constructor(private projectName: string, private assignmentFile: AssignmentFile, private executionFolder: string, private composeFileOverride: Array<string> = []) {
this.events.on('logs', (log: string, _error: boolean, displayable: boolean) => {
this.allLogs += log;
......@@ -29,13 +31,26 @@ class ExerciseDockerCompose {
});
}
private registerChildProcess(childProcess: ChildProcessWithoutNullStreams, resolve: (value: (number | PromiseLike<number>)) => void, reject: (reason?: unknown) => void) {
private newStep(name: string, message: string) {
this.currentStep = name;
this.events.emit('step', name, message);
}
private endStep(message: string, error: boolean) {
this.events.emit('endStep', this.currentStep, message, error);
}
private log(message: string, error: boolean, displayable: boolean) {
this.events.emit('logs', message, error, displayable, this.currentStep);
}
private registerChildProcess(childProcess: ChildProcessWithoutNullStreams, resolve: (value: (number | PromiseLike<number>)) => void, reject: (reason?: unknown) => void, displayable: boolean) {
childProcess.stdout.on('data', (data) => {
this.events.emit('logs', data.toString(), false, false);
this.log(data.toString(), false, displayable);
});
childProcess.stderr.on('data', (data) => {
this.events.emit('logs', data.toString(), true, false);
this.log(data.toString(), true, displayable);
});
childProcess.on('exit', (code) => {
......@@ -52,11 +67,11 @@ class ExerciseDockerCompose {
// Run the service
{
try {
this.events.emit('step', 'COMPOSE_RUN', 'Running Docker Compose file');
this.newStep('COMPOSE_RUN', 'Running Docker Compose file');
containerExitCode = await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Docker Compose & Main Container Logs #######################################################\n', false, false);
this.log('####################################################### Docker Compose & Main Container Logs #######################################################\n', false, false);
const dockerCompose = spawn(`${ dockerComposeCommand } run --build --rm ${ this.assignmentFile.result.container }`, {
cwd : this.executionFolder,
......@@ -67,63 +82,63 @@ class ExerciseDockerCompose {
}
});
this.registerChildProcess(dockerCompose, resolve, reject);
this.registerChildProcess(dockerCompose, resolve, reject, true);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_RUN', `Error while running the docker compose file`, true);
this.endStep(`Error while running the docker compose file`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_RUN_ERROR);
return;
}
this.events.emit('endStep', 'COMPOSE_RUN', `Docker Compose file run successfully`, false);
this.endStep(`Docker Compose file run successfully`, false);
}
// Get linked services logs
{
try {
this.events.emit('step', 'COMPOSE_LOGS', 'Linked services logs acquisition');
this.newStep('COMPOSE_LOGS', 'Linked services logs acquisition');
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Other Services Logs #######################################################\n', false, false);
this.log('####################################################### Other Services Logs #######################################################\n', false, false);
const dockerCompose = spawn(`${ dockerComposeCommand } logs --timestamps`, {
cwd : this.executionFolder,
shell: true
});
this.registerChildProcess(dockerCompose, resolve, reject);
this.registerChildProcess(dockerCompose, resolve, reject, false);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_LOGS', `Error while getting the linked services logs`, true);
this.endStep(`Error while getting the linked services logs`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_LOGS_ERROR);
return;
}
this.events.emit('endStep', 'COMPOSE_LOGS', `Linked services logs acquired`, false);
this.endStep(`Linked services logs acquired`, false);
}
// Remove containers if asked
{
if ( doDown ) {
try {
this.events.emit('step', 'COMPOSE_DOWN', 'Stopping and removing containers');
this.newStep('COMPOSE_DOWN', 'Stopping and removing containers');
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Stop and remove containers #######################################################\n', false, false);
this.log('####################################################### Stop and remove containers #######################################################\n', false, false);
const dockerCompose = spawn(`${ dockerComposeCommand } down --volumes --rmi`, {
cwd : this.executionFolder,
shell: true
});
this.registerChildProcess(dockerCompose, resolve, reject);
this.registerChildProcess(dockerCompose, resolve, reject, false);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_DOWN', `Error stop and remove containers`, true);
this.endStep(`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);
this.events.emit('endStep', this.currentStep, `Containers stopped and removed`, false);
}
}
......@@ -131,25 +146,25 @@ class ExerciseDockerCompose {
{
if ( doDown ) {
try {
this.events.emit('step', 'COMPOSE_REMOVE_DANGLING', 'Removing dangling images');
this.newStep('COMPOSE_REMOVE_DANGLING', 'Removing dangling images');
await new Promise<number>((resolve, reject) => {
this.events.emit('logs', '####################################################### Remove dangling images #######################################################\n', false, false);
this.log('####################################################### Remove dangling images #######################################################\n', false, false);
const dockerCompose = spawn(`docker image prune --force`, {
cwd : this.executionFolder,
shell: true
});
this.registerChildProcess(dockerCompose, resolve, reject);
this.registerChildProcess(dockerCompose, resolve, reject, false);
});
} catch ( error ) {
this.events.emit('endStep', 'COMPOSE_REMOVE_DANGLING', `Error while removing dangling images`, true);
this.endStep(`Error while removing dangling images`, true);
this.events.emit('finished', false, ExerciseCheckerError.DOCKER_COMPOSE_REMOVE_DANGLING_ERROR);
return;
}
this.events.emit('endStep', 'COMPOSE_REMOVE_DANGLING', `Dangling images removed`, false);
this.events.emit('endStep', this.currentStep, `Dangling images removed`, false);
}
}
......
interface ExerciseRunningEvents {
step: (name: string, message: string) => void;
endStep: (stepName: string, message: string, error: boolean) => void;
logs: (log: string, error: boolean, displayable: boolean) => void;
logs: (log: string, error: boolean, displayable: boolean, currentStep: string) => void;
finished: (success: boolean, exitCode: number) => void;
}
......