diff pkg/controllers/manualimports.go @ 1708:49e047c2106e

Imports: Made imports re-runnable if they fail.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 08 Jan 2019 13:35:44 +0100
parents 53304db85888
children 807569b08513
line wrap: on
line diff
--- a/pkg/controllers/manualimports.go	Tue Jan 08 12:34:29 2019 +0100
+++ b/pkg/controllers/manualimports.go	Tue Jan 08 13:35:44 2019 +0100
@@ -18,6 +18,7 @@
 	"database/sql"
 	"log"
 	"net/http"
+	"time"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/common"
@@ -25,52 +26,65 @@
 	"gemma.intevation.de/gemma/pkg/models"
 )
 
-func importBottleneck(input interface{}) (interface{}, bool, bool) {
+func retry(a common.Attributes) (time.Time, int) {
+	due, _ := a.Time("due")
+	retries, ok := a.Int("retries")
+	if !ok {
+		retries = -1
+	}
+	return due, retries
+}
+
+func importBottleneck(input interface{}) (interface{}, time.Time, int, bool, bool) {
 	bi := input.(*models.BottleneckImport)
 	bn := &imports.Bottleneck{
 		URL:      bi.URL,
 		Insecure: bi.Insecure,
 	}
-	return bn, bi.SendEmail, false
+	due, retries := retry(bi.Attributes)
+	return bn, due, retries, bi.SendEmail, false
 }
 
-func importGaugeMeasurement(input interface{}) (interface{}, bool, bool) {
+func importGaugeMeasurement(input interface{}) (interface{}, time.Time, int, bool, bool) {
 	gi := input.(*models.GaugeMeasurementImport)
 	gm := &imports.GaugeMeasurement{
 		URL:      gi.URL,
 		Insecure: gi.Insecure,
 	}
-	return gm, gi.SendEmail, true
+	due, retries := retry(gi.Attributes)
+	return gm, due, retries, gi.SendEmail, true
 }
 
-func importFairwayAvailability(input interface{}) (interface{}, bool, bool) {
+func importFairwayAvailability(input interface{}) (interface{}, time.Time, int, bool, bool) {
 	fai := input.(*models.FairwayAvailabilityImport)
 	fa := &imports.FairwayAvailability{
 		URL:      fai.URL,
 		Insecure: fai.Insecure,
 	}
-	return fa, fai.SendEmail, true
+	due, retries := retry(fai.Attributes)
+	return fa, due, retries, fai.SendEmail, true
 }
 
-func importWaterwayAxis(input interface{}) (interface{}, bool, bool) {
+func importWaterwayAxis(input interface{}) (interface{}, time.Time, int, bool, bool) {
 	wxi := input.(*models.WaterwayAxisImport)
 	wx := &imports.WaterwayAxis{
 		URL:         wxi.URL,
 		FeatureType: wxi.FeatureType,
 		SortBy:      wxi.SortBy,
 	}
-	return wx, wxi.SendEmail, true
+	due, retries := retry(wxi.Attributes)
+	return wx, due, retries, wxi.SendEmail, true
 }
 
 func manualImport(
 	kind imports.JobKind,
-	setup func(interface{}) (interface{}, bool, bool),
+	setup func(interface{}) (interface{}, time.Time, int, bool, bool),
 ) func(interface{}, *http.Request, *sql.Conn) (JSONResult, error) {
 
 	return func(input interface{}, req *http.Request, _ *sql.Conn) (
 		jr JSONResult, err error) {
 
-		what, sendEmail, autoAccept := setup(input)
+		what, due, retries, sendEmail, autoAccept := setup(input)
 
 		var serialized string
 		if serialized, err = common.ToJSONString(what); err != nil {
@@ -82,6 +96,7 @@
 		var jobID int64
 		if jobID, err = imports.AddJob(
 			kind,
+			due, retries,
 			session.User,
 			sendEmail, autoAccept,
 			serialized,