Skip to content

Commit 6633b3f

Browse files
authored
Update pruning pods to use different labels and add unit tests (#336)
Signed-off-by: Jason Parraga <sovietaced@gmail.com>
1 parent 07d2bee commit 6633b3f

File tree

5 files changed

+294
-22
lines changed

5 files changed

+294
-22
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ go 1.23.2
55
require (
66
github.com/go-logr/logr v1.4.2
77
github.com/golang/mock v1.6.0
8+
github.com/google/go-cmp v0.6.0
89
github.com/onsi/ginkgo/v2 v2.19.0
910
github.com/onsi/gomega v1.33.1
1011
github.com/pkg/errors v0.9.1
1112
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.77.2
1213
github.com/stretchr/testify v1.9.0
14+
google.golang.org/protobuf v1.35.1
1315
k8s.io/api v0.31.2
1416
k8s.io/apimachinery v0.31.2
1517
k8s.io/client-go v0.31.2
@@ -36,7 +38,6 @@ require (
3638
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
3739
github.com/golang/protobuf v1.5.4 // indirect
3840
github.com/google/gnostic-models v0.6.8 // indirect
39-
github.com/google/go-cmp v0.6.0 // indirect
4041
github.com/google/gofuzz v1.2.0 // indirect
4142
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
4243
github.com/google/uuid v1.6.0 // indirect
@@ -66,7 +67,6 @@ require (
6667
golang.org/x/time v0.7.0 // indirect
6768
golang.org/x/tools v0.26.0 // indirect
6869
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
69-
google.golang.org/protobuf v1.35.1 // indirect
7070
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
7171
gopkg.in/inf.v0 v0.9.1 // indirect
7272
gopkg.in/yaml.v2 v2.4.0 // indirect

internal/controller/install/lookout_controller.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -468,30 +468,32 @@ func createLookoutCronJob(lookout *installv1alpha1.Lookout, serviceAccountName s
468468
return nil, err
469469
}
470470

471+
name := lookout.Name + "-db-pruner"
472+
471473
job := batchv1.CronJob{
472474
ObjectMeta: metav1.ObjectMeta{
473-
Name: lookout.Name + "-db-pruner",
475+
Name: name,
474476
Namespace: lookout.Namespace,
475-
Labels: AllLabels(lookout.Name, lookout.Labels),
477+
Labels: AllLabels(name, lookout.Labels),
476478
Annotations: map[string]string{"checksum/config": GenerateChecksumConfig(lookout.Spec.ApplicationConfig.Raw)},
477479
},
478480
Spec: batchv1.CronJobSpec{
479481
Schedule: dbPruningSchedule,
480482
JobTemplate: batchv1.JobTemplateSpec{
481483
ObjectMeta: metav1.ObjectMeta{
482-
Name: lookout.Name + "-db-pruner",
484+
Name: name,
483485
Namespace: lookout.Namespace,
484-
Labels: AllLabels(lookout.Name, lookout.Labels),
486+
Labels: AllLabels(name, lookout.Labels),
485487
},
486488
Spec: batchv1.JobSpec{
487489
Parallelism: &parallelism,
488490
Completions: &completions,
489491
BackoffLimit: &backoffLimit,
490492
Template: corev1.PodTemplateSpec{
491493
ObjectMeta: metav1.ObjectMeta{
492-
Name: lookout.Name + "-db-pruner",
494+
Name: name,
493495
Namespace: lookout.Namespace,
494-
Labels: AllLabels(lookout.Name, lookout.Labels),
496+
Labels: AllLabels(name, lookout.Labels),
495497
},
496498
Spec: corev1.PodSpec{
497499
ServiceAccountName: serviceAccountName,
@@ -522,7 +524,7 @@ func createLookoutCronJob(lookout *installv1alpha1.Lookout, serviceAccountName s
522524
},
523525
}},
524526
Containers: []corev1.Container{{
525-
Name: "lookout-db-pruner",
527+
Name: name,
526528
ImagePullPolicy: corev1.PullIfNotPresent,
527529
Image: ImageString(lookout.Spec.Image),
528530
Args: []string{

internal/controller/install/lookout_controller_test.go

+152
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import (
55
"testing"
66
"time"
77

8+
"github.com/google/go-cmp/cmp"
9+
"google.golang.org/protobuf/testing/protocmp"
10+
811
"github.com/armadaproject/armada-operator/internal/controller/builders"
912

1013
"k8s.io/utils/ptr"
@@ -344,6 +347,155 @@ func TestLookoutReconciler_CreateCronJobErrorDueToApplicationConfig(t *testing.T
344347
assert.Equal(t, "yaml: line 1: did not find expected ',' or '}'", err.Error())
345348
}
346349

350+
func TestLookoutReconciler_CreateCronJob(t *testing.T) {
351+
t.Parallel()
352+
353+
dbPruningEnabled := true
354+
dbPruningSchedule := "1d"
355+
356+
lookout := v1alpha1.Lookout{
357+
TypeMeta: metav1.TypeMeta{
358+
Kind: "Lookout",
359+
APIVersion: "install.armadaproject.io/v1alpha1",
360+
},
361+
ObjectMeta: metav1.ObjectMeta{
362+
Namespace: "default",
363+
Name: "lookout",
364+
DeletionTimestamp: &metav1.Time{Time: time.Now()},
365+
Finalizers: []string{operatorFinalizer},
366+
},
367+
Spec: v1alpha1.LookoutSpec{
368+
CommonSpecBase: installv1alpha1.CommonSpecBase{
369+
Labels: nil,
370+
Image: v1alpha1.Image{
371+
Repository: "testrepo",
372+
Tag: "1.0.0",
373+
},
374+
ApplicationConfig: runtime.RawExtension{Raw: []byte(`{}`)},
375+
Resources: &corev1.ResourceRequirements{},
376+
},
377+
Replicas: ptr.To[int32](2),
378+
ClusterIssuer: "test",
379+
Ingress: &v1alpha1.IngressConfig{
380+
IngressClass: "nginx",
381+
},
382+
DbPruningEnabled: &dbPruningEnabled,
383+
DbPruningSchedule: &dbPruningSchedule,
384+
},
385+
}
386+
cronJob, err := createLookoutCronJob(&lookout, "lookout")
387+
assert.NoError(t, err)
388+
389+
var expectedParallelism int32 = 1
390+
var expectedCompletions int32 = 1
391+
var expectedBackoffLimit int32 = 0
392+
var expectedTerminationGracePeriodSeconds int64 = 0
393+
394+
expectedCronJob := &batchv1.CronJob{
395+
ObjectMeta: metav1.ObjectMeta{
396+
Name: "lookout-db-pruner",
397+
Namespace: "default",
398+
Labels: map[string]string{
399+
"app": "lookout-db-pruner",
400+
"release": "lookout-db-pruner",
401+
},
402+
Annotations: map[string]string{
403+
"checksum/config": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
404+
},
405+
},
406+
Spec: batchv1.CronJobSpec{
407+
JobTemplate: batchv1.JobTemplateSpec{
408+
ObjectMeta: metav1.ObjectMeta{
409+
Name: "lookout-db-pruner",
410+
Namespace: "default",
411+
Labels: map[string]string{
412+
"app": "lookout-db-pruner",
413+
"release": "lookout-db-pruner",
414+
},
415+
},
416+
Spec: batchv1.JobSpec{
417+
Parallelism: &expectedParallelism,
418+
Completions: &expectedCompletions,
419+
BackoffLimit: &expectedBackoffLimit,
420+
Template: corev1.PodTemplateSpec{
421+
ObjectMeta: metav1.ObjectMeta{
422+
Name: "lookout-db-pruner",
423+
Namespace: "default",
424+
Labels: map[string]string{
425+
"app": "lookout-db-pruner",
426+
"release": "lookout-db-pruner",
427+
},
428+
},
429+
Spec: corev1.PodSpec{
430+
Containers: []corev1.Container{
431+
{
432+
Args: []string{
433+
"--pruneDatabase",
434+
"--config",
435+
"/config/application_config.yaml",
436+
},
437+
Image: "testrepo:1.0.0",
438+
ImagePullPolicy: "IfNotPresent",
439+
Name: "lookout-db-pruner",
440+
VolumeMounts: []corev1.VolumeMount{
441+
{
442+
Name: "user-config",
443+
ReadOnly: true,
444+
MountPath: appConfigFilepath,
445+
SubPath: "lookout-config.yaml",
446+
},
447+
},
448+
},
449+
},
450+
InitContainers: []corev1.Container{
451+
{
452+
Name: "lookout-db-pruner-db-wait",
453+
Image: "alpine:3.10",
454+
Command: []string{
455+
"/bin/sh",
456+
"-c",
457+
`echo "Waiting for Postres..."
458+
while ! nc -z $PGHOST $PGPORT; do
459+
sleep 1
460+
done
461+
echo "Postres started!"`,
462+
},
463+
Env: []corev1.EnvVar{
464+
{
465+
Name: "PGHOST",
466+
},
467+
{
468+
Name: "PGPORT",
469+
},
470+
},
471+
},
472+
},
473+
RestartPolicy: "Never",
474+
ServiceAccountName: "lookout",
475+
TerminationGracePeriodSeconds: &expectedTerminationGracePeriodSeconds,
476+
Volumes: []corev1.Volume{
477+
{
478+
Name: "user-config",
479+
VolumeSource: corev1.VolumeSource{
480+
Secret: &corev1.SecretVolumeSource{
481+
SecretName: "lookout",
482+
},
483+
},
484+
},
485+
},
486+
},
487+
},
488+
},
489+
},
490+
Schedule: "1d",
491+
},
492+
}
493+
494+
if !cmp.Equal(expectedCronJob, cronJob, protocmp.Transform()) {
495+
t.Fatalf("cronjob is not the same %s", cmp.Diff(expectedCronJob, cronJob, protocmp.Transform()))
496+
}
497+
}
498+
347499
func TestLookoutReconciler_ReconcileDeletingLookout(t *testing.T) {
348500
t.Parallel()
349501

internal/controller/install/scheduler_controller.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -503,31 +503,33 @@ func newSchedulerCronJob(scheduler *installv1alpha1.Scheduler, serviceAccountNam
503503
prunerResources = *scheduler.Spec.Pruner.Resources
504504
}
505505

506+
name := scheduler.Name + "-db-pruner"
507+
506508
job := batchv1.CronJob{
507509
ObjectMeta: metav1.ObjectMeta{
508-
Name: scheduler.Name + "-db-pruner",
510+
Name: name,
509511
Namespace: scheduler.Namespace,
510-
Labels: AllLabels(scheduler.Name, scheduler.Labels),
512+
Labels: AllLabels(name, scheduler.Labels),
511513
Annotations: map[string]string{"checksum/config": GenerateChecksumConfig(scheduler.Spec.ApplicationConfig.Raw)},
512514
},
513515
Spec: batchv1.CronJobSpec{
514516

515517
Schedule: scheduler.Spec.Pruner.Schedule,
516518
JobTemplate: batchv1.JobTemplateSpec{
517519
ObjectMeta: metav1.ObjectMeta{
518-
Name: scheduler.Name + "-db-pruner",
520+
Name: name,
519521
Namespace: scheduler.Namespace,
520-
Labels: AllLabels(scheduler.Name, scheduler.Labels),
522+
Labels: AllLabels(name, scheduler.Labels),
521523
},
522524
Spec: batchv1.JobSpec{
523525
Parallelism: &parallelism,
524526
Completions: &completions,
525527
BackoffLimit: &backoffLimit,
526528
Template: corev1.PodTemplateSpec{
527529
ObjectMeta: metav1.ObjectMeta{
528-
Name: scheduler.Name + "-db-pruner",
530+
Name: name,
529531
Namespace: scheduler.Namespace,
530-
Labels: AllLabels(scheduler.Name, scheduler.Labels),
532+
Labels: AllLabels(name, scheduler.Labels),
531533
},
532534
Spec: corev1.PodSpec{
533535
ServiceAccountName: serviceAccountName,
@@ -558,7 +560,7 @@ func newSchedulerCronJob(scheduler *installv1alpha1.Scheduler, serviceAccountNam
558560
},
559561
}},
560562
Containers: []corev1.Container{{
561-
Name: "scheduler-db-pruner",
563+
Name: name,
562564
ImagePullPolicy: corev1.PullIfNotPresent,
563565
Image: ImageString(scheduler.Spec.Image),
564566
Args: prunerArgs,

0 commit comments

Comments
 (0)