diff --git a/bib/cmd/bootc-image-builder/export_test.go b/bib/cmd/bootc-image-builder/export_test.go index 8dcbaef91..e174182c0 100644 --- a/bib/cmd/bootc-image-builder/export_test.go +++ b/bib/cmd/bootc-image-builder/export_test.go @@ -1,10 +1,16 @@ package main +import ( + "github.com/osbuild/images/pkg/cloud" + "github.com/osbuild/images/pkg/cloud/awscloud" +) + var ( CanChownInPath = canChownInPath GetDistroAndRunner = getDistroAndRunner CreateRand = createRand BuildCobraCmdline = buildCobraCmdline + HandleAWSFlags = handleAWSFlags ) func MockOsGetuid(new func() int) (restore func()) { @@ -22,3 +28,11 @@ func MockOsReadFile(new func(string) ([]byte, error)) (restore func()) { osReadFile = saved } } + +func MockAwscloudNewUploader(f func(string, string, string, *awscloud.UploaderOptions) (cloud.Uploader, error)) (restore func()) { + saved := awscloudNewUploader + awscloudNewUploader = f + return func() { + awscloudNewUploader = saved + } +} diff --git a/bib/cmd/bootc-image-builder/main.go b/bib/cmd/bootc-image-builder/main.go index a4191ea14..a295bbde9 100644 --- a/bib/cmd/bootc-image-builder/main.go +++ b/bib/cmd/bootc-image-builder/main.go @@ -216,6 +216,8 @@ func cmdManifest(cmd *cobra.Command, args []string) error { return nil } +var awscloudNewUploader = awscloud.NewUploader + func handleAWSFlags(cmd *cobra.Command) (cloud.Uploader, error) { imgTypes, _ := cmd.Flags().GetStringArray("type") region, _ := cmd.Flags().GetString("aws-region") @@ -230,7 +232,6 @@ func handleAWSFlags(cmd *cobra.Command) (cloud.Uploader, error) { return nil, fmt.Errorf("aws flags set for non-ami image type (type is set to %s)", strings.Join(imgTypes, ",")) } - // check as many permission prerequisites as possible before starting targetArch := arch.Current() if targetArchStr != "" { var err error @@ -242,7 +243,7 @@ func handleAWSFlags(cmd *cobra.Command) (cloud.Uploader, error) { uploaderOpts := &awscloud.UploaderOptions{ TargetArch: targetArch, } - uploader, err := awscloud.NewUploader(region, bucketName, imageName, uploaderOpts) + uploader, err := awscloudNewUploader(region, bucketName, imageName, uploaderOpts) if err != nil { return nil, err } @@ -250,6 +251,7 @@ func handleAWSFlags(cmd *cobra.Command) (cloud.Uploader, error) { if logrus.GetLevel() >= logrus.InfoLevel { status = os.Stderr } + // check as many permission prerequisites as possible before starting if err := uploader.Check(status); err != nil { return nil, err } diff --git a/bib/cmd/bootc-image-builder/main_test.go b/bib/cmd/bootc-image-builder/main_test.go index 9ee0b9333..90abd7c09 100644 --- a/bib/cmd/bootc-image-builder/main_test.go +++ b/bib/cmd/bootc-image-builder/main_test.go @@ -1,7 +1,9 @@ package main_test import ( + "bytes" "fmt" + "io" "os" "strings" "testing" @@ -12,6 +14,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/osbuild/images/pkg/arch" + "github.com/osbuild/images/pkg/cloud" + "github.com/osbuild/images/pkg/cloud/awscloud" + main "github.com/osbuild/bootc-image-builder/bib/cmd/bootc-image-builder" ) @@ -159,3 +165,68 @@ func TestCobraCmdlineVerbose(t *testing.T) { }) } } + +type fakeAwsUploader struct { + checkCalls int + + region, bucket, ami string + opts *awscloud.UploaderOptions + + uploadAndRegisterRead bytes.Buffer + uploadAndRegisterCalls int + uploadAndRegisterErr error +} + +var _ = cloud.Uploader(&fakeAwsUploader{}) + +func (fa *fakeAwsUploader) Check(status io.Writer) error { + fa.checkCalls++ + return nil +} + +func (fa *fakeAwsUploader) UploadAndRegister(r io.Reader, size uint64, status io.Writer) error { + fa.uploadAndRegisterCalls++ + _, err := io.Copy(&fa.uploadAndRegisterRead, r) + if err != nil { + panic(err) + } + return fa.uploadAndRegisterErr +} + +func TestHandleAWSFlags(t *testing.T) { + for _, tc := range []struct { + extraArgs []string + expectedOpts *awscloud.UploaderOptions + }{ + {nil, &awscloud.UploaderOptions{TargetArch: arch.Current()}}, + {[]string{"--target-arch=aarch64"}, &awscloud.UploaderOptions{TargetArch: arch.ARCH_AARCH64}}, + } { + var fau fakeAwsUploader + t.Cleanup(main.MockAwscloudNewUploader(func(region string, bucket string, ami string, opts *awscloud.UploaderOptions) (cloud.Uploader, error) { + fau.region = region + fau.bucket = bucket + fau.ami = ami + fau.opts = opts + return &fau, nil + })) + + rootCmd, err := main.BuildCobraCmdline() + assert.NoError(t, err) + // Commands() returns commandsordered by name + buildCmd := rootCmd.Commands()[0] + assert.Equal(t, "build", buildCmd.Name()) + err = buildCmd.ParseFlags(append([]string{ + "--aws-bucket=aws-bucket", + "--aws-ami-name=aws-ami-name", + "--aws-region=aws-region", + "--type=ami", + }, tc.extraArgs...)) + assert.NoError(t, err) + + uploader, err := main.HandleAWSFlags(buildCmd) + assert.NoError(t, err) + assert.NotNil(t, uploader) + assert.Equal(t, 1, fau.checkCalls) + assert.Equal(t, tc.expectedOpts, fau.opts) + } +}