Browse code

move legacy stuff outside the job

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)

Victor Vieux authored on 2014/01/14 07:55:31
Showing 6 changed files
... ...
@@ -10,6 +10,7 @@ import (
10 10
 	"fmt"
11 11
 	"github.com/dotcloud/docker/archive"
12 12
 	"github.com/dotcloud/docker/auth"
13
+	"github.com/dotcloud/docker/engine"
13 14
 	"github.com/dotcloud/docker/pkg/systemd"
14 15
 	"github.com/dotcloud/docker/utils"
15 16
 	"github.com/gorilla/mux"
... ...
@@ -181,16 +182,54 @@ func getImagesJSON(srv *Server, version float64, w http.ResponseWriter, r *http.
181 181
 	if err := parseForm(r); err != nil {
182 182
 		return err
183 183
 	}
184
-	job := srv.Eng.Job("images")
184
+
185
+	var (
186
+		buffer *bytes.Buffer
187
+		job    = srv.Eng.Job("images")
188
+	)
189
+
185 190
 	job.Setenv("filter", r.Form.Get("filter"))
186 191
 	job.Setenv("all", r.Form.Get("all"))
187
-	job.SetenvBool("list", version <= 1.8)
188
-	job.SetenvBool("legacy", version <= 1.7)
189
-	job.Stdout.Add(w)
190
-	w.WriteHeader(http.StatusOK)
192
+
193
+	if version >= 1.9 {
194
+		job.Stdout.Add(w)
195
+	} else {
196
+		buffer = bytes.NewBuffer(nil)
197
+		job.Stdout.Add(buffer)
198
+	}
199
+
191 200
 	if err := job.Run(); err != nil {
192 201
 		return err
193 202
 	}
203
+
204
+	if version < 1.9 { // Send as a valide JSON array
205
+		outs := engine.NewTable("Created", 0)
206
+		if _, err := outs.ReadFrom(buffer); err != nil {
207
+			return err
208
+		}
209
+		if version < 1.8 { // Convert to legacy format
210
+			outsLegacy := engine.NewTable("Created", 0)
211
+			for _, out := range outs.Data {
212
+				for _, repoTag := range out.GetList("RepoTags") {
213
+					parts := strings.Split(repoTag, ":")
214
+					outLegacy := &engine.Env{}
215
+					outLegacy.Set("Repository", parts[0])
216
+					outLegacy.Set("Tag", parts[1])
217
+					outLegacy.Set("ID", out.Get("ID"))
218
+					outLegacy.SetInt64("Created", out.GetInt64("Created"))
219
+					outLegacy.SetInt64("Size", out.GetInt64("Size"))
220
+					outLegacy.SetInt64("VirtualSize", out.GetInt64("VirtualSize"))
221
+					outsLegacy.Add(outLegacy)
222
+				}
223
+			}
224
+			if _, err := outsLegacy.WriteListTo(w); err != nil {
225
+				return err
226
+			}
227
+		} else if _, err := outs.WriteListTo(w); err != nil {
228
+			return err
229
+		}
230
+	}
231
+
194 232
 	return nil
195 233
 }
196 234
 
... ...
@@ -1,9 +1,9 @@
1 1
 package engine
2 2
 
3 3
 import (
4
-	"testing"
5 4
 	"bytes"
6 5
 	"encoding/json"
6
+	"testing"
7 7
 )
8 8
 
9 9
 func TestTableWriteTo(t *testing.T) {
... ...
@@ -19,7 +19,7 @@ func TestTableWriteTo(t *testing.T) {
19 19
 	if err := json.Unmarshal(buf.Bytes(), &output); err != nil {
20 20
 		t.Fatal(err)
21 21
 	}
22
-	if len(output) != 1  {
22
+	if len(output) != 1 {
23 23
 		t.Fatalf("Incorrect output: %v", output)
24 24
 	}
25 25
 	if val, exists := output["foo"]; !exists || val != "bar" {
... ...
@@ -59,7 +59,7 @@ func pingRegistryEndpoint(endpoint string) (bool, error) {
59 59
 	// versions of the registry
60 60
 	if standalone == "" {
61 61
 		return true, nil
62
-	// Accepted values are "true" (case-insensitive) and "1".
62
+		// Accepted values are "true" (case-insensitive) and "1".
63 63
 	} else if strings.EqualFold(standalone, "true") || standalone == "1" {
64 64
 		return true, nil
65 65
 	}
... ...
@@ -601,27 +601,12 @@ func (srv *Server) Images(job *engine.Job) engine.Status {
601 601
 			}
602 602
 
603 603
 			if out, exists := lookup[id]; exists {
604
-				if job.GetenvBool("legacy") {
605
-					out2 := &engine.Env{}
606
-					out2.Set("Repository", name)
607
-					out2.Set("Tag", tag)
608
-					out2.Set("ID", out.Get("ID"))
609
-					out2.SetInt64("Created", out.GetInt64("Created"))
610
-					out2.SetInt64("Size", out.GetInt64("Size"))
611
-					out2.SetInt64("VirtualSize", out.GetInt64("VirtualSize"))
612
-				} else {
613
-					out.SetList("RepoTags", append(out.GetList("RepoTags"), fmt.Sprintf("%s:%s", name, tag)))
614
-				}
604
+				out.SetList("RepoTags", append(out.GetList("RepoTags"), fmt.Sprintf("%s:%s", name, tag)))
615 605
 			} else {
616 606
 				out := &engine.Env{}
617 607
 				delete(allImages, id)
618
-				if job.GetenvBool("legacy") {
619
-					out.Set("Repository", name)
620
-					out.Set("Tag", tag)
621
-				} else {
622
-					out.Set("ParentId", image.Parent)
623
-					out.SetList("RepoTags", []string{fmt.Sprintf("%s:%s", name, tag)})
624
-				}
608
+				out.Set("ParentId", image.Parent)
609
+				out.SetList("RepoTags", []string{fmt.Sprintf("%s:%s", name, tag)})
625 610
 				out.Set("ID", image.ID)
626 611
 				out.SetInt64("Created", image.Created.Unix())
627 612
 				out.SetInt64("Size", image.Size)
... ...
@@ -641,13 +626,8 @@ func (srv *Server) Images(job *engine.Job) engine.Status {
641 641
 	if job.Getenv("filter") == "" {
642 642
 		for _, image := range allImages {
643 643
 			out := &engine.Env{}
644
-			if job.GetenvBool("legacy") {
645
-				out.Set("Repository", "<none>")
646
-				out.Set("Tag", "<none>")
647
-			} else {
648
-				out.Set("ParentId", image.Parent)
649
-				out.SetList("RepoTags", []string{"<none>:<none>"})
650
-			}
644
+			out.Set("ParentId", image.Parent)
645
+			out.SetList("RepoTags", []string{"<none>:<none>"})
651 646
 			out.Set("ID", image.ID)
652 647
 			out.SetInt64("Created", image.Created.Unix())
653 648
 			out.SetInt64("Size", image.Size)
... ...
@@ -657,12 +637,7 @@ func (srv *Server) Images(job *engine.Job) engine.Status {
657 657
 	}
658 658
 
659 659
 	outs.ReverseSort()
660
-	if job.GetenvBool("list") {
661
-		if _, err := outs.WriteListTo(job.Stdout); err != nil {
662
-			job.Errorf("%s", err)
663
-			return engine.StatusErr
664
-		}
665
-	} else if _, err := outs.WriteTo(job.Stdout); err != nil {
660
+	if _, err := outs.WriteTo(job.Stdout); err != nil {
666 661
 		job.Errorf("%s", err)
667 662
 		return engine.StatusErr
668 663
 	}
... ...
@@ -92,7 +92,7 @@ func Purge(maxAge int) int {
92 92
 		datat = make(map[*http.Request]int64)
93 93
 	} else {
94 94
 		min := time.Now().Unix() - int64(maxAge)
95
-		for r, _ := range data {
95
+		for r := range data {
96 96
 			if datat[r] < min {
97 97
 				clear(r)
98 98
 				count++
... ...
@@ -96,8 +96,8 @@ func TestRouteMatchers(t *testing.T) {
96 96
 		method = "GET"
97 97
 		headers = map[string]string{"X-Requested-With": "XMLHttpRequest"}
98 98
 		resultVars = map[bool]map[string]string{
99
-			true:  map[string]string{"var1": "www", "var2": "product", "var3": "42"},
100
-			false: map[string]string{},
99
+			true:  {"var1": "www", "var2": "product", "var3": "42"},
100
+			false: {},
101 101
 		}
102 102
 	}
103 103
 
... ...
@@ -110,8 +110,8 @@ func TestRouteMatchers(t *testing.T) {
110 110
 		method = "POST"
111 111
 		headers = map[string]string{"Content-Type": "application/json"}
112 112
 		resultVars = map[bool]map[string]string{
113
-			true:  map[string]string{"var4": "google", "var5": "product", "var6": "42"},
114
-			false: map[string]string{},
113
+			true:  {"var4": "google", "var5": "product", "var6": "42"},
114
+			false: {},
115 115
 		}
116 116
 	}
117 117