Skip to content

Commit 060ddbc

Browse files
committed
bib: integrate upload progress into overall progress
This commit improves the upload progress by integrating it with the new overall progress flow. After the building is done the upload will be part of the overall progress bar flow.
1 parent 86526a8 commit 060ddbc

File tree

4 files changed

+35
-37
lines changed

4 files changed

+35
-37
lines changed

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

+6-16
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package main
22

33
import (
4-
"github.com/cheggaaa/pb/v3"
5-
"github.com/osbuild/bootc-image-builder/bib/internal/uploader"
6-
"github.com/osbuild/images/pkg/cloud/awscloud"
74
"github.com/spf13/pflag"
5+
6+
"github.com/osbuild/images/pkg/cloud/awscloud"
7+
8+
"github.com/osbuild/bootc-image-builder/bib/internal/progress"
9+
"github.com/osbuild/bootc-image-builder/bib/internal/uploader"
810
)
911

10-
func uploadAMI(path, targetArch string, flags *pflag.FlagSet) error {
12+
func uploadAMI(pbar progress.ProgressBar, path, targetArch string, flags *pflag.FlagSet) error {
1113
region, err := flags.GetString("aws-region")
1214
if err != nil {
1315
return err
@@ -20,23 +22,11 @@ func uploadAMI(path, targetArch string, flags *pflag.FlagSet) error {
2022
if err != nil {
2123
return err
2224
}
23-
progress, err := flags.GetString("progress")
24-
if err != nil {
25-
return err
26-
}
2725

2826
client, err := awscloud.NewDefault(region)
2927
if err != nil {
3028
return err
3129
}
3230

33-
// TODO: extract this as a helper once we add "uploadAzure" or
34-
// similar. Eventually we may provide json progress here too.
35-
var pbar *pb.ProgressBar
36-
switch progress {
37-
case "", "plain", "term":
38-
pbar = pb.New(0)
39-
}
40-
4131
return uploader.UploadAndRegister(client, path, bucketName, imageName, targetArch, pbar)
4232
}

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

+3-6
Original file line numberDiff line numberDiff line change
@@ -487,16 +487,13 @@ func cmdBuild(cmd *cobra.Command, args []string) error {
487487

488488
pbar.SetMessagef("Build complete!")
489489
if upload {
490-
// XXX: pass our own progress.ProgressBar here
491-
// *for now* just stop our own progress and let the uploadAMI
492-
// progress take over - but we really need to fix this in a
493-
// followup
494-
pbar.Stop()
495490
for idx, imgType := range imgTypes {
496491
switch imgType {
497492
case "ami":
493+
pbar.Clear()
494+
pbar.SetPulseMsgf("AWS uploading step")
498495
diskpath := filepath.Join(outputDir, exports[idx], "disk.raw")
499-
if err := uploadAMI(diskpath, targetArch, cmd.Flags()); err != nil {
496+
if err := uploadAMI(pbar, diskpath, targetArch, cmd.Flags()); err != nil {
500497
return fmt.Errorf("cannot upload AMI: %w", err)
501498
}
502499
default:

bib/internal/progress/progress.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type ProgressBar interface {
4040
// SetProgress sets the progress details at the given "level".
4141
// Levels should start with "0" and increase as the nesting
4242
// gets deeper.
43-
SetProgress(level int, msg string, done int, total int) error
43+
SetProgress(level int, msg string, done int64, total int64) error
4444

4545
// The high-level message that is displayed in a spinner
4646
// that contains the current top level step, for bib this
@@ -107,7 +107,7 @@ func NewTerminalProgressBar() (ProgressBar, error) {
107107
return b, nil
108108
}
109109

110-
func (b *terminalProgressBar) SetProgress(subLevel int, msg string, done int, total int) error {
110+
func (b *terminalProgressBar) SetProgress(subLevel int, msg string, done int64, total int64) error {
111111
// auto-add as needed, requires sublevels to get added in order
112112
// i.e. adding 0 and then 2 will fail
113113
switch {
@@ -282,7 +282,7 @@ func (b *plainProgressBar) Start() {
282282
func (b *plainProgressBar) Stop() {
283283
}
284284

285-
func (b *plainProgressBar) SetProgress(subLevel int, msg string, done int, total int) error {
285+
func (b *plainProgressBar) SetProgress(subLevel int, msg string, done int64, total int64) error {
286286
return nil
287287
}
288288

@@ -322,7 +322,7 @@ func (b *debugProgressBar) Stop() {
322322
fmt.Fprintf(b.w, "Stop progressbar\n")
323323
}
324324

325-
func (b *debugProgressBar) SetProgress(subLevel int, msg string, done int, total int) error {
325+
func (b *debugProgressBar) SetProgress(subLevel int, msg string, done int64, total int64) error {
326326
fmt.Fprintf(b.w, "%s[%v / %v] %s", strings.Repeat(" ", subLevel), done, total, msg)
327327
fmt.Fprintf(b.w, "\n")
328328
return nil
@@ -398,7 +398,7 @@ func runOSBuildWithProgress(pb ProgressBar, manifest []byte, store, outputDirect
398398
}
399399
i := 0
400400
for p := st.Progress; p != nil; p = p.SubProgress {
401-
if err := pb.SetProgress(i, p.Message, p.Done, p.Total); err != nil {
401+
if err := pb.SetProgress(i, p.Message, int64(p.Done), int64(p.Total)); err != nil {
402402
logrus.Warnf("cannot set progress: %v", err)
403403
}
404404
i++

bib/internal/uploader/aws.go

+21-10
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import (
99
"github.com/aws/aws-sdk-go/aws"
1010
"github.com/aws/aws-sdk-go/service/ec2"
1111
"github.com/aws/aws-sdk-go/service/s3/s3manager"
12-
"github.com/cheggaaa/pb/v3"
1312
"github.com/google/uuid"
1413

1514
"github.com/osbuild/images/pkg/arch"
15+
16+
"github.com/osbuild/bootc-image-builder/bib/internal/progress"
1617
)
1718

1819
var osStdout io.Writer = os.Stdout
@@ -22,7 +23,21 @@ type AwsUploader interface {
2223
Register(name, bucket, key string, shareWith []string, rpmArch string, bootMode, importRole *string) (*string, *string, error)
2324
}
2425

25-
func doUpload(a AwsUploader, file *os.File, bucketName, keyName string, pbar *pb.ProgressBar) (*s3manager.UploadOutput, error) {
26+
type proxyReader struct {
27+
subLevel int
28+
r io.Reader
29+
pbar progress.ProgressBar
30+
done, total int64
31+
}
32+
33+
func (r *proxyReader) Read(p []byte) (int, error) {
34+
n, err := r.r.Read(p)
35+
r.done += int64(n)
36+
r.pbar.SetProgress(r.subLevel, "Uploading", r.done, r.total)
37+
return n, err
38+
}
39+
40+
func doUpload(a AwsUploader, file *os.File, bucketName, keyName string, pbar progress.ProgressBar) (*s3manager.UploadOutput, error) {
2641
var r io.Reader = file
2742

2843
// TODO: extract this as a helper once we add "uploadAzure" or
@@ -32,26 +47,22 @@ func doUpload(a AwsUploader, file *os.File, bucketName, keyName string, pbar *pb
3247
if err != nil {
3348
return nil, fmt.Errorf("cannot stat upload: %v", err)
3449
}
35-
pbar.SetTotal(st.Size())
36-
pbar.Set(pb.Bytes, true)
37-
pbar.SetWriter(osStdout)
38-
r = pbar.NewProxyReader(file)
39-
pbar.Start()
40-
defer pbar.Finish()
50+
pbar.SetMessagef("Uploading %s to %s", file.Name(), bucketName)
51+
r = &proxyReader{0, file, pbar, 0, st.Size()}
4152
}
4253

4354
return a.UploadFromReader(r, bucketName, keyName)
4455
}
4556

46-
func UploadAndRegister(a AwsUploader, filename, bucketName, imageName, targetArch string, pbar *pb.ProgressBar) error {
57+
func UploadAndRegister(a AwsUploader, filename, bucketName, imageName, targetArch string, pbar progress.ProgressBar) error {
4758
file, err := os.Open(filename)
4859
if err != nil {
4960
return fmt.Errorf("cannot upload: %v", err)
5061
}
5162
defer file.Close()
5263

5364
keyName := fmt.Sprintf("%s-%s", uuid.New().String(), filepath.Base(filename))
54-
fmt.Fprintf(osStdout, "Uploading %s to %s:%s\n", filename, bucketName, keyName)
65+
pbar.SetMessagef("Uploading %s to %s:%s\n", filename, bucketName, keyName)
5566
uploadOutput, err := doUpload(a, file, bucketName, keyName, pbar)
5667
if err != nil {
5768
return err

0 commit comments

Comments
 (0)