upload: warn the user if no --arch flag is passed on upload

This mitigates the issue that a `image-builder upload` command
currently does not know the target architecture of the image
it uploads.
This commit is contained in:
Michael Vogt 2025-06-03 12:35:40 +02:00 committed by Achilleas Koutsou
parent 2c017fc630
commit 03613a3fb3
3 changed files with 34 additions and 13 deletions

View file

@ -335,7 +335,7 @@ func cmdBuild(cmd *cobra.Command, args []string) error {
} }
bootMode := res.ImgType.BootMode() bootMode := res.ImgType.BootMode()
uploader, err := uploaderFor(cmd, res.ImgType.Name(), &bootMode) uploader, err := uploaderFor(cmd, res.ImgType.Name(), res.ImgType.Arch().Name(), &bootMode)
if errors.Is(err, ErrUploadTypeUnsupported) || errors.Is(err, ErrUploadConfigNotProvided) { if errors.Is(err, ErrUploadTypeUnsupported) || errors.Is(err, ErrUploadConfigNotProvided) {
err = nil err = nil
} }

View file

@ -11,6 +11,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/osbuild/image-builder-cli/pkg/progress" "github.com/osbuild/image-builder-cli/pkg/progress"
"github.com/osbuild/images/pkg/arch"
"github.com/osbuild/images/pkg/cloud" "github.com/osbuild/images/pkg/cloud"
"github.com/osbuild/images/pkg/cloud/awscloud" "github.com/osbuild/images/pkg/cloud/awscloud"
"github.com/osbuild/images/pkg/platform" "github.com/osbuild/images/pkg/platform"
@ -62,17 +63,17 @@ func uploaderCheckWithProgress(pbar progress.ProgressBar, uploader cloud.Uploade
return uploader.Check(pw) return uploader.Check(pw)
} }
func uploaderFor(cmd *cobra.Command, typeOrCloud string, bootMode *platform.BootMode) (cloud.Uploader, error) { func uploaderFor(cmd *cobra.Command, typeOrCloud string, targetArch string, bootMode *platform.BootMode) (cloud.Uploader, error) {
switch typeOrCloud { switch typeOrCloud {
case "ami", "aws": case "ami", "aws":
return uploaderForCmdAWS(cmd, bootMode) return uploaderForCmdAWS(cmd, targetArch, bootMode)
default: default:
return nil, fmt.Errorf("%w: %q", ErrUploadTypeUnsupported, typeOrCloud) return nil, fmt.Errorf("%w: %q", ErrUploadTypeUnsupported, typeOrCloud)
} }
} }
func uploaderForCmdAWS(cmd *cobra.Command, bootMode *platform.BootMode) (cloud.Uploader, error) { func uploaderForCmdAWS(cmd *cobra.Command, targetArch string, bootMode *platform.BootMode) (cloud.Uploader, error) {
amiName, err := cmd.Flags().GetString("aws-ami-name") amiName, err := cmd.Flags().GetString("aws-ami-name")
if err != nil { if err != nil {
return nil, err return nil, err
@ -85,10 +86,6 @@ func uploaderForCmdAWS(cmd *cobra.Command, bootMode *platform.BootMode) (cloud.U
if err != nil { if err != nil {
return nil, err return nil, err
} }
targetArch, err := cmd.Flags().GetString("arch")
if err != nil {
return nil, err
}
if bootMode == nil { if bootMode == nil {
// If unset, default to BOOT_HYBIRD which translated // If unset, default to BOOT_HYBIRD which translated
// to "uefi-prefered" when registering the image. // to "uefi-prefered" when registering the image.
@ -127,6 +124,8 @@ func uploaderForCmdAWS(cmd *cobra.Command, bootMode *platform.BootMode) (cloud.U
} }
func cmdUpload(cmd *cobra.Command, args []string) error { func cmdUpload(cmd *cobra.Command, args []string) error {
imagePath := args[0]
uploadTo, err := cmd.Flags().GetString("to") uploadTo, err := cmd.Flags().GetString("to")
if err != nil { if err != nil {
return err return err
@ -135,8 +134,18 @@ func cmdUpload(cmd *cobra.Command, args []string) error {
return fmt.Errorf("missing --to parameter, try --to=aws") return fmt.Errorf("missing --to parameter, try --to=aws")
} }
imagePath := args[0] targetArch, err := cmd.Flags().GetString("arch")
uploader, err := uploaderFor(cmd, uploadTo, nil) if err != nil {
return err
}
if targetArch == "" {
// we could try to inspect the image here and get a
// better guess
targetArch = arch.Current().String()
fmt.Fprintf(osStderr, "WARNING: no upload architecture specified, using %q (use --arch to override)\n", targetArch)
}
uploader, err := uploaderFor(cmd, uploadTo, targetArch, nil)
if err != nil { if err != nil {
return err return err
} }

View file

@ -12,6 +12,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/osbuild/images/pkg/arch"
"github.com/osbuild/images/pkg/cloud" "github.com/osbuild/images/pkg/cloud"
"github.com/osbuild/images/pkg/cloud/awscloud" "github.com/osbuild/images/pkg/cloud/awscloud"
"github.com/osbuild/images/pkg/platform" "github.com/osbuild/images/pkg/platform"
@ -58,7 +59,7 @@ func TestUploadWithAWSMock(t *testing.T) {
targetArchArg string targetArchArg string
expectedUploadArch string expectedUploadArch string
}{ }{
{"", ""}, {"", "x86_64"},
{"aarch64", "aarch64"}, {"aarch64", "aarch64"},
} { } {
var fa fakeAwsUploader var fa fakeAwsUploader
@ -71,9 +72,11 @@ func TestUploadWithAWSMock(t *testing.T) {
}) })
defer restore() defer restore()
var fakeStdout bytes.Buffer var fakeStdout, fakeStderr bytes.Buffer
restore = main.MockOsStdout(&fakeStdout) restore = main.MockOsStdout(&fakeStdout)
defer restore() defer restore()
restore = main.MockOsStderr(&fakeStderr)
defer restore()
restore = main.MockOsArgs([]string{ restore = main.MockOsArgs([]string{
"upload", "upload",
@ -100,10 +103,19 @@ func TestUploadWithAWSMock(t *testing.T) {
assert.Equal(t, fakeDiskContent, fa.uploadAndRegisterRead.String()) assert.Equal(t, fakeDiskContent, fa.uploadAndRegisterRead.String())
// progress was rendered // progress was rendered
assert.Contains(t, fakeStdout.String(), "--] 100.00%") assert.Contains(t, fakeStdout.String(), "--] 100.00%")
// warning was passed
if tc.targetArchArg == "" {
assert.Equal(t, fakeStderr.String(), `WARNING: no upload architecture specified, using "x86_64" (use --arch to override)`+"\n")
}
} }
} }
func TestUploadCmdlineErrors(t *testing.T) { func TestUploadCmdlineErrors(t *testing.T) {
var fakeStderr bytes.Buffer
restore := main.MockOsStderr(&fakeStderr)
defer restore()
for _, tc := range []struct { for _, tc := range []struct {
cmdline []string cmdline []string
expectedErr string expectedErr string
@ -183,7 +195,7 @@ func TestBuildAndUploadWithAWSMock(t *testing.T) {
assert.Equal(t, bucketName, "aws-bucket-2") assert.Equal(t, bucketName, "aws-bucket-2")
assert.Equal(t, amiName, "aws-ami-3") assert.Equal(t, amiName, "aws-ami-3")
expectedBootMode := platform.BOOT_HYBRID expectedBootMode := platform.BOOT_HYBRID
assert.Equal(t, &awscloud.UploaderOptions{BootMode: &expectedBootMode}, uploadOpts) assert.Equal(t, &awscloud.UploaderOptions{BootMode: &expectedBootMode, TargetArch: arch.Current().String()}, uploadOpts)
assert.Equal(t, 1, fa.checkCalls) assert.Equal(t, 1, fa.checkCalls)
assert.Equal(t, 1, fa.uploadAndRegisterCalls) assert.Equal(t, 1, fa.uploadAndRegisterCalls)
assert.Equal(t, "fake-img-raw\n", fa.uploadAndRegisterRead.String()) assert.Equal(t, "fake-img-raw\n", fa.uploadAndRegisterRead.String())