forked from remind101/empire
/
deployments.go
68 lines (52 loc) · 1.42 KB
/
deployments.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
package heroku
import (
"net/http"
"github.com/remind101/empire/pkg/image"
streamhttp "github.com/remind101/empire/pkg/stream/http"
"github.com/remind101/empire/server/auth"
"github.com/remind101/empire"
)
// PostDeployForm is the form object that represents the POST body.
type PostDeployForm struct {
Image image.Image
Stream bool
}
// ServeHTTPContext implements the Handler interface.
func (h *Server) PostDeploys(w http.ResponseWriter, req *http.Request) error {
ctx := req.Context()
opts, err := newDeployOpts(w, req)
if err != nil {
return err
}
_, err = h.Deploy(ctx, *opts)
// We only return the MessageRequiredError since all other errors are
// written to the stream.
switch err := err.(type) {
case *empire.MessageRequiredError:
return err
}
return nil
}
func newDeployOpts(w http.ResponseWriter, req *http.Request) (*empire.DeployOpts, error) {
ctx := req.Context()
var form PostDeployForm
if err := Decode(req, &form); err != nil {
return nil, err
}
m, err := findMessage(req)
if err != nil {
return nil, err
}
w.Header().Set("Content-Type", "application/json; boundary=NL")
if form.Image.Tag == "" && form.Image.Digest == "" {
form.Image.Tag = "latest"
}
opts := empire.DeployOpts{
User: auth.UserFromContext(ctx),
Image: form.Image,
Output: empire.NewDeploymentStream(streamhttp.StreamingResponseWriter(w)),
Message: m,
Stream: form.Stream,
}
return &opts, nil
}