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