36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import { db } from '../db/index.js';
|
|
|
|
/** Maintenance must leave pending lifecycle work and retained recovery to Provisioning. */
|
|
export function hasActiveProvisioning(server: string, exceptOperationId = ''): boolean {
|
|
return (
|
|
!!db()
|
|
.prepare(
|
|
`SELECT 1 FROM server_deployments
|
|
WHERE server = ? AND server_deleted_at IS NULL AND id != ?
|
|
AND state IN ('queued', 'waiting', 'running', 'awaiting-health') LIMIT 1`
|
|
)
|
|
.get(server, exceptOperationId) ||
|
|
!!db()
|
|
.prepare(
|
|
`SELECT 1 FROM restart_rollout WHERE server = ? AND healthy_at IS NULL
|
|
AND (operation_id IS NULL OR operation_id != ?)`
|
|
)
|
|
.get(server, exceptOperationId)
|
|
);
|
|
}
|
|
|
|
/** Only the latest lifecycle operation can describe the current server. */
|
|
export function isProvisioning(server: string): boolean {
|
|
const operation = db()
|
|
.prepare(
|
|
`SELECT action, state FROM server_deployments
|
|
WHERE server = ? AND server_deleted_at IS NULL ORDER BY rowid DESC LIMIT 1`
|
|
)
|
|
.get(server) as { action: string; state: string } | undefined;
|
|
return (
|
|
!!operation &&
|
|
['create', 'rebuild', 'start'].includes(operation.action) &&
|
|
['queued', 'running', 'awaiting-health'].includes(operation.state)
|
|
);
|
|
}
|