From 9c5d597ab4abe69e0aed8409d9a36963f9ca1d9c Mon Sep 17 00:00:00 2001 From: IamTheFij Date: Sun, 27 Nov 2022 20:56:23 -0800 Subject: [PATCH] Add DefaultConfig Adds DefaultConfig to the config format so that a single config can be defined for all jobs --- job.go | 40 +++++++++++++++--------- job_test.go | 89 ++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 90 insertions(+), 39 deletions(-) diff --git a/job.go b/job.go index 9ec40ac..d9b0005 100644 --- a/job.go +++ b/job.go @@ -52,7 +52,7 @@ func (r ResticConfig) Validate() error { type Job struct { Name string `hcl:"name,label"` Schedule string `hcl:"schedule"` - Config ResticConfig `hcl:"config,block"` + Config *ResticConfig `hcl:"config,block"` Tasks []JobTask `hcl:"task,block"` Backup BackupFilesTask `hcl:"backup,block"` Forget *ForgetOpts `hcl:"forget,block"` @@ -73,6 +73,18 @@ func (j Job) validateTasks() error { } } + for _, mysql := range j.MySQL { + if err := mysql.Validate(); err != nil { + return fmt.Errorf("job %s has an invalid task: %w", j.Name, err) + } + } + + for _, sqlite := range j.Sqlite { + if err := sqlite.Validate(); err != nil { + return fmt.Errorf("job %s has an invalid task: %w", j.Name, err) + } + } + return nil } @@ -85,6 +97,10 @@ func (j Job) Validate() error { return fmt.Errorf("job %s has an invalid schedule: %v: %w", j.Name, err, ErrInvalidConfigValue) } + if j.Config == nil { + return fmt.Errorf("job %s is missing restic config: %w", j.Name, ErrMissingField) + } + if err := j.Config.Validate(); err != nil { return fmt.Errorf("job %s has invalid config: %w", j.Name, err) } @@ -93,18 +109,6 @@ func (j Job) Validate() error { return err } - for _, mysql := range j.MySQL { - if err := mysql.Validate(); err != nil { - return fmt.Errorf("job %s has an invalid task: %w", j.Name, err) - } - } - - for _, sqlite := range j.Sqlite { - if err := sqlite.Validate(); err != nil { - return fmt.Errorf("job %s has an invalid task: %w", j.Name, err) - } - } - if err := j.Backup.Validate(); err != nil { return fmt.Errorf("job %s has an invalid backup config: %w", j.Name, err) } @@ -276,8 +280,8 @@ func (j Job) NewRestic() *Restic { } type Config struct { - // GlobalConfig *ResticConfig `hcl:"global_config,block"` - Jobs []Job `hcl:"job,block"` + DefaultConfig *ResticConfig `hcl:"default_config,block"` + Jobs []Job `hcl:"job,block"` } func (c Config) Validate() error { @@ -286,6 +290,12 @@ func (c Config) Validate() error { } for _, job := range c.Jobs { + // Use default restic config if no job config is provided + // TODO: Maybe merge values here + if job.Config == nil { + job.Config = c.DefaultConfig + } + if err := job.Validate(); err != nil { return err } diff --git a/job_test.go b/job_test.go index 1810234..33d4407 100644 --- a/job_test.go +++ b/job_test.go @@ -7,8 +7,8 @@ import ( main "git.iamthefij.com/iamthefij/restic-scheduler" ) -func ValidResticConfig() main.ResticConfig { - return main.ResticConfig{ +func ValidResticConfig() *main.ResticConfig { + return &main.ResticConfig{ Passphrase: "shh", Repo: "./data", Env: nil, @@ -129,7 +129,7 @@ func TestJobValidation(t *testing.T) { job: main.Job{ Name: "Test job", Schedule: "@daily", - Config: main.ResticConfig{}, //nolint:exhaustruct + Config: &main.ResticConfig{}, //nolint:exhaustruct Tasks: []main.JobTask{}, Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct Forget: nil, @@ -207,34 +207,75 @@ func TestConfigValidation(t *testing.T) { }{ { name: "Valid job", - config: main.Config{Jobs: []main.Job{{ - Name: "Valid job", - Schedule: "@daily", - Config: ValidResticConfig(), - Tasks: []main.JobTask{}, - Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct - MySQL: []main.JobTaskMySQL{}, - Sqlite: []main.JobTaskSqlite{}, - }}}, + config: main.Config{ + DefaultConfig: nil, + Jobs: []main.Job{{ + Name: "Valid job", + Schedule: "@daily", + Config: ValidResticConfig(), + Tasks: []main.JobTask{}, + Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct + MySQL: []main.JobTaskMySQL{}, + Sqlite: []main.JobTaskSqlite{}, + }}, + }, expectedErr: nil, }, { - name: "No jobs", - config: main.Config{Jobs: []main.Job{}}, + name: "Valid job with default config", + config: main.Config{ + DefaultConfig: ValidResticConfig(), + Jobs: []main.Job{{ + Name: "Valid job", + Schedule: "@daily", + Config: nil, + Tasks: []main.JobTask{}, + Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct + MySQL: []main.JobTaskMySQL{}, + Sqlite: []main.JobTaskSqlite{}, + }}, + }, + expectedErr: nil, + }, + { + name: "No jobs", + config: main.Config{ + DefaultConfig: nil, + Jobs: []main.Job{}, + }, expectedErr: main.ErrNoJobsFound, }, { name: "Invalid name", - config: main.Config{Jobs: []main.Job{{ - Name: "", - Schedule: "@daily", - Config: ValidResticConfig(), - Tasks: []main.JobTask{}, - Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct - Forget: nil, - MySQL: []main.JobTaskMySQL{}, - Sqlite: []main.JobTaskSqlite{}, - }}}, + config: main.Config{ + DefaultConfig: nil, + Jobs: []main.Job{{ + Name: "", + Schedule: "@daily", + Config: ValidResticConfig(), + Tasks: []main.JobTask{}, + Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct + Forget: nil, + MySQL: []main.JobTaskMySQL{}, + Sqlite: []main.JobTaskSqlite{}, + }}, + }, + expectedErr: main.ErrMissingField, + }, + { + name: "Missing config", + config: main.Config{ + DefaultConfig: nil, + Jobs: []main.Job{{ + Name: "", + Schedule: "@daily", + Config: nil, + Tasks: []main.JobTask{}, + Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct + Forget: nil, + MySQL: []main.JobTaskMySQL{}, + Sqlite: []main.JobTaskSqlite{}, + }}}, expectedErr: main.ErrMissingField, }, }