Files
electric-cherry/src/lib/provisioning-detail.ts
T

122 lines
3.9 KiB
TypeScript

import type { ProvisioningAction } from './provisioning.js';
import type { LaunchRecipeSummary } from './deployment-plan.js';
export const provisioningPhases = ['requested', 'eligibility', 'startup-queue', 'prepare', 'create-deployment',
'container-action', 'remove-container', 'delete-deployment', 'cleanup', 'verify-container', 'verify-game',
'verify-map', 'verify-plutonium', 'verify-stopped'] as const;
export type ProvisioningPhase = typeof provisioningPhases[number];
export type EvidenceResult = 'pass' | 'waiting' | 'fail' | 'unknown';
export type EvidenceSource = 'komodo' | 'rcon' | 'telemetry' | 'combined' | 'manifest' | null;
export interface ProvisioningCheck {
key: 'container' | 'game' | 'map' | 'plutonium-release' | 'plutonium-version' | 'occupancy' | 'stopped';
label: string;
result: EvidenceResult;
source: EvidenceSource;
checkedAt: string;
receivedAt: string | null;
expected: string | number | null;
actual: string | number | null;
message: string | null;
}
export interface ProvisioningBlocker {
code: string;
message: string;
automatic: boolean;
href?: string | null;
label?: string | null;
}
export interface ProvisioningCheckpoint {
key: string;
label: string;
at: string;
phase: ProvisioningPhase | null;
}
export interface RecoveryObservation {
state: 'held' | 'released' | 'transferred' | 'unknown';
at: string;
message: string;
operationId?: string | null;
}
export interface ProvisioningProgress {
version: 1;
phase: ProvisioningPhase | null;
phaseStartedAt: string | null;
observedAt: string | null;
blocker: ProvisioningBlocker | null;
checks: ProvisioningCheck[];
checkpoints: ProvisioningCheckpoint[];
command: { state: 'attempted' | 'accepted' | 'rejected' | 'uncertain'; at: string; message: string } | null;
recovery: RecoveryObservation | null;
recipeStatus: 'queued' | 'attempted' | null;
}
export interface ProvisioningEvent {
id: number;
created_at: string;
message: string;
kind?: string | null;
phase_key?: string | null;
details_json?: string | null;
}
export interface ProvisioningDeployment {
id: string;
server: string;
server_deleted_at: string | null;
action: ProvisioningAction;
state: string;
stage: string;
started_at: string;
finished_at: string | null;
submitted_at?: string | null;
checked_at?: string | null;
players?: number | null;
triggered_by: string;
error: string | null;
warnings: string;
server_exists: number;
expected_map?: string | null;
}
export interface ProvisioningSource {
kind: 'campaign' | 'beta' | 'maintenance' | 'watchdog';
source_id: string;
server?: string;
label: string;
href: string | null;
}
export interface ProvisioningCapacity {
evaluatedAt: string;
pools: {
kind: 'startup' | 'restart';
limit: number;
used: number;
holders: { id: string | null; server: string }[];
requestOrder: number | null;
ownsSlot: boolean;
}[];
}
export interface ProvisioningDetail {
deployment: ProvisioningDeployment;
events: ProvisioningEvent[];
activity: { total: number; latestId: number | null; failureExcerpt: ProvisioningEvent | null };
sources: ProvisioningSource[];
recipe: LaunchRecipeSummary | null;
blueprintName: string | null;
canResumeVerification: boolean;
canResumeCleanup: boolean;
canResumeRebuild: boolean;
canCancelRemoval: boolean;
collection: { id: string; name: string } | null;
progress: ProvisioningProgress | null;
capacity: ProvisioningCapacity;
warningMessages: string[];
generatedAt: string;
}
export interface ProvisioningEventPage {
events: ProvisioningEvent[];
total: number;
totalEvents: number;
latestId: number | null;
watermark: number;
nextCursor: number | null;
}