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:
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
}