in runner/group/handler.go [357:481]
func (h *Handler) buildBatchJobObject(uploadURL string) *batchv1.Job {
job := &batchv1.Job{
ObjectMeta: metav1.ObjectMeta{
Name: h.name,
Namespace: h.namespace,
},
Spec: batchv1.JobSpec{
Parallelism: toPtr(h.spec.Count),
Completions: toPtr(h.spec.Count),
BackoffLimit: toPtr(int32(0)),
// FIXME: Should not re-create pod
CompletionMode: toPtr(batchv1.IndexedCompletion),
Template: corev1.PodTemplateSpec{},
},
}
if h.ownerRef != nil {
job.OwnerReferences = append(job.OwnerReferences, *h.ownerRef)
}
job.Spec.Template.Spec = corev1.PodSpec{
Affinity: &corev1.Affinity{},
Containers: []corev1.Container{
{
Name: "runner",
Image: h.imageRef,
Env: []corev1.EnvVar{
{
Name: "POD_NAME",
ValueFrom: &corev1.EnvVarSource{
FieldRef: &corev1.ObjectFieldSelector{
FieldPath: metav1.ObjectNameField,
},
},
},
{
Name: "POD_NAMESPACE",
ValueFrom: &corev1.EnvVarSource{
FieldRef: &corev1.ObjectFieldSelector{
FieldPath: "metadata.namespace",
},
},
},
{
Name: "POD_UID",
ValueFrom: &corev1.EnvVarSource{
FieldRef: &corev1.ObjectFieldSelector{
FieldPath: "metadata.uid",
},
},
},
{
Name: "TARGET_URL",
Value: uploadURL,
},
{
Name: "RUNNER_VERBOSITY",
Value: strconv.Itoa(h.runnerVerbosity),
},
},
VolumeMounts: []corev1.VolumeMount{
{
Name: "config",
MountPath: "/config",
},
{
Name: "host-root-tmp",
MountPath: "/data",
},
},
Command: []string{
"/run_runner.sh",
},
},
},
RestartPolicy: corev1.RestartPolicyNever,
Volumes: []corev1.Volume{
{
Name: "config",
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: h.name,
},
},
},
},
{
Name: "host-root-tmp",
VolumeSource: corev1.VolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: "/tmp",
},
},
},
},
}
if len(h.spec.NodeAffinity) > 0 {
matchExpressions := make([]corev1.NodeSelectorRequirement, 0, len(h.spec.NodeAffinity))
for key, values := range h.spec.NodeAffinity {
matchExpressions = append(matchExpressions, corev1.NodeSelectorRequirement{
Key: key,
Operator: corev1.NodeSelectorOpIn,
Values: values,
})
}
job.Spec.Template.Spec.Affinity.NodeAffinity = &corev1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
NodeSelectorTerms: []corev1.NodeSelectorTerm{
{
MatchExpressions: matchExpressions,
},
},
},
}
}
if sa := h.spec.ServiceAccount; sa != nil {
job.Spec.Template.Spec.ServiceAccountName = *sa
}
return job
}