UNPKG

@puls-atlas/cli

Version:

The Puls Atlas CLI tool for managing Atlas projects

93 lines 3.63 kB
import { execFileSync as nodeExecFileSync } from 'child_process'; import { SYNC_RESOURCE_NAMES } from './resourceNames.js'; import { normalizeOptionalString } from '../../utils/value.js'; import { resolveSyncCloudRunDeployConfig } from './deploymentConfig.js'; import { createGcloudRunJobExecuteCommand, getCommandErrorMessage, isGcloudResourceNotFoundError, runGcloudFileCommand } from '../../utils/gcloud.js'; const PULS_ATLAS_SYNC_WORKLOADS_ENV = 'PULS_ATLAS_SYNC_WORKLOADS'; export const resolveSyncBackfillJobDeployment = context => { const cloudRunConfig = resolveSyncCloudRunDeployConfig(context); return { image: cloudRunConfig.backfillJobImage, jobName: SYNC_RESOURCE_NAMES.syncBackfillJob, projectId: context.projectId, region: cloudRunConfig.region }; }; export const inspectSyncBackfillJob = (context, options = {}) => { const { runCommand = nodeExecFileSync } = options; const deployment = resolveSyncBackfillJobDeployment(context); try { const resolvedJobName = runGcloudFileCommand(['run', 'jobs', 'describe', deployment.jobName, `--project=${deployment.projectId}`, `--region=${deployment.region}`, '--format="value(metadata.name)"'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }, runCommand).trim(); return { exists: resolvedJobName.length > 0, jobName: deployment.jobName, projectId: deployment.projectId, region: deployment.region }; } catch (error) { if (isGcloudResourceNotFoundError(error)) { return { exists: false, jobName: deployment.jobName, projectId: deployment.projectId, region: deployment.region }; } throw new Error(`Failed to inspect Atlas sync backfill job ${deployment.jobName} in project ${deployment.projectId}, region ${deployment.region}. ` + `${normalizeOptionalString(getCommandErrorMessage(error)) ?? error.message}`); } }; export const ensureSyncBackfillJobExists = (context, options = {}) => { const inspection = inspectSyncBackfillJob(context, options); if (!inspection.exists) { throw new Error(`Atlas sync backfill job ${inspection.jobName} was not found in project ${inspection.projectId}, region ${inspection.region}. ` + 'Run "atlas sync deploy" to apply the Terraform-managed backfill job workflow before running "atlas sync run backfill --workloads <...>".'); } return inspection; }; export const resolveSyncBackfillJobExecution = ({ context, workloadKeys }) => { const deployment = resolveSyncBackfillJobDeployment(context); const normalizedWorkloadKeys = Array.isArray(workloadKeys) ? workloadKeys.filter(Boolean) : []; const environmentVariables = normalizedWorkloadKeys.length > 0 ? { [PULS_ATLAS_SYNC_WORKLOADS_ENV]: normalizedWorkloadKeys.join(',') } : {}; return { action: 'backfill', environmentVariables, jobName: deployment.jobName, projectId: deployment.projectId, region: deployment.region, workloadKeys: normalizedWorkloadKeys }; }; export const createSyncBackfillJobExecutionCommand = ({ context, workloadKeys }) => { const execution = resolveSyncBackfillJobExecution({ context, workloadKeys }); return { ...execution, ...createGcloudRunJobExecuteCommand({ environmentVariables: execution.environmentVariables, jobName: execution.jobName, projectId: execution.projectId, region: execution.region }) }; }; export default { createSyncBackfillJobExecutionCommand, ensureSyncBackfillJobExists, inspectSyncBackfillJob, resolveSyncBackfillJobDeployment, resolveSyncBackfillJobExecution };