Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
| ... | ... |
@@ -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 |
} |
| ... | ... |
@@ -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 |
|