Browse code

Fix docker load progressbar, fixes #21957

Signed-off-by: Lei Jitang <leijitang@huawei.com>

Lei Jitang authored on 2016/04/13 11:45:42
Showing 4 changed files
... ...
@@ -41,7 +41,7 @@ func (cli *DockerCli) CmdLoad(args ...string) error {
41 41
 	}
42 42
 	defer response.Body.Close()
43 43
 
44
-	if response.JSON {
44
+	if response.Body != nil && response.JSON {
45 45
 		return jsonmessage.DisplayJSONMessagesStream(response.Body, cli.out, cli.outFd, cli.isTerminalOut, nil)
46 46
 	}
47 47
 
... ...
@@ -206,7 +206,17 @@ func (s *imageRouter) postImagesLoad(ctx context.Context, w http.ResponseWriter,
206 206
 		return err
207 207
 	}
208 208
 	quiet := httputils.BoolValueOrDefault(r, "quiet", true)
209
-	w.Header().Set("Content-Type", "application/json")
209
+
210
+	if !quiet {
211
+		w.Header().Set("Content-Type", "application/json")
212
+
213
+		output := ioutils.NewWriteFlusher(w)
214
+		defer output.Close()
215
+		if err := s.backend.LoadImage(r.Body, output, quiet); err != nil {
216
+			output.Write(streamformatter.NewJSONStreamFormatter().FormatError(err))
217
+		}
218
+		return nil
219
+	}
210 220
 	return s.backend.LoadImage(r.Body, w, quiet)
211 221
 }
212 222
 
... ...
@@ -29,6 +29,7 @@ func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool)
29 29
 	)
30 30
 	if !quiet {
31 31
 		progressOutput = sf.NewProgressOutput(outStream, false)
32
+		outStream = &streamformatter.StdoutFormatter{Writer: outStream, StreamFormatter: streamformatter.NewJSONStreamFormatter()}
32 33
 	}
33 34
 
34 35
 	tmpDir, err := ioutil.TempDir("", "docker-import-")
... ...
@@ -3,6 +3,7 @@
3 3
 package main
4 4
 
5 5
 import (
6
+	"fmt"
6 7
 	"io/ioutil"
7 8
 	"os"
8 9
 	"os/exec"
... ...
@@ -65,3 +66,22 @@ func (s *DockerSuite) TestSaveAndLoadRepoStdout(c *check.C) {
65 65
 	c.Assert(err, check.IsNil) //could not read tty output
66 66
 	c.Assert(string(buf[:n]), checker.Contains, "Cowardly refusing", check.Commentf("help output is not being yielded", out))
67 67
 }
68
+
69
+func (s *DockerSuite) TestSaveAndLoadWithProgressBar(c *check.C) {
70
+	name := "test-load"
71
+	_, err := buildImage(name, `
72
+	FROM busybox
73
+	RUN touch aa
74
+	`, true)
75
+	c.Assert(err, check.IsNil)
76
+
77
+	tmptar := name + ".tar"
78
+	dockerCmd(c, "save", "-o", tmptar, name)
79
+	defer os.Remove(tmptar)
80
+
81
+	dockerCmd(c, "rmi", name)
82
+	dockerCmd(c, "tag", "busybox", name)
83
+	out, _ := dockerCmd(c, "load", "-i", tmptar)
84
+	expected := fmt.Sprintf("The image %s:latest already exists, renaming the old one with ID", name)
85
+	c.Assert(out, checker.Contains, expected)
86
+}