Java tutorial
package com.thoughtworks.cruise; import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.UUID; import org.apache.commons.io.FileUtils; import org.dom4j.Element; import com.thoughtworks.cruise.config.ConfigModifier; import com.thoughtworks.cruise.config.ModifyCommand; import com.thoughtworks.cruise.config.RetryOnConflictModifier; import com.thoughtworks.cruise.context.Configuration; import com.thoughtworks.cruise.page.OnAgentsPage; import com.thoughtworks.cruise.preconditions.AgentLauncher; import com.thoughtworks.cruise.state.RepositoryState; import com.thoughtworks.cruise.state.ScenarioState; import com.thoughtworks.cruise.util.FileUtil; import com.thoughtworks.cruise.utils.configfile.CruiseConfigDom; public class ConfigureCruiseBy { private static final String ORIGINAL_LDAP_URI = "original_ldap_uri"; private final ScenarioState scenarioState; private Configuration configuration; private final OnAgentsPage agentsPage; private static final String CONTANT_SPEC = "* * * * * ? *"; private final CruiseAgents createdAgents; private final RepositoryState repositoryState; private ConfigModifier modifier; private String rememberedUrl; private static String TMP_FILE_SUFFIX = UUID.randomUUID().toString(); public ConfigureCruiseBy(Configuration configuration, ScenarioState scenarioState, OnAgentsPage agentsPage, CruiseAgents createdAgents, RepositoryState repositoryState) { this.scenarioState = scenarioState; this.configuration = configuration; this.agentsPage = agentsPage; this.createdAgents = createdAgents; this.repositoryState = repositoryState; modifier = new RetryOnConflictModifier(configuration); } public void changingApprovalTypeForPipelineStageTo(final String pipelineName, final String stageName, final String triggerType) { final String dynName = scenarioState.pipelineNamed(pipelineName); modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.setApprovalTypeForStage(dynName, stageName, triggerType); } }); } public void removingEnvironments() { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeEnvironments(); } }); } public void addingResourceToAllAgents(final String resource) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addResourceToAllAgents(resource); } }); } public void denyFirstAgent() { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.denyOneAgent(); } }); } public void undenyFirstAgent() { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.undenyOneAgent(); } }); } private CruiseConfigDom getDom() { return configuration.provideDom(); } private void writeToConfigFileOnFileSystem(CruiseConfigDom dom) { configuration.setDomOnFileSystem(dom); } @com.thoughtworks.gauge.Step("Assigning <numberOfAgents> agents with resource <resource> to environment <environment>") public void assigningAgentsWithResourceToEnvironment(final int numberOfAgents, final String resource, final String environment) throws Exception { agentsPage.open(); modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { List<String> idleAgentUuids = agentsPage.idleAgentUuids(); ConfigureCruiseBy.this.scenarioState.addAgentsByEnvironment( dom.addAgentsToEnvironment(numberOfAgents, resource, environment, idleAgentUuids), environment); } }); } @com.thoughtworks.gauge.Step("Adding resource <resource> to the job <job>") public void addingResourceToTheJob(final String resource, final String job) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addResourceToJob(resource, job); } }); } public void setRunOnAllAgentsForJobTo(final String pipelineName, final String jobName, final boolean runOnAllAgents) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.setRunOnAllAgentsForJobTo(pipelineName, jobName, runOnAllAgents); } }); } public void setRunInstanceCountForJobTo(final String pipelineName, final String jobName, final int runInstanceCount) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.setRunInstanceCountForJobTo(pipelineName, jobName, runInstanceCount); } }); } @com.thoughtworks.gauge.Step("Using timer with spec <spec>") public void usingTimerWithSpec(final String spec) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.setTimerWithSpec(currentPipeline(), spec); } }); } @com.thoughtworks.gauge.Step("Using timer with invalid spec <spec>") public void usingTimerWithInvalidSpec(final String spec) throws Exception { CruiseConfigDom dom = configuration.provideDom(); dom.setTimerWithSpec(currentPipeline(), spec); writeToConfigFileOnFileSystem(dom); } @com.thoughtworks.gauge.Step("Adding pipeline <pipelineName> to <environmentName> environment") public void addingPipelineToEnvironment(final String pipelineName, final String environmentName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addPipeLineToEnvironment(scenarioState.pipelineNamed(pipelineName), environmentName); } }); } public void usingConstantlyBuildingTimer() throws Exception { usingTimerWithSpec(CONTANT_SPEC); } public void configureTimerToTriggerPipelineMinutesFromNow(int deltaMinutes) throws Exception { Calendar calendar = GregorianCalendar.getInstance(); int currentMinutes = calendar.get(Calendar.MINUTE); int minute = (currentMinutes + deltaMinutes) % 60; usingTimerWithSpec(String.format("0 %s * * * ?", minute)); } protected String currentPipeline() { return scenarioState.currentPipeline(); } @com.thoughtworks.gauge.Step("Assigning agent <agentIndex> to environment <environment>") public void assigningAgentToEnvironment(final Integer agentIndex, final String environment) { final AgentLauncher agent = createdAgents.get(agentIndex); modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addAgentToEnvironment(agent.getUuid(), environment); } }); } @com.thoughtworks.gauge.Step("Assigning <numberOfAgents> agents to environment <environment>") public void assigningAgentsToEnvironment(final Integer numberOfAgents, final String environment) { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { List<String> idleAgentUuids = agentsPage.idleAgentUuids(); scenarioState.addAgentsByEnvironment( dom.addAgentsToEnvironment(numberOfAgents, environment, idleAgentUuids), environment); } }); } public void removeTimer() { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeTimer(currentPipeline()); } }); } @com.thoughtworks.gauge.Step("Setting first stage to auto approval") public void settingFirstStageToAutoApproval() throws Exception { settingFirstStageOfToAutoApproval(scenarioState.currentPipeline()); } @com.thoughtworks.gauge.Step("Add environment variable <name> with value <value> to environment <env>") public void addEnvironmentVariableWithValueToEnvironment(final String name, final String value, final String env) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addVariableToEnvironment(name, value, env); } }); } @com.thoughtworks.gauge.Step("Add environment variable <name> with value <value> to job <env>") public void addEnvironmentVariableWithValueToJob(final String name, final String value, final String env) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addVariableToJob(name, value, env); } }); } @com.thoughtworks.gauge.Step("Add environment variable <name> with value <value> to pipeline <pipeline>") public void addEnvironmentVariableWithValueToPipeline(final String name, final String value, final String pipeline) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addVariableToPipeline(name, value, scenarioState.pipelineNamed(pipeline)); } }); } @com.thoughtworks.gauge.Step("Add environment variable <name> with value <value> to stage <stage>") public void addEnvironmentVariableWithValueToStage(final String name, final String value, final String stage) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addVariableToStage(name, value, stage); } }); } @com.thoughtworks.gauge.Step("Remove pipeline <pipelineName> from environment") public void removePipelineFromEnvironment(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removePipelineFromEnvironment(scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Setting first stage of <pipelineName> to auto approval") public void settingFirstStageOfToAutoApproval(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.setFirstStageOfPipelineToAutoApproval(scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Removing <materialName> material from <pipelineName>") public void removingMaterialFrom(final String materialName, final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeMaterialFromPipeline(materialName, scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Changing destination of <materialName> material of <pipelineName> to <newDestination>") public void changingDestinationOfMaterialOfTo(final String materialName, final String pipelineName, final String newDestination) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.changeDestinationOfMaterial(materialName, scenarioState.pipelineNamed(pipelineName), newDestination); } }); } public void changingUrlOfMaterialOfTo(final String materialName, final String pipelineName, final String newUrl) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.changeUrlOfMaterial(materialName, scenarioState.pipelineNamed(pipelineName), newUrl); } }); } public void removingLicense() throws Exception { CruiseConfigDom dom = configuration.provideDom(); dom.removeLicense(); writeToConfigFileOnFileSystem(dom); } @com.thoughtworks.gauge.Step("Making pipeline <pipelineName> auto update") public void makingPipelineAutoUpdate(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.pipelineAutoUpdate(scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Enable auto update for pipeline <pipelineName>") public void enableAutoUpdateForPipeline(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.enableAutoUpdate(pipelineName); } }); } @com.thoughtworks.gauge.Step("Removing externals for <materialName> of pipeline <pipelineName>") public void removingExternalsForOfPipeline(final String materialName, final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeExternalsFor(scenarioState.pipelineNamed(pipelineName), materialName); } }); } @com.thoughtworks.gauge.Step("Adding test artifact with source <source> and destination <dest> to job <job>") public void addingTestArtifactWithSourceAndDestinationToJob(final String source, final String dest, final String job) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addTestArtifactToJob(job, source, dest); } }); } @com.thoughtworks.gauge.Step("Remove lock from pipeline <pipelineName>") public void removeLockFromPipeline(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeLockFromPipeline(scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Making <user> an admin user") public void makingAnAdminUser(final String user) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addAdminUser(user); } }); } @com.thoughtworks.gauge.Step("Removing <user> as an admin") public void removingAsAnAdmin(final String user) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeAdminUser(user); } }); } @com.thoughtworks.gauge.Step("Make pipeline <pipelineName> use non existant material") public void makePipelineUseNonExistantMaterial(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.makeMaterialNonExistantMaterial(scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Make pipeline <pipelineName> use all non existant material") public void makePipelineUseAllNonExistantMaterial(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.makeAllMaterialsNonExistantMAterials(scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Changing the artifacts location to <artifactLocation>") public void changingTheArtifactsLocationTo(final String artifactLocation) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.changeArtifactLocation(artifactLocation); } }); } @com.thoughtworks.gauge.Step("Removing pipeline <pipelineName>") public void removingPipeline(final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removePipeline(scenarioState.pipelineNamed(pipelineName)); } }); } @com.thoughtworks.gauge.Step("Making pipeline <actualPipeline> not depend on <upstreamDependency>") public void makingPipelineNotDependOn(final String actualPipeline, final String upstreamDependency) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeDependency(scenarioState.pipelineNamed(actualPipeline), scenarioState.pipelineNamed(upstreamDependency)); } }); } @com.thoughtworks.gauge.Step("Make cruise config file invalid") public void makeCruiseConfigFileInvalid() throws Exception { String path = "/config/invalid-cruise-config.xml"; String configXmlContents = FileUtil.readToEnd(getClass().getResourceAsStream(path)); System.out.println(configXmlContents); configuration.setConfigOnFileSystem(configXmlContents); } @com.thoughtworks.gauge.Step("Save config by name <name>") public void saveConfigByName(String name) throws Exception { scenarioState.storeAsValidConfigNamed(name, getDom()); } @com.thoughtworks.gauge.Step("Restore config by name <name>") public void restoreConfigByName(String name) throws Exception { CruiseConfigDom lastValidDom = scenarioState.getValidConfigNamed(name); writeToConfigFileOnFileSystem(lastValidDom); } public void changeTheScmForPipelineFromTo(final String pipelineName, final String oldScm, final String newScm) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { Element newMaterial = dom.changeScm(scenarioState.pipelineNamed(pipelineName), oldScm, newScm); repositoryState.createMaterial(newMaterial); } }); } public void changingLdapUriTo(String ldapUri) throws Exception { configuration.rememberValueAs("/cruise/server/security/ldap/@uri", ORIGINAL_LDAP_URI); setLdapUri(ldapUri); } private void setLdapUri(final String ldapUri) { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.changeLdapUriTo(ldapUri); } }); } public void restoreLdapUri() throws Exception { String originalLdapUri = configuration.getRememberedValue(ORIGINAL_LDAP_URI); setLdapUri(originalLdapUri); } @com.thoughtworks.gauge.Step("Moving password file to tmp") public void movingPasswordFileToTmp() throws Exception { String path = passwordFilePath(); String tmpPath = tmpPath(path); FileUtils.deleteQuietly(new File(tmpPath)); FileUtils.moveFile(new File(path), new File(tmpPath)); } private String passwordFilePath() { return configuration.provideDom().getNode("/cruise/server/security/passwordFile/@path").getText(); } public void restoreThePasswordFile() throws Exception { String path = passwordFilePath(); FileUtils.moveFile(new File(tmpPath(path)), new File(path)); } private String tmpPath(String path) { return path + TMP_FILE_SUFFIX; } @com.thoughtworks.gauge.Step("Allow only known users to login") public void allowOnlyKnownUsersToLogin() throws Exception { setAllowOnlyKnownUsersToLogin(true); } @com.thoughtworks.gauge.Step("Allow unknown users to login") public void allowUnknownUsersToLogin() throws Exception { setAllowOnlyKnownUsersToLogin(false); } private void setAllowOnlyKnownUsersToLogin(final boolean allow) { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.setAllowOnlyKnownUsersToLogin(allow); } }); } @com.thoughtworks.gauge.Step("Add site uRL") public void addSiteURL() throws Exception { addingAsSiteURL(Urls.urlFor("")); } @com.thoughtworks.gauge.Step("Add secure site uRL") public void addSecureSiteURL() throws Exception { addingAsSecureSiteURL(Urls.sslUrlFor("")); } @com.thoughtworks.gauge.Step("Adding <url> as site uRL") public void addingAsSiteURL(final String url) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addSiteUrl(url); } }); } @com.thoughtworks.gauge.Step("Adding <url> as secure site uRL") public void addingAsSecureSiteURL(final String url) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addSecureSiteUrl(url); } }); } public void removingSiteUrl() throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeSiteUrl(); } }); } public void removingSecureSiteUrl() throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeSecureSiteUrl(); } }); } @com.thoughtworks.gauge.Step("Adding <user> as a <permission> user for group <groupName>") public void addingAsAUserForGroup(final String user, final String permission, final String groupName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { if ("view".equals(permission)) { dom.addUserViewAuthorizationForGroup(user, groupName); } else if ("operate".equals(permission)) { dom.addUserOperateAuthorizationForGroup(user, groupName); } } }); } @com.thoughtworks.gauge.Step("Changing <nodeName> attribute <attributeName> to <link> for pipeline <pipelineName>") public void changingAttributeToForPipeline(final String nodeName, final String attributeName, final String link, final String pipelineName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.modifyPipeline(scenarioState.pipelineNamed(pipelineName), nodeName, attributeName, link); } }); } @com.thoughtworks.gauge.Step("Adding <user> as a <permission> role for group <groupName>") public void addingAsARoleForGroup(final String user, final String permission, final String groupName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { if ("view".equals(permission)) { dom.addRoleViewAuthorizationForGroup(user, groupName); } else if ("operate".equals(permission)) { dom.addRoleOperateAuthorizationForGroup(user, groupName); } } }); } @com.thoughtworks.gauge.Step("Adding <username> as a group admin of <groupName>") public void addingAsAGroupAdminOf(final String username, final String groupName) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addGroupAdmin(groupName, username); } }); } @com.thoughtworks.gauge.Step("Remove job <jobName> from stage <stageName> in pipeline <pipelineName>") public void removeJobFromStageInPipeline(final String jobName, final String stageName, String pipelineName) throws Exception { final String runtimeName = scenarioState.pipelineNamed(pipelineName); modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeJob(runtimeName, stageName, jobName); } }); } public void removingTemplates() throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.removeTemplates(); } }); } @com.thoughtworks.gauge.Step("Remember url for material <materialName> of pipeline <pipelineName>") public void rememberUrlForMaterialOfPipeline(String materialName, String pipelineName) throws Exception { this.rememberedUrl = configuration.provideDom().urlForMaterial(scenarioState.pipelineNamed(pipelineName), materialName); } @com.thoughtworks.gauge.Step("Add parameter <parameterName> to pipeline <pipelineName>") public void addParameterToPipeline(final String parameterName, String pipelineName) throws Exception { final String runtimeName = scenarioState.pipelineNamed(pipelineName); modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addParameter(runtimeName, parameterName, rememberedUrl); } }); } @com.thoughtworks.gauge.Step("Add security with password file and users <users> as admin") public void addSecurityWithPasswordFileAndUsersAsAdmin(String users) throws Exception { File passwordFile = configuration.copyPasswordFile(getClass().getResource("/config/password.properties")); addSecurityTagWithPasswordfileAndAdmin(passwordFile.getAbsolutePath(), users); } private void addSecurityTagWithPasswordfileAndAdmin(final String passwordFilePath, final String users) { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addSecurityWithPasswordFile(passwordFilePath, users); } }); } @com.thoughtworks.gauge.Step("Add security with password file only") public void addSecurityWithPasswordFileOnly() throws Exception { File passwordFile = configuration.copyPasswordFile(getClass().getResource("/config/password.properties")); addSecurityTagWithPasswordfileOnly(passwordFile.getAbsolutePath()); } private void addSecurityTagWithPasswordfileOnly(final String passwordFilePath) { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.addSecurityWithPasswordFileOnly(passwordFilePath); } }); } @com.thoughtworks.gauge.Step("Update value of key <key> to <value> for repo with id <repoId> - Configure Cruise By") public void updateValueOfKeyToForRepoWithId(final String key, final String value, final String repoId) throws Exception { modifier.modifyConfig(new ModifyCommand() { @Override public void modify(CruiseConfigDom dom) { dom.updateValueOfKeyToForRepoWithId(key, value, repoId); } }); } }