image-builder: fix cross-arch uploading
This commit fixes the cross-arch uploading in the most simple case by reading the `--arch` when `image-builder build --upload` is used. Note that this is not a complete fix as it will not take boot mode into account nor will it (by default) DTRT when `image-builder upload` is used on a previously build images for a different architecture. Thanks to `FrostyX` for reporting the issue.
This commit is contained in:
parent
f4f8b557a5
commit
2996bbc0d1
3 changed files with 52 additions and 31 deletions
|
|
@ -477,6 +477,7 @@ operating systems like Fedora, CentOS and RHEL with easy customizations support.
|
||||||
uploadCmd.Flags().String("aws-ami-name", "", "name for the AMI in AWS (only for type=ami)")
|
uploadCmd.Flags().String("aws-ami-name", "", "name for the AMI in AWS (only for type=ami)")
|
||||||
uploadCmd.Flags().String("aws-bucket", "", "target S3 bucket name for intermediate storage when creating AMI (only for type=ami)")
|
uploadCmd.Flags().String("aws-bucket", "", "target S3 bucket name for intermediate storage when creating AMI (only for type=ami)")
|
||||||
uploadCmd.Flags().String("aws-region", "", "target region for AWS uploads (only for type=ami)")
|
uploadCmd.Flags().String("aws-region", "", "target region for AWS uploads (only for type=ami)")
|
||||||
|
uploadCmd.Flags().String("arch", "", "upload for the given architecture")
|
||||||
rootCmd.AddCommand(uploadCmd)
|
rootCmd.AddCommand(uploadCmd)
|
||||||
|
|
||||||
buildCmd := &cobra.Command{
|
buildCmd := &cobra.Command{
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,10 @@ func uploaderForCmdAWS(cmd *cobra.Command) (cloud.Uploader, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
targetArch, err := cmd.Flags().GetString("arch")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var missing []string
|
var missing []string
|
||||||
requiredArgs := []string{"aws-ami-name", "aws-bucket", "aws-region"}
|
requiredArgs := []string{"aws-ami-name", "aws-bucket", "aws-region"}
|
||||||
|
|
@ -103,8 +107,11 @@ func uploaderForCmdAWS(cmd *cobra.Command) (cloud.Uploader, error) {
|
||||||
|
|
||||||
return nil, fmt.Errorf("%w: %q", ErrMissingUploadConfig, missing)
|
return nil, fmt.Errorf("%w: %q", ErrMissingUploadConfig, missing)
|
||||||
}
|
}
|
||||||
|
opts := &awscloud.UploaderOptions{
|
||||||
|
TargetArch: targetArch,
|
||||||
|
}
|
||||||
|
|
||||||
return awscloudNewUploader(region, bucketName, amiName, nil)
|
return awscloudNewUploader(region, bucketName, amiName, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
func cmdUpload(cmd *cobra.Command, args []string) error {
|
func cmdUpload(cmd *cobra.Command, args []string) error {
|
||||||
|
|
|
||||||
|
|
@ -51,41 +51,54 @@ func TestUploadWithAWSMock(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
var regionName, bucketName, amiName string
|
var regionName, bucketName, amiName string
|
||||||
var fa fakeAwsUploader
|
var uploadOpts *awscloud.UploaderOptions
|
||||||
restore := main.MockAwscloudNewUploader(func(region string, bucket string, ami string, opts *awscloud.UploaderOptions) (cloud.Uploader, error) {
|
|
||||||
regionName = region
|
|
||||||
bucketName = bucket
|
|
||||||
amiName = ami
|
|
||||||
return &fa, nil
|
|
||||||
})
|
|
||||||
defer restore()
|
|
||||||
|
|
||||||
var fakeStdout bytes.Buffer
|
for _, tc := range []struct {
|
||||||
restore = main.MockOsStdout(&fakeStdout)
|
targetArchArg string
|
||||||
defer restore()
|
expectedUploadArch string
|
||||||
|
}{
|
||||||
|
{"", ""},
|
||||||
|
{"aarch64", "aarch64"},
|
||||||
|
} {
|
||||||
|
var fa fakeAwsUploader
|
||||||
|
restore := main.MockAwscloudNewUploader(func(region string, bucket string, ami string, opts *awscloud.UploaderOptions) (cloud.Uploader, error) {
|
||||||
|
regionName = region
|
||||||
|
bucketName = bucket
|
||||||
|
amiName = ami
|
||||||
|
uploadOpts = opts
|
||||||
|
return &fa, nil
|
||||||
|
})
|
||||||
|
defer restore()
|
||||||
|
|
||||||
restore = main.MockOsArgs([]string{
|
var fakeStdout bytes.Buffer
|
||||||
"upload",
|
restore = main.MockOsStdout(&fakeStdout)
|
||||||
"--to=aws",
|
defer restore()
|
||||||
"--aws-region=aws-region-1",
|
|
||||||
"--aws-bucket=aws-bucket-2",
|
|
||||||
"--aws-ami-name=aws-ami-3",
|
|
||||||
fakeImageFilePath,
|
|
||||||
})
|
|
||||||
defer restore()
|
|
||||||
|
|
||||||
err = main.Run()
|
restore = main.MockOsArgs([]string{
|
||||||
require.NoError(t, err)
|
"upload",
|
||||||
|
"--to=aws",
|
||||||
|
"--aws-region=aws-region-1",
|
||||||
|
"--aws-bucket=aws-bucket-2",
|
||||||
|
"--aws-ami-name=aws-ami-3",
|
||||||
|
"--arch=" + tc.targetArchArg,
|
||||||
|
fakeImageFilePath,
|
||||||
|
})
|
||||||
|
defer restore()
|
||||||
|
|
||||||
assert.Equal(t, regionName, "aws-region-1")
|
err = main.Run()
|
||||||
assert.Equal(t, bucketName, "aws-bucket-2")
|
require.NoError(t, err)
|
||||||
assert.Equal(t, amiName, "aws-ami-3")
|
|
||||||
|
|
||||||
assert.Equal(t, 0, fa.checkCalls)
|
assert.Equal(t, regionName, "aws-region-1")
|
||||||
assert.Equal(t, 1, fa.uploadAndRegisterCalls)
|
assert.Equal(t, bucketName, "aws-bucket-2")
|
||||||
assert.Equal(t, fakeDiskContent, fa.uploadAndRegisterRead.String())
|
assert.Equal(t, amiName, "aws-ami-3")
|
||||||
// progress was rendered
|
assert.Equal(t, &awscloud.UploaderOptions{TargetArch: tc.expectedUploadArch}, uploadOpts)
|
||||||
assert.Contains(t, fakeStdout.String(), "--] 100.00%")
|
|
||||||
|
assert.Equal(t, 0, fa.checkCalls)
|
||||||
|
assert.Equal(t, 1, fa.uploadAndRegisterCalls)
|
||||||
|
assert.Equal(t, fakeDiskContent, fa.uploadAndRegisterRead.String())
|
||||||
|
// progress was rendered
|
||||||
|
assert.Contains(t, fakeStdout.String(), "--] 100.00%")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUploadCmdlineErrors(t *testing.T) {
|
func TestUploadCmdlineErrors(t *testing.T) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue