@@ -17,13 +17,16 @@ limitations under the License.
1717package  syncer
1818
1919import  (
20+ 	"context" 
2021	"fmt" 
22+ 	"strings" 
2123
2224	"github.com/presslabs/controller-util/pkg/syncer" 
2325	batchv1 "k8s.io/api/batch/v1" 
2426	corev1 "k8s.io/api/core/v1" 
2527	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 
2628	"k8s.io/apimachinery/pkg/runtime" 
29+ 	"k8s.io/apimachinery/pkg/types" 
2730	"sigs.k8s.io/controller-runtime/pkg/client" 
2831
2932	v1alpha1 "github.com/radondb/radondb-mysql-kubernetes/api/v1alpha1" 
@@ -33,6 +36,7 @@ import (
3336)
3437
3538type  jobSyncer  struct  {
39+ 	client  client.Client 
3640	job     * batchv1.Job 
3741	backup  * backup.Backup 
3842}
@@ -50,6 +54,7 @@ func NewJobSyncer(c client.Client, backup *backup.Backup) syncer.Interface {
5054	}
5155
5256	sync  :=  & jobSyncer {
57+ 		client : c ,
5358		job :    obj ,
5459		backup : backup ,
5560	}
@@ -174,6 +179,10 @@ func (s *jobSyncer) ensurePodSpec(in corev1.PodSpec) corev1.PodSpec {
174179				MountPath : utils .XtrabckupLocal ,
175180			},
176181		}
182+ 	} else  if  s .backup .Spec .JuiceOpt  !=  nil  {
183+ 		// Deal it for juiceOpt 
184+ 		s .buildJuicefsBackPod (& in )
185+ 
177186	} else  {
178187		// in.Containers[0].ImagePullPolicy = s.opt.ImagePullPolicy 
179188		in .Containers [0 ].Args  =  []string {
@@ -238,3 +247,84 @@ func (s *jobSyncer) ensurePodSpec(in corev1.PodSpec) corev1.PodSpec {
238247	}
239248	return  in 
240249}
250+ 
251+ func  (s  * jobSyncer ) buildJuicefsBackPod (in  * corev1.PodSpec ) error  {
252+ 	// add volumn about pvc 
253+ 	var  defMode  int32  =  0600 
254+ 	var  err  error 
255+ 	var  cmdstr  string 
256+ 	in .Volumes  =  []corev1.Volume {
257+ 		{
258+ 			Name : utils .SShVolumnName ,
259+ 			VolumeSource : corev1.VolumeSource {
260+ 				Secret : & corev1.SecretVolumeSource {
261+ 					SecretName :  fmt .Sprintf ("%s-ssh-key" , s .backup .Spec .ClusterName ),
262+ 					DefaultMode : & defMode ,
263+ 				},
264+ 			},
265+ 		},
266+ 	}
267+ 
268+ 	in .Containers [0 ].VolumeMounts  =  []corev1.VolumeMount {
269+ 		{
270+ 			Name :      utils .SShVolumnName ,
271+ 			MountPath : utils .SshVolumnPath ,
272+ 		},
273+ 	}
274+ 
275+ 	// PodName.clusterName-mysql.Namespace 
276+ 	// sample-mysql-0.sample-mysql.default 
277+ 	hostname  :=  fmt .Sprintf ("%s.%s-mysql.%s" , s .backup .Spec .HostName , s .backup .Spec .ClusterName , s .backup .Namespace )
278+ 	if  cmdstr , err  =  s .buildJuicefsCmd (s .backup .Spec .JuiceOpt .BackupSecretName ); err  !=  nil  {
279+ 		return  err 
280+ 	}
281+ 
282+ 	in .Containers [0 ].Command  =  []string {"bash" , "-c" , "--" , `cp  /etc/secret-ssh/* /root/.ssh 
283+ chmod 600 /root/.ssh/authorized_keys ;`  + 
284+ 		strings .Join ([]string {
285+ 			"ssh" , "-o" , "UserKnownHostsFile=/dev/null" , "-o" , "StrictHostKeyChecking=no" , hostname , cmdstr ,
286+ 		}, " " )}
287+ 
288+ 	return  nil 
289+ }
290+ 
291+ func  (s  * jobSyncer ) buildJuicefsCmd (secName  string ) (string , error ) {
292+ 	juiceopt  :=  s .backup .Spec .JuiceOpt 
293+ 	secret  :=  & corev1.Secret {
294+ 		TypeMeta : metav1.TypeMeta {
295+ 			APIVersion : "v1" ,
296+ 			Kind :       "Secret" ,
297+ 		},
298+ 		ObjectMeta : metav1.ObjectMeta {
299+ 			Name :      secName ,
300+ 			Namespace : s .backup .Namespace ,
301+ 		},
302+ 	}
303+ 	err  :=  s .client .Get (context .TODO (),
304+ 		types.NamespacedName {Namespace : s .backup .Namespace ,
305+ 			Name : secName }, secret )
306+ 
307+ 	if  err  !=  nil  {
308+ 		return  "" , err 
309+ 	}
310+ 	url , bucket  :=  secret .Data ["s3-endpoint" ], secret .Data ["s3-bucket" ]
311+ 	accesskey , secretkey  :=  secret .Data ["s3-access-key" ], secret .Data ["s3-secret-key" ]
312+ 	juicebucket  :=  utils .InstallBucket (string (url ), string (bucket ))
313+ 	cmdstr  :=  fmt .Sprintf (`<<EOF 
314+ 	export CLUSTER_NAME=%s 
315+ 	juicefs format --storage s3 \ 
316+     --bucket  %s \ 
317+     --access-key %s \ 
318+     --secret-key %s \ 
319+     %s \ 
320+     %s` , s .backup .Spec .ClusterName , juicebucket , accesskey , secretkey , juiceopt .JuiceMeta , juiceopt .JuiceName )
321+ 	cmdstr  +=  fmt .Sprintf (` 
322+ 	juicefs mount -d %s /%s/ 
323+ 	` , juiceopt .JuiceMeta , juiceopt .JuiceName )
324+ 	cmdstr  +=  fmt .Sprintf (` 
325+ 	source /backup.sh 
326+     backup 
327+ 	juicefs umount /%s/ 
328+ EOF` , juiceopt .JuiceName )
329+ 	return  cmdstr , nil 
330+ }
0 commit comments