func setExclusiveAffinities()

in pkg/controllers/jobset_controller.go [599:641]


func setExclusiveAffinities(job *batchv1.Job, topologyKey string) {
	if job.Spec.Template.Spec.Affinity == nil {
		job.Spec.Template.Spec.Affinity = &corev1.Affinity{}
	}
	if job.Spec.Template.Spec.Affinity.PodAffinity == nil {
		job.Spec.Template.Spec.Affinity.PodAffinity = &corev1.PodAffinity{}
	}
	if job.Spec.Template.Spec.Affinity.PodAntiAffinity == nil {
		job.Spec.Template.Spec.Affinity.PodAntiAffinity = &corev1.PodAntiAffinity{}
	}

	// Pod affinity ensures the pods of this job land on the same topology domain.
	job.Spec.Template.Spec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution = append(job.Spec.Template.Spec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution,
		corev1.PodAffinityTerm{
			LabelSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{
				{
					Key:      jobset.JobNameKey,
					Operator: metav1.LabelSelectorOpIn,
					Values:   []string{job.Name},
				},
			}},
			TopologyKey:       topologyKey,
			NamespaceSelector: &metav1.LabelSelector{},
		})

	// Pod anti-affinity ensures exclusively this job lands on the topology, preventing multiple jobs per topology domain.
	job.Spec.Template.Spec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution = append(job.Spec.Template.Spec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution,
		corev1.PodAffinityTerm{
			LabelSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{
				{
					Key:      jobset.JobNameKey,
					Operator: metav1.LabelSelectorOpExists,
				},
				{
					Key:      jobset.JobNameKey,
					Operator: metav1.LabelSelectorOpNotIn,
					Values:   []string{job.Name},
				},
			}},
			TopologyKey:       topologyKey,
			NamespaceSelector: &metav1.LabelSelector{},
		})
}