Browse Source

move api to it's own package

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
Victor Vieux 11 năm trước cách đây
mục cha
commit
f556cd4186
8 tập tin đã thay đổi với 159 bổ sung168 xóa
  1. 99 86
      api/api.go
  2. 15 1
      api/api_unit_test.go
  3. 0 19
      api_unit_test.go
  4. 6 5
      commands.go
  5. 2 1
      docker/docker.go
  6. 33 54
      integration/api_test.go
  7. 2 1
      opts.go
  8. 2 1
      server.go

+ 99 - 86
api.go → api/api.go

@@ -1,4 +1,4 @@
-package docker
+package api
 
 
 import (
 import (
 	"bufio"
 	"bufio"
@@ -34,7 +34,7 @@ const (
 	DEFAULTUNIXSOCKET = "/var/run/docker.sock"
 	DEFAULTUNIXSOCKET = "/var/run/docker.sock"
 )
 )
 
 
-type HttpApiFunc func(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error
+type HttpApiFunc func(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error
 
 
 func hijackServer(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) {
 func hijackServer(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) {
 	conn, _, err := w.(http.Hijacker).Hijack()
 	conn, _, err := w.(http.Hijacker).Hijack()
@@ -106,7 +106,20 @@ func getBoolParam(value string) (bool, error) {
 	return ret, nil
 	return ret, nil
 }
 }
 
 
-func matchesContentType(contentType, expectedType string) bool {
+//TODO remove, used on < 1.5 in getContainersJSON
+func displayablePorts(ports *engine.Table) string {
+	result := []string{}
+	for _, port := range ports.Data {
+		if port.Get("IP") == "" {
+			result = append(result, fmt.Sprintf("%d/%s", port.GetInt("PublicPort"), port.Get("Type")))
+		} else {
+			result = append(result, fmt.Sprintf("%s:%d->%d/%s", port.Get("IP"), port.GetInt("PublicPort"), port.GetInt("PrivatePort"), port.Get("Type")))
+		}
+	}
+	return strings.Join(result, ", ")
+}
+
+func MatchesContentType(contentType, expectedType string) bool {
 	mimetype, _, err := mime.ParseMediaType(contentType)
 	mimetype, _, err := mime.ParseMediaType(contentType)
 	if err != nil {
 	if err != nil {
 		utils.Errorf("Error parsing media type: %s error: %s", contentType, err.Error())
 		utils.Errorf("Error parsing media type: %s error: %s", contentType, err.Error())
@@ -114,10 +127,10 @@ func matchesContentType(contentType, expectedType string) bool {
 	return err == nil && mimetype == expectedType
 	return err == nil && mimetype == expectedType
 }
 }
 
 
-func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postAuth(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	var (
 	var (
 		authConfig, err = ioutil.ReadAll(r.Body)
 		authConfig, err = ioutil.ReadAll(r.Body)
-		job             = srv.Eng.Job("auth")
+		job             = eng.Job("auth")
 		status          string
 		status          string
 	)
 	)
 	if err != nil {
 	if err != nil {
@@ -137,20 +150,20 @@ func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Reque
 	return nil
 	return nil
 }
 }
 
 
-func getVersion(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getVersion(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	w.Header().Set("Content-Type", "application/json")
 	w.Header().Set("Content-Type", "application/json")
-	srv.Eng.ServeHTTP(w, r)
+	eng.ServeHTTP(w, r)
 	return nil
 	return nil
 }
 }
 
 
-func postContainersKill(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersKill(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
-	job := srv.Eng.Job("kill", vars["name"])
+	job := eng.Job("kill", vars["name"])
 	if sig := r.Form.Get("signal"); sig != "" {
 	if sig := r.Form.Get("signal"); sig != "" {
 		job.Args = append(job.Args, sig)
 		job.Args = append(job.Args, sig)
 	}
 	}
@@ -161,11 +174,11 @@ func postContainersKill(srv *Server, version float64, w http.ResponseWriter, r *
 	return nil
 	return nil
 }
 }
 
 
-func getContainersExport(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersExport(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	job := srv.Eng.Job("export", vars["name"])
+	job := eng.Job("export", vars["name"])
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
 		return err
 		return err
@@ -173,7 +186,7 @@ func getContainersExport(srv *Server, version float64, w http.ResponseWriter, r
 	return nil
 	return nil
 }
 }
 
 
-func getImagesJSON(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesJSON(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -181,7 +194,7 @@ func getImagesJSON(srv *Server, version float64, w http.ResponseWriter, r *http.
 	var (
 	var (
 		err  error
 		err  error
 		outs *engine.Table
 		outs *engine.Table
-		job  = srv.Eng.Job("images")
+		job  = eng.Job("images")
 	)
 	)
 
 
 	job.Setenv("filter", r.Form.Get("filter"))
 	job.Setenv("filter", r.Form.Get("filter"))
@@ -219,39 +232,39 @@ func getImagesJSON(srv *Server, version float64, w http.ResponseWriter, r *http.
 	return nil
 	return nil
 }
 }
 
 
-func getImagesViz(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesViz(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if version > 1.6 {
 	if version > 1.6 {
 		w.WriteHeader(http.StatusNotFound)
 		w.WriteHeader(http.StatusNotFound)
 		return fmt.Errorf("This is now implemented in the client.")
 		return fmt.Errorf("This is now implemented in the client.")
 	}
 	}
-	srv.Eng.ServeHTTP(w, r)
+	eng.ServeHTTP(w, r)
 	return nil
 	return nil
 }
 }
 
 
-func getInfo(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getInfo(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	w.Header().Set("Content-Type", "application/json")
 	w.Header().Set("Content-Type", "application/json")
-	srv.Eng.ServeHTTP(w, r)
+	eng.ServeHTTP(w, r)
 	return nil
 	return nil
 }
 }
 
 
-func getEvents(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getEvents(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 
 
 	w.Header().Set("Content-Type", "application/json")
 	w.Header().Set("Content-Type", "application/json")
-	var job = srv.Eng.Job("events", r.RemoteAddr)
+	var job = eng.Job("events", r.RemoteAddr)
 	job.Stdout.Add(utils.NewWriteFlusher(w))
 	job.Stdout.Add(utils.NewWriteFlusher(w))
 	job.Setenv("since", r.Form.Get("since"))
 	job.Setenv("since", r.Form.Get("since"))
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func getImagesHistory(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesHistory(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
 
 
-	var job = srv.Eng.Job("history", vars["name"])
+	var job = eng.Job("history", vars["name"])
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 
 
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
@@ -260,17 +273,17 @@ func getImagesHistory(srv *Server, version float64, w http.ResponseWriter, r *ht
 	return nil
 	return nil
 }
 }
 
 
-func getContainersChanges(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersChanges(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	var job = srv.Eng.Job("changes", vars["name"])
+	var job = eng.Job("changes", vars["name"])
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 
 
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func getContainersTop(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersTop(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if version < 1.4 {
 	if version < 1.4 {
 		return fmt.Errorf("top was improved a lot since 1.3, Please upgrade your docker client.")
 		return fmt.Errorf("top was improved a lot since 1.3, Please upgrade your docker client.")
 	}
 	}
@@ -281,19 +294,19 @@ func getContainersTop(srv *Server, version float64, w http.ResponseWriter, r *ht
 		return err
 		return err
 	}
 	}
 
 
-	job := srv.Eng.Job("top", vars["name"], r.Form.Get("ps_args"))
+	job := eng.Job("top", vars["name"], r.Form.Get("ps_args"))
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func getContainersJSON(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersJSON(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 	var (
 	var (
 		err  error
 		err  error
 		outs *engine.Table
 		outs *engine.Table
-		job  = srv.Eng.Job("containers")
+		job  = eng.Job("containers")
 	)
 	)
 
 
 	job.Setenv("all", r.Form.Get("all"))
 	job.Setenv("all", r.Form.Get("all"))
@@ -323,7 +336,7 @@ func getContainersJSON(srv *Server, version float64, w http.ResponseWriter, r *h
 	return nil
 	return nil
 }
 }
 
 
-func postImagesTag(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesTag(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -331,7 +344,7 @@ func postImagesTag(srv *Server, version float64, w http.ResponseWriter, r *http.
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
 
 
-	job := srv.Eng.Job("tag", vars["name"], r.Form.Get("repo"), r.Form.Get("tag"))
+	job := eng.Job("tag", vars["name"], r.Form.Get("repo"), r.Form.Get("tag"))
 	job.Setenv("force", r.Form.Get("force"))
 	job.Setenv("force", r.Form.Get("force"))
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
 		return err
 		return err
@@ -340,14 +353,14 @@ func postImagesTag(srv *Server, version float64, w http.ResponseWriter, r *http.
 	return nil
 	return nil
 }
 }
 
 
-func postCommit(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postCommit(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 	var (
 	var (
 		config engine.Env
 		config engine.Env
 		env    engine.Env
 		env    engine.Env
-		job    = srv.Eng.Job("commit", r.Form.Get("container"))
+		job    = eng.Job("commit", r.Form.Get("container"))
 	)
 	)
 	if err := config.Import(r.Body); err != nil {
 	if err := config.Import(r.Body); err != nil {
 		utils.Errorf("%s", err)
 		utils.Errorf("%s", err)
@@ -369,7 +382,7 @@ func postCommit(srv *Server, version float64, w http.ResponseWriter, r *http.Req
 }
 }
 
 
 // Creates an image from Pull or from Import
 // Creates an image from Pull or from Import
-func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesCreate(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -399,12 +412,12 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht
 				metaHeaders[k] = v
 				metaHeaders[k] = v
 			}
 			}
 		}
 		}
-		job = srv.Eng.Job("pull", r.Form.Get("fromImage"), tag)
+		job = eng.Job("pull", r.Form.Get("fromImage"), tag)
 		job.SetenvBool("parallel", version > 1.3)
 		job.SetenvBool("parallel", version > 1.3)
 		job.SetenvJson("metaHeaders", metaHeaders)
 		job.SetenvJson("metaHeaders", metaHeaders)
 		job.SetenvJson("authConfig", authConfig)
 		job.SetenvJson("authConfig", authConfig)
 	} else { //import
 	} else { //import
-		job = srv.Eng.Job("import", r.Form.Get("fromSrc"), r.Form.Get("repo"), tag)
+		job = eng.Job("import", r.Form.Get("fromSrc"), r.Form.Get("repo"), tag)
 		job.Stdin.Add(r.Body)
 		job.Stdin.Add(r.Body)
 	}
 	}
 
 
@@ -421,7 +434,7 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht
 	return nil
 	return nil
 }
 }
 
 
-func getImagesSearch(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesSearch(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -445,7 +458,7 @@ func getImagesSearch(srv *Server, version float64, w http.ResponseWriter, r *htt
 		}
 		}
 	}
 	}
 
 
-	var job = srv.Eng.Job("search", r.Form.Get("term"))
+	var job = eng.Job("search", r.Form.Get("term"))
 	job.SetenvJson("metaHeaders", metaHeaders)
 	job.SetenvJson("metaHeaders", metaHeaders)
 	job.SetenvJson("authConfig", authConfig)
 	job.SetenvJson("authConfig", authConfig)
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
@@ -453,7 +466,7 @@ func getImagesSearch(srv *Server, version float64, w http.ResponseWriter, r *htt
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesInsert(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -464,7 +477,7 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht
 		w.Header().Set("Content-Type", "application/json")
 		w.Header().Set("Content-Type", "application/json")
 	}
 	}
 
 
-	job := srv.Eng.Job("insert", vars["name"], r.Form.Get("url"), r.Form.Get("path"))
+	job := eng.Job("insert", vars["name"], r.Form.Get("url"), r.Form.Get("path"))
 	job.SetenvBool("json", version > 1.0)
 	job.SetenvBool("json", version > 1.0)
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
@@ -478,7 +491,7 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht
 	return nil
 	return nil
 }
 }
 
 
-func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesPush(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -512,7 +525,7 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
 	if version > 1.0 {
 	if version > 1.0 {
 		w.Header().Set("Content-Type", "application/json")
 		w.Header().Set("Content-Type", "application/json")
 	}
 	}
-	job := srv.Eng.Job("push", vars["name"])
+	job := eng.Job("push", vars["name"])
 	job.SetenvJson("metaHeaders", metaHeaders)
 	job.SetenvJson("metaHeaders", metaHeaders)
 	job.SetenvJson("authConfig", authConfig)
 	job.SetenvJson("authConfig", authConfig)
 	job.SetenvBool("json", version > 1.0)
 	job.SetenvBool("json", version > 1.0)
@@ -528,31 +541,31 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
 	return nil
 	return nil
 }
 }
 
 
-func getImagesGet(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesGet(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
 	if version > 1.0 {
 	if version > 1.0 {
 		w.Header().Set("Content-Type", "application/x-tar")
 		w.Header().Set("Content-Type", "application/x-tar")
 	}
 	}
-	job := srv.Eng.Job("image_export", vars["name"])
+	job := eng.Job("image_export", vars["name"])
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func postImagesLoad(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
-	job := srv.Eng.Job("load")
+func postImagesLoad(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+	job := eng.Job("load")
 	job.Stdin.Add(r.Body)
 	job.Stdin.Add(r.Body)
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersCreate(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return nil
 		return nil
 	}
 	}
 	var (
 	var (
 		out         engine.Env
 		out         engine.Env
-		job         = srv.Eng.Job("create", r.Form.Get("name"))
+		job         = eng.Job("create", r.Form.Get("name"))
 		outWarnings []string
 		outWarnings []string
 		outId       string
 		outId       string
 		warnings    = bytes.NewBuffer(nil)
 		warnings    = bytes.NewBuffer(nil)
@@ -577,14 +590,14 @@ func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r
 	return writeJSON(w, http.StatusCreated, out)
 	return writeJSON(w, http.StatusCreated, out)
 }
 }
 
 
-func postContainersRestart(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersRestart(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	job := srv.Eng.Job("restart", vars["name"])
+	job := eng.Job("restart", vars["name"])
 	job.Setenv("t", r.Form.Get("t"))
 	job.Setenv("t", r.Form.Get("t"))
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
 		return err
 		return err
@@ -593,14 +606,14 @@ func postContainersRestart(srv *Server, version float64, w http.ResponseWriter,
 	return nil
 	return nil
 }
 }
 
 
-func deleteContainers(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func deleteContainers(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	job := srv.Eng.Job("container_delete", vars["name"])
+	job := eng.Job("container_delete", vars["name"])
 	job.Setenv("removeVolume", r.Form.Get("v"))
 	job.Setenv("removeVolume", r.Form.Get("v"))
 	job.Setenv("removeLink", r.Form.Get("link"))
 	job.Setenv("removeLink", r.Form.Get("link"))
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
@@ -610,29 +623,29 @@ func deleteContainers(srv *Server, version float64, w http.ResponseWriter, r *ht
 	return nil
 	return nil
 }
 }
 
 
-func deleteImages(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func deleteImages(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	var job = srv.Eng.Job("image_delete", vars["name"])
+	var job = eng.Job("image_delete", vars["name"])
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	job.SetenvBool("autoPrune", version > 1.1)
 	job.SetenvBool("autoPrune", version > 1.1)
 
 
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func postContainersStart(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersStart(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
 	name := vars["name"]
 	name := vars["name"]
-	job := srv.Eng.Job("start", name)
+	job := eng.Job("start", name)
 	// allow a nil body for backwards compatibility
 	// allow a nil body for backwards compatibility
 	if r.Body != nil {
 	if r.Body != nil {
-		if matchesContentType(r.Header.Get("Content-Type"), "application/json") {
+		if MatchesContentType(r.Header.Get("Content-Type"), "application/json") {
 			if err := job.DecodeEnv(r.Body); err != nil {
 			if err := job.DecodeEnv(r.Body); err != nil {
 				return err
 				return err
 			}
 			}
@@ -645,14 +658,14 @@ func postContainersStart(srv *Server, version float64, w http.ResponseWriter, r
 	return nil
 	return nil
 }
 }
 
 
-func postContainersStop(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersStop(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	job := srv.Eng.Job("stop", vars["name"])
+	job := eng.Job("stop", vars["name"])
 	job.Setenv("t", r.Form.Get("t"))
 	job.Setenv("t", r.Form.Get("t"))
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
 		return err
 		return err
@@ -661,14 +674,14 @@ func postContainersStop(srv *Server, version float64, w http.ResponseWriter, r *
 	return nil
 	return nil
 }
 }
 
 
-func postContainersWait(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersWait(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
 	var (
 	var (
 		env    engine.Env
 		env    engine.Env
 		status string
 		status string
-		job    = srv.Eng.Job("wait", vars["name"])
+		job    = eng.Job("wait", vars["name"])
 	)
 	)
 	job.Stdout.AddString(&status)
 	job.Stdout.AddString(&status)
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
@@ -683,20 +696,20 @@ func postContainersWait(srv *Server, version float64, w http.ResponseWriter, r *
 	return writeJSON(w, http.StatusOK, env)
 	return writeJSON(w, http.StatusOK, env)
 }
 }
 
 
-func postContainersResize(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersResize(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	if err := srv.Eng.Job("resize", vars["name"], r.Form.Get("h"), r.Form.Get("w")).Run(); err != nil {
+	if err := eng.Job("resize", vars["name"], r.Form.Get("h"), r.Form.Get("w")).Run(); err != nil {
 		return err
 		return err
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func postContainersAttach(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersAttach(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -705,7 +718,7 @@ func postContainersAttach(srv *Server, version float64, w http.ResponseWriter, r
 	}
 	}
 
 
 	var (
 	var (
-		job    = srv.Eng.Job("inspect", vars["name"], "container")
+		job    = eng.Job("inspect", vars["name"], "container")
 		c, err = job.Stdout.AddEnv()
 		c, err = job.Stdout.AddEnv()
 	)
 	)
 	if err != nil {
 	if err != nil {
@@ -745,7 +758,7 @@ func postContainersAttach(srv *Server, version float64, w http.ResponseWriter, r
 		errStream = outStream
 		errStream = outStream
 	}
 	}
 
 
-	job = srv.Eng.Job("attach", vars["name"])
+	job = eng.Job("attach", vars["name"])
 	job.Setenv("logs", r.Form.Get("logs"))
 	job.Setenv("logs", r.Form.Get("logs"))
 	job.Setenv("stream", r.Form.Get("stream"))
 	job.Setenv("stream", r.Form.Get("stream"))
 	job.Setenv("stdin", r.Form.Get("stdin"))
 	job.Setenv("stdin", r.Form.Get("stdin"))
@@ -761,7 +774,7 @@ func postContainersAttach(srv *Server, version float64, w http.ResponseWriter, r
 	return nil
 	return nil
 }
 }
 
 
-func wsContainersAttach(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func wsContainersAttach(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -769,13 +782,13 @@ func wsContainersAttach(srv *Server, version float64, w http.ResponseWriter, r *
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
 
 
-	if err := srv.Eng.Job("inspect", vars["name"], "container").Run(); err != nil {
+	if err := eng.Job("inspect", vars["name"], "container").Run(); err != nil {
 		return err
 		return err
 	}
 	}
 
 
 	h := websocket.Handler(func(ws *websocket.Conn) {
 	h := websocket.Handler(func(ws *websocket.Conn) {
 		defer ws.Close()
 		defer ws.Close()
-		job := srv.Eng.Job("attach", vars["name"])
+		job := eng.Job("attach", vars["name"])
 		job.Setenv("logs", r.Form.Get("logs"))
 		job.Setenv("logs", r.Form.Get("logs"))
 		job.Setenv("stream", r.Form.Get("stream"))
 		job.Setenv("stream", r.Form.Get("stream"))
 		job.Setenv("stdin", r.Form.Get("stdin"))
 		job.Setenv("stdin", r.Form.Get("stdin"))
@@ -793,27 +806,27 @@ func wsContainersAttach(srv *Server, version float64, w http.ResponseWriter, r *
 	return nil
 	return nil
 }
 }
 
 
-func getContainersByName(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersByName(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	var job = srv.Eng.Job("inspect", vars["name"], "container")
+	var job = eng.Job("inspect", vars["name"], "container")
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	job.SetenvBool("conflict", true) //conflict=true to detect conflict between containers and images in the job
 	job.SetenvBool("conflict", true) //conflict=true to detect conflict between containers and images in the job
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func getImagesByName(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesByName(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
-	var job = srv.Eng.Job("inspect", vars["name"], "image")
+	var job = eng.Job("inspect", vars["name"], "image")
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	job.SetenvBool("conflict", true) //conflict=true to detect conflict between containers and images in the job
 	job.SetenvBool("conflict", true) //conflict=true to detect conflict between containers and images in the job
 	return job.Run()
 	return job.Run()
 }
 }
 
 
-func postBuild(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postBuild(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if version < 1.3 {
 	if version < 1.3 {
 		return fmt.Errorf("Multipart upload for build is no longer supported. Please upgrade your docker client.")
 		return fmt.Errorf("Multipart upload for build is no longer supported. Please upgrade your docker client.")
 	}
 	}
@@ -822,7 +835,7 @@ func postBuild(srv *Server, version float64, w http.ResponseWriter, r *http.Requ
 		authConfig        = &auth.AuthConfig{}
 		authConfig        = &auth.AuthConfig{}
 		configFileEncoded = r.Header.Get("X-Registry-Config")
 		configFileEncoded = r.Header.Get("X-Registry-Config")
 		configFile        = &auth.ConfigFile{}
 		configFile        = &auth.ConfigFile{}
-		job               = srv.Eng.Job("build")
+		job               = eng.Job("build")
 	)
 	)
 
 
 	// This block can be removed when API versions prior to 1.9 are deprecated.
 	// This block can be removed when API versions prior to 1.9 are deprecated.
@@ -870,7 +883,7 @@ func postBuild(srv *Server, version float64, w http.ResponseWriter, r *http.Requ
 	return nil
 	return nil
 }
 }
 
 
-func postContainersCopy(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersCopy(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -892,7 +905,7 @@ func postContainersCopy(srv *Server, version float64, w http.ResponseWriter, r *
 		copyData.Set("Resource", copyData.Get("Resource")[1:])
 		copyData.Set("Resource", copyData.Get("Resource")[1:])
 	}
 	}
 
 
-	job := srv.Eng.Job("container_copy", vars["name"], copyData.Get("Resource"))
+	job := eng.Job("container_copy", vars["name"], copyData.Get("Resource"))
 	job.Stdout.Add(w)
 	job.Stdout.Add(w)
 	if err := job.Run(); err != nil {
 	if err := job.Run(); err != nil {
 		utils.Errorf("%s", err.Error())
 		utils.Errorf("%s", err.Error())
@@ -900,7 +913,7 @@ func postContainersCopy(srv *Server, version float64, w http.ResponseWriter, r *
 	return nil
 	return nil
 }
 }
 
 
-func optionsHandler(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func optionsHandler(eng *engine.Engine, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	w.WriteHeader(http.StatusOK)
 	w.WriteHeader(http.StatusOK)
 	return nil
 	return nil
 }
 }
@@ -910,7 +923,7 @@ func writeCorsHeaders(w http.ResponseWriter, r *http.Request) {
 	w.Header().Add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS")
 	w.Header().Add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS")
 }
 }
 
 
-func makeHttpHandler(srv *Server, logging bool, localMethod string, localRoute string, handlerFunc HttpApiFunc, enableCors bool) http.HandlerFunc {
+func makeHttpHandler(eng *engine.Engine, logging bool, localMethod string, localRoute string, handlerFunc HttpApiFunc, enableCors bool, dockerVersion string) http.HandlerFunc {
 	return func(w http.ResponseWriter, r *http.Request) {
 	return func(w http.ResponseWriter, r *http.Request) {
 		// log the request
 		// log the request
 		utils.Debugf("Calling %s %s", localMethod, localRoute)
 		utils.Debugf("Calling %s %s", localMethod, localRoute)
@@ -921,8 +934,8 @@ func makeHttpHandler(srv *Server, logging bool, localMethod string, localRoute s
 
 
 		if strings.Contains(r.Header.Get("User-Agent"), "Docker-Client/") {
 		if strings.Contains(r.Header.Get("User-Agent"), "Docker-Client/") {
 			userAgent := strings.Split(r.Header.Get("User-Agent"), "/")
 			userAgent := strings.Split(r.Header.Get("User-Agent"), "/")
-			if len(userAgent) == 2 && userAgent[1] != VERSION {
-				utils.Debugf("Warning: client and server don't have the same version (client: %s, server: %s)", userAgent[1], VERSION)
+			if len(userAgent) == 2 && userAgent[1] != dockerVersion {
+				utils.Debugf("Warning: client and server don't have the same version (client: %s, server: %s)", userAgent[1], dockerVersion)
 			}
 			}
 		}
 		}
 		version, err := strconv.ParseFloat(mux.Vars(r)["version"], 64)
 		version, err := strconv.ParseFloat(mux.Vars(r)["version"], 64)
@@ -938,7 +951,7 @@ func makeHttpHandler(srv *Server, logging bool, localMethod string, localRoute s
 			return
 			return
 		}
 		}
 
 
-		if err := handlerFunc(srv, version, w, r, mux.Vars(r)); err != nil {
+		if err := handlerFunc(eng, version, w, r, mux.Vars(r)); err != nil {
 			utils.Errorf("Error: %s", err)
 			utils.Errorf("Error: %s", err)
 			httpError(w, err)
 			httpError(w, err)
 		}
 		}
@@ -971,7 +984,7 @@ func AttachProfiler(router *mux.Router) {
 	router.HandleFunc("/debug/pprof/threadcreate", pprof.Handler("threadcreate").ServeHTTP)
 	router.HandleFunc("/debug/pprof/threadcreate", pprof.Handler("threadcreate").ServeHTTP)
 }
 }
 
 
-func createRouter(srv *Server, logging, enableCors bool) (*mux.Router, error) {
+func createRouter(eng *engine.Engine, logging, enableCors bool, dockerVersion string) (*mux.Router, error) {
 	r := mux.NewRouter()
 	r := mux.NewRouter()
 	if os.Getenv("DEBUG") != "" {
 	if os.Getenv("DEBUG") != "" {
 		AttachProfiler(r)
 		AttachProfiler(r)
@@ -1032,7 +1045,7 @@ func createRouter(srv *Server, logging, enableCors bool) (*mux.Router, error) {
 			localMethod := method
 			localMethod := method
 
 
 			// build the handler function
 			// build the handler function
-			f := makeHttpHandler(srv, logging, localMethod, localRoute, localFct, enableCors)
+			f := makeHttpHandler(eng, logging, localMethod, localRoute, localFct, enableCors, dockerVersion)
 
 
 			// add the new route
 			// add the new route
 			if localRoute == "" {
 			if localRoute == "" {
@@ -1050,8 +1063,8 @@ func createRouter(srv *Server, logging, enableCors bool) (*mux.Router, error) {
 // ServeRequest processes a single http request to the docker remote api.
 // ServeRequest processes a single http request to the docker remote api.
 // FIXME: refactor this to be part of Server and not require re-creating a new
 // FIXME: refactor this to be part of Server and not require re-creating a new
 // router each time. This requires first moving ListenAndServe into Server.
 // router each time. This requires first moving ListenAndServe into Server.
-func ServeRequest(srv *Server, apiversion float64, w http.ResponseWriter, req *http.Request) error {
-	router, err := createRouter(srv, false, true)
+func ServeRequest(eng *engine.Engine, apiversion float64, w http.ResponseWriter, req *http.Request) error {
+	router, err := createRouter(eng, false, true, "")
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -1093,8 +1106,8 @@ func ServeFd(addr string, handle http.Handler) error {
 
 
 // ListenAndServe sets up the required http.Server and gets it listening for
 // ListenAndServe sets up the required http.Server and gets it listening for
 // each addr passed in and does protocol specific checking.
 // each addr passed in and does protocol specific checking.
-func ListenAndServe(proto, addr string, srv *Server, logging, enableCors bool) error {
-	r, err := createRouter(srv, logging, enableCors)
+func ListenAndServe(proto, addr string, eng *engine.Engine, logging, enableCors bool, dockerVersion string) error {
+	r, err := createRouter(eng, logging, enableCors, dockerVersion)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 15 - 1
http_test.go → api/api_unit_test.go

@@ -1,4 +1,4 @@
-package docker
+package api
 
 
 import (
 import (
 	"fmt"
 	"fmt"
@@ -7,6 +7,20 @@ import (
 	"testing"
 	"testing"
 )
 )
 
 
+func TestJsonContentType(t *testing.T) {
+	if !MatchesContentType("application/json", "application/json") {
+		t.Fail()
+	}
+
+	if !MatchesContentType("application/json; charset=utf-8", "application/json") {
+		t.Fail()
+	}
+
+	if MatchesContentType("dockerapplication/json", "application/json") {
+		t.Fail()
+	}
+}
+
 func TestGetBoolParam(t *testing.T) {
 func TestGetBoolParam(t *testing.T) {
 	if ret, err := getBoolParam("true"); err != nil || !ret {
 	if ret, err := getBoolParam("true"); err != nil || !ret {
 		t.Fatalf("true -> true, nil | got %t %s", ret, err)
 		t.Fatalf("true -> true, nil | got %t %s", ret, err)

+ 0 - 19
api_unit_test.go

@@ -1,19 +0,0 @@
-package docker
-
-import (
-	"testing"
-)
-
-func TestJsonContentType(t *testing.T) {
-	if !matchesContentType("application/json", "application/json") {
-		t.Fail()
-	}
-
-	if !matchesContentType("application/json; charset=utf-8", "application/json") {
-		t.Fail()
-	}
-
-	if matchesContentType("dockerapplication/json", "application/json") {
-		t.Fail()
-	}
-}

+ 6 - 5
commands.go

@@ -8,6 +8,7 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
+	"github.com/dotcloud/docker/api"
 	"github.com/dotcloud/docker/archive"
 	"github.com/dotcloud/docker/archive"
 	"github.com/dotcloud/docker/auth"
 	"github.com/dotcloud/docker/auth"
 	"github.com/dotcloud/docker/engine"
 	"github.com/dotcloud/docker/engine"
@@ -79,7 +80,7 @@ func (cli *DockerCli) CmdHelp(args ...string) error {
 			return nil
 			return nil
 		}
 		}
 	}
 	}
-	help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[unix://%s]: tcp://host:port to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTUNIXSOCKET)
+	help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[unix://%s]: tcp://host:port to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", api.DEFAULTUNIXSOCKET)
 	for _, command := range [][]string{
 	for _, command := range [][]string{
 		{"attach", "Attach to a running container"},
 		{"attach", "Attach to a running container"},
 		{"build", "Build a container from a Dockerfile"},
 		{"build", "Build a container from a Dockerfile"},
@@ -2283,7 +2284,7 @@ func (cli *DockerCli) call(method, path string, data interface{}, passAuthInfo b
 	re := regexp.MustCompile("/+")
 	re := regexp.MustCompile("/+")
 	path = re.ReplaceAllString(path, "/")
 	path = re.ReplaceAllString(path, "/")
 
 
-	req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", APIVERSION, path), params)
+	req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", api.APIVERSION, path), params)
 	if err != nil {
 	if err != nil {
 		return nil, -1, err
 		return nil, -1, err
 	}
 	}
@@ -2360,7 +2361,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer, h
 	re := regexp.MustCompile("/+")
 	re := regexp.MustCompile("/+")
 	path = re.ReplaceAllString(path, "/")
 	path = re.ReplaceAllString(path, "/")
 
 
-	req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", APIVERSION, path), in)
+	req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", api.APIVERSION, path), in)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -2405,7 +2406,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer, h
 		return fmt.Errorf("Error: %s", bytes.TrimSpace(body))
 		return fmt.Errorf("Error: %s", bytes.TrimSpace(body))
 	}
 	}
 
 
-	if matchesContentType(resp.Header.Get("Content-Type"), "application/json") {
+	if api.MatchesContentType(resp.Header.Get("Content-Type"), "application/json") {
 		return utils.DisplayJSONMessagesStream(resp.Body, out, cli.terminalFd, cli.isTerminal)
 		return utils.DisplayJSONMessagesStream(resp.Body, out, cli.terminalFd, cli.isTerminal)
 	}
 	}
 	if _, err := io.Copy(out, resp.Body); err != nil {
 	if _, err := io.Copy(out, resp.Body); err != nil {
@@ -2424,7 +2425,7 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
 	re := regexp.MustCompile("/+")
 	re := regexp.MustCompile("/+")
 	path = re.ReplaceAllString(path, "/")
 	path = re.ReplaceAllString(path, "/")
 
 
-	req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", APIVERSION, path), nil)
+	req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", api.APIVERSION, path), nil)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 2 - 1
docker/docker.go

@@ -3,6 +3,7 @@ package main
 import (
 import (
 	"fmt"
 	"fmt"
 	"github.com/dotcloud/docker"
 	"github.com/dotcloud/docker"
+	"github.com/dotcloud/docker/api"
 	"github.com/dotcloud/docker/engine"
 	"github.com/dotcloud/docker/engine"
 	flag "github.com/dotcloud/docker/pkg/mflag"
 	flag "github.com/dotcloud/docker/pkg/mflag"
 	"github.com/dotcloud/docker/sysinit"
 	"github.com/dotcloud/docker/sysinit"
@@ -57,7 +58,7 @@ func main() {
 
 
 		if defaultHost == "" || *flDaemon {
 		if defaultHost == "" || *flDaemon {
 			// If we do not have a host, default to unix socket
 			// If we do not have a host, default to unix socket
-			defaultHost = fmt.Sprintf("unix://%s", docker.DEFAULTUNIXSOCKET)
+			defaultHost = fmt.Sprintf("unix://%s", api.DEFAULTUNIXSOCKET)
 		}
 		}
 		flHosts.Set(defaultHost)
 		flHosts.Set(defaultHost)
 	}
 	}

+ 33 - 54
integration/api_test.go

@@ -7,6 +7,7 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"github.com/dotcloud/docker"
 	"github.com/dotcloud/docker"
+	"github.com/dotcloud/docker/api"
 	"github.com/dotcloud/docker/engine"
 	"github.com/dotcloud/docker/engine"
 	"github.com/dotcloud/docker/utils"
 	"github.com/dotcloud/docker/utils"
 	"io"
 	"io"
@@ -21,7 +22,6 @@ import (
 func TestGetVersion(t *testing.T) {
 func TestGetVersion(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	var err error
 	var err error
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
@@ -31,7 +31,7 @@ func TestGetVersion(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	// FIXME getting the version should require an actual running Server
 	// FIXME getting the version should require an actual running Server
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -58,7 +58,6 @@ func TestGetVersion(t *testing.T) {
 func TestGetInfo(t *testing.T) {
 func TestGetInfo(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	job := eng.Job("images")
 	job := eng.Job("images")
 	initialImages, err := job.Stdout.AddListTable()
 	initialImages, err := job.Stdout.AddListTable()
@@ -74,7 +73,7 @@ func TestGetInfo(t *testing.T) {
 	}
 	}
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -122,7 +121,7 @@ func TestGetEvents(t *testing.T) {
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 	setTimeout(t, "", 500*time.Millisecond, func() {
 	setTimeout(t, "", 500*time.Millisecond, func() {
-		if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+		if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 		assertHttpNotError(r, t)
 		assertHttpNotError(r, t)
@@ -146,7 +145,6 @@ func TestGetEvents(t *testing.T) {
 func TestGetImagesJSON(t *testing.T) {
 func TestGetImagesJSON(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	job := eng.Job("images")
 	job := eng.Job("images")
 	initialImages, err := job.Stdout.AddListTable()
 	initialImages, err := job.Stdout.AddListTable()
@@ -164,7 +162,7 @@ func TestGetImagesJSON(t *testing.T) {
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -199,7 +197,7 @@ func TestGetImagesJSON(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r2, req2); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r2, req2); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r2, t)
 	assertHttpNotError(r2, t)
@@ -232,7 +230,7 @@ func TestGetImagesJSON(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r3, req3); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r3, req3); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r3, t)
 	assertHttpNotError(r3, t)
@@ -250,7 +248,6 @@ func TestGetImagesJSON(t *testing.T) {
 func TestGetImagesHistory(t *testing.T) {
 func TestGetImagesHistory(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
@@ -258,7 +255,7 @@ func TestGetImagesHistory(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -275,7 +272,6 @@ func TestGetImagesHistory(t *testing.T) {
 func TestGetImagesByName(t *testing.T) {
 func TestGetImagesByName(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	req, err := http.NewRequest("GET", "/images/"+unitTestImageName+"/json", nil)
 	req, err := http.NewRequest("GET", "/images/"+unitTestImageName+"/json", nil)
 	if err != nil {
 	if err != nil {
@@ -283,7 +279,7 @@ func TestGetImagesByName(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -300,7 +296,6 @@ func TestGetImagesByName(t *testing.T) {
 func TestGetContainersJSON(t *testing.T) {
 func TestGetContainersJSON(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	job := eng.Job("containers")
 	job := eng.Job("containers")
 	job.SetenvBool("all", true)
 	job.SetenvBool("all", true)
@@ -328,7 +323,7 @@ func TestGetContainersJSON(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -347,7 +342,6 @@ func TestGetContainersJSON(t *testing.T) {
 func TestGetContainersExport(t *testing.T) {
 func TestGetContainersExport(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	// Create a container and remove a file
 	// Create a container and remove a file
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
@@ -365,7 +359,7 @@ func TestGetContainersExport(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -396,7 +390,6 @@ func TestGetContainersExport(t *testing.T) {
 func TestGetContainersChanges(t *testing.T) {
 func TestGetContainersChanges(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	// Create a container and remove a file
 	// Create a container and remove a file
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
@@ -413,7 +406,7 @@ func TestGetContainersChanges(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -437,7 +430,6 @@ func TestGetContainersChanges(t *testing.T) {
 func TestGetContainersTop(t *testing.T) {
 func TestGetContainersTop(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -481,7 +473,7 @@ func TestGetContainersTop(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -514,7 +506,6 @@ func TestGetContainersTop(t *testing.T) {
 func TestGetContainersByName(t *testing.T) {
 func TestGetContainersByName(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	// Create a container and remove a file
 	// Create a container and remove a file
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
@@ -530,7 +521,7 @@ func TestGetContainersByName(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -565,7 +556,7 @@ func TestPostCommit(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -585,7 +576,6 @@ func TestPostCommit(t *testing.T) {
 func TestPostContainersCreate(t *testing.T) {
 func TestPostContainersCreate(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	configJSON, err := json.Marshal(&docker.Config{
 	configJSON, err := json.Marshal(&docker.Config{
 		Image:  unitTestImageID,
 		Image:  unitTestImageID,
@@ -602,7 +592,7 @@ func TestPostContainersCreate(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -627,7 +617,6 @@ func TestPostContainersCreate(t *testing.T) {
 func TestPostContainersKill(t *testing.T) {
 func TestPostContainersKill(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -652,7 +641,7 @@ func TestPostContainersKill(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -667,7 +656,6 @@ func TestPostContainersKill(t *testing.T) {
 func TestPostContainersRestart(t *testing.T) {
 func TestPostContainersRestart(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -692,7 +680,7 @@ func TestPostContainersRestart(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -713,7 +701,6 @@ func TestPostContainersRestart(t *testing.T) {
 func TestPostContainersStart(t *testing.T) {
 func TestPostContainersStart(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(
 	containerID := createTestContainer(
 		eng,
 		eng,
@@ -735,7 +722,7 @@ func TestPostContainersStart(t *testing.T) {
 	req.Header.Set("Content-Type", "application/json")
 	req.Header.Set("Content-Type", "application/json")
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -752,7 +739,7 @@ func TestPostContainersStart(t *testing.T) {
 	}
 	}
 
 
 	r = httptest.NewRecorder()
 	r = httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	// Starting an already started container should return an error
 	// Starting an already started container should return an error
@@ -767,7 +754,6 @@ func TestPostContainersStart(t *testing.T) {
 func TestRunErrorBindMountRootSource(t *testing.T) {
 func TestRunErrorBindMountRootSource(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(
 	containerID := createTestContainer(
 		eng,
 		eng,
@@ -791,7 +777,7 @@ func TestRunErrorBindMountRootSource(t *testing.T) {
 	req.Header.Set("Content-Type", "application/json")
 	req.Header.Set("Content-Type", "application/json")
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusInternalServerError {
 	if r.Code != http.StatusInternalServerError {
@@ -803,7 +789,6 @@ func TestRunErrorBindMountRootSource(t *testing.T) {
 func TestPostContainersStop(t *testing.T) {
 func TestPostContainersStop(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -829,7 +814,7 @@ func TestPostContainersStop(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -844,7 +829,6 @@ func TestPostContainersStop(t *testing.T) {
 func TestPostContainersWait(t *testing.T) {
 func TestPostContainersWait(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -862,7 +846,7 @@ func TestPostContainersWait(t *testing.T) {
 		if err != nil {
 		if err != nil {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
-		if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+		if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 		assertHttpNotError(r, t)
 		assertHttpNotError(r, t)
@@ -883,7 +867,6 @@ func TestPostContainersWait(t *testing.T) {
 func TestPostContainersAttach(t *testing.T) {
 func TestPostContainersAttach(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -921,7 +904,7 @@ func TestPostContainersAttach(t *testing.T) {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 
 
-		if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+		if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 		assertHttpNotError(r.ResponseRecorder, t)
 		assertHttpNotError(r.ResponseRecorder, t)
@@ -962,7 +945,6 @@ func TestPostContainersAttach(t *testing.T) {
 func TestPostContainersAttachStderr(t *testing.T) {
 func TestPostContainersAttachStderr(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -1000,7 +982,7 @@ func TestPostContainersAttachStderr(t *testing.T) {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 
 
-		if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+		if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 		assertHttpNotError(r.ResponseRecorder, t)
 		assertHttpNotError(r.ResponseRecorder, t)
@@ -1044,7 +1026,6 @@ func TestPostContainersAttachStderr(t *testing.T) {
 func TestDeleteContainers(t *testing.T) {
 func TestDeleteContainers(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
 		&docker.Config{
 		&docker.Config{
@@ -1058,7 +1039,7 @@ func TestDeleteContainers(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -1071,13 +1052,13 @@ func TestDeleteContainers(t *testing.T) {
 func TestOptionsRoute(t *testing.T) {
 func TestOptionsRoute(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
+
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 	req, err := http.NewRequest("OPTIONS", "/", nil)
 	req, err := http.NewRequest("OPTIONS", "/", nil)
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -1089,14 +1070,14 @@ func TestOptionsRoute(t *testing.T) {
 func TestGetEnabledCors(t *testing.T) {
 func TestGetEnabledCors(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
+
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
 	req, err := http.NewRequest("GET", "/version", nil)
 	req, err := http.NewRequest("GET", "/version", nil)
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)
@@ -1122,7 +1103,6 @@ func TestGetEnabledCors(t *testing.T) {
 func TestDeleteImages(t *testing.T) {
 func TestDeleteImages(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	initialImages := getImages(eng, t, true, "")
 	initialImages := getImages(eng, t, true, "")
 
 
@@ -1142,7 +1122,7 @@ func TestDeleteImages(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusConflict {
 	if r.Code != http.StatusConflict {
@@ -1155,7 +1135,7 @@ func TestDeleteImages(t *testing.T) {
 	}
 	}
 
 
 	r2 := httptest.NewRecorder()
 	r2 := httptest.NewRecorder()
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r2, req2); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r2, req2); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r2, t)
 	assertHttpNotError(r2, t)
@@ -1180,7 +1160,6 @@ func TestDeleteImages(t *testing.T) {
 func TestPostContainersCopy(t *testing.T) {
 func TestPostContainersCopy(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkRuntimeFromEngine(eng, t).Nuke()
 	defer mkRuntimeFromEngine(eng, t).Nuke()
-	srv := mkServerFromEngine(eng, t)
 
 
 	// Create a container and remove a file
 	// Create a container and remove a file
 	containerID := createTestContainer(eng,
 	containerID := createTestContainer(eng,
@@ -1208,7 +1187,7 @@ func TestPostContainersCopy(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	req.Header.Add("Content-Type", "application/json")
 	req.Header.Add("Content-Type", "application/json")
-	if err := docker.ServeRequest(srv, docker.APIVERSION, r, req); err != nil {
+	if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	assertHttpNotError(r, t)
 	assertHttpNotError(r, t)

+ 2 - 1
opts.go

@@ -2,6 +2,7 @@ package docker
 
 
 import (
 import (
 	"fmt"
 	"fmt"
+	"github.com/dotcloud/docker/api"
 	"github.com/dotcloud/docker/utils"
 	"github.com/dotcloud/docker/utils"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
@@ -129,7 +130,7 @@ func ValidateEnv(val string) (string, error) {
 }
 }
 
 
 func ValidateHost(val string) (string, error) {
 func ValidateHost(val string) (string, error) {
-	host, err := utils.ParseHost(DEFAULTHTTPHOST, DEFAULTHTTPPORT, DEFAULTUNIXSOCKET, val)
+	host, err := utils.ParseHost(api.DEFAULTHTTPHOST, api.DEFAULTHTTPPORT, api.DEFAULTUNIXSOCKET, val)
 	if err != nil {
 	if err != nil {
 		return val, err
 		return val, err
 	}
 	}

+ 2 - 1
server.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
+	"github.com/dotcloud/docker/api"
 	"github.com/dotcloud/docker/archive"
 	"github.com/dotcloud/docker/archive"
 	"github.com/dotcloud/docker/auth"
 	"github.com/dotcloud/docker/auth"
 	"github.com/dotcloud/docker/engine"
 	"github.com/dotcloud/docker/engine"
@@ -122,7 +123,7 @@ func (srv *Server) ListenAndServe(job *engine.Job) engine.Status {
 		protoAddrParts := strings.SplitN(protoAddr, "://", 2)
 		protoAddrParts := strings.SplitN(protoAddr, "://", 2)
 		go func() {
 		go func() {
 			log.Printf("Listening for HTTP on %s (%s)\n", protoAddrParts[0], protoAddrParts[1])
 			log.Printf("Listening for HTTP on %s (%s)\n", protoAddrParts[0], protoAddrParts[1])
-			chErrors <- ListenAndServe(protoAddrParts[0], protoAddrParts[1], srv, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"))
+			chErrors <- api.ListenAndServe(protoAddrParts[0], protoAddrParts[1], srv.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), VERSION)
 		}()
 		}()
 	}
 	}