diff options
Diffstat (limited to 'packages/server-commands/src/server/servers-command.ts')
-rw-r--r-- | packages/server-commands/src/server/servers-command.ts | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/packages/server-commands/src/server/servers-command.ts b/packages/server-commands/src/server/servers-command.ts new file mode 100644 index 000000000..0b722b62f --- /dev/null +++ b/packages/server-commands/src/server/servers-command.ts | |||
@@ -0,0 +1,104 @@ | |||
1 | import { exec } from 'child_process' | ||
2 | import { copy, ensureDir, remove } from 'fs-extra/esm' | ||
3 | import { readdir, readFile } from 'fs/promises' | ||
4 | import { basename, join } from 'path' | ||
5 | import { wait } from '@peertube/peertube-core-utils' | ||
6 | import { HttpStatusCode } from '@peertube/peertube-models' | ||
7 | import { getFileSize, isGithubCI, root } from '@peertube/peertube-node-utils' | ||
8 | import { AbstractCommand, OverrideCommandOptions } from '../shared/index.js' | ||
9 | |||
10 | export class ServersCommand extends AbstractCommand { | ||
11 | |||
12 | static flushTests (internalServerNumber: number) { | ||
13 | return new Promise<void>((res, rej) => { | ||
14 | const suffix = ` -- ${internalServerNumber}` | ||
15 | |||
16 | return exec('npm run clean:server:test' + suffix, (err, _stdout, stderr) => { | ||
17 | if (err || stderr) return rej(err || new Error(stderr)) | ||
18 | |||
19 | return res() | ||
20 | }) | ||
21 | }) | ||
22 | } | ||
23 | |||
24 | ping (options: OverrideCommandOptions = {}) { | ||
25 | return this.getRequestBody({ | ||
26 | ...options, | ||
27 | |||
28 | path: '/api/v1/ping', | ||
29 | implicitToken: false, | ||
30 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
31 | }) | ||
32 | } | ||
33 | |||
34 | cleanupTests () { | ||
35 | const promises: Promise<any>[] = [] | ||
36 | |||
37 | const saveGithubLogsIfNeeded = async () => { | ||
38 | if (!isGithubCI()) return | ||
39 | |||
40 | await ensureDir('artifacts') | ||
41 | |||
42 | const origin = this.buildDirectory('logs/peertube.log') | ||
43 | const destname = `peertube-${this.server.internalServerNumber}.log` | ||
44 | console.log('Saving logs %s.', destname) | ||
45 | |||
46 | await copy(origin, join('artifacts', destname)) | ||
47 | } | ||
48 | |||
49 | if (this.server.parallel) { | ||
50 | const promise = saveGithubLogsIfNeeded() | ||
51 | .then(() => ServersCommand.flushTests(this.server.internalServerNumber)) | ||
52 | |||
53 | promises.push(promise) | ||
54 | } | ||
55 | |||
56 | if (this.server.customConfigFile) { | ||
57 | promises.push(remove(this.server.customConfigFile)) | ||
58 | } | ||
59 | |||
60 | return promises | ||
61 | } | ||
62 | |||
63 | async waitUntilLog (str: string, count = 1, strictCount = true) { | ||
64 | const logfile = this.buildDirectory('logs/peertube.log') | ||
65 | |||
66 | while (true) { | ||
67 | const buf = await readFile(logfile) | ||
68 | |||
69 | const matches = buf.toString().match(new RegExp(str, 'g')) | ||
70 | if (matches && matches.length === count) return | ||
71 | if (matches && strictCount === false && matches.length >= count) return | ||
72 | |||
73 | await wait(1000) | ||
74 | } | ||
75 | } | ||
76 | |||
77 | buildDirectory (directory: string) { | ||
78 | return join(root(), 'test' + this.server.internalServerNumber, directory) | ||
79 | } | ||
80 | |||
81 | async countFiles (directory: string) { | ||
82 | const files = await readdir(this.buildDirectory(directory)) | ||
83 | |||
84 | return files.length | ||
85 | } | ||
86 | |||
87 | buildWebVideoFilePath (fileUrl: string) { | ||
88 | return this.buildDirectory(join('web-videos', basename(fileUrl))) | ||
89 | } | ||
90 | |||
91 | buildFragmentedFilePath (videoUUID: string, fileUrl: string) { | ||
92 | return this.buildDirectory(join('streaming-playlists', 'hls', videoUUID, basename(fileUrl))) | ||
93 | } | ||
94 | |||
95 | getLogContent () { | ||
96 | return readFile(this.buildDirectory('logs/peertube.log')) | ||
97 | } | ||
98 | |||
99 | async getServerFileSize (subPath: string) { | ||
100 | const path = this.server.servers.buildDirectory(subPath) | ||
101 | |||
102 | return getFileSize(path) | ||
103 | } | ||
104 | } | ||