public boolean isFirstStageManualApproval() { if (isEmpty()) { throw new IllegalStateException(format("Pipeline [%s] doesn't have any stage", name)); } return getFirstStageConfig().getApproval().isManual(); }
public void canAutoTriggerProducer(PipelineConfig pipelineConfig, OperationResult operationResult) { String pipelineName = CaseInsensitiveString.str(pipelineConfig.name()); SchedulingChecker checker = buildScheduleCheckers(asList( new PipelineLockChecker(pipelineName, pipelineLockService), new ManualPipelineChecker(pipelineConfig), new PipelinePauseChecker(pipelineName, pipelinePauseService), new StageActiveChecker(pipelineName, CaseInsensitiveString.str(pipelineConfig.getFirstStageConfig().name()), stageService))); checker.check(operationResult); }
public static Pipeline schedule(PipelineConfig pipelineConfig, BuildCause cause) { String approvedBy = "cruise"; if (pipelineConfig.getFirstStageConfig().getApproval().isManual()) { approvedBy = "test"; } return createPipelineInstance(pipelineConfig, cause, approvedBy); }
private SchedulingChecker manualTriggerCheckers(PipelineConfig pipelineConfig, String username) { String pipelineName = CaseInsensitiveString.str(pipelineConfig.name()); String stageName = CaseInsensitiveString.str(pipelineConfig.getFirstStageConfig().name()); StageAuthorizationChecker stageAuthorizationChecker = new StageAuthorizationChecker(pipelineName, stageName, username, securityService); return new CompositeChecker(manualTriggerCheckersWithoutPermissionsCheck(pipelineConfig), stageAuthorizationChecker); }
@Test public void shouldValidateEmptyAndNullResources() { PipelineConfig pipelineConfig=PipelineConfigMother.createPipelineConfigWithJobConfigs("pipeline1"); JobConfig jobConfig = JobConfigMother.createJobConfigWithJobNameAndEmptyResources(); ValidationContext validationContext=mock(ValidationContext.class); when(validationContext.getPipeline()).thenReturn(pipelineConfig); when(validationContext.getStage()).thenReturn(pipelineConfig.getFirstStageConfig()); jobConfig.validate(validationContext); assertThat(jobConfig.errors().isEmpty(), is(false)); assertThat(jobConfig.errors().getAll().get(0),is("Empty resource name in job \"defaultJob\" of stage \"mingle\" of pipeline \"pipeline1\". If a template is used, please ensure that the resource parameters are defined for this pipeline.")); }
@Test public void shouldReturnDuplicateWithoutName() { PipelineConfig pipelineConfig = PipelineConfigMother.pipelineConfig("somePipeline"); PipelineConfig clonedPipelineConfig = pipelineConfig.duplicate(); assertThat(clonedPipelineConfig.name(), is(new CaseInsensitiveString(""))); assertThat(clonedPipelineConfig.materialConfigs(), is(pipelineConfig.materialConfigs())); assertThat(clonedPipelineConfig.getFirstStageConfig(), is(pipelineConfig.getFirstStageConfig())); }
public boolean canAutoTriggerConsumer(PipelineConfig pipelineConfig) { OperationResult result = new ServerHealthStateOperationResult(); String pipelineName = CaseInsensitiveString.str(pipelineConfig.name()); String stageName = CaseInsensitiveString.str(pipelineConfig.getFirstStageConfig().name()); SchedulingChecker checker = buildScheduleCheckers(asList(new PipelinePauseChecker(pipelineName, pipelinePauseService), new PipelineLockChecker(pipelineName, pipelineLockService), new StageActiveChecker(pipelineName, stageName, stageService))); checker.check(result); return result.getServerHealthState().isSuccess(); }
@Test public void shouldValidateElasticProfileId() { PipelineConfig pipelineConfig=PipelineConfigMother.createPipelineConfigWithJobConfigs("pipeline1"); JobConfig jobConfig = JobConfigMother.createJobConfigWithJobNameAndEmptyResources(); ValidationContext validationContext=mock(ValidationContext.class); jobConfig.setResourceConfigs(new ResourceConfigs()); jobConfig.setElasticProfileId("non-existent-profile-id"); when(validationContext.getPipeline()).thenReturn(pipelineConfig); when(validationContext.getStage()).thenReturn(pipelineConfig.getFirstStageConfig()); when(validationContext.isValidProfileId("non-existent-profile-id")).thenReturn(false); jobConfig.validate(validationContext); assertThat(jobConfig.errors().isEmpty(), is(false)); assertThat(jobConfig.errors().on(JobConfig.ELASTIC_PROFILE_ID), is("No profile defined corresponding to profile_id 'non-existent-profile-id'")); }
@Test public void shouldValidateAgainstPresenceOfBothResourcesAndElasticProfileId() { PipelineConfig pipelineConfig=PipelineConfigMother.createPipelineConfigWithJobConfigs("pipeline1"); JobConfig jobConfig = JobConfigMother.createJobConfigWithJobNameAndEmptyResources(); ValidationContext validationContext=mock(ValidationContext.class); jobConfig.setElasticProfileId("docker.unit-test"); when(validationContext.getPipeline()).thenReturn(pipelineConfig); when(validationContext.getStage()).thenReturn(pipelineConfig.getFirstStageConfig()); jobConfig.validate(validationContext); assertThat(jobConfig.errors().isEmpty(), is(false)); assertThat(jobConfig.errors().on(JobConfig.ELASTIC_PROFILE_ID), is("Job cannot have both `resource` and `elasticProfileId`")); assertThat(jobConfig.errors().on(JobConfig.RESOURCES), is("Job cannot have both `resource` and `elasticProfileId`")); }
@Test public void shouldReturnTrueIfFirstStageIsManualApproved() { PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("pipeline", "stage", "build"); pipelineConfig.getFirstStageConfig().updateApproval(Approval.manualApproval()); assertThat("First stage should be manual approved", pipelineConfig.isFirstStageManualApproval(), is(true)); }
@Test public void shouldAllowCleanupOfNonExistentStages() { CruiseConfig cruiseConfig = createCruiseConfig(); assertThat(cruiseConfig.isArtifactCleanupProhibited("foo", "bar"), is(false)); PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("foo-pipeline", "bar-stage", "baz-job"); cruiseConfig.addPipeline("defaultGrp", pipelineConfig); assertThat(cruiseConfig.isArtifactCleanupProhibited("foo-pipeline", "baz-stage"), is(false)); assertThat(cruiseConfig.isArtifactCleanupProhibited("foo-pipeline", "bar-stage"), is(false)); ReflectionUtil.setField(pipelineConfig.getFirstStageConfig(), "artifactCleanupProhibited", true); assertThat(cruiseConfig.isArtifactCleanupProhibited("foo-pipeline", "bar-stage"), is(true)); assertThat(cruiseConfig.isArtifactCleanupProhibited("fOO-pipeLINE", "BaR-StagE"), is(true)); }
public void updateFutureStagesFrom(PipelineConfig pipelineConfig) { StageInstanceModel lastStage = this.last(); StageConfig nextStage = lastStage == null ? pipelineConfig.getFirstStageConfig() : pipelineConfig.nextStage(new CaseInsensitiveString(lastStage.getName())); while (nextStage != null && !this.hasStage(str(nextStage.name()))) { this.addFutureStage(str(nextStage.name()), !nextStage.requiresApproval()); nextStage = pipelineConfig.nextStage(nextStage.name()); } } }
private SchedulingChecker timerTriggerCheckers(PipelineConfig pipelineConfig) { String pipelineName = CaseInsensitiveString.str(pipelineConfig.name()); String stageName = CaseInsensitiveString.str(pipelineConfig.getFirstStageConfig().name()); return new CompositeChecker( new AboutToBeTriggeredChecker(pipelineConfig.name(), triggerMonitor, pipelineScheduleQueue), new PipelinePauseChecker(pipelineName, pipelinePauseService), new StageActiveChecker(pipelineName, stageName, stageService), new PipelineLockChecker(pipelineName, pipelineLockService), diskCheckers()); }
@Test public void shouldPassValidationWhenSrcAndDestDirectoryAreInsideAgentSandbox() { StageConfig stage = upstream.getFirstStageConfig(); JobConfig job = stage.getJobs().get(0); FetchTask task = new FetchTask(upstream.name(), stage.name(), job.name(), "src", "dest"); task.validate(ConfigSaveValidationContext.forChain(upstream, stage, job)); assertThat(task.errors().isEmpty(), is(true)); }
private void validateAndAssertIncorrectPath(String source, boolean isSourceDir, String destination, String propertyName) { StageConfig stage = upstream.getFirstStageConfig(); JobConfig job = stage.getJobs().get(0); FetchTask task = new FetchTask(upstream.name(), stage.name(), job.name(), null, destination); if (isSourceDir) { task.setSrcdir(source); } else { task.setSrcfile(source); } task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), upstream, stage, job)); assertThat(task.errors().isEmpty(), is(false)); String path = propertyName.equals(FetchTask.SRC) ? source : destination; String message = String.format("Task of job '%s' in stage '%s' of pipeline '%s' has %s path '%s' which is outside the working directory.", job.name(), stage.name(), upstream.name(), propertyName, path); assertThat(task.errors().on(propertyName), is(message)); }
@Test public void shouldPassValidationWhenFetchingFromAnInstanceOfRunOnAllJob() { StageConfig stage = upstream.getFirstStageConfig(); JobConfig job = stage.getJobs().get(0); job.setRunOnAllAgents(true); FetchTask task = new FetchTask(upstream.name(), stage.name(), new CaseInsensitiveString(job.name() + "-runOnAll-1"), "src", "dest"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), upstream, stage, job)); assertThat(task.errors().on(FetchTask.JOB), is(Matchers.nullValue())); }
public static PartialConfig invalidPartial(String name, RepoConfigOrigin repoOrigin) { PipelineConfig pipe = PipelineConfigMother.pipelineConfig(name); pipe.getFirstStageConfig().setName(new CaseInsensitiveString("")); BasicPipelineConfigs pipes = new BasicPipelineConfigs("grp", new Authorization(), pipe); PartialConfig partialConfig = new PartialConfig(new PipelineGroups(pipes)); partialConfig.setOrigins(repoOrigin); return partialConfig; }
@Test public void shouldFailValidationIfFetchArtifactPipelineAndStageExistsButJobDoesNot_PipelineConfigSave() { PipelineConfig upstream = new PipelineConfig(new CaseInsensitiveString("upstream-pipeline"), new MaterialConfigs(), new StageConfig(new CaseInsensitiveString("upstream-stage"), new JobConfigs(new JobConfig(new CaseInsensitiveString("upstream-job"))))); JobConfig job = new JobConfig(new CaseInsensitiveString("downstream-job")); FetchTask fetchTask = new FetchTask(new CaseInsensitiveString("upstream-pipeline"), new CaseInsensitiveString("upstream-stage"), new CaseInsensitiveString("some-random-job"), "quux.c", "bang-file"); job.addTask(fetchTask); PipelineConfig downstream = new PipelineConfig(new CaseInsensitiveString("downstream-pipeline"), new MaterialConfigs(new DependencyMaterialConfig(upstream.name(), upstream.getFirstStageConfig().name())), new StageConfig(new CaseInsensitiveString("downstream-stage"), new JobConfigs(job))); fetchTask.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", new BasicCruiseConfig(new BasicPipelineConfigs(upstream, downstream)), downstream, downstream.getFirstStageConfig(), downstream.getFirstStageConfig().getJobs().first())); assertThat(fetchTask.errors().isEmpty(), is(false)); assertThat(fetchTask.errors().on(FetchTask.JOB), is("\"downstream-pipeline :: downstream-stage :: downstream-job\" tries to fetch artifact from job \"upstream-pipeline :: upstream-stage :: some-random-job\" which does not exist.")); }
@Test public void shouldNotFailValidationIfUpstreamExists_PipelineConfigSave() { PipelineConfig upstream = new PipelineConfig(new CaseInsensitiveString("upstream-pipeline"), new MaterialConfigs(), new StageConfig(new CaseInsensitiveString("upstream-stage"), new JobConfigs(new JobConfig(new CaseInsensitiveString("upstream-job"))))); JobConfig job = new JobConfig(new CaseInsensitiveString("downstream-job")); FetchTask fetchTask = new FetchTask(new CaseInsensitiveString("upstream-pipeline"), new CaseInsensitiveString("upstream-stage"), new CaseInsensitiveString("upstream-job"), "quux.c", "bang-file"); job.addTask(fetchTask); PipelineConfig downstream = new PipelineConfig(new CaseInsensitiveString("downstream-pipeline"), new MaterialConfigs(new DependencyMaterialConfig(upstream.name(), upstream.getFirstStageConfig().name())), new StageConfig(new CaseInsensitiveString("downstream-stage"), new JobConfigs(job))); fetchTask.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", new BasicCruiseConfig(new BasicPipelineConfigs(upstream, downstream)), downstream, downstream.getFirstStageConfig(), downstream.getFirstStageConfig().getJobs().first())); assertThat(fetchTask.errors().isEmpty(), is(true)); }
@Test public void shouldFailValidationIfFetchArtifactPipelineIsNotAMaterial_PipelineConfigSave() { PipelineConfig upstream = new PipelineConfig(new CaseInsensitiveString("upstream-pipeline"), new MaterialConfigs(), new StageConfig(new CaseInsensitiveString("upstream-stage"), new JobConfigs(new JobConfig(new CaseInsensitiveString("upstream-job"))))); JobConfig job = new JobConfig(new CaseInsensitiveString("downstream-job")); FetchTask fetchTask = new FetchTask(new CaseInsensitiveString("upstream-pipeline"), new CaseInsensitiveString("upstream-stage"), new CaseInsensitiveString("upstream-job"), "quux.c", "bang-file"); job.addTask(fetchTask); PipelineConfig downstream = new PipelineConfig(new CaseInsensitiveString("downstream-pipeline"), new MaterialConfigs(), new StageConfig(new CaseInsensitiveString("downstream-stage"), new JobConfigs(job))); fetchTask.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", new BasicCruiseConfig(new BasicPipelineConfigs(upstream, downstream)), downstream, downstream.getFirstStageConfig(), downstream.getFirstStageConfig().getJobs().first())); assertThat(fetchTask.errors().isEmpty(), is(false)); assertThat(fetchTask.errors().on(FetchTask.PIPELINE_NAME), is("Pipeline \"downstream-pipeline\" tries to fetch artifact from pipeline \"upstream-pipeline\" which is not an upstream pipeline")); }