]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/extra-utils/server/jobs.ts
Merge branch 'release/2.1.0' into develop
[github/Chocobozzz/PeerTube.git] / shared / extra-utils / server / jobs.ts
CommitLineData
5cd80545 1import * as request from 'supertest'
1061c73f 2import { Job, JobState, JobType } from '../../models'
d175a6f7 3import { wait } from '../miscs/miscs'
bc22d608 4import { ServerInfo } from './servers'
32c68d67 5import { makeGetRequest } from '../../../shared/extra-utils'
5cd80545 6
94a5ff8a
C
7function getJobsList (url: string, accessToken: string, state: JobState) {
8 const path = '/api/v1/jobs/' + state
5cd80545
C
9
10 return request(url)
a1587156
C
11 .get(path)
12 .set('Accept', 'application/json')
13 .set('Authorization', 'Bearer ' + accessToken)
14 .expect(200)
15 .expect('Content-Type', /json/)
5cd80545
C
16}
17
1061c73f 18function getJobsListPaginationAndSort (options: {
a1587156
C
19 url: string
20 accessToken: string
21 state: JobState
22 start: number
23 count: number
24 sort: string
1061c73f
C
25 jobType?: JobType
26}) {
27 const { url, accessToken, state, start, count, sort, jobType } = options
94a5ff8a 28 const path = '/api/v1/jobs/' + state
5cd80545 29
1061c73f
C
30 const query = {
31 start,
32 count,
33 sort,
34 jobType
35 }
36
37 return makeGetRequest({
38 url,
39 path,
40 token: accessToken,
41 statusCodeExpected: 200,
42 query
43 })
5cd80545
C
44}
45
3cd0734f 46async function waitJobs (serversArg: ServerInfo[] | ServerInfo) {
2f1548fd 47 const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10) : 2000
3cd0734f
C
48 let servers: ServerInfo[]
49
50 if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ]
51 else servers = serversArg as ServerInfo[]
52
94831479 53 const states: JobState[] = [ 'waiting', 'active', 'delayed' ]
bfbd9128 54 let pendingRequests: boolean
3cd0734f 55
cef534ed
C
56 function tasksBuilder () {
57 const tasks: Promise<any>[] = []
3cd0734f
C
58
59 // Check if each server has pending request
60 for (const server of servers) {
61 for (const state of states) {
1061c73f
C
62 const p = getJobsListPaginationAndSort({
63 url: server.url,
64 accessToken: server.accessToken,
65 state: state,
66 start: 0,
67 count: 10,
68 sort: '-createdAt'
69 })
6b616860
C
70 .then(res => res.body.data)
71 .then((jobs: Job[]) => jobs.filter(j => j.type !== 'videos-views'))
72 .then(jobs => {
2284f202
C
73 if (jobs.length !== 0) {
74 pendingRequests = true
75 }
3cd0734f
C
76 })
77 tasks.push(p)
78 }
79 }
80
cef534ed
C
81 return tasks
82 }
83
84 do {
bfbd9128 85 pendingRequests = false
cef534ed 86 await Promise.all(tasksBuilder())
3cd0734f
C
87
88 // Retry, in case of new jobs were created
89 if (pendingRequests === false) {
2f1548fd 90 await wait(pendingJobWait)
cef534ed 91 await Promise.all(tasksBuilder())
3cd0734f
C
92 }
93
94 if (pendingRequests) {
95 await wait(1000)
96 }
97 } while (pendingRequests)
98}
99
5cd80545
C
100// ---------------------------------------------------------------------------
101
102export {
103 getJobsList,
3cd0734f 104 waitJobs,
5cd80545
C
105 getJobsListPaginationAndSort
106}