# HG changeset patch # User Sascha L. Teichmann # Date 1547035404 -3600 # Node ID 74f7d4c531bc46a4cc1962cf3317b86a48769ac6 # Parent 647195199dc8ea2ecc785ab36fe82c55c4a77321 Scheduled imports: Refactored calling of database configured import to be reusable elsewhere. diff -r 647195199dc8 -r 74f7d4c531bc pkg/imports/scheduled.go --- 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 +}