@@ -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