@@ -293,7 +293,7 @@ func (r *BackupReconciler) reconcileManualBackup(ctx context.Context,
293293 labels := ManualBackupLabels (cluster .Name )
294294 backupJob .ObjectMeta .Labels = labels
295295
296- spec , err := generateBackupJobSpec (backup , cluster , labels )
296+ spec , err := r . generateBackupJobSpec (backup , cluster , labels )
297297 if err != nil {
298298 return errors .WithStack (err )
299299 }
@@ -417,7 +417,7 @@ func (r *BackupReconciler) reconcileCronBackup(ctx context.Context, backup *v1be
417417 }
418418 objectMeta .Labels = labels
419419 // objectmeta.Annotations = annotations
420- jobSpec , err := generateBackupJobSpec (backup , cluster , labels )
420+ jobSpec , err := r . generateBackupJobSpec (backup , cluster , labels )
421421 if err != nil {
422422 return errors .WithStack (err )
423423 }
@@ -449,7 +449,7 @@ func (r *BackupReconciler) reconcileCronBackup(ctx context.Context, backup *v1be
449449
450450}
451451
452- func generateBackupJobSpec (backup * v1beta1.Backup , cluster * v1beta1.MysqlCluster , labels map [string ]string ) (* batchv1.JobSpec , error ) {
452+ func ( r * BackupReconciler ) generateBackupJobSpec (backup * v1beta1.Backup , cluster * v1beta1.MysqlCluster , labels map [string ]string ) (* batchv1.JobSpec , error ) {
453453
454454 // If backup.Spec.BackupOpts.S3 is not nil then use ENV BACKUP_TYPE=s3 and set the s3SecretName
455455 // If backup.Spec.BackupOpts.NFS is not nil then use ENV BACKUP_TYPE=nfs and mount the nfs volume
@@ -479,7 +479,9 @@ func generateBackupJobSpec(backup *v1beta1.Backup, cluster *v1beta1.MysqlCluster
479479 backupTypeEnv = corev1.EnvVar {Name : "BACKUP_TYPE" , Value : "s3" }
480480
481481 }
482-
482+ if backup .Spec .BackupOpts .S3Binlog != nil {
483+ return r .genBinlogJobTemplate (backup , cluster )
484+ }
483485 if backup .Spec .BackupOpts .NFS != nil {
484486 NFSVolume = & corev1.Volume {
485487 Name : "nfs-backup" ,
@@ -689,3 +691,92 @@ func (r *BackupReconciler) createBinlogJob(ctx context.Context, backup *v1beta1.
689691
690692 return nil
691693}
694+
695+ func (r * BackupReconciler ) genBinlogJobTemplate (backup * v1beta1.Backup , cluster * v1beta1.MysqlCluster ) (* batchv1.JobSpec , error ) {
696+ var S3BackuptEnv []corev1.EnvVar
697+ s3SecretName := backup .Spec .BackupOpts .S3Binlog .BackupSecretName
698+ log := log .FromContext (context .TODO ()).WithValues ("backup" , "BinLog" )
699+ S3BackuptEnv = append (S3BackuptEnv ,
700+ getEnvVarFromSecret (s3SecretName , "S3_ENDPOINT" , "s3-endpoint" , false ),
701+ getEnvVarFromSecret (s3SecretName , "S3_ACCESSKEY" , "s3-access-key" , true ),
702+ getEnvVarFromSecret (s3SecretName , "S3_SECRETKEY" , "s3-secret-key" , true ),
703+ getEnvVarFromSecret (s3SecretName , "S3_BUCKET" , "s3-bucket" , true ),
704+ corev1.EnvVar {Name : "BACKUP_TYPE" , Value : "s3" },
705+ corev1.EnvVar {Name : "CLUSTER_NAME" , Value : cluster .Name },
706+ )
707+ hostname := func () string {
708+ if backup .Spec .BackupOpts .BackupHost != "" {
709+ return fmt .Sprintf ("%s.%s-mysql.%s" , backup .Spec .BackupOpts .BackupHost , backup .Spec .ClusterName , backup .Namespace )
710+ } else {
711+ return backup .Spec .ClusterName + "-follower"
712+ }
713+ }()
714+ c := & v1alpha1.MysqlCluster {}
715+ c .Name = backup .Spec .ClusterName
716+ secret := & corev1.Secret {}
717+ secretKey := client.ObjectKey {Name : mysqlcluster .New (c ).GetNameForResource (utils .Secret ), Namespace : backup .Namespace }
718+
719+ if err := r .Get (context .TODO (), secretKey , secret ); err != nil {
720+ log .V (4 ).Info ("binlogjob" , "is is creating" , "err" , err )
721+ }
722+ internalRootPass := string (secret .Data ["internal-root-password" ])
723+
724+ jobSpec := & batchv1.JobSpec {
725+ Template : corev1.PodTemplateSpec {
726+ ObjectMeta : metav1.ObjectMeta {Labels : map [string ]string {
727+ "Host" : hostname ,
728+ "Type" : utils .BackupJobTypeName ,
729+
730+ // Cluster used as selector.
731+ "Cluster" : backup .Spec .ClusterName ,
732+ }},
733+ Spec : corev1.PodSpec {
734+ InitContainers : []corev1.Container {
735+ {
736+ Name : "initial" ,
737+ Image : cluster .Spec .Backup .Image ,
738+ ImagePullPolicy : cluster .Spec .ImagePullPolicy ,
739+ Command : []string {
740+ "bash" , "-c" , "cp /mnt/s3upload /opt/radondb; chown -R 1001.1001 /opt/radondb" ,
741+ },
742+ VolumeMounts : []corev1.VolumeMount {
743+ {
744+ Name : utils .MySQLcheckerVolumeName ,
745+ MountPath : "/opt/radondb" ,
746+ },
747+ },
748+ },
749+ },
750+ Containers : []corev1.Container {
751+ {
752+ Name : utils .ContainerBackupName ,
753+ Image : "percona:8.0" ,
754+ ImagePullPolicy : cluster .Spec .ImagePullPolicy ,
755+ Env : S3BackuptEnv ,
756+ Command : []string {
757+ "bash" , "-c" , fmt .Sprintf ("/opt/radondb/s3upload %s %s" , hostname , internalRootPass ),
758+ },
759+ VolumeMounts : []corev1.VolumeMount {
760+ {
761+ Name : utils .MySQLcheckerVolumeName ,
762+ MountPath : "/opt/radondb" ,
763+ },
764+ },
765+ },
766+ },
767+ RestartPolicy : corev1 .RestartPolicyNever ,
768+ ServiceAccountName : backup .Spec .ClusterName ,
769+ Volumes : []corev1.Volume {
770+ {
771+ Name : utils .MySQLcheckerVolumeName ,
772+ VolumeSource : corev1.VolumeSource {
773+ EmptyDir : & corev1.EmptyDirVolumeSource {},
774+ },
775+ },
776+ },
777+ },
778+ },
779+ }
780+
781+ return jobSpec , nil
782+ }
0 commit comments