From 40175633a537b6b3d042a58c694d37cd70d33f26 Mon Sep 17 00:00:00 2001 From: Sergey Dudoladov Date: Tue, 2 Apr 2019 15:26:27 +0200 Subject: [PATCH] properly generate podTemplate for the cron job's pod --- pkg/cluster/cluster.go | 2 +- pkg/cluster/k8sres.go | 62 +++++++++++++++++++++++++++---------- pkg/cluster/resources.go | 9 ++++-- pkg/util/config/config.go | 8 ++--- pkg/util/k8sutil/k8sutil.go | 1 + 5 files changed, 59 insertions(+), 23 deletions(-) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 797a91619..7339e0bbc 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -303,7 +303,7 @@ func (c *Cluster) Create() error { if err := c.createBackupCronJob(); err != nil { return fmt.Errorf("could not create a k8s cron job for logical backups: %v", err) } - c.logger.Infof("a k8s cron job for logical backup has been successfully created") + c.logger.Info("a k8s cron job for logical backup has been successfully created") } if err := c.listResources(); err != nil { diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index be198187a..a4b5cf2ca 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -22,7 +22,6 @@ import ( "github.com/zalando/postgres-operator/pkg/util/constants" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" - corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" ) @@ -1255,36 +1254,67 @@ func (c *Cluster) getClusterServiceConnectionParameters(clusterName string) (hos return } -func (c *Cluster) generateCronJob() *batchv1beta1.CronJob { +func (c *Cluster) generateCronJob() (*batchv1beta1.CronJob, error) { - jobSpec := batchv1.JobSpec{Template: v1.PodTemplateSpec{ - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - corev1.Container{ - Name: "Hello world", - Image: "hello-world", - Command: []string{"date", "echo Hello from the Kubernetes cluster"}, - }, - }, - }, - }, + var ( + err error + podTemplate *v1.PodTemplateSpec + ) + + c.logger.Debug("Generating logical backup pod template") + + defaultResources := c.makeDefaultResources() + resourceRequirements, err := generateResourceRequirements(c.Spec.Resources, defaultResources) + volumeMounts := generateVolumeMounts() + + logicalBackupContainer := generateSpiloContainer( + "logical-backup", + &c.OpConfig.LogicalBackup.LogicalBackupDockerImage, + resourceRequirements, + []v1.EnvVar{}, + volumeMounts, + ) + + if podTemplate, err = generatePodTemplate( + c.Namespace, + c.labelsSet(true), + logicalBackupContainer, + []v1.Container{}, + []v1.Container{}, + &[]v1.Toleration{}, + nodeAffinity(c.OpConfig.NodeReadinessLabel), + int64(c.OpConfig.PodTerminateGracePeriod.Seconds()), + c.OpConfig.PodServiceAccountName, + c.OpConfig.KubeIAMRole, + "", + false, + false, + c.OpConfig.PodAntiAffinityTopologyKey); err != nil { + return nil, fmt.Errorf("could not generate pod template for logical backup cron job: %v", err) } + jobSpec := batchv1.JobSpec{Template: *podTemplate} + jobTemplateSpec := batchv1beta1.JobTemplateSpec{ Spec: jobSpec, } + schedule := c.Postgresql.Spec.LogicalBackupSchedule + if schedule == "" { + schedule = c.OpConfig.LogicalBackupSchedule + } + cronJob := &batchv1beta1.CronJob{ ObjectMeta: metav1.ObjectMeta{ - Name: "Dummy cron job", + Name: "logical-backup-" + c.clusterName().String(), Namespace: c.Namespace, Labels: c.labelsSet(true), }, Spec: batchv1beta1.CronJobSpec{ - Schedule: c.Postgresql.Spec.LogicalBackupSchedule, + Schedule: schedule, JobTemplate: jobTemplateSpec, }, } - return cronJob + return cronJob, nil } diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index fc445cee6..20037329f 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -611,9 +611,14 @@ func (c *Cluster) createRoles() (err error) { func (c *Cluster) createBackupCronJob() (err error) { - c.setProcessName("creating a k8s cron job for backups") + c.setProcessName("creating a k8s cron job for logical backups") + + cronJobSpec, err := c.generateCronJob() + if err != nil { + return fmt.Errorf("could not generate k8s cron job spec: %v", err) + } + c.logger.Debugf("Generated cronJobSpec: %v", cronJobSpec) - cronJobSpec := c.generateCronJob() cronJob, err := c.KubeClient.CronJobsGetter.CronJobs(c.Namespace).Create(cronJobSpec) if err != nil { return fmt.Errorf("could not create k8s cron job: %v", err) diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index 85bd7d120..8f4e717f9 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -67,10 +67,10 @@ type Scalyr struct { // LogicalBackup type LogicalBackup struct { - EnableLogicalBackup bool `json:"enable_logical_backup,omitempty"` - LogicalBackupSchedule string `json:"logical_backup_schedule,omitempty"` - LogicalBackupDockerImage string `json:"logical_backup_docker_image,omitempty"` - LogicalBackupS3Bucket string `json:"logical_backup_s3_bucket,omitempty"` + EnableLogicalBackup bool `name:"enable_logical_backup" default:"false"` + LogicalBackupSchedule string `name:"logical_backup_schedule" default:"30 00 * * *"` + LogicalBackupDockerImage string `name:"logical_backup_image" default:""` + LogicalBackupS3Bucket string `name:"logical_backup_s3_bucket"` } // Config describes operator config diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 772396ac0..6ba70fffc 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -87,6 +87,7 @@ func NewFromConfig(cfg *rest.Config) (KubernetesClient, error) { kubeClient.PodDisruptionBudgetsGetter = client.PolicyV1beta1() kubeClient.RESTClient = client.CoreV1().RESTClient() kubeClient.RoleBindingsGetter = client.RbacV1beta1() + kubeClient.CronJobsGetter = client.BatchV1beta1() apiextClient, err := apiextclient.NewForConfig(cfg) if err != nil {