Skip to content

Commit 2b4f7e6

Browse files
committed
main: add regression test for aws upload target arch error
This is a regression test to ensure the commandline handling of aws upload is correct. Its a followup for #1030
1 parent c30e301 commit 2b4f7e6

File tree

3 files changed

+87
-2
lines changed

3 files changed

+87
-2
lines changed

bib/cmd/bootc-image-builder/export_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package main
22

3+
import (
4+
"github.com/osbuild/images/pkg/cloud"
5+
"github.com/osbuild/images/pkg/cloud/awscloud"
6+
)
7+
38
var (
49
CanChownInPath = canChownInPath
510
CheckFilesystemCustomizations = checkFilesystemCustomizations
@@ -11,6 +16,7 @@ var (
1116
CreateRand = createRand
1217
BuildCobraCmdline = buildCobraCmdline
1318
CalcRequiredDirectorySizes = calcRequiredDirectorySizes
19+
HandleAWSFlags = handleAWSFlags
1420
)
1521

1622
func MockOsGetuid(new func() int) (restore func()) {
@@ -28,3 +34,11 @@ func MockOsReadFile(new func(string) ([]byte, error)) (restore func()) {
2834
osReadFile = saved
2935
}
3036
}
37+
38+
func MockAwscloudNewUploader(f func(string, string, string, *awscloud.UploaderOptions) (cloud.Uploader, error)) (restore func()) {
39+
saved := awscloudNewUploader
40+
awscloudNewUploader = f
41+
return func() {
42+
awscloudNewUploader = saved
43+
}
44+
}

bib/cmd/bootc-image-builder/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,8 @@ func cmdManifest(cmd *cobra.Command, args []string) error {
371371
return nil
372372
}
373373

374+
var awscloudNewUploader = awscloud.NewUploader
375+
374376
func handleAWSFlags(cmd *cobra.Command) (cloud.Uploader, error) {
375377
imgTypes, _ := cmd.Flags().GetStringArray("type")
376378
region, _ := cmd.Flags().GetString("aws-region")
@@ -385,7 +387,6 @@ func handleAWSFlags(cmd *cobra.Command) (cloud.Uploader, error) {
385387
return nil, fmt.Errorf("aws flags set for non-ami image type (type is set to %s)", strings.Join(imgTypes, ","))
386388
}
387389

388-
// check as many permission prerequisites as possible before starting
389390
targetArch := arch.Current()
390391
if targetArchStr != "" {
391392
var err error
@@ -397,14 +398,15 @@ func handleAWSFlags(cmd *cobra.Command) (cloud.Uploader, error) {
397398
uploaderOpts := &awscloud.UploaderOptions{
398399
TargetArch: targetArch,
399400
}
400-
uploader, err := awscloud.NewUploader(region, bucketName, imageName, uploaderOpts)
401+
uploader, err := awscloudNewUploader(region, bucketName, imageName, uploaderOpts)
401402
if err != nil {
402403
return nil, err
403404
}
404405
status := io.Discard
405406
if logrus.GetLevel() >= logrus.InfoLevel {
406407
status = os.Stderr
407408
}
409+
// check as many permission prerequisites as possible before starting
408410
if err := uploader.Check(status); err != nil {
409411
return nil, err
410412
}

bib/cmd/bootc-image-builder/main_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package main_test
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"errors"
67
"fmt"
8+
"io"
79
"os"
810
"strings"
911
"testing"
@@ -17,6 +19,8 @@ import (
1719
"github.com/osbuild/blueprint/pkg/blueprint"
1820
"github.com/osbuild/images/pkg/arch"
1921
"github.com/osbuild/images/pkg/bib/osinfo"
22+
"github.com/osbuild/images/pkg/cloud"
23+
"github.com/osbuild/images/pkg/cloud/awscloud"
2024
"github.com/osbuild/images/pkg/container"
2125
"github.com/osbuild/images/pkg/dnfjson"
2226
"github.com/osbuild/images/pkg/manifest"
@@ -631,3 +635,68 @@ func TestCobraCmdlineVerbose(t *testing.T) {
631635
})
632636
}
633637
}
638+
639+
type fakeAwsUploader struct {
640+
checkCalls int
641+
642+
region, bucket, ami string
643+
opts *awscloud.UploaderOptions
644+
645+
uploadAndRegisterRead bytes.Buffer
646+
uploadAndRegisterCalls int
647+
uploadAndRegisterErr error
648+
}
649+
650+
var _ = cloud.Uploader(&fakeAwsUploader{})
651+
652+
func (fa *fakeAwsUploader) Check(status io.Writer) error {
653+
fa.checkCalls++
654+
return nil
655+
}
656+
657+
func (fa *fakeAwsUploader) UploadAndRegister(r io.Reader, status io.Writer) error {
658+
fa.uploadAndRegisterCalls++
659+
_, err := io.Copy(&fa.uploadAndRegisterRead, r)
660+
if err != nil {
661+
panic(err)
662+
}
663+
return fa.uploadAndRegisterErr
664+
}
665+
666+
func TestHandleAWSFlags(t *testing.T) {
667+
668+
for _, tc := range []struct {
669+
extraArgs []string
670+
expectedOpts *awscloud.UploaderOptions
671+
}{
672+
{nil, &awscloud.UploaderOptions{TargetArch: arch.Current()}},
673+
{[]string{"--target-arch=aarch64"}, &awscloud.UploaderOptions{TargetArch: arch.ARCH_AARCH64}},
674+
} {
675+
var fau fakeAwsUploader
676+
t.Cleanup(main.MockAwscloudNewUploader(func(region string, bucket string, ami string, opts *awscloud.UploaderOptions) (cloud.Uploader, error) {
677+
fau.region = region
678+
fau.bucket = bucket
679+
fau.ami = ami
680+
fau.opts = opts
681+
return &fau, nil
682+
}))
683+
684+
rootCmd, err := main.BuildCobraCmdline()
685+
assert.NoError(t, err)
686+
// Commands() returns commandsordered by name
687+
buildCmd := rootCmd.Commands()[0]
688+
assert.Equal(t, "build", buildCmd.Name())
689+
buildCmd.ParseFlags(append([]string{
690+
"--aws-bucket=aws-bucket",
691+
"--aws-ami-name=aws-ami-name",
692+
"--aws-region=aws-region",
693+
"--type=ami",
694+
}, tc.extraArgs...))
695+
696+
uploader, err := main.HandleAWSFlags(buildCmd)
697+
assert.NoError(t, err)
698+
assert.NotNil(t, uploader)
699+
assert.Equal(t, 1, fau.checkCalls)
700+
assert.Equal(t, tc.expectedOpts, fau.opts)
701+
}
702+
}

0 commit comments

Comments
 (0)