@zukhruf/testing 0.3.35 → 0.3.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docker/docker.d.ts +5 -1
- package/dist/docker/docker.d.ts.map +1 -1
- package/dist/docker/docker.js +6 -1
- package/dist/docker/docker.js.map +1 -1
- package/dist/docker/test-run.d.ts +13 -0
- package/dist/docker/test-run.d.ts.map +1 -1
- package/dist/docker/test-run.js +25 -0
- package/dist/docker/test-run.js.map +1 -1
- package/dist/scripts/docker-cleanup-worker.d.ts +21 -0
- package/dist/scripts/docker-cleanup-worker.d.ts.map +1 -0
- package/dist/scripts/docker-cleanup-worker.js +31 -0
- package/dist/scripts/docker-cleanup-worker.js.map +1 -0
- package/dist/scripts/docker-global-setup.d.ts +1 -1
- package/dist/scripts/docker-global-setup.d.ts.map +1 -1
- package/dist/scripts/docker-global-setup.js +88 -128
- package/dist/scripts/docker-global-setup.js.map +1 -1
- package/dist/scripts/run-cleanup.d.ts +17 -0
- package/dist/scripts/run-cleanup.d.ts.map +1 -0
- package/dist/scripts/run-cleanup.js +75 -0
- package/dist/scripts/run-cleanup.js.map +1 -0
- package/package.json +2 -1
package/dist/docker/docker.d.ts
CHANGED
|
@@ -41,7 +41,11 @@ export interface DockerOptions {
|
|
|
41
41
|
export declare class Docker {
|
|
42
42
|
#private;
|
|
43
43
|
constructor({ testRun }?: DockerOptions);
|
|
44
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Defaults for disposable test containers, including external launchers.
|
|
46
|
+
* A launcher creates with these labels and no acquisition of this class:
|
|
47
|
+
* the read records this process, so the global teardown sweeps the run.
|
|
48
|
+
*/
|
|
45
49
|
get defaults(): {
|
|
46
50
|
resources: {
|
|
47
51
|
memory: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/docker/docker.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,SAAS,EACT,KAAK,aAAa,EAClB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,+BAA+B,CAAC;AAGhE,yEAAyE;AACzE,MAAM,WAAW,KAAK;IACpB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,wGAAwG;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,OAAO,CAAC;CACpD;AAED,MAAM,WAAW,aAAa;IAC5B,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AA2BD,sHAAsH;AACtH,qBAAa,MAAM;;gBAcL,EAAE,OAAO,EAAE,GAAE,aAAkB;IAI3C
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/docker/docker.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,SAAS,EACT,KAAK,aAAa,EAClB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,+BAA+B,CAAC;AAGhE,yEAAyE;AACzE,MAAM,WAAW,KAAK;IACpB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,wGAAwG;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,OAAO,CAAC;CACpD;AAED,MAAM,WAAW,aAAa;IAC5B,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AA2BD,sHAAsH;AACtH,qBAAa,MAAM;;gBAcL,EAAE,OAAO,EAAE,GAAE,aAAkB;IAI3C;;;;OAIG;IACH,IAAI,QAAQ,IAAI;QACd,SAAS,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAMA;IAEK,IAAI,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAU3D,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAI3C,uFAAuF;IACjF,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAYrC,QAAQ,CAAC,OAAO,EAAE,aAAa,CACY;IAErC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAarC,gGAAgG;IAC1F,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAK1D,gGAAgG;IAC1F,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAe/D;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqB/D,2GAA2G;IACrG,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;CA6KtD"}
|
package/dist/docker/docker.js
CHANGED
|
@@ -42,8 +42,13 @@ export class Docker {
|
|
|
42
42
|
constructor({ testRun } = {}) {
|
|
43
43
|
this.#testRun = testRun;
|
|
44
44
|
}
|
|
45
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Defaults for disposable test containers, including external launchers.
|
|
47
|
+
* A launcher creates with these labels and no acquisition of this class:
|
|
48
|
+
* the read records this process, so the global teardown sweeps the run.
|
|
49
|
+
*/
|
|
46
50
|
get defaults() {
|
|
51
|
+
this.#testRun?.recordThisProcess();
|
|
47
52
|
return {
|
|
48
53
|
resources: { memory: '1g', cpus: 1 },
|
|
49
54
|
labels: this.#testRun?.labels ?? {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/docker/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,SAAS,EAET,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sEAAsE;AACtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAChE,MAAM,YAAY,GAAG,4BAA4B,CAAC;AA+ClD,MAAM,SAAS,GAAG,CAAC,MAA8B,EAAY,EAAE,CAC7D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;IAC/C,SAAS;IACT,GAAG,GAAG,IAAI,KAAK,EAAE;CAClB,CAAC,CAAC;AAEL,MAAM,OAAO,GAAG,CAAC,YAAoB,EAAY,EAAE,CAAC;IAClD,IAAI;IACJ,cAAc,YAAY,EAAE;CAC7B,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAmB,EAAE,CAAC,CAAC,CAAmB,EAAU,EAAE;IACrE,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,sHAAsH;AACtH,MAAM,OAAO,MAAM;IACR,QAAQ,CAAsB;IACvC,0EAA0E;IAC1E,uEAAuE;IAC9D,WAAW,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,QAAQ,CAAC,KAAK,IAAoB,EAAE;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,YAAY,EAAE,OAAO,KAAoB,EAAE;QACzC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/docker/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,19 @@ export declare class TestRun {
|
|
|
27
27
|
* a reused pid from deleting the record of the next command that has it.
|
|
28
28
|
*/
|
|
29
29
|
recordProcess(pid: number): Promise<AsyncDisposable>;
|
|
30
|
+
/**
|
|
31
|
+
* Writes a process record for this process, one time for each run. It is
|
|
32
|
+
* synchronous, so a getter can call it before it gives the run's labels to
|
|
33
|
+
* another Docker client.
|
|
34
|
+
*/
|
|
35
|
+
recordThisProcess(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Writes a creating record while this process asks the engine to create a
|
|
38
|
+
* container. The engine can finish a create after the process that sent it
|
|
39
|
+
* died. While a creating record remains, the global teardown keeps the
|
|
40
|
+
* run's records, and the recovery of a later run sweeps the run again.
|
|
41
|
+
*/
|
|
42
|
+
recordCreating(): Promise<AsyncDisposable>;
|
|
30
43
|
/**
|
|
31
44
|
* Records a path that the global teardown removes if this process dies first.
|
|
32
45
|
* Disposing the record forgets the path once the process removed it itself.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-run.d.ts","sourceRoot":"","sources":["../../src/docker/test-run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-run.d.ts","sourceRoot":"","sources":["../../src/docker/test-run.ts"],"names":[],"mappings":"AAKA,0EAA0E;AAC1E,eAAO,MAAM,WAAW,2BAA2B,CAAC;AACpD,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAC5D,4EAA4E;AAC5E,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAKxD;;;;;GAKG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAKzC;;;OAGG;IACH,MAAM,CAAC,eAAe,CACpB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GACxD,OAAO,GAAG,SAAS;IAWtB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEnC;IAED;;;;;OAKG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAM1D;;;;OAIG;IACH,iBAAiB,IAAI,IAAI;IASzB;;;;;OAKG;IACG,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC;IAMhD;;;OAGG;IACG,MAAM,CACV,IAAI,EAAE,SAAS,GAAG,WAAW,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,CAAC;CAK5B;AAED,6EAA6E;AAC7E,eAAO,MAAM,eAAe,GAAI,KAAK,OAAO,GAAG,SAAS,KAAG,MACZ,CAAC;AAEhD,2EAA2E;AAC3E,eAAO,MAAM,aAAa,GAAI,KAAK,OAAO,GAAG,SAAS,KAAG,MACG,CAAC"}
|
package/dist/docker/test-run.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { writeFileSync } from 'node:fs';
|
|
2
3
|
import { rm, writeFile } from 'node:fs/promises';
|
|
3
4
|
import { join } from 'node:path';
|
|
4
5
|
/** Set by the global setup for the run's test processes: the run's id. */
|
|
@@ -7,6 +8,8 @@ export const TEST_RUN_ID = 'ZUKHRUF_TESTING_RUN_ID';
|
|
|
7
8
|
export const TEST_RUN_DIRECTORY = 'ZUKHRUF_TESTING_RUN_DIR';
|
|
8
9
|
/** The label that ties a container or volume to the run that created it. */
|
|
9
10
|
export const TEST_RUN_LABEL = 'dev.zukhruf.testing.run';
|
|
11
|
+
/** The run directories that hold a process record of this process. */
|
|
12
|
+
const recordedRuns = new Set();
|
|
10
13
|
/**
|
|
11
14
|
* One `node --test` invocation with the Docker global setup. What its test
|
|
12
15
|
* processes create carries the run's label or a record in the run's
|
|
@@ -47,6 +50,28 @@ export class TestRun {
|
|
|
47
50
|
await writeFile(file, JSON.stringify({ pid }));
|
|
48
51
|
return { [Symbol.asyncDispose]: () => rm(file, { force: true }) };
|
|
49
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Writes a process record for this process, one time for each run. It is
|
|
55
|
+
* synchronous, so a getter can call it before it gives the run's labels to
|
|
56
|
+
* another Docker client.
|
|
57
|
+
*/
|
|
58
|
+
recordThisProcess() {
|
|
59
|
+
if (recordedRuns.has(this.directory))
|
|
60
|
+
return;
|
|
61
|
+
writeFileSync(join(this.directory, `process-${process.pid}-${randomUUID()}.json`), JSON.stringify({ pid: process.pid }));
|
|
62
|
+
recordedRuns.add(this.directory);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Writes a creating record while this process asks the engine to create a
|
|
66
|
+
* container. The engine can finish a create after the process that sent it
|
|
67
|
+
* died. While a creating record remains, the global teardown keeps the
|
|
68
|
+
* run's records, and the recovery of a later run sweeps the run again.
|
|
69
|
+
*/
|
|
70
|
+
async recordCreating() {
|
|
71
|
+
const file = join(this.directory, `creating-${randomUUID()}.json`);
|
|
72
|
+
await writeFile(file, JSON.stringify({ pid: process.pid }));
|
|
73
|
+
return { [Symbol.asyncDispose]: () => rm(file, { force: true }) };
|
|
74
|
+
}
|
|
50
75
|
/**
|
|
51
76
|
* Records a path that the global teardown removes if this process dies first.
|
|
52
77
|
* Disposing the record forgets the path once the process removed it itself.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-run.js","sourceRoot":"","sources":["../../src/docker/test-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAG,wBAAwB,CAAC;AACpD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAC5D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,yBAAyB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IACT,EAAE,CAAS;IACX,SAAS,CAAS;IAE3B,YAAY,EAAU,EAAE,SAAiB;QACvC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,eAAe,CACpB,WAAyD;QAEzD,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAClD,IAAI,EAAE,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAClE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS;YACnB,MAAM,IAAI,KAAK,CACb,yBAAyB,WAAW,QAAQ,kBAAkB,wCAAwC,CACvG,CAAC;QACJ,OAAO,IAAI,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,UAAU,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,IAA6B,EAC7B,IAAY;QAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,UAAU,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpE,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAwB,EAAU,EAAE,CAClE,mBAAmB,GAAG,EAAE,EAAE,IAAI,YAAY,GAAG,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAwB,EAAU,EAAE,CAChE,gCAAgC,GAAG,EAAE,EAAE,IAAI,YAAY,GAAG,CAAC"}
|
|
1
|
+
{"version":3,"file":"test-run.js","sourceRoot":"","sources":["../../src/docker/test-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type MessagePort } from 'node:worker_threads';
|
|
2
|
+
import type { Run } from './run-cleanup.ts';
|
|
3
|
+
/** What the teardown passes to this worker. */
|
|
4
|
+
export interface CleanupWork {
|
|
5
|
+
run: Run;
|
|
6
|
+
directory: string;
|
|
7
|
+
port: MessagePort;
|
|
8
|
+
/** One Int32 that this worker sets to 1 after it posted its outcome. */
|
|
9
|
+
signal: SharedArrayBuffer;
|
|
10
|
+
}
|
|
11
|
+
/** What this worker posts: errors as plain fields, which a port can carry. */
|
|
12
|
+
export type CleanupOutcome = {
|
|
13
|
+
ok: true;
|
|
14
|
+
} | {
|
|
15
|
+
error: {
|
|
16
|
+
name: string;
|
|
17
|
+
message: string;
|
|
18
|
+
detail: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=docker-cleanup-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-cleanup-worker.d.ts","sourceRoot":"","sources":["../../src/scripts/docker-cleanup-worker.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE5C,+CAA+C;AAC/C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GACxB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The worker of the global teardown. The teardown must be synchronous, and
|
|
3
|
+
* the Engine API client is asynchronous, so the teardown starts this worker
|
|
4
|
+
* and waits on `signal` until it posts its outcome on `port`.
|
|
5
|
+
*/
|
|
6
|
+
import { inspect } from 'node:util';
|
|
7
|
+
import { workerData } from 'node:worker_threads';
|
|
8
|
+
const { run, directory, port, signal } = workerData;
|
|
9
|
+
async function sweep() {
|
|
10
|
+
try {
|
|
11
|
+
// Imported here, so that a module that fails to load is an outcome too:
|
|
12
|
+
// the teardown would otherwise wait until its timeout.
|
|
13
|
+
const { connectAndCleanup } = await import("./run-cleanup.js");
|
|
14
|
+
await connectAndCleanup(run, directory);
|
|
15
|
+
return { ok: true };
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return {
|
|
19
|
+
error: {
|
|
20
|
+
name: error instanceof Error ? error.name : 'Error',
|
|
21
|
+
message: error instanceof Error ? error.message : String(error),
|
|
22
|
+
detail: inspect(error),
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
port.postMessage(await sweep());
|
|
28
|
+
const flag = new Int32Array(signal);
|
|
29
|
+
Atomics.store(flag, 0, 1);
|
|
30
|
+
Atomics.notify(flag, 0);
|
|
31
|
+
//# sourceMappingURL=docker-cleanup-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-cleanup-worker.js","sourceRoot":"","sources":["../../src/scripts/docker-cleanup-worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAiBnE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAgB,UAAU,CAAC;AAEjE,KAAK,UAAU,KAAK;IAClB,IAAI,CAAC;QACH,wEAAwE;QACxE,uDAAuD;QACvD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;gBACnD,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;aACvB;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;AAChC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AACpC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare function globalSetup(): Promise<void>;
|
|
2
|
-
/** Synchronous
|
|
2
|
+
/** Synchronous: see cleanupInWorker. */
|
|
3
3
|
export declare function globalTeardown(): void;
|
|
4
4
|
//# sourceMappingURL=docker-global-setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-global-setup.d.ts","sourceRoot":"","sources":["../../src/scripts/docker-global-setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"docker-global-setup.d.ts","sourceRoot":"","sources":["../../src/scripts/docker-global-setup.ts"],"names":[],"mappings":"AA6KA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BjD;AAED,wCAAwC;AACxC,wBAAgB,cAAc,IAAI,IAAI,CA0BrC"}
|
|
@@ -6,18 +6,20 @@
|
|
|
6
6
|
* A run that was killed before it could is removed by a later run on the same
|
|
7
7
|
* engine, from any project of this user.
|
|
8
8
|
*/
|
|
9
|
-
import { execFileSync } from 'node:child_process';
|
|
10
9
|
import { randomUUID } from 'node:crypto';
|
|
11
|
-
import { readFileSync, readdirSync, rmSync } from 'node:fs';
|
|
10
|
+
import { existsSync, readFileSync, readdirSync, rmSync } from 'node:fs';
|
|
12
11
|
import { mkdir, readFile, readdir, rename, writeFile } from 'node:fs/promises';
|
|
13
12
|
import { homedir } from 'node:os';
|
|
14
|
-
import { join } from 'node:path';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
13
|
+
import { extname, join } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { MessageChannel, Worker, receiveMessageOnPort, } from 'node:worker_threads';
|
|
16
|
+
import { Docker } from '@zukhruf/docker';
|
|
17
|
+
import { DockerHost } from "../docker/host.js";
|
|
18
|
+
import { TEST_RUN_DIRECTORY, TEST_RUN_ID, TestRun, } from "../docker/test-run.js";
|
|
19
|
+
import { ENGINE_CALL_TIMEOUT, cleanup } from "./run-cleanup.js";
|
|
20
|
+
/** How long the global teardown waits for its cleanup worker. */
|
|
21
|
+
const CLEANUP_TIMEOUT = 250_000;
|
|
18
22
|
const codeOf = (error) => error instanceof Error && 'code' in error ? error.code : undefined;
|
|
19
|
-
/** What a failed execFileSync call printed: its error carries the output it captured. */
|
|
20
|
-
const stderrOf = (error) => error instanceof Error && 'stderr' in error ? String(error.stderr) : '';
|
|
21
23
|
function alive(pid) {
|
|
22
24
|
try {
|
|
23
25
|
process.kill(pid, 0);
|
|
@@ -27,108 +29,58 @@ function alive(pid) {
|
|
|
27
29
|
return codeOf(error) !== 'ESRCH';
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const { path } = JSON.parse(readFileSync(file, 'utf8'));
|
|
41
|
-
return path;
|
|
42
|
-
}
|
|
43
|
-
/** The pids in the run's process records. */
|
|
44
|
-
function recordedProcesses(directory) {
|
|
45
|
-
return readdirSync(directory).flatMap((file) => {
|
|
46
|
-
const pid = /^process-(\d+)-[\da-f-]{36}\.json$/.exec(file)?.[1];
|
|
47
|
-
return pid === undefined ? [] : [Number(pid)];
|
|
48
|
-
});
|
|
32
|
+
/** The records in a run's directory that make its cleanup necessary. */
|
|
33
|
+
function records(directory) {
|
|
34
|
+
const files = readdirSync(directory);
|
|
35
|
+
return {
|
|
36
|
+
processes: files.flatMap((file) => {
|
|
37
|
+
const pid = /^process-(\d+)-[\da-f-]{36}\.json$/.exec(file)?.[1];
|
|
38
|
+
return pid === undefined ? [] : [Number(pid)];
|
|
39
|
+
}),
|
|
40
|
+
creating: files.filter((file) => file.startsWith('creating-')).length,
|
|
41
|
+
};
|
|
49
42
|
}
|
|
50
43
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* teardown before it exits (internal/test_runner/test, `harness.teardown()`
|
|
54
|
-
* and then `process.exit()`).
|
|
44
|
+
* The cleanup worker, next to this module: `.ts` when Node runs the source,
|
|
45
|
+
* `.js` when it runs the build.
|
|
55
46
|
*/
|
|
56
|
-
function
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}).trim();
|
|
63
|
-
const owner = new TestRun(run.id, directory);
|
|
64
|
-
// Labels are attached atomically at creation. Never prune a daemon, remove
|
|
65
|
-
// shared servers, or trust names alone as proof of ownership.
|
|
66
|
-
const filter = ['--filter', `label=${TEST_RUN_LABEL}=${run.id}`];
|
|
67
|
-
for (const id of docker(['ps', '-aq', ...filter])
|
|
68
|
-
.split('\n')
|
|
69
|
-
.filter(Boolean)) {
|
|
70
|
-
try {
|
|
71
|
-
const shared = docker([
|
|
72
|
-
'inspect',
|
|
73
|
-
'--format',
|
|
74
|
-
`{{index .Config.Labels "${SHARED_SERVER_LABEL}"}}`,
|
|
75
|
-
id,
|
|
76
|
-
]);
|
|
77
|
-
if (shared !== '1')
|
|
78
|
-
remove(docker, id);
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
unlessMissing(/No such (object|container)/i, error);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
for (const name of docker(['volume', 'ls', '-q', ...filter])
|
|
85
|
-
.split('\n')
|
|
86
|
-
.filter(Boolean)) {
|
|
87
|
-
try {
|
|
88
|
-
docker(['volume', 'rm', name]);
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
unlessMissing(/no such volume|volume \S+ not found/i, error);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
for (const file of readdirSync(directory)) {
|
|
95
|
-
if (file.startsWith('forward-')) {
|
|
96
|
-
const path = readRecordedPath(join(directory, file));
|
|
97
|
-
if (!path.startsWith(forwardPrefix(owner)) || path.slice(5).includes('/'))
|
|
98
|
-
throw new Error(`Invalid SSH forwarding cleanup record: ${path}`);
|
|
99
|
-
rmSync(path, { recursive: true, force: true });
|
|
100
|
-
}
|
|
101
|
-
else if (file.startsWith('directory-')) {
|
|
102
|
-
const path = readRecordedPath(join(directory, file));
|
|
103
|
-
if (!path.includes(`/${directoryPrefix(owner)}`) || path.includes('/../'))
|
|
104
|
-
throw new Error(`Invalid fixture cleanup record: ${path}`);
|
|
105
|
-
if (host.remote)
|
|
106
|
-
execFileSync('ssh', [...host.sshArgs(), `rm -rf -- ${quote(path)}`], {
|
|
107
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
108
|
-
timeout: SHELL_TIMEOUT,
|
|
109
|
-
});
|
|
110
|
-
else
|
|
111
|
-
rmSync(path, { recursive: true, force: true });
|
|
112
|
-
}
|
|
113
|
-
}
|
|
47
|
+
function cleanupWorker() {
|
|
48
|
+
const extension = extname(fileURLToPath(import.meta.url));
|
|
49
|
+
const url = new URL(`./docker-cleanup-worker${extension}`, import.meta.url);
|
|
50
|
+
if (!existsSync(url))
|
|
51
|
+
throw new Error(`The Docker cleanup worker is missing: ${fileURLToPath(url)}`);
|
|
52
|
+
return url;
|
|
114
53
|
}
|
|
115
54
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
55
|
+
* Runs the cleanup in a worker and blocks until it ends. Under
|
|
56
|
+
* `--test-force-exit`, Node does not await the global teardown before it
|
|
57
|
+
* exits (internal/test_runner/test, `harness.teardown()` and then
|
|
58
|
+
* `process.exit()`), so the teardown cannot return to the event loop.
|
|
118
59
|
*/
|
|
119
|
-
function
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
60
|
+
function cleanupInWorker(run, directory) {
|
|
61
|
+
const url = cleanupWorker();
|
|
62
|
+
const signal = new SharedArrayBuffer(4);
|
|
63
|
+
const { port1, port2 } = new MessageChannel();
|
|
64
|
+
const work = { run, directory, port: port2, signal };
|
|
65
|
+
const worker = new Worker(url, {
|
|
66
|
+
execArgv: [],
|
|
67
|
+
workerData: work,
|
|
68
|
+
transferList: [port2],
|
|
69
|
+
});
|
|
70
|
+
worker.unref();
|
|
71
|
+
const waited = Atomics.wait(new Int32Array(signal), 0, 0, CLEANUP_TIMEOUT);
|
|
72
|
+
const received = receiveMessageOnPort(port1);
|
|
73
|
+
port1.close();
|
|
74
|
+
if (waited === 'timed-out' || received === undefined) {
|
|
75
|
+
void worker.terminate();
|
|
76
|
+
throw new Error(`The Docker cleanup did not finish within ${CLEANUP_TIMEOUT / 1000} s`);
|
|
77
|
+
}
|
|
78
|
+
const outcome = received.message;
|
|
79
|
+
if ('error' in outcome) {
|
|
80
|
+
const error = new Error(outcome.error.message);
|
|
81
|
+
error.name = outcome.error.name;
|
|
82
|
+
error.stack = outcome.error.detail;
|
|
83
|
+
throw error;
|
|
132
84
|
}
|
|
133
85
|
}
|
|
134
86
|
async function readRun(directory) {
|
|
@@ -141,7 +93,14 @@ async function readRun(directory) {
|
|
|
141
93
|
}
|
|
142
94
|
}
|
|
143
95
|
/** Removes what dead runs on this engine left behind. */
|
|
144
|
-
async function recover(root,
|
|
96
|
+
async function recover(root, endpoint) {
|
|
97
|
+
// Connected only when a dead run has something to sweep.
|
|
98
|
+
await using resources = new AsyncDisposableStack();
|
|
99
|
+
let engine;
|
|
100
|
+
const connection = async () => (engine ??= resources.use(await Docker.connect({
|
|
101
|
+
host: endpoint,
|
|
102
|
+
signal: AbortSignal.timeout(ENGINE_CALL_TIMEOUT),
|
|
103
|
+
})));
|
|
145
104
|
for (const name of await readdir(root)) {
|
|
146
105
|
// A claim names its runner: while it lives, the run is being recovered.
|
|
147
106
|
const claimant = /^recovering-(\d+)-/.exec(name)?.[1];
|
|
@@ -149,13 +108,13 @@ async function recover(root, host) {
|
|
|
149
108
|
continue;
|
|
150
109
|
const directory = join(root, name);
|
|
151
110
|
const previous = await readRun(directory);
|
|
152
|
-
if (!previous || previous.endpoint !==
|
|
111
|
+
if (!previous || previous.endpoint !== endpoint || alive(previous.pid))
|
|
153
112
|
continue;
|
|
154
|
-
// A killed runner leaves its test processes
|
|
155
|
-
//
|
|
156
|
-
let
|
|
113
|
+
// A killed runner leaves its test processes running. Each one can still
|
|
114
|
+
// create something.
|
|
115
|
+
let found;
|
|
157
116
|
try {
|
|
158
|
-
|
|
117
|
+
found = records(directory);
|
|
159
118
|
}
|
|
160
119
|
catch (error) {
|
|
161
120
|
// Another runner claimed the run between the listing and this read.
|
|
@@ -163,7 +122,7 @@ async function recover(root, host) {
|
|
|
163
122
|
continue;
|
|
164
123
|
throw error;
|
|
165
124
|
}
|
|
166
|
-
if (processes.some(alive))
|
|
125
|
+
if (found.processes.some(alive))
|
|
167
126
|
continue;
|
|
168
127
|
// Runners start in parallel; the rename lets exactly one recover a run.
|
|
169
128
|
const claimed = join(root, `recovering-${process.pid}-${randomUUID()}`);
|
|
@@ -176,8 +135,8 @@ async function recover(root, host) {
|
|
|
176
135
|
throw error;
|
|
177
136
|
}
|
|
178
137
|
try {
|
|
179
|
-
if (processes.length > 0)
|
|
180
|
-
cleanup(
|
|
138
|
+
if (found.processes.length > 0 || found.creating > 0)
|
|
139
|
+
await cleanup(await connection(), previous, claimed);
|
|
181
140
|
rmSync(claimed, { recursive: true, force: true });
|
|
182
141
|
}
|
|
183
142
|
catch (error) {
|
|
@@ -190,13 +149,14 @@ export async function globalSetup() {
|
|
|
190
149
|
// means ~/.local/state.
|
|
191
150
|
const root = join(process.env.XDG_STATE_HOME || join(homedir(), '.local', 'state'), 'zukhruf-testing', 'docker-runs');
|
|
192
151
|
await mkdir(root, { recursive: true });
|
|
193
|
-
|
|
194
|
-
await
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
152
|
+
// The context store names the engine without a call to it.
|
|
153
|
+
const current = (await Docker.contexts({ environment: process.env })).find((context) => context.current);
|
|
154
|
+
if (!current)
|
|
155
|
+
throw new Error('Docker selects no context');
|
|
156
|
+
// Refuses an engine that the tests do not support.
|
|
157
|
+
const { endpoint } = new DockerHost(current.host, undefined);
|
|
158
|
+
await recover(root, endpoint);
|
|
159
|
+
const run = { id: randomUUID(), endpoint, pid: process.pid };
|
|
200
160
|
const directory = join(root, run.id);
|
|
201
161
|
await mkdir(directory);
|
|
202
162
|
const pending = join(directory, 'run.pending.json');
|
|
@@ -204,23 +164,23 @@ export async function globalSetup() {
|
|
|
204
164
|
await rename(pending, join(directory, 'run.json'));
|
|
205
165
|
process.env[TEST_RUN_ID] = run.id;
|
|
206
166
|
process.env[TEST_RUN_DIRECTORY] = directory;
|
|
207
|
-
process.env.DOCKER_HOST =
|
|
167
|
+
process.env.DOCKER_HOST = endpoint;
|
|
208
168
|
delete process.env.DOCKER_CONTEXT;
|
|
209
169
|
}
|
|
210
|
-
/** Synchronous
|
|
170
|
+
/** Synchronous: see cleanupInWorker. */
|
|
211
171
|
export function globalTeardown() {
|
|
212
172
|
const owner = TestRun.fromEnvironment(process.env);
|
|
213
173
|
if (!owner)
|
|
214
174
|
throw new Error(`The Docker global teardown runs after its global setup, which sets ${TEST_RUN_ID} and ${TEST_RUN_DIRECTORY}`);
|
|
215
175
|
try {
|
|
216
176
|
const run = JSON.parse(readFileSync(join(owner.directory, 'run.json'), 'utf8'));
|
|
217
|
-
const processes =
|
|
177
|
+
const { processes, creating } = records(owner.directory);
|
|
218
178
|
// No test process recorded itself, so the run created nothing.
|
|
219
|
-
if (processes.length > 0)
|
|
220
|
-
|
|
221
|
-
// A process that still lives
|
|
222
|
-
//
|
|
223
|
-
if (!processes.some(alive))
|
|
179
|
+
if (processes.length > 0 || creating > 0)
|
|
180
|
+
cleanupInWorker(run, owner.directory);
|
|
181
|
+
// A process that still lives, or a create that the engine can still
|
|
182
|
+
// finish, can still add something: the next run's recovery sweeps again.
|
|
183
|
+
if (!processes.some(alive) && creating === 0)
|
|
224
184
|
rmSync(owner.directory, { recursive: true, force: true });
|
|
225
185
|
}
|
|
226
186
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-global-setup.js","sourceRoot":"","sources":["../../src/scripts/docker-global-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"docker-global-setup.js","sourceRoot":"","sources":["../../src/scripts/docker-global-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Docker } from '@zukhruf/docker';
|
|
2
|
+
/** How long one Engine API call of the cleanup may take. */
|
|
3
|
+
export declare const ENGINE_CALL_TIMEOUT = 240000;
|
|
4
|
+
/** What the global setup writes to run.json. */
|
|
5
|
+
export interface Run {
|
|
6
|
+
id: string;
|
|
7
|
+
endpoint: string;
|
|
8
|
+
pid: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Removes what carries the run's label and what its records name, on the
|
|
12
|
+
* engine that `engine` is connected to.
|
|
13
|
+
*/
|
|
14
|
+
export declare function cleanup(engine: Docker, previous: Run, directory: string): Promise<void>;
|
|
15
|
+
/** Connects to the run's engine, cleans the run, and ends the connection. */
|
|
16
|
+
export declare function connectAndCleanup(previous: Run, directory: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=run-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-cleanup.d.ts","sourceRoot":"","sources":["../../src/scripts/run-cleanup.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAWzC,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAE3C,gDAAgD;AAChD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AASD;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED,6EAA6E;AAC7E,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { readFile, readdir, rm } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import { Docker } from '@zukhruf/docker';
|
|
6
|
+
import { SHARED_SERVER_LABEL } from "../docker/docker.js";
|
|
7
|
+
import { DockerHost, SHELL_TIMEOUT, quote } from "../docker/host.js";
|
|
8
|
+
import { TEST_RUN_LABEL, TestRun, directoryPrefix, forwardPrefix, } from "../docker/test-run.js";
|
|
9
|
+
/** How long one Engine API call of the cleanup may take. */
|
|
10
|
+
export const ENGINE_CALL_TIMEOUT = 240_000;
|
|
11
|
+
const execute = promisify(execFile);
|
|
12
|
+
async function readRecordedPath(file) {
|
|
13
|
+
const { path } = JSON.parse(await readFile(file, 'utf8'));
|
|
14
|
+
return path;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Removes what carries the run's label and what its records name, on the
|
|
18
|
+
* engine that `engine` is connected to.
|
|
19
|
+
*/
|
|
20
|
+
export async function cleanup(engine, previous, directory) {
|
|
21
|
+
const host = new DockerHost(previous.endpoint, undefined);
|
|
22
|
+
const owner = new TestRun(previous.id, directory);
|
|
23
|
+
const signal = () => AbortSignal.timeout(ENGINE_CALL_TIMEOUT);
|
|
24
|
+
// Labels are attached atomically at creation. Never prune an engine,
|
|
25
|
+
// remove shared servers, or trust names alone as proof of ownership.
|
|
26
|
+
const filters = { label: [`${TEST_RUN_LABEL}=${previous.id}`] };
|
|
27
|
+
for (const summary of await engine.containers.list({
|
|
28
|
+
all: true,
|
|
29
|
+
filters,
|
|
30
|
+
signal: signal(),
|
|
31
|
+
})) {
|
|
32
|
+
if (summary.Labels?.[SHARED_SERVER_LABEL] === '1')
|
|
33
|
+
continue;
|
|
34
|
+
const container = await engine.containers.find(summary.Id, {
|
|
35
|
+
signal: signal(),
|
|
36
|
+
});
|
|
37
|
+
await container?.remove({ force: true, v: true, signal: signal() });
|
|
38
|
+
}
|
|
39
|
+
for (const { Name } of await engine.volumes.list({
|
|
40
|
+
filters,
|
|
41
|
+
signal: signal(),
|
|
42
|
+
})) {
|
|
43
|
+
const volume = await engine.volumes.find(Name, { signal: signal() });
|
|
44
|
+
await volume?.remove({ signal: signal() });
|
|
45
|
+
}
|
|
46
|
+
for (const file of await readdir(directory)) {
|
|
47
|
+
if (file.startsWith('forward-')) {
|
|
48
|
+
const path = await readRecordedPath(join(directory, file));
|
|
49
|
+
if (!path.startsWith(forwardPrefix(owner)) || path.slice(5).includes('/'))
|
|
50
|
+
throw new Error(`Invalid SSH forwarding cleanup record: ${path}`);
|
|
51
|
+
await rm(path, { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
else if (file.startsWith('directory-')) {
|
|
54
|
+
const path = await readRecordedPath(join(directory, file));
|
|
55
|
+
if (!path.includes(`/${directoryPrefix(owner)}`) || path.includes('/../'))
|
|
56
|
+
throw new Error(`Invalid fixture cleanup record: ${path}`);
|
|
57
|
+
if (host.remote)
|
|
58
|
+
await execute('ssh', [...host.sshArgs(), `rm -rf -- ${quote(path)}`], {
|
|
59
|
+
timeout: SHELL_TIMEOUT,
|
|
60
|
+
});
|
|
61
|
+
else
|
|
62
|
+
await rm(path, { recursive: true, force: true });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Connects to the run's engine, cleans the run, and ends the connection. */
|
|
67
|
+
export async function connectAndCleanup(previous, directory) {
|
|
68
|
+
// Disposal ends the connection, and with it the ssh child of an SSH engine.
|
|
69
|
+
await using engine = await Docker.connect({
|
|
70
|
+
host: previous.endpoint,
|
|
71
|
+
signal: AbortSignal.timeout(ENGINE_CALL_TIMEOUT),
|
|
72
|
+
});
|
|
73
|
+
await cleanup(engine, previous, directory);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=run-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-cleanup.js","sourceRoot":"","sources":["../../src/scripts/run-cleanup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zukhruf/testing",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.37",
|
|
4
4
|
"description": "Disposable fixtures for integration tests: Docker containers and database servers, SQLite and DuckDB databases, HTTP servers and streams. Node's global setup and global teardown remove what a killed test run left behind.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"pg": "^8.23.1"
|
|
132
132
|
},
|
|
133
133
|
"dependencies": {
|
|
134
|
+
"@zukhruf/docker": "^0.3.37",
|
|
134
135
|
"nano-spawn": "^2.1.0",
|
|
135
136
|
"p-memoize": "^8.0.0",
|
|
136
137
|
"p-retry": "^8.0.1"
|