private JobConfigs toJobConfigs(Collection<CRJob> jobs) { JobConfigs jobConfigs = new JobConfigs(); for (CRJob crJob : jobs) { jobConfigs.add(toJobConfig(crJob)); } return jobConfigs; }
public void setConfigAttributes(Object attributes, TaskFactory taskFactory) { this.clear(); if (attributes != null) { for (Object attribute : (List) attributes) { JobConfig job = new JobConfig(); job.setConfigAttributes(attribute, taskFactory); this.addJobWithoutValidityAssertion(job); } } }
private static Consumer<OutputListWriter> getJobs(StageConfig stageConfig) { return jobsWriter -> { stageConfig.getJobs().forEach(job -> { jobsWriter.addChild(jobWriter -> JobRepresenter.toJSON(jobWriter, job)); }); }; }
@Test public void shouldClearExistingJobsWhenNullGivenAsAttributeMap() throws Exception{ JobConfigs jobs = new JobConfigs(); jobs.add(new JobConfig("quux")); jobs.setConfigAttributes(null); assertThat(jobs.size(), is(0)); }
@Test public void shouldValidateTree() throws Exception{ PipelineConfig pipelineConfig = PipelineConfigMother.pipelineConfig("pipeline"); JobConfigs jobs = pipelineConfig.get(0).getJobs(); jobs.add(new JobConfig("quux")); jobs.setConfigAttributes(a(m(JobConfig.NAME, "foo"), m(JobConfig.NAME, "foo"))); assertThat(jobs.size(), is(2)); JobConfig firstFoo = jobs.get(0); JobConfig secondFoo = jobs.get(1); assertThat(firstFoo.name(), is(new CaseInsensitiveString("foo"))); assertThat(secondFoo.name(), is(new CaseInsensitiveString("foo"))); assertThat(firstFoo.errors().isEmpty(), is(true)); assertThat(secondFoo.errors().isEmpty(), is(true)); jobs.validate(PipelineConfigSaveValidationContext.forChain(true, "group", pipelineConfig, pipelineConfig.get(0), jobs)); assertThat(firstFoo.errors().on(JobConfig.NAME), is("You have defined multiple jobs called 'foo'. Job names are case-insensitive and must be unique.")); assertThat(secondFoo.errors().on(JobConfig.NAME), is("You have defined multiple jobs called 'foo'. Job names are case-insensitive and must be unique.")); }
@Test public void shouldValidateCorrectPipelineLabelWithoutAnyMaterial() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("cruise"), new MaterialConfigs(), new StageConfig(new CaseInsensitiveString("first"), new JobConfigs())); pipelineConfig.setLabelTemplate("pipeline-${COUNT}-alpha"); pipelineConfig.validate(null); assertThat(pipelineConfig.errors().isEmpty(), is(true)); assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), is(nullValue())); }
@Test public void should_NOT_BeValidWhen_ImmediateParentDeclaredInPathFromAncestor_isNotAParentPipeline() { PipelineConfig upstreamsPeer = config.pipelineConfigByName(new CaseInsensitiveString("upstreams_peer")); upstreamsPeer.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("uppest_stream", "uppest-stage1"))); upstreamsPeer.add(StageConfigMother.stageConfig("peer-stage", new JobConfigs(new JobConfig("peer-job")))); downstream = config.pipelineConfigByName(new CaseInsensitiveString("downstream")); downstream.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("upstream", "up-stage1"), MaterialConfigsMother.dependencyMaterialConfig("upstreams_peer", "peer-stage"))); FetchTask task = new FetchTask(new CaseInsensitiveString("upstream/uppest_stream"), new CaseInsensitiveString("up-stage1"), new CaseInsensitiveString("up-job1"), "src", "dest"); StageConfig stage = downstream.getStage(new CaseInsensitiveString("stage")); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, stage, stage.getJobs().get(0))); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.PIPELINE_NAME), is("Pipeline named 'uppest_stream' exists, but is not an ancestor of 'downstream' as declared in 'upstream/uppest_stream'.")); }
@Test public void shouldCopyErrorsForFieldsOnPipelineConfig(){ PipelineConfig pipelineConfig = PipelineConfigMother.pipelineConfig("pipeline", MaterialConfigsMother.defaultMaterialConfigs(), new JobConfigs(JobConfigMother.createJobConfigWithJobNameAndEmptyResources())); pipelineConfig.setVariables(new EnvironmentVariablesConfig(asList(new EnvironmentVariableConfig("name", "value")))); PipelineConfig pipelineWithErrors = new Cloner().deepClone(pipelineConfig); pipelineWithErrors.getVariables().get(0).addError("name", "error on environment variable"); pipelineWithErrors.first().addError("name", "error on stage"); pipelineWithErrors.first().getJobs().first().addError("name", "error on job"); BasicCruiseConfig.copyErrors(pipelineWithErrors, pipelineConfig); assertThat(pipelineConfig.getVariables().get(0).errors().on("name"), is("error on environment variable")); assertThat(pipelineConfig.first().errors().on("name"), is("error on stage")); assertThat(pipelineConfig.first().getJobs().first().errors().on("name"), is("error on job")); }
@Test public void shouldGetJobConfigByJobName() { JobConfigs configs = new JobConfigs(); JobConfig expected = new JobConfig("job-1"); configs.add(expected); configs.add(new JobConfig("job-2")); JobConfig actual = configs.getJob(new CaseInsensitiveString("job-1")); assertThat(actual, is(expected)); assertThat(configs.getJob(new CaseInsensitiveString("some-junk")), is(nullValue())); } }
@Test public void shouldFindBuildPlanByName() { JobConfigs jobConfigs = new JobConfigs(); jobConfigs.add(jobConfig("Test")); assertThat(jobConfigs.containsName(new CaseInsensitiveString("Poo")), is(false)); }
@Test public void shouldNotBombIfABuildPlanWithSameNameIsSetAgain() throws Exception { JobConfigs jobConfigs = new JobConfigs(); jobConfigs.add(jobConfig("Test")); jobConfigs.set(0, jobConfig("Test")); }
@Test public void shouldReturnTrueIfAllDescendentsAreValid(){ JobConfig jobConfig = mock(JobConfig.class); when(jobConfig.validateTree(any(PipelineConfigSaveValidationContext.class))).thenReturn(true); JobConfigs jobConfigs = new JobConfigs(jobConfig); boolean isValid = jobConfigs.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig())); assertTrue(isValid); verify(jobConfig).validateTree(any(PipelineConfigSaveValidationContext.class)); }
@Test public void shouldPopulateErrorMessagesWhenHasJobNamesRepeated() { CruiseConfig config = new BasicCruiseConfig(); PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("pipeline", "stage-1", "con-job"); config.addPipeline("group-foo", pipelineConfig); StageConfig stageConfig = pipelineConfig.get(0); JobConfig newJob = new JobConfig("foo!"); StageConfig newlyAddedStage = new StageConfig(new CaseInsensitiveString("."), new JobConfigs(newJob)); pipelineConfig.addStageWithoutValidityAssertion(newlyAddedStage); stageConfig.getJobs().addJobWithoutValidityAssertion(new JobConfig(new CaseInsensitiveString("con-job"), new ResourceConfigs(), new ArtifactConfigs(), new Tasks(new ExecTask("ls", "-la", "foo")))); List<ConfigErrors> allErrors = config.validateAfterPreprocess(); assertThat(allErrors.size(), is(4)); assertThat(allErrors.get(0).on(JobConfig.NAME), is("You have defined multiple jobs called 'con-job'. Job names are case-insensitive and must be unique.")); assertThat(allErrors.get(1).on(JobConfig.NAME), is("You have defined multiple jobs called 'con-job'. Job names are case-insensitive and must be unique.")); assertThat(allErrors.get(2).on(StageConfig.NAME), is("Invalid stage 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.")); assertThat(allErrors.get(3).on(JobConfig.NAME), is("Invalid job name 'foo!'. This must be alphanumeric and may contain underscores and periods. The maximum allowed length is 255 characters.")); assertThat(stageConfig.getJobs().get(0).errors().on(JobConfig.NAME), is("You have defined multiple jobs called 'con-job'. Job names are case-insensitive and must be unique.")); assertThat(stageConfig.getJobs().get(1).errors().on(JobConfig.NAME), is("You have defined multiple jobs called 'con-job'. Job names are case-insensitive and must be unique.")); assertThat(newlyAddedStage.errors().on(StageConfig.NAME), is("Invalid stage 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.")); assertThat(newJob.errors().on(JobConfig.NAME), is("Invalid job name 'foo!'. This must be alphanumeric and may contain underscores and periods. The maximum allowed length is 255 characters.")); }
@Test public void shouldUpdateStageOnAttributes() { PipelineConfig pipelineConfig = new PipelineConfig(); HashMap stageMap = new HashMap(); List jobList = a(m(JobConfig.NAME, "JobName")); stageMap.put(StageConfig.NAME, "someStage"); stageMap.put(StageConfig.JOBS, jobList); HashMap attributeMap = new HashMap(); attributeMap.put(PipelineConfig.NAME, "startup"); attributeMap.put(PipelineConfig.STAGE, stageMap); pipelineConfig.setConfigAttributes(attributeMap); assertThat(pipelineConfig.name(), is(new CaseInsensitiveString("startup"))); assertThat(pipelineConfig.get(0).name(), is(new CaseInsensitiveString("someStage"))); assertThat(pipelineConfig.get(0).getJobs().first().name(), is(new CaseInsensitiveString("JobName"))); }
public static PipelineTemplateConfig createTemplateWithParams(String templateName, String... paramNameAndValue) { PipelineTemplateConfig template = createTemplate(templateName); for (String nameAndValue : paramNameAndValue) { template.get(0).getJobs().get(0).addVariable(String.format("name-%s", nameAndValue), String.format("value-#{%s}", nameAndValue)); } return template; } }
@Test public void shouldNotRerun_WhenJobConfigIsChangedToRunMultipleInstance_ForSingleJobInstance() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents()); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), null); Stage stage = createStageInstance(old, jobs); Stage newStage = null; railsConfig.setRunInstanceCount(10); CannotRerunJobException exception = null; try { newStage = instanceFactory.createStageForRerunOfJobs(stage, a("rails"), schedulingContext, stageConfig, new TimeProvider(), "md5"); fail("should not schedule since job config changed to run multiple instance"); } catch (CannotRerunJobException e) { exception = e; } assertThat(exception.getJobName(), is("rails")); assertThat(exception.getInformation(), is("Run configuration for job has been changed to 'run multiple instance'.")); assertThat(newStage, is(nullValue())); }
public static PipelineConfig pipelineWithElasticJob(String... elasticProfileIds) { PipelineConfig pipelineConfig = pipelineConfig(UUID.randomUUID().toString()); pipelineConfig.first().getJobs().clear(); for (String elasticProfileId : elasticProfileIds) { pipelineConfig.first().getJobs().add(JobConfigMother.elasticJob(elasticProfileId)); } return pipelineConfig; }
public static StageConfig stageConfigWithParams(String stageName, String paramName) { StageConfig stageConfig = StageConfigMother.stageConfig(stageName); ArrayList<EnvironmentVariableConfig> environmentVariableConfigs = new ArrayList<>(); environmentVariableConfigs.add(new EnvironmentVariableConfig("env1", "#{" + paramName + "}")); stageConfig.setVariables(new EnvironmentVariablesConfig(environmentVariableConfigs)); stageConfig.getJobs().add(JobConfigMother.jobConfig()); return stageConfig; }
public boolean validateTree(ValidationContext validationContext) { validate(validationContext); boolean isValid = errors.isEmpty(); ValidationContext contextForChildren = validationContext.withParent(this); isValid = jobConfigs.validateTree(contextForChildren) && isValid; isValid = approval.validateTree(contextForChildren) && isValid; isValid = variables.validateTree(contextForChildren) && isValid; return isValid; }
jobsCount += stageConfig.getJobs().size(); for (JobConfig job : stageConfig.getJobs()) { String elasticProfileId = job.getElasticProfileId();