Mercurial > gemma
comparison pkg/controllers/manualimports.go @ 1985:8eeb0b5eb340
Imports: Made retries and the waiting between the attempts configurable.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 23 Jan 2019 17:58:57 +0100 |
parents | 71b722809b2b |
children | 9c65153bb56e |
comparison
equal
deleted
inserted
replaced
1983:f9f1babe52ae | 1985:8eeb0b5eb340 |
---|---|
24 "gemma.intevation.de/gemma/pkg/common" | 24 "gemma.intevation.de/gemma/pkg/common" |
25 "gemma.intevation.de/gemma/pkg/imports" | 25 "gemma.intevation.de/gemma/pkg/imports" |
26 "gemma.intevation.de/gemma/pkg/models" | 26 "gemma.intevation.de/gemma/pkg/models" |
27 ) | 27 ) |
28 | 28 |
29 func retry(a common.Attributes) (time.Time, int) { | 29 func retry(a common.Attributes) (time.Time, *int, *time.Duration) { |
30 due, _ := a.Time("due") | 30 due, _ := a.Time("due") |
31 retries, ok := a.Int("retries") | 31 ret, ok := a.Int("retries") |
32 if !ok { | 32 var retries *int |
33 retries = -1 | 33 if ok { |
34 } | 34 retries = &ret |
35 return due, retries | 35 } |
36 } | 36 dur, ok := a.Duration("wait-retry") |
37 | 37 var duration *time.Duration |
38 func importBottleneck(input interface{}) (interface{}, time.Time, int, bool) { | 38 if ok { |
39 duration = &dur | |
40 } | |
41 return due, retries, duration | |
42 } | |
43 | |
44 func importBottleneck(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { | |
39 bi := input.(*models.BottleneckImport) | 45 bi := input.(*models.BottleneckImport) |
40 bn := &imports.Bottleneck{ | 46 bn := &imports.Bottleneck{ |
41 URL: bi.URL, | 47 URL: bi.URL, |
42 Insecure: bi.Insecure, | 48 Insecure: bi.Insecure, |
43 } | 49 } |
44 due, retries := retry(bi.Attributes) | 50 due, retries, duration := retry(bi.Attributes) |
45 return bn, due, retries, bi.SendEmail | 51 return bn, due, retries, duration, bi.SendEmail |
46 } | 52 } |
47 | 53 |
48 func importGaugeMeasurement(input interface{}) (interface{}, time.Time, int, bool) { | 54 func importGaugeMeasurement(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
49 gi := input.(*models.GaugeMeasurementImport) | 55 gi := input.(*models.GaugeMeasurementImport) |
50 gm := &imports.GaugeMeasurement{ | 56 gm := &imports.GaugeMeasurement{ |
51 URL: gi.URL, | 57 URL: gi.URL, |
52 Insecure: gi.Insecure, | 58 Insecure: gi.Insecure, |
53 } | 59 } |
54 due, retries := retry(gi.Attributes) | 60 due, retries, duration := retry(gi.Attributes) |
55 return gm, due, retries, gi.SendEmail | 61 return gm, due, retries, duration, gi.SendEmail |
56 } | 62 } |
57 | 63 |
58 func importFairwayAvailability(input interface{}) (interface{}, time.Time, int, bool) { | 64 func importFairwayAvailability(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
59 fai := input.(*models.FairwayAvailabilityImport) | 65 fai := input.(*models.FairwayAvailabilityImport) |
60 fa := &imports.FairwayAvailability{ | 66 fa := &imports.FairwayAvailability{ |
61 URL: fai.URL, | 67 URL: fai.URL, |
62 Insecure: fai.Insecure, | 68 Insecure: fai.Insecure, |
63 } | 69 } |
64 due, retries := retry(fai.Attributes) | 70 due, retries, duration := retry(fai.Attributes) |
65 return fa, due, retries, fai.SendEmail | 71 return fa, due, retries, duration, fai.SendEmail |
66 } | 72 } |
67 | 73 |
68 func importWaterwayAxis(input interface{}) (interface{}, time.Time, int, bool) { | 74 func importWaterwayAxis(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
69 wxi := input.(*models.WaterwayAxisImport) | 75 wxi := input.(*models.WaterwayAxisImport) |
70 wx := &imports.WaterwayAxis{ | 76 wx := &imports.WaterwayAxis{ |
71 URL: wxi.URL, | 77 URL: wxi.URL, |
72 FeatureType: wxi.FeatureType, | 78 FeatureType: wxi.FeatureType, |
73 SortBy: wxi.SortBy, | 79 SortBy: wxi.SortBy, |
74 } | 80 } |
75 due, retries := retry(wxi.Attributes) | 81 due, retries, duration := retry(wxi.Attributes) |
76 return wx, due, retries, wxi.SendEmail | 82 return wx, due, retries, duration, wxi.SendEmail |
77 } | 83 } |
78 | 84 |
79 func importWaterwayArea(input interface{}) (interface{}, time.Time, int, bool) { | 85 func importWaterwayArea(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
80 wai := input.(*models.WaterwayAreaImport) | 86 wai := input.(*models.WaterwayAreaImport) |
81 wa := &imports.WaterwayArea{ | 87 wa := &imports.WaterwayArea{ |
82 URL: wai.URL, | 88 URL: wai.URL, |
83 FeatureType: wai.FeatureType, | 89 FeatureType: wai.FeatureType, |
84 SortBy: wai.SortBy, | 90 SortBy: wai.SortBy, |
85 } | 91 } |
86 due, retries := retry(wai.Attributes) | 92 due, retries, duration := retry(wai.Attributes) |
87 return wa, due, retries, wai.SendEmail | 93 return wa, due, retries, duration, wai.SendEmail |
88 } | 94 } |
89 | 95 |
90 func importWaterwayGauge(input interface{}) (interface{}, time.Time, int, bool) { | 96 func importWaterwayGauge(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
91 wgi := input.(*models.WaterwayGaugeImport) | 97 wgi := input.(*models.WaterwayGaugeImport) |
92 username, _ := wgi.Attributes.Get("username") | 98 username, _ := wgi.Attributes.Get("username") |
93 password, _ := wgi.Attributes.Get("password") | 99 password, _ := wgi.Attributes.Get("password") |
94 insecure := wgi.Attributes.Bool("insecure") | 100 insecure := wgi.Attributes.Bool("insecure") |
95 wg := &imports.WaterwayGauge{ | 101 wg := &imports.WaterwayGauge{ |
96 URL: wgi.URL, | 102 URL: wgi.URL, |
97 Username: username, | 103 Username: username, |
98 Password: password, | 104 Password: password, |
99 Insecure: insecure, | 105 Insecure: insecure, |
100 } | 106 } |
101 due, retries := retry(wgi.Attributes) | 107 due, retries, duration := retry(wgi.Attributes) |
102 return wg, due, retries, wgi.SendEmail | 108 return wg, due, retries, duration, wgi.SendEmail |
103 } | 109 } |
104 | 110 |
105 func importDistancemarksVirtual(input interface{}) (interface{}, time.Time, int, bool) { | 111 func importDistancemarksVirtual(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
106 dmvi := input.(*models.DistanceMarksVirtualImport) | 112 dmvi := input.(*models.DistanceMarksVirtualImport) |
107 username, _ := dmvi.Attributes.Get("username") | 113 username, _ := dmvi.Attributes.Get("username") |
108 password, _ := dmvi.Attributes.Get("password") | 114 password, _ := dmvi.Attributes.Get("password") |
109 insecure := dmvi.Attributes.Bool("insecure") | 115 insecure := dmvi.Attributes.Bool("insecure") |
110 wg := &imports.DistanceMarksVirtual{ | 116 wg := &imports.DistanceMarksVirtual{ |
111 URL: dmvi.URL, | 117 URL: dmvi.URL, |
112 Username: username, | 118 Username: username, |
113 Password: password, | 119 Password: password, |
114 Insecure: insecure, | 120 Insecure: insecure, |
115 } | 121 } |
116 due, retries := retry(dmvi.Attributes) | 122 due, retries, duration := retry(dmvi.Attributes) |
117 return wg, due, retries, dmvi.SendEmail | 123 return wg, due, retries, duration, dmvi.SendEmail |
118 } | 124 } |
119 | 125 |
120 func importFairwayDimension(input interface{}) (interface{}, time.Time, int, bool) { | 126 func importFairwayDimension(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
121 fdi := input.(*models.FairwayDimensionImport) | 127 fdi := input.(*models.FairwayDimensionImport) |
122 fd := &imports.FairwayDimension{ | 128 fd := &imports.FairwayDimension{ |
123 URL: fdi.URL, | 129 URL: fdi.URL, |
124 FeatureType: fdi.FeatureType, | 130 FeatureType: fdi.FeatureType, |
125 SortBy: fdi.SortBy, | 131 SortBy: fdi.SortBy, |
127 MinWidth: fdi.MinWidth, | 133 MinWidth: fdi.MinWidth, |
128 MaxWidth: fdi.MaxWidth, | 134 MaxWidth: fdi.MaxWidth, |
129 Depth: fdi.Depth, | 135 Depth: fdi.Depth, |
130 SourceOrganization: fdi.SourceOrganization, | 136 SourceOrganization: fdi.SourceOrganization, |
131 } | 137 } |
132 due, retries := retry(fdi.Attributes) | 138 due, retries, duration := retry(fdi.Attributes) |
133 return fd, due, retries, fdi.SendEmail | 139 return fd, due, retries, duration, fdi.SendEmail |
134 } | 140 } |
135 | 141 |
136 func importDistanceMarksAshore(input interface{}) (interface{}, time.Time, int, bool) { | 142 func importDistanceMarksAshore(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
137 dmai := input.(*models.DistanceMarksAshoreImport) | 143 dmai := input.(*models.DistanceMarksAshoreImport) |
138 dma := &imports.DistanceMarksAshore{ | 144 dma := &imports.DistanceMarksAshore{ |
139 URL: dmai.URL, | 145 URL: dmai.URL, |
140 FeatureType: dmai.FeatureType, | 146 FeatureType: dmai.FeatureType, |
141 SortBy: dmai.SortBy, | 147 SortBy: dmai.SortBy, |
142 } | 148 } |
143 due, retries := retry(dmai.Attributes) | 149 due, retries, duration := retry(dmai.Attributes) |
144 return dma, due, retries, dmai.SendEmail | 150 return dma, due, retries, duration, dmai.SendEmail |
145 } | 151 } |
146 | 152 |
147 func importStretch(input interface{}) (interface{}, time.Time, int, bool) { | 153 func importStretch(input interface{}) (interface{}, time.Time, *int, *time.Duration, bool) { |
148 sti := input.(*models.StretchImport) | 154 sti := input.(*models.StretchImport) |
149 st := &imports.Stretch{ | 155 st := &imports.Stretch{ |
150 Name: sti.Name, | 156 Name: sti.Name, |
151 From: sti.From, | 157 From: sti.From, |
152 To: sti.To, | 158 To: sti.To, |
154 NObjNam: sti.NObjNam, | 160 NObjNam: sti.NObjNam, |
155 Source: sti.Source, | 161 Source: sti.Source, |
156 Date: sti.Date, | 162 Date: sti.Date, |
157 Countries: sti.Countries, | 163 Countries: sti.Countries, |
158 } | 164 } |
159 due, retries := retry(sti.Attributes) | 165 due, retries, duration := retry(sti.Attributes) |
160 return st, due, retries, sti.SendEmail | 166 return st, due, retries, duration, sti.SendEmail |
161 } | 167 } |
162 | 168 |
163 func manualImport( | 169 func manualImport( |
164 kind imports.JobKind, | 170 kind imports.JobKind, |
165 setup func(interface{}) (interface{}, time.Time, int, bool), | 171 setup func(interface{}) (interface{}, time.Time, *int, *time.Duration, bool), |
166 ) func(interface{}, *http.Request, *sql.Conn) (JSONResult, error) { | 172 ) func(interface{}, *http.Request, *sql.Conn) (JSONResult, error) { |
167 | 173 |
168 return func(input interface{}, req *http.Request, _ *sql.Conn) ( | 174 return func(input interface{}, req *http.Request, _ *sql.Conn) ( |
169 jr JSONResult, err error) { | 175 jr JSONResult, err error) { |
170 | 176 |
171 what, due, retries, sendEmail := setup(input) | 177 what, due, retries, waitDuration, sendEmail := setup(input) |
172 | 178 |
173 var serialized string | 179 var serialized string |
174 if serialized, err = common.ToJSONString(what); err != nil { | 180 if serialized, err = common.ToJSONString(what); err != nil { |
175 return | 181 return |
176 } | 182 } |
178 session, _ := auth.GetSession(req) | 184 session, _ := auth.GetSession(req) |
179 | 185 |
180 var jobID int64 | 186 var jobID int64 |
181 if jobID, err = imports.AddJob( | 187 if jobID, err = imports.AddJob( |
182 kind, | 188 kind, |
183 due, retries, | 189 due, |
190 retries, | |
191 waitDuration, | |
184 session.User, | 192 session.User, |
185 sendEmail, | 193 sendEmail, |
186 serialized, | 194 serialized, |
187 ); err != nil { | 195 ); err != nil { |
188 return | 196 return |