From 86b11439233175654898629f15c55da079090185 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 5 Aug 2024 10:40:32 +0200 Subject: [PATCH] osbuildexecutor: show full osbuild exector on json decode errors This is a short term workaround to get better visibility why the osbuild executor sometimes sends non-json data. When reading the result from the executor the entire output is now read and if the json parsing goes wrong it will use the entire body in the error message for better debug visibility. --- .../osbuildexecutor/runner-impl-aws-ec2.go | 8 ++++---- .../runner-impl-aws-ec2_test.go | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/internal/osbuildexecutor/runner-impl-aws-ec2.go b/internal/osbuildexecutor/runner-impl-aws-ec2.go index 012947c63f..4813780806 100644 --- a/internal/osbuildexecutor/runner-impl-aws-ec2.go +++ b/internal/osbuildexecutor/runner-impl-aws-ec2.go @@ -149,14 +149,14 @@ func handleBuild(inputArchive, host string) (*osbuild.Result, error) { var osbuildResult osbuild.Result - err = json.NewDecoder(resp.Body).Decode(&osbuildResult) + body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("Unable to decode response body into osbuild result: %w", err) + return nil, fmt.Errorf("Unable to read response body: %w", err) } - _, err = io.ReadAll(resp.Body) + err = json.Unmarshal(body, &osbuildResult) if err != nil { - return nil, fmt.Errorf("Unable to wait for executor to close connection: %w", err) + return nil, fmt.Errorf("Unable to decode response body %q into osbuild result: %w", body, err) } return &osbuildResult, nil diff --git a/internal/osbuildexecutor/runner-impl-aws-ec2_test.go b/internal/osbuildexecutor/runner-impl-aws-ec2_test.go index ed36d6b893..140de6ad4e 100644 --- a/internal/osbuildexecutor/runner-impl-aws-ec2_test.go +++ b/internal/osbuildexecutor/runner-impl-aws-ec2_test.go @@ -91,6 +91,24 @@ func TestHandleBuild(t *testing.T) { require.True(t, osbuildResult.Success) } +func TestHandleBuildNoJSON(t *testing.T) { + buildServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, err := io.ReadAll(r.Body) + require.NoError(t, err) + + w.WriteHeader(http.StatusCreated) + _, err = w.Write([]byte("bad non-json text")) + require.NoError(t, err) + })) + + cacheDir := t.TempDir() + inputArchive := filepath.Join(cacheDir, "test.tar") + require.NoError(t, os.WriteFile(inputArchive, []byte("test"), 0600)) + + _, err := osbuildexecutor.HandleBuild(inputArchive, buildServer.URL) + require.ErrorContains(t, err, `Unable to decode response body "bad non-json text" into osbuild result:`) +} + func TestHandleOutputArchive(t *testing.T) { serverDir := t.TempDir() serverOutputDir := filepath.Join(serverDir, "output")