Skip to content

Commit

Permalink
Merge pull request #201 from yohamta/feat/overwrite-mailon-config
Browse files Browse the repository at this point in the history
feat: overwrite global setting with individual DAG config
  • Loading branch information
yottahmd authored Jul 20, 2022
2 parents 033f467 + 44be488 commit ffd713c
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 10 deletions.
10 changes: 7 additions & 3 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type Config struct {
LogDir string
HandlerOn HandlerOn
Steps []*Step
MailOn MailOn
MailOn *MailOn
ErrorMail *MailConfig
InfoMail *MailConfig
Smtp *SmtpConfig
Expand Down Expand Up @@ -174,8 +174,12 @@ func (b *builder) buildFromDefinition(def *configDefinition, globalConfig *Confi
}
c.Group = def.Group
c.Description = def.Description
c.MailOn.Failure = def.MailOn.Failure
c.MailOn.Success = def.MailOn.Success
if def.MailOn != nil {
c.MailOn = &MailOn{
Failure: def.MailOn.Failure,
Success: def.MailOn.Success,
}
}
c.Delay = time.Second * time.Duration(def.DelaySec)
c.Tags = parseTags(def.Tags)

Expand Down
20 changes: 20 additions & 0 deletions internal/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -304,3 +304,23 @@ func TestSockAddr(t *testing.T) {
cfg := &Config{ConfigPath: "testdata/testDag.yml"}
require.Regexp(t, `^/tmp/@dagu-testDag-[0-9a-f]+\.sock$`, cfg.SockAddr())
}

func TestOverwriteGlobalConfig(t *testing.T) {
l := &Loader{HomeDir: utils.MustGetUserHomeDir()}

cfg, err := l.Load(path.Join(testDir, "config_overwrite.yaml"), "")
require.NoError(t, err)

require.Equal(t, &MailOn{
Failure: false,
Success: false,
}, cfg.MailOn)

cfg, err = l.Load(path.Join(testDir, "config_no_overwrite.yaml"), "")
require.NoError(t, err)

require.Equal(t, &MailOn{
Failure: true,
Success: false,
}, cfg.MailOn)
}
2 changes: 1 addition & 1 deletion internal/config/definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ type configDefinition struct {
HandlerOn handerOnDef
Steps []*stepDef
Smtp smtpConfigDef
MailOn mailOnDef
MailOn *mailOnDef
ErrorMail mailConfigDef
InfoMail mailConfigDef
DelaySec int
Expand Down
22 changes: 21 additions & 1 deletion internal/config/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"os"
"path"
"path/filepath"
"reflect"
"strings"

"github.com/imdario/mergo"
Expand Down Expand Up @@ -165,8 +166,27 @@ func (cl *Loader) loadConfig(f string, opts *BuildConfigOptions) (*Config, error
return dst, nil
}

type mergeTranformer struct {
}

var _ mergo.Transformers = (*mergeTranformer)(nil)

func (mt *mergeTranformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error {
if typ == reflect.TypeOf(MailOn{}) {
return func(dst, src reflect.Value) error {
if dst.CanSet() {
dst.Set(src)
}
return nil
}
}
return nil
}

func (cl *Loader) merge(dst, src *Config) error {
return mergo.MergeWithOverwrite(dst, src)
err := mergo.Merge(dst, src, mergo.WithOverride,
mergo.WithTransformers(&mergeTranformer{}))
return err
}

func (cl *Loader) load(file string) (config map[string]interface{}, err error) {
Expand Down
2 changes: 1 addition & 1 deletion internal/models/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func TestStatusSerialization(t *testing.T) {
RepeatPolicy: config.RepeatPolicy{}, Preconditions: []*config.Condition{},
},
},
MailOn: config.MailOn{},
MailOn: &config.MailOn{},
ErrorMail: &config.MailConfig{},
InfoMail: &config.MailConfig{},
Smtp: &config.SmtpConfig{},
Expand Down
4 changes: 2 additions & 2 deletions internal/reporter/reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func (rp *Reporter) ReportSummary(status *models.Status, err error) {
// SendMail is a function that sends a report mail.
func (rp *Reporter) SendMail(cfg *config.Config, status *models.Status, err error) error {
if err != nil || status.Status == scheduler.SchedulerStatus_Error {
if cfg.MailOn.Failure {
if cfg.MailOn != nil && cfg.MailOn.Failure {
return rp.Mailer.SendMail(
cfg.ErrorMail.From,
[]string{cfg.ErrorMail.To},
Expand All @@ -69,7 +69,7 @@ func (rp *Reporter) SendMail(cfg *config.Config, status *models.Status, err erro
)
}
} else if status.Status == scheduler.SchedulerStatus_Success {
if cfg.MailOn.Success {
if cfg.MailOn != nil && cfg.MailOn.Success {
rp.Mailer.SendMail(
cfg.InfoMail.From,
[]string{cfg.InfoMail.To},
Expand Down
2 changes: 1 addition & 1 deletion internal/reporter/reporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func TestReporter(t *testing.T) {

cfg := &config.Config{
Name: "test DAG",
MailOn: config.MailOn{
MailOn: &config.MailOn{
Failure: true,
},
ErrorMail: &config.MailConfig{
Expand Down
4 changes: 3 additions & 1 deletion tests/config/.dagu/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ infoMail:
from: "system@mail.com"
to: "info@mail.com"
prefix: "[INFO]"
histRetentionDays: 7
histRetentionDays: 7
mailOn:
failure: true
3 changes: 3 additions & 0 deletions tests/testdata/config_no_overwrite.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
steps:
- name: "1"
command: "true"
6 changes: 6 additions & 0 deletions tests/testdata/config_overwrite.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
mailOn:
failure: false

steps:
- name: "1"
command: "true"

0 comments on commit ffd713c

Please sign in to comment.