@Test public void shouldFailWhenDoesNotFindAnyMatchingAgents() throws Exception { JobConfig jobConfig = new JobConfig("foo"); jobConfig.setRunOnAllAgents(true); SchedulingContext context = mock(SchedulingContext.class); when(context.getApprovedBy()).thenReturn("chris"); when(context.findAgentsMatching(new ResourceConfigs())).thenReturn(new ArrayList<>()); when(context.getEnvironmentVariablesConfig()).thenReturn(new EnvironmentVariablesConfig()); when(context.overrideEnvironmentVariables(any(EnvironmentVariablesConfig.class))).thenReturn(context); try { RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(jobConfig.name())); instanceFactory.createJobInstance(new CaseInsensitiveString("myStage"), jobConfig, new DefaultSchedulingContext(), new TimeProvider(), jobNameGenerator); fail("should have failed as no agents matched"); } catch (Exception e) { assertThat(e.getMessage(), is("Could not find matching agents to run job [foo] of stage [myStage].")); } }
@Test public void shouldCreateASingleJobIfRunOnAllAgentsIsFalse() throws Exception { JobConfig jobConfig = new JobConfig("foo"); SchedulingContext context = mock(SchedulingContext.class); when(context.getEnvironmentVariablesConfig()).thenReturn(new EnvironmentVariablesConfig()); when(context.overrideEnvironmentVariables(any(EnvironmentVariablesConfig.class))).thenReturn(context); RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(jobConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("someStage"), jobConfig, new DefaultSchedulingContext(), new TimeProvider(), jobNameGenerator); assertThat(jobs.toArray(), hasItemInArray(hasProperty("name", is("foo")))); assertThat(jobs.toArray(), hasItemInArray(hasProperty("agentUuid", nullValue()))); assertThat(jobs.toArray(), hasItemInArray(hasProperty("runOnAllAgents", is(false)))); assertThat(jobs.size(), is(1)); }
private JobInstances createJobInstances(StageConfig stageConfig, SchedulingContext context, Clock clock) { JobInstances instances = new JobInstances(); for (JobConfig jobConfig : stageConfig.getJobs()) { JobType.JobNameGenerator nameGenerator = null; if (jobConfig.isRunOnAllAgents()) { nameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(jobConfig.name())); } else if (jobConfig.isRunMultipleInstanceType()) { nameGenerator = new RunMultipleInstance.CounterBasedJobNameGenerator(CaseInsensitiveString.str(jobConfig.name())); } JobInstances configInstances = createJobInstance(stageConfig.name(), jobConfig, context, clock, nameGenerator); instances.addAll(configInstances); } return instances; }
public void createRerunInstances(JobInstance oldJob, JobInstances jobInstances, SchedulingContext context, StageConfig stageConfig, final Clock clock, InstanceFactory instanceFactory) { String jobName = oldJob.getName(); JobConfig jobConfig = stageConfig.jobConfigByInstanceName(jobName, true); if (jobConfig == null) { throw new CannotRerunJobException(jobName, "Configuration for job doesn't exist."); } if (jobConfig.isRunMultipleInstanceType()) { String runType = "'run multiple instance'"; throw new CannotRerunJobException(jobName, "Run configuration for job has been changed to " + runType + "."); } RunOnAllAgents.CounterBasedJobNameGenerator nameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(jobConfig.name())); JobInstances instances = instanceFactory.createJobInstance(stageConfig.name(), jobConfig, context, clock, nameGenerator); for (JobInstance instance : instances) { instance.setRerun(true); } jobInstances.addAll(instances); } }
public void createRerunInstances(JobInstance oldJob, JobInstances jobInstances, SchedulingContext context, StageConfig stageConfig, final Clock clock, InstanceFactory instanceFactory) { context = context.permittedAgent(oldJob.getAgentUuid()); String configName = translateToConfigName(oldJob.getName()); JobConfig jobConfig = stageConfig.jobConfigByConfigName(new CaseInsensitiveString(configName)); if (jobConfig == null) { throw new CannotRerunJobException(configName, "Configuration for job doesn't exist."); } if (jobConfig.isRunMultipleInstanceType()) { String runType = "'run multiple instance'"; throw new CannotRerunJobException(configName, "Run configuration for job has been changed to " + runType + "."); } String newJobName = jobConfig.isRunOnAllAgents() ? oldJob.getName() : CaseInsensitiveString.str(jobConfig.name()); JobInstances instances = instanceFactory.createJobInstance(stageConfig.name(), jobConfig, context, clock, new IdentityNameGenerator(newJobName)); for (JobInstance instance : instances) { instance.setAgentUuid(oldJob.getAgentUuid());//will always have one job instance.setRerun(true); if (jobInstances.hasJobNamed(newJobName)) { throw new IllegalArgumentException(String.format("Cannot schedule multiple instances of job named '%s'.", newJobName)); } } jobInstances.addAll(instances); }
@Test public void shouldNotRerun_WhenJobConfigIsChangedToRunMultipleInstance_ForSingleJobInstance() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents()); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), null); Stage stage = createStageInstance(old, jobs); Stage newStage = null; railsConfig.setRunInstanceCount(10); CannotRerunJobException exception = null; try { newStage = instanceFactory.createStageForRerunOfJobs(stage, a("rails"), 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 shouldReturnBuildInstance() { ArtifactConfigs artifactConfigs = new ArtifactConfigs(); JobConfig jobConfig = new JobConfig(new CaseInsensitiveString("test"), null, artifactConfigs); RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(jobConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("stage_foo"), jobConfig, new DefaultSchedulingContext(), new TimeProvider(), jobNameGenerator); JobInstance jobInstance = jobs.first(); assertThat(jobConfig.name(), is(new CaseInsensitiveString(jobInstance.getName()))); assertThat(jobInstance.getState(), is(JobState.Scheduled)); assertThat(jobInstance.getScheduledDate(), is(notNullValue())); }
@Test public void shouldCreateAJobForEachAgentIfRunOnAllAgentsIsTrue() throws Exception { Agents agents = new Agents(); agents.add(new AgentConfig("uuid1")); agents.add(new AgentConfig("uuid2")); JobConfig jobConfig = new JobConfig("foo"); jobConfig.setRunOnAllAgents(true); SchedulingContext context = mock(SchedulingContext.class); when(context.getApprovedBy()).thenReturn("chris"); when(context.findAgentsMatching(new ResourceConfigs())).thenReturn(agents); when(context.getEnvironmentVariablesConfig()).thenReturn(new EnvironmentVariablesConfig()); when(context.overrideEnvironmentVariables(any(EnvironmentVariablesConfig.class))).thenReturn(context); RunOnAllAgents.CounterBasedJobNameGenerator jobNameGenerator = new RunOnAllAgents.CounterBasedJobNameGenerator(CaseInsensitiveString.str(jobConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("stageName"), jobConfig, context, new TimeProvider(), jobNameGenerator); assertThat(jobs.toArray(), hasItemInArray(hasProperty("name", is("foo-runOnAll-1")))); assertThat(jobs.toArray(), hasItemInArray(hasProperty("agentUuid", is("uuid1")))); assertThat(jobs.toArray(), hasItemInArray(hasProperty("runOnAllAgents", is(true)))); assertThat(jobs.toArray(), hasItemInArray(hasProperty("name", is("foo-runOnAll-1")))); assertThat(jobs.toArray(), hasItemInArray(hasProperty("agentUuid", is("uuid2")))); assertThat(jobs.toArray(), hasItemInArray(hasProperty("runOnAllAgents", is(true)))); assertThat(jobs.size(), is(2)); }
public void createRerunInstances(JobInstance oldJob, JobInstances jobInstances, SchedulingContext context, StageConfig stageConfig, final Clock clock, InstanceFactory instanceFactory) { context = context.rerunContext(); String configName = translateToConfigName(oldJob.getName()); JobConfig jobConfig = stageConfig.jobConfigByConfigName(new CaseInsensitiveString(configName)); if (jobConfig == null) { throw new CannotRerunJobException(configName, "Configuration for job doesn't exist."); } if (!jobConfig.isRunMultipleInstanceType()) { String runType = jobConfig.isRunOnAllAgents() ? "'run on all agents'" : "'simple'"; throw new CannotRerunJobException(configName, "Run configuration for job has been changed to " + runType + "."); } String newJobName = oldJob.getName(); JobInstances instances = instanceFactory.createJobInstance(stageConfig.name(), jobConfig, context, clock, new IdentityNameGenerator(newJobName)); for (JobInstance instance : instances) { instance.setRerun(true); } jobInstances.addAll(instances); }
@Test public void shouldNotRerun_WhenJobConfigDoesNotExistAnymore_ForRunMultipleInstance() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunInstanceCount(3); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents()); RunMultipleInstance.CounterBasedJobNameGenerator jobNameGenerator = new RunMultipleInstance.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-runInstance-1"), schedulingContext, 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(exception.getInformation(), is("Configuration for job doesn't exist.")); assertThat(newStage, is(nullValue())); }
JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), jobNameGenerator);
@Test public void shouldCreateJobInstancesCorrectly_RunMultipleInstance() { Date old = new DateTime().minusDays(2).toDate(); StageConfig stageConfig = StageConfigMother.custom("dev", "rails", "java"); JobConfig railsConfig = stageConfig.getJobs().getJob(new CaseInsensitiveString("rails")); railsConfig.setRunInstanceCount(3); DefaultSchedulingContext schedulingContext = new DefaultSchedulingContext("loser", new Agents()); RunMultipleInstance.CounterBasedJobNameGenerator jobNameGenerator = new RunMultipleInstance.CounterBasedJobNameGenerator(CaseInsensitiveString.str(railsConfig.name())); JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), jobNameGenerator); assertThat(jobs.get(0).getName(), is("rails-runInstance-1")); assertEnvironmentVariable(jobs.get(0), 0, "GO_JOB_RUN_INDEX", "1"); assertEnvironmentVariable(jobs.get(0), 1, "GO_JOB_RUN_COUNT", "3"); assertThat(jobs.get(1).getName(), is("rails-runInstance-2")); assertEnvironmentVariable(jobs.get(1), 0, "GO_JOB_RUN_INDEX", "2"); assertEnvironmentVariable(jobs.get(1), 1, "GO_JOB_RUN_COUNT", "3"); assertThat(jobs.get(2).getName(), is("rails-runInstance-3")); assertEnvironmentVariable(jobs.get(2), 0, "GO_JOB_RUN_INDEX", "3"); assertEnvironmentVariable(jobs.get(2), 1, "GO_JOB_RUN_COUNT", "3"); Stage stage = createStageInstance(old, jobs); JobInstances jobInstances = stage.getJobInstances(); assertThat(jobInstances.size(), is(4)); assertRunMultipleJobInstance(jobInstances.get(0), "rails-runInstance-1"); assertRunMultipleJobInstance(jobInstances.get(1), "rails-runInstance-2"); assertRunMultipleJobInstance(jobInstances.get(2), "rails-runInstance-3"); assertThat(jobInstances.get(3).getName(), is("java")); }
@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())); }
JobInstances jobs = instanceFactory.createJobInstance(new CaseInsensitiveString("dev"), railsConfig, schedulingContext, new TimeProvider(), jobNameGenerator);
@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 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 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())); }