[lxc-devel] [lxd/master] Report upload progress in image import

stgraber on Github lxc-bot at linuxcontainers.org
Tue Mar 1 05:44:20 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160301/13e1a8c3/attachment.bin>
-------------- next part --------------
From 88c4aa296479d9bab41ca9110c45873cd4344d15 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 1 Mar 2016 00:43:30 -0500
Subject: [PATCH] Report upload progress in image import
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #1610

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 client.go    | 38 +++++++++++++++++++++++++++++---------
 lxc/image.go |  9 ++++++++-
 po/lxd.pot   | 41 +++++++++++++++++++++++------------------
 3 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/client.go b/client.go
index 8d4e641..29e5d75 100644
--- a/client.go
+++ b/client.go
@@ -865,7 +865,7 @@ func (c *Client) PostImageURL(imageFile string, public bool, aliases []string) (
 	return fingerprint, nil
 }
 
-func (c *Client) PostImage(imageFile string, rootfsFile string, properties []string, public bool, aliases []string) (string, error) {
+func (c *Client) PostImage(imageFile string, rootfsFile string, properties []string, public bool, aliases []string, progressHandler func(percent int)) (string, error) {
 	uri := c.url(shared.APIVersion, "images")
 
 	var err error
@@ -873,13 +873,13 @@ func (c *Client) PostImage(imageFile string, rootfsFile string, properties []str
 	var fRootfs *os.File
 	var req *http.Request
 
-	fImage, err = os.Open(imageFile)
-	if err != nil {
-		return "", err
-	}
-	defer fImage.Close()
-
 	if rootfsFile != "" {
+		fImage, err = os.Open(imageFile)
+		if err != nil {
+			return "", err
+		}
+		defer fImage.Close()
+
 		fRootfs, err = os.Open(rootfsFile)
 		if err != nil {
 			return "", err
@@ -918,15 +918,35 @@ func (c *Client) PostImage(imageFile string, rootfsFile string, properties []str
 
 		w.Close()
 
+		size, err := body.Seek(0, 2)
+		if err != nil {
+			return "", err
+		}
+
 		_, err = body.Seek(0, 0)
 		if err != nil {
 			return "", err
 		}
 
-		req, err = http.NewRequest("POST", uri, body)
+		progress := &shared.TransferProgress{Reader: body, Length: size, Handler: progressHandler}
+
+		req, err = http.NewRequest("POST", uri, progress)
 		req.Header.Set("Content-Type", w.FormDataContentType())
 	} else {
-		req, err = http.NewRequest("POST", uri, fImage)
+		fImage, err = os.Open(imageFile)
+		if err != nil {
+			return "", err
+		}
+		defer fImage.Close()
+
+		stat, err := fImage.Stat()
+		if err != nil {
+			return "", err
+		}
+
+		progress := &shared.TransferProgress{Reader: fImage, Length: stat.Size(), Handler: progressHandler}
+
+		req, err = http.NewRequest("POST", uri, progress)
 		req.Header.Set("X-LXD-filename", filepath.Base(imageFile))
 		req.Header.Set("Content-Type", "application/octet-stream")
 	}
diff --git a/lxc/image.go b/lxc/image.go
index d875b46..a4e3745 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -358,12 +358,19 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			return err
 		}
 
+		handler := func(percent int) {
+			fmt.Printf(i18n.G("Transfering image: %d%%")+"\r", percent)
+			if percent == 100 {
+				fmt.Printf("\n")
+			}
+		}
+
 		if strings.HasPrefix(imageFile, "https://") {
 			fingerprint, err = d.PostImageURL(imageFile, c.publicImage, c.addAliases)
 		} else if strings.HasPrefix(imageFile, "http://") {
 			return fmt.Errorf(i18n.G("Only https:// is supported for remote image import."))
 		} else {
-			fingerprint, err = d.PostImage(imageFile, rootfsFile, properties, c.publicImage, c.addAliases)
+			fingerprint, err = d.PostImage(imageFile, rootfsFile, properties, c.publicImage, c.addAliases, handler)
 		}
 
 		if err != nil {
diff --git a/po/lxd.pot b/po/lxd.pot
index fc59c20..87e1ae0 100644
--- a/po/lxd.pot
+++ b/po/lxd.pot
@@ -7,7 +7,7 @@
 msgid   ""
 msgstr  "Project-Id-Version: lxd\n"
         "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-        "POT-Creation-Date: 2016-02-29 01:20-0500\n"
+        "POT-Creation-Date: 2016-03-01 00:43-0500\n"
         "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
         "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
         "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -65,7 +65,7 @@ msgid   "### This is a yaml representation of the profile.\n"
         "### Note that the name is shown but cannot be changed"
 msgstr  ""
 
-#: lxc/image.go:534
+#: lxc/image.go:541
 #, c-format
 msgid   "%s (%d more)"
 msgstr  ""
@@ -78,11 +78,11 @@ msgstr  ""
 msgid   "(none)"
 msgstr  ""
 
-#: lxc/image.go:554 lxc/image.go:578
+#: lxc/image.go:561 lxc/image.go:585
 msgid   "ALIAS"
 msgstr  ""
 
-#: lxc/image.go:558
+#: lxc/image.go:565
 msgid   "ARCH"
 msgstr  ""
 
@@ -162,7 +162,7 @@ msgstr  ""
 msgid   "Config key/value to apply to the new container"
 msgstr  ""
 
-#: lxc/config.go:492 lxc/config.go:557 lxc/image.go:632 lxc/profile.go:187
+#: lxc/config.go:492 lxc/config.go:557 lxc/image.go:639 lxc/profile.go:187
 #, c-format
 msgid   "Config parsing error: %s"
 msgstr  ""
@@ -234,7 +234,7 @@ msgstr  ""
 msgid   "Creating the container"
 msgstr  ""
 
-#: lxc/image.go:557 lxc/image.go:580
+#: lxc/image.go:564 lxc/image.go:587
 msgid   "DESCRIPTION"
 msgstr  ""
 
@@ -301,7 +301,7 @@ msgstr  ""
 msgid   "Expires: never"
 msgstr  ""
 
-#: lxc/config.go:267 lxc/image.go:555 lxc/image.go:579
+#: lxc/config.go:267 lxc/image.go:562 lxc/image.go:586
 msgid   "FINGERPRINT"
 msgstr  ""
 
@@ -368,7 +368,7 @@ msgstr  ""
 msgid   "Image copied successfully!"
 msgstr  ""
 
-#: lxc/image.go:372
+#: lxc/image.go:379
 #, c-format
 msgid   "Image imported with fingerprint: %s"
 msgstr  ""
@@ -675,7 +675,7 @@ msgstr  ""
 msgid   "No fingerprint specified."
 msgstr  ""
 
-#: lxc/image.go:364
+#: lxc/image.go:371
 msgid   "Only https:// is supported for remote image import."
 msgstr  ""
 
@@ -683,7 +683,7 @@ msgstr  ""
 msgid   "Options:"
 msgstr  ""
 
-#: lxc/image.go:459
+#: lxc/image.go:466
 #, c-format
 msgid   "Output is in %s"
 msgstr  ""
@@ -708,7 +708,7 @@ msgstr  ""
 msgid   "PROTOCOL"
 msgstr  ""
 
-#: lxc/image.go:556 lxc/remote.go:315
+#: lxc/image.go:563 lxc/remote.go:315
 msgid   "PUBLIC"
 msgstr  ""
 
@@ -739,7 +739,7 @@ msgstr  ""
 msgid   "Press enter to open the editor again"
 msgstr  ""
 
-#: lxc/config.go:493 lxc/config.go:558 lxc/image.go:633
+#: lxc/config.go:493 lxc/config.go:558 lxc/image.go:640
 msgid   "Press enter to start the editor again"
 msgstr  ""
 
@@ -827,7 +827,7 @@ msgstr  ""
 msgid   "Retrieving image: %s"
 msgstr  ""
 
-#: lxc/image.go:559
+#: lxc/image.go:566
 msgid   "SIZE"
 msgstr  ""
 
@@ -939,7 +939,12 @@ msgstr  ""
 msgid   "Timestamps:"
 msgstr  ""
 
-#: lxc/action.go:77 lxc/launch.go:130
+#: lxc/image.go:362
+#, c-format
+msgid   "Transfering image: %d%%"
+msgstr  ""
+
+#: lxc/action.go:89 lxc/launch.go:130
 #, c-format
 msgid   "Try `lxc info --show-log %s` for more info"
 msgstr  ""
@@ -952,7 +957,7 @@ msgstr  ""
 msgid   "Type: persistent"
 msgstr  ""
 
-#: lxc/image.go:560
+#: lxc/image.go:567
 msgid   "UPLOAD DATE"
 msgstr  ""
 
@@ -1002,7 +1007,7 @@ msgstr  ""
 msgid   "bad number of things scanned from image, container or snapshot"
 msgstr  ""
 
-#: lxc/action.go:73
+#: lxc/action.go:85
 msgid   "bad result type from action"
 msgstr  ""
 
@@ -1036,7 +1041,7 @@ msgstr  ""
 msgid   "got bad version"
 msgstr  ""
 
-#: lxc/image.go:290 lxc/image.go:537
+#: lxc/image.go:290 lxc/image.go:544
 msgid   "no"
 msgstr  ""
 
@@ -1094,7 +1099,7 @@ msgstr  ""
 msgid   "wrong number of subcommand arguments"
 msgstr  ""
 
-#: lxc/delete.go:45 lxc/image.go:293 lxc/image.go:541
+#: lxc/delete.go:45 lxc/image.go:293 lxc/image.go:548
 msgid   "yes"
 msgstr  ""
 


More information about the lxc-devel mailing list