]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/server-commands/server/jobs.ts
Add runner server tests
[github/Chocobozzz/PeerTube.git] / shared / server-commands / server / jobs.ts
CommitLineData
9c6327f8 1
842a1573 2import { expect } from 'chai'
c55e3d72 3import { wait } from '@shared/core-utils'
d102de1b 4import { JobState, JobType, RunnerJobState } from '../../models'
254d3579 5import { PeerTubeServer } from './server'
5cd80545 6
e82cb087
C
7async function waitJobs (
8 serversArg: PeerTubeServer[] | PeerTubeServer,
9 options: {
10 skipDelayed?: boolean // default false
d102de1b 11 runnerJobs?: boolean // default false
e82cb087
C
12 } = {}
13) {
d102de1b 14 const { skipDelayed = false, runnerJobs = false } = options
e82cb087 15
fae6e4da
C
16 const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT
17 ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10)
4b91bc15 18 : 250
fae6e4da 19
254d3579 20 let servers: PeerTubeServer[]
3cd0734f 21
254d3579
C
22 if (Array.isArray(serversArg) === false) servers = [ serversArg as PeerTubeServer ]
23 else servers = serversArg as PeerTubeServer[]
3cd0734f 24
0305db28
JB
25 const states: JobState[] = [ 'waiting', 'active' ]
26 if (!skipDelayed) states.push('delayed')
27
51353d9a 28 const repeatableJobs: JobType[] = [ 'videos-views-stats', 'activitypub-cleaner' ]
bfbd9128 29 let pendingRequests: boolean
3cd0734f 30
cef534ed
C
31 function tasksBuilder () {
32 const tasks: Promise<any>[] = []
3cd0734f
C
33
34 // Check if each server has pending request
35 for (const server of servers) {
36 for (const state of states) {
d102de1b
C
37
38 const jobPromise = server.jobs.list({
9c6327f8 39 state,
1061c73f
C
40 start: 0,
41 count: 10,
42 sort: '-createdAt'
9c6327f8
C
43 }).then(body => body.data)
44 .then(jobs => jobs.filter(j => !repeatableJobs.includes(j.type)))
6b616860 45 .then(jobs => {
2284f202
C
46 if (jobs.length !== 0) {
47 pendingRequests = true
48 }
3cd0734f 49 })
fae6e4da 50
d102de1b 51 tasks.push(jobPromise)
3cd0734f 52 }
fae6e4da 53
d102de1b 54 const debugPromise = server.debug.getDebug()
883a9019 55 .then(obj => {
fae6e4da
C
56 if (obj.activityPubMessagesWaiting !== 0) {
57 pendingRequests = true
58 }
59 })
d102de1b
C
60 tasks.push(debugPromise)
61
62 if (runnerJobs) {
63 const runnerJobsPromise = server.runnerJobs.list({ count: 100 })
64 .then(({ data }) => {
65 for (const job of data) {
66 if (job.state.id !== RunnerJobState.COMPLETED) {
67 pendingRequests = true
68 }
69 }
70 })
71 tasks.push(runnerJobsPromise)
72 }
fae6e4da 73
3cd0734f
C
74 }
75
cef534ed
C
76 return tasks
77 }
78
79 do {
bfbd9128 80 pendingRequests = false
cef534ed 81 await Promise.all(tasksBuilder())
3cd0734f
C
82
83 // Retry, in case of new jobs were created
84 if (pendingRequests === false) {
2f1548fd 85 await wait(pendingJobWait)
cef534ed 86 await Promise.all(tasksBuilder())
3cd0734f
C
87 }
88
89 if (pendingRequests) {
4b91bc15 90 await wait(pendingJobWait)
3cd0734f
C
91 }
92 } while (pendingRequests)
93}
94
842a1573
C
95async function expectNoFailedTranscodingJob (server: PeerTubeServer) {
96 const { data } = await server.jobs.listFailed({ jobType: 'video-transcoding' })
97 expect(data).to.have.lengthOf(0)
98}
99
5cd80545
C
100// ---------------------------------------------------------------------------
101
102export {
842a1573
C
103 waitJobs,
104 expectNoFailedTranscodingJob
5cd80545 105}