Skip to content

Commit dc0030d

Browse files
Dipta Dastamalsaha
authored andcommitted
Implement offline backup (#229)
1 parent ae40f35 commit dc0030d

File tree

4 files changed

+84
-21
lines changed

4 files changed

+84
-21
lines changed

schedule.go renamed to backup.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,20 @@ import (
77

88
"github.com/appscode/go/log"
99
"github.com/appscode/kutil/meta"
10-
api "github.com/appscode/stash/apis/stash/v1alpha1"
1110
cs "github.com/appscode/stash/client/typed/stash/v1alpha1"
12-
"github.com/appscode/stash/pkg/scheduler"
11+
"github.com/appscode/stash/pkg/backup"
1312
"github.com/appscode/stash/pkg/util"
1413
"github.com/spf13/cobra"
1514
"k8s.io/client-go/kubernetes"
1615
"k8s.io/client-go/tools/clientcmd"
1716
)
1817

19-
func NewCmdSchedule() *cobra.Command {
18+
func NewCmdBackup() *cobra.Command {
2019
var (
2120
masterURL string
2221
kubeconfigPath string
23-
opt = scheduler.Options{
22+
opt = backup.Options{
2423
Namespace: meta.Namespace(),
25-
ResticName: "",
2624
ScratchDir: "/tmp",
2725
PushgatewayURL: "http://stash-operator.kube-system.svc:56789",
2826
PodLabelsPath: "/etc/stash/labels",
@@ -32,8 +30,8 @@ func NewCmdSchedule() *cobra.Command {
3230
)
3331

3432
cmd := &cobra.Command{
35-
Use: "schedule",
36-
Short: "Run Stash cron daemon",
33+
Use: "backup",
34+
Short: "Run Stash Backup",
3735
DisableAutoGenTag: true,
3836
Run: func(cmd *cobra.Command, args []string) {
3937
config, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfigPath)
@@ -61,22 +59,22 @@ func NewCmdSchedule() *cobra.Command {
6159
if err = util.WorkloadExists(kubeClient, opt.Namespace, opt.Workload); err != nil {
6260
log.Fatalf(err.Error())
6361
}
64-
opt.ScratchDir = strings.TrimSuffix(opt.ScratchDir, "/") // setup ScratchDir in SetupAndRun
62+
opt.ScratchDir = strings.TrimSuffix(opt.ScratchDir, "/") // make ScratchDir in setup()
6563

66-
ctrl := scheduler.New(kubeClient, stashClient, opt)
67-
stopBackup := make(chan struct{})
68-
defer close(stopBackup)
64+
ctrl := backup.New(kubeClient, stashClient, opt)
6965

70-
// split code from here for leader election
71-
switch opt.Workload.Kind {
72-
case api.KindDeployment, api.KindReplicaSet, api.KindReplicationController:
73-
ctrl.ElectLeader(stopBackup)
74-
default:
75-
ctrl.SetupAndRun(stopBackup)
66+
if opt.RunViaCron {
67+
log.Infoln("Running backup periodically via cron")
68+
if err = ctrl.BackupScheduler(); err != nil {
69+
log.Fatal(err)
70+
}
71+
} else {
72+
log.Infoln("Running backup once")
73+
if err = ctrl.Backup(); err != nil {
74+
log.Fatal(err)
75+
}
7676
}
77-
78-
// Wait forever
79-
select {}
77+
log.Infoln("Exiting Stash Backup")
8078
},
8179
}
8280
cmd.Flags().StringVar(&masterURL, "master", masterURL, "The address of the Kubernetes API server (overrides any value in kubeconfig)")
@@ -87,6 +85,9 @@ func NewCmdSchedule() *cobra.Command {
8785
cmd.Flags().StringVar(&opt.ScratchDir, "scratch-dir", opt.ScratchDir, "Directory used to store temporary files. Use an `emptyDir` in Kubernetes.")
8886
cmd.Flags().StringVar(&opt.PushgatewayURL, "pushgateway-url", opt.PushgatewayURL, "URL of Prometheus pushgateway used to cache backup metrics")
8987
cmd.Flags().DurationVar(&opt.ResyncPeriod, "resync-period", opt.ResyncPeriod, "If non-zero, will re-list this often. Otherwise, re-list will be delayed aslong as possible (until the upstream source closes the watch or times out.")
88+
cmd.Flags().BoolVar(&opt.RunViaCron, "run-via-cron", opt.RunViaCron, "Run backup periodically via cron.")
89+
cmd.Flags().StringVar(&opt.ImageTag, "image-tag", opt.ImageTag, "Check job image tag.")
90+
cmd.Flags().BoolVar(&opt.EnableRBAC, "enable-rbac", opt.EnableRBAC, "Enable RBAC")
9091

9192
return cmd
9293
}

check.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package cmds
2+
3+
import (
4+
"github.com/appscode/go/log"
5+
"github.com/appscode/kutil/meta"
6+
"github.com/appscode/stash/client/typed/stash/v1alpha1"
7+
"github.com/appscode/stash/pkg/check"
8+
"github.com/spf13/cobra"
9+
"k8s.io/client-go/kubernetes"
10+
"k8s.io/client-go/tools/clientcmd"
11+
)
12+
13+
func NewCmdCheck() *cobra.Command {
14+
var (
15+
masterURL string
16+
kubeconfigPath string
17+
opt = check.Options{
18+
Namespace: meta.Namespace(),
19+
}
20+
)
21+
22+
cmd := &cobra.Command{
23+
Use: "check",
24+
Short: "Check restic backup",
25+
DisableAutoGenTag: true,
26+
Run: func(cmd *cobra.Command, args []string) {
27+
config, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfigPath)
28+
if err != nil {
29+
log.Fatalln(err)
30+
}
31+
c := check.New(
32+
kubernetes.NewForConfigOrDie(config),
33+
v1alpha1.NewForConfigOrDie(config),
34+
opt,
35+
)
36+
if err = c.Run(); err != nil {
37+
log.Fatal(err)
38+
}
39+
log.Infoln("Exiting stash check")
40+
},
41+
}
42+
cmd.Flags().StringVar(&masterURL, "master", masterURL, "The address of the Kubernetes API server (overrides any value in kubeconfig)")
43+
cmd.Flags().StringVar(&kubeconfigPath, "kubeconfig", kubeconfigPath, "Path to kubeconfig file with authorization information (the master location is set by the master flag).")
44+
cmd.Flags().StringVar(&opt.ResticName, "restic-name", opt.ResticName, "Name of the Restic CRD.")
45+
cmd.Flags().StringVar(&opt.HostName, "host-name", opt.HostName, "Host name for workload.")
46+
cmd.Flags().StringVar(&opt.SmartPrefix, "smart-prefix", opt.SmartPrefix, "Smart prefix for workload")
47+
48+
return cmd
49+
}

root.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ func NewCmdStash(version string) *cobra.Command {
4646

4747
rootCmd.AddCommand(v.NewCmdVersion())
4848
rootCmd.AddCommand(NewCmdRun(version))
49-
rootCmd.AddCommand(NewCmdSchedule())
49+
rootCmd.AddCommand(NewCmdBackup())
5050
rootCmd.AddCommand(NewCmdRecover())
51+
rootCmd.AddCommand(NewCmdCheck())
5152
return rootCmd
5253
}

run.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,18 @@ func NewCmdRun(version string) *cobra.Command {
5656
stashClient = cs.NewForConfigOrDie(config)
5757
crdClient := crd_cs.NewForConfigOrDie(config)
5858

59+
// get kube api server version
60+
version, err := kubeClient.Discovery().ServerVersion()
61+
if err != nil {
62+
log.Fatalf("Error getting server version, reason: %s\n", err)
63+
}
64+
65+
// check kubectl image
66+
opts.KubectlImageTag = version.Major + "." + version.Minor + ".0"
67+
if err := docker.CheckDockerImageVersion(docker.ImageKubectl, opts.KubectlImageTag); err != nil {
68+
log.Fatalf(`Image %v:%v not found.`, docker.ImageKubectl, opts.KubectlImageTag)
69+
}
70+
5971
ctrl := controller.New(kubeClient, crdClient, stashClient, opts)
6072
err = ctrl.Setup()
6173
if err != nil {

0 commit comments

Comments
 (0)