Mercurial > gemma
changeset 1729:74f7d4c531bc
Scheduled imports: Refactored calling of database configured import to be reusable elsewhere.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 09 Jan 2019 13:03:24 +0100 |
parents | 647195199dc8 |
children | 7c54babe10f7 |
files | pkg/imports/scheduled.go |
diffstat | 1 files changed, 73 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/imports/scheduled.go Wed Jan 09 12:39:20 2019 +0100 +++ b/pkg/imports/scheduled.go Wed Jan 09 13:03:24 2019 +0100 @@ -15,40 +15,45 @@ import ( "errors" + "fmt" "log" "gemma.intevation.de/gemma/pkg/common" "gemma.intevation.de/gemma/pkg/scheduler" ) -func init() { - registerAction(GMJobKind, func(cfg *IDConfig) (interface{}, error) { +// JobKindSetups maps JobKinds to special setup functions. +var JobKindSetups = map[JobKind]func(*IDConfig) (interface{}, error){ + + GMJobKind: func(cfg *IDConfig) (interface{}, error) { log.Println("info: schedule 'gm' import") insecure := cfg.Attributes.Bool("insecure") return &GaugeMeasurement{ URL: *cfg.URL, Insecure: insecure, }, nil - }) - registerAction(FAJobKind, func(cfg *IDConfig) (interface{}, error) { + }, + + FAJobKind: func(cfg *IDConfig) (interface{}, error) { log.Println("info: schedule 'fa' import") insecure := cfg.Attributes.Bool("insecure") return &FairwayAvailability{ URL: *cfg.URL, Insecure: insecure, }, nil - }) - registerAction(BNJobKind, func(cfg *IDConfig) (interface{}, error) { + }, + + BNJobKind: func(cfg *IDConfig) (interface{}, error) { log.Println("info: schedule 'bn' import") insecure := cfg.Attributes.Bool("insecure") return &Bottleneck{ URL: *cfg.URL, Insecure: insecure, }, nil - }) - registerAction(WXJobKind, func(cfg *IDConfig) (interface{}, error) { + }, + + WXJobKind: func(cfg *IDConfig) (interface{}, error) { log.Println("info: schedule 'wx' import") - ft, found := cfg.Attributes.Get("feature-type") if !found { return nil, errors.New("cannot find 'feature-type' attribute") @@ -62,59 +67,71 @@ FeatureType: ft, SortBy: sb, }, nil - }) + }, } -func registerAction(kind JobKind, setup func(cfg *IDConfig) (interface{}, error)) { - - action := func(id int64) { - cfg, err := loadIDConfig(id) +func init() { + run := func(cfgID int64) { + jobID, err := RunConfiguredImport(cfgID) if err != nil { - log.Printf("error: %v\n", err) - return - } - if cfg == nil { - log.Printf("error: No config found for id %d.\n", id) - return - } - if cfg.URL == nil { - log.Println("error: No URL specified") - return - } - - what, err := setup(cfg) - if err != nil { - log.Printf("error: setup failed %v.\n", err) + log.Printf("error: running scheduled import failed: %v\n", err) return } - - var serialized string - if serialized, err = common.ToJSONString(what); err != nil { - log.Printf("error: %v\n", err) - return - } - - due, _ := cfg.Attributes.Time("due") - - retries, found := cfg.Attributes.Int("retries") - if !found { - retries = -1 - } - - var jobID int64 - if jobID, err = AddJob( - kind, - due, retries, - cfg.User, - cfg.SendEMail, cfg.AutoAccept, - serialized, - ); err != nil { - log.Printf("error: %v\n", err) - return - } - log.Printf("info: added import #%d to queue\n", jobID) } - scheduler.RegisterAction(string(kind), action) + for kind := range JobKindSetups { + scheduler.RegisterAction(string(kind), run) + } } + +// RunConfiguredImport runs an import configured from the database. +func RunConfiguredImport(id int64) (int64, error) { + cfg, err := loadIDConfig(id) + if err != nil { + return 0, err + } + if cfg == nil { + return 0, fmt.Errorf("no config found for id %d.\n", id) + } + if cfg.URL == nil { + return 0, errors.New("error: No URL specified") + } + + kind := JobKind(cfg.Kind) + + var setup func(*IDConfig) (interface{}, error) + if setup = JobKindSetups[kind]; setup == nil { + return 0, fmt.Errorf("unknown job kind: %s", cfg.Kind) + } + + what, err := setup(cfg) + if err != nil { + return 0, err + } + + var serialized string + if serialized, err = common.ToJSONString(what); err != nil { + return 0, err + } + + due, _ := cfg.Attributes.Time("due") + + retries, found := cfg.Attributes.Int("retries") + if !found { + retries = -1 + } + + var jobID int64 + if jobID, err = AddJob( + kind, + due, retries, + cfg.User, + cfg.SendEMail, cfg.AutoAccept, + serialized, + ); err != nil { + return 0, err + } + + return jobID, nil +}