import React from 'react'; import type { IStageConfigProps, IStageTypeConfig } from '@spinnaker/core'; import { MapEditor, PipelineConfigService, Registry, StageConfigField, StageConstants } from '@spinnaker/core'; type StageRefId = string | number; function toggleConsideredStage(current: StageRefId[], refId: StageRefId, checked: boolean): StageRefId[] { if (checked && !current.includes(refId)) { return [...current, refId]; } if (!checked) { return current.filter((candidate) => candidate !== refId); } return current; } export function AwsTagImageStageConfig({ pipeline, stage, updateStageField }: IStageConfigProps) { const consideredStages: StageRefId[] = stage.consideredStages || []; const imageProducingStages = PipelineConfigService.getAllUpstreamDependencies( pipeline, stage, ).filter((upstreamStage) => StageConstants.IMAGE_PRODUCING_STAGES.includes(upstreamStage.type)); const availableRefIds = new Set(imageProducingStages.map((upstreamStage) => upstreamStage.refId)); const staleRefIds = consideredStages.filter((refId) => !availableRefIds.has(refId)); React.useEffect(() => { const defaults: Record = {}; if (stage.cloudProvider === undefined) { defaults.cloudProvider = 'aws'; } if (stage.tags === undefined) { defaults.tags = {}; } if (Object.keys(defaults).length) { updateStageField(defaults); } }, [stage.cloudProvider, stage.tags, updateStageField]); return (
updateStageField({ tags })} pipeline={pipeline} />
{imageProducingStages.map((upstreamStage) => ( ))} {staleRefIds.map((refId) => ( ))}
); } export const awsTagImageStage = { key: 'upsertImageTags', provides: 'upsertImageTags', cloudProvider: 'aws', component: AwsTagImageStageConfig, } as IStageTypeConfig; export function registerAwsTagImageStage() { Registry.pipeline.registerStage(awsTagImageStage); } registerAwsTagImageStage();