From ac6d66e07fadb7a791f13a0cbdebf749050c0fa4 Mon Sep 17 00:00:00 2001 From: Isabella Janssen Date: Tue, 1 Sep 2026 15:22:16 -0400 Subject: [PATCH] controller: update message for MachineOSBuildFailed condition --- .../build/imagebuilder/jobimagebuilder.go | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/pkg/controller/build/imagebuilder/jobimagebuilder.go b/pkg/controller/build/imagebuilder/jobimagebuilder.go index ad65e9670c..16041cf45a 100644 --- a/pkg/controller/build/imagebuilder/jobimagebuilder.go +++ b/pkg/controller/build/imagebuilder/jobimagebuilder.go @@ -326,6 +326,34 @@ func (j *jobImageBuilder) validateBuilderType(builder buildrequest.Builder) erro return fmt.Errorf("invalid type %T from builder, expected %T", j.builder, &batchv1.Job{}) } +// buildFailedConditionsFromJob returns MachineOSBuild failed conditions populated with the +// failure reason and message from the job's Failed condition, falling back to generic values. +func buildFailedConditionsFromJob(job *batchv1.Job) []metav1.Condition { + reason := "Failed" + message := "Build Failed" + for _, cond := range job.Status.Conditions { + if cond.Type == batchv1.JobFailed && cond.Status == corev1.ConditionTrue { + if cond.Reason != "" { + reason = cond.Reason + } + if cond.Message != "" { + message = cond.Message + } + break + } + } + message = fmt.Sprintf("Job %q failed after %d attempt(s): %s", job.Name, job.Status.Failed, message) + conditions := apihelpers.MachineOSBuildFailedConditions() + for i := range conditions { + if conditions[i].Type == string(mcfgv1.MachineOSBuildFailed) { + conditions[i].Reason = reason + conditions[i].Message = message + break + } + } + return conditions +} + // Maps a given batchv1.Job to a given MachineOSBuild status. Exported so that it can be used in e2e tests. func MapJobStatusToBuildStatus(job *batchv1.Job) (mcfgv1.BuildProgress, []metav1.Condition) { // If the job is being deleted and it was not in either a successful or failed state @@ -356,7 +384,7 @@ func MapJobStatusToBuildStatus(job *batchv1.Job) (mcfgv1.BuildProgress, []metav1 return mcfgv1.MachineOSBuildSucceeded, apihelpers.MachineOSBuildSucceededConditions() } if condition.Type == batchv1.JobFailed && condition.Status == corev1.ConditionTrue { - return mcfgv1.MachineOSBuildFailed, apihelpers.MachineOSBuildFailedConditions() + return mcfgv1.MachineOSBuildFailed, buildFailedConditionsFromJob(job) } } // If we have succeeded pods but no completion condition, we're still building @@ -365,7 +393,7 @@ func MapJobStatusToBuildStatus(job *batchv1.Job) (mcfgv1.BuildProgress, []metav1 // Only return failed if there have been 4 pod failures as the backoffLimit is set to 3 if job.Status.Failed > constants.JobMaxRetries { - return mcfgv1.MachineOSBuildFailed, apihelpers.MachineOSBuildFailedConditions() + return mcfgv1.MachineOSBuildFailed, buildFailedConditionsFromJob(job) } return "", apihelpers.MachineOSBuildInitialConditions()