[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