Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions bib/cmd/bootc-image-builder/export_test.go
Original file line number Diff line number Diff line change
@@ -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()) {
Expand All @@ -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
}
}
6 changes: 4 additions & 2 deletions bib/cmd/bootc-image-builder/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,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")
Expand All @@ -232,7 +234,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
Expand All @@ -244,14 +245,15 @@ 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
}
status := io.Discard
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
}
Expand Down
71 changes: 71 additions & 0 deletions bib/cmd/bootc-image-builder/main_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package main_test

import (
"bytes"
"fmt"
"io"
"os"
"strings"
"testing"
Expand All @@ -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"
)

Expand Down Expand Up @@ -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, 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)
}
}
Loading