MCPcopy
hub / github.com/fluid-cloudnative/fluid / BuildWorkersAffinity

Method BuildWorkersAffinity

pkg/ctrl/affinity.go:56–170  ·  view source on GitHub ↗

BuildWorkersAffinity builds workers affinity if it doesn't have

(workers *appsv1.StatefulSet)

Source from the content-addressed store, hash-verified

54
55// BuildWorkersAffinity builds workers affinity if it doesn't have
56func (e *Helper) BuildWorkersAffinity(workers *appsv1.StatefulSet) (workersToUpdate *appsv1.StatefulSet, err error) {
57 // TODO: for now, runtime affinity can't be set by user, so we can assume the affinity is nil in the first time.
58 // We need to enhance it in future
59 workersToUpdate = workers.DeepCopy()
60 if e.checkWorkerAffinity(workersToUpdate) {
61 return
62 }
63 var (
64 name = e.runtimeInfo.GetName()
65 namespace = e.runtimeInfo.GetNamespace()
66 )
67
68 if workersToUpdate.Spec.Template.Spec.Affinity == nil {
69 workersToUpdate.Spec.Template.Spec.Affinity = &corev1.Affinity{}
70 dataset, err := utils.GetDataset(e.client, name, namespace)
71 if err != nil {
72 return workersToUpdate, err
73 }
74 // 1. Set pod anti affinity(required) for same dataset (Current using port conflict for scheduling, no need to do)
75
76 // 2. Set pod anti affinity for the different dataset
77 if dataset.IsExclusiveMode() {
78 workersToUpdate.Spec.Template.Spec.Affinity.PodAntiAffinity = &corev1.PodAntiAffinity{
79 RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
80 {
81 LabelSelector: &metav1.LabelSelector{
82 MatchExpressions: []metav1.LabelSelectorRequirement{
83 {
84 Key: "fluid.io/dataset",
85 Operator: metav1.LabelSelectorOpExists,
86 },
87 },
88 },
89 TopologyKey: "kubernetes.io/hostname",
90 },
91 },
92 }
93 } else {
94 workersToUpdate.Spec.Template.Spec.Affinity.PodAntiAffinity = &corev1.PodAntiAffinity{
95 PreferredDuringSchedulingIgnoredDuringExecution: []corev1.WeightedPodAffinityTerm{
96 {
97 // The default weight is 50
98 Weight: 50,
99 PodAffinityTerm: corev1.PodAffinityTerm{
100 LabelSelector: &metav1.LabelSelector{
101 MatchExpressions: []metav1.LabelSelectorRequirement{
102 {
103 Key: "fluid.io/dataset",
104 Operator: metav1.LabelSelectorOpExists,
105 },
106 },
107 },
108 TopologyKey: "kubernetes.io/hostname",
109 },
110 },
111 },
112 RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
113 {

Callers 3

SetupWorkersMethod · 0.95
TestBuildWorkersAffinityFunction · 0.80

Calls 8

checkWorkerAffinityMethod · 0.95
GetDatasetFunction · 0.92
IsExclusiveModeMethod · 0.80
GetNameMethod · 0.65
GetNamespaceMethod · 0.65
GetRuntimeTypeMethod · 0.65
GetFuseLabelNameMethod · 0.65
DeepCopyMethod · 0.45

Tested by 2

TestBuildWorkersAffinityFunction · 0.64