package controllers import ( formolv1alpha1 "github.com/desmo999r/formol/api/v1alpha1" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" ) func (r *BackupConfigurationReconciler) DeleteCronJob(backupConf formolv1alpha1.BackupConfiguration) error { cronjob := &batchv1.CronJob{} if err := r.Get(r.Context, client.ObjectKey{ Namespace: backupConf.Namespace, Name: "backup-" + backupConf.Name, }, cronjob); err == nil { r.Log.V(0).Info("Deleting cronjob", "cronjob", cronjob.Name) return r.Delete(r.Context, cronjob) } else { return err } } func (r *BackupConfigurationReconciler) AddCronJob(backupConf formolv1alpha1.BackupConfiguration) error { cronjob := &batchv1.CronJob{} if err := r.Get(r.Context, client.ObjectKey{ Namespace: backupConf.Namespace, Name: "backup-" + backupConf.Name, }, cronjob); err == nil { r.Log.V(0).Info("there is already a cronjob") var changed bool if backupConf.Spec.Schedule != cronjob.Spec.Schedule { r.Log.V(0).Info("cronjob schedule has changed", "old schedule", cronjob.Spec.Schedule, "new schedule", backupConf.Spec.Schedule) cronjob.Spec.Schedule = backupConf.Spec.Schedule changed = true } if backupConf.Spec.Suspend != nil && backupConf.Spec.Suspend != cronjob.Spec.Suspend { r.Log.V(0).Info("cronjob suspend has changed", "before", cronjob.Spec.Suspend, "new", backupConf.Spec.Suspend) cronjob.Spec.Suspend = backupConf.Spec.Suspend changed = true } if changed == true { if err := r.Update(r.Context, cronjob); err != nil { r.Log.Error(err, "unable to update cronjob definition") return err } backupConf.Status.Suspended = *backupConf.Spec.Suspend } return nil } else if errors.IsNotFound(err) == false { r.Log.Error(err, "something went wrong") return err } cronjob = &batchv1.CronJob{ ObjectMeta: metav1.ObjectMeta{ Name: "backup-" + backupConf.Name, Namespace: backupConf.Namespace, }, Spec: batchv1.CronJobSpec{ Suspend: backupConf.Spec.Suspend, Schedule: backupConf.Spec.Schedule, JobTemplate: batchv1.JobTemplateSpec{ Spec: batchv1.JobSpec{ Template: corev1.PodTemplateSpec{ Spec: corev1.PodSpec{ RestartPolicy: corev1.RestartPolicyOnFailure, ServiceAccountName: "backupsession-creator", Containers: []corev1.Container{ corev1.Container{ Name: "job-createbackupsession-" + backupConf.Name, Image: backupConf.Spec.Image, Args: []string{ "backupsession", "create", "--namespace", backupConf.Namespace, "--name", backupConf.Name, }, }, }, }, }, }, }, }, } if err := ctrl.SetControllerReference(&backupConf, cronjob, r.Scheme); err != nil { r.Log.Error(err, "unable to set controller on job", "cronjob", cronjob, "backupconf", backupConf) return err } r.Log.V(0).Info("creating the cronjob") if err := r.Create(r.Context, cronjob); err != nil { r.Log.Error(err, "unable to create the cronjob", "cronjob", cronjob) return err } else { return nil } }