5
5
"crypto/tls"
6
6
"fmt"
7
7
"io/ioutil"
8
+ "math/rand"
8
9
"net/http"
9
10
"os"
10
11
"os/signal"
@@ -15,13 +16,15 @@ import (
15
16
16
17
"github.com/gorilla/mux"
17
18
_ "github.com/lib/pq"
19
+ log "github.com/sirupsen/logrus"
20
+ flag "github.com/spf13/pflag"
21
+
18
22
"github.com/nais/testapp/pkg/bigquery"
19
23
"github.com/nais/testapp/pkg/bucket"
20
24
"github.com/nais/testapp/pkg/database"
21
25
"github.com/nais/testapp/pkg/metrics"
26
+ "github.com/nais/testapp/pkg/testable"
22
27
"github.com/nais/testapp/pkg/version"
23
- log "github.com/sirupsen/logrus"
24
- flag "github.com/spf13/pflag"
25
28
)
26
29
27
30
var (
@@ -107,6 +110,9 @@ func timeSinceDeploy() float64 {
107
110
}
108
111
109
112
func main () {
113
+ programContext , cancel := context .WithCancel (context .Background ())
114
+ defer cancel ()
115
+
110
116
interrupt := make (chan os.Signal , 1 )
111
117
signal .Notify (interrupt , syscall .SIGTERM , syscall .SIGINT )
112
118
hostname , _ := os .Hostname ()
@@ -207,32 +213,56 @@ func main() {
207
213
w .WriteHeader (http .StatusOK )
208
214
_ , _ = fmt .Fprintf (w , "HTTP status: %d, body:\n %s" , resp .StatusCode , string (b ))
209
215
})
210
- // Bucket set-ups and endpoints
211
- r .HandleFunc ("/readbucket" , bucket .ReadBucketHandler (bucketName , bucketObjectName ))
212
- r .HandleFunc ("/writebucket" , bucket .WriteBucketHandler (bucketName , bucketObjectName )).Methods (http .MethodPost )
213
216
214
- // Ceph bucket set-ups and endpoints
217
+ // Holds all tests. Possible feature: /test to run all tests
218
+ var tests []testable.Testable
219
+
220
+ // Set up google bucket test
221
+ bucketTest , err := bucket .NewGoogleBucketTest (programContext , bucketName , bucketObjectName )
222
+ if err != nil {
223
+ log .Errorf ("Error setting up bucket test: %v" , err )
224
+ } else {
225
+ tests = append (tests , bucketTest )
226
+ }
227
+
228
+ // Set up ceph test
215
229
if rgwAddress != "" && rgwAccessKey != "" && rgwSecretKey != "" {
216
- bucket .Ceph .CephInit (rgwAddress , bucketName , "us-east-1" , rgwAccessKey , rgwSecretKey )
217
- r .HandleFunc ("/readrgwbucket" , bucket .Ceph .ReadBucketHandler (bucketObjectName ))
218
- r .HandleFunc ("/writergwbucket" , bucket .Ceph .WriteBucketHandler (bucketObjectName )).Methods (http .MethodPost )
230
+ cephTest , err := bucket .NewCephBucketTest (rgwAddress , bucketName , "us-east-1" , rgwAccessKey , rgwSecretKey , bucketObjectName )
231
+ if err != nil {
232
+ log .Errorf ("Error setting up ceph bucket test: %v" , err )
233
+ } else {
234
+ tests = append (tests , cephTest )
235
+ }
219
236
}
220
237
221
- // DB set-ups and endpoints
222
- r .HandleFunc ("/writedb" , database .WriteDatabaseHandler (dbUser , dbPassword , dbName , dbHost )).Methods (http .MethodPost )
223
- r .HandleFunc ("/readdb" , database .ReadDatabaseHandler (dbUser , dbPassword , dbName , dbHost ))
238
+ // Set up database test
239
+ databaseTest , err := database .NewDatabaseTest (dbUser , dbPassword , dbName , dbHost )
240
+ if err != nil {
241
+ log .Errorf ("Error setting up bucket test: %v" , err )
242
+ } else {
243
+ tests = append (tests , databaseTest )
244
+ }
224
245
225
- // Bigquery set-ups and endpoints
246
+ // Set up bigquery test
226
247
if bigqueryName != "" && bigqueryTableName != "" {
227
- // Use input parameters as feature toggle for bigquery
228
- // since testrig will crash apparently
229
- err := bigquery .CreateDatasetAndTable (projectID , bigqueryName , bigqueryTableName )
230
- switch {
231
- case err != nil :
232
- log .Errorf ("Unable to create bigquery dataset and table, all tests will return HTTP STATUS 404: %v" , err )
233
- default :
234
- r .HandleFunc ("/writebigquery" , bigquery .WriteBigQueryHandler (projectID , bigqueryName , bigqueryTableName )).Methods (http .MethodPost )
235
- r .HandleFunc ("/readbigquery" , bigquery .ReadBigQueryHandler (projectID , bigqueryName , bigqueryTableName ))
248
+ bq , err := bigquery .NewBigqueryTest (programContext , projectID , bigqueryName , bigqueryTableName )
249
+ err = bq .Init (programContext )
250
+ if err != nil {
251
+ log .Errorf ("Error setting up bigquery test: %v" , err )
252
+ } else {
253
+ tests = append (tests , bq )
254
+ }
255
+ }
256
+
257
+ for _ , test := range tests {
258
+ err := test .Init (programContext )
259
+ if err != nil {
260
+ log .Errorf ("Error initializing test: %s, will not set up handler." , test .Name ())
261
+ } else {
262
+ setupTestHandler (r , test )
263
+
264
+ //goland:noinspection GoDeferInLoop
265
+ defer test .Cleanup ()
236
266
}
237
267
}
238
268
@@ -243,7 +273,10 @@ func main() {
243
273
server := & http.Server {Addr : bindAddr , Handler : r }
244
274
245
275
go func () {
246
- log .Fatal (server .ListenAndServe ())
276
+ err := server .ListenAndServe ()
277
+ if err != http .ErrServerClosed {
278
+ log .Errorf ("closing http server: %v" , err )
279
+ }
247
280
}()
248
281
249
282
<- interrupt
@@ -252,5 +285,35 @@ func main() {
252
285
time .Sleep (time .Duration (gracefulShutdownPeriodSeconds ) * time .Second )
253
286
log .Print ("shutting down" )
254
287
255
- _ = server .Shutdown (context .Background ())
288
+ _ = server .Shutdown (programContext )
289
+ }
290
+
291
+ func setupTestHandler (router * mux.Router , test testable.Testable ) {
292
+ log .Infof ("setting up %s test handler" , test .Name ())
293
+
294
+ path := fmt .Sprintf ("%s/test" , test .Name ())
295
+ router .HandleFunc (path , func (w http.ResponseWriter , r * http.Request ) {
296
+ expected := fmt .Sprintf ("%x" , 9999 + rand .Intn (999999 ))[:4 ]
297
+ result , err := test .Test (r .Context (), expected )
298
+ if err != nil {
299
+ w .WriteHeader (http .StatusInternalServerError )
300
+ _ , respondErr := fmt .Fprintf (w , "%s test: error: %v" , test .Name (), err )
301
+ if respondErr != nil {
302
+ log .Errorf ("%s test: write response err: %v (test err: %v)" , test .Name (), respondErr , err )
303
+ } else {
304
+ log .Warnf ("%s test: failed, %v" , test .Name (), err )
305
+ }
306
+ return
307
+ }
308
+
309
+ if expected != result {
310
+ w .WriteHeader (http .StatusInternalServerError )
311
+ _ , err := fmt .Fprintf (w , "%s test: data missmatch, epected: %s got: %s" , test .Name (), expected , result )
312
+ if err != nil {
313
+ log .Errorf ("%s test: unable to write response: %v" , test .Name (), err )
314
+ }
315
+ } else {
316
+ w .WriteHeader (http .StatusOK )
317
+ }
318
+ })
256
319
}
0 commit comments