diff --git a/zenoss/zenoss.go b/zenoss/zenoss.go index 3f348d2..eb66649 100644 --- a/zenoss/zenoss.go +++ b/zenoss/zenoss.go @@ -163,14 +163,18 @@ func (z *client) ReadDevice(ctx context.Context, uid string) (*Device, error) { return nil, fmt.Errorf("unable to read device: %w", err) } - if !dev.Result.Success || dev.Result.Count > 1 { - return nil, fmt.Errorf("error reading device or more devices returned") + if dev.Result.Count > 1 { + return nil, fmt.Errorf("error multiple devices returned") } if dev.Result.Count == 0 || len(dev.Result.Devices) == 0 { return nil, nil } + if !dev.Result.Success { + return nil, fmt.Errorf("error reading device") + } + return &dev.Result.Devices[0], nil } diff --git a/zenoss/zenoss_test.go b/zenoss/zenoss_test.go index 2e4602f..df39c78 100644 --- a/zenoss/zenoss_test.go +++ b/zenoss/zenoss_test.go @@ -84,6 +84,23 @@ func TestReadDevice(t *testing.T) { assert.Equal(t, "oaas1.k8s.jysk.netic.dk", device.Name) } +func TestReadDeviceNotFound(t *testing.T) { + api, server := newStubAPI(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + if req.URL.Path == "/zport/dmd/device_router" { + buf := new(strings.Builder) + io.Copy(buf, req.Body) + assert.Equal(t, `{"action":"DeviceRouter","method":"getDevices","data":[{"uid":"/zport/dmd/Devices/VirtualDevices/jysk-k8s/devices/oaas1.k8s.jysk.netic.dk"}],"tid":1}`, buf.String()) + assert.Equal(t, "POST", req.Method) + rw.Write([]byte(readDeviceResponseNotFound)) + } + })) + defer server.Close() + + device, err := api.ReadDevice(context.Background(), "/zport/dmd/Devices/VirtualDevices/jysk-k8s/devices/oaas1.k8s.jysk.netic.dk") + assert.NoError(t, err) + assert.Nil(t, device) +} + func TestCreateDevice(t *testing.T) { api, server := newStubAPI(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { assert.Equal(t, "POST", req.Method) @@ -307,6 +324,19 @@ const readDeviceResponse = `{ "method": "getDevices" }` +const readDeviceResponseNotFound = `{ + "uuid": "f353184f-59f4-4057-9cc6-8614dd7cc91e", + "action": "DeviceRouter", + "result": { + "totalCount": 0, + "hash": "", + "success": false + }, + "tid": 1, + "type": "rpc", + "method": "getDevices" + }` + const readDeviceResponseEmpty = `{ "uuid": "b2033e78-0cb5-42b7-878e-062386b777c7", "action": "DeviceRouter",