osbuild-worker: improve error "reason" in case of stage failures
This commit is contained in:
parent
80a782caac
commit
b0a737421a
3 changed files with 113 additions and 11 deletions
|
|
@ -1,3 +1,6 @@
|
|||
package main
|
||||
|
||||
var WorkerClientErrorFrom = workerClientErrorFrom
|
||||
var (
|
||||
WorkerClientErrorFrom = workerClientErrorFrom
|
||||
MakeJobErrorFromOsbuildOutput = makeJobErrorFromOsbuildOutput
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
81
cmd/osbuild-worker/jobimpl-osbuild_test.go
Normal file
81
cmd/osbuild-worker/jobimpl-osbuild_test.go
Normal file
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue