@calltelemetry/cli 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,101 @@
1
+ export declare const APPLIANCE_JOB_SCHEMA_VERSION = 1;
2
+ export declare const DEFAULT_JOB_STALE_AFTER_MS: number;
3
+ export type ApplianceJobKind = 'install' | 'update' | 'validate' | 'render' | 'sync' | 'diff' | 'apply' | 'backup' | 'restore' | 'scale' | 'verify';
4
+ export declare const APPLIANCE_JOB_KINDS: readonly ApplianceJobKind[];
5
+ export type ApplianceJobStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'interrupted';
6
+ export declare const APPLIANCE_JOB_STATUSES: readonly ApplianceJobStatus[];
7
+ export type ApplianceJobStepStatus = 'pending' | 'running' | 'succeeded' | 'failed' | 'skipped';
8
+ export declare const APPLIANCE_JOB_STEP_STATUSES: readonly ApplianceJobStepStatus[];
9
+ export interface ApplianceJobStep {
10
+ name: string;
11
+ status: ApplianceJobStepStatus;
12
+ startedAt?: string;
13
+ finishedAt?: string;
14
+ error?: string;
15
+ }
16
+ export interface ApplianceJob {
17
+ schemaVersion: typeof APPLIANCE_JOB_SCHEMA_VERSION;
18
+ id: string;
19
+ kind: ApplianceJobKind;
20
+ status: ApplianceJobStatus;
21
+ createdAt: string;
22
+ updatedAt: string;
23
+ startedAt?: string;
24
+ finishedAt?: string;
25
+ steps: ApplianceJobStep[];
26
+ error?: string;
27
+ metadata?: Record<string, string | number | boolean>;
28
+ }
29
+ export interface ApplianceJobValidation {
30
+ valid: boolean;
31
+ errors: string[];
32
+ }
33
+ export declare class ApplianceJobValidationError extends Error {
34
+ readonly errors: string[];
35
+ constructor(errors: string[]);
36
+ }
37
+ export declare function validateApplianceJob(job: unknown): ApplianceJobValidation;
38
+ export declare function assertValidApplianceJob(job: unknown): asserts job is ApplianceJob;
39
+ /** Resolve the per-install job state directory. */
40
+ export declare function resolveJobStateDir(installDir: string): string;
41
+ export declare function resolveJobRecordPath(jobDir: string, id: string): string;
42
+ export interface CreateApplianceJobInput {
43
+ kind: ApplianceJobKind;
44
+ steps: string[];
45
+ id?: string;
46
+ metadata?: Record<string, unknown>;
47
+ now?: Date;
48
+ }
49
+ /** Create a validated `queued` job record without writing it. */
50
+ export declare function createApplianceJob(input: CreateApplianceJobInput): ApplianceJob;
51
+ /** Persist a validated job record as mode-0600 JSON. */
52
+ export declare function saveApplianceJob(job: ApplianceJob, jobDir: string): Promise<void>;
53
+ /** Load one job record. Missing files return null; invalid files throw. */
54
+ export declare function loadApplianceJob(jobDir: string, id: string): ApplianceJob | null;
55
+ /** List every valid job record, oldest first. */
56
+ export declare function listApplianceJobs(jobDir: string): ApplianceJob[];
57
+ /** Return the currently running job, if any. */
58
+ export declare function findRunningApplianceJob(jobDir: string): ApplianceJob | null;
59
+ /**
60
+ * Mark jobs left `running` by a killed process as `interrupted`. A running
61
+ * step is rewound to `pending` so `resumeApplianceJob` can retry it.
62
+ */
63
+ export declare function recoverInterruptedApplianceJobs(jobDir: string, options?: {
64
+ now?: Date;
65
+ staleAfterMs?: number;
66
+ }): Promise<ApplianceJob[]>;
67
+ export interface ApplianceJobExecutionContext {
68
+ job: ApplianceJob;
69
+ step: ApplianceJobStep;
70
+ index: number;
71
+ }
72
+ export type ApplianceJobExecutor = (context: ApplianceJobExecutionContext) => Promise<void>;
73
+ interface JobRunHooks {
74
+ jobDir: string;
75
+ logPath?: string;
76
+ now?: () => Date;
77
+ metadata?: Record<string, unknown>;
78
+ }
79
+ /**
80
+ * Create, persist, and execute a job step-by-step. The record is written
81
+ * before each step and after every transition. A thrown executor error
82
+ * leaves a persisted `failed` record and is rethrown to the caller.
83
+ */
84
+ export declare function runApplianceJob(options: JobRunHooks & {
85
+ kind: ApplianceJobKind;
86
+ steps: string[];
87
+ executor: ApplianceJobExecutor;
88
+ id?: string;
89
+ }): Promise<ApplianceJob>;
90
+ export interface ResumeApplianceJobOptions extends JobRunHooks {
91
+ id: string;
92
+ executor: ApplianceJobExecutor;
93
+ }
94
+ /**
95
+ * Resume a queued, interrupted, or failed job. Completed/skipped steps are
96
+ * preserved; a step left `running` is retried; a failed step is reset to
97
+ * `pending`.
98
+ */
99
+ export declare function resumeApplianceJob(options: ResumeApplianceJobOptions): Promise<ApplianceJob>;
100
+ export {};
101
+ //# sourceMappingURL=appliance-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance-orchestrator.d.ts","sourceRoot":"","sources":["../../../src/lib/k8s/appliance-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,496 @@
1
+ /**
2
+ * Persistent orchestration state for appliance Kubernetes jobs.
3
+ *
4
+ * `ct k8s sync|diff|apply` (and the future `ct update` k3s path) are
5
+ * multi-step operations. This module gives them a durable job record:
6
+ *
7
+ * - the job and every step are validated before they are written;
8
+ * - state is persisted after each transition, so a killed process leaves
9
+ * an auditable `running` record that the next invocation marks
10
+ * `interrupted`;
11
+ * - an interrupted job can be resumed without re-running steps that
12
+ * already succeeded;
13
+ * - every transition is mirrored into the append-only job log.
14
+ *
15
+ * Execution is injected. This module never runs helmfile or touches a live
16
+ * cluster by itself, which keeps validation and persistence testable.
17
+ */
18
+ import { randomUUID } from 'node:crypto';
19
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ import { mkdirSafe, writeFileSafe } from '../fs.js';
22
+ import { appendJobLogEvent, createJobLogEvent, readJobLog, redactJobLogDetails, } from './appliance-job-logger.js';
23
+ export const APPLIANCE_JOB_SCHEMA_VERSION = 1;
24
+ export const DEFAULT_JOB_STALE_AFTER_MS = 30 * 60 * 1000;
25
+ export const APPLIANCE_JOB_KINDS = [
26
+ 'install',
27
+ 'update',
28
+ 'validate',
29
+ 'render',
30
+ 'sync',
31
+ 'diff',
32
+ 'apply',
33
+ 'backup',
34
+ 'restore',
35
+ 'scale',
36
+ 'verify',
37
+ ];
38
+ export const APPLIANCE_JOB_STATUSES = [
39
+ 'queued',
40
+ 'running',
41
+ 'succeeded',
42
+ 'failed',
43
+ 'interrupted',
44
+ ];
45
+ export const APPLIANCE_JOB_STEP_STATUSES = [
46
+ 'pending',
47
+ 'running',
48
+ 'succeeded',
49
+ 'failed',
50
+ 'skipped',
51
+ ];
52
+ export class ApplianceJobValidationError extends Error {
53
+ errors;
54
+ constructor(errors) {
55
+ super(`Invalid appliance job: ${errors.join('; ')}`);
56
+ this.name = 'ApplianceJobValidationError';
57
+ this.errors = errors;
58
+ }
59
+ }
60
+ const JOB_ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
61
+ const STEP_NAME = /^[a-z][a-z0-9._-]{0,63}$/;
62
+ const METADATA_KEY = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
63
+ const MAX_STEPS = 50;
64
+ const MAX_ERROR_LENGTH = 4096;
65
+ function isIsoTimestamp(value) {
66
+ return typeof value === 'string' && Number.isFinite(Date.parse(value));
67
+ }
68
+ function hasControlCharacter(value) {
69
+ // eslint-disable-next-line no-control-regex
70
+ return /[\u0000-\u001f\u007f]/.test(value);
71
+ }
72
+ export function validateApplianceJob(job) {
73
+ const errors = [];
74
+ if (typeof job !== 'object' || job === null || Array.isArray(job)) {
75
+ return { valid: false, errors: ['job must be an object'] };
76
+ }
77
+ const value = job;
78
+ if (value.schemaVersion !== APPLIANCE_JOB_SCHEMA_VERSION) {
79
+ errors.push(`schemaVersion must be ${APPLIANCE_JOB_SCHEMA_VERSION}`);
80
+ }
81
+ if (typeof value.id !== 'string' || !JOB_ID.test(value.id)) {
82
+ errors.push('id must be a 1-128 character job identifier');
83
+ }
84
+ if (typeof value.kind !== 'string' ||
85
+ !APPLIANCE_JOB_KINDS.includes(value.kind)) {
86
+ errors.push(`kind must be one of ${APPLIANCE_JOB_KINDS.join(', ')}`);
87
+ }
88
+ if (typeof value.status !== 'string' ||
89
+ !APPLIANCE_JOB_STATUSES.includes(value.status)) {
90
+ errors.push(`status must be one of ${APPLIANCE_JOB_STATUSES.join(', ')}`);
91
+ }
92
+ if (!isIsoTimestamp(value.createdAt))
93
+ errors.push('createdAt must be an ISO timestamp');
94
+ if (!isIsoTimestamp(value.updatedAt))
95
+ errors.push('updatedAt must be an ISO timestamp');
96
+ if (isIsoTimestamp(value.createdAt) && isIsoTimestamp(value.updatedAt)) {
97
+ if (Date.parse(value.updatedAt) < Date.parse(value.createdAt)) {
98
+ errors.push('updatedAt must not be earlier than createdAt');
99
+ }
100
+ }
101
+ if (value.startedAt !== undefined && !isIsoTimestamp(value.startedAt)) {
102
+ errors.push('startedAt must be an ISO timestamp');
103
+ }
104
+ if (value.finishedAt !== undefined && !isIsoTimestamp(value.finishedAt)) {
105
+ errors.push('finishedAt must be an ISO timestamp');
106
+ }
107
+ if (isIsoTimestamp(value.startedAt) && isIsoTimestamp(value.finishedAt)) {
108
+ if (Date.parse(value.finishedAt) < Date.parse(value.startedAt)) {
109
+ errors.push('finishedAt must not be earlier than startedAt');
110
+ }
111
+ }
112
+ if (value.status === 'queued') {
113
+ if (value.startedAt !== undefined)
114
+ errors.push('queued job must not have startedAt');
115
+ if (value.finishedAt !== undefined)
116
+ errors.push('queued job must not have finishedAt');
117
+ }
118
+ else if (value.status === 'running') {
119
+ if (value.startedAt === undefined)
120
+ errors.push('running job must have startedAt');
121
+ if (value.finishedAt !== undefined)
122
+ errors.push('running job must not have finishedAt');
123
+ }
124
+ else if (value.status === 'succeeded' || value.status === 'failed') {
125
+ if (value.startedAt === undefined)
126
+ errors.push(`${value.status} job must have startedAt`);
127
+ if (value.finishedAt === undefined)
128
+ errors.push(`${value.status} job must have finishedAt`);
129
+ }
130
+ else if (value.status === 'interrupted') {
131
+ if (value.finishedAt !== undefined)
132
+ errors.push('interrupted job must not have finishedAt');
133
+ }
134
+ if (value.error !== undefined) {
135
+ if (typeof value.error !== 'string' ||
136
+ value.error.length === 0 ||
137
+ value.error.length > MAX_ERROR_LENGTH ||
138
+ hasControlCharacter(value.error)) {
139
+ errors.push(`error must be a single line of 1-${MAX_ERROR_LENGTH} characters`);
140
+ }
141
+ }
142
+ if (value.metadata !== undefined) {
143
+ if (typeof value.metadata !== 'object' || value.metadata === null || Array.isArray(value.metadata)) {
144
+ errors.push('metadata must be an object');
145
+ }
146
+ else {
147
+ for (const [key, detail] of Object.entries(value.metadata)) {
148
+ if (!METADATA_KEY.test(key) || ['__proto__', 'constructor', 'prototype'].includes(key)) {
149
+ errors.push(`metadata.${key} is not a valid key`);
150
+ continue;
151
+ }
152
+ const scalar = typeof detail === 'string' || typeof detail === 'boolean' || Number.isFinite(detail);
153
+ if (!scalar)
154
+ errors.push(`metadata.${key} must be a string, number, or boolean`);
155
+ else if (typeof detail === 'string' && (detail.length > 1024 || hasControlCharacter(detail))) {
156
+ errors.push(`metadata.${key} must be a single line of at most 1024 characters`);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ if (!Array.isArray(value.steps) || value.steps.length === 0) {
162
+ errors.push('steps must be a non-empty array');
163
+ }
164
+ else if (value.steps.length > MAX_STEPS) {
165
+ errors.push(`steps must contain at most ${MAX_STEPS} entries`);
166
+ }
167
+ else {
168
+ const seen = new Set();
169
+ value.steps.forEach((step, index) => {
170
+ if (typeof step !== 'object' || step === null || Array.isArray(step)) {
171
+ errors.push(`steps[${index}] must be an object`);
172
+ return;
173
+ }
174
+ if (typeof step.name !== 'string' || !STEP_NAME.test(step.name)) {
175
+ errors.push(`steps[${index}].name must be a lowercase step identifier`);
176
+ }
177
+ else if (seen.has(step.name)) {
178
+ errors.push(`steps[${index}].name duplicates ${step.name}`);
179
+ }
180
+ else {
181
+ seen.add(step.name);
182
+ }
183
+ if (typeof step.status !== 'string' ||
184
+ !APPLIANCE_JOB_STEP_STATUSES.includes(step.status)) {
185
+ errors.push(`steps[${index}].status is invalid`);
186
+ }
187
+ if (step.startedAt !== undefined && !isIsoTimestamp(step.startedAt)) {
188
+ errors.push(`steps[${index}].startedAt must be an ISO timestamp`);
189
+ }
190
+ if (step.finishedAt !== undefined && !isIsoTimestamp(step.finishedAt)) {
191
+ errors.push(`steps[${index}].finishedAt must be an ISO timestamp`);
192
+ }
193
+ if (step.status === 'running' && step.startedAt === undefined) {
194
+ errors.push(`steps[${index}] running step must have startedAt`);
195
+ }
196
+ if ((step.status === 'succeeded' || step.status === 'failed' || step.status === 'skipped') &&
197
+ step.finishedAt === undefined) {
198
+ errors.push(`steps[${index}] ${step.status} step must have finishedAt`);
199
+ }
200
+ if (step.error !== undefined && (typeof step.error !== 'string' || step.error.length === 0)) {
201
+ errors.push(`steps[${index}].error must be a non-empty string`);
202
+ }
203
+ });
204
+ if (value.status === 'succeeded') {
205
+ for (const step of value.steps) {
206
+ if (step.status !== 'succeeded' && step.status !== 'skipped') {
207
+ errors.push(`succeeded job has a ${step.status} step: ${step.name}`);
208
+ }
209
+ }
210
+ }
211
+ if (value.status === 'failed') {
212
+ if (!value.steps.some(step => step.status === 'failed')) {
213
+ errors.push('failed job must have at least one failed step');
214
+ }
215
+ }
216
+ }
217
+ return { valid: errors.length === 0, errors };
218
+ }
219
+ export function assertValidApplianceJob(job) {
220
+ const result = validateApplianceJob(job);
221
+ if (!result.valid)
222
+ throw new ApplianceJobValidationError(result.errors);
223
+ }
224
+ /** Resolve the per-install job state directory. */
225
+ export function resolveJobStateDir(installDir) {
226
+ return join(installDir, 'k8s', 'jobs');
227
+ }
228
+ export function resolveJobRecordPath(jobDir, id) {
229
+ if (!JOB_ID.test(id)) {
230
+ throw new ApplianceJobValidationError(['id must be a 1-128 character job identifier']);
231
+ }
232
+ return join(jobDir, `${id}.json`);
233
+ }
234
+ /** Create a validated `queued` job record without writing it. */
235
+ export function createApplianceJob(input) {
236
+ if (!APPLIANCE_JOB_KINDS.includes(input.kind)) {
237
+ throw new ApplianceJobValidationError([`kind must be one of ${APPLIANCE_JOB_KINDS.join(', ')}`]);
238
+ }
239
+ if (!Array.isArray(input.steps) || input.steps.length === 0) {
240
+ throw new ApplianceJobValidationError(['steps must be a non-empty array']);
241
+ }
242
+ const now = input.now ?? new Date();
243
+ const timestamp = now.toISOString();
244
+ const job = {
245
+ schemaVersion: APPLIANCE_JOB_SCHEMA_VERSION,
246
+ id: input.id ?? randomUUID(),
247
+ kind: input.kind,
248
+ status: 'queued',
249
+ createdAt: timestamp,
250
+ updatedAt: timestamp,
251
+ steps: input.steps.map(name => ({ name, status: 'pending' })),
252
+ };
253
+ const metadata = redactJobLogDetails(input.metadata);
254
+ if (metadata)
255
+ job.metadata = metadata;
256
+ assertValidApplianceJob(job);
257
+ return job;
258
+ }
259
+ /** Persist a validated job record as mode-0600 JSON. */
260
+ export async function saveApplianceJob(job, jobDir) {
261
+ assertValidApplianceJob(job);
262
+ await mkdirSafe(jobDir);
263
+ const path = resolveJobRecordPath(jobDir, job.id);
264
+ await writeFileSafe(path, JSON.stringify(job, null, 2) + '\n', { mode: 0o600 });
265
+ }
266
+ /** Load one job record. Missing files return null; invalid files throw. */
267
+ export function loadApplianceJob(jobDir, id) {
268
+ const path = resolveJobRecordPath(jobDir, id);
269
+ if (!existsSync(path))
270
+ return null;
271
+ let parsed;
272
+ try {
273
+ parsed = JSON.parse(readFileSync(path, 'utf-8'));
274
+ }
275
+ catch (err) {
276
+ throw new ApplianceJobValidationError([`could not parse ${path}: ${err.message}`]);
277
+ }
278
+ assertValidApplianceJob(parsed);
279
+ return parsed;
280
+ }
281
+ /** List every valid job record, oldest first. */
282
+ export function listApplianceJobs(jobDir) {
283
+ if (!existsSync(jobDir))
284
+ return [];
285
+ const jobs = [];
286
+ for (const name of readdirSync(jobDir)) {
287
+ if (!name.endsWith('.json'))
288
+ continue;
289
+ const id = name.slice(0, -'.json'.length);
290
+ const job = loadApplianceJob(jobDir, id);
291
+ if (job)
292
+ jobs.push(job);
293
+ }
294
+ return jobs.sort((a, b) => {
295
+ const byCreated = a.createdAt.localeCompare(b.createdAt);
296
+ return byCreated !== 0 ? byCreated : a.id.localeCompare(b.id);
297
+ });
298
+ }
299
+ /** Return the currently running job, if any. */
300
+ export function findRunningApplianceJob(jobDir) {
301
+ return listApplianceJobs(jobDir).find(job => job.status === 'running') ?? null;
302
+ }
303
+ /**
304
+ * Mark jobs left `running` by a killed process as `interrupted`. A running
305
+ * step is rewound to `pending` so `resumeApplianceJob` can retry it.
306
+ */
307
+ export async function recoverInterruptedApplianceJobs(jobDir, options = {}) {
308
+ const now = options.now ?? new Date();
309
+ const staleAfterMs = options.staleAfterMs ?? DEFAULT_JOB_STALE_AFTER_MS;
310
+ const recovered = [];
311
+ for (const job of listApplianceJobs(jobDir)) {
312
+ if (job.status !== 'running')
313
+ continue;
314
+ const reference = Date.parse(job.startedAt ?? job.updatedAt);
315
+ if (Number.isFinite(reference) && now.getTime() - reference < staleAfterMs)
316
+ continue;
317
+ const next = {
318
+ ...job,
319
+ status: 'interrupted',
320
+ updatedAt: now.toISOString(),
321
+ error: 'process exited before the job finished',
322
+ steps: job.steps.map(step => step.status === 'running' ? { ...step, status: 'pending', startedAt: undefined } : step),
323
+ };
324
+ assertValidApplianceJob(next);
325
+ await saveApplianceJob(next, jobDir);
326
+ recovered.push(next);
327
+ }
328
+ return recovered;
329
+ }
330
+ class JobLogWriter {
331
+ jobId;
332
+ logPath;
333
+ seq;
334
+ constructor(jobId, logPath) {
335
+ this.jobId = jobId;
336
+ this.logPath = logPath;
337
+ // Resume the sequence after a restart instead of restarting at zero.
338
+ let next = 0;
339
+ if (logPath) {
340
+ try {
341
+ for (const event of readJobLog(logPath).events) {
342
+ if (event.jobId === jobId)
343
+ next = Math.max(next, event.seq + 1);
344
+ }
345
+ }
346
+ catch {
347
+ next = 0;
348
+ }
349
+ }
350
+ this.seq = next;
351
+ }
352
+ async write(phase, message, level = 'info', details, now) {
353
+ if (!this.logPath)
354
+ return null;
355
+ const event = createJobLogEvent({
356
+ jobId: this.jobId,
357
+ seq: this.seq++,
358
+ phase,
359
+ message,
360
+ level,
361
+ details,
362
+ now,
363
+ });
364
+ await appendJobLogEvent(this.logPath, event);
365
+ return event;
366
+ }
367
+ }
368
+ async function executePendingSteps(initial, executor, hooks) {
369
+ const clock = hooks.now ?? (() => new Date());
370
+ const log = new JobLogWriter(initial.id, hooks.logPath);
371
+ let job = {
372
+ ...initial,
373
+ status: 'running',
374
+ startedAt: initial.startedAt ?? clock().toISOString(),
375
+ updatedAt: clock().toISOString(),
376
+ error: undefined,
377
+ };
378
+ assertValidApplianceJob(job);
379
+ await saveApplianceJob(job, hooks.jobDir);
380
+ await log.write('job', `started ${job.kind}`, 'info', { kind: job.kind }, clock());
381
+ for (let index = 0; index < job.steps.length; index++) {
382
+ const step = job.steps[index];
383
+ if (step.status === 'succeeded' || step.status === 'skipped')
384
+ continue;
385
+ const startedAt = clock().toISOString();
386
+ job = {
387
+ ...job,
388
+ updatedAt: startedAt,
389
+ steps: job.steps.map((candidate, candidateIndex) => candidateIndex === index
390
+ ? { ...candidate, status: 'running', startedAt, finishedAt: undefined, error: undefined }
391
+ : candidate),
392
+ };
393
+ assertValidApplianceJob(job);
394
+ await saveApplianceJob(job, hooks.jobDir);
395
+ await log.write('step', `started ${step.name}`, 'info', { step: step.name }, clock());
396
+ try {
397
+ await executor({ job, step: job.steps[index], index });
398
+ }
399
+ catch (err) {
400
+ const message = err?.message ? String(err.message).split('\n')[0] : 'step failed';
401
+ const finishedAt = clock().toISOString();
402
+ job = {
403
+ ...job,
404
+ status: 'failed',
405
+ updatedAt: finishedAt,
406
+ finishedAt,
407
+ error: message.slice(0, MAX_ERROR_LENGTH),
408
+ steps: job.steps.map((candidate, candidateIndex) => candidateIndex === index
409
+ ? {
410
+ ...candidate,
411
+ status: 'failed',
412
+ finishedAt,
413
+ error: message.slice(0, MAX_ERROR_LENGTH),
414
+ }
415
+ : candidate),
416
+ };
417
+ assertValidApplianceJob(job);
418
+ await saveApplianceJob(job, hooks.jobDir);
419
+ await log.write('step', `failed ${step.name}: ${message}`, 'error', { step: step.name }, clock());
420
+ throw err;
421
+ }
422
+ const finishedAt = clock().toISOString();
423
+ job = {
424
+ ...job,
425
+ updatedAt: finishedAt,
426
+ steps: job.steps.map((candidate, candidateIndex) => candidateIndex === index
427
+ ? { ...candidate, status: 'succeeded', finishedAt }
428
+ : candidate),
429
+ };
430
+ assertValidApplianceJob(job);
431
+ await saveApplianceJob(job, hooks.jobDir);
432
+ await log.write('step', `completed ${step.name}`, 'info', { step: step.name }, clock());
433
+ }
434
+ const finishedAt = clock().toISOString();
435
+ job = {
436
+ ...job,
437
+ status: 'succeeded',
438
+ updatedAt: finishedAt,
439
+ finishedAt,
440
+ };
441
+ assertValidApplianceJob(job);
442
+ await saveApplianceJob(job, hooks.jobDir);
443
+ await log.write('job', `completed ${job.kind}`, 'info', { kind: job.kind }, clock());
444
+ return job;
445
+ }
446
+ /**
447
+ * Create, persist, and execute a job step-by-step. The record is written
448
+ * before each step and after every transition. A thrown executor error
449
+ * leaves a persisted `failed` record and is rethrown to the caller.
450
+ */
451
+ export async function runApplianceJob(options) {
452
+ const job = createApplianceJob({
453
+ kind: options.kind,
454
+ steps: options.steps,
455
+ id: options.id,
456
+ metadata: options.metadata,
457
+ now: options.now?.(),
458
+ });
459
+ await saveApplianceJob(job, options.jobDir);
460
+ return executePendingSteps(job, options.executor, options);
461
+ }
462
+ /**
463
+ * Resume a queued, interrupted, or failed job. Completed/skipped steps are
464
+ * preserved; a step left `running` is retried; a failed step is reset to
465
+ * `pending`.
466
+ */
467
+ export async function resumeApplianceJob(options) {
468
+ const existing = loadApplianceJob(options.jobDir, options.id);
469
+ if (!existing)
470
+ throw new Error(`job ${options.id} not found in ${options.jobDir}`);
471
+ if (existing.status === 'succeeded')
472
+ return existing;
473
+ if (existing.status === 'running') {
474
+ throw new ApplianceJobValidationError([`job ${existing.id} is already running`]);
475
+ }
476
+ const now = (options.now ?? (() => new Date()))().toISOString();
477
+ const steps = existing.steps.map(step => {
478
+ if (step.status === 'running' || step.status === 'failed') {
479
+ return { ...step, status: 'pending', startedAt: undefined, finishedAt: undefined, error: undefined };
480
+ }
481
+ return step;
482
+ });
483
+ const resumed = {
484
+ ...existing,
485
+ status: 'queued',
486
+ startedAt: undefined,
487
+ finishedAt: undefined,
488
+ error: undefined,
489
+ updatedAt: now,
490
+ steps,
491
+ };
492
+ assertValidApplianceJob(resumed);
493
+ await saveApplianceJob(resumed, options.jobDir);
494
+ return executePendingSteps(resumed, options.executor, options);
495
+ }
496
+ //# sourceMappingURL=appliance-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance-orchestrator.js","sourceRoot":"","sources":["../../../src/lib/k8s/appliance-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Kubernetes appliance orchestration: inventory, durable job log, and
3
+ * resumable job state.
4
+ */
5
+ export * from './appliance-info.js';
6
+ export * from './appliance-job-logger.js';
7
+ export * from './appliance-orchestrator.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/k8s/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Kubernetes appliance orchestration: inventory, durable job log, and
3
+ * resumable job state.
4
+ */
5
+ export * from './appliance-info.js';
6
+ export * from './appliance-job-logger.js';
7
+ export * from './appliance-orchestrator.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/k8s/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC"}