From ad0407517d86e55d6520ce010f5f57b1cde2d7f9 Mon Sep 17 00:00:00 2001 From: Christian Ciach Date: Fri, 14 Mar 2025 11:35:40 +0100 Subject: [PATCH 1/3] Add OwnerReference to generated Jobs --- internal/pkg/callbacks/rolling_upgrade.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/pkg/callbacks/rolling_upgrade.go b/internal/pkg/callbacks/rolling_upgrade.go index 81c0b659d..332a8b02b 100644 --- a/internal/pkg/callbacks/rolling_upgrade.go +++ b/internal/pkg/callbacks/rolling_upgrade.go @@ -444,10 +444,15 @@ func PatchDeployment(clients kube.Clients, namespace string, resource runtime.Ob func CreateJobFromCronjob(clients kube.Clients, namespace string, resource runtime.Object) error { cronJob := resource.(*batchv1.CronJob) job := &batchv1.Job{ - ObjectMeta: cronJob.Spec.JobTemplate.ObjectMeta, - Spec: cronJob.Spec.JobTemplate.Spec, + ObjectMeta: meta_v1.ObjectMeta{ + GenerateName: cronJob.Name + "-", + Namespace: cronJob.Namespace, + Annotations: cronJob.Spec.JobTemplate.Annotations, + Labels: cronJob.Spec.JobTemplate.Labels, + OwnerReferences: []meta_v1.OwnerReference{*meta_v1.NewControllerRef(cronJob, batchv1.SchemeGroupVersion.WithKind("CronJob"))}, + }, + Spec: cronJob.Spec.JobTemplate.Spec, } - job.GenerateName = cronJob.Name + "-" _, err := clients.KubernetesClient.BatchV1().Jobs(namespace).Create(context.TODO(), job, meta_v1.CreateOptions{FieldManager: "Reloader"}) return err } From 81315adc9bd8a7a4dfc40f8e844906c4b29b3c99 Mon Sep 17 00:00:00 2001 From: Christian Ciach Date: Tue, 18 Mar 2025 14:18:13 +0100 Subject: [PATCH 2/3] Add conventional annotation to triggered jobs --- internal/pkg/callbacks/rolling_upgrade.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/internal/pkg/callbacks/rolling_upgrade.go b/internal/pkg/callbacks/rolling_upgrade.go index 332a8b02b..c7b2e5ccb 100644 --- a/internal/pkg/callbacks/rolling_upgrade.go +++ b/internal/pkg/callbacks/rolling_upgrade.go @@ -16,6 +16,8 @@ import ( "k8s.io/apimachinery/pkg/runtime" patchtypes "k8s.io/apimachinery/pkg/types" + "maps" + argorolloutv1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" ) @@ -443,11 +445,16 @@ func PatchDeployment(clients kube.Clients, namespace string, resource runtime.Ob // CreateJobFromCronjob performs rolling upgrade on cronjob func CreateJobFromCronjob(clients kube.Clients, namespace string, resource runtime.Object) error { cronJob := resource.(*batchv1.CronJob) + + annotations := make(map[string]string) + annotations["cronjob.kubernetes.io/instantiate"] = "manual" + maps.Copy(annotations, cronJob.Spec.JobTemplate.Annotations) + job := &batchv1.Job{ ObjectMeta: meta_v1.ObjectMeta{ GenerateName: cronJob.Name + "-", Namespace: cronJob.Namespace, - Annotations: cronJob.Spec.JobTemplate.Annotations, + Annotations: annotations, Labels: cronJob.Spec.JobTemplate.Labels, OwnerReferences: []meta_v1.OwnerReference{*meta_v1.NewControllerRef(cronJob, batchv1.SchemeGroupVersion.WithKind("CronJob"))}, }, From 99c45b3ca35834b73a9b0fad9a47bf6baa24abbe Mon Sep 17 00:00:00 2001 From: Christian Ciach Date: Wed, 9 Jul 2025 12:28:48 +0200 Subject: [PATCH 3/3] Add test for CronJob owner references --- .../pkg/callbacks/rolling_upgrade_test.go | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/internal/pkg/callbacks/rolling_upgrade_test.go b/internal/pkg/callbacks/rolling_upgrade_test.go index 31d441180..b9f48f3fd 100644 --- a/internal/pkg/callbacks/rolling_upgrade_test.go +++ b/internal/pkg/callbacks/rolling_upgrade_test.go @@ -415,13 +415,26 @@ func TestPatchResources(t *testing.T) { func TestCreateJobFromCronjob(t *testing.T) { fixtures := newTestFixtures() - cronJob, err := createTestCronJobWithAnnotations(clients, fixtures.namespace, "1") + runtimeObj, err := createTestCronJobWithAnnotations(clients, fixtures.namespace, "1") assert.NoError(t, err) - err = callbacks.CreateJobFromCronjob(clients, fixtures.namespace, cronJob.(*batchv1.CronJob)) + cronJob := runtimeObj.(*batchv1.CronJob) + err = callbacks.CreateJobFromCronjob(clients, fixtures.namespace, cronJob) assert.NoError(t, err) - err = deleteTestCronJob(clients, fixtures.namespace, "test-cronjob") + jobList, err := clients.KubernetesClient.BatchV1().Jobs(fixtures.namespace).List(context.TODO(), metav1.ListOptions{}) + assert.NoError(t, err) + + ownerFound := false + for _, job := range jobList.Items { + if isControllerOwner("CronJob", cronJob.Name, job.OwnerReferences) { + ownerFound = true + break + } + } + assert.Truef(t, ownerFound, "Missing CronJob owner reference") + + err = deleteTestCronJob(clients, fixtures.namespace, cronJob.Name) assert.NoError(t, err) } @@ -749,3 +762,12 @@ func createTestJobWithAnnotations(clients kube.Clients, namespace, version strin func deleteTestJob(clients kube.Clients, namespace, name string) error { return clients.KubernetesClient.BatchV1().Jobs(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{}) } + +func isControllerOwner(kind, name string, ownerRefs []metav1.OwnerReference) bool { + for _, ownerRef := range ownerRefs { + if *ownerRef.Controller && ownerRef.Kind == kind && ownerRef.Name == name { + return true + } + } + return false +}