Preview: Runner-Schutzschalter 503 als Server ausgelastet durchreichen

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-09-30 21:54:01 +00:00
1 parent b3cf78c82a
commit cd9a6e0cf1
2 files changed
+18 -3

No files matched your search

+12 -2
View File
@@ -11,7 +11,7 @@ import { startFakeAppwrite } from './helpers/fakeAppwrite.js'
let aw, runner, gitea, app, base, tmp, cfg, envLib, logs
const key = crypto.randomBytes(32)
const SHA = 'c'.repeat(40)
const rs = { calls: [], slow: false, result: 'static' }
const rs = { calls: [], busy: false, slow: false, result: 'static' }
before(async () => {
const seed = [
@@ -30,6 +30,7 @@ before(async () => {
let raw = ''
req.on('data', (c) => (raw += c))
req.on('end', () => {
if (rs.busy && (req.url === '/jobs/build' || req.url.endsWith('/start'))) { res.statusCode = 503; res.setHeader('Content-Type', 'application/json'); return res.end(JSON.stringify({ error: 'Server ausgelastet' })) }
rs.calls.push({ method: req.method, url: req.url, body: raw ? JSON.parse(raw) : null })
res.setHeader('Content-Type', 'application/json')
if (req.method === 'POST' && req.url === '/jobs/build') return res.end(JSON.stringify({ runId: 'run-x' }))
@@ -87,7 +88,7 @@ after(async () => {
await fs.rm(tmp, { recursive: true, force: true })
})
beforeEach(() => { rs.slow = false; rs.result = 'static'; rs.calls = []; cfg.previewRunner.enabled = true; process.env.PREVIEW_ENV_KEY = key.toString('base64') })
beforeEach(() => { rs.busy = false; rs.slow = false; rs.result = 'static'; rs.calls = []; cfg.previewRunner.enabled = true; process.env.PREVIEW_ENV_KEY = key.toString('base64') })
const call = (method, p, body, jwt = 'jwt-admin') =>
fetch(`${base}${p}`, {
@@ -273,3 +274,12 @@ test('dev/start ohne gespeicherten Stand: 409; dev/stop ändert failed nicht', a
const r = await call('POST', '/pns/preview/dev/stop')
assert.equal((await r.json()).state, 'failed')
})
test('Runner-Schutzschalter 503: rebuild und dev/start melden Server ausgelastet', async () => {
rs.busy = true
for (const p of ['/pe/preview/rebuild', '/pw/preview/dev/start']) {
const r = await call('POST', p)
assert.equal(r.status, 503, p)
assert.deepEqual(await r.json(), { error: 'Server ausgelastet, versuche es gleich noch mal' })
}
})