private void setConfigurationType(Map attributeMap) { String configurationType = (String) attributeMap.get(CONFIGURATION_TYPE); if (configurationType.equals(CONFIGURATION_TYPE_STAGES)) { return; } if (configurationType.equals(CONFIGURATION_TYPE_TEMPLATE)) { String templateName = (String) attributeMap.get(TEMPLATE_NAME); this.clear(); this.setTemplateName(new CaseInsensitiveString(templateName)); } }
@Test public void shouldNotEncryptSecurePropertiesInStagesIfPipelineHasATemplate() { PipelineConfig pipelineConfig = new PipelineConfig(); pipelineConfig.setTemplateName(new CaseInsensitiveString("some-template")); StageConfig mockStageConfig = mock(StageConfig.class); pipelineConfig.addStageWithoutValidityAssertion(mockStageConfig); pipelineConfig.encryptSecureProperties(new BasicCruiseConfig(), pipelineConfig); verify(mockStageConfig, never()).encryptSecureProperties(eq(new BasicCruiseConfig()), eq(pipelineConfig), ArgumentMatchers.any(StageConfig.class)); }
@Test public void shouldThrowExceptionOnAddingTemplatesIfItAlreadyHasStages() { PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("pipeline", "stage", "build"); try { PipelineTemplateConfig template = new PipelineTemplateConfig(); template.add(StageConfigMother.stageConfig("first")); pipelineConfig.setTemplateName(new CaseInsensitiveString("some-template")); fail("Should throw exception because the pipeline has stages already"); } catch (RuntimeException e) { assertThat(e.getMessage(), containsString("Cannot set template 'some-template' on pipeline 'pipeline' because it already has stages defined")); } }
@Test public void shouldBombWhenAddingStagesIfItAlreadyHasATemplate() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("mingle"), null); try { pipelineConfig.setTemplateName(new CaseInsensitiveString("some-template")); pipelineConfig.add(StageConfigMother.stageConfig("second")); fail("Should throw exception because pipeline already has a template"); } catch (RuntimeException e) { assertThat(e.getMessage(), containsString("Cannot add stage 'second' to pipeline 'mingle', which already references template 'some-template'.")); } }
public static PipelineConfig pipelineConfigWithTemplate(String name, String templateName) { PipelineConfig pipelineWithTemplate = new PipelineConfig(new CaseInsensitiveString(name), MaterialConfigsMother.defaultMaterialConfigs()); pipelineWithTemplate.setTemplateName(new CaseInsensitiveString(templateName)); return pipelineWithTemplate; }
@Test public void shouldAddValidateTreeErrorsOnStageConfigIfPipelineIsAssociatedToATemplate(){ Approval approval = mock(Approval.class); JobConfigs jobConfigs = mock(JobConfigs.class); ConfigErrors jobErrors = new ConfigErrors(); jobErrors.add("KEY", "ERROR"); when(jobConfigs.errors()).thenReturn(jobErrors); StageConfig stageConfig = new StageConfig(new CaseInsensitiveString("stage$"), jobConfigs, approval); PipelineConfig pipelineConfig = new PipelineConfig(); pipelineConfig.setTemplateName(new CaseInsensitiveString("template")); stageConfig.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", pipelineConfig, stageConfig)); assertThat(stageConfig.errors().on(StageConfig.NAME), contains("Invalid stage name 'stage$'")); }
@Test public void shouldAddValidationErrorWhenAssociatedTemplateDoesNotExist() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("wunderbar"), new MaterialConfigs()); config.addPipeline("group", pipelineConfig); pipelineConfig.setTemplateName(new CaseInsensitiveString("does-not-exist")); pipelineConfig.validateTemplate(null); assertThat(pipelineConfig.errors().on("pipeline"), is("Pipeline 'wunderbar' refers to non-existent template 'does-not-exist'.")); }
@Test public void shouldReturnAMapOfAllTemplateNamesWithAssociatedPipelines() { PipelineTemplateConfig template = template("first_template"); PipelineConfig pipelineConfig1 = PipelineConfigMother.pipelineConfig("first"); pipelineConfig1.clear(); pipelineConfig1.setTemplateName(new CaseInsensitiveString("first_template")); pipelineConfig1.usingTemplate(template); PipelineConfig pipelineConfig2 = PipelineConfigMother.pipelineConfig("second"); pipelineConfig2.clear(); pipelineConfig2.setTemplateName(new CaseInsensitiveString("FIRST_template")); pipelineConfig2.usingTemplate(template); PipelineConfig pipelineConfigWithoutTemplate = PipelineConfigMother.pipelineConfig("third"); BasicPipelineConfigs pipelineConfigs = new BasicPipelineConfigs(pipelineConfig1, pipelineConfig2, pipelineConfigWithoutTemplate); pipelineConfigs.setOrigin(new FileConfigOrigin()); CruiseConfig cruiseConfig = createCruiseConfig(pipelineConfigs); cruiseConfig.addTemplate(template); SecurityConfig securityConfig = new SecurityConfig(false); securityConfig.adminsConfig().add(new AdminUser(new CaseInsensitiveString("root"))); cruiseConfig.server().useSecurity(securityConfig); Map<CaseInsensitiveString, Map<CaseInsensitiveString, Authorization>> allTemplatesWithAssociatedPipelines = cruiseConfig.templatesWithAssociatedPipelines(); assertThat(allTemplatesWithAssociatedPipelines.size(), is(1)); HashMap<CaseInsensitiveString, Map<CaseInsensitiveString, Authorization>> expectedTemplatesMap = new HashMap<>(); expectedTemplatesMap.put(new CaseInsensitiveString("first_template"), new HashMap<>()); expectedTemplatesMap.get(new CaseInsensitiveString("first_template")).put(new CaseInsensitiveString("first"), new Authorization()); expectedTemplatesMap.get(new CaseInsensitiveString("first_template")).put(new CaseInsensitiveString("second"), new Authorization()); assertThat(allTemplatesWithAssociatedPipelines, is(expectedTemplatesMap)); }
@Test public void validate_shouldEnsureThatTemplateFollowsTheNameType() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("name"), new MaterialConfigs()); pipelineConfig.setTemplateName(new CaseInsensitiveString(".Name")); config.addPipeline("group", pipelineConfig); pipelineConfig.validateTemplate(new PipelineTemplateConfig()); assertThat(pipelineConfig.errors().isEmpty(), is(false)); assertThat(pipelineConfig.errors().on(PipelineConfig.TEMPLATE_NAME), is("Invalid template name '.Name'. This must be alphanumeric and can contain underscores and periods (however, it cannot start with a period). The maximum allowed length is 255 characters.")); }
@Test public void shouldNotAddValidationErrorWhenAssociatedTemplateExists() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("wunderbar"), new MaterialConfigs()); config.addPipeline("group", pipelineConfig); config.addTemplate(new PipelineTemplateConfig(new CaseInsensitiveString("t1"))); pipelineConfig.setTemplateName(new CaseInsensitiveString("t1")); pipelineConfig.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", config, pipelineConfig)); assertThat(pipelineConfig.errors().getAllOn("template"), is(nullValue())); }
@Test public void shouldAllowResourcesWithParamsForJobs() throws Exception { CruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.addTemplate(new PipelineTemplateConfig(new CaseInsensitiveString("template"), stageWithJobResource("#{PLATFORM}"))); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("pipeline"), new MaterialConfigs()); pipelineConfig.setTemplateName(new CaseInsensitiveString("template")); pipelineConfig.addParam(new ParamConfig("PLATFORM", "windows")); cruiseConfig.addPipeline("group", pipelineConfig); List<ConfigErrors> errorses = MagicalGoConfigXmlLoader.validate(cruiseConfig); assertThat(errorses.isEmpty(), is(true)); }
@Test public void shouldValidateThatPipelineAssociatedToATemplateDoesNotHaveStagesDefinedLocally() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("wunderbar"), new MaterialConfigs()); config.addPipeline("g", pipelineConfig); pipelineConfig.setTemplateName(new CaseInsensitiveString("template-name")); pipelineConfig.addStageWithoutValidityAssertion(new StageConfig(new CaseInsensitiveString("stage"), new JobConfigs())); pipelineConfig.validateTemplate(null); assertThat(pipelineConfig.errors().on("stages"), is("Cannot add stages to pipeline 'wunderbar' which already references template 'template-name'")); assertThat(pipelineConfig.errors().on("template"), is("Cannot set template 'template-name' on pipeline 'wunderbar' because it already has stages defined")); }
public PipelineConfig addPipelineWithTemplate(CruiseConfig cruiseConfig, String pipelineName, String templateName, String stageName, String... buildNames) { PipelineTemplateConfig templateConfig = new PipelineTemplateConfig(new CaseInsensitiveString(templateName), StageConfigMother.custom(stageName, defaultBuildPlans(buildNames))); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString(pipelineName), MaterialConfigsMother.mockMaterialConfigs("file:///tmp/foo")); pipelineConfig.setTemplateName(new CaseInsensitiveString(templateName)); cruiseConfig.addTemplate(templateConfig); cruiseConfig.addPipeline(DEFAULT_GROUP, pipelineConfig); return pipelineConfig; }
public static PipelineConfig templateBasedPipelineWithElasticJobs(String templateName, String elasticProfileId, String pipelineName, String stageName, String... jobNames) { final StageConfig stageConfig = new StageConfig(new CaseInsensitiveString(stageName), BuildPlanMother.jobConfigs(jobNames)); for (JobConfig job : stageConfig.getJobs()) { job.setElasticProfileId(elasticProfileId); } final PipelineConfig pipelineConfig = new PipelineConfig(); pipelineConfig.setName(pipelineName); pipelineConfig.setTemplateName(new CaseInsensitiveString(templateName)); pipelineConfig.usingTemplate(new PipelineTemplateConfig(new CaseInsensitiveString(templateName), stageConfig)); return pipelineConfig; }
@Test public void shouldAllowRoleWithParamsForStageInTemplate() throws Exception { CruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.server().security().addRole(new RoleConfig(new CaseInsensitiveString("role"))); cruiseConfig.addTemplate(new PipelineTemplateConfig(new CaseInsensitiveString("template"), stageWithAuth("#{ROLE}"))); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("pipeline"), new MaterialConfigs()); pipelineConfig.setTemplateName(new CaseInsensitiveString("template")); pipelineConfig.addParam(new ParamConfig("ROLE", "role")); cruiseConfig.addPipeline("group", pipelineConfig); List<ConfigErrors> errorses = MagicalGoConfigXmlLoader.validate(cruiseConfig); assertThat(errorses.isEmpty(), is(true)); }
@Test public void shouldAddErrorsToRawCruiseConfigWhenTemplateHasErrors() { CruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("pipeline-1"); cruiseConfig.getTemplates().add( new PipelineTemplateConfig(new CaseInsensitiveString("invalid template name"), new StageConfig(new CaseInsensitiveString("stage-1"), new JobConfigs(new JobConfig("job-1")) ))); PipelineConfig pipelineWithTemplate = new PipelineConfig(new CaseInsensitiveString("pipeline-with-template"), MaterialConfigsMother.defaultMaterialConfigs()); pipelineWithTemplate.setTemplateName(new CaseInsensitiveString("invalid template name")); cruiseConfig.getGroups().get(0).add(pipelineWithTemplate); CruiseConfig rawCruiseConfig = new Cloner().deepClone(cruiseConfig); MagicalGoConfigXmlLoader.validate(cruiseConfig); cruiseConfig.copyErrorsTo(rawCruiseConfig); ConfigErrors templateErrors = rawCruiseConfig.getTemplateByName(new CaseInsensitiveString("invalid template name")).errors(); assertThat(templateErrors.getAll().size(), is(1)); assertThat(templateErrors.getAll().get(0), is("Invalid template name 'invalid template name'. This must be alphanumeric and can contain underscores and periods (however, it cannot start with a period). The maximum allowed length is 255 characters.")); }
@Test public void shouldCloneStagesSoThatMutationDoesnotAffectTemplate() throws Exception { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("pipelineName"), new MaterialConfigs(MaterialConfigsMother.hgMaterialConfig("http://google.com"))); pipelineConfig.setTemplateName(new CaseInsensitiveString("templateName")); PipelineTemplateConfig template = new PipelineTemplateConfig(); JobConfig jobConfigFromTemplate = new JobConfig("job-1"); StageConfig stageConfigFromTemplate = new StageConfig(new CaseInsensitiveString("stage-1"), new JobConfigs(jobConfigFromTemplate)); template.add(stageConfigFromTemplate); pipelineConfig.usingTemplate(template); StageConfig stageConfigFromPipeline = pipelineConfig.get(0); EnvironmentVariablesConfig variablesConfig = new EnvironmentVariablesConfig(); variablesConfig.add("FOO", "BAR"); stageConfigFromPipeline.setVariables(variablesConfig); JobConfig jobConfigFromPipeline = stageConfigFromPipeline.jobConfigByConfigName(new CaseInsensitiveString("job-1")); EnvironmentVariablesConfig jobVariablesConfigFromPipeline = new EnvironmentVariablesConfig(); jobVariablesConfigFromPipeline.add("BAZ", "QUUX"); jobConfigFromPipeline.setVariables(jobVariablesConfigFromPipeline); assertThat(stageConfigFromPipeline.getVariables().isEmpty(), is(false)); assertThat(jobConfigFromPipeline.getVariables().isEmpty(), is(false)); assertThat(stageConfigFromTemplate.getVariables().isEmpty(), is(true)); assertThat(jobConfigFromTemplate.getVariables().isEmpty(), is(true)); }
@Test public void shouldHandlePipelinesWithTemplates() { CruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("pipeline-1"); cruiseConfig.getTemplates().add( new PipelineTemplateConfig(new CaseInsensitiveString("template-1"), new StageConfig(new CaseInsensitiveString("invalid stage name"), new JobConfigs(new JobConfig("job-1")) ))); PipelineConfig pipelineWithTemplate = new PipelineConfig(new CaseInsensitiveString("pipeline-with-template"), MaterialConfigsMother.defaultMaterialConfigs()); pipelineWithTemplate.setTemplateName(new CaseInsensitiveString("template-1")); cruiseConfig.getGroups().get(0).add(pipelineWithTemplate); CruiseConfig rawCruiseConfig = new Cloner().deepClone(cruiseConfig); MagicalGoConfigXmlLoader.validate(cruiseConfig); cruiseConfig.copyErrorsTo(rawCruiseConfig); assertThat(rawCruiseConfig.pipelineConfigByName(new CaseInsensitiveString("pipeline-with-template")).errors().isEmpty(), is(true)); assertThat(cruiseConfig.pipelineConfigByName(new CaseInsensitiveString("pipeline-with-template")).getStage(new CaseInsensitiveString("invalid stage name")).errors().isEmpty(), is(false)); assertThat(rawCruiseConfig.getTemplateByName(new CaseInsensitiveString("template-1")).errors().isEmpty(), is(true)); }
pipelineConfig.setTemplateName(new CaseInsensitiveString(crPipeline.getTemplate())); } else { for (CRStage crStage : crPipeline.getStages()) {