This repository has been archived by the owner on Apr 18, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 29
/
tasks.go
101 lines (87 loc) · 2.81 KB
/
tasks.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package consul
import (
"fmt"
"net/url"
"strings"
"github.com/pkg/errors"
"github.com/flanksource/commons/utils"
"github.com/flanksource/karina/pkg/platform"
"github.com/flanksource/kommons"
)
type BackupRestore struct {
*platform.Platform
Name string
Namespace string
dockerImage string
}
func NewBackupRestore(platform *platform.Platform, name, namespace string) *BackupRestore {
dockerImage := platform.Vault.Consul.BackupImage
if dockerImage == "" {
dockerImage = "docker.io/flanksource/consul-backup-restore:0.1"
}
br := &BackupRestore{
Platform: platform,
Name: name,
Namespace: namespace,
dockerImage: dockerImage,
}
return br
}
func (b *BackupRestore) Backup() error {
job := b.GenerateBackupJob().
Command("/scripts/backup.sh").
AsOneShotPod()
if err := b.Apply(b.Namespace, job); err != nil {
return err
}
return b.StreamLogs(b.Namespace, job.Name)
}
func (b *BackupRestore) ScheduleBackup(schedule string) error {
job := b.GenerateBackupJob().
Command("/scripts/backup.sh").
AsCronJob(schedule)
return b.Apply(b.Namespace, job)
}
func (b *BackupRestore) Restore(backup string) error {
var backupBucket string
if !strings.HasPrefix(backup, "s3://") {
backupBucket = b.Vault.Consul.Bucket
backup = fmt.Sprintf("s3://%s/consul/backups/%s/%s/%s", b.Vault.Consul.Bucket, b.Namespace, b.Name, backup)
} else {
uri, err := url.Parse(backup)
if err != nil {
return errors.Wrapf(err, "failed to parse s3 url %s", backup)
}
backupBucket = uri.Host
}
job := b.GenerateBackupJob().
Command("/scripts/restore.sh").
EnvVars(map[string]string{
"RESTORE_URL": backup,
"RESTORE_BUCKET": backupBucket,
}).AsOneShotPod()
if err := b.Apply(b.Namespace, job); err != nil {
return err
}
return b.StreamLogs(b.Namespace, job.Name)
}
func (b *BackupRestore) GenerateBackupJob() *kommons.DeploymentBuilder {
vault := b.Vault
consulBackupSecret := "consul-backup-config"
builder := kommons.Deployment("consul-backup-"+b.Name+"-"+utils.ShortTimestamp(), b.dockerImage)
return builder.
EnvVarFromField("POD_NAMESPACE", "metadata.namespace").
EnvVarFromSecret("AWS_ACCESS_KEY_ID", consulBackupSecret, "AWS_ACCESS_KEY_ID").
EnvVarFromSecret("AWS_SECRET_ACCESS_KEY", consulBackupSecret, "AWS_SECRET_ACCESS_KEY").
EnvVarFromSecret("AWS_ENDPOINT", consulBackupSecret, "AWS_ENDPOINT").
EnvVarFromSecret("AWS_S3_FORCE_PATH_STYLE", consulBackupSecret, "AWS_S3_FORCE_PATH_STYLE").
EnvVars(map[string]string{
"CONSUL_ADDR": fmt.Sprintf("%s-0.%s.%s.svc:8500", b.Name, b.Name, b.Namespace),
"BACKUP_BUCKET": vault.Consul.Bucket,
"BACKUP_PATH": fmt.Sprintf("consul/backups/%s/%s/", b.Namespace, b.Name),
}).
Labels(map[string]string{
"application": "consul-backup",
"name": fmt.Sprintf("consul-backup-%s-%s", b.Name, utils.RandomString(6)),
})
}