Fix rebuild generation reconciliation (Refs #155)

This commit is contained in:
2026-10-14 12:36:32 -04:00
parent 61dbfb2c5f
commit dedf15d9af
17 changed files with 672 additions and 43 deletions
@@ -0,0 +1,26 @@
import { json } from '@sveltejs/kit';
import { reconcileCompletedRebuild } from '$lib/server/provisioning/rebuild-receipt.js';
import { reconcileNativeProvisioningReceipt } from '$lib/server/provisioning/native.js';
import { db } from '$lib/server/db/index.js';
import { recordProgress } from '$lib/server/provisioning/progress.js';
export function POST({ params }: { params: { id: string } }) {
try {
const instance = db().transaction(() => {
const instance = reconcileCompletedRebuild(params.id, true);
reconcileNativeProvisioningReceipt(params.id);
recordProgress(params.id, {
blocker: null,
checks: [],
event: {
kind: 'generation-recovery',
message: `Replacement generation ${instance.generation} reconciled with fresh host inventory. Resume health verification or request a new lifecycle operation.`
}
});
return instance;
})();
return json({ ok: true, generation: instance.generation });
} catch (error) {
return json({ error: (error as Error).message }, { status: 409 });
}
}
+21
View File
@@ -324,6 +324,27 @@
)}.
</p>
</div>{/if}
{#if detail.generationRecovery}<div class="warnings">
<h3>Replacement generation recovery</h3>
<p>
Controller generation {detail.generationRecovery.expectedGeneration};
completed rebuild generation {detail.generationRecovery
.replacementGeneration}; host generation {detail.generationRecovery
.observedGeneration ?? 'unknown'}.
</p>
{#if detail.generationRecovery.reason}<p>
{detail.generationRecovery.reason}
</p>{/if}
{#if writable}<Button
disabled={!!view.busy || !detail.generationRecovery.available}
loading={view.busy === 'reconcile-generation'}
onclick={() =>
controller.act(
'reconcile-generation',
'Replacement generation reconciled. Fresh health verification is required; cancelled operations remain cancelled.'
)}>Reconcile replacement generation</Button
>{/if}
</div>{/if}
{#if writable && (detail.canResumeVerification || detail.canResumeCleanup || detail.canResumeRebuild || detail.canRetryWithRebuild || detail.canCancel || detail.canCancelCreation || canOverride)}
<div class="recovery-actions">
{#if canOverride}<div>