commit 64e18a8d1ef9f178f91aed840a371f3785c4d188 from: Oliver Lowe date: Fri Jan 21 03:10:54 2022 UTC Correctly return ErrNoMatch The check was incorrect before. The HTTP status on responses is still 200 OK, but with empty results if there are no matches to the filter. commit - 562d5c1eb8a76a65d49d14b36edefb846f747494 commit + 64e18a8d1ef9f178f91aed840a371f3785c4d188 blob - b9feba78821be80819231914337efeb72971926a blob + 779711b252a08733adaad116d0cc3e7242ca061d --- checker.go +++ checker.go @@ -82,7 +82,7 @@ func (c *Client) CheckServices(filter string) error { Expr: filter, } if err := scheduleCheck(c, f); err != nil { - return fmt.Errorf("check services %q: %w", filter, err) + return fmt.Errorf("check services %s: %w", filter, err) } return nil } @@ -95,7 +95,7 @@ func (c *Client) CheckHosts(filter string) error { Expr: filter, } if err := scheduleCheck(c, f); err != nil { - return fmt.Errorf("check hosts %q: %w", filter, err) + return fmt.Errorf("check hosts %s: %w", filter, err) } return nil } blob - 80a024bcecbca0755bbb780f1fc35472380a6206 blob + 36b12a496a825ccc2aef75a719a123d76ce3879a --- crud.go +++ crud.go @@ -10,13 +10,13 @@ import "fmt" func (c *Client) Hosts(filter string) ([]Host, error) { objects, err := c.filterObjects("/objects/hosts", filter) if err != nil { - return nil, fmt.Errorf("get hosts filter %q: %w", filter, err) + return nil, fmt.Errorf("get hosts filter %s: %w", filter, err) } var hosts []Host for _, o := range objects { v, ok := o.(Host) if !ok { - return nil, fmt.Errorf("get hosts filter %q: %T in response", filter, v) + return nil, fmt.Errorf("get hosts filter %s: %T in response", filter, v) } hosts = append(hosts, v) } @@ -61,13 +61,13 @@ func (c *Client) DeleteHost(name string, cascade bool) func (c *Client) Services(filter string) ([]Service, error) { objects, err := c.filterObjects("/objects/services", filter) if err != nil { - return nil, fmt.Errorf("get services filter %q: %w", filter, err) + return nil, fmt.Errorf("get services filter %s: %w", filter, err) } var services []Service for _, o := range objects { v, ok := o.(Service) if !ok { - return nil, fmt.Errorf("get services filter %q: %T in response", filter, v) + return nil, fmt.Errorf("get services filter %s: %T in response", filter, v) } services = append(services, v) } @@ -112,13 +112,13 @@ func (c *Client) DeleteService(name string, cascade bo func (c *Client) Users(filter string) ([]User, error) { objects, err := c.filterObjects("/objects/users", filter) if err != nil { - return nil, fmt.Errorf("get users filter %q: %w", filter, err) + return nil, fmt.Errorf("get users filter %s: %w", filter, err) } var users []User for _, o := range objects { v, ok := o.(User) if !ok { - return nil, fmt.Errorf("get users filter %q: %T in response", filter, v) + return nil, fmt.Errorf("get users filter %s: %T in response", filter, v) } users = append(users, v) } @@ -163,13 +163,13 @@ func (c *Client) DeleteUser(name string, cascade bool) func (c *Client) HostGroups(filter string) ([]HostGroup, error) { objects, err := c.filterObjects("/objects/hostgroups", filter) if err != nil { - return nil, fmt.Errorf("get hostgroups filter %q: %w", filter, err) + return nil, fmt.Errorf("get hostgroups filter %s: %w", filter, err) } var hostgroups []HostGroup for _, o := range objects { v, ok := o.(HostGroup) if !ok { - return nil, fmt.Errorf("get hostgroups filter %q: %T in response", filter, v) + return nil, fmt.Errorf("get hostgroups filter %s: %T in response", filter, v) } hostgroups = append(hostgroups, v) } blob - 0aed23206f89c7a23d04fe9bc52bdfa190ae4b18 blob + 98555ec48091ac0edc461dbba2a34659164d40b9 --- crud.skel +++ crud.skel @@ -4,13 +4,13 @@ func (c *Client) TYPEs(filter string) ([]TYPE, error) { objects, err := c.filterObjects("/objects/PLURAL", filter) if err != nil { - return nil, fmt.Errorf("get PLURAL filter %q: %w", filter, err) + return nil, fmt.Errorf("get PLURAL filter %s: %w", filter, err) } var PLURAL []TYPE for _, o := range objects { v, ok := o.(TYPE) if !ok { - return nil, fmt.Errorf("get PLURAL filter %q: %T in response", filter, v) + return nil, fmt.Errorf("get PLURAL filter %s: %T in response", filter, v) } PLURAL = append(PLURAL, v) } blob - 6706b881d34f7c9f765071850524e5c24304ee91 blob + e6e5d8c1eac900a0fce5682be080cdc969454f7e --- icinga_test.go +++ icinga_test.go @@ -188,3 +188,18 @@ func TestCreateService(t *testing.T) { t.Error(err) } } + +func TestNonExistentService(t *testing.T) { + client, err := newTestClient() + if err != nil { + t.Skipf("no local test icinga? got: %v", err) + } + + filter := `match("blablabla", service.name)` + service, err := client.Services(filter) + if err == nil { + t.Fail() + } + t.Logf("lookup %s: %v", name, err) + t.Logf("%+v", service) +} blob - fef3e9de2d177ab3cfb246a54ca271d1a65bf22f blob + faef3a21b4d7a2dd7c852d98da51a75a11c30355 --- object.go +++ object.go @@ -42,18 +42,16 @@ func (c *Client) filterObjects(objpath, expr string) ( return nil, err } defer resp.Body.Close() - if expr != "" && resp.StatusCode == http.StatusNotFound { + iresp, err := parseResponse(resp.Body) + if err != nil { + return nil, fmt.Errorf("parse response: %v", err) + } else if iresp.Error != nil { + return nil, iresp.Error + } else if resp.StatusCode != http.StatusOK { + return nil, errors.New(resp.Status) + } else if len(iresp.Results) == 0 { return nil, ErrNoMatch - } - iresp, err := parseResponse(resp.Body) - if err != nil { - return nil, fmt.Errorf("parse response: %v", err) - } else if iresp.Error != nil { - return nil, iresp.Error - } else if resp.StatusCode != http.StatusOK { - return nil, errors.New(resp.Status) - } return iresp.Results, nil }