UNPKG

@puls-atlas/cli

Version:

The Puls Atlas CLI tool for managing Atlas projects

73 lines 3.33 kB
import { resolveProjectSelection } from '../../utils/feature.js'; import { logger } from '../../utils/index.js'; import { readJsonFile, writeJsonFile } from '../../utils/file.js'; import { validateSearchRootSection } from './config/searchValidation.js'; import { promoteSearchReleaseConfig } from './release.js'; import { applySearchProjectConfigPatch, DEFAULT_SEARCH_WORKLOAD_TERRAFORM_ROOT_DIR, hasSearchProjectConfigs, resolveSearchConfigLocation, resolveSearchProjectConfig } from './config/searchConfig.js'; export const runSearchReleasePromote = async (options = {}, dependencies = {}, cwd = process.cwd()) => { const loggerImpl = dependencies.logger ?? logger; const readJsonFileImpl = dependencies.readJsonFile ?? readJsonFile; const resolveProjectSelectionImpl = dependencies.resolveProjectSelection ?? resolveProjectSelection; const writeJsonFileImpl = dependencies.writeJsonFile ?? writeJsonFile; const resolveSearchConfigLocationImpl = dependencies.resolveSearchConfigLocation ?? resolveSearchConfigLocation; const spinner = loggerImpl.spinner('Promoting Atlas search release...'); try { const configLocation = resolveSearchConfigLocationImpl(cwd); const { configPath } = configLocation; const searchConfig = readJsonFileImpl(configPath, { allowMissing: true }); if (!searchConfig) { throw new Error(`Atlas search config is missing. Expected ${configPath}.`); } const defaultTerraformRootDir = DEFAULT_SEARCH_WORKLOAD_TERRAFORM_ROOT_DIR; const hasProjectScopedConfig = hasSearchProjectConfigs(searchConfig); const projectSelection = hasProjectScopedConfig ? await resolveProjectSelectionImpl(options) : null; const resolvedSearchConfig = hasProjectScopedConfig ? resolveSearchProjectConfig(searchConfig, projectSelection.projectId, { defaultTerraformRootDir, projectId: projectSelection.projectId, terraformRootDir: defaultTerraformRootDir }).config : validateSearchRootSection(searchConfig); const previousReleaseConfig = resolvedSearchConfig.release; const nextReleaseConfig = promoteSearchReleaseConfig(previousReleaseConfig); const nextSearchConfig = hasProjectScopedConfig ? applySearchProjectConfigPatch(searchConfig, projectSelection.projectId, { environment: projectSelection.environment ?? undefined, release: nextReleaseConfig }, { projectId: projectSelection.projectId, terraformRootDir: defaultTerraformRootDir }) : { ...searchConfig, release: nextReleaseConfig }; writeJsonFileImpl(configPath, nextSearchConfig); spinner.succeed('Atlas search release promoted.'); loggerImpl.summary('Release state', [{ label: 'Config', value: configPath }, { label: 'Active release', tone: 'success', value: nextReleaseConfig.active }, { label: 'Candidate release', tone: 'muted', value: 'cleared' }]); return { configPath, previousRelease: previousReleaseConfig, release: nextReleaseConfig, status: 'promoted' }; } catch (error) { spinner.fail('Failed to promote Atlas search release.'); loggerImpl.error(error.message, false); return { status: 'failed' }; } }; export default async (options = {}) => runSearchReleasePromote(options);