Add fleet and per-host concurrency controls

This commit is contained in:
2026-10-05 22:27:27 -04:00
parent c3b990c5fd
commit 7c98df4fb0
14 changed files with 268 additions and 47 deletions
+17
View File
@@ -353,3 +353,20 @@ describe('durable host operations', () => {
expect(api.getHostOperation(operation.id)?.state).toBe('pending');
});
});
it('limits preparing hosts at delivery, preserves replays, and releases capacity after completion', async () => {
const api = await enrolled();
const second = api.createHost({ name: 'Second' });
api.enrollHost(api.createEnrollment(second.id).token, inventory);
const { fleetSettings, saveFleetSettings } = await import('../../src/lib/server/settings.js');
saveFleetSettings({ ...fleetSettings(), preparationConcurrency: 1 });
const first = api.queueHostOperation(api.host.id, 'library.download', { libraryVersionId: 'one' });
const next = api.queueHostOperation(second.id, 'library.download', { libraryVersionId: 'two' });
const inspect = api.queueHostOperation(second.id, 'host.inspect', {});
expect(api.pendingHostOperations(api.host.id).map(row => row.id)).toContain(first.id);
expect(api.pendingHostOperations(second.id).map(row => row.id)).not.toContain(next.id);
expect(api.pendingHostOperations(second.id).map(row => row.id)).toContain(inspect.id);
expect(api.pendingHostOperations(api.host.id).map(row => row.id)).toContain(first.id);
api.reportHostOperation(api.host.id, first.id, { state: 'completed', result: {} });
expect(api.pendingHostOperations(second.id).map(row => row.id)).toContain(next.id);
});