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:
@@ -17,7 +17,8 @@ export async function GET({ params }: { params: { id: string } }) {
|
||||
.prepare(
|
||||
`SELECT id, server, verb, rel_path, sha256_before, sha256_after,
|
||||
LENGTH(content_before) AS size_before,
|
||||
LENGTH(content_after) AS size_after
|
||||
LENGTH(content_after) AS size_after,
|
||||
COALESCE((SELECT state FROM staged_file_changes WHERE deployment_file_id = deployment_files.id), 'applied') AS apply_state
|
||||
FROM deployment_files
|
||||
WHERE deployment_id = ?
|
||||
ORDER BY server, rel_path`
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { db } from '$lib/server/db/index.js';
|
||||
import { releaseRestartRequest } from '$lib/server/provisioning/index.js';
|
||||
import { kick } from '$lib/server/pipeline/worker.js';
|
||||
|
||||
export function POST({ params }: { params: { id: string } }) {
|
||||
const changed = db().transaction(() => {
|
||||
const rows = db().prepare(`SELECT ds.server, d.state FROM deployment_servers ds
|
||||
LEFT JOIN server_deployments d ON d.id = ds.provisioning_id
|
||||
WHERE ds.deployment_id = ? AND ds.server_deleted_at IS NULL AND ds.restart_state IN ('held','manual')`)
|
||||
.all(params.id) as { server: string; state: string | null }[];
|
||||
for (const row of rows) {
|
||||
if (row.state && ['failed','interrupted','cancelled'].includes(row.state)) {
|
||||
releaseRestartRequest(row.server, { kind: 'campaign', id: params.id });
|
||||
}
|
||||
}
|
||||
const result = db().prepare(`UPDATE deployment_servers SET restart_state = 'pending', error = NULL
|
||||
WHERE deployment_id = ? AND server_deleted_at IS NULL AND restart_state IN ('held','manual')`).run(params.id);
|
||||
if (result.changes) db().prepare('UPDATE deployments SET finished_at = NULL WHERE id = ?').run(params.id);
|
||||
return result.changes;
|
||||
})();
|
||||
if (!changed) return json({ error: 'This campaign has no held changes to resume.' }, { status: 409 });
|
||||
void kick().catch(err => console.error('[campaign] activation kick failed:', err));
|
||||
return json({ ok: true }, { status: 202 });
|
||||
}
|
||||
Reference in New Issue
Block a user