瀏覽代碼

move search to a job

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
Victor Vieux 11 年之前
父節點
當前提交
1669b802cc
共有 4 個文件被更改,包括 62 次插入27 次删除
  1. 21 5
      api.go
  2. 8 10
      commands.go
  3. 6 8
      docs/sources/api/docker_remote_api_v1.9.rst
  4. 27 4
      server.go

+ 21 - 5
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 {

+ 8 - 10
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")

+ 6 - 8
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

+ 27 - 4
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
+	}
+	outs := engine.NewTable("star_count", 0)
+	for _, result := range results.Results {
+		out := &engine.Env{}
+		out.Import(result)
+		outs.Add(out)
 	}
-	return results.Results, nil
+	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 {