Skip to content

Commit bda6f3d

Browse files
committed
Pass through Pod Affinity Rules
Allow Pod Affinity Rules to be defined in the Limitador CR which will be past to the Limitador deployment CR and place in `spec.template.spec.affinity`.
1 parent beaa93e commit bda6f3d

File tree

8 files changed

+1737
-1
lines changed

8 files changed

+1737
-1
lines changed

api/v1alpha1/limitador_types.go

+3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ type LimitadorSpec struct {
5959
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
6060
// Important: Run "make" to regenerate code after modifying this file
6161

62+
// +optional
63+
Affinity *corev1.Affinity `json:"affinity,omitempty"`
64+
6265
// +optional
6366
Replicas *int `json:"replicas,omitempty"`
6467

api/v1alpha1/zz_generated.deepcopy.go

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bundle/manifests/limitador.kuadrant.io_limitadors.yaml

+828
Large diffs are not rendered by default.

config/crd/bases/limitador.kuadrant.io_limitadors.yaml

+828
Large diffs are not rendered by default.

controllers/limitador_controller.go

+1
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ func (r *LimitadorReconciler) reconcileDeployment(ctx context.Context, limitador
194194
reconcilers.DeploymentContainerListMutator,
195195
reconcilers.DeploymentImageMutator,
196196
reconcilers.DeploymentCommandMutator,
197+
reconcilers.DeploymentAffinityMutator,
197198
reconcilers.DeploymentResourcesMutator,
198199
)
199200

controllers/limitador_controller_test.go

+62-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,23 @@ var _ = Describe("Limitador controller", func() {
5454
version := LimitadorVersion
5555
httpPort := &limitadorv1alpha1.TransportProtocol{Port: &httpPortNumber}
5656
grpcPort := &limitadorv1alpha1.TransportProtocol{Port: &grpcPortNumber}
57+
affinity := &v1.Affinity{
58+
PodAntiAffinity: &v1.PodAntiAffinity{
59+
PreferredDuringSchedulingIgnoredDuringExecution: []v1.WeightedPodAffinityTerm{
60+
{
61+
Weight: 100,
62+
PodAffinityTerm: v1.PodAffinityTerm{
63+
LabelSelector: &metav1.LabelSelector{
64+
MatchLabels: map[string]string{
65+
"pod": "label",
66+
},
67+
},
68+
TopologyKey: "kubernetes.io/hostname",
69+
},
70+
},
71+
},
72+
},
73+
}
5774

5875
limits := []limitadorv1alpha1.RateLimit{
5976
{
@@ -88,6 +105,7 @@ var _ = Describe("Limitador controller", func() {
88105
Spec: limitadorv1alpha1.LimitadorSpec{
89106
Replicas: &replicas,
90107
Version: &version,
108+
Affinity: affinity,
91109
Listener: &limitadorv1alpha1.Listener{
92110
HTTP: httpPort,
93111
GRPC: grpcPort,
@@ -188,6 +206,9 @@ var _ = Describe("Limitador controller", func() {
188206
)
189207
Expect(createdLimitadorDeployment.Spec.Template.Spec.Containers[0].Resources).Should(
190208
Equal(*limitadorObj.GetResourceRequirements()))
209+
Expect(createdLimitadorDeployment.Spec.Template.Spec.Affinity).Should(
210+
Equal(affinity),
211+
)
191212
})
192213

193214
It("Should create a Limitador service", func() {
@@ -306,6 +327,8 @@ var _ = Describe("Limitador controller", func() {
306327
},
307328
}
308329
updatedLimitador.Spec.ResourceRequirements = resourceRequirements
330+
affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution[0].Weight = 99
331+
updatedLimitador.Spec.Affinity = affinity
309332

310333
Expect(k8sClient.Update(context.TODO(), &updatedLimitador)).Should(Succeed())
311334
updatedLimitadorDeployment := appsv1.Deployment{}
@@ -325,8 +348,46 @@ var _ = Describe("Limitador controller", func() {
325348
correctReplicas := *updatedLimitadorDeployment.Spec.Replicas == LimitadorReplicas+1
326349
correctImage := updatedLimitadorDeployment.Spec.Template.Spec.Containers[0].Image == LimitadorImage+":latest"
327350
correctResources := reflect.DeepEqual(updatedLimitadorDeployment.Spec.Template.Spec.Containers[0].Resources, *resourceRequirements)
351+
correctAffinity := updatedLimitadorDeployment.Spec.Template.Spec.Affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution[0].Weight == 99
352+
353+
return correctReplicas && correctImage && correctResources && correctAffinity
354+
}, timeout, interval).Should(BeTrue())
355+
})
356+
357+
It("Should modify limitador deployments if nil object set", func() {
358+
updatedLimitador := limitadorv1alpha1.Limitador{}
359+
Eventually(func() bool {
360+
err := k8sClient.Get(
361+
context.TODO(),
362+
types.NamespacedName{
363+
Namespace: LimitadorNamespace,
364+
Name: limitadorObj.Name,
365+
},
366+
&updatedLimitador)
367+
368+
return err == nil
369+
}, timeout, interval).Should(BeTrue())
370+
371+
updatedLimitador.Spec.Affinity = nil
372+
373+
Expect(k8sClient.Update(context.TODO(), &updatedLimitador)).Should(Succeed())
374+
updatedLimitadorDeployment := appsv1.Deployment{}
375+
Eventually(func() bool {
376+
err := k8sClient.Get(
377+
context.TODO(),
378+
types.NamespacedName{
379+
Namespace: LimitadorNamespace,
380+
Name: limitadorObj.Name,
381+
},
382+
&updatedLimitadorDeployment)
383+
384+
if err != nil {
385+
return false
386+
}
387+
388+
correctAffinity := updatedLimitadorDeployment.Spec.Template.Spec.Affinity == nil
328389

329-
return correctReplicas && correctImage && correctResources
390+
return correctAffinity
330391
}, timeout, interval).Should(BeTrue())
331392
})
332393

pkg/limitador/k8s_objects.go

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ func Deployment(limitador *limitadorv1alpha1.Limitador, storageConfigSecret *v1.
8686
Labels: Labels(limitador),
8787
},
8888
Spec: v1.PodSpec{
89+
Affinity: limitador.Spec.Affinity,
8990
Containers: []v1.Container{
9091
{
9192
Name: "limitador",

pkg/reconcilers/deployment.go

+9
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ func DeploymentMutator(opts ...DeploymentMutateFn) MutateFn {
3434
}
3535
}
3636

37+
func DeploymentAffinityMutator(desired, existing *appsv1.Deployment) bool {
38+
update := false
39+
if !reflect.DeepEqual(existing.Spec.Template.Spec.Affinity, desired.Spec.Template.Spec.Affinity) {
40+
existing.Spec.Template.Spec.Affinity = desired.Spec.Template.Spec.Affinity
41+
update = true
42+
}
43+
return update
44+
}
45+
3746
func DeploymentReplicasMutator(desired, existing *appsv1.Deployment) bool {
3847
update := false
3948

0 commit comments

Comments
 (0)