public static PipelineTemplateConfig fromJSON(JsonReader jsonReader) { PipelineTemplateConfig pipelineTemplateConfig = new PipelineTemplateConfig(); jsonReader.readStringIfPresent("name", pipelineTemplateConfig::setName); setStages(jsonReader, pipelineTemplateConfig); return pipelineTemplateConfig; }
public static PipelineTemplateConfig createTemplate(String templateName, Authorization authorization, StageConfig... stageConfigs) { return new PipelineTemplateConfig(new CaseInsensitiveString(templateName), authorization, stageConfigs); }
@Test public void testShouldReturnTrueIfTemplatesIsAnAncestor() { ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new TemplatesConfig(), new PipelineTemplateConfig()); assertThat(context.isWithinTemplates(), is(true)); }
@Test public void shouldCheckForExistenceOfTemplate() { BasicCruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.addTemplate(new PipelineTemplateConfig(new CaseInsensitiveString("t1"))); ValidationContext context = ConfigSaveValidationContext.forChain(cruiseConfig); MatcherAssert.assertThat(context.doesTemplateExist(new CaseInsensitiveString("t1")), is(true)); MatcherAssert.assertThat(context.doesTemplateExist(new CaseInsensitiveString("t2")), is(false)); }
@Test public void shouldSetPrimitiveAttributes() { PipelineTemplateConfig pipelineTemplateConfig = new PipelineTemplateConfig(); Map map = m(PipelineTemplateConfig.NAME, "templateName"); pipelineTemplateConfig.setConfigAttributes(map); assertThat(pipelineTemplateConfig.name(), is(new CaseInsensitiveString("templateName"))); }
@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 shouldKnowIfATemplateWasApplied() { PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("pipeline", "stage", "build"); assertThat(pipelineConfig.hasTemplateApplied(), is(false)); pipelineConfig.clear(); PipelineTemplateConfig template = new PipelineTemplateConfig(); template.add(StageConfigMother.stageConfig("first")); pipelineConfig.usingTemplate(template); assertThat(pipelineConfig.hasTemplateApplied(), is(true)); }
@Test public void shouldGetStageByName() { PipelineTemplateConfig pipelineTemplateConfig = new PipelineTemplateConfig(new CaseInsensitiveString("pipeline"), StageConfigMother.manualStage("manual"), StageConfigMother.manualStage("manual2")); assertThat(pipelineTemplateConfig.findBy(new CaseInsensitiveString("manual")).name(), is(new CaseInsensitiveString("manual"))); assertThat(pipelineTemplateConfig.findBy(new CaseInsensitiveString("Does-not-exist")), is(nullValue())); }
@Test public void validate_shouldEnsureThatTemplateFollowsTheNameType() { BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig(); PipelineTemplateConfig config = new PipelineTemplateConfig(new CaseInsensitiveString(".Abc")); config.validate(ConfigSaveValidationContext.forChain(cruiseConfig)); assertThat(config.errors().isEmpty(), is(false)); assertThat(config.errors().on(PipelineTemplateConfig.NAME), is("Invalid template name '.Abc'. 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 shouldCheckForExistenceOfTemplate(){ BasicCruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.addTemplate(new PipelineTemplateConfig(new CaseInsensitiveString("t1"))); PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, new PipelineConfig()); assertThat(context.doesTemplateExist(new CaseInsensitiveString("t1")), is(true)); assertThat(context.doesTemplateExist(new CaseInsensitiveString("t2")), is(false)); }
@Test public void shouldFindByName() { PipelineTemplateConfig pipelineTemplateConfig = new PipelineTemplateConfig(new CaseInsensitiveString("pipeline"), StageConfigMother.manualStage("manual"), StageConfigMother.manualStage("manual2")); assertThat(pipelineTemplateConfig.findBy(new CaseInsensitiveString("manuaL2")).name(), is(new CaseInsensitiveString("manual2"))); }
@Test public void shouldAllowEditingOfStageNameWhenItIsNotUsedAsDependencyMaterial() throws Exception { PipelineTemplateConfig template = new PipelineTemplateConfig(new CaseInsensitiveString("template"), StageConfigMother.oneBuildPlanWithResourcesAndMaterials("stage2")); BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig(); cruiseConfig.addTemplate(template); template.getStages().get(0).setName(new CaseInsensitiveString("updatedStageName")); template.validateTree(ConfigSaveValidationContext.forChain(cruiseConfig), cruiseConfig, false); assertThat(template.errors().isEmpty(), is(true)); }
@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 shouldErrorOutWhenTryingToAddTwoStagesWithSameName() { BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig(); PipelineTemplateConfig pipelineTemplateConfig = new PipelineTemplateConfig(new CaseInsensitiveString("template"), StageConfigMother.manualStage("stage1"), StageConfigMother.manualStage("stage1")); pipelineTemplateConfig.validate(ConfigSaveValidationContext.forChain(cruiseConfig)); assertThat(pipelineTemplateConfig.get(0).errors().isEmpty(), is(false)); assertThat(pipelineTemplateConfig.get(1).errors().isEmpty(), is(false)); assertThat(pipelineTemplateConfig.get(0).errors().on(StageConfig.NAME), is("You have defined multiple stages called 'stage1'. Stage names are case-insensitive and must be unique.")); assertThat(pipelineTemplateConfig.get(1).errors().on(StageConfig.NAME), is("You have defined multiple stages called 'stage1'. Stage names are case-insensitive and must be unique.")); }
@Test public void shouldAllowEditingOfJobNameWhenItIsNotUsedAsFetchArtifact() throws Exception { PipelineTemplateConfig template = new PipelineTemplateConfig(new CaseInsensitiveString("template"), StageConfigMother.oneBuildPlanWithResourcesAndMaterials("stage", "job2")); BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig(); cruiseConfig.addTemplate(template); template.getStages().get(0).getJobs().get(0).setName(new CaseInsensitiveString("updatedJobName")); template.validateTree(ConfigSaveValidationContext.forChain(cruiseConfig), cruiseConfig, false); assertThat(template.errors().isEmpty(), is(true)); }
@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())); }
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 shouldValidateRoleNamesInTemplateViewAuthorization() { BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig(); ServerConfig serverConfig = new ServerConfig(new SecurityConfig(new AdminsConfig(new AdminUser(new CaseInsensitiveString("admin")))), null); cruiseConfig.setServerConfig(serverConfig); GoConfigMother.enableSecurityWithPasswordFilePlugin(cruiseConfig); RoleConfig roleConfig = new RoleConfig(new CaseInsensitiveString("non-existent-role"), new RoleUser("non-existent-user")); PipelineTemplateConfig template = new PipelineTemplateConfig(new CaseInsensitiveString("template"), new Authorization(new ViewConfig(new AdminRole(roleConfig))), StageConfigMother.manualStage("stage2"), StageConfigMother.manualStage("stage")); template.validate(ConfigSaveValidationContext.forChain(cruiseConfig)); assertThat(template.getAllErrors().get(0).getAllOn("name"), is(Arrays.asList("Role \"non-existent-role\" does not exist."))); }
@Test public void shouldValidateRoleNamesInTemplateAdminAuthorization() { BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig(); ServerConfig serverConfig = new ServerConfig(new SecurityConfig(new AdminsConfig(new AdminUser(new CaseInsensitiveString("admin")))), null); cruiseConfig.setServerConfig(serverConfig); GoConfigMother.enableSecurityWithPasswordFilePlugin(cruiseConfig); RoleConfig roleConfig = new RoleConfig(new CaseInsensitiveString("non-existent-role"), new RoleUser("non-existent-user")); PipelineTemplateConfig template = new PipelineTemplateConfig(new CaseInsensitiveString("template"), new Authorization(new AdminsConfig(new AdminRole(roleConfig))), StageConfigMother.manualStage("stage2"), StageConfigMother.manualStage("stage")); template.validate(ConfigSaveValidationContext.forChain(cruiseConfig)); assertThat(template.getAllErrors().get(0).getAllOn("name"), is(Arrays.asList("Role \"non-existent-role\" does not exist."))); }