Defer server file changes until guarded restart activation
Persist beta, promotion, drift, and rollback payloads until occupancy and restart-capacity checks pass. Preserve rollback snapshots and campaign ordering, and allow held rollback campaigns to resume safely. Fixes #28 Validation: 805 tests passed, Svelte checks clean, production build passed.
This commit is contained in:
@@ -2,6 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { readFile, writeFile } from 'node:fs/promises';
|
||||
import { join } from 'node:path';
|
||||
import { newFixture, type Fixture } from '../helpers/fixture.js';
|
||||
import { activateFiles } from '../helpers/staged-files.js';
|
||||
import { defaultPlan, requirement } from '../../src/lib/beta-plan.js';
|
||||
import { gameEvent } from '../helpers/telemetry.js';
|
||||
|
||||
@@ -107,6 +108,7 @@ describe('deleted server operational guards', () => {
|
||||
it('skips deleted campaign targets during restart and rollback while restoring live targets', async () => {
|
||||
for (const name of names) await writeFile(path(name), 'original content');
|
||||
const { betaId } = await open();
|
||||
await activateFiles('beta', betaId);
|
||||
const { db } = await import('../../src/lib/server/db/index.js');
|
||||
const { promoteBeta } = await import('../../src/lib/server/fleet/beta.js');
|
||||
const { rollbackPromoteDeployment } = await import('../../src/lib/server/fleet/rollback.js');
|
||||
@@ -115,12 +117,15 @@ describe('deleted server operational guards', () => {
|
||||
db().prepare("UPDATE beta_servers SET stage = 'ready', restarted_at = ? WHERE beta_id = ?").run(now(), betaId);
|
||||
db().prepare("UPDATE betas SET state = 'ready-promote' WHERE id = ?").run(betaId);
|
||||
const campaign = await promoteBeta(betaId);
|
||||
const provisioningBefore = db().prepare('SELECT id FROM server_deployments').all();
|
||||
await replace(names[1]);
|
||||
await sweep();
|
||||
expect(db().prepare('SELECT id FROM server_deployments').all()).toEqual([]);
|
||||
expect(db().prepare('SELECT id FROM server_deployments').all()).toEqual(provisioningBefore);
|
||||
expect(() => requestRestart(names[1], { kind: 'campaign', id: campaign.deploymentId })).toThrow('Restart source no longer exists');
|
||||
const result = await rollbackPromoteDeployment(campaign.deploymentId);
|
||||
expect(result.affectedServers).toEqual([names[0]]);
|
||||
expect(await readFile(path(names[0]), 'utf8')).toBe('beta content');
|
||||
await activateFiles('campaign', result.deploymentId);
|
||||
expect(await readFile(path(names[0]), 'utf8')).toBe('original content');
|
||||
expect(await readFile(path(names[1]), 'utf8')).toBe('replacement content');
|
||||
expect(db().prepare('SELECT server FROM deployment_servers WHERE deployment_id = ?').all(result.deploymentId)).toEqual([{ server: names[0] }]);
|
||||
|
||||
Reference in New Issue
Block a user