Browse code

switch back to the valid json format

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

Victor Vieux authored on 2014/01/22 08:06:23
Showing 9 changed files
... ...
@@ -192,40 +192,35 @@ func getImagesJSON(srv *Server, version float64, w http.ResponseWriter, r *http.
192 192
 	job.Setenv("filter", r.Form.Get("filter"))
193 193
 	job.Setenv("all", r.Form.Get("all"))
194 194
 
195
-	if version >= 1.9 {
195
+	if version > 1.8 {
196 196
 		job.Stdout.Add(w)
197
-	} else if outs, err = job.Stdout.AddTable(); err != nil {
197
+	} else if outs, err = job.Stdout.AddListTable(); err != nil {
198 198
 		return err
199 199
 	}
200 200
 
201
-	if err = job.Run(); err != nil {
201
+	if err := job.Run(); err != nil {
202 202
 		return err
203 203
 	}
204 204
 
205
-	if version < 1.9 { // Send as a valid JSON array
206
-		if version < 1.8 { // Convert to legacy format
207
-			outsLegacy := engine.NewTable("Created", 0)
208
-			for _, out := range outs.Data {
209
-				for _, repoTag := range out.GetList("RepoTags") {
210
-					parts := strings.Split(repoTag, ":")
211
-					outLegacy := &engine.Env{}
212
-					outLegacy.Set("Repository", parts[0])
213
-					outLegacy.Set("Tag", parts[1])
214
-					outLegacy.Set("ID", out.Get("ID"))
215
-					outLegacy.SetInt64("Created", out.GetInt64("Created"))
216
-					outLegacy.SetInt64("Size", out.GetInt64("Size"))
217
-					outLegacy.SetInt64("VirtualSize", out.GetInt64("VirtualSize"))
218
-					outsLegacy.Add(outLegacy)
219
-				}
220
-			}
221
-			if _, err = outsLegacy.WriteListTo(w); err != nil {
222
-				return err
205
+	if version < 1.8 && outs != nil { // Convert to legacy format
206
+		outsLegacy := engine.NewTable("Created", 0)
207
+		for _, out := range outs.Data {
208
+			for _, repoTag := range out.GetList("RepoTags") {
209
+				parts := strings.Split(repoTag, ":")
210
+				outLegacy := &engine.Env{}
211
+				outLegacy.Set("Repository", parts[0])
212
+				outLegacy.Set("Tag", parts[1])
213
+				outLegacy.Set("ID", out.Get("ID"))
214
+				outLegacy.SetInt64("Created", out.GetInt64("Created"))
215
+				outLegacy.SetInt64("Size", out.GetInt64("Size"))
216
+				outLegacy.SetInt64("VirtualSize", out.GetInt64("VirtualSize"))
217
+				outsLegacy.Add(outLegacy)
223 218
 			}
224
-		} else if _, err = outs.WriteListTo(w); err != nil {
219
+		}
220
+		if _, err := outsLegacy.WriteListTo(w); err != nil {
225 221
 			return err
226 222
 		}
227 223
 	}
228
-
229 224
 	return nil
230 225
 }
231 226
 
... ...
@@ -307,25 +302,12 @@ func getImagesHistory(srv *Server, version float64, w http.ResponseWriter, r *ht
307 307
 		return fmt.Errorf("Missing parameter")
308 308
 	}
309 309
 
310
-	var (
311
-		err  error
312
-		outs *engine.Table
313
-		job  = srv.Eng.Job("history", vars["name"])
314
-	)
310
+	var job = srv.Eng.Job("history", vars["name"])
311
+	job.Stdout.Add(w)
315 312
 
316
-	if version >= 1.9 {
317
-		job.Stdout.Add(w)
318
-	} else if outs, err = job.Stdout.AddTable(); err != nil {
319
-		return err
320
-	}
321
-	if err = job.Run(); err != nil {
313
+	if err := job.Run(); err != nil {
322 314
 		return err
323 315
 	}
324
-	if version < 1.9 { // Send as a valid JSON array
325
-		if _, err = outs.WriteListTo(w); err != nil {
326
-			return err
327
-		}
328
-	}
329 316
 	return nil
330 317
 }
331 318
 
... ...
@@ -333,26 +315,10 @@ func getContainersChanges(srv *Server, version float64, w http.ResponseWriter, r
333 333
 	if vars == nil {
334 334
 		return fmt.Errorf("Missing parameter")
335 335
 	}
336
-	var (
337
-		err  error
338
-		outs *engine.Table
339
-		job  = srv.Eng.Job("changes", vars["name"])
340
-	)
336
+	var job = srv.Eng.Job("changes", vars["name"])
337
+	job.Stdout.Add(w)
341 338
 
342
-	if version >= 1.9 {
343
-		job.Stdout.Add(w)
344
-	} else if outs, err = job.Stdout.AddTable(); err != nil {
345
-		return err
346
-	}
347
-	if err = job.Run(); err != nil {
348
-		return err
349
-	}
350
-	if version < 1.9 { // Send as a valid JSON array
351
-		if _, err = outs.WriteListTo(w); err != nil {
352
-			return err
353
-		}
354
-	}
355
-	return nil
339
+	return job.Run()
356 340
 }
357 341
 
358 342
 func getContainersTop(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
... ...
@@ -501,25 +467,10 @@ func getImagesSearch(srv *Server, version float64, w http.ResponseWriter, r *htt
501 501
 		return err
502 502
 	}
503 503
 
504
-	var (
505
-		err  error
506
-		outs *engine.Table
507
-		job  = srv.Eng.Job("search", r.Form.Get("term"))
508
-	)
509
-	if version >= 1.9 {
510
-		job.Stdout.Add(w)
511
-	} else if outs, err = job.Stdout.AddTable(); err != nil {
512
-		return err
513
-	}
514
-	if err = job.Run(); err != nil {
515
-		return err
516
-	}
517
-	if version < 1.9 { // Send as a valid JSON array
518
-		if _, err = outs.WriteListTo(w); err != nil {
519
-			return err
520
-		}
521
-	}
522
-	return nil
504
+	var job = srv.Eng.Job("search", r.Form.Get("term"))
505
+	job.Stdout.Add(w)
506
+
507
+	return job.Run()
523 508
 }
524 509
 
525 510
 func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
... ...
@@ -869,7 +869,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
869 869
 	}
870 870
 
871 871
 	outs := engine.NewTable("Created", 0)
872
-	if _, err := outs.ReadFrom(stream); err != nil {
872
+	if _, err := outs.ReadListFrom(stream); err != nil {
873 873
 		return err
874 874
 	}
875 875
 
... ...
@@ -1147,7 +1147,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
1147 1147
 		}
1148 1148
 
1149 1149
 		outs := engine.NewTable("Created", 0)
1150
-		if _, err := outs.ReadFrom(stream); err != nil {
1150
+		if _, err := outs.ReadListFrom(stream); err != nil {
1151 1151
 			return err
1152 1152
 		}
1153 1153
 
... ...
@@ -1219,7 +1219,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
1219 1219
 		}
1220 1220
 
1221 1221
 		outs := engine.NewTable("Created", 0)
1222
-		if _, err := outs.ReadFrom(stream); err != nil {
1222
+		if _, err := outs.ReadListFrom(stream); err != nil {
1223 1223
 			return err
1224 1224
 		}
1225 1225
 
... ...
@@ -1540,7 +1540,7 @@ func (cli *DockerCli) CmdDiff(args ...string) error {
1540 1540
 	}
1541 1541
 
1542 1542
 	outs := engine.NewTable("", 0)
1543
-	if _, err := outs.ReadFrom(stream); err != nil {
1543
+	if _, err := outs.ReadListFrom(stream); err != nil {
1544 1544
 		return err
1545 1545
 	}
1546 1546
 	for _, change := range outs.Data {
... ...
@@ -1681,7 +1681,7 @@ func (cli *DockerCli) CmdSearch(args ...string) error {
1681 1681
 		return err
1682 1682
 	}
1683 1683
 	outs := engine.NewTable("star_count", 0)
1684
-	if _, err := outs.ReadFrom(stream); err != nil {
1684
+	if _, err := outs.ReadListFrom(stream); err != nil {
1685 1685
 		return err
1686 1686
 	}
1687 1687
 	w := tabwriter.NewWriter(cli.out, 10, 1, 3, ' ', 0)
... ...
@@ -46,14 +46,6 @@ Full Documentation
46 46
 What's new
47 47
 ----------
48 48
 
49
-.. http:get:: /images/json
50
-
51
-   **New!** This endpoint now returns a list of json message, like the events endpoint
52
-
53
-.. http:get:: /images/(name)/history
54
-
55
-   **New!** This endpoint now returns a list of json message, like the events endpoint
56
-
57 49
 .. http:post:: /build
58 50
 
59 51
    **New!** This endpoint now takes a serialized ConfigFile which it uses to
... ...
@@ -317,18 +317,20 @@ Inspect changes on a container's filesystem
317 317
            HTTP/1.1 200 OK
318 318
            Content-Type: application/json
319 319
 
320
-           {
320
+           [
321
+                {
321 322
                         "Path":"/dev",
322 323
                         "Kind":0
323
-           }
324
-           {
324
+                },
325
+                {
325 326
                         "Path":"/dev/kmsg",
326 327
                         "Kind":1
327
-           }
328
-           {
328
+                },
329
+                {
329 330
                         "Path":"/test",
330 331
                         "Kind":1
331
-           }
332
+                }
333
+           ]
332 334
 
333 335
         :statuscode 200: no error
334 336
         :statuscode 404: no such container
... ...
@@ -654,7 +656,8 @@ List Images
654 654
            HTTP/1.1 200 OK
655 655
            Content-Type: application/json
656 656
 
657
-           {
657
+           [
658
+             {
658 659
                 "RepoTags": [
659 660
                   "ubuntu:12.04",
660 661
                   "ubuntu:precise",
... ...
@@ -664,8 +667,8 @@ List Images
664 664
                 "Created": 1365714795,
665 665
                 "Size": 131506275,
666 666
                 "VirtualSize": 131506275
667
-           }
668
-           {
667
+             },
668
+             {
669 669
                 "RepoTags": [
670 670
                   "ubuntu:12.10",
671 671
                   "ubuntu:quantal"
... ...
@@ -675,7 +678,8 @@ List Images
675 675
                 "Created": 1364102658,
676 676
                 "Size": 24653,
677 677
                 "VirtualSize": 180116135
678
-           }
678
+             }
679
+           ]
679 680
 
680 681
 
681 682
 Create an image
... ...
@@ -821,16 +825,18 @@ Get the history of an image
821 821
            HTTP/1.1 200 OK
822 822
            Content-Type: application/json
823 823
 
824
-           {
824
+           [
825
+                {
825 826
                         "Id":"b750fe79269d",
826 827
                         "Created":1364102658,
827 828
                         "CreatedBy":"/bin/bash"
828
-           }
829
-           {
829
+                },
830
+                {
830 831
                         "Id":"27cf78414709",
831 832
                         "Created":1364068391,
832 833
                         "CreatedBy":""
833
-           }
834
+                }
835
+           ]
834 836
 
835 837
         :statuscode 200: no error
836 838
         :statuscode 404: no such image
... ...
@@ -954,28 +960,30 @@ Search images
954 954
            HTTP/1.1 200 OK
955 955
            Content-Type: application/json
956 956
 
957
-           {
957
+           [
958
+                   {
958 959
                        "description": "",
959 960
                        "is_official": false,
960 961
                        "is_trusted": false,
961 962
                        "name": "wma55/u1210sshd",
962 963
                        "star_count": 0
963
-           }
964
-           {
964
+                   },
965
+                   {
965 966
                        "description": "",
966 967
                        "is_official": false,
967 968
                        "is_trusted": false,
968 969
                        "name": "jdswinbank/sshd",
969 970
                        "star_count": 0
970
-           }
971
-           {
971
+                   },
972
+                   {
972 973
                        "description": "",
973 974
                        "is_official": false,
974 975
                        "is_trusted": false,
975 976
                        "name": "vgauthier/sshd",
976 977
                        "star_count": 0
977
-           }
978
+                   }
978 979
            ...
980
+           ]
979 981
 
980 982
         :query term: term to search
981 983
         :statuscode 200: no error
... ...
@@ -5,6 +5,7 @@ import (
5 5
 	"encoding/json"
6 6
 	"fmt"
7 7
 	"io"
8
+	"io/ioutil"
8 9
 	"sort"
9 10
 	"strconv"
10 11
 	"strings"
... ...
@@ -324,6 +325,31 @@ func (t *Table) WriteTo(dst io.Writer) (n int64, err error) {
324 324
 	return n, nil
325 325
 }
326 326
 
327
+func (t *Table) ReadListFrom(src io.Reader) (n int64, err error) {
328
+	var array []interface{}
329
+
330
+	content, err := ioutil.ReadAll(src)
331
+	if err != nil {
332
+		return -1, err
333
+	}
334
+
335
+	if err := json.Unmarshal(content, &array); err != nil {
336
+		return -1, err
337
+	}
338
+
339
+	for _, item := range array {
340
+		if m, ok := item.(map[string]interface{}); ok {
341
+			env := &Env{}
342
+			for key, value := range m {
343
+				env.SetAuto(key, value)
344
+			}
345
+			t.Add(env)
346
+		}
347
+	}
348
+
349
+	return int64(len(content)), nil
350
+}
351
+
327 352
 func (t *Table) ReadFrom(src io.Reader) (n int64, err error) {
328 353
 	decoder := NewDecoder(src)
329 354
 	for {
... ...
@@ -211,6 +211,22 @@ func (o *Output) AddEnv() (dst *Env, err error) {
211 211
 	return dst, nil
212 212
 }
213 213
 
214
+func (o *Output) AddListTable() (dst *Table, err error) {
215
+	src, err := o.AddPipe()
216
+	if err != nil {
217
+		return nil, err
218
+	}
219
+	dst = NewTable("", 0)
220
+	o.tasks.Add(1)
221
+	go func() {
222
+		defer o.tasks.Done()
223
+		if _, err := dst.ReadListFrom(src); err != nil {
224
+			return
225
+		}
226
+	}()
227
+	return dst, nil
228
+}
229
+
214 230
 func (o *Output) AddTable() (dst *Table, err error) {
215 231
 	src, err := o.AddPipe()
216 232
 	if err != nil {
... ...
@@ -61,7 +61,7 @@ func TestGetInfo(t *testing.T) {
61 61
 	srv := mkServerFromEngine(eng, t)
62 62
 
63 63
 	job := eng.Job("images")
64
-	initialImages, err := job.Stdout.AddTable()
64
+	initialImages, err := job.Stdout.AddListTable()
65 65
 	if err != nil {
66 66
 		t.Fatal(err)
67 67
 	}
... ...
@@ -149,7 +149,7 @@ func TestGetImagesJSON(t *testing.T) {
149 149
 	srv := mkServerFromEngine(eng, t)
150 150
 
151 151
 	job := eng.Job("images")
152
-	initialImages, err := job.Stdout.AddTable()
152
+	initialImages, err := job.Stdout.AddListTable()
153 153
 	if err != nil {
154 154
 		t.Fatal(err)
155 155
 	}
... ...
@@ -170,7 +170,7 @@ func TestGetImagesJSON(t *testing.T) {
170 170
 	assertHttpNotError(r, t)
171 171
 
172 172
 	images := engine.NewTable("Created", 0)
173
-	if _, err := images.ReadFrom(r.Body); err != nil {
173
+	if _, err := images.ReadListFrom(r.Body); err != nil {
174 174
 		t.Fatal(err)
175 175
 	}
176 176
 
... ...
@@ -205,7 +205,7 @@ func TestGetImagesJSON(t *testing.T) {
205 205
 	assertHttpNotError(r2, t)
206 206
 
207 207
 	images2 := engine.NewTable("ID", 0)
208
-	if _, err := images2.ReadFrom(r2.Body); err != nil {
208
+	if _, err := images2.ReadListFrom(r2.Body); err != nil {
209 209
 		t.Fatal(err)
210 210
 	}
211 211
 
... ...
@@ -238,7 +238,7 @@ func TestGetImagesJSON(t *testing.T) {
238 238
 	assertHttpNotError(r3, t)
239 239
 
240 240
 	images3 := engine.NewTable("ID", 0)
241
-	if _, err := images3.ReadFrom(r3.Body); err != nil {
241
+	if _, err := images3.ReadListFrom(r3.Body); err != nil {
242 242
 		t.Fatal(err)
243 243
 	}
244 244
 
... ...
@@ -264,7 +264,7 @@ func TestGetImagesHistory(t *testing.T) {
264 264
 	assertHttpNotError(r, t)
265 265
 
266 266
 	outs := engine.NewTable("Created", 0)
267
-	if _, err := outs.ReadFrom(r.Body); err != nil {
267
+	if _, err := outs.ReadListFrom(r.Body); err != nil {
268 268
 		t.Fatal(err)
269 269
 	}
270 270
 	if len(outs.Data) != 1 {
... ...
@@ -409,7 +409,7 @@ func TestGetContainersChanges(t *testing.T) {
409 409
 	}
410 410
 	assertHttpNotError(r, t)
411 411
 	outs := engine.NewTable("", 0)
412
-	if _, err := outs.ReadFrom(r.Body); err != nil {
412
+	if _, err := outs.ReadListFrom(r.Body); err != nil {
413 413
 		t.Fatal(err)
414 414
 	}
415 415
 
... ...
@@ -335,7 +335,7 @@ func getImages(eng *engine.Engine, t *testing.T, all bool, filter string) *engin
335 335
 	job := eng.Job("images")
336 336
 	job.SetenvBool("all", all)
337 337
 	job.Setenv("filter", filter)
338
-	images, err := job.Stdout.AddTable()
338
+	images, err := job.Stdout.AddListTable()
339 339
 	if err != nil {
340 340
 		t.Fatal(err)
341 341
 	}
... ...
@@ -493,7 +493,7 @@ func (srv *Server) ImagesSearch(job *engine.Job) engine.Status {
493 493
 		outs.Add(out)
494 494
 	}
495 495
 	outs.ReverseSort()
496
-	if _, err := outs.WriteTo(job.Stdout); err != nil {
496
+	if _, err := outs.WriteListTo(job.Stdout); err != nil {
497 497
 		job.Error(err)
498 498
 		return engine.StatusErr
499 499
 	}
... ...
@@ -658,7 +658,7 @@ func (srv *Server) Images(job *engine.Job) engine.Status {
658 658
 	}
659 659
 
660 660
 	outs.ReverseSort()
661
-	if _, err := outs.WriteTo(job.Stdout); err != nil {
661
+	if _, err := outs.WriteListTo(job.Stdout); err != nil {
662 662
 		job.Error(err)
663 663
 		return engine.StatusErr
664 664
 	}
... ...
@@ -744,7 +744,7 @@ func (srv *Server) ImageHistory(job *engine.Job) engine.Status {
744 744
 		return nil
745 745
 	})
746 746
 	outs.ReverseSort()
747
-	if _, err := outs.WriteTo(job.Stdout); err != nil {
747
+	if _, err := outs.WriteListTo(job.Stdout); err != nil {
748 748
 		job.Error(err)
749 749
 		return engine.StatusErr
750 750
 	}
... ...
@@ -849,7 +849,7 @@ func (srv *Server) ContainerChanges(job *engine.Job) engine.Status {
849 849
 			}
850 850
 			outs.Add(out)
851 851
 		}
852
-		if _, err := outs.WriteTo(job.Stdout); err != nil {
852
+		if _, err := outs.WriteListTo(job.Stdout); err != nil {
853 853
 			job.Error(err)
854 854
 			return engine.StatusErr
855 855
 		}