@@ -17,13 +17,16 @@ limitations under the License.
17
17
package syncer
18
18
19
19
import (
20
+ "context"
20
21
"fmt"
22
+ "strings"
21
23
22
24
"github.com/presslabs/controller-util/pkg/syncer"
23
25
batchv1 "k8s.io/api/batch/v1"
24
26
corev1 "k8s.io/api/core/v1"
25
27
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26
28
"k8s.io/apimachinery/pkg/runtime"
29
+ "k8s.io/apimachinery/pkg/types"
27
30
"sigs.k8s.io/controller-runtime/pkg/client"
28
31
29
32
v1alpha1 "github.com/radondb/radondb-mysql-kubernetes/api/v1alpha1"
@@ -33,6 +36,7 @@ import (
33
36
)
34
37
35
38
type jobSyncer struct {
39
+ client client.Client
36
40
job * batchv1.Job
37
41
backup * backup.Backup
38
42
}
@@ -50,6 +54,7 @@ func NewJobSyncer(c client.Client, backup *backup.Backup) syncer.Interface {
50
54
}
51
55
52
56
sync := & jobSyncer {
57
+ client : c ,
53
58
job : obj ,
54
59
backup : backup ,
55
60
}
@@ -174,6 +179,10 @@ func (s *jobSyncer) ensurePodSpec(in corev1.PodSpec) corev1.PodSpec {
174
179
MountPath : utils .XtrabckupLocal ,
175
180
},
176
181
}
182
+ } else if s .backup .Spec .JuiceOpt != nil {
183
+ // Deal it for juiceOpt
184
+ s .buildJuicefsBackPod (& in )
185
+
177
186
} else {
178
187
// in.Containers[0].ImagePullPolicy = s.opt.ImagePullPolicy
179
188
in .Containers [0 ].Args = []string {
@@ -238,3 +247,84 @@ func (s *jobSyncer) ensurePodSpec(in corev1.PodSpec) corev1.PodSpec {
238
247
}
239
248
return in
240
249
}
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