1
0
Fork 0
mirror of https://github.com/Chocobozzz/PeerTube.git synced 2025-10-03 01:39:37 +02:00

Add runner version info

This commit is contained in:
Chocobozzz 2025-07-29 10:30:23 +02:00
parent 309068ae1d
commit 3e1cdb9fa2
No known key found for this signature in database
GPG key ID: 583A612D890159BE
23 changed files with 233 additions and 192 deletions

View file

@ -46,6 +46,7 @@ import {
getRunnerFromTokenValidator,
jobOfRunnerGetValidatorFactory,
listRunnerJobsValidator,
requestRunnerJobValidator,
runnerJobGetValidator,
successRunnerJobValidator,
updateRunnerJobValidator
@ -72,13 +73,16 @@ const runnerJobsRouter = express.Router()
// Controllers for runners
// ---------------------------------------------------------------------------
runnerJobsRouter.post('/jobs/request',
runnerJobsRouter.post(
'/jobs/request',
apiRateLimiter,
requestRunnerJobValidator,
asyncMiddleware(getRunnerFromTokenValidator),
asyncMiddleware(requestRunnerJob)
)
runnerJobsRouter.post('/jobs/:jobUUID/accept',
runnerJobsRouter.post(
'/jobs/:jobUUID/accept',
apiRateLimiter,
asyncMiddleware(runnerJobGetValidator),
acceptRunnerJobValidator,
@ -86,14 +90,16 @@ runnerJobsRouter.post('/jobs/:jobUUID/accept',
asyncMiddleware(acceptRunnerJob)
)
runnerJobsRouter.post('/jobs/:jobUUID/abort',
runnerJobsRouter.post(
'/jobs/:jobUUID/abort',
apiRateLimiter,
asyncMiddleware(jobOfRunnerGetValidatorFactory([ RunnerJobState.PROCESSING ])),
abortRunnerJobValidator,
asyncMiddleware(abortRunnerJob)
)
runnerJobsRouter.post('/jobs/:jobUUID/update',
runnerJobsRouter.post(
'/jobs/:jobUUID/update',
runnerJobUpdateVideoFiles,
apiRateLimiter, // Has to be after multer middleware to parse runner token
asyncMiddleware(jobOfRunnerGetValidatorFactory([ RunnerJobState.PROCESSING, RunnerJobState.COMPLETING, RunnerJobState.COMPLETED ])),
@ -101,13 +107,15 @@ runnerJobsRouter.post('/jobs/:jobUUID/update',
asyncMiddleware(updateRunnerJobController)
)
runnerJobsRouter.post('/jobs/:jobUUID/error',
runnerJobsRouter.post(
'/jobs/:jobUUID/error',
asyncMiddleware(jobOfRunnerGetValidatorFactory([ RunnerJobState.PROCESSING ])),
errorRunnerJobValidator,
asyncMiddleware(errorRunnerJob)
)
runnerJobsRouter.post('/jobs/:jobUUID/success',
runnerJobsRouter.post(
'/jobs/:jobUUID/success',
postRunnerJobSuccessVideoFiles,
apiRateLimiter, // Has to be after multer middleware to parse runner token
asyncMiddleware(jobOfRunnerGetValidatorFactory([ RunnerJobState.PROCESSING ])),
@ -119,7 +127,8 @@ runnerJobsRouter.post('/jobs/:jobUUID/success',
// Controllers for admins
// ---------------------------------------------------------------------------
runnerJobsRouter.post('/jobs/:jobUUID/cancel',
runnerJobsRouter.post(
'/jobs/:jobUUID/cancel',
authenticate,
ensureUserHasRight(UserRight.MANAGE_RUNNERS),
asyncMiddleware(runnerJobGetValidator),
@ -127,7 +136,8 @@ runnerJobsRouter.post('/jobs/:jobUUID/cancel',
asyncMiddleware(cancelRunnerJob)
)
runnerJobsRouter.get('/jobs',
runnerJobsRouter.get(
'/jobs',
authenticate,
ensureUserHasRight(UserRight.MANAGE_RUNNERS),
paginationValidator,
@ -138,7 +148,8 @@ runnerJobsRouter.get('/jobs',
asyncMiddleware(listRunnerJobs)
)
runnerJobsRouter.delete('/jobs/:jobUUID',
runnerJobsRouter.delete(
'/jobs/:jobUUID',
authenticate,
ensureUserHasRight(UserRight.MANAGE_RUNNERS),
asyncMiddleware(runnerJobGetValidator),
@ -172,6 +183,11 @@ async function requestRunnerJob (req: express.Request, res: express.Response) {
}))
}
if (body.version && runner.version !== body.version) {
runner.version = body.version
await runner.save()
}
updateLastRunnerContact(req, runner)
return res.json(result)
@ -218,7 +234,10 @@ async function acceptRunnerJob (req: express.Request, res: express.Response) {
updateLastRunnerContact(req, runner)
logger.info(
'Remote runner %s has accepted job %s (%s)', runner.name, runnerJob.uuid, runnerJob.type,
'Remote runner %s has accepted job %s (%s)',
runner.name,
runnerJob.uuid,
runnerJob.type,
lTags(runner.name, runnerJob.uuid, runnerJob.type)
)
@ -231,7 +250,10 @@ async function abortRunnerJob (req: express.Request, res: express.Response) {
const body: AbortRunnerJobBody = req.body
logger.info(
'Remote runner %s is aborting job %s (%s)', runner.name, runnerJob.uuid, runnerJob.type,
'Remote runner %s is aborting job %s (%s)',
runner.name,
runnerJob.uuid,
runnerJob.type,
{ reason: body.reason, ...lTags(runner.name, runnerJob.uuid, runnerJob.type) }
)
@ -251,7 +273,10 @@ async function errorRunnerJob (req: express.Request, res: express.Response) {
runnerJob.failures += 1
logger.error(
'Remote runner %s had an error with job %s (%s)', runner.name, runnerJob.uuid, runnerJob.type,
'Remote runner %s had an error with job %s (%s)',
runner.name,
runnerJob.uuid,
runnerJob.type,
{ errorMessage: body.message, totalFailures: runnerJob.failures, ...lTags(runner.name, runnerJob.uuid, runnerJob.type) }
)
@ -294,7 +319,10 @@ async function updateRunnerJobController (req: express.Request, res: express.Res
: undefined
logger.debug(
'Remote runner %s is updating job %s (%s)', runnerJob.Runner.name, runnerJob.uuid, runnerJob.type,
'Remote runner %s is updating job %s (%s)',
runnerJob.Runner.name,
runnerJob.uuid,
runnerJob.type,
{ body, updatePayload, ...lTags(runner.name, runnerJob.uuid, runnerJob.type) }
)
@ -367,7 +395,10 @@ async function postRunnerJobSuccess (req: express.Request, res: express.Response
const resultPayload = jobSuccessPayloadBuilders[runnerJob.type](body.payload, req.files as UploadFiles)
logger.info(
'Remote runner %s is sending success result for job %s (%s)', runnerJob.Runner.name, runnerJob.uuid, runnerJob.type,
'Remote runner %s is sending success result for job %s (%s)',
runnerJob.Runner.name,
runnerJob.uuid,
runnerJob.type,
{ resultPayload, ...lTags(runner.name, runnerJob.uuid, runnerJob.type) }
)

View file

@ -1,4 +1,3 @@
import express from 'express'
import { HttpStatusCode, ListRunnersQuery, RegisterRunnerBody, UserRight } from '@peertube/peertube-models'
import { logger, loggerTagsFactory } from '@server/helpers/logger.js'
import { generateRunnerToken } from '@server/helpers/token-generator.js'
@ -18,23 +17,28 @@ import {
registerRunnerValidator
} from '@server/middlewares/validators/runners/index.js'
import { RunnerModel } from '@server/models/runner/runner.js'
import express from 'express'
const lTags = loggerTagsFactory('api', 'runner')
const manageRunnersRouter = express.Router()
manageRunnersRouter.post('/register',
manageRunnersRouter.post(
'/register',
apiRateLimiter,
asyncMiddleware(registerRunnerValidator),
asyncMiddleware(registerRunner)
)
manageRunnersRouter.post('/unregister',
manageRunnersRouter.post(
'/unregister',
apiRateLimiter,
asyncMiddleware(getRunnerFromTokenValidator),
asyncMiddleware(unregisterRunner)
)
manageRunnersRouter.delete('/:runnerId',
manageRunnersRouter.delete(
'/:runnerId',
apiRateLimiter,
authenticate,
ensureUserHasRight(UserRight.MANAGE_RUNNERS),
@ -42,7 +46,8 @@ manageRunnersRouter.delete('/:runnerId',
asyncMiddleware(deleteRunner)
)
manageRunnersRouter.get('/',
manageRunnersRouter.get(
'/',
apiRateLimiter,
authenticate,
ensureUserHasRight(UserRight.MANAGE_RUNNERS),
@ -72,6 +77,7 @@ async function registerRunner (req: express.Request, res: express.Response) {
description: body.description,
lastContact: new Date(),
ip: req.ip,
version: body.version,
runnerRegistrationTokenId: res.locals.runnerRegistrationToken.id
})