/
admin_restart.go
88 lines (76 loc) · 2.41 KB
/
admin_restart.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package route
import (
"context"
"net/http"
"time"
"github.com/evergreen-ci/evergreen"
dataModel "github.com/evergreen-ci/evergreen/model"
"github.com/evergreen-ci/evergreen/rest/data"
"github.com/evergreen-ci/gimlet"
"github.com/mongodb/amboy"
"github.com/pkg/errors"
)
func makeRestartRoute(restartType string, queue amboy.Queue) gimlet.RouteHandler {
return &restartHandler{
queue: queue,
restartType: restartType,
}
}
type restartHandler struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
DryRun bool `json:"dry_run"`
IncludeTestFailed bool `json:"include_test_failed"`
IncludeSysFailed bool `json:"include_sys_failed"`
IncludeSetupFailed bool `json:"include_setup_failed"`
restartType string
queue amboy.Queue
}
func (h *restartHandler) Factory() gimlet.RouteHandler {
return &restartHandler{
queue: h.queue,
restartType: h.restartType,
}
}
func (h *restartHandler) Parse(ctx context.Context, r *http.Request) error {
if err := gimlet.GetJSON(r.Body, h); err != nil {
return errors.Wrap(err, "parsing request body")
}
if h.EndTime.Before(h.StartTime) {
return gimlet.ErrorResponse{
StatusCode: http.StatusBadRequest,
Message: "end time cannot be before start time",
}
}
if h.restartType != evergreen.RestartTasks && h.restartType != evergreen.RestartVersions {
return gimlet.ErrorResponse{
StatusCode: http.StatusBadRequest,
Message: "restart type must be tasks or versions",
}
}
return nil
}
func (h *restartHandler) Run(ctx context.Context) gimlet.Responder {
u := MustHaveUser(ctx)
opts := dataModel.RestartOptions{
DryRun: h.DryRun,
IncludeTestFailed: h.IncludeTestFailed,
IncludeSysFailed: h.IncludeSysFailed,
IncludeSetupFailed: h.IncludeSetupFailed,
StartTime: h.StartTime,
EndTime: h.EndTime,
User: u.Username(),
}
if h.restartType == evergreen.RestartVersions {
resp, err := data.RestartFailedCommitQueueVersions(opts)
if err != nil {
return gimlet.MakeJSONInternalErrorResponder(errors.Wrap(err, "restarting failed commit queue versions"))
}
return gimlet.NewJSONResponse(resp)
}
resp, err := data.RestartFailedTasks(ctx, h.queue, opts)
if err != nil {
return gimlet.MakeJSONInternalErrorResponder(errors.Wrap(err, "restarting failed tasks"))
}
return gimlet.NewJSONResponse(resp)
}