Skip to content

Commit 122dba3

Browse files
authored
fix: controller panics due to missing defaults (#340)
* fix controller panics due to missing defaults Signed-off-by: Dejan Zele Pejchev <pejcev.dejan@gmail.com> * add unit test for scheduler webhook default Signed-off-by: Dejan Zele Pejchev <pejcev.dejan@gmail.com> --------- Signed-off-by: Dejan Zele Pejchev <pejcev.dejan@gmail.com>
1 parent 100a0e7 commit 122dba3

8 files changed

+131
-33
lines changed

api/install/v1alpha1/scheduler_webhook.go

+18-4
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,6 @@ func (r *Scheduler) Default() {
5353
r.Spec.Image.Repository = "gresearch/armada-scheduler"
5454
}
5555

56-
if r.Spec.Replicas == nil {
57-
r.Spec.Replicas = ptr.To[int32](1)
58-
}
59-
6056
if r.Spec.Migrate == nil {
6157
r.Spec.Migrate = ptr.To[bool](true)
6258
}
@@ -83,6 +79,24 @@ func (r *Scheduler) Default() {
8379
}
8480
}
8581

82+
if r.Spec.Pruner == nil {
83+
r.Spec.Pruner = &PrunerConfig{
84+
Schedule: "@hourly",
85+
}
86+
if r.Spec.Pruner.Resources == nil {
87+
r.Spec.Pruner.Resources = &corev1.ResourceRequirements{
88+
Limits: corev1.ResourceList{
89+
"cpu": resource.MustParse("300m"),
90+
"memory": resource.MustParse("1Gi"),
91+
},
92+
Requests: corev1.ResourceList{
93+
"cpu": resource.MustParse("200m"),
94+
"memory": resource.MustParse("512Mi"),
95+
},
96+
}
97+
}
98+
}
99+
86100
// prometheus
87101
if r.Spec.Prometheus != nil && r.Spec.Prometheus.Enabled {
88102
if r.Spec.Prometheus.ScrapeInterval == nil {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
Copyright 2023.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package v1alpha1
18+
19+
import (
20+
"testing"
21+
22+
"github.com/stretchr/testify/assert"
23+
"k8s.io/utils/ptr"
24+
)
25+
26+
func TestScheduler_Default(t *testing.T) {
27+
tests := []struct {
28+
name string
29+
input *Scheduler
30+
assert func(*testing.T, *Scheduler)
31+
}{
32+
{
33+
name: "field is set and not overridden",
34+
input: &Scheduler{
35+
Spec: SchedulerSpec{
36+
CommonSpecBase: CommonSpecBase{
37+
Image: Image{
38+
Repository: "test/armada-scheduler",
39+
Tag: "latest",
40+
},
41+
},
42+
},
43+
},
44+
assert: func(t *testing.T, s *Scheduler) {
45+
assert.Equal(t, "test/armada-scheduler", s.Spec.Image.Repository)
46+
},
47+
},
48+
{
49+
name: "field is not set and gets defaulted",
50+
input: &Scheduler{
51+
Spec: SchedulerSpec{
52+
Migrate: nil,
53+
},
54+
},
55+
assert: func(t *testing.T, s *Scheduler) {
56+
assert.Equal(t, ptr.To(true), s.Spec.Migrate)
57+
},
58+
},
59+
{
60+
name: "nothing is set and everything gets defaulted",
61+
input: &Scheduler{
62+
Spec: SchedulerSpec{},
63+
},
64+
assert: func(t *testing.T, scheduler *Scheduler) {
65+
assert.Equal(t, "gresearch/armada-scheduler", scheduler.Spec.Image.Repository)
66+
assert.Equal(t, ptr.To[bool](true), scheduler.Spec.Migrate)
67+
assert.Equal(t, GetDefaultSecurityContext(), scheduler.Spec.SecurityContext)
68+
assert.Equal(t, GetDefaultPodSecurityContext(), scheduler.Spec.PodSecurityContext)
69+
},
70+
},
71+
}
72+
73+
for _, tt := range tests {
74+
t.Run(tt.name, func(t *testing.T) {
75+
tt.input.Default()
76+
tt.assert(t, tt.input)
77+
})
78+
}
79+
}

internal/controller/install/armadaserver_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ func createArmadaServerMigrationJobs(as *installv1alpha1.ArmadaServer, commonCon
316316
Containers: []corev1.Container{{
317317
Name: "wait-for-pulsar",
318318
ImagePullPolicy: corev1.PullIfNotPresent,
319-
Image: "alpine:3.16",
319+
Image: defaultAlpineImage(),
320320
Args: []string{
321321
"/bin/sh",
322322
"-c",

internal/controller/install/common_helpers.go

+4
Original file line numberDiff line numberDiff line change
@@ -866,3 +866,7 @@ func defaultDeploymentStrategy(maxUnavailable int32) appsv1.DeploymentStrategy {
866866
},
867867
}
868868
}
869+
870+
func defaultAlpineImage() string {
871+
return "alpine:3.20"
872+
}

internal/controller/install/lookout_controller.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -390,11 +390,11 @@ func createLookoutMigrationJob(lookout *installv1alpha1.Lookout, serviceAccountN
390390
Command: []string{
391391
"/bin/sh",
392392
"-c",
393-
`echo "Waiting for Postres..."
393+
`echo "Waiting for Postgres..."
394394
while ! nc -z $PGHOST $PGPORT; do
395395
sleep 1
396396
done
397-
echo "Postres started!"
397+
echo "Postgres started!"
398398
echo "Creating DB $PGDB if needed..."
399399
psql -v ON_ERROR_STOP=1 --username "$PGUSER" -c "CREATE DATABASE $PGDB"
400400
psql -v ON_ERROR_STOP=1 --username "$PGUSER" -c "GRANT ALL PRIVILEGES ON DATABASE $PGDB TO $PGUSER"
@@ -503,15 +503,15 @@ func createLookoutCronJob(lookout *installv1alpha1.Lookout, serviceAccountName s
503503
SecurityContext: lookout.Spec.PodSecurityContext,
504504
InitContainers: []corev1.Container{{
505505
Name: "lookout-db-pruner-db-wait",
506-
Image: "alpine:3.10",
506+
Image: defaultAlpineImage(),
507507
Command: []string{
508508
"/bin/sh",
509509
"-c",
510-
`echo "Waiting for Postres..."
510+
`echo "Waiting for Postgres..."
511511
while ! nc -z $PGHOST $PGPORT; do
512512
sleep 1
513513
done
514-
echo "Postres started!"`,
514+
echo "Postgres started!"`,
515515
},
516516
Env: []corev1.EnvVar{
517517
{

internal/controller/install/lookout_controller_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -829,15 +829,15 @@ func TestLookoutReconciler_CreateCronJob(t *testing.T) {
829829
InitContainers: []corev1.Container{
830830
{
831831
Name: "lookout-db-pruner-db-wait",
832-
Image: "alpine:3.10",
832+
Image: defaultAlpineImage(),
833833
Command: []string{
834834
"/bin/sh",
835835
"-c",
836-
`echo "Waiting for Postres..."
836+
`echo "Waiting for Postgres..."
837837
while ! nc -z $PGHOST $PGPORT; do
838838
sleep 1
839839
done
840-
echo "Postres started!"`,
840+
echo "Postgres started!"`,
841841
},
842842
Env: []corev1.EnvVar{
843843
{

internal/controller/install/scheduler_controller.go

+18-17
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ func newSchedulerMigrationJob(scheduler *installv1alpha1.Scheduler, serviceAccou
410410
Command: []string{
411411
"/bin/sh",
412412
"-c",
413-
`echo "Waiting for Postres..."
413+
`echo "Waiting for Postgres..."
414414
while ! nc -z $PGHOST $PGPORT; do
415415
sleep 1
416416
done
@@ -494,18 +494,20 @@ func newSchedulerCronJob(scheduler *installv1alpha1.Scheduler, serviceAccountNam
494494
appConfigFlag,
495495
appConfigFilepath,
496496
}
497-
if scheduler.Spec.Pruner.Args.Timeout != "" {
498-
prunerArgs = append(prunerArgs, "--timeout", scheduler.Spec.Pruner.Args.Timeout)
499-
}
500-
if scheduler.Spec.Pruner.Args.Batchsize > 0 {
501-
prunerArgs = append(prunerArgs, "--batchsize", fmt.Sprintf("%v", scheduler.Spec.Pruner.Args.Batchsize))
502-
}
503-
if scheduler.Spec.Pruner.Args.ExpireAfter != "" {
504-
prunerArgs = append(prunerArgs, "--expireAfter", scheduler.Spec.Pruner.Args.ExpireAfter)
505-
}
506-
prunerResources := corev1.ResourceRequirements{}
507-
if scheduler.Spec.Pruner.Resources != nil {
508-
prunerResources = *scheduler.Spec.Pruner.Resources
497+
var prunerResources corev1.ResourceRequirements
498+
if pruner := scheduler.Spec.Pruner; pruner != nil {
499+
if pruner.Args.Timeout != "" {
500+
prunerArgs = append(prunerArgs, "--timeout", scheduler.Spec.Pruner.Args.Timeout)
501+
}
502+
if pruner.Args.Batchsize > 0 {
503+
prunerArgs = append(prunerArgs, "--batchsize", fmt.Sprintf("%v", scheduler.Spec.Pruner.Args.Batchsize))
504+
}
505+
if pruner.Args.ExpireAfter != "" {
506+
prunerArgs = append(prunerArgs, "--expireAfter", scheduler.Spec.Pruner.Args.ExpireAfter)
507+
}
508+
if pruner.Resources != nil {
509+
prunerResources = *scheduler.Spec.Pruner.Resources
510+
}
509511
}
510512

511513
name := scheduler.Name + "-db-pruner"
@@ -518,7 +520,6 @@ func newSchedulerCronJob(scheduler *installv1alpha1.Scheduler, serviceAccountNam
518520
Annotations: map[string]string{"checksum/config": GenerateChecksumConfig(scheduler.Spec.ApplicationConfig.Raw)},
519521
},
520522
Spec: batchv1.CronJobSpec{
521-
522523
Schedule: scheduler.Spec.Pruner.Schedule,
523524
JobTemplate: batchv1.JobTemplateSpec{
524525
ObjectMeta: metav1.ObjectMeta{
@@ -543,15 +544,15 @@ func newSchedulerCronJob(scheduler *installv1alpha1.Scheduler, serviceAccountNam
543544
SecurityContext: scheduler.Spec.PodSecurityContext,
544545
InitContainers: []corev1.Container{{
545546
Name: "scheduler-db-pruner-db-wait",
546-
Image: "alpine:3.10",
547+
Image: defaultAlpineImage(),
547548
Command: []string{
548549
"/bin/sh",
549550
"-c",
550-
`echo "Waiting for Postres..."
551+
`echo "Waiting for Postgres..."
551552
while ! nc -z $PGHOST $PGPORT; do
552553
sleep 1
553554
done
554-
echo "Postres started!"`,
555+
echo "Postgres started!"`,
555556
},
556557
Env: []corev1.EnvVar{
557558
{

internal/controller/install/scheduler_controller_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1026,15 +1026,15 @@ func TestSchedulerReconciler_createSchedulerCronJob(t *testing.T) {
10261026
InitContainers: []corev1.Container{
10271027
{
10281028
Name: "scheduler-db-pruner-db-wait",
1029-
Image: "alpine:3.10",
1029+
Image: defaultAlpineImage(),
10301030
Command: []string{
10311031
"/bin/sh",
10321032
"-c",
1033-
`echo "Waiting for Postres..."
1033+
`echo "Waiting for Postgres..."
10341034
while ! nc -z $PGHOST $PGPORT; do
10351035
sleep 1
10361036
done
1037-
echo "Postres started!"`,
1037+
echo "Postgres started!"`,
10381038
},
10391039
Env: []corev1.EnvVar{
10401040
{

0 commit comments

Comments
 (0)