103 lines
3.2 KiB
Go
103 lines
3.2 KiB
Go
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
|
|
}
|
|
}
|