icinga

Icinga2 API client in Go
git clone https://git.olowe.co/icinga
Log | Files | Refs | README | LICENSE

commit 64e18a8d1ef9f178f91aed840a371f3785c4d188
parent 562d5c1eb8a76a65d49d14b36edefb846f747494
Author: Oliver Lowe <o@olowe.co>
Date:   Fri, 21 Jan 2022 14:10:54 +1100

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.

Diffstat:
Mchecker.go | 4++--
Mcrud.go | 16++++++++--------
Mcrud.skel | 4++--
Micinga_test.go | 15+++++++++++++++
Mobject.go | 6++----
5 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/checker.go b/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 } diff --git a/crud.go b/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) error { 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 bool) error { 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) error { 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) } diff --git a/crud.skel b/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) } diff --git a/icinga_test.go b/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) +} diff --git a/object.go b/object.go @@ -42,10 +42,6 @@ func (c *Client) filterObjects(objpath, expr string) ([]object, error) { return nil, err } defer resp.Body.Close() - if expr != "" && resp.StatusCode == http.StatusNotFound { - return nil, ErrNoMatch - - } iresp, err := parseResponse(resp.Body) if err != nil { return nil, fmt.Errorf("parse response: %v", err) @@ -53,6 +49,8 @@ func (c *Client) filterObjects(objpath, expr string) ([]object, error) { 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 } return iresp.Results, nil }