11 type checker interface {
16 type checkFilter struct {
17 Type string `json:"type"`
18 Expr string `json:"filter"`
24 StateSoft StateType = 0 + iota
28 func (st StateType) String() string {
35 return "unsupported state type"
38 // Check reschedules the check for s via the provided Client.
39 func (s Service) Check(c *Client) error {
43 // Check reschedules the check for h via the provided Client.
44 func (h Host) Check(c *Client) error {
48 // Check reschedules the checks for all hosts in the HostGroup hg via the
50 func (hg HostGroup) Check(c *Client) error {
54 func splitServiceName(name string) []string {
55 return strings.SplitN(name, "!", 2)
58 func (c *Client) check(ch checker) error {
59 switch v := ch.(type) {
61 return c.CheckHosts(fmt.Sprintf("host.name == %q", v.Name))
63 a := splitServiceName(v.Name)
65 return fmt.Errorf("check %s: invalid service name", v.Name)
69 return c.CheckServices(fmt.Sprintf("host.name == %q && service.name == %q", host, service))
71 return c.CheckHosts(fmt.Sprintf("%q in host.groups", v.Name))
73 return fmt.Errorf("cannot check %T", v)
77 // CheckHosts schedules checks for all services matching the filter expression
78 // filter. If no services match the filter, error wraps ErrNoMatch.
79 func (c *Client) CheckServices(filter string) error {
84 if err := scheduleCheck(c, f); err != nil {
85 return fmt.Errorf("check services %s: %w", filter, err)
90 // CheckHosts schedules checks for all hosts matching the filter expression
91 // filter. If no hosts match the filter, error wraps ErrNoMatch.
92 func (c *Client) CheckHosts(filter string) error {
97 if err := scheduleCheck(c, f); err != nil {
98 return fmt.Errorf("check hosts %s: %w", filter, err)
103 func scheduleCheck(c *Client, filter checkFilter) error {
104 buf := &bytes.Buffer{}
105 if err := json.NewEncoder(buf).Encode(filter); err != nil {
108 resp, err := c.post("/actions/reschedule-check", buf)
112 if resp.StatusCode == http.StatusOK {
116 defer resp.Body.Close()
117 iresp, err := parseResponse(resp.Body)
119 return fmt.Errorf("parse response: %v", err)
120 } else if iresp.Error != nil {
122 } else if len(iresp.Results) == 0 {
125 return fmt.Errorf("%s", resp.Status)