From b6d8846f3a922c7ea4461f08b6cde32bdb27c380 Mon Sep 17 00:00:00 2001 From: Thorarinn Sigurdsson Date: Mon, 8 Jul 2019 14:32:33 +0200 Subject: [PATCH] fix(task-gtaph): emit taskCancelled events Emit taskCancelled events when dependants of failed tasks are cancelled. This is a new event type. --- garden-service/src/events.ts | 6 ++++ garden-service/src/task-graph.ts | 7 +++++ garden-service/test/unit/src/task-graph.ts | 34 ++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/garden-service/src/events.ts b/garden-service/src/events.ts index 6122515b69..698344650d 100644 --- a/garden-service/src/events.ts +++ b/garden-service/src/events.ts @@ -84,6 +84,12 @@ export interface Events { key: string, version: ModuleVersion, }, + taskCancelled: { + cancelledAt: Date, + type: string + key: string, + name: string, + }, taskComplete: TaskResult, taskError: TaskResult, taskGraphProcessing: { diff --git a/garden-service/src/task-graph.ts b/garden-service/src/task-graph.ts index 2a27c3dd41..569ea614ee 100644 --- a/garden-service/src/task-graph.ts +++ b/garden-service/src/task-graph.ts @@ -283,8 +283,15 @@ export class TaskGraph { // Recursively remove node's dependants, without removing node. private cancelDependants(node: TaskNode) { + const cancelledAt = new Date() for (const dependant of this.getDependants(node)) { this.logTaskComplete(dependant, false) + this.garden.events.emit("taskCancelled", { + cancelledAt, + key: dependant.getKey(), + name: dependant.task.getName(), + type: dependant.getType(), + }) this.remove(dependant) } this.rebuild() diff --git a/garden-service/test/unit/src/task-graph.ts b/garden-service/test/unit/src/task-graph.ts index 3680c81f77..eeaf45832e 100644 --- a/garden-service/test/unit/src/task-graph.ts +++ b/garden-service/test/unit/src/task-graph.ts @@ -5,6 +5,7 @@ import { BaseTask, TaskType } from "../../../src/tasks/base" import { TaskGraph, TaskResult, TaskResults } from "../../../src/task-graph" import { makeTestGarden, freezeTime, dataDir, defer } from "../../helpers" import { Garden } from "../../../src/garden" +import { deepFilter } from "../../../src/util/util" const projectRoot = join(dataDir, "test-project-empty") @@ -18,6 +19,12 @@ interface TestTaskOptions { throwError?: boolean } +const testTaskVersion = { + versionString: "12345-6789", + dependencyVersions: {}, + files: [], +} + class TestTask extends BaseTask { type: TaskType = "test" name: string @@ -381,9 +388,36 @@ describe("task-graph", () => { dependencyResults: {}, } + const filteredKeys: Set = new Set([ + "version", "error", "addedAt", "startedAt", "cancelledAt", "completedAt"]) + + const filteredEventLog = garden.events.eventLog.map(e => { + return deepFilter(e, (_, key) => !filteredKeys.has(key)) + }) + expect(results.a).to.eql(resultA) expect(results.b).to.have.property("error") expect(resultOrder).to.eql(["a", "b"]) + expect(filteredEventLog).to.eql([ + { name: "taskPending", payload: { key: "a" } }, + { name: "taskPending", payload: { key: "b" } }, + { name: "taskPending", payload: { key: "c" } }, + { name: "taskPending", payload: { key: "d" } }, + { name: "taskGraphProcessing", payload: {} }, + { name: "taskProcessing", payload: { key: "a" } }, + { + name: "taskComplete", payload: { + dependencyResults: {}, description: "a", key: "a", name: "a", + output: { dependencyResults: {}, result: "result-a" }, type: "test", + }, + }, + { name: "taskProcessing", payload: { key: "b" } }, + { name: "taskError", payload: { description: "b", key: "b", name: "b", type: "test" } }, + { name: "taskCancelled", payload: { key: "c", name: "c", type: "test" } }, + { name: "taskCancelled", payload: { key: "d", name: "d", type: "test" } }, + { name: "taskCancelled", payload: { key: "d", name: "d", type: "test" } }, + { name: "taskGraphComplete", payload: {} }, + ]) }) })