From d0518848b54cd476c50dac04f3d86707bf241d76 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 16 Nov 2021 15:40:17 +0100 Subject: [PATCH] Add warning about using unsupported CRON_TZ CRON_TZ variable slipped in during upgrading github.com/robfig/cron library. It allows setting a time zone which is a long requested feature but one that is not officially supported. This adds warning event since users should not rely on unsupported features. --- pkg/controller/cronjob/cronjob_controllerv2.go | 10 ++++++++-- pkg/registry/batch/cronjob/strategy.go | 11 ++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/pkg/controller/cronjob/cronjob_controllerv2.go b/pkg/controller/cronjob/cronjob_controllerv2.go index 705de615c45..1455fec00fb 100644 --- a/pkg/controller/cronjob/cronjob_controllerv2.go +++ b/pkg/controller/cronjob/cronjob_controllerv2.go @@ -21,6 +21,7 @@ import ( "fmt" "reflect" "sort" + "strings" "time" "github.com/robfig/cron/v3" @@ -489,15 +490,20 @@ func (jm *ControllerV2) syncCronJob( // this is likely a user error in defining the spec value // we should log the error and not reconcile this cronjob until an update to spec klog.V(2).InfoS("Unparseable schedule", "cronjob", klog.KRef(cj.GetNamespace(), cj.GetName()), "schedule", cj.Spec.Schedule, "err", err) - jm.recorder.Eventf(cj, corev1.EventTypeWarning, "UnparseableSchedule", "unparseable schedule: %s : %s", cj.Spec.Schedule, err) + jm.recorder.Eventf(cj, corev1.EventTypeWarning, "UnparseableSchedule", "unparseable schedule: %q : %s", cj.Spec.Schedule, err) return cj, nil, nil } + + if strings.Contains(cj.Spec.Schedule, "TZ") { + jm.recorder.Eventf(cj, corev1.EventTypeWarning, "UnsupportedSchedule", "CRON_TZ or TZ used in schedule %q is not officially supported, see https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ for more details", cj.Spec.Schedule) + } + scheduledTime, err := getNextScheduleTime(*cj, now, sched, jm.recorder) if err != nil { // this is likely a user error in defining the spec value // we should log the error and not reconcile this cronjob until an update to spec klog.V(2).InfoS("invalid schedule", "cronjob", klog.KRef(cj.GetNamespace(), cj.GetName()), "schedule", cj.Spec.Schedule, "err", err) - jm.recorder.Eventf(cj, corev1.EventTypeWarning, "InvalidSchedule", "invalid schedule schedule: %s : %s", cj.Spec.Schedule, err) + jm.recorder.Eventf(cj, corev1.EventTypeWarning, "InvalidSchedule", "invalid schedule: %s : %s", cj.Spec.Schedule, err) return cj, nil, nil } if scheduledTime == nil { diff --git a/pkg/registry/batch/cronjob/strategy.go b/pkg/registry/batch/cronjob/strategy.go index ce77a9ae557..c75a2144519 100644 --- a/pkg/registry/batch/cronjob/strategy.go +++ b/pkg/registry/batch/cronjob/strategy.go @@ -18,6 +18,8 @@ package cronjob import ( "context" + "fmt" + "strings" batchv1beta1 "k8s.io/api/batch/v1beta1" apiequality "k8s.io/apimachinery/pkg/api/equality" @@ -114,7 +116,11 @@ func (cronJobStrategy) Validate(ctx context.Context, obj runtime.Object) field.E // WarningsOnCreate returns warnings for the creation of the given object. func (cronJobStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { newCronJob := obj.(*batch.CronJob) - return pod.GetWarningsForPodTemplate(ctx, field.NewPath("spec", "jobTemplate", "spec", "template"), &newCronJob.Spec.JobTemplate.Spec.Template, nil) + warnings := pod.GetWarningsForPodTemplate(ctx, field.NewPath("spec", "jobTemplate", "spec", "template"), &newCronJob.Spec.JobTemplate.Spec.Template, nil) + if strings.Contains(newCronJob.Spec.Schedule, "TZ") { + warnings = append(warnings, fmt.Sprintf("CRON_TZ or TZ used in %s is not officially supported, see https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ for more details", field.NewPath("spec", "spec", "schedule"))) + } + return warnings } // Canonicalize normalizes the object after validation. @@ -147,6 +153,9 @@ func (cronJobStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Ob if newCronJob.Generation != oldCronJob.Generation { warnings = pod.GetWarningsForPodTemplate(ctx, field.NewPath("spec", "jobTemplate", "spec", "template"), &newCronJob.Spec.JobTemplate.Spec.Template, &oldCronJob.Spec.JobTemplate.Spec.Template) } + if strings.Contains(newCronJob.Spec.Schedule, "TZ") { + warnings = append(warnings, fmt.Sprintf("CRON_TZ or TZ used in %s is not officially supported, see https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ for more details", field.NewPath("spec", "spec", "schedule"))) + } return warnings }