Skip to content

Commit

Permalink
osbuild-worker: improve error "reason" in case of stage failures
Browse files Browse the repository at this point in the history
  • Loading branch information
schuellerf committed Jul 5, 2024
1 parent 4e1ab4c commit afcafa7
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 11 deletions.
5 changes: 4 additions & 1 deletion cmd/osbuild-worker/export_test.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
package main

var WorkerClientErrorFrom = workerClientErrorFrom
var (
WorkerClientErrorFrom = workerClientErrorFrom
MakeJobErrorFromOsbuildOutput = makeJobErrorFromOsbuildOutput
)
38 changes: 28 additions & 10 deletions cmd/osbuild-worker/jobimpl-osbuild.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,33 @@ func (impl *OSBuildJobImpl) getPulpClient(targetOptions *target.PulpOSTreeTarget
return pulp.NewClientFromFile(address, impl.PulpConfig.CredsFilePath)
}

func makeJobErrorFromOsbuildOutput(osbuildOutput *osbuild.Result) *clienterrors.Error {
var osbErrors []string
if osbuildOutput.Error != nil {
osbErrors = append(osbErrors, fmt.Sprintf("osbuild error: %s", string(osbuildOutput.Error)))
}
if osbuildOutput.Errors != nil {
for _, err := range osbuildOutput.Errors {
osbErrors = append(osbErrors, fmt.Sprintf("manifest validation error: %v", err))
}
}
var failedStage string
for _, pipelineLog := range osbuildOutput.Log {
for _, stageResult := range pipelineLog {
if !stageResult.Success {
failedStage = stageResult.Type
break
}
}
}

reason := "osbuild build failed"
if len(failedStage) > 0 {
reason += " in stage:\n" + failedStage
}
return clienterrors.WorkerClientError(clienterrors.ErrorBuildJob, reason, osbErrors)
}

func (impl *OSBuildJobImpl) Run(job worker.Job) error {
logWithId := logrus.WithField("jobId", job.Id().String())
// Initialize variable needed for reporting back to osbuild-composer.
Expand Down Expand Up @@ -565,16 +592,7 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error {

// Second handle the case when the build failed, but osbuild finished successfully
if !osbuildJobResult.OSBuildOutput.Success {
var osbErrors []string
if osbuildJobResult.OSBuildOutput.Error != nil {
osbErrors = append(osbErrors, fmt.Sprintf("osbuild error: %s", string(osbuildJobResult.OSBuildOutput.Error)))
}
if osbuildJobResult.OSBuildOutput.Errors != nil {
for _, err := range osbuildJobResult.OSBuildOutput.Errors {
osbErrors = append(osbErrors, fmt.Sprintf("manifest validation error: %v", err))
}
}
osbuildJobResult.JobError = clienterrors.WorkerClientError(clienterrors.ErrorBuildJob, "osbuild build failed", osbErrors)
osbuildJobResult.JobError = makeJobErrorFromOsbuildOutput(osbuildJobResult.OSBuildOutput)
return nil
}

Expand Down
81 changes: 81 additions & 0 deletions cmd/osbuild-worker/jobimpl-osbuild_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package main_test

import (
"encoding/json"
"testing"

"github.com/stretchr/testify/require"

"github.com/osbuild/images/pkg/osbuild"

main "github.com/osbuild/osbuild-composer/cmd/osbuild-worker"
)

func TestMakeJobErrorFromOsbuildOutput(t *testing.T) {
tests := []struct {
inputData *osbuild.Result
expected string
}{
{
inputData: &osbuild.Result{
Success: false,
Log: map[string]osbuild.PipelineResult{
"fake-os": []osbuild.StageResult{
{
Type: "good-stage",
Success: true,
Output: "good-output",
},
{
Type: "bad-stage",
Success: false,
Output: "bad-failure",
},
},
},
},
expected: `Code: 10, Reason: osbuild build failed in stage:
bad-stage, Details: []`,
},
{
inputData: &osbuild.Result{
Success: false,
Log: map[string]osbuild.PipelineResult{
"fake-os": []osbuild.StageResult{},
},
},
expected: `Code: 10, Reason: osbuild build failed, Details: []`,
},
{
inputData: &osbuild.Result{
Error: json.RawMessage("some_osbuild_error"),
Success: false,
Log: map[string]osbuild.PipelineResult{
"fake-os": []osbuild.StageResult{},
},
},
expected: `Code: 10, Reason: osbuild build failed, Details: [osbuild error: some_osbuild_error]`,
},
{
inputData: &osbuild.Result{
Errors: []osbuild.ValidationError{
{
Message: "validation error message",
Path: []string{"error path"},
},
},
Success: false,
Log: map[string]osbuild.PipelineResult{
"fake-os": []osbuild.StageResult{},
},
},
expected: `Code: 10, Reason: osbuild build failed, Details: [manifest validation error: {validation error message [error path]}]`,
},
}
for _, testData := range tests {
fakeOsbuildResult := testData.inputData

wce := main.MakeJobErrorFromOsbuildOutput(fakeOsbuildResult)
require.Equal(t, testData.expected, wce.String())
}
}

0 comments on commit afcafa7

Please sign in to comment.