public StageConfig getFirstStageConfig() { return this.first(); }
public boolean requiresApproval() { if (isEmpty()) { return false; } return first().requiresApproval(); }
public StageConfig findFirstStageOfPipeline(final CaseInsensitiveString pipelineName) { return getCurrentConfig().pipelineConfigByName(pipelineName).first(); }
private AllowedUsers pipelineOperators(PipelineConfig pipeline, Set<String> admins, AllowedUsers groupLevelOperators, Map<String, Collection<String>> rolesToUsers) { if (!pipeline.first().hasOperatePermissionDefined()) { return groupLevelOperators; } Set<String> stageLevelApproversOfFirstStage = namesOf(pipeline.first().getApproval().getAuthConfig(), rolesToUsers); Set<PluginRoleConfig> stageLevelPluginRoleApproversOfFirstStage = pluginRolesFor(goConfigService.security(), pipeline.first().getApproval().getAuthConfig().getRoles()); Set<String> pipelineOperators = new HashSet<>(); pipelineOperators.addAll(admins); pipelineOperators.addAll(stageLevelApproversOfFirstStage); return new AllowedUsers(pipelineOperators, stageLevelPluginRoleApproversOfFirstStage); } }
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; }
@Test public void shouldSupportCommandWithWhiteSpace() throws Exception { String jobWithCommand = "<job name=\"functional\">\n" + " <tasks>\n" + " <exec command=\"c:\\program files\\cmd.exe\" args=\"arguments\" />\n" + " </tasks>\n" + " </job>\n"; String configWithCommand = withCommand(jobWithCommand); CruiseConfig cruiseConfig = ConfigMigrator.loadWithMigration(configWithCommand).config; Task task = cruiseConfig.pipelineConfigByName(new CaseInsensitiveString("pipeline1")).first().allBuildPlans().first().tasks().first(); assertThat(task, is(instanceOf(ExecTask.class))); assertThat(task, is(new ExecTask("c:\\program files\\cmd.exe", "arguments", (String) null))); }
public Pipeline createPipelineInstance(PipelineConfig pipelineConfig, BuildCause buildCause, SchedulingContext context, String md5, Clock clock) { buildCause.assertMaterialsMatch(pipelineConfig.materialConfigs()); buildCause.assertPipelineConfigAndMaterialRevisionMatch(pipelineConfig); EnvironmentVariables variables = EnvironmentVariables.toEnvironmentVariables(pipelineConfig.getVariables()); variables.overrideWith(buildCause.getVariables()); return new Pipeline(CaseInsensitiveString.str(pipelineConfig.name()), pipelineConfig.getLabelTemplate(), buildCause, variables, createStageInstance(pipelineConfig.first(), context, md5, clock)); }
@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")); }
private CruiseConfig cruiseConfigWithProperties(ArtifactPropertyConfig... artifactPropertyConfigs) throws Exception { CruiseConfig cruiseConfig = loader.loadConfigHolder(ONE_PIPELINE).configForEdit; JobConfig jobConfig = BuildPlanMother.withArtifactPropertiesGenerator(artifactPropertyConfigs); cruiseConfig.pipelineConfigByName(new CaseInsensitiveString("pipeline1")).first().allBuildPlans().add(jobConfig); return cruiseConfig; }
private JobConfig loadJobConfig(String jobXml) throws Exception { CruiseConfig config = loader.loadConfigHolder(ConfigFileFixture.withJob(jobXml)).configForEdit; return config.pipelineConfigByName(new CaseInsensitiveString("pipeline1")).first().allBuildPlans().first(); }
protected void shouldCollectAllTheErrorsInTheChildrenHelper(CruiseConfig config) { SecurityAuthConfig ldapConfig = new SecurityAuthConfig("ldap", "cd.go.authorization.ldap"); ldapConfig.errors().add("uri", "invalid ldap uri"); ldapConfig.errors().add("searchBase", "invalid search base"); config.server().security().securityAuthConfigs().add(ldapConfig); PipelineConfig pipelineConfig = config.pipelineConfigByName(new CaseInsensitiveString("pipeline-1")); pipelineConfig.errors().add("base", "Some base errors"); P4MaterialConfig p4MaterialConfig = new P4MaterialConfig("localhost:1999", "view"); p4MaterialConfig.setConfigAttributes(Collections.singletonMap(ScmMaterialConfig.FOLDER, "p4_folder")); pipelineConfig.addMaterialConfig(p4MaterialConfig); p4MaterialConfig.errors().add("materialName", "material name does not follow pattern"); StageConfig stage = pipelineConfig.first(); stage.errors().add("role", "Roles must be proper"); List<ConfigErrors> allErrors = config.validateAfterPreprocess(); assertThat(allErrors.size(), is(5)); assertThat(allErrors.get(0).on("uri"), is("invalid ldap uri")); assertThat(allErrors.get(0).on("searchBase"), is("invalid search base")); assertThat(allErrors.get(1).on("base"), is("Some base errors")); assertThat(allErrors.get(2).on("role"), is("Roles must be proper")); assertThat(allErrors.get(3).on(ScmMaterialConfig.FOLDER), is("Destination directory is required when specifying multiple scm materials")); assertThat(allErrors.get(4).on("materialName"), is("material name does not follow pattern")); }
@Test public void getAllErrors_shouldIgnoreErrorsOnElementToBeSkipped() { CruiseConfig config = GoConfigMother.configWithPipelines("pipeline-1"); SecurityAuthConfig ldapConfig = new SecurityAuthConfig("ldap", "cd.go.authorization.ldap"); ldapConfig.errors().add("uri", "invalid ldap uri"); ldapConfig.errors().add("searchBase", "invalid search base"); config.server().security().securityAuthConfigs().add(ldapConfig); PipelineConfig pipelineConfig = config.pipelineConfigByName(new CaseInsensitiveString("pipeline-1")); pipelineConfig.errors().add("base", "Some base errors"); P4MaterialConfig p4MaterialConfig = new P4MaterialConfig("localhost:1999", "view"); pipelineConfig.addMaterialConfig(p4MaterialConfig); p4MaterialConfig.errors().add("materialName", "material name does not follow pattern"); StageConfig stage = pipelineConfig.first(); stage.errors().add("role", "Roles must be proper"); List<ConfigErrors> allErrors = config.getAllErrorsExceptFor(p4MaterialConfig); assertThat(allErrors.size(), is(3)); assertThat(allErrors.get(0).on("uri"), is("invalid ldap uri")); assertThat(allErrors.get(0).on("searchBase"), is("invalid search base")); assertThat(allErrors.get(1).on("base"), is("Some base errors")); assertThat(allErrors.get(2).on("role"), is("Roles must be proper")); }
@Test public void getAllErrors_shouldCollectAllErrorsInTheChildren() { CruiseConfig config = GoConfigMother.configWithPipelines("pipeline-1"); SecurityAuthConfig ldapConfig = new SecurityAuthConfig("ldap", "cd.go.authorization.ldap"); ldapConfig.errors().add("uri", "invalid ldap uri"); ldapConfig.errors().add("searchBase", "invalid search base"); config.server().security().securityAuthConfigs().add(ldapConfig); PipelineConfig pipelineConfig = config.pipelineConfigByName(new CaseInsensitiveString("pipeline-1")); pipelineConfig.errors().add("base", "Some base errors"); P4MaterialConfig p4MaterialConfig = new P4MaterialConfig("localhost:1999", "view"); pipelineConfig.addMaterialConfig(p4MaterialConfig); p4MaterialConfig.errors().add("materialName", "material name does not follow pattern"); StageConfig stage = pipelineConfig.first(); stage.errors().add("role", "Roles must be proper"); List<ConfigErrors> allErrors = config.getAllErrors(); assertThat(allErrors.size(), is(4)); assertThat(allErrors.get(0).on("uri"), is("invalid ldap uri")); assertThat(allErrors.get(0).on("searchBase"), is("invalid search base")); assertThat(allErrors.get(1).on("base"), is("Some base errors")); assertThat(allErrors.get(2).on("role"), is("Roles must be proper")); assertThat(allErrors.get(3).on("materialName"), is("material name does not follow pattern")); }
public static PipelineConfig createManualTriggerPipelineConfig(MaterialConfig materialConfig, String pipelineName, String stageName, String... buildNames) { PipelineConfig pipelineConfig = createPipelineConfig(pipelineName, stageName, buildNames); pipelineConfig.materialConfigs().clear(); materialConfig.setName(new CaseInsensitiveString(String.format("%s-%s", pipelineName, materialConfig.getType()))); materialConfig.setAutoUpdate(false); pipelineConfig.materialConfigs().add(materialConfig); pipelineConfig.first().setApproval(Approval.manualApproval()); return pipelineConfig; }
public static PartialConfig pipelineWithDependencyMaterial(String name, PipelineConfig upstream, RepoConfigOrigin repoConfig) { PartialConfig partialConfig = withPipeline(name, repoConfig); PipelineConfig pipeline = partialConfig.getGroups().first().get(0); pipeline.materialConfigs().add(new DependencyMaterialConfig(upstream.name(), upstream.first().name())); return partialConfig; }
@Test public void shouldAddValidationErrorsFromStagesOntoPipelineIfPipelineIsAssociatedToATemplate() { BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1", "p2", "p3"); PipelineConfig p1 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p1")); PipelineConfig p2 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p2")); PipelineConfig p3 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p3")); p2.addMaterialConfig(new DependencyMaterialConfig(p1.name(), p1.first().name())); p3.addMaterialConfig(new DependencyMaterialConfig(p2.name(), p2.first().name())); p3.first().getJobs().first().addTask(new FetchTask(new CaseInsensitiveString("p1/p2"), p1.first().name(), p1.first().getJobs().first().name(), "src", "dest")); StageConfig stageConfig = new StageConfig(new CaseInsensitiveString("stage"), new JobConfigs(new JobConfig(new CaseInsensitiveString("new-job")))); PipelineConfig pipelineConfig = new PipelineConfig(p1.name(), new MaterialConfigs(), stageConfig); String group = cruiseConfig.getGroups().first().getGroup(); cruiseConfig.update(group, pipelineConfig.name().toString(), pipelineConfig); PipelineConfigSaveValidationContext validationContext = PipelineConfigSaveValidationContext.forChain(false, group, cruiseConfig, pipelineConfig); pipelineConfig.validateTree(validationContext); assertThat(pipelineConfig.errors().on("base"), is("\"p3 :: stage :: job\" tries to fetch artifact from job \"p1 :: stage :: job\" which does not exist.")); }
@Test public void getAllErrors_shouldRetainAllErrorsWhenNoSubjectGiven() { CruiseConfig config = GoConfigMother.configWithPipelines("pipeline-1"); SecurityAuthConfig ldapConfig = new SecurityAuthConfig("ldap", "cd.go.authorization.ldap"); ldapConfig.errors().add("uri", "invalid ldap uri"); ldapConfig.errors().add("searchBase", "invalid search base"); config.server().security().securityAuthConfigs().add(ldapConfig); PipelineConfig pipelineConfig = config.pipelineConfigByName(new CaseInsensitiveString("pipeline-1")); pipelineConfig.errors().add("base", "Some base errors"); P4MaterialConfig p4MaterialConfig = new P4MaterialConfig("localhost:1999", "view"); pipelineConfig.addMaterialConfig(p4MaterialConfig); p4MaterialConfig.errors().add("materialName", "material name does not follow pattern"); StageConfig stage = pipelineConfig.first(); stage.errors().add("role", "Roles must be proper"); List<ConfigErrors> allErrors = config.getAllErrorsExceptFor(null); assertThat(allErrors.size(), is(4)); }
@Test public void shouldFailValidationIfAJobIsDeletedWhileItsStillReferredToByADescendentPipelineThroughFetchArtifact() { BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1", "p2", "p3"); PipelineConfig p1 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p1")); PipelineConfig p2 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p2")); PipelineConfig p3 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p3")); p2.addMaterialConfig(new DependencyMaterialConfig(p1.name(), p1.first().name())); JobConfig p2S2J2 = new JobConfig(new CaseInsensitiveString("j2")); p2S2J2.addTask(fetchTaskFromSamePipeline(p2)); p2.add(new StageConfig(new CaseInsensitiveString("stage2"), new JobConfigs(p2S2J2))); p3.addMaterialConfig(new DependencyMaterialConfig(p2.name(), p2.first().name())); p3.first().getJobs().first().addTask(new FetchTask(new CaseInsensitiveString("p1/p2"), p1.first().name(), p1.first().getJobs().first().name(), "src", "dest")); StageConfig stageConfig = new StageConfig(new CaseInsensitiveString("stage"), new JobConfigs(new JobConfig(new CaseInsensitiveString("new-job")))); PipelineConfig pipelineConfig = new PipelineConfig(p1.name(), new MaterialConfigs(), stageConfig); String group = cruiseConfig.getGroups().first().getGroup(); cruiseConfig.update(group, pipelineConfig.name().toString(), pipelineConfig); PipelineConfigSaveValidationContext validationContext = PipelineConfigSaveValidationContext.forChain(false, group, cruiseConfig, pipelineConfig); pipelineConfig.validateTree(validationContext); assertThat(pipelineConfig.errors().on("base"), is("\"p3 :: stage :: job\" tries to fetch artifact from job \"p1 :: stage :: job\" which does not exist.")); }
@Test public void shouldFailValidationIfAStageIsDeletedWhileItsStillReferredToByADownstreamPipeline() { BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1", "p2"); PipelineConfig p1 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p1")); PipelineConfig p2 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p2")); p2.addMaterialConfig(new DependencyMaterialConfig(p1.name(), p1.first().name())); String group = cruiseConfig.getGroups().first().getGroup(); StageConfig stageConfig = new StageConfig(new CaseInsensitiveString("s1"), new JobConfigs(new JobConfig(new CaseInsensitiveString("j1")))); PipelineConfig pipelineConfig = new PipelineConfig(p1.name(), new MaterialConfigs(), stageConfig); cruiseConfig.update(group, pipelineConfig.name().toString(), pipelineConfig); PipelineConfigSaveValidationContext validationContext = PipelineConfigSaveValidationContext.forChain(false, group, cruiseConfig, pipelineConfig); pipelineConfig.validateTree(validationContext); assertThat(pipelineConfig.errors().on("base"), is("Stage with name 'stage' does not exist on pipeline 'p1', it is being referred to from pipeline 'p2' (cruise-config.xml)")); }