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