CRStage stageToCRStage(StageConfig stageConfig) { CRStage crStage = new CRStage(stageConfig.name().toString()); for(JobConfig job: stageConfig.getJobs()) { crStage.addJob(jobToCRJob(job)); } for (EnvironmentVariableConfig var: stageConfig.getVariables()) { crStage.addEnvironmentVariable(environmentVariableConfigToCREnvironmentVariable(var)); } crStage.setApproval(approvalToCRApproval(stageConfig.getApproval())); crStage.setFetchMaterials(stageConfig.isFetchMaterials()); crStage.setArtifactCleanupProhibited(stageConfig.isArtifactCleanupProhibited()); crStage.setCleanWorkingDir(stageConfig.isCleanWorkingDir()); return crStage; }
@Test public void shouldSetPrimitiveAttributes() throws Exception{ StageConfig config = new StageConfig(); config.setConfigAttributes(Collections.singletonMap(StageConfig.NAME, "foo_bar")); config.setConfigAttributes(Collections.singletonMap(StageConfig.FETCH_MATERIALS, "0")); config.setConfigAttributes(Collections.singletonMap(StageConfig.CLEAN_WORKING_DIR, "1")); assertThat(config.name(), is(new CaseInsensitiveString("foo_bar"))); assertThat(config.isFetchMaterials(), is(false)); assertThat(config.isCleanWorkingDir(), is(true)); }
@Override public JobConfig findJob(String pipelineName, String stageName, String jobName) { return pipelineConfigByName(new CaseInsensitiveString(pipelineName)) .findBy(new CaseInsensitiveString(stageName)) .jobConfigByConfigName(new CaseInsensitiveString(jobName)); }
public void encryptSecureProperties(CruiseConfig preprocessedConfig, PipelineConfig preprocessedPipelineConfig, StageConfig preprocessedStageConfig) { for (JobConfig jobConfig : getJobs()) { jobConfig.encryptSecureProperties(preprocessedConfig, preprocessedPipelineConfig, preprocessedStageConfig.jobConfigByConfigName(jobConfig.name())); } }
public Stage createStageInstance(StageConfig stageConfig, SchedulingContext context, String md5, Clock clock) { return new Stage(CaseInsensitiveString.str(stageConfig.name()), createJobInstances(stageConfig, context, clock), context.getApprovedBy(), null, stageConfig.approvalType(), stageConfig.isFetchMaterials(), stageConfig.isCleanWorkingDir(), md5, clock); }
public static void toJSON(OutputWriter jsonWriter, StageConfig stageConfig) { if (!stageConfig.errors().isEmpty()) { jsonWriter.addChild("errors", errorWriter -> { new ErrorGetter(new HashMap<>()).toJSON(errorWriter, stageConfig); }); } jsonWriter.addIfNotNull("name", stageConfig.name()); jsonWriter.add("fetch_materials", stageConfig.isFetchMaterials()); jsonWriter.add("clean_working_directory", stageConfig.isCleanWorkingDir()); jsonWriter.add("never_cleanup_artifacts", stageConfig.isArtifactCleanupProhibited()); jsonWriter.addChild("approval", approvalWriter -> ApprovalRepresenter.toJSON(approvalWriter, stageConfig.getApproval())); jsonWriter.addChildList("environment_variables", envVarsWriter -> EnvironmentVariableRepresenter.toJSON(envVarsWriter, stageConfig.getVariables())); jsonWriter.addChildList("jobs", getJobs(stageConfig)); }
copy(from.getTimer(), to.getTimer()); for (StageConfig toStage : to.getStages()) { StageConfig fromStage = from.findBy(toStage.name()); copy(fromStage, toStage); copyCollectionErrors(fromStage.getVariables(), toStage.getVariables()); copy(fromStage.getApproval(), toStage.getApproval()); copyCollectionErrors(fromStage.getApproval().getAuthConfig(), toStage.getApproval().getAuthConfig()); for (JobConfig toJob : toStage.getJobs()) { JobConfig fromJob = fromStage.jobConfigByConfigName(toJob.name()); copy(fromJob, toJob); copyCollectionErrors(fromJob.getTasks(), toJob.getTasks());
assertThat(stage1.name(), is(new CaseInsensitiveString("stage1"))); assertThat(stage1.allBuildPlans().size(), is(1)); assertThat("Should require approval", stage1.requiresApproval(), is(true)); AdminsConfig admins = stage1.getApproval().getAuthConfig(); assertThat(admins, hasItem((Admin) new AdminRole(new CaseInsensitiveString("admin")))); assertThat(admins, hasItem((Admin) new AdminRole(new CaseInsensitiveString("qa_lead")))); assertThat("Should not require approval", stage2.requiresApproval(), is(false)); JobConfig plan = stage1.jobConfigByInstanceName("plan1", true); assertThat(plan.name(), is(new CaseInsensitiveString("plan1"))); assertThat(plan.resourceConfigs(), is(new ResourceConfigs("tiger, lion")));
@Test public void shouldNotAttemptToEncryptPropertiesIfThereAreNoPluginConfigs() { PipelineConfig pipelineConfig = new PipelineConfig(); StageConfig mockStageConfig = mock(StageConfig.class); pipelineConfig.add(mockStageConfig); JobConfig jobConfig = new JobConfig(new CaseInsensitiveString("job")); when(mockStageConfig.getJobs()).thenReturn(new JobConfigs(jobConfig)); when(mockStageConfig.name()).thenReturn(new CaseInsensitiveString("stage")); pipelineConfig.encryptSecureProperties(new BasicCruiseConfig(), pipelineConfig); verify(mockStageConfig, never()).encryptSecureProperties(eq(new BasicCruiseConfig()), eq(pipelineConfig), ArgumentMatchers.any(StageConfig.class)); }
@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)); }
public static StageConfig custom(String stageName, boolean artifactCleanupProhibited, String... buildNames) { StageConfig stageConfig = new StageConfig(new CaseInsensitiveString(stageName), BuildPlanMother.jobConfigs(buildNames)); ReflectionUtil.setField(stageConfig, "artifactCleanupProhibited", artifactCleanupProhibited); return stageConfig; }
private List<ProjectStatus> findStageAndStatusesFromCache(PipelineConfig pipelineConfig, StageConfig stageConfig) { List<ProjectStatus> projectStatuses = new ArrayList<>(); String stageProjectName = stageProjectName(pipelineConfig, stageConfig); projectStatuses.add(cache.get(stageProjectName)); for (JobConfig jobConfig : stageConfig.getJobs()) { ProjectStatus jobStatus = cache.get(jobProjectName(stageProjectName, jobConfig)); if (jobStatus != null) { projectStatuses.add(jobStatus); } } return projectStatuses; }
public StageConfig previousStage(final CaseInsensitiveString stageName) { StageConfig lastStageConfig = null; for (StageConfig currentStageConfig : this) { if (currentStageConfig.name().equals(stageName)) { return lastStageConfig; } lastStageConfig = currentStageConfig; } return null; }
@Test public void shouldSetApprovalFromConfigAttrs() throws Exception{ StageConfig config = new StageConfig(); config.setConfigAttributes(Collections.singletonMap(StageConfig.APPROVAL, Collections.singletonMap(Approval.TYPE, Approval.MANUAL))); assertThat(config.getApproval().getType(), is(Approval.MANUAL)); config.setConfigAttributes(new HashMap()); assertThat(config.getApproval().getType(), is(Approval.MANUAL)); config.setConfigAttributes(Collections.singletonMap(StageConfig.APPROVAL, Collections.singletonMap(Approval.TYPE, Approval.SUCCESS))); assertThat(config.getApproval().getType(), is(Approval.SUCCESS)); config.setConfigAttributes(new HashMap()); assertThat(config.getApproval().getType(), is(Approval.SUCCESS)); }
@Test public void shouldValidateTree(){ EnvironmentVariablesConfig variables = mock(EnvironmentVariablesConfig.class); JobConfigs jobConfigs = mock(JobConfigs.class); Approval approval = mock(Approval.class); StageConfig stageConfig = new StageConfig(new CaseInsensitiveString("stage$"), jobConfigs, approval); stageConfig.setVariables(variables); stageConfig.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig(), stageConfig)); assertThat(stageConfig.errors().on(StageConfig.NAME), contains("Invalid stage name 'stage$'")); ArgumentCaptor<PipelineConfigSaveValidationContext> captor = ArgumentCaptor.forClass(PipelineConfigSaveValidationContext.class); verify(jobConfigs).validateTree(captor.capture()); PipelineConfigSaveValidationContext childContext = captor.getValue(); assertThat(childContext.getParent(), is(stageConfig)); verify(approval).validateTree(childContext); verify(variables).validateTree(childContext); }
@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 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.")); }
private void populateReferences(List<Map<JobConfigIdentifier, List<PluggableArtifactConfig>>> usedByPipelines, PipelineConfig pipelineConfig) { for (StageConfig stage : pipelineConfig) { JobConfigs jobs = stage.getJobs(); for (JobConfig job : jobs) { final List<PluggableArtifactConfig> artifactConfigs = job.artifactConfigs().findByStoreId(profile.getId()); if (!artifactConfigs.isEmpty()) { usedByPipelines.add(Collections.singletonMap(new JobConfigIdentifier(pipelineConfig.name(), stage.name(), job.name()), artifactConfigs)); } } } } }
@Test public void shouldLoadStageFromXmlPartial() throws Exception { String stageXmlPartial = "<stage name=\"mingle\">\n" + " <jobs>\n" + " <job name=\"functional\">\n" + " <artifacts>\n" + " <log src=\"artifact1.xml\" dest=\"cruise-output\" />\n" + " </artifacts>\n" + " </job>\n" + " </jobs>\n" + "</stage>\n"; StageConfig stage = xmlLoader.fromXmlPartial(stageXmlPartial, StageConfig.class); assertThat(stage.name(), is(new CaseInsensitiveString("mingle"))); assertThat(stage.allBuildPlans().size(), is(1)); assertThat(stage.jobConfigByInstanceName("functional", true), is(notNullValue())); }
@Test public void shouldSetArtifactCleanupOptOutAttribute() throws Exception{ StageConfig config = new StageConfig(); assertThat(config.isArtifactCleanupProhibited(), is(false)); config.setConfigAttributes(Collections.singletonMap(StageConfig.ARTIFACT_CLEANUP_PROHIBITED, "1")); assertThat(config.isArtifactCleanupProhibited(), is(true)); config.setConfigAttributes(new HashMap()); assertThat(config.isArtifactCleanupProhibited(), is(true)); config.setConfigAttributes(Collections.singletonMap(StageConfig.ARTIFACT_CLEANUP_PROHIBITED, "0")); assertThat(config.isArtifactCleanupProhibited(), is(false)); }