Fix native provisioning scheduling and progress reporting
This commit is contained in:
@@ -1,8 +1,17 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { reportHostOperation } from '$lib/server/hosts/index.js';
|
||||
import { authenticateAgent, hostApiError, objectBody } from '$lib/server/hosts/http.js';
|
||||
import { kickProvisioning } from '$lib/server/pipeline/worker.js';
|
||||
export async function POST({ request, params }: { request: Request; params: { id: string } }) {
|
||||
const host = authenticateAgent(request);
|
||||
try { const body = await objectBody(request, 128 * 1024 * 1024); const operation = reportHostOperation(host.id, params.id, { state: body.state, result: body.result, error: body.error }); return json({ operation: { id: operation.id, state: operation.state } }); }
|
||||
try {
|
||||
const body = await objectBody(request, 128 * 1024 * 1024);
|
||||
const operation = reportHostOperation(host.id, params.id, { state: body.state, result: body.result, error: body.error });
|
||||
if (['completed', 'failed', 'unknown'].includes(operation.state)
|
||||
&& (operation.kind.startsWith('instance.') && operation.kind !== 'instance.inspect' || operation.kind === 'files.stage')) {
|
||||
void kickProvisioning().catch(error => console.error('[agent] provisioning wake failed:', error));
|
||||
}
|
||||
return json({ operation: { id: operation.id, state: operation.state } });
|
||||
}
|
||||
catch (cause) { return hostApiError(cause); }
|
||||
}
|
||||
|
||||
@@ -112,6 +112,29 @@
|
||||
<div class="detail-grid">
|
||||
<div class="execution-column"><ProvisioningProgress {detail} /><ProvisioningActivity {detail} /></div>
|
||||
<aside class="context-column" aria-label="Operation context">
|
||||
{#if detail.agentOperation}
|
||||
<Card as="section" padding="md" ariaLabel="Host agent execution"><div class="context-section">
|
||||
<h2>Host agent execution</h2>
|
||||
<dl class="metadata">
|
||||
<div><dt>Agent state</dt><dd>{detail.agentOperation.state}</dd></div>
|
||||
<div><dt>Command queued</dt><dd>{fmt(detail.agentOperation.createdAt)}</dd></div>
|
||||
<div><dt>Latest agent report</dt><dd>{fmt(detail.agentOperation.updatedAt)}</dd></div>
|
||||
<div><dt>Command ID</dt><dd><code>{detail.agentOperation.id}</code></dd></div>
|
||||
</dl>
|
||||
{#if detail.agentOperation.error}<p>{detail.agentOperation.error}</p>{/if}
|
||||
{#if outcome.active && detail.agentOperation.state === 'completed'}<p>The agent finished its command. EC is verifying readiness.</p>{/if}
|
||||
<a href={`/hosts/${encodeURIComponent(detail.agentOperation.hostId)}`}>View host operation history</a>
|
||||
</div></Card>
|
||||
{/if}
|
||||
{#if outcome.active && detail.workerActivity}
|
||||
<Card as="section" padding="md" ariaLabel="Controller activity"><div class="context-section">
|
||||
<h2>Controller activity</h2>
|
||||
<p>Current work and elapsed time. Background scans run independently of provisioning.</p>
|
||||
{#if detail.workerActivity.length}<ul class="related">
|
||||
{#each detail.workerActivity as work (work.key)}<li><strong>{work.label}</strong><span>{elapsedTime(work.startedAt, Date.parse(detail.generatedAt))}</span></li>{/each}
|
||||
</ul>{:else}<p>Waiting for the next provisioning pass.</p>{/if}
|
||||
</div></Card>
|
||||
{/if}
|
||||
<Card as="section" padding="md" ariaLabel="Operation details">
|
||||
<div class="context-section"><h2>Operation details</h2><dl class="metadata">
|
||||
<div><dt>Requested by</dt><dd>{deployment.triggered_by}</dd></div>
|
||||
|
||||
Reference in New Issue
Block a user