diff --git a/internal/pkg/callbacks/rolling_upgrade.go b/internal/pkg/callbacks/rolling_upgrade.go index 02ed23dd0..c0e979c4a 100644 --- a/internal/pkg/callbacks/rolling_upgrade.go +++ b/internal/pkg/callbacks/rolling_upgrade.go @@ -6,6 +6,7 @@ import ( "github.com/sirupsen/logrus" "github.com/stakater/Reloader/pkg/kube" appsv1 "k8s.io/api/apps/v1" + batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -67,6 +68,26 @@ func GetDeploymentItems(clients kube.Clients, namespace string) []runtime.Object return items } +// GetCronJobItems returns the jobs in given namespace +func GetCronJobItems(clients kube.Clients, namespace string) []runtime.Object { + cronjobs, err := clients.KubernetesClient.BatchV1().CronJobs(namespace).List(context.TODO(), meta_v1.ListOptions{}) + if err != nil { + logrus.Errorf("Failed to list cronjobs %v", err) + } + + items := make([]runtime.Object, len(cronjobs.Items)) + // Ensure we always have pod annotations to add to + for i, v := range cronjobs.Items { + if v.Spec.JobTemplate.Spec.Template.ObjectMeta.Annotations == nil { + annotations := make(map[string]string) + cronjobs.Items[i].Spec.JobTemplate.Spec.Template.ObjectMeta.Annotations = annotations + } + items[i] = &cronjobs.Items[i] + } + + return items +} + // GetDaemonSetItems returns the daemonSets in given namespace func GetDaemonSetItems(clients kube.Clients, namespace string) []runtime.Object { daemonSets, err := clients.KubernetesClient.AppsV1().DaemonSets(namespace).List(context.TODO(), meta_v1.ListOptions{}) @@ -148,6 +169,11 @@ func GetDeploymentAnnotations(item runtime.Object) map[string]string { return item.(*appsv1.Deployment).ObjectMeta.Annotations } +// GetCronJobAnnotations returns the annotations of given cronjob +func GetCronJobAnnotations(item runtime.Object) map[string]string { + return item.(*batchv1.CronJob).ObjectMeta.Annotations +} + // GetDaemonSetAnnotations returns the annotations of given daemonSet func GetDaemonSetAnnotations(item runtime.Object) map[string]string { return item.(*appsv1.DaemonSet).ObjectMeta.Annotations @@ -173,6 +199,11 @@ func GetDeploymentPodAnnotations(item runtime.Object) map[string]string { return item.(*appsv1.Deployment).Spec.Template.ObjectMeta.Annotations } +// GetCronJobPodAnnotations returns the pod's annotations of given cronjob +func GetCronJobPodAnnotations(item runtime.Object) map[string]string { + return item.(*batchv1.CronJob).Spec.JobTemplate.Spec.Template.ObjectMeta.Annotations +} + // GetDaemonSetPodAnnotations returns the pod's annotations of given daemonSet func GetDaemonSetPodAnnotations(item runtime.Object) map[string]string { return item.(*appsv1.DaemonSet).Spec.Template.ObjectMeta.Annotations @@ -198,6 +229,11 @@ func GetDeploymentContainers(item runtime.Object) []v1.Container { return item.(*appsv1.Deployment).Spec.Template.Spec.Containers } +// GetCronJobContainers returns the containers of given cronjob +func GetCronJobContainers(item runtime.Object) []v1.Container { + return item.(*batchv1.CronJob).Spec.JobTemplate.Spec.Template.Spec.Containers +} + // GetDaemonSetContainers returns the containers of given daemonSet func GetDaemonSetContainers(item runtime.Object) []v1.Container { return item.(*appsv1.DaemonSet).Spec.Template.Spec.Containers @@ -223,6 +259,11 @@ func GetDeploymentInitContainers(item runtime.Object) []v1.Container { return item.(*appsv1.Deployment).Spec.Template.Spec.InitContainers } +// GetCronJobInitContainers returns the containers of given cronjob +func GetCronJobInitContainers(item runtime.Object) []v1.Container { + return item.(*batchv1.CronJob).Spec.JobTemplate.Spec.Template.Spec.InitContainers +} + // GetDaemonSetInitContainers returns the containers of given daemonSet func GetDaemonSetInitContainers(item runtime.Object) []v1.Container { return item.(*appsv1.DaemonSet).Spec.Template.Spec.InitContainers @@ -250,6 +291,18 @@ func UpdateDeployment(clients kube.Clients, namespace string, resource runtime.O return err } +// CreateJobFromCronjob performs rolling upgrade on cronjob +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, + } + job.GenerateName = cronJob.Name + "-" + _, err := clients.KubernetesClient.BatchV1().Jobs(namespace).Create(context.TODO(), job, meta_v1.CreateOptions{FieldManager: "Reloader"}) + return err +} + // UpdateDaemonSet performs rolling upgrade on daemonSet func UpdateDaemonSet(clients kube.Clients, namespace string, resource runtime.Object) error { daemonSet := resource.(*appsv1.DaemonSet) @@ -286,6 +339,11 @@ func GetDeploymentVolumes(item runtime.Object) []v1.Volume { return item.(*appsv1.Deployment).Spec.Template.Spec.Volumes } +// GetCronJobVolumes returns the Volumes of given cronjob +func GetCronJobVolumes(item runtime.Object) []v1.Volume { + return item.(*batchv1.CronJob).Spec.JobTemplate.Spec.Template.Spec.Volumes +} + // GetDaemonSetVolumes returns the Volumes of given daemonSet func GetDaemonSetVolumes(item runtime.Object) []v1.Volume { return item.(*appsv1.DaemonSet).Spec.Template.Spec.Volumes diff --git a/internal/pkg/handler/upgrade.go b/internal/pkg/handler/upgrade.go index b8cb31103..1b0c00314 100644 --- a/internal/pkg/handler/upgrade.go +++ b/internal/pkg/handler/upgrade.go @@ -41,6 +41,20 @@ func GetDeploymentRollingUpgradeFuncs() callbacks.RollingUpgradeFuncs { } } +// GetDeploymentRollingUpgradeFuncs returns all callback funcs for a cronjob +func GetCronJobCreateJobFuncs() callbacks.RollingUpgradeFuncs { + return callbacks.RollingUpgradeFuncs{ + ItemsFunc: callbacks.GetCronJobItems, + AnnotationsFunc: callbacks.GetCronJobAnnotations, + PodAnnotationsFunc: callbacks.GetCronJobPodAnnotations, + ContainersFunc: callbacks.GetCronJobContainers, + InitContainersFunc: callbacks.GetCronJobInitContainers, + UpdateFunc: callbacks.CreateJobFromCronjob, + VolumesFunc: callbacks.GetCronJobVolumes, + ResourceType: "CronJob", + } +} + // GetDaemonSetRollingUpgradeFuncs returns all callback funcs for a daemonset func GetDaemonSetRollingUpgradeFuncs() callbacks.RollingUpgradeFuncs { return callbacks.RollingUpgradeFuncs{ @@ -134,6 +148,10 @@ func doRollingUpgrade(config util.Config, collectors metrics.Collectors, recorde if err != nil { return err } + err = rollingUpgrade(clients, config, GetCronJobCreateJobFuncs(), collectors, recorder) + if err != nil { + return err + } err = rollingUpgrade(clients, config, GetDaemonSetRollingUpgradeFuncs(), collectors, recorder) if err != nil { return err