[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