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
+}