public void encryptSecureProperties(CruiseConfig preprocessedConfig, PipelineConfig preprocessedPipelineConfig, JobConfig preprocessedJobConfig) { List<PluggableArtifactConfig> artifactConfigs = artifactConfigs().getPluggableArtifactConfigs(); List<PluggableArtifactConfig> preprocessedArtifactConfigs = preprocessedJobConfig.artifactConfigs().getPluggableArtifactConfigs(); artifactConfigs.forEach(artifactConfig -> { artifactConfig.encryptSecureProperties(preprocessedConfig, preprocessedArtifactConfigs.get(artifactConfigs.indexOf(artifactConfig))); }); tasks.forEach(task -> { if (task instanceof FetchPluggableArtifactTask) { ((FetchPluggableArtifactTask) task).encryptSecureProperties(preprocessedConfig, preprocessedPipelineConfig, (FetchPluggableArtifactTask) preprocessedJobConfig.getTasks().get(tasks.indexOf(task))); } }); }
public void encryptSecureProperties(CruiseConfig preprocessedConfig, PipelineTemplateConfig pipelineTemplateConfig) { List<PluggableArtifactConfig> artifactConfigs = artifactConfigs().getPluggableArtifactConfigs(); artifactConfigs.forEach(artifactConfig -> { artifactConfig.encryptSecureProperties(preprocessedConfig, artifactConfig); }); tasks.forEach(task -> { if (task instanceof FetchPluggableArtifactTask) { FetchPluggableArtifactTask fetchPluggableArtifactTask = (FetchPluggableArtifactTask) task; fetchPluggableArtifactTask.encryptSecureProperties(preprocessedConfig, pipelineTemplateConfig); } }); }
private void populateReferences(List<Map<JobConfigIdentifier, List<PluggableArtifactConfig>>> usedByPipelines, PipelineConfig pipelineConfig) { for (StageConfig stage : pipelineConfig) { JobConfigs jobs = stage.getJobs(); for (JobConfig job : jobs) { final List<PluggableArtifactConfig> artifactConfigs = job.artifactConfigs().findByStoreId(profile.getId()); if (!artifactConfigs.isEmpty()) { usedByPipelines.add(Collections.singletonMap(new JobConfigIdentifier(pipelineConfig.name(), stage.name(), job.name()), artifactConfigs)); } } } } }
private void validatePluggableArtifactConfig(JobConfig jobConfig, PipelineConfigSaveValidationContext contextForJobChildren) { for (PluggableArtifactConfig pluggableArtifactConfig : jobConfig.artifactConfigs().getPluggableArtifactConfigs()) { if (!pluggableArtifactConfig.validateTree(contextForJobChildren)) { for (ConfigErrors errors : pluggableArtifactConfig.getAllErrors()) { this.errors().addAll(errors); } } } }
@Test public void shouldEncryptSecurePropertiesInStagesIfPipelineHasStagesDefined() { PipelineConfig pipelineConfig = new PipelineConfig(); StageConfig mockStageConfig = mock(StageConfig.class); pipelineConfig.add(mockStageConfig); JobConfig jobConfig = new JobConfig(new CaseInsensitiveString("job")); jobConfig.artifactConfigs().add(new PluggableArtifactConfig("foo", "bar")); when(mockStageConfig.getJobs()).thenReturn(new JobConfigs(jobConfig)); when(mockStageConfig.name()).thenReturn(new CaseInsensitiveString("stage")); pipelineConfig.encryptSecureProperties(new BasicCruiseConfig(), pipelineConfig); verify(mockStageConfig).encryptSecureProperties(eq(new BasicCruiseConfig()), eq(pipelineConfig), ArgumentMatchers.any(StageConfig.class)); }
@Test public void shouldMigrateAnEmptyArtifactSourceToStar() throws Exception { GoConfigHolder holder = ConfigMigrator.loadWithMigration(configWithArtifactSourceAs("")); CruiseConfig cruiseConfig = holder.config; JobConfig plan = cruiseConfig.jobConfigByName("pipeline", "stage", "job", true); assertThat(plan.artifactConfigs().getBuiltInArtifactConfigs().get(0).getSource(), is("*")); }
@Test public void shouldLoadBuildPlanFromXmlPartial() throws Exception { String buildXmlPartial = "<job name=\"functional\">\n" + " <artifacts>\n" + " <artifact type=\"build\" src=\"artifact1.xml\" dest=\"cruise-output\" />\n" + " </artifacts>\n" + "</job>"; JobConfig build = xmlLoader.fromXmlPartial(buildXmlPartial, JobConfig.class); assertThat(build.name(), is(new CaseInsensitiveString("functional"))); assertThat(build.artifactConfigs().size(), is(1)); }
@Test public void shouldMigrateAnArtifactSourceWithJustWhitespaceToStar() throws Exception { GoConfigHolder holder = ConfigMigrator.loadWithMigration(configWithArtifactSourceAs(" \t ")); CruiseConfig cruiseConfig = holder.config; JobConfig plan = cruiseConfig.jobConfigByName("pipeline", "stage", "job", true); assertThat(plan.artifactConfigs().getBuiltInArtifactConfigs().get(0).getSource(), is("*")); }
public static PipelineConfig pipelineConfigWithExternalArtifact(String pipelineName, ArtifactConfig artifactConfig) { final String stageName = pipelineName + ".stage"; final String jobName = pipelineName + ".job"; PipelineConfig pipelineConfig = createPipelineConfig(pipelineName, stageName, jobName); final JobConfig jobConfig = pipelineConfig.getStage(stageName).jobConfigByConfigName(jobName); jobConfig.artifactConfigs().add(artifactConfig); return pipelineConfig; } }
@Test public void shouldRetainArtifactSourceThatIsNotWhitespace() throws Exception { GoConfigHolder holder = ConfigMigrator.loadWithMigration(configWithArtifactSourceAs("t ")); CruiseConfig cruiseConfig = holder.config; JobConfig plan = cruiseConfig.jobConfigByName("pipeline", "stage", "job", true); assertThat(plan.artifactConfigs().getBuiltInArtifactConfigs().get(0).getSource(), is("t ")); }
@Test public void shouldBeValidIfFetchArtifactDoesNotSpecifyPipeline() { upstream.getStage("stage").jobConfigByConfigName("job").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, upstream, upstream.getStage(new CaseInsensitiveString("up-stage1")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void shouldBeValidIfFetchArtifactUsingAStageBeforeCurrentInTheSamePipeline() { upstream.getStage("stage").jobConfigByConfigName("job").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("upstream"), new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, upstream, upstream.getStage(new CaseInsensitiveString("up-stage1")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void shouldBeValidIfFetchArtifactUsingADependantPipeline() { upstream.getStage("up-stage1").jobConfigByConfigName("up-job1").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("upstream"), new CaseInsensitiveString("up-stage1"), new CaseInsensitiveString("up-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
public static JobPlan createJobPlan(JobConfig jobConfig, JobIdentifier jobIdentifier, SchedulingContext schedulingContext) { final EnvironmentVariables environmentVariables = EnvironmentVariables.toEnvironmentVariables(schedulingContext.overrideEnvironmentVariables(jobConfig.getVariables()).getEnvironmentVariablesConfig()); final List<ArtifactPropertiesGenerator> artifactPropertiesGenerators = ArtifactPropertiesGenerator.toArtifactProperties(jobConfig.getProperties()); final List<ArtifactPlan> artifactPlans = ArtifactPlan.toArtifactPlans(jobConfig.artifactConfigs()); return new DefaultJobPlan(new Resources(jobConfig.resourceConfigs()), artifactPlans, artifactPropertiesGenerators, -1, jobIdentifier, null, environmentVariables, new EnvironmentVariables(), null); }
@Test public void shouldBeValidWhenFetchArtifactIsFromAnyAncestorStage_onTheUpstreamPipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void shouldBeValidWhenFetchArtifactIsFromAnyAncestorStage_s_predecessorStage__onTheUpstreamPipeline() { uppestStream.getStage("uppest-stage1").jobConfigByConfigName("uppest-job1").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage1"), new CaseInsensitiveString("uppest-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
private StageConfig getStageConfig(String stageName, String jobName) { JobConfig jobConfig = new JobConfig(new CaseInsensitiveString(jobName)); jobConfig.addTask(new AntTask()); jobConfig.addTask(new ExecTask("command", "", "workingDir")); jobConfig.artifactConfigs().add(new BuildArtifactConfig("src", "dest")); jobConfig.addVariable("env1", "val1"); jobConfig.addResourceConfig("powerful"); JobConfigs jobConfigs = new JobConfigs(jobConfig); return new StageConfig(new CaseInsensitiveString(stageName), jobConfigs); }
@Test public void validate_shouldNotErrorWhenReferencingFilePipelineFromConfigRepositoryPipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); uppestStream.setOrigin(new FileConfigOrigin()); downstream.setOrigin(new RepoConfigOrigin()); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void validate_shouldNotErrorWhenReferencingFilePipelineFromFilePipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); uppestStream.setOrigin(new FileConfigOrigin()); downstream.setOrigin(new FileConfigOrigin()); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void validate_shouldNotErrorWhenReferencingConfigRepositoryPipelineFromConfigRepositoryPipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); uppestStream.setOrigin(new RepoConfigOrigin()); downstream.setOrigin(new RepoConfigOrigin()); config.setArtifactStores(new ArtifactStores(new ArtifactStore("s3", "foo.plugin"))); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }