From 95fea5ef309eecca4e60c1b394cc1b76088a4b1e Mon Sep 17 00:00:00 2001 From: Ian Fijolek Date: Tue, 25 Apr 2023 14:02:28 -0700 Subject: [PATCH] Add ability to restore specific snapshots --- job.go | 6 +++++- main.go | 12 +++++++----- tasks.go | 8 ++++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/job.go b/job.go index b0b6fe0..94f175b 100644 --- a/job.go +++ b/job.go @@ -203,7 +203,7 @@ func (j Job) Logger() *log.Logger { return GetLogger(j.Name) } -func (j Job) RunRestore() error { +func (j Job) RunRestore(snapshot string) error { logger := j.Logger() restic := j.NewRestic() @@ -219,6 +219,10 @@ func (j Job) RunRestore() error { Env: nil, } + if backupTask, ok := exTask.(BackupFilesTask); ok { + backupTask.snapshot = snapshot + } + if err := exTask.RunRestore(taskCfg); err != nil { return fmt.Errorf("failed running job %s: %w", j.Name, err) } diff --git a/main.go b/main.go index 671e550..bcb87c8 100644 --- a/main.go +++ b/main.go @@ -160,7 +160,7 @@ func runBackupJobs(jobs []Job, names string) error { return filterJobErr } -func runRestoreJobs(jobs []Job, names string) error { +func runRestoreJobs(jobs []Job, names string, snapshot string) error { if names == "" { return nil } @@ -173,7 +173,7 @@ func runRestoreJobs(jobs []Job, names string) error { jobs, filterJobErr := FilterJobs(jobs, namesSlice) for _, job := range jobs { - if err := job.RunRestore(); err != nil { + if err := job.RunRestore(snapshot); err != nil { return err } } @@ -185,6 +185,7 @@ type Flags struct { showVersion bool backup string restore string + restoreSnapshot string once bool healthCheckAddr string metricsPushGateway string @@ -199,19 +200,20 @@ func readFlags() Flags { flag.StringVar(&flags.healthCheckAddr, "addr", "0.0.0.0:8080", "address to bind health check API") flag.StringVar(&flags.metricsPushGateway, "push-gateway", "", "url of push gateway service for batch runs (optional)") flag.StringVar(&JobBaseDir, "base-dir", JobBaseDir, "Base dir to create intermediate job files like SQL dumps.") + flag.StringVar(&flags.restoreSnapshot, "snapshot", "latest", "the snapshot to restore") flag.Parse() return flags } -func runSpecifiedJobs(jobs []Job, backupJobs, restoreJobs string) error { +func runSpecifiedJobs(jobs []Job, backupJobs, restoreJobs, snapshot string) error { // Run specified backup jobs if err := runBackupJobs(jobs, backupJobs); err != nil { return fmt.Errorf("Failed running backup jobs: %w", err) } // Run specified restore jobs - if err := runRestoreJobs(jobs, restoreJobs); err != nil { + if err := runRestoreJobs(jobs, restoreJobs, snapshot); err != nil { return fmt.Errorf("Failed running restore jobs: %w", err) } @@ -251,7 +253,7 @@ func main() { log.Fatalf("Failed to read jobs from files: %v", err) } - if err := runSpecifiedJobs(jobs, flags.backup, flags.restore); err != nil { + if err := runSpecifiedJobs(jobs, flags.backup, flags.restore, flags.restoreSnapshot); err != nil { log.Fatal(err) } diff --git a/tasks.go b/tasks.go index fcb2be3..0a49d77 100644 --- a/tasks.go +++ b/tasks.go @@ -226,6 +226,7 @@ type BackupFilesTask struct { BackupOpts *BackupOpts `hcl:"backup_opts,block"` RestoreOpts *RestoreOpts `hcl:"restore_opts,block"` name string + snapshot string } func (t BackupFilesTask) RunBackup(cfg TaskConfig) error { @@ -248,8 +249,11 @@ func (t BackupFilesTask) RunRestore(cfg TaskConfig) error { t.RestoreOpts = &RestoreOpts{} //nolint:exhaustruct } - // TODO: Make the snapshot configurable - if err := cfg.Restic.Restore("latest", *t.RestoreOpts); err != nil { + if t.snapshot == "" { + t.snapshot = "latest" + } + + if err := cfg.Restic.Restore(t.snapshot, *t.RestoreOpts); err != nil { err = fmt.Errorf("failed restoring paths: %w", err) cfg.Logger.Print(err)