Skip to content

Commit 7e99eb6

Browse files
authored
Merge pull request #1695 from AkihiroSuda/vz-progressbar
vz: show progressbar during converting qcow2 to raw
2 parents 4a77a5f + 4cd4ce7 commit 7e99eb6

File tree

4 files changed

+60
-32
lines changed

4 files changed

+60
-32
lines changed

pkg/downloader/downloader.go

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,24 @@ import (
1212
"path"
1313
"path/filepath"
1414
"strings"
15-
"time"
1615

1716
"github.com/cheggaaa/pb/v3"
1817
"github.com/containerd/continuity/fs"
1918
"github.com/lima-vm/lima/pkg/localpathutil"
20-
"github.com/mattn/go-isatty"
19+
"github.com/lima-vm/lima/pkg/progressbar"
2120
"github.com/opencontainers/go-digest"
2221
"github.com/sirupsen/logrus"
2322
)
2423

24+
// HideProgress is used only for testing
2525
var HideProgress bool
2626

27+
// hideBar is used only for testing
28+
func hideBar(bar *pb.ProgressBar) {
29+
bar.Set(pb.ReturnSymbol, "")
30+
bar.SetTemplateString("")
31+
}
32+
2733
type Status = string
2834

2935
const (
@@ -320,10 +326,13 @@ func decompressLocal(dst, src, ext string, description string) error {
320326
if err != nil {
321327
return err
322328
}
323-
bar, err := createBar(st.Size())
329+
bar, err := progressbar.New(st.Size())
324330
if err != nil {
325331
return err
326332
}
333+
if HideProgress {
334+
hideBar(bar)
335+
}
327336

328337
in, err := os.Open(src)
329338
if err != nil {
@@ -384,30 +393,6 @@ func validateLocalFileDigest(localPath string, expectedDigest digest.Digest) err
384393
return nil
385394
}
386395

387-
func createBar(size int64) (*pb.ProgressBar, error) {
388-
bar := pb.New64(size)
389-
390-
bar.Set(pb.Bytes, true)
391-
if isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) {
392-
bar.SetTemplateString(`{{counters . }} {{bar . | green }} {{percent .}} {{speed . "%s/s"}}`)
393-
bar.SetRefreshRate(200 * time.Millisecond)
394-
} else if HideProgress {
395-
bar.Set(pb.ReturnSymbol, "")
396-
bar.SetTemplateString("")
397-
} else {
398-
bar.Set(pb.Terminal, false)
399-
bar.Set(pb.ReturnSymbol, "\n")
400-
bar.SetTemplateString(`{{counters . }} ({{percent .}}) {{speed . "%s/s"}}`)
401-
bar.SetRefreshRate(5 * time.Second)
402-
}
403-
bar.SetWidth(80)
404-
if err := bar.Err(); err != nil {
405-
return nil, err
406-
}
407-
408-
return bar, nil
409-
}
410-
411396
func downloadHTTP(localPath, url string, description string, expectedDigest digest.Digest) error {
412397
if localPath == "" {
413398
return fmt.Errorf("downloadHTTP: got empty localPath")
@@ -431,10 +416,13 @@ func downloadHTTP(localPath, url string, description string, expectedDigest dige
431416
if resp.StatusCode != http.StatusOK {
432417
return fmt.Errorf("expected HTTP status %d, got %s", http.StatusOK, resp.Status)
433418
}
434-
bar, err := createBar(resp.ContentLength)
419+
bar, err := progressbar.New(resp.ContentLength)
435420
if err != nil {
436421
return err
437422
}
423+
if HideProgress {
424+
hideBar(bar)
425+
}
438426

439427
writers := []io.Writer{fileWriter}
440428
var digester digest.Digester

pkg/nativeimgutil/nativeimgutil.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import (
1010
"path/filepath"
1111

1212
"github.com/containerd/continuity/fs"
13+
"github.com/docker/go-units"
1314
"github.com/lima-vm/go-qcow2reader"
1415
"github.com/lima-vm/go-qcow2reader/image/qcow2"
1516
"github.com/lima-vm/go-qcow2reader/image/raw"
1617
"github.com/lima-vm/lima/pkg/osutil"
18+
"github.com/lima-vm/lima/pkg/progressbar"
1719
"github.com/sirupsen/logrus"
1820
)
1921

@@ -33,6 +35,7 @@ func ConvertToRaw(source, dest string, size *int64, allowSourceWithBackingFile b
3335
if size != nil && *size < srcImg.Size() {
3436
return fmt.Errorf("specified size %d is smaller than the original image size (%d) of %q", *size, srcImg.Size(), source)
3537
}
38+
logrus.Infof("Converting %q (%s) to a raw disk %q", source, srcImg.Type(), dest)
3639
switch t := srcImg.Type(); t {
3740
case raw.Type:
3841
if err = srcF.Close(); err != nil {
@@ -67,13 +70,21 @@ func ConvertToRaw(source, dest string, size *int64, allowSourceWithBackingFile b
6770

6871
// Copy
6972
srcImgR := io.NewSectionReader(srcImg, 0, srcImg.Size())
73+
bar, err := progressbar.New(srcImg.Size())
74+
if err != nil {
75+
return err
76+
}
7077
const bufSize = 1024 * 1024
71-
if copied, err := copySparse(destTmpF, srcImgR, bufSize); err != nil {
78+
bar.Start()
79+
copied, err := copySparse(destTmpF, bar.NewProxyReader(srcImgR), bufSize)
80+
bar.Finish()
81+
if err != nil {
7282
return fmt.Errorf("failed to call copySparse(), bufSize=%d, copied=%d: %w", bufSize, copied, err)
7383
}
7484

7585
// Resize
7686
if size != nil {
87+
logrus.Infof("Expanding to %s", units.BytesSize(float64(*size)))
7788
if err = MakeSparse(destTmpF, *size); err != nil {
7889
return err
7990
}
@@ -97,6 +108,7 @@ func convertRawToRaw(source, dest string, size *int64) error {
97108
}
98109
}
99110
if size != nil {
111+
logrus.Infof("Expanding to %s", units.BytesSize(float64(*size)))
100112
destF, err := os.OpenFile(dest, os.O_RDWR, 0644)
101113
if err != nil {
102114
return err

pkg/progressbar/progressbar.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package progressbar
2+
3+
import (
4+
"os"
5+
"time"
6+
7+
"github.com/cheggaaa/pb/v3"
8+
"github.com/mattn/go-isatty"
9+
)
10+
11+
func New(size int64) (*pb.ProgressBar, error) {
12+
bar := pb.New64(size)
13+
14+
bar.Set(pb.Bytes, true)
15+
if isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) {
16+
bar.SetTemplateString(`{{counters . }} {{bar . | green }} {{percent .}} {{speed . "%s/s"}}`)
17+
bar.SetRefreshRate(200 * time.Millisecond)
18+
} else {
19+
bar.Set(pb.Terminal, false)
20+
bar.Set(pb.ReturnSymbol, "\n")
21+
bar.SetTemplateString(`{{counters . }} ({{percent .}}) {{speed . "%s/s"}}`)
22+
bar.SetRefreshRate(5 * time.Second)
23+
}
24+
bar.SetWidth(80)
25+
if err := bar.Err(); err != nil {
26+
return nil, err
27+
}
28+
29+
return bar, nil
30+
}

pkg/vz/disk.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/lima-vm/lima/pkg/iso9660util"
1313
"github.com/lima-vm/lima/pkg/nativeimgutil"
1414
"github.com/lima-vm/lima/pkg/store/filenames"
15-
"github.com/sirupsen/logrus"
1615
)
1716

1817
func EnsureDisk(driver *driver.BaseDriver) error {
@@ -58,9 +57,8 @@ func EnsureDisk(driver *driver.BaseDriver) error {
5857
}
5958
return diffDiskF.Close()
6059
}
61-
logrus.Infof("Converting %q to a raw disk %q (size=%d)", baseDisk, diffDisk, diskSize)
6260
if err = nativeimgutil.ConvertToRaw(baseDisk, diffDisk, &diskSize, false); err != nil {
63-
return fmt.Errorf("failed to convert %q to a raw disk %q (size=%d): %w", baseDisk, diffDisk, diskSize, err)
61+
return fmt.Errorf("failed to convert %q to a raw disk %q: %w", baseDisk, diffDisk, err)
6462
}
6563
return err
6664
}

0 commit comments

Comments
 (0)