-
Notifications
You must be signed in to change notification settings - Fork 224
/
toplevelcheck.go
91 lines (84 loc) · 3.09 KB
/
toplevelcheck.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
89
90
91
package appconfig
import (
"fmt"
"strings"
"github.com/samber/lo"
"github.com/superfly/flyctl/api"
"github.com/superfly/flyctl/internal/sentry"
"golang.org/x/exp/slices"
)
type ToplevelCheck struct {
Port *int `json:"port,omitempty" toml:"port,omitempty"`
Type *string `json:"type,omitempty" toml:"type,omitempty"`
Interval *api.Duration `json:"interval,omitempty" toml:"interval,omitempty"`
Timeout *api.Duration `json:"timeout,omitempty" toml:"timeout,omitempty"`
GracePeriod *api.Duration `json:"grace_period,omitempty" toml:"grace_period,omitempty"`
HTTPMethod *string `json:"method,omitempty" toml:"method,omitempty"`
HTTPPath *string `json:"path,omitempty" toml:"path,omitempty"`
HTTPProtocol *string `json:"protocol,omitempty" toml:"protocol,omitempty"`
HTTPTLSSkipVerify *bool `json:"tls_skip_verify,omitempty" toml:"tls_skip_verify,omitempty"`
HTTPHeaders map[string]string `json:"headers,omitempty" toml:"headers,omitempty"`
Processes []string `json:"processes,omitempty" toml:"processes,omitempty"`
}
func topLevelCheckFromMachineCheck(mc api.MachineCheck) *ToplevelCheck {
headers := make(map[string]string)
for _, h := range mc.HTTPHeaders {
if len(h.Values) > 0 {
headers[h.Name] = h.Values[0]
}
if len(h.Values) > 1 {
sentry.CaptureException(fmt.Errorf("bug: more than one header value provided by MachineCheck, but can only support one value for fly.toml"))
}
}
return &ToplevelCheck{
Port: mc.Port,
Type: mc.Type,
Interval: mc.Interval,
Timeout: mc.Timeout,
GracePeriod: mc.GracePeriod,
HTTPMethod: mc.HTTPMethod,
HTTPPath: mc.HTTPPath,
HTTPProtocol: mc.HTTPProtocol,
HTTPTLSSkipVerify: mc.HTTPSkipTLSVerify,
HTTPHeaders: headers,
}
}
func (chk *ToplevelCheck) toMachineCheck() (*api.MachineCheck, error) {
if chk.Type == nil || !slices.Contains([]string{"http", "tcp"}, *chk.Type) {
return nil, fmt.Errorf("Missing or invalid check type, must be 'http' or 'tcp'")
}
res := &api.MachineCheck{
Type: chk.Type,
Port: chk.Port,
Interval: chk.Interval,
Timeout: chk.Timeout,
GracePeriod: chk.GracePeriod,
HTTPPath: chk.HTTPPath,
HTTPProtocol: chk.HTTPProtocol,
HTTPSkipTLSVerify: chk.HTTPTLSSkipVerify,
}
if chk.HTTPMethod != nil {
res.HTTPMethod = api.Pointer(strings.ToUpper(*chk.HTTPMethod))
}
if len(chk.HTTPHeaders) > 0 {
res.HTTPHeaders = lo.MapToSlice(
chk.HTTPHeaders, func(k string, v string) api.MachineHTTPHeader {
return api.MachineHTTPHeader{Name: k, Values: []string{v}}
})
}
return res, nil
}
func (chk *ToplevelCheck) String() string {
chkType := "none"
if chk.Type != nil {
chkType = *chk.Type
}
switch chkType {
case "tcp":
return fmt.Sprintf("tcp-%d", chk.Port)
case "http":
return fmt.Sprintf("http-%d-%v", chk.Port, chk.HTTPMethod)
default:
return fmt.Sprintf("%s-%d", chkType, chk.Port)
}
}