From e7121846da987e99ba61e8abd604ab34a3b340f3 Mon Sep 17 00:00:00 2001 From: Timofey Date: Sat, 17 Apr 2021 16:36:23 +0300 Subject: [PATCH] Handle docker API errors --- app/discovery/provider/docker.go | 14 +++++++++++++- app/discovery/provider/docker_test.go | 13 +++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/discovery/provider/docker.go b/app/discovery/provider/docker.go index e10f6ec..c52533a 100644 --- a/app/discovery/provider/docker.go +++ b/app/discovery/provider/docker.go @@ -324,7 +324,19 @@ func (d *dockerClient) ListContainers() ([]containerInfo, error) { defer resp.Body.Close() - var response []struct { + if resp.StatusCode != http.StatusOK { + e := struct { + Message string `json:"message"` + }{} + + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("failed to parse error from docker daemon: %w", err) + } + + return nil, fmt.Errorf("unexpected error from docker daemon: %s", e.Message) + } + + response := []struct { ID string `json:"Id"` Name string State string diff --git a/app/discovery/provider/docker_test.go b/app/discovery/provider/docker_test.go index 23f07b5..e42f474 100644 --- a/app/discovery/provider/docker_test.go +++ b/app/discovery/provider/docker_test.go @@ -201,3 +201,16 @@ func TestDockerClient(t *testing.T) { assert.Empty(t, c[1].IP) } + +func TestDockerClient_error(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.Error(w, `{"message": "bruh"}`, http.StatusInternalServerError) + })) + + defer srv.Close() + addr := fmt.Sprintf("tcp://%s", strings.TrimPrefix(srv.URL, "http://")) + + client := NewDockerClient(addr, "bridge") + _, err := client.ListContainers() + require.EqualError(t, err, "unexpected error from docker daemon: bruh") +}