public MaterialConfigs getAllMaterialsByFingerPrint(String fingerprint) { if (fingerprintToMaterials == null || fingerprintToMaterials.isEmpty()) { primeForMaterialValidations(); } MaterialConfigs matchingMaterials = fingerprintToMaterials.get(fingerprint); return matchingMaterials == null ? new MaterialConfigs() : matchingMaterials; }
public static MaterialConfigs fromJSONArray(JsonReader jsonReader, ConfigHelperOptions options) { MaterialConfigs materialConfigs = new MaterialConfigs(); jsonReader.readArrayIfPresent("materials", materials -> { materials.forEach(material -> { materialConfigs.add(MaterialRepresenter.fromJSON(new JsonReader(material.getAsJsonObject()), options)); }); }); return materialConfigs; }
public static MaterialConfigs fromJSONArray(JsonReader jsonReader, ConfigHelperOptions options) { MaterialConfigs materialConfigs = new MaterialConfigs(); jsonReader.readArrayIfPresent("materials", materials -> { materials.forEach(material -> { materialConfigs.add(MaterialRepresenter.fromJSON(new JsonReader(material.getAsJsonObject()), options)); }); }); return materialConfigs; }
@Test public void shouldOnlyHaveOneCopyOfAMaterialIfOnlyTheFolderIsDifferent() { SvnMaterialConfig svn = MaterialConfigsMother.svnMaterialConfig("url", "folder1", true); SvnMaterialConfig svnInDifferentFolder = MaterialConfigsMother.svnMaterialConfig("url", "folder2"); PipelineConfig pipeline1 = new PipelineConfig(new CaseInsensitiveString("pipeline1"), new MaterialConfigs(svn)); PipelineConfig pipeline2 = new PipelineConfig(new CaseInsensitiveString("pipeline2"), new MaterialConfigs(svnInDifferentFolder)); CruiseConfig config = new BasicCruiseConfig(new BasicPipelineConfigs(pipeline1, pipeline2)); assertThat(config.getAllUniqueMaterialsBelongingToAutoPipelines().size(), is(1)); }
@Test public void shouldHaveBothMaterialsIfTheTypeIsDifferent() { SvnMaterialConfig svn = MaterialConfigsMother.svnMaterialConfig("url", "folder1", true); HgMaterialConfig hg = MaterialConfigsMother.hgMaterialConfig("url", "folder2"); PipelineConfig pipeline1 = new PipelineConfig(new CaseInsensitiveString("pipeline1"), new MaterialConfigs(svn)); PipelineConfig pipeline2 = new PipelineConfig(new CaseInsensitiveString("pipeline2"), new MaterialConfigs(hg)); CruiseConfig config = new BasicCruiseConfig(new BasicPipelineConfigs(pipeline1, pipeline2)); assertThat(config.getAllUniqueMaterialsBelongingToAutoPipelines().size(), is(2)); } }
@Test public void shouldGetExistingOrDefaultMaterialCorrectly() { SvnMaterialConfig svn = new SvnMaterialConfig("http://test.com", false); PackageMaterialConfig p1 = new PackageMaterialConfig("p1"); PackageMaterialConfig p2 = new PackageMaterialConfig("p2"); assertThat(new MaterialConfigs(svn, p2).getExistingOrDefaultMaterial(p1).getPackageId(), is("p2")); assertThat(new MaterialConfigs(svn).getExistingOrDefaultMaterial(p1).getPackageId(), is("p1")); }
@Test public void getAllUniquePostCommitSchedulableMaterials_shouldReturnMaterialsWithAutoUpdateFalse() { GitMaterialConfig gitAutoMaterial = MaterialConfigsMother.gitMaterialConfig("url"); PipelineConfig pipelineAuto = pipelineConfig("pipelineAuto", new MaterialConfigs(gitAutoMaterial)); GitMaterialConfig gitNonAutoMaterial = new GitMaterialConfig(new UrlArgument("other-url"), "master", "dest", false, null, false, null, new CaseInsensitiveString("git"), false); PipelineConfig pipelineTriggerable = pipelineConfig("pipelineTriggerable", new MaterialConfigs(gitNonAutoMaterial)); PipelineConfigs defaultGroup = createGroup("defaultGroup", pipelineAuto, pipelineTriggerable); cruiseConfig.getGroups().add(defaultGroup); Set<MaterialConfig> materials = cruiseConfig.getAllUniquePostCommitSchedulableMaterials(); assertThat(materials.size(), is(1)); assertThat(materials, hasItem(gitNonAutoMaterial)); }
@Test public void shouldHandleNullStageNamesWhileValidating() { StageConfig s1 = new StageConfig(); StageConfig s2 = new StageConfig(new CaseInsensitiveString("s2"), new JobConfigs()); PipelineConfig pipeline = new PipelineConfig(new CaseInsensitiveString("p1"), new MaterialConfigs(), s1, s2); pipeline.validate(null); assertThat(s1.errors().on(StageConfig.NAME).contains("Invalid stage name 'null'"), is(true)); }
@Test public void shouldIncludeDependencyMaterialsFromManualPipelinesInSchedulableMaterials() { DependencyMaterialConfig dependencyMaterialConfig = MaterialConfigsMother.dependencyMaterialConfig(); PipelineConfig pipeline1 = new PipelineConfig(new CaseInsensitiveString("pipeline1"), new MaterialConfigs(dependencyMaterialConfig)); pipeline1.add(new StageConfig(new CaseInsensitiveString("manual-stage"), new JobConfigs(), new Approval())); CruiseConfig config = new BasicCruiseConfig(new BasicPipelineConfigs(pipeline1)); Set<MaterialConfig> materialConfigs = config.getAllUniqueMaterialsBelongingToAutoPipelines(); assertThat(materialConfigs.size(), is(1)); assertThat(materialConfigs.contains(dependencyMaterialConfig), 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.")); }
public static MaterialConfigs multipleMaterialConfigs() { MaterialConfigs materialConfigs = new MaterialConfigs(); materialConfigs.add(svnMaterialConfig("http://svnurl", null)); materialConfigs.add(hgMaterialConfig("http://hgurl", "hgdir")); materialConfigs.add(dependencyMaterialConfig("cruise", "dev")); return materialConfigs; }
@Test public void shouldHandleNullOriginDuringValidationWhenUpstreamStageDoesNotExist() { CruiseConfig cruiseConfig = GoConfigMother.pipelineHavingJob("upstream_pipeline", "upstream_stage", "j1", null, null); DependencyMaterialConfig dependencyMaterialConfig = new DependencyMaterialConfig(new CaseInsensitiveString("upstream_pipeline"), new CaseInsensitiveString("does_not_exist")); PipelineConfig pipeline = new PipelineConfig(new CaseInsensitiveString("downstream"), new MaterialConfigs()); pipeline.setOrigin(null); dependencyMaterialConfig.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, pipeline)); assertThat(dependencyMaterialConfig.errors().on(DependencyMaterialConfig.PIPELINE_STAGE_NAME), is("Stage with name 'does_not_exist' does not exist on pipeline 'upstream_pipeline', it is being referred to from pipeline 'downstream' (cruise-config.xml)")); }
@Test public void shouldValidatePipelineToCheckItDoesNotAllowBothTemplateAndStages() throws Exception { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("p"), new MaterialConfigs()); pipelineConfig.templatize(new CaseInsensitiveString("template")); pipelineConfig.addStageWithoutValidityAssertion(new StageConfig(new CaseInsensitiveString("stage"), new JobConfigs())); preprocessor.process(new BasicCruiseConfig(new BasicPipelineConfigs(pipelineConfig))); assertThat(pipelineConfig.hasTemplateApplied(), is(false)); assertThat(pipelineConfig.errors().on("stages"), is("Cannot add stages to pipeline 'p' which already references template 'template'")); assertThat(pipelineConfig.errors().on("template"), is("Cannot set template 'template' on pipeline 'p' because it already has stages defined")); }
@Test public void shouldHandleNullOriginDuringValidationWhenUpstreamPipelineDoesNotExist() { DependencyMaterialConfig dependencyMaterialConfig = new DependencyMaterialConfig(new CaseInsensitiveString("upstream_stage"), new CaseInsensitiveString("upstream_pipeline"), new CaseInsensitiveString("stage")); PipelineConfig pipeline = new PipelineConfig(new CaseInsensitiveString("p"), new MaterialConfigs()); pipeline.setOrigin(null); dependencyMaterialConfig.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", new BasicCruiseConfig(), pipeline)); assertThat(dependencyMaterialConfig.errors().on(DependencyMaterialConfig.PIPELINE_STAGE_NAME), is("Pipeline with name 'upstream_pipeline' does not exist, it is defined as a dependency for pipeline 'p' (cruise-config.xml)")); }
@Test public void shouldNotRunMultipleMaterialsValidationIfPipelineContainsOnlyOneMaterial() { CruiseConfig config = GoConfigMother.configWithPipelines("one"); PipelineConfig pipelineOne = config.pipelineConfigByName(new CaseInsensitiveString("one")); SvnMaterialConfig svnMaterialConfig = MaterialConfigsMother.svnMaterialConfig(); svnMaterialConfig.setFolder(null); pipelineOne.setMaterialConfigs(new MaterialConfigs(svnMaterialConfig)); pipelineOne.materialConfigs().validate(ConfigSaveValidationContext.forChain(config)); assertThat(svnMaterialConfig.errors().toString(), svnMaterialConfig.errors().getAll().size(), is(0)); }
@Test public void shouldComputePackageUsageInPipelinesOnlyOnce() throws Exception { PackageMaterialConfig packageOne = new PackageMaterialConfig("package-id-one"); PackageMaterialConfig packageTwo = new PackageMaterialConfig("package-id-two"); final PipelineConfig p1 = PipelineConfigMother.pipelineConfig("pipeline1", new MaterialConfigs(packageOne, packageTwo), new JobConfigs(new JobConfig(new CaseInsensitiveString("jobName")))); final PipelineConfig p2 = PipelineConfigMother.pipelineConfig("pipeline2", new MaterialConfigs(packageTwo), new JobConfigs(new JobConfig(new CaseInsensitiveString("jobName")))); PipelineGroups groups = new PipelineGroups(); groups.addAll(asList(new BasicPipelineConfigs(p1), new BasicPipelineConfigs(p2))); Map<String, List<Pair<PipelineConfig, PipelineConfigs>>> result1 = groups.getPackageUsageInPipelines(); Map<String, List<Pair<PipelineConfig, PipelineConfigs>>> result2 = groups.getPackageUsageInPipelines(); assertSame(result1, result2); }
@Test public void shouldBeValidWithExternalMaterials() { SvnMaterial mainRepo = MaterialsMother.svnMaterial("mainRepo"); MaterialRevisions revisions = new MaterialRevisions(); revisions.addRevision(mainRepo, multipleModificationList()); revisions.addRevision(MaterialsMother.svnMaterial("externalRepo"), multipleModificationList()); buildCause = BuildCause.createWithModifications(revisions, ""); buildCause.assertMaterialsMatch(new MaterialConfigs(mainRepo.config())); }
public static PartialConfig withPipelineMultipleMaterials(String name, RepoConfigOrigin repoOrigin) { GitMaterialConfig gitMaterialConfig = MaterialConfigsMother.gitMaterialConfig(); gitMaterialConfig.setFolder("git"); SvnMaterialConfig svnMaterialConfig = MaterialConfigsMother.svnMaterialConfig(); svnMaterialConfig.setFolder("svn"); PipelineConfig pipe = PipelineConfigMother.pipelineConfig(name, new MaterialConfigs(gitMaterialConfig, svnMaterialConfig)); BasicPipelineConfigs pipes = new BasicPipelineConfigs(pipe); pipes.setGroup("group"); PartialConfig partialConfig = new PartialConfig(new PipelineGroups(pipes)); partialConfig.setOrigins(repoOrigin); return partialConfig; }
@Test public void shouldRemoveErrorLogWhenCorrespondingMaterialIsMissing() throws Exception { serverHealthService.update(ServerHealthState.error("hg-message", "description", HealthStateType.general(forMaterial(MaterialsMother.hgMaterial())))); SvnMaterialConfig svnMaterialConfig = MaterialConfigsMother.svnMaterialConfig(); serverHealthService.update(ServerHealthState.error("svn-message", "description", HealthStateType.general(forMaterialConfig(svnMaterialConfig)))); CruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.addPipeline("defaultGroup", new PipelineConfig(new CaseInsensitiveString("dev"), new MaterialConfigs(svnMaterialConfig), new StageConfig(new CaseInsensitiveString("first"), new JobConfigs()))); serverHealthService.purgeStaleHealthMessages(cruiseConfig); assertThat(serverHealthService.logs().size(), is(1)); }
@Test public void shouldCreateAStageInstanceThroughInstanceFactory() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("cruise"), new MaterialConfigs(), new StageConfig(new CaseInsensitiveString("first"), new JobConfigs(new JobConfig("job1"), new JobConfig("job2")))); Stage actualStage = instanceFactory.createStageInstance(pipelineConfig, new CaseInsensitiveString("first"), new DefaultSchedulingContext(), "md5", clock); JobInstances jobInstances = new JobInstances(); jobInstances.add(new JobInstance("job1", clock)); jobInstances.add(new JobInstance("job2", clock)); Stage expectedStage = new Stage("first", jobInstances, "Unknown", null, Approval.SUCCESS, clock); assertThat(actualStage, is(expectedStage)); }