forked from hashicorp/terraform
-
Notifications
You must be signed in to change notification settings - Fork 0
/
check.go
133 lines (108 loc) · 3.09 KB
/
check.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package circonus
import (
"fmt"
"log"
"github.com/circonus-labs/circonus-gometrics/api"
"github.com/circonus-labs/circonus-gometrics/api/config"
"github.com/hashicorp/errwrap"
)
// The circonusCheck type is the backing store of the `circonus_check` resource.
type circonusCheck struct {
api.CheckBundle
}
type circonusCheckType string
const (
// CheckBundle.Status can be one of these values
checkStatusActive = "active"
checkStatusDisabled = "disabled"
)
const (
apiCheckTypeCAQL circonusCheckType = "caql"
apiCheckTypeConsul circonusCheckType = "consul"
apiCheckTypeICMPPing circonusCheckType = "ping_icmp"
apiCheckTypeHTTP circonusCheckType = "http"
apiCheckTypeJSON circonusCheckType = "json"
apiCheckTypeMySQL circonusCheckType = "mysql"
apiCheckTypeStatsd circonusCheckType = "statsd"
apiCheckTypePostgreSQL circonusCheckType = "postgres"
apiCheckTypeTCP circonusCheckType = "tcp"
)
func newCheck() circonusCheck {
return circonusCheck{
CheckBundle: *api.NewCheckBundle(),
}
}
func loadCheck(ctxt *providerContext, cid api.CIDType) (circonusCheck, error) {
var c circonusCheck
cb, err := ctxt.client.FetchCheckBundle(cid)
if err != nil {
return circonusCheck{}, err
}
c.CheckBundle = *cb
return c, nil
}
func checkAPIStatusToBool(s string) bool {
var active bool
switch s {
case checkStatusActive:
active = true
case checkStatusDisabled:
active = false
default:
log.Printf("[ERROR] PROVIDER BUG: check status %q unsupported", s)
}
return active
}
func checkActiveToAPIStatus(active bool) string {
if active {
return checkStatusActive
}
return checkStatusDisabled
}
func (c *circonusCheck) Create(ctxt *providerContext) error {
cb, err := ctxt.client.CreateCheckBundle(&c.CheckBundle)
if err != nil {
return err
}
c.CID = cb.CID
return nil
}
func (c *circonusCheck) Update(ctxt *providerContext) error {
_, err := ctxt.client.UpdateCheckBundle(&c.CheckBundle)
if err != nil {
return errwrap.Wrapf(fmt.Sprintf("Unable to update check bundle %s: {{err}}", c.CID), err)
}
return nil
}
func (c *circonusCheck) Fixup() error {
switch apiCheckType(c.Type) {
case apiCheckTypeCloudWatchAttr:
switch c.Period {
case 60:
c.Config[config.Granularity] = "1"
case 300:
c.Config[config.Granularity] = "5"
}
}
return nil
}
func (c *circonusCheck) Validate() error {
if len(c.Metrics) == 0 {
return fmt.Errorf("At least one %s must be specified", checkMetricAttr)
}
if c.Timeout > float32(c.Period) {
return fmt.Errorf("Timeout (%f) can not exceed period (%d)", c.Timeout, c.Period)
}
// Check-type specific validation
switch apiCheckType(c.Type) {
case apiCheckTypeCloudWatchAttr:
if !(c.Period == 60 || c.Period == 300) {
return fmt.Errorf("Period must be either 1m or 5m for a %s check", apiCheckTypeCloudWatchAttr)
}
case apiCheckTypeConsulAttr:
if v, found := c.Config[config.URL]; !found || v == "" {
return fmt.Errorf("%s must have at least one check mode set: %s, %s, or %s must be set", checkConsulAttr, checkConsulServiceAttr, checkConsulNodeAttr, checkConsulStateAttr)
}
}
return nil
}