private StageConfig getStageConfig(String stageName, String jobName) { JobConfig jobConfig = new JobConfig(new CaseInsensitiveString(jobName)); jobConfig.addTask(new AntTask()); jobConfig.addTask(new ExecTask("command", "", "workingDir")); jobConfig.artifactConfigs().add(new BuildArtifactConfig("src", "dest")); jobConfig.addVariable("env1", "val1"); jobConfig.addResourceConfig("powerful"); JobConfigs jobConfigs = new JobConfigs(jobConfig); return new StageConfig(new CaseInsensitiveString(stageName), jobConfigs); }
@Test public void shouldNotRerun_WhenJobConfigIsChangedToRunMultipleInstance_ForRunOnAllAgentsJobInstance() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunOnAllAgents(true); railsConfig.addResourceConfig("foobar"); AgentConfig agent1 = new AgentConfig("abcd1234", "host", "127.0.0.2", new ResourceConfigs(new ResourceConfig("foobar"))); AgentConfig agent2 = new AgentConfig("1234abcd", "ghost", "192.168.1.2", new ResourceConfigs(new ResourceConfig("baz"), new ResourceConfig("foobar"))); AgentConfig agent3 = new AgentConfig("7890abdc", "lost", "10.4.3.55", new ResourceConfigs(new ResourceConfig("crapyagent"))); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents(agent1, agent2, agent3)); RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(railsConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), jobNameGenerator); Stage stage = createStageInstance(old, jobs); Stage newStage = null; railsConfig.setRunOnAllAgents(false); railsConfig.setRunInstanceCount(10); CannotRerunJobException exception = null; try { newStage = instanceFactory.createStageForRerunOfJobs(stage, a("rails-runOnAll-1"), schedulingContext, stageConfig, new TimeProvider(), "md5"); fail("should not schedule since job config changed to run multiple instance"); } catch (CannotRerunJobException e) { exception = e; } assertThat(exception.getJobName(), is("rails")); assertThat(exception.getInformation(), is("Run configuration for job has been changed to 'run multiple instance'.")); assertThat(newStage, is(nullValue())); }
@Test public void shouldClearAgentAssignment_ForRunOnAllAgentsJobType() { Date old = new DateTime().minusDays(2).toDate(); JobInstance rails = jobInstance(old, "rails", 7, 10); JobInstance java = jobInstance(old, "java", 12, 22); Stage stage = stage(9, rails, java); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunOnAllAgents(true); railsConfig.addResourceConfig("foobar"); Stage newStage = instanceFactory.createStageForRerunOfJobs(stage, a("rails"), new DefaultSchedulingContext("loser", new Agents( new AgentConfig("abcd1234", "host", "127.0.0.2", new ResourceConfigs(new ResourceConfig("foobar"))), new AgentConfig("1234abcd", "ghost", "192.168.1.2", new ResourceConfigs(new ResourceConfig("baz"), new ResourceConfig("foobar"))), new AgentConfig("7890abdc", "lost", "10.4.3.55", new ResourceConfigs(new ResourceConfig("crapyagent"))))), stageConfig, new TimeProvider(), "md5"); assertThat(newStage.getJobInstances().size(), is(3)); JobInstance newRailsFirstJob = newStage.getJobInstances().getByName("rails-runOnAll-1"); assertNewJob(old, newRailsFirstJob); assertThat(newRailsFirstJob.getAgentUuid(), is("abcd1234")); JobInstance newRailsSecondJob = newStage.getJobInstances().getByName("rails-runOnAll-2"); assertNewJob(old, newRailsSecondJob); assertThat(newRailsSecondJob.getAgentUuid(), is("1234abcd")); JobInstance copiedJavaJob = newStage.getJobInstances().getByName("java"); assertCopiedJob(copiedJavaJob, 12l); assertThat(copiedJavaJob.getAgentUuid(), is(not(nullValue()))); }
@Test public void should_NOT_ClearAgentAssignment_ForRerun_OfASingleInstanceJobType_WhichWasEarlierRunOnAll() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunOnAllAgents(true); railsConfig.addResourceConfig("foobar"); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents( new AgentConfig("abcd1234", "host", "127.0.0.2", new ResourceConfigs(new ResourceConfig("foobar"))), new AgentConfig("1234abcd", "ghost", "192.168.1.2", new ResourceConfigs(new ResourceConfig("baz"), new ResourceConfig("foobar"))), new AgentConfig("7890abdc", "lost", "10.4.3.55", new ResourceConfigs(new ResourceConfig("crapyagent"))))); RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(railsConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), jobNameGenerator); Stage stage = createStageInstance(old, jobs); railsConfig.setRunOnAllAgents(false); Stage newStage = instanceFactory.createStageForRerunOfJobs(stage, a("rails-runOnAll-1"), schedulingContext, stageConfig, new TimeProvider(), "md5"); assertThat(newStage.getJobInstances().size(), is(3)); JobInstance newRailsJob = newStage.getJobInstances().getByName("rails"); assertNewJob(old, newRailsJob); assertThat(newRailsJob.getAgentUuid(), is("abcd1234")); JobInstance copiedRailsJob = newStage.getJobInstances().getByName("rails-runOnAll-2"); assertCopiedJob(copiedRailsJob, 102l); assertThat(copiedRailsJob.getAgentUuid(), is("1234abcd")); JobInstance copiedJavaJob = newStage.getJobInstances().getByName("java"); assertCopiedJob(copiedJavaJob, 12l); assertThat(copiedJavaJob.getAgentUuid(), is(not(nullValue()))); }
@Test public void shouldNotRerun_WhenJobConfigDoesNotExistAnymore_ForRunOnAllAgentsJobInstance() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunOnAllAgents(true); railsConfig.addResourceConfig("foobar"); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents( new AgentConfig("abcd1234", "host", "127.0.0.2", new ResourceConfigs(new ResourceConfig("foobar"))), new AgentConfig("1234abcd", "ghost", "192.168.1.2", new ResourceConfigs(new ResourceConfig("baz"), new ResourceConfig("foobar"))), new AgentConfig("7890abdc", "lost", "10.4.3.55", new ResourceConfigs(new ResourceConfig("crapyagent"))))); RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(railsConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), jobNameGenerator); Stage stage = createStageInstance(old, jobs); Stage newStage = null; CannotRerunJobException exception = null; try { newStage = instanceFactory.createStageForRerunOfJobs(stage, a("rails-runOnAll-1"), new DefaultSchedulingContext("loser", new Agents()), StageConfigMother.custom("dev", "java"), new TimeProvider(), "md5"); fail("should not schedule when job config does not exist anymore"); } catch (CannotRerunJobException e) { exception = e; } assertThat(exception.getJobName(), is("rails")); assertThat(newStage, is(nullValue())); }
@Test public void shouldBomb_ForRerun_OfASingleInstanceJobType_WhichWasEarlierRunOnAll_WithTwoRunOnAllInstancesSelectedForRerun() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunOnAllAgents(true); railsConfig.addResourceConfig("foobar"); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents( new AgentConfig("abcd1234", "host", "127.0.0.2", new ResourceConfigs(new ResourceConfig("foobar"))), new AgentConfig("1234abcd", "ghost", "192.168.1.2", new ResourceConfigs(new ResourceConfig("baz"), new ResourceConfig("foobar"))), new AgentConfig("7890abdc", "lost", "10.4.3.55", new ResourceConfigs(new ResourceConfig("crapyagent"))))); RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(railsConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), jobNameGenerator); Stage stage = createStageInstance(old, jobs); railsConfig.setRunOnAllAgents(false); try { instanceFactory.createStageForRerunOfJobs(stage, a("rails-runOnAll-1", "rails-runOnAll-2"), schedulingContext, stageConfig, new TimeProvider(), "md5"); fail("should have failed when multiple run on all agents jobs are selected when job-config does not have run on all flag anymore"); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), is("Cannot schedule multiple instances of job named 'rails'.")); } }
@Test public void shouldUseRightNameGenerator() { StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java", "html"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunOnAllAgents(true); railsConfig.addResourceConfig("foobar"); JobConfig javaConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("java")); javaConfig.setRunInstanceCount(2); AgentConfig agent1 = new AgentConfig("abcd1234", "host", "127.0.0.2", new ResourceConfigs(new ResourceConfig("foobar"))); AgentConfig agent2 = new AgentConfig("1234abcd", "ghost", "192.168.1.2", new ResourceConfigs(new ResourceConfig("baz"), new ResourceConfig("foobar"))); AgentConfig agent3 = new AgentConfig("7890abdc", "lost", "10.4.3.55", new ResourceConfigs(new ResourceConfig("crapyagent"))); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents(agent1, agent2, agent3)); Stage stageInstance = instanceFactory.createStageInstance(stageConfig, schedulingContext, "md5", clock); JobInstances jobInstances = stageInstance.getJobInstances(); assertThat(jobInstances.size(), is(5)); assertRunOnAllAgentsJobInstance(jobInstances.get(0), "rails-runOnAll-1"); assertRunOnAllAgentsJobInstance(jobInstances.get(1), "rails-runOnAll-2"); assertRunMultipleJobInstance(jobInstances.get(2), "java-runInstance-1"); assertRunMultipleJobInstance(jobInstances.get(3), "java-runInstance-2"); assertSimpleJobInstance(jobInstances.get(4), "html"); }