From f08b64a6ca5eec1be20277a34b4d6150450be239 Mon Sep 17 00:00:00 2001 From: Benny Zlotnik Date: Wed, 15 Apr 2026 18:37:28 +0300 Subject: [PATCH] fix: add oci:// prefix to default flash command and preserve flashCmd The default flash command was missing the oci:// scheme prefix Additionally, passing --exporter to override the exporter selector was skipping the entire target mapping lookup, silently dropping the configured flashCmd (and its flags like --fls-version, --no-power-off). Now --exporter only overrides the selector while still inheriting flashCmd from the target mapping. Signed-off-by: Benny Zlotnik Assisted-by: claude-sonnet-4.6 --- internal/buildapi/flash_helpers.go | 6 ++++-- internal/common/tasks/scripts/flash_image.sh | 2 +- internal/common/tasks/tasks.go | 4 ++-- internal/controller/imagebuild/controller.go | 22 ++++++++++---------- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/internal/buildapi/flash_helpers.go b/internal/buildapi/flash_helpers.go index ac754fa0..3ae7dbcb 100644 --- a/internal/buildapi/flash_helpers.go +++ b/internal/buildapi/flash_helpers.go @@ -25,9 +25,11 @@ type httpError struct { func resolveFlashTargetConfig(req FlashRequest, operatorConfig *automotivev1alpha1.OperatorConfig) (string, string) { exporterSelector := req.ExporterSelector flashCmd := req.FlashCmd - if req.Target != "" && exporterSelector == "" && operatorConfig.Spec.Jumpstarter != nil { + if req.Target != "" && operatorConfig.Spec.Jumpstarter != nil { if mapping, ok := operatorConfig.Spec.Jumpstarter.TargetMappings[req.Target]; ok { - exporterSelector = mapping.Selector + if exporterSelector == "" { + exporterSelector = mapping.Selector + } if flashCmd == "" { flashCmd = mapping.FlashCmd } diff --git a/internal/common/tasks/scripts/flash_image.sh b/internal/common/tasks/scripts/flash_image.sh index 0aa8c418..4d342551 100644 --- a/internal/common/tasks/scripts/flash_image.sh +++ b/internal/common/tasks/scripts/flash_image.sh @@ -19,7 +19,7 @@ echo "Using client config: ${JMP_CLIENT_CONFIG}" echo "refreshing jumpstarter token" jmp login --client-config "${JMP_CLIENT_CONFIG}" -FLASH_CMD="${FLASH_CMD:-j storage flash \{image_uri\}}" +FLASH_CMD="${FLASH_CMD:-j storage flash oci://{image_uri}}" FLASH_CMD=$(echo "${FLASH_CMD}" | sed "s|{image_uri}|${IMAGE_REF}|g") diff --git a/internal/common/tasks/tasks.go b/internal/common/tasks/tasks.go index 75bfdd01..167a39db 100644 --- a/internal/common/tasks/tasks.go +++ b/internal/common/tasks/tasks.go @@ -844,7 +844,7 @@ func GenerateTektonPipeline(name, namespace string, buildConfig *BuildConfig) *t { Name: "flash-cmd", Type: tektonv1.ParamTypeString, - Description: "Custom flash command (default: j storage flash ${IMAGE_REF})", + Description: "Custom flash command (default: j storage flash oci://{image_uri})", Default: &tektonv1.ParamValue{ Type: tektonv1.ParamTypeString, StringVal: "", @@ -1546,7 +1546,7 @@ func GenerateFlashTask(namespace string, buildConfig *BuildConfig) *tektonv1.Tas { Name: "flash-cmd", Type: tektonv1.ParamTypeString, - Description: "Command to run for flashing (default: j storage flash ${IMAGE_REF})", + Description: "Command to run for flashing (default: j storage flash oci://{image_uri})", Default: &tektonv1.ParamValue{ Type: tektonv1.ParamTypeString, StringVal: "", diff --git a/internal/controller/imagebuild/controller.go b/internal/controller/imagebuild/controller.go index a10ed7bc..31d5b6d6 100644 --- a/internal/controller/imagebuild/controller.go +++ b/internal/controller/imagebuild/controller.go @@ -692,21 +692,21 @@ func (r *ImageBuildReconciler) createBuildTaskRun( // Add flash params if flash is enabled var flashExporterSelector, flashCmd, flashOCIAuthSecretName string if imageBuild.Spec.IsFlashEnabled() { - // User-specified exporter selector bypasses target lookup entirely flashExporterSelector = imageBuild.Spec.GetFlashExporterSelector() - if flashExporterSelector == "" { - target := imageBuild.Spec.GetTarget() - if operatorConfig.Spec.Jumpstarter != nil { - if mapping, ok := operatorConfig.Spec.Jumpstarter.TargetMappings[target]; ok { + target := imageBuild.Spec.GetTarget() + // Look up target mapping for selector (if not overridden) and flash command + if operatorConfig.Spec.Jumpstarter != nil { + if mapping, ok := operatorConfig.Spec.Jumpstarter.TargetMappings[target]; ok { + if flashExporterSelector == "" { flashExporterSelector = mapping.Selector - flashCmd = mapping.FlashCmd } + flashCmd = mapping.FlashCmd } - if flashExporterSelector == "" { - return fmt.Errorf("flash enabled but no Jumpstarter target mapping found for target %q; "+ - "configure OperatorConfig.spec.jumpstarter.targetMappings[%q] with selector and flashCmd, "+ - "or set flash.exporterSelector directly", target, target) - } + } + if flashExporterSelector == "" { + return fmt.Errorf("flash enabled but no Jumpstarter target mapping found for target %q; "+ + "configure OperatorConfig.spec.jumpstarter.targetMappings[%q] with selector and flashCmd, "+ + "or set flash.exporterSelector directly", target, target) } // User-specified flash command overrides OperatorConfig if userCmd := imageBuild.Spec.GetFlashCmd(); userCmd != "" {