/* * Copyright 2016 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.thoughtworks.go.helper; import com.thoughtworks.go.config.*; import com.thoughtworks.go.config.materials.Filter; import com.thoughtworks.go.config.materials.MaterialConfigs; import com.thoughtworks.go.config.materials.ScmMaterialConfig; import com.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig; import com.thoughtworks.go.config.materials.git.GitMaterialConfig; import com.thoughtworks.go.config.materials.svn.SvnMaterialConfig; import com.thoughtworks.go.config.remote.ConfigRepoConfig; import com.thoughtworks.go.config.remote.ConfigReposConfig; import com.thoughtworks.go.config.remote.FileConfigOrigin; import com.thoughtworks.go.domain.config.*; import com.thoughtworks.go.domain.label.PipelineLabel; import com.thoughtworks.go.domain.materials.MaterialConfig; import com.thoughtworks.go.domain.packagerepository.PackageDefinitionMother; import com.thoughtworks.go.domain.packagerepository.PackageRepositories; import com.thoughtworks.go.domain.packagerepository.PackageRepository; import com.thoughtworks.go.domain.packagerepository.Packages; import com.thoughtworks.go.plugin.access.packagematerial.PackageConfiguration; import com.thoughtworks.go.plugin.access.packagematerial.PackageConfigurations; import com.thoughtworks.go.plugin.access.packagematerial.RepositoryMetadataStore; import com.thoughtworks.go.security.GoCipher; import java.io.File; import java.util.Arrays; import static com.thoughtworks.go.config.PipelineConfigs.DEFAULT_GROUP; import static java.util.Arrays.asList; public class GoConfigMother { public Role createRole(String roleName, String... users) { return new RoleConfig(new CaseInsensitiveString(roleName), toRoleUsers(users)); } private RoleUser[] toRoleUsers(String[] users) { RoleUser[] roleUsers = new RoleUser[users.length]; for (int i = 0; i < users.length; i++) { roleUsers[i] = new RoleUser(new CaseInsensitiveString(users[i])); } return roleUsers; } public void addRole(CruiseConfig cruiseConfig, Role role) { cruiseConfig.server().security().addRole(role); } public void addAdminUserForPipelineGroup(CruiseConfig cruiseConfig, String user, String groupName) { PipelineConfigs group = cruiseConfig.getGroups().findGroup(groupName); group.getAuthorization().getAdminsConfig().add(new AdminUser(new CaseInsensitiveString(user))); } public GoConfigMother addAdminRoleForPipelineGroup(CruiseConfig config, String roleName, String groupName) { PipelineConfigs group = config.getGroups().findGroup(groupName); group.getAuthorization().getAdminsConfig().add(new AdminRole(new CaseInsensitiveString(roleName))); return this; } public void addRoleAsSuperAdmin(CruiseConfig cruiseConfig, String rolename) { AdminsConfig adminsConfig = cruiseConfig.server().security().adminsConfig(); adminsConfig.addRole(new AdminRole(new CaseInsensitiveString(rolename))); } public static void enableSecurityWithPasswordFile(CruiseConfig cruiseConfig) { cruiseConfig.server().security().modifyPasswordFile(new PasswordFileConfig("password_file_path")); } public static CruiseConfig addUserAsSuperAdmin(CruiseConfig config, String adminName) { config.server().security().adminsConfig().add(new AdminUser(new CaseInsensitiveString(adminName))); return config; } public void addUserAsViewerOfPipelineGroup(CruiseConfig cruiseConfig, String userName, String groupName) { PipelineConfigs group = cruiseConfig.getGroups().findGroup(groupName); group.getAuthorization().getViewConfig().add(new AdminUser(new CaseInsensitiveString(userName))); } public void addRoleAsViewerOfPipelineGroup(CruiseConfig cruiseConfig, String roleName, String groupName) { PipelineConfigs group = cruiseConfig.getGroups().findGroup(groupName); group.getAuthorization().getViewConfig().add(new AdminRole(new CaseInsensitiveString(roleName))); } public PipelineConfig addPipeline(CruiseConfig cruiseConfig, String pipelineName, String stageName, String... buildNames) { return addPipelineWithGroup(cruiseConfig, DEFAULT_GROUP, pipelineName, stageName, buildNames); } public PipelineConfig addPipelineWithGroup(CruiseConfig cruiseConfig, String groupName, String pipelineName, String stageName, String... buildNames) { return addPipelineWithGroup(cruiseConfig, groupName, pipelineName, new MaterialConfigs(MaterialConfigsMother.mockMaterialConfigs("file:///tmp/foo")), stageName, buildNames); } public PipelineConfig addPipelineWithGroup(CruiseConfig cruiseConfig, String groupName, String pipelineName, MaterialConfigs materialConfigs, String stageName, String... buildNames) { return addPipelineWithGroupAndTimer(cruiseConfig, groupName, pipelineName, materialConfigs, stageName, null, buildNames); } /* Used in rspecs */ public CruiseConfig cruiseConfigWithPipelineUsingTwoMaterials() throws Exception { final CruiseConfig config = defaultCruiseConfig(); addPipelineWithGroup(config, "group1", "pipeline1", MaterialConfigsMother.multipleMaterialConfigs(), "stage", "job"); return config; } /* Used in rspecs */ public PipelineConfig addPipelineWithTemplate(CruiseConfig cruiseConfig, String pipelineName, String templateName, String stageName, String... buildNames) { PipelineTemplateConfig templateConfig = new PipelineTemplateConfig(new CaseInsensitiveString(templateName), StageConfigMother.custom(stageName, defaultBuildPlans(buildNames))); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString(pipelineName), MaterialConfigsMother.mockMaterialConfigs("file:///tmp/foo")); pipelineConfig.setTemplateName(new CaseInsensitiveString(templateName)); cruiseConfig.addTemplate(templateConfig); cruiseConfig.addPipeline(DEFAULT_GROUP, pipelineConfig); return pipelineConfig; } public PipelineConfig addPipelineWithGroupAndTimer(CruiseConfig cruiseConfig, String groupName, String pipelineName, MaterialConfigs materialConfigs, String stageName, TimerConfig timer, String... buildNames) { String cronSpec = timer == null ? null : timer.getTimerSpec(); boolean shouldTriggerOnlyOnMaterialChanges = timer != null && timer.shouldTriggerOnlyOnChanges(); StageConfig stageConfig = StageConfigMother.custom(stageName, defaultBuildPlans(buildNames)); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString(pipelineName), PipelineLabel.COUNT_TEMPLATE, cronSpec, shouldTriggerOnlyOnMaterialChanges, materialConfigs, asList(stageConfig)); pipelineConfig.setOrigin(new FileConfigOrigin()); cruiseConfig.addPipeline(groupName, pipelineConfig); return pipelineConfig; } public PipelineConfig addPipeline(CruiseConfig cruiseConfig, String pipelineName, String stageName, MaterialConfigs materialConfigs, String... buildNames) { StageConfig stageConfig = StageConfigMother.custom(stageName, defaultBuildPlans(buildNames)); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString(pipelineName), materialConfigs, stageConfig); pipelineConfig.setOrigin(new FileConfigOrigin()); cruiseConfig.addPipeline(DEFAULT_GROUP, pipelineConfig); return pipelineConfig; } public PipelineConfig addStageToPipeline(CruiseConfig cruiseConfig, String pipelineName, String stageName, String... buildNames) { StageConfig stageConfig = StageConfigMother.custom(stageName, defaultBuildPlans(buildNames)); PipelineConfig pipelineConfig = cruiseConfig.pipelineConfigByName(new CaseInsensitiveString(pipelineName)); pipelineConfig.add(stageConfig); return pipelineConfig; } public PipelineConfig addStageToPipeline(CruiseConfig cruiseConfig, String pipelineName, String stageName, int stageindex, String... buildNames) { StageConfig stageConfig = StageConfigMother.custom(stageName, defaultBuildPlans(buildNames)); PipelineConfig pipelineConfig = cruiseConfig.pipelineConfigByName(new CaseInsensitiveString(pipelineName)); pipelineConfig.add(stageindex, stageConfig); return pipelineConfig; } public void setDependencyOn(CruiseConfig cruiseConfig, PipelineConfig pipelineConfig, String dependsOnPipeline, String dependsOnStage) { PipelineConfig config = cruiseConfig.pipelineConfigByName(pipelineConfig.name()); config.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString(dependsOnPipeline), new CaseInsensitiveString(dependsOnStage))); } public BasicCruiseConfig cruiseConfigWithTwoPipelineGroups() throws Exception { final BasicCruiseConfig config = cruiseConfigWithOnePipelineGroup(); addPipelineWithGroup(config, "group2", "pipeline2", "stage", "job"); return config; } public BasicCruiseConfig cruiseConfigWithOnePipelineGroup() throws Exception { final BasicCruiseConfig config = defaultCruiseConfig(); addPipelineWithGroup(config, "group1", "pipeline1", "stage", "job"); return config; } public static BasicCruiseConfig defaultCruiseConfig() { try { BasicCruiseConfig cruiseConfig = new BasicCruiseConfig(); ServerConfig serverConfig = new ServerConfig("artifactsDir", new SecurityConfig()); cruiseConfig.setServerConfig(serverConfig); return cruiseConfig; } catch (Exception e) { throw new RuntimeException(e); } } private static JobConfigs defaultBuildPlans(String... planNames) { JobConfigs plans = new JobConfigs(); for (String name : planNames) { plans.add(defaultBuildPlan(name)); } return plans; } private static JobConfig defaultBuildPlan(String name) { return new JobConfig(new CaseInsensitiveString(name), new Resources(), new ArtifactPlans()); } public static BasicCruiseConfig cruiseConfigWithMailHost(MailHost mailHost) { final BasicCruiseConfig config = new BasicCruiseConfig(); ServerConfig serverConfig = new ServerConfig(); serverConfig.setMailHost(mailHost); config.setServerConfig(serverConfig); return config; } public static BasicCruiseConfig configWithPipelines(String... names) { final BasicCruiseConfig config = new BasicCruiseConfig(); GoConfigMother mother = new GoConfigMother(); for (String name : names) { mother.addPipeline(config, name, "stage", "job"); } return config; } public static CruiseConfig configWithPackageRepo(String... ids) throws Exception { final CruiseConfig config = new BasicCruiseConfig(); PackageConfigurations configuration = new PackageConfigurations(); configuration.addConfiguration(new PackageConfiguration("key1")); configuration.addConfiguration(new PackageConfiguration("key2").with(PackageConfiguration.SECURE, true)); RepositoryMetadataStore.getInstance().addMetadataFor("plugin-1", configuration); for (String id : ids) { PackageRepository packageRepository = new PackageRepository(); packageRepository.setId(id); packageRepository.setName("name"+id); packageRepository.setPluginConfiguration(new PluginConfiguration("plugin-1", "1.0.0")); packageRepository.setPackages(new Packages(PackageDefinitionMother.create(id + "-pkg-1", packageRepository), PackageDefinitionMother.create(id + "-pkg-2", packageRepository))); GoCipher cipher = new GoCipher(); ConfigurationProperty p1 = new ConfigurationProperty(new ConfigurationKey("key1"), new ConfigurationValue("value1")); ConfigurationProperty p2 = new ConfigurationProperty(new ConfigurationKey("key2"), null, new EncryptedConfigurationValue(cipher.encrypt("value2")), cipher); packageRepository.setConfiguration(new Configuration(p1, p2)); config.setPackageRepositories(new PackageRepositories(packageRepository)); } return config; } public static PipelineConfig createPipelineConfigWithMaterialConfig(MaterialConfig... materialConfigs) { return createPipelineConfigWithMaterialConfig("pipeline", materialConfigs); } public static PipelineConfig createPipelineConfigWithMaterialConfig(String pipelineName, MaterialConfig... materialConfigs) { CruiseConfig config = new BasicCruiseConfig(); MaterialConfigs toAdd = new MaterialConfigs(); toAdd.addAll(Arrays.asList(materialConfigs)); return new GoConfigMother().addPipeline(config, pipelineName, "stage", toAdd, "job"); } public static PipelineConfig createPipelineConfig(Filter filter, ScmMaterialConfig... materialConfigs) { for (ScmMaterialConfig scmMaterialConfig : materialConfigs) { scmMaterialConfig.setFilter(filter); } return createPipelineConfigWithMaterialConfig(materialConfigs); } public static CruiseConfig pipelineHavingJob(String pipelineName, String stageName, String jobPlanName, String filePath, String directoryPath) { CruiseConfig config = new BasicCruiseConfig(); config.server().setArtifactsDir("logs"); JobConfig job = new JobConfig(jobPlanName); String workingDir = new File("testdata/" + CruiseConfig.WORKING_BASE_DIR + stageName).getPath(); AntTask task = new AntTask(); task.setWorkingDirectory(workingDir); job.addTask(task); final ArtifactPlan artifactFile = new ArtifactPlan(); artifactFile.setSrc(filePath); job.artifactPlans().add(artifactFile); ArtifactPlan artifactDir = new ArtifactPlan(); artifactFile.setSrc(directoryPath); job.artifactPlans().add(artifactDir); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString(pipelineName), new MaterialConfigs(new SvnMaterialConfig("file:///foo", null, null, false)), new StageConfig( new CaseInsensitiveString(stageName), new JobConfigs(job))); config.addPipeline(BasicPipelineConfigs.DEFAULT_GROUP, pipelineConfig); return config; } public CruiseConfig addApprovalForStage(CruiseConfig cruiseConfig, String pipelineName, String stageName, String roleName) { Approval stageApproval = cruiseConfig.stageConfigByName(new CaseInsensitiveString(pipelineName), new CaseInsensitiveString(stageName)).getApproval(); stageApproval.addAdmin(new AdminRole(new CaseInsensitiveString(roleName))); return cruiseConfig; } public static CruiseConfig simpleDiamond() { CruiseConfig cruiseConfig = new BasicCruiseConfig(); PipelineConfig pipeline1 = PipelineConfigMother.pipelineConfig("p1", new MaterialConfigs(MaterialConfigsMother.gitMaterialConfig("g1"))); PipelineConfig pipeline2 = PipelineConfigMother.pipelineConfig("p2", new MaterialConfigs(MaterialConfigsMother.gitMaterialConfig("g1"))); PipelineConfig pipeline3 = PipelineConfigMother.pipelineConfig("p3", new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("p1", "stage-1-1"), MaterialConfigsMother.dependencyMaterialConfig("p2", "stage-1-1"))); cruiseConfig.addPipeline("group-1", pipeline1); cruiseConfig.addPipeline("group-1", pipeline2); cruiseConfig.addPipeline("group-1", pipeline3); return cruiseConfig; } public static CruiseConfig configWithConfigRepo() { CruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.setConfigRepos(new ConfigReposConfig(new ConfigRepoConfig( new GitMaterialConfig("https://github.com/tomzo/gocd-indep-config-part.git"),"myplugin" ))); return cruiseConfig; } }