/*
* Copyright 2017 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.domain.*;
import org.joda.time.DateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class JobInstanceMother {
protected JobInstanceMother() {
}
public static JobInstance scheduled(String jobConfigName, Date scheduleDate) {
final JobInstance jobInstance = scheduled(jobConfigName);
jobInstance.setScheduledDate(scheduleDate);
return jobInstance;
}
public static JobInstance scheduled(String jobConfigName) {
return scheduled(jobConfigName, new Resources());
}
public static JobInstance scheduled(String jobConfigName, Resources resources) {
JobInstance instance = new JobInstance(jobConfigName);
instance.setId(999);
instance.setIdentifier(defaultJobIdentifier(jobConfigName));
return instance;
}
public static JobInstance jobInstance(String jobConfigName, String resourceName) {
return new JobInstance(jobConfigName
);
}
public static JobInstance completed(String jobConfigName) {
return completed(jobConfigName, JobResult.Passed);
}
public static JobInstance completed(String jobConfigName, JobResult result) {
return buildEndingWithState(JobState.Completed, result, jobConfigName);
}
public static JobInstance completed(String jobConfigName, JobResult result, Date completedDate) {
return completed(jobConfigName, result, completedDate, new Date());
}
public static JobInstance completed(String jobConfigName, JobResult result, Date completedDate, Date startbuilding) {
JobInstance instance = new JobInstance(jobConfigName);
instance.completing(result, completedDate);
instance.completed(completedDate);
instance.getTransitions().add(new JobStateTransition(JobState.Building, startbuilding));
return instance;
}
public static JobInstance cancelled(String jobConfigName, Date scheduledDate, int interval) {
JobInstance instance = new JobInstance(jobConfigName);
instance.setIdentifier(defaultJobIdentifier(jobConfigName));
instance.schedule();
instance.getTransition(JobState.Scheduled).setStateChangeTime(scheduledDate);
instance.setResult(JobResult.Cancelled);
instance.completed(addMillis(scheduledDate, interval));
return instance;
}
private static Date addMillis(Date scheduledDate, int interval) {
return new Date(scheduledDate.getTime() + interval);
}
public static JobInstance passed(String jobConfigName, Date scheduledDate, int interval) {
JobInstance instance = building(jobConfigName, scheduledDate, interval);
instance.changeState(JobState.Completing, addMillis(scheduledDate, 4 * interval));
instance.changeState(JobState.Completed, addMillis(scheduledDate, 5 * interval));
instance.setResult(JobResult.Passed);
return instance;
}
public static JobInstance building(String jobConfigName, Date scheduledDate, int interval) {
JobInstance instance = new JobInstance(jobConfigName);
instance.setIdentifier(defaultJobIdentifier(jobConfigName));
instance.schedule();
instance.getTransition(JobState.Scheduled).setStateChangeTime(scheduledDate);
instance.changeState(JobState.Preparing, addMillis(scheduledDate, 2 * interval));
instance.changeState(JobState.Building, addMillis(scheduledDate, 3 * interval));
return instance;
}
public static JobInstance completed(JobInstance instance, JobResult result, Date completedDate) {
instance.completing(result, completedDate);
instance.completed(completedDate);
return instance;
}
public static JobInstance building(String jobConfigName, Date startBuildingDate) {
final JobInstance instance = new JobInstance(jobConfigName);
instance.changeState(JobState.Building, startBuildingDate);
instance.setScheduledDate(new DateTime().minusMinutes(5).toDate());
instance.setIdentifier(defaultJobIdentifier(jobConfigName));
return instance;
}
public static JobInstance building(String jobConfig) {
final JobInstance instance = new JobInstance(jobConfig);
setBuildingState(instance);
instance.setIdentifier(defaultJobIdentifier(jobConfig));
return instance;
}
public static JobInstance buildEndingWithState(JobState endState, JobResult result, String jobConfig) {
final JobInstance instance = new JobInstance(jobConfig);
instance.setAgentUuid("1234");
instance.setId(1L);
instance.setIdentifier(defaultJobIdentifier(jobConfig));
instance.setState(endState);
instance.setTransitions(new JobStateTransitions());
DateTime now = new DateTime();
Date scheduledDate = now.minusMinutes(5).toDate();
instance.setScheduledDate(scheduledDate);
List<JobState> orderedStates = orderedBuildStates();
DateTime stateDate = new DateTime(scheduledDate);
for (JobState stateToCompareTo : orderedStates) {
if (endState.compareTo(stateToCompareTo) >= 0) {
instance.changeState(stateToCompareTo, stateDate.toDate());
stateDate = stateDate.plusMinutes(1);
}
}
if (endState.equals(JobState.Completed)) {
instance.setResult(result);
}
return instance;
}
private static List<JobState> orderedBuildStates() {
List<JobState> jobStates = new ArrayList<>();
jobStates.add(JobState.Scheduled);
jobStates.add(JobState.Assigned);
jobStates.add(JobState.Preparing);
jobStates.add(JobState.Building);
jobStates.add(JobState.Completing);
jobStates.add(JobState.Completed);
return jobStates;
}
public static void setBuildingState(JobInstance instance) {
instance.setAgentUuid("1234");
DateTime now = new DateTime();
Date scheduledDate = now.minusMinutes(5).toDate();
instance.setScheduledDate(scheduledDate);
setTransitionConditionally(instance, JobState.Scheduled, scheduledDate);
setTransitionConditionally(instance, JobState.Assigned, now.minusMinutes(4).toDate());
setTransitionConditionally(instance, JobState.Preparing, now.minusMinutes(3).toDate());
setTransitionConditionally(instance, JobState.Building, now.minusMinutes(2).toDate());
}
private static void setTransitionConditionally(JobInstance instance, JobState state, Date date) {
JobStateTransition transition = instance.getTransition(state);
if (transition != null) {
instance.setState(state);
} else {
instance.changeState(state, date);
}
}
public static JobInstance assigned(String jobConfig) {
return assignedWithAgentId(jobConfig, null);
}
public static JobInstance assignedWithAgentId(String jobConfig, String agentUuid) {
final JobInstance instance = new JobInstance(jobConfig);
instance.setIdentifier(defaultJobIdentifier(jobConfig));
instance.setState(JobState.Assigned);
return assignAgent(instance, agentUuid);
}
public static JobInstance assignAgent(JobInstance instance, String agentUuid) {
instance.setAgentUuid(agentUuid);
return instance;
}
private static JobIdentifier defaultJobIdentifier(String jobConfig) {
return new JobIdentifier("pipeline", 1, "label-1", "stage", "1", jobConfig, -1L);
}
public static JobInstance failed(String jobConfigName) {
return completed(jobConfigName, JobResult.Failed);
}
public static JobInstance passed(String jobConfigName) {
return completed(jobConfigName, JobResult.Passed);
}
public static JobInstance cancelled(String jobConfigName) {
return completed(jobConfigName, JobResult.Cancelled);
}
public static JobInstance rescheduled(String jobName, String agentUuid) {
JobInstance instance = assignedWithAgentId(jobName, agentUuid);
instance.setState(JobState.Rescheduled);
instance.setIgnored(true);
return instance;
}
public static JobInstance instanceForRunOnAllAgents(String pipelineName, String stageName, String jobName, String pipelineLabel, int counter) {
String instanceName = RunOnAllAgents.CounterBasedJobNameGenerator.appendMarker(jobName, counter);
JobInstance jobInstance = building(instanceName);
jobInstance.setRunOnAllAgents(true);
JobIdentifier identifier = new JobIdentifier(pipelineName, null, pipelineLabel, stageName, "1", instanceName, 0L);
jobInstance.setIdentifier(identifier);
return jobInstance;
}
public static JobInstance instanceForRunMultipleInstance(String pipelineName, String stageName, String jobName, String pipelineLabel, int counter) {
String instanceName = RunMultipleInstance.CounterBasedJobNameGenerator.appendMarker(jobName, counter);
JobInstance jobInstance = building(instanceName);
jobInstance.setRunMultipleInstance(true);
JobIdentifier identifier = new JobIdentifier(pipelineName, null, pipelineLabel, stageName, "1", instanceName, 0L);
jobInstance.setIdentifier(identifier);
return jobInstance;
}
public static JobInstance buildingInstance(String pipelineName, String stageName, String jobName,
String pipelineLabel) {
JobInstance job = building(jobName);
JobIdentifier identifier = new JobIdentifier(pipelineName, null, pipelineLabel, stageName, "1", jobName, 0L);
job.setIdentifier(identifier);
return job;
}
public static DefaultJobPlan jobPlan(String jobName, long id) {
return new DefaultJobPlan(new Resources(new Resource("foo"), new Resource("bar")), new ArtifactPlans(), new ArtifactPropertiesGenerators(), id, defaultJobIdentifier(jobName), null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null);
}
public static JobPlan createJobPlan(JobConfig jobConfig, JobIdentifier jobIdentifier, SchedulingContext schedulingContext) {
return new DefaultJobPlan(jobConfig.resources(), jobConfig.artifactPlans(), jobConfig.getProperties(), -1,
jobIdentifier, null, schedulingContext.overrideEnvironmentVariables(jobConfig.getVariables()).getEnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null);
}
}