Browse code

Merge pull request #6571 from vbatts/vbatts-raw_json

raw json for `docker save`

unclejack authored on 2014/06/21 05:55:10
Showing 6 changed files
... ...
@@ -860,7 +860,7 @@ func getContainersByName(eng *engine.Engine, version version.Version, w http.Res
860 860
 	}
861 861
 	var job = eng.Job("container_inspect", vars["name"])
862 862
 	if version.LessThan("1.12") {
863
-		job.SetenvBool("dirty", true)
863
+		job.SetenvBool("raw", true)
864 864
 	}
865 865
 	streamJSON(job, w, false)
866 866
 	return job.Run()
... ...
@@ -872,7 +872,7 @@ func getImagesByName(eng *engine.Engine, version version.Version, w http.Respons
872 872
 	}
873 873
 	var job = eng.Job("image_inspect", vars["name"])
874 874
 	if version.LessThan("1.12") {
875
-		job.SetenvBool("dirty", true)
875
+		job.SetenvBool("raw", true)
876 876
 	}
877 877
 	streamJSON(job, w, false)
878 878
 	return job.Run()
... ...
@@ -15,7 +15,7 @@ func (daemon *Daemon) ContainerInspect(job *engine.Job) engine.Status {
15 15
 	if container := daemon.Get(name); container != nil {
16 16
 		container.Lock()
17 17
 		defer container.Unlock()
18
-		if job.GetenvBool("dirty") {
18
+		if job.GetenvBool("raw") {
19 19
 			b, err := json.Marshal(&struct {
20 20
 				*Container
21 21
 				HostConfig *runconfig.HostConfig
... ...
@@ -1,7 +1,6 @@
1 1
 package graph
2 2
 
3 3
 import (
4
-	"encoding/json"
5 4
 	"io"
6 5
 
7 6
 	"github.com/dotcloud/docker/engine"
... ...
@@ -135,8 +134,8 @@ func (s *TagStore) CmdLookup(job *engine.Job) engine.Status {
135 135
 	}
136 136
 	name := job.Args[0]
137 137
 	if image, err := s.LookupImage(name); err == nil && image != nil {
138
-		if job.GetenvBool("dirty") {
139
-			b, err := json.Marshal(image)
138
+		if job.GetenvBool("raw") {
139
+			b, err := image.RawJson()
140 140
 			if err != nil {
141 141
 				return job.Error(err)
142 142
 			}
... ...
@@ -149,6 +149,22 @@ func jsonPath(root string) string {
149 149
 	return path.Join(root, "json")
150 150
 }
151 151
 
152
+func (img *Image) RawJson() ([]byte, error) {
153
+	root, err := img.root()
154
+	if err != nil {
155
+		return nil, fmt.Errorf("Failed to get root for image %s: %s", img.ID, err)
156
+	}
157
+	fh, err := os.Open(jsonPath(root))
158
+	if err != nil {
159
+		return nil, fmt.Errorf("Failed to open json for image %s: %s", img.ID, err)
160
+	}
161
+	buf, err := ioutil.ReadAll(fh)
162
+	if err != nil {
163
+		return nil, fmt.Errorf("Failed to read json for image %s: %s", img.ID, err)
164
+	}
165
+	return buf, nil
166
+}
167
+
152 168
 // TarLayer returns a tar archive of the image's filesystem layer.
153 169
 func (img *Image) TarLayer() (arch archive.Archive, err error) {
154 170
 	if img.graph == nil {
... ...
@@ -7,8 +7,8 @@ import (
7 7
 	"testing"
8 8
 )
9 9
 
10
-// save a repo and try to load it
11
-func TestSaveAndLoadRepo(t *testing.T) {
10
+// save a repo and try to load it using stdout
11
+func TestSaveAndLoadRepoStdout(t *testing.T) {
12 12
 	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
13 13
 	out, _, err := runCommandWithOutput(runCmd)
14 14
 	errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err))
... ...
@@ -25,6 +25,10 @@ func TestSaveAndLoadRepo(t *testing.T) {
25 25
 	out, _, err = runCommandWithOutput(commitCmd)
26 26
 	errorOut(err, t, fmt.Sprintf("failed to commit container: %v %v", out, err))
27 27
 
28
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
29
+	before, _, err := runCommandWithOutput(inspectCmd)
30
+	errorOut(err, t, fmt.Sprintf("the repo should exist before saving it: %v %v", before, err))
31
+
28 32
 	saveCmdTemplate := `%v save %v > /tmp/foobar-save-load-test.tar`
29 33
 	saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName)
30 34
 	saveCmd := exec.Command("bash", "-c", saveCmdFinal)
... ...
@@ -39,14 +43,70 @@ func TestSaveAndLoadRepo(t *testing.T) {
39 39
 	errorOut(err, t, fmt.Sprintf("failed to load repo: %v %v", out, err))
40 40
 
41 41
 	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
42
+	after, _, err := runCommandWithOutput(inspectCmd)
43
+	errorOut(err, t, fmt.Sprintf("the repo should exist after loading it: %v %v", after, err))
44
+
45
+	if before != after {
46
+		t.Fatalf("inspect is not the same after a save / load")
47
+	}
48
+
49
+	deleteContainer(cleanedContainerID)
50
+	deleteImages(repoName)
51
+
52
+	os.Remove("/tmp/foobar-save-load-test.tar")
53
+
54
+	logDone("save - save a repo using stdout")
55
+	logDone("load - load a repo using stdout")
56
+}
57
+
58
+// save a repo and try to load it using flags
59
+func TestSaveAndLoadRepoFlags(t *testing.T) {
60
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
61
+	out, _, err := runCommandWithOutput(runCmd)
62
+	errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err))
63
+
64
+	cleanedContainerID := stripTrailingCharacters(out)
65
+
66
+	repoName := "foobar-save-load-test"
67
+
68
+	inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
42 69
 	out, _, err = runCommandWithOutput(inspectCmd)
43
-	errorOut(err, t, fmt.Sprintf("the repo should exist after loading it: %v %v", out, err))
70
+	errorOut(err, t, fmt.Sprintf("output should've been a container id: %v %v", cleanedContainerID, err))
71
+
72
+	commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
73
+	out, _, err = runCommandWithOutput(commitCmd)
74
+	errorOut(err, t, fmt.Sprintf("failed to commit container: %v %v", out, err))
75
+
76
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
77
+	before, _, err := runCommandWithOutput(inspectCmd)
78
+	errorOut(err, t, fmt.Sprintf("the repo should exist before saving it: %v %v", before, err))
79
+
80
+	saveCmdTemplate := `%v save -o /tmp/foobar-save-load-test.tar %v`
81
+	saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName)
82
+	saveCmd := exec.Command("bash", "-c", saveCmdFinal)
83
+	out, _, err = runCommandWithOutput(saveCmd)
84
+	errorOut(err, t, fmt.Sprintf("failed to save repo: %v %v", out, err))
85
+
86
+	deleteImages(repoName)
87
+
88
+	loadCmdFinal := `docker load -i /tmp/foobar-save-load-test.tar`
89
+	loadCmd := exec.Command("bash", "-c", loadCmdFinal)
90
+	out, _, err = runCommandWithOutput(loadCmd)
91
+	errorOut(err, t, fmt.Sprintf("failed to load repo: %v %v", out, err))
92
+
93
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
94
+	after, _, err := runCommandWithOutput(inspectCmd)
95
+	errorOut(err, t, fmt.Sprintf("the repo should exist after loading it: %v %v", after, err))
96
+
97
+	if before != after {
98
+		t.Fatalf("inspect is not the same after a save / load")
99
+	}
44 100
 
45 101
 	deleteContainer(cleanedContainerID)
46 102
 	deleteImages(repoName)
47 103
 
48 104
 	os.Remove("/tmp/foobar-save-load-test.tar")
49 105
 
50
-	logDone("save - save a repo")
51
-	logDone("load - load a repo")
106
+	logDone("save - save a repo using -o")
107
+	logDone("load - load a repo using -i")
52 108
 }
... ...
@@ -410,6 +410,7 @@ func (srv *Server) exportImage(eng *engine.Engine, name, tempdir string) error {
410 410
 			return err
411 411
 		}
412 412
 		job := eng.Job("image_inspect", n)
413
+		job.SetenvBool("raw", true)
413 414
 		job.Stdout.Add(json)
414 415
 		if err := job.Run(); err != nil {
415 416
 			return err