@puls-atlas/cli
Version:
The Puls Atlas CLI tool for managing Atlas projects
93 lines • 3.63 kB
JavaScript
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
};