Add DefaultConfig
Some checks failed
continuous-integration/drone/push Build is failing

Adds DefaultConfig to the config format so that a single config can be
defined for all jobs
This commit is contained in:
IamTheFij 2022-11-27 20:56:23 -08:00 committed by Ian Fijolek
parent 57e933c20d
commit 9c5d597ab4
2 changed files with 90 additions and 39 deletions

38
job.go
View File

@ -52,7 +52,7 @@ func (r ResticConfig) Validate() error {
type Job struct { type Job struct {
Name string `hcl:"name,label"` Name string `hcl:"name,label"`
Schedule string `hcl:"schedule"` Schedule string `hcl:"schedule"`
Config ResticConfig `hcl:"config,block"` Config *ResticConfig `hcl:"config,block"`
Tasks []JobTask `hcl:"task,block"` Tasks []JobTask `hcl:"task,block"`
Backup BackupFilesTask `hcl:"backup,block"` Backup BackupFilesTask `hcl:"backup,block"`
Forget *ForgetOpts `hcl:"forget,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 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) 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 { if err := j.Config.Validate(); err != nil {
return fmt.Errorf("job %s has invalid config: %w", j.Name, err) return fmt.Errorf("job %s has invalid config: %w", j.Name, err)
} }
@ -93,18 +109,6 @@ func (j Job) Validate() error {
return err 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 { if err := j.Backup.Validate(); err != nil {
return fmt.Errorf("job %s has an invalid backup config: %w", j.Name, err) return fmt.Errorf("job %s has an invalid backup config: %w", j.Name, err)
} }
@ -276,7 +280,7 @@ func (j Job) NewRestic() *Restic {
} }
type Config struct { type Config struct {
// GlobalConfig *ResticConfig `hcl:"global_config,block"` DefaultConfig *ResticConfig `hcl:"default_config,block"`
Jobs []Job `hcl:"job,block"` Jobs []Job `hcl:"job,block"`
} }
@ -286,6 +290,12 @@ func (c Config) Validate() error {
} }
for _, job := range c.Jobs { 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 { if err := job.Validate(); err != nil {
return err return err
} }

View File

@ -7,8 +7,8 @@ import (
main "git.iamthefij.com/iamthefij/restic-scheduler" main "git.iamthefij.com/iamthefij/restic-scheduler"
) )
func ValidResticConfig() main.ResticConfig { func ValidResticConfig() *main.ResticConfig {
return main.ResticConfig{ return &main.ResticConfig{
Passphrase: "shh", Passphrase: "shh",
Repo: "./data", Repo: "./data",
Env: nil, Env: nil,
@ -129,7 +129,7 @@ func TestJobValidation(t *testing.T) {
job: main.Job{ job: main.Job{
Name: "Test job", Name: "Test job",
Schedule: "@daily", Schedule: "@daily",
Config: main.ResticConfig{}, //nolint:exhaustruct Config: &main.ResticConfig{}, //nolint:exhaustruct
Tasks: []main.JobTask{}, Tasks: []main.JobTask{},
Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct
Forget: nil, Forget: nil,
@ -207,7 +207,9 @@ func TestConfigValidation(t *testing.T) {
}{ }{
{ {
name: "Valid job", name: "Valid job",
config: main.Config{Jobs: []main.Job{{ config: main.Config{
DefaultConfig: nil,
Jobs: []main.Job{{
Name: "Valid job", Name: "Valid job",
Schedule: "@daily", Schedule: "@daily",
Config: ValidResticConfig(), Config: ValidResticConfig(),
@ -215,17 +217,39 @@ func TestConfigValidation(t *testing.T) {
Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct Backup: main.BackupFilesTask{Paths: []string{"/test"}}, //nolint:exhaustruct
MySQL: []main.JobTaskMySQL{}, MySQL: []main.JobTaskMySQL{},
Sqlite: []main.JobTaskSqlite{}, Sqlite: []main.JobTaskSqlite{},
}}}, }},
},
expectedErr: nil,
},
{
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, expectedErr: nil,
}, },
{ {
name: "No jobs", name: "No jobs",
config: main.Config{Jobs: []main.Job{}}, config: main.Config{
DefaultConfig: nil,
Jobs: []main.Job{},
},
expectedErr: main.ErrNoJobsFound, expectedErr: main.ErrNoJobsFound,
}, },
{ {
name: "Invalid name", name: "Invalid name",
config: main.Config{Jobs: []main.Job{{ config: main.Config{
DefaultConfig: nil,
Jobs: []main.Job{{
Name: "", Name: "",
Schedule: "@daily", Schedule: "@daily",
Config: ValidResticConfig(), Config: ValidResticConfig(),
@ -234,6 +258,23 @@ func TestConfigValidation(t *testing.T) {
Forget: nil, Forget: nil,
MySQL: []main.JobTaskMySQL{}, MySQL: []main.JobTaskMySQL{},
Sqlite: []main.JobTaskSqlite{}, 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, expectedErr: main.ErrMissingField,
}, },