From 1669b802cc3e7ce30f05e61630542c88696bbca1 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Wed, 15 Jan 2014 14:43:12 -0800 Subject: [PATCH] move search to a job Docker-DCO-1.1-Signed-off-by: Victor Vieux (github: vieux) --- api.go | 26 +++++++++++++---- commands.go | 18 ++++++------ docs/sources/api/docker_remote_api_v1.9.rst | 14 ++++------ server.go | 31 ++++++++++++++++++--- 4 files changed, 62 insertions(+), 27 deletions(-) diff --git a/api.go b/api.go index cd8d174ad3..38871bcdfa 100644 --- a/api.go +++ b/api.go @@ -497,13 +497,29 @@ func getImagesSearch(srv *Server, version float64, w http.ResponseWriter, r *htt return err } - term := r.Form.Get("term") - outs, err := srv.ImagesSearch(term) - if err != nil { + var ( + buffer *bytes.Buffer + job = srv.Eng.Job("search", r.Form.Get("term")) + ) + if version >= 1.9 { + job.Stdout.Add(w) + } else { + buffer = bytes.NewBuffer(nil) + job.Stdout.Add(buffer) + } + if err := job.Run(); err != nil { return err } - - return writeJSON(w, http.StatusOK, outs) + if version < 1.9 { // Send as a valid JSON array + outs := engine.NewTable("", 0) + if _, err := outs.ReadFrom(buffer); err != nil { + return err + } + if _, err := outs.WriteListTo(w); err != nil { + return err + } + } + return nil } func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { diff --git a/commands.go b/commands.go index 454a02c797..4776a4312b 100644 --- a/commands.go +++ b/commands.go @@ -1655,30 +1655,28 @@ func (cli *DockerCli) CmdSearch(args ...string) error { if err != nil { return err } - - outs := []registry.SearchResult{} - err = json.Unmarshal(body, &outs) - if err != nil { + outs := engine.NewTable("star_count", 0) + if _, err := outs.ReadFrom(bytes.NewReader(body)); err != nil { return err } w := tabwriter.NewWriter(cli.out, 10, 1, 3, ' ', 0) fmt.Fprintf(w, "NAME\tDESCRIPTION\tSTARS\tOFFICIAL\tTRUSTED\n") - for _, out := range outs { - if (*trusted && !out.IsTrusted) || (*stars > out.StarCount) { + for _, out := range outs.Data { + if (*trusted && !out.GetBool("is_trusted")) || (*stars > out.GetInt("star_count")) { continue } - desc := strings.Replace(out.Description, "\n", " ", -1) + desc := strings.Replace(out.Get("description"), "\n", " ", -1) desc = strings.Replace(desc, "\r", " ", -1) if !*noTrunc && len(desc) > 45 { desc = utils.Trunc(desc, 42) + "..." } - fmt.Fprintf(w, "%s\t%s\t%d\t", out.Name, desc, out.StarCount) - if out.IsOfficial { + fmt.Fprintf(w, "%s\t%s\t%d\t", out.Get("name"), desc, out.GetInt("star_count")) + if out.GetBool("is_official") { fmt.Fprint(w, "[OK]") } fmt.Fprint(w, "\t") - if out.IsTrusted { + if out.GetBool("is_trusted") { fmt.Fprint(w, "[OK]") } fmt.Fprint(w, "\n") diff --git a/docs/sources/api/docker_remote_api_v1.9.rst b/docs/sources/api/docker_remote_api_v1.9.rst index 5a8f9311b8..ba7f85031a 100644 --- a/docs/sources/api/docker_remote_api_v1.9.rst +++ b/docs/sources/api/docker_remote_api_v1.9.rst @@ -956,30 +956,28 @@ Search images HTTP/1.1 200 OK Content-Type: application/json - [ - { + { "description": "", "is_official": false, "is_trusted": false, "name": "wma55/u1210sshd", "star_count": 0 - }, - { + } + { "description": "", "is_official": false, "is_trusted": false, "name": "jdswinbank/sshd", "star_count": 0 - }, - { + } + { "description": "", "is_official": false, "is_trusted": false, "name": "vgauthier/sshd", "star_count": 0 - } + } ... - ] :query term: term to search :statuscode 200: no error diff --git a/server.go b/server.go index 8e85235b09..ebd10fd01c 100644 --- a/server.go +++ b/server.go @@ -151,6 +151,10 @@ func jobInitApi(job *engine.Job) engine.Status { job.Error(err) return engine.StatusErr } + if err := job.Eng.Register("search", srv.ImagesSearch); err != nil { + job.Error(err) + return engine.StatusErr + } return engine.StatusOK } @@ -507,16 +511,35 @@ func (srv *Server) recursiveLoad(address, tmpImageDir string) error { return nil } -func (srv *Server) ImagesSearch(term string) ([]registry.SearchResult, error) { +func (srv *Server) ImagesSearch(job *engine.Job) engine.Status { + if n := len(job.Args); n != 1 { + job.Errorf("Usage: %s TERM", job.Name) + return engine.StatusErr + } + term := job.Args[0] + r, err := registry.NewRegistry(nil, srv.HTTPRequestFactory(nil), auth.IndexServerAddress()) if err != nil { - return nil, err + job.Error(err) + return engine.StatusErr } results, err := r.SearchRepositories(term) if err != nil { - return nil, err + job.Error(err) + return engine.StatusErr } - return results.Results, nil + outs := engine.NewTable("star_count", 0) + for _, result := range results.Results { + out := &engine.Env{} + out.Import(result) + outs.Add(out) + } + outs.ReverseSort() + if _, err := outs.WriteTo(job.Stdout); err != nil { + job.Error(err) + return engine.StatusErr + } + return engine.StatusOK } func (srv *Server) ImageInsert(job *engine.Job) engine.Status {