package org.csanchez.jenkins.plugins.kubernetes.pipeline;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate;
import org.csanchez.jenkins.plugins.kubernetes.PodAnnotation;
import org.csanchez.jenkins.plugins.kubernetes.volumes.PodVolume;
import org.csanchez.jenkins.plugins.kubernetes.volumes.workspace.WorkspaceVolume;
import org.jenkinsci.plugins.workflow.steps.Step;
import org.jenkinsci.plugins.workflow.steps.StepContext;
import org.jenkinsci.plugins.workflow.steps.StepDescriptor;
import org.jenkinsci.plugins.workflow.steps.StepExecution;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import com.google.common.collect.ImmutableSet;
import hudson.Extension;
import hudson.model.Run;
import hudson.model.TaskListener;
public class PodTemplateStep extends Step implements Serializable {
private static final long serialVersionUID = 5588861066775717487L;
private static final String DEFAULT_CLOUD = "kubernetes";
private String cloud = DEFAULT_CLOUD;
private String inheritFrom;
private final String label;
private final String name;
private List<ContainerTemplate> containers = new ArrayList<>();
private List<PodVolume> volumes = new ArrayList<PodVolume>();
private WorkspaceVolume workspaceVolume;
private List<PodAnnotation> annotations = new ArrayList<>();
private int instanceCap;
private String serviceAccount;
private String nodeSelector;
private String workingDir = ContainerTemplate.DEFAULT_WORKING_DIR;
@DataBoundConstructor
public PodTemplateStep(String label, String name) {
this.label = label;
this.name = name == null ? "kubernetes" : name;
}
public String getLabel() {
return label;
}
public String getName() {
return name;
}
public String getCloud() {
return cloud;
}
@DataBoundSetter
public void setCloud(String cloud) {
this.cloud = cloud;
}
public String getInheritFrom() {
return inheritFrom;
}
@DataBoundSetter
public void setInheritFrom(String inheritFrom) {
this.inheritFrom = inheritFrom;
}
public List<ContainerTemplate> getContainers() {
return containers;
}
@DataBoundSetter
public void setContainers(List<ContainerTemplate> containers) {
this.containers = containers;
}
public List<PodVolume> getVolumes() {
return volumes;
}
@DataBoundSetter
public void setVolumes(List<PodVolume> volumes) {
this.volumes = volumes;
}
public WorkspaceVolume getWorkspaceVolume() {
return workspaceVolume;
}
@DataBoundSetter
public void setWorkspaceVolume(WorkspaceVolume workspaceVolume) {
this.workspaceVolume = workspaceVolume;
}
public int getInstanceCap() {
return instanceCap;
}
@DataBoundSetter
public void setInstanceCap(int instanceCap) {
this.instanceCap = instanceCap;
}
public String getServiceAccount() {
return serviceAccount;
}
@DataBoundSetter
public void setServiceAccount(String serviceAccount) {
this.serviceAccount = serviceAccount;
}
public String getNodeSelector() {
return nodeSelector;
}
@DataBoundSetter
public void setNodeSelector(String nodeSelector) {
this.nodeSelector = nodeSelector;
}
public String getWorkingDir() {
return workingDir;
}
@DataBoundSetter
public void setWorkingDir(String workingDir) {
this.workingDir = workingDir;
}
@Override
public StepExecution start(StepContext context) throws Exception {
return new PodTemplateStepExecution(this, context);
}
public List<PodAnnotation> getAnnotations() {
return annotations;
}
@DataBoundSetter
public void setAnnotations(List<PodAnnotation> annotations) {
this.annotations = annotations;
}
@Extension
public static class DescriptorImpl extends StepDescriptor {
@Override
public String getFunctionName() {
return "podTemplate";
}
@Override
public String getDisplayName() {
return "Define a podTemplate to use in the kubernetes plugin";
}
@Override
public boolean takesImplicitBlockArgument() {
return true;
}
@Override
public boolean isAdvanced() {
return true;
}
@Override
public Set<? extends Class<?>> getRequiredContext() {
return ImmutableSet.of(Run.class, TaskListener.class);
}
}
}