[lxc-devel] [lxd/master] Fix progress tracking (and add publish tracking)
stgraber on Github
lxc-bot at linuxcontainers.org
Mon Feb 18 21:33:38 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190218/993fa547/attachment-0001.bin>
-------------- next part --------------
From b4271b09f6a9f900ff2dd62901bbf31bae46e845 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 18 Feb 2019 16:19:34 -0500
Subject: [PATCH 1/3] shared: Tweak progress metadata
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
shared/util.go | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/shared/util.go b/shared/util.go
index 792e49dd67..6ff230361e 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -1008,15 +1008,29 @@ func EscapePathFstab(path string) string {
return r.Replace(path)
}
-func SetProgressMetadata(metadata map[string]interface{}, stage, displayPrefix string, percent, speed int64) {
+func SetProgressMetadata(metadata map[string]interface{}, stage, displayPrefix string, percent, processed, speed int64) {
progress := make(map[string]string)
// stage, percent, speed sent for API callers.
progress["stage"] = stage
- progress["percent"] = strconv.FormatInt(percent, 10)
+ if processed > 0 {
+ progress["processed"] = strconv.FormatInt(processed, 10)
+ }
+
+ if percent > 0 {
+ progress["percent"] = strconv.FormatInt(percent, 10)
+ }
+
progress["speed"] = strconv.FormatInt(speed, 10)
metadata["progress"] = progress
+
// <stage>_progress with formatted text sent for lxc cli.
- metadata[stage+"_progress"] = fmt.Sprintf("%s: %d%% (%s/s)", displayPrefix, percent, GetByteSizeString(speed, 2))
+ if percent > 0 {
+ metadata[stage+"_progress"] = fmt.Sprintf("%s: %d%% (%s/s)", displayPrefix, percent, GetByteSizeString(speed, 2))
+ } else if processed > 0 {
+ metadata[stage+"_progress"] = fmt.Sprintf("%s: %s (%s/s)", displayPrefix, GetByteSizeString(processed, 2), GetByteSizeString(speed, 2))
+ } else {
+ metadata[stage+"_progress"] = fmt.Sprintf("%s: %s/s", displayPrefix, GetByteSizeString(speed, 2))
+ }
}
func DownloadFileHash(httpClient *http.Client, useragent string, progress func(progress ioprogress.ProgressData), canceler *cancel.Canceler, filename string, url string, hash string, hashFunc hash.Hash, target io.WriteSeeker) (int64, error) {
From c13a4858cc36abf306d0d8a585f6d30d75186254 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 18 Feb 2019 16:19:45 -0500
Subject: [PATCH 2/3] lxd: Set correct progress data for backup/publish
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes #5503
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/containers_post.go | 4 ++--
lxd/images.go | 15 +++++++++++++--
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/lxd/containers_post.go b/lxd/containers_post.go
index 8a4edc70bd..0699a1d8e1 100644
--- a/lxd/containers_post.go
+++ b/lxd/containers_post.go
@@ -131,8 +131,8 @@ func createFromImage(d *Daemon, project string, req *api.ContainersPost) Respons
metadata := make(map[string]interface{})
_, err = containerCreateFromImage(d, args, info.Fingerprint, &ioprogress.ProgressTracker{
- Handler: func(percent, speed int64) {
- shared.SetProgressMetadata(metadata, "create_container_from_image_unpack", "Unpack", percent, speed)
+ Handler: func(processed, speed int64) {
+ shared.SetProgressMetadata(metadata, "create_container_from_image_unpack", "Unpack", 0, processed, speed)
op.UpdateMetadata(metadata)
}})
return err
diff --git a/lxd/images.go b/lxd/images.go
index 062c04ca59..067db8e455 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -198,6 +198,7 @@ func imgPostContInfo(d *Daemon, r *http.Request, req api.ImagesPost, op *operati
if err == nil {
totalSize += fi.Size()
}
+
return nil
}
@@ -210,8 +211,18 @@ func imgPostContInfo(d *Daemon, r *http.Request, req api.ImagesPost, op *operati
metadata := make(map[string]interface{})
imageProgressWriter := &ioprogress.ProgressWriter{
Tracker: &ioprogress.ProgressTracker{
- Handler: func(percent, speed int64) {
- shared.SetProgressMetadata(metadata, "create_image_from_container_pack", "Image pack", percent, speed)
+ Handler: func(value, speed int64) {
+ percent := int64(0)
+ processed := int64(0)
+
+ if totalSize > 0 {
+ percent = value
+ processed = totalSize * (percent / 100.0)
+ } else {
+ processed = value
+ }
+
+ shared.SetProgressMetadata(metadata, "create_image_from_container_pack", "Image pack", percent, processed, speed)
op.UpdateMetadata(metadata)
},
Length: totalSize,
From 89b09e2c257c92c3b5932904b048bc2f4dd54cee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 18 Feb 2019 16:32:30 -0500
Subject: [PATCH 3/3] lxc/publish: Add progress reporting
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/publish.go | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/lxc/publish.go b/lxc/publish.go
index 243c4dd9a4..bba6c5ceb4 100644
--- a/lxc/publish.go
+++ b/lxc/publish.go
@@ -7,6 +7,7 @@ import (
"github.com/spf13/cobra"
"github.com/lxc/lxd/client"
+ "github.com/lxc/lxd/lxc/utils"
"github.com/lxc/lxd/shared/api"
cli "github.com/lxc/lxd/shared/cmd"
"github.com/lxc/lxd/shared/i18n"
@@ -216,10 +217,26 @@ func (c *cmdPublish) Run(cmd *cobra.Command, args []string) error {
return err
}
- err = op.Wait()
+ // Watch the background operation
+ progress := utils.ProgressRenderer{
+ Format: i18n.G("Publishing container: %s"),
+ Quiet: c.global.flagQuiet,
+ }
+
+ _, err = op.AddHandler(progress.UpdateOp)
if err != nil {
+ progress.Done("")
return err
}
+
+ // Wait for the copy to complete
+ err = utils.CancelableWait(op, &progress)
+ if err != nil {
+ progress.Done("")
+ return err
+ }
+ progress.Done("")
+
opAPI := op.Get()
// Grab the fingerprint
More information about the lxc-devel
mailing list