func()

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
}