瀏覽代碼

Remove engine/job from graph

Signed-off-by: Antonio Murdaca <me@runcom.ninja>
Antonio Murdaca 10 年之前
父節點
當前提交
fa2c68a89e
共有 9 個文件被更改,包括 81 次插入236 次删除
  1. 17 16
      api/server/server.go
  2. 0 104
      api/server/server_unit_test.go
  3. 0 3
      daemon/daemon.go
  4. 13 10
      graph/export.go
  5. 6 13
      graph/load.go
  6. 3 4
      graph/load_unsupported.go
  7. 33 43
      graph/service.go
  8. 0 39
      graph/viz.go
  9. 9 4
      integration/runtime_test.go

+ 17 - 16
api/server/server.go

@@ -899,10 +899,7 @@ func (s *Server) getImagesGet(eng *engine.Engine, version version.Version, w htt
 	}
 
 	output := utils.NewWriteFlusher(w)
-	imageExportConfig := &graph.ImageExportConfig{
-		Engine:    eng,
-		Outstream: output,
-	}
+	imageExportConfig := &graph.ImageExportConfig{Outstream: output}
 	if name, ok := vars["name"]; ok {
 		imageExportConfig.Names = []string{name}
 	} else {
@@ -921,14 +918,7 @@ func (s *Server) getImagesGet(eng *engine.Engine, version version.Version, w htt
 }
 
 func (s *Server) postImagesLoad(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
-
-	imageLoadConfig := &graph.ImageLoadConfig{
-		InTar:     r.Body,
-		OutStream: w,
-		Engine:    eng,
-	}
-
-	return s.daemon.Repositories().Load(imageLoadConfig)
+	return s.daemon.Repositories().Load(r.Body, w)
 }
 
 func (s *Server) postContainersCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
@@ -1269,12 +1259,23 @@ func (s *Server) getImagesByName(eng *engine.Engine, version version.Version, w
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 	}
-	var job = eng.Job("image_inspect", vars["name"])
+
+	name := vars["name"]
 	if version.LessThan("1.12") {
-		job.SetenvBool("raw", true)
+		imageInspectRaw, err := s.daemon.Repositories().LookupRaw(name)
+		if err != nil {
+			return err
+		}
+
+		return writeJSON(w, http.StatusOK, imageInspectRaw)
 	}
-	streamJSON(job.Stdout, w, false)
-	return job.Run()
+
+	imageInspect, err := s.daemon.Repositories().Lookup(name)
+	if err != nil {
+		return err
+	}
+
+	return writeJSON(w, http.StatusOK, imageInspect)
 }
 
 func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {

+ 0 - 104
api/server/server_unit_test.go

@@ -1,104 +0,0 @@
-package server
-
-import (
-	"encoding/json"
-	"fmt"
-	"io"
-	"net/http"
-	"net/http/httptest"
-	"testing"
-
-	"github.com/docker/docker/api"
-	"github.com/docker/docker/engine"
-	"github.com/docker/docker/pkg/version"
-)
-
-func TestHttpError(t *testing.T) {
-	r := httptest.NewRecorder()
-	httpError(r, fmt.Errorf("No such method"))
-	if r.Code != http.StatusNotFound {
-		t.Fatalf("Expected %d, got %d", http.StatusNotFound, r.Code)
-	}
-
-	r = httptest.NewRecorder()
-	httpError(r, fmt.Errorf("This accound hasn't been activated"))
-	if r.Code != http.StatusForbidden {
-		t.Fatalf("Expected %d, got %d", http.StatusForbidden, r.Code)
-	}
-
-	r = httptest.NewRecorder()
-	httpError(r, fmt.Errorf("Some error"))
-	if r.Code != http.StatusInternalServerError {
-		t.Fatalf("Expected %d, got %d", http.StatusInternalServerError, r.Code)
-	}
-}
-
-func TestGetImagesByName(t *testing.T) {
-	eng := engine.New()
-	name := "image_name"
-	var called bool
-	eng.Register("image_inspect", func(job *engine.Job) error {
-		called = true
-		if job.Args[0] != name {
-			t.Fatalf("name != '%s': %#v", name, job.Args[0])
-		}
-		if api.APIVERSION.LessThan("1.12") && !job.GetenvBool("dirty") {
-			t.Fatal("dirty env variable not set")
-		} else if api.APIVERSION.GreaterThanOrEqualTo("1.12") && job.GetenvBool("dirty") {
-			t.Fatal("dirty env variable set when it shouldn't")
-		}
-		v := &engine.Env{}
-		v.SetBool("dirty", true)
-		if _, err := v.WriteTo(job.Stdout); err != nil {
-			return err
-		}
-		return nil
-	})
-	r := serveRequest("GET", "/images/"+name+"/json", nil, eng, t)
-	if !called {
-		t.Fatal("handler was not called")
-	}
-	if r.HeaderMap.Get("Content-Type") != "application/json" {
-		t.Fatalf("%#v\n", r)
-	}
-	var stdoutJson interface{}
-	if err := json.Unmarshal(r.Body.Bytes(), &stdoutJson); err != nil {
-		t.Fatalf("%#v", err)
-	}
-	if stdoutJson.(map[string]interface{})["dirty"].(float64) != 1 {
-		t.Fatalf("%#v", stdoutJson)
-	}
-}
-
-func serveRequest(method, target string, body io.Reader, eng *engine.Engine, t *testing.T) *httptest.ResponseRecorder {
-	return serveRequestUsingVersion(method, target, api.APIVERSION, body, eng, t)
-}
-
-func serveRequestUsingVersion(method, target string, version version.Version, body io.Reader, eng *engine.Engine, t *testing.T) *httptest.ResponseRecorder {
-	r := httptest.NewRecorder()
-	req, err := http.NewRequest(method, target, body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	ServeRequest(eng, version, r, req)
-	return r
-}
-
-func readEnv(src io.Reader, t *testing.T) *engine.Env {
-	out := engine.NewOutput()
-	v, err := out.AddEnv()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if _, err := io.Copy(out, src); err != nil {
-		t.Fatal(err)
-	}
-	out.Close()
-	return v
-}
-
-func assertContentType(recorder *httptest.ResponseRecorder, contentType string, t *testing.T) {
-	if recorder.HeaderMap.Get("Content-Type") != contentType {
-		t.Fatalf("%#v\n", recorder)
-	}
-}

+ 0 - 3
daemon/daemon.go

@@ -116,9 +116,6 @@ type Daemon struct {
 
 // Install installs daemon capabilities to eng.
 func (daemon *Daemon) Install(eng *engine.Engine) error {
-	if err := daemon.Repositories().Install(eng); err != nil {
-		return err
-	}
 	// FIXME: this hack is necessary for legacy integration tests to access
 	// the daemon object.
 	eng.HackSetGlobalVar("httpapi.daemon", daemon)

+ 13 - 10
graph/export.go

@@ -8,7 +8,6 @@ import (
 	"path"
 
 	"github.com/Sirupsen/logrus"
-	"github.com/docker/docker/engine"
 	"github.com/docker/docker/pkg/archive"
 	"github.com/docker/docker/pkg/parsers"
 	"github.com/docker/docker/registry"
@@ -22,7 +21,6 @@ import (
 type ImageExportConfig struct {
 	Names     []string
 	Outstream io.Writer
-	Engine    *engine.Engine
 }
 
 func (s *TagStore) ImageExport(imageExportConfig *ImageExportConfig) error {
@@ -51,7 +49,7 @@ func (s *TagStore) ImageExport(imageExportConfig *ImageExportConfig) error {
 			// this is a base repo name, like 'busybox'
 			for tag, id := range rootRepo {
 				addKey(name, tag, id)
-				if err := s.exportImage(imageExportConfig.Engine, id, tempdir); err != nil {
+				if err := s.exportImage(id, tempdir); err != nil {
 					return err
 				}
 			}
@@ -70,13 +68,13 @@ func (s *TagStore) ImageExport(imageExportConfig *ImageExportConfig) error {
 				if len(repoTag) > 0 {
 					addKey(repoName, repoTag, img.ID)
 				}
-				if err := s.exportImage(imageExportConfig.Engine, img.ID, tempdir); err != nil {
+				if err := s.exportImage(img.ID, tempdir); err != nil {
 					return err
 				}
 
 			} else {
 				// this must be an ID that didn't get looked up just right?
-				if err := s.exportImage(imageExportConfig.Engine, name, tempdir); err != nil {
+				if err := s.exportImage(name, tempdir); err != nil {
 					return err
 				}
 			}
@@ -107,7 +105,7 @@ func (s *TagStore) ImageExport(imageExportConfig *ImageExportConfig) error {
 }
 
 // FIXME: this should be a top-level function, not a class method
-func (s *TagStore) exportImage(eng *engine.Engine, name, tempdir string) error {
+func (s *TagStore) exportImage(name, tempdir string) error {
 	for n := name; n != ""; {
 		// temporary directory
 		tmpImageDir := path.Join(tempdir, n)
@@ -130,12 +128,17 @@ func (s *TagStore) exportImage(eng *engine.Engine, name, tempdir string) error {
 		if err != nil {
 			return err
 		}
-		job := eng.Job("image_inspect", n)
-		job.SetenvBool("raw", true)
-		job.Stdout.Add(json)
-		if err := job.Run(); err != nil {
+		imageInspectRaw, err := s.LookupRaw(n)
+		if err != nil {
 			return err
 		}
+		written, err := json.Write(imageInspectRaw)
+		if err != nil {
+			return err
+		}
+		if written != len(imageInspectRaw) {
+			logrus.Warnf("%d byes should have been written instead %d have been written", written, len(imageInspectRaw))
+		}
 
 		// serialize filesystem
 		fsTar, err := os.Create(path.Join(tmpImageDir, "layer.tar"))

+ 6 - 13
graph/load.go

@@ -10,21 +10,14 @@ import (
 	"path"
 
 	"github.com/Sirupsen/logrus"
-	"github.com/docker/docker/engine"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/pkg/archive"
 	"github.com/docker/docker/pkg/chrootarchive"
 )
 
-type ImageLoadConfig struct {
-	InTar     io.ReadCloser
-	OutStream io.Writer
-	Engine    *engine.Engine
-}
-
 // Loads a set of images into the repository. This is the complementary of ImageExport.
 // The input stream is an uncompressed tar ball containing images and metadata.
-func (s *TagStore) Load(imageLoadConfig *ImageLoadConfig) error {
+func (s *TagStore) Load(inTar io.ReadCloser, outStream io.Writer) error {
 	tmpImageDir, err := ioutil.TempDir("", "docker-import-")
 	if err != nil {
 		return err
@@ -48,7 +41,7 @@ func (s *TagStore) Load(imageLoadConfig *ImageLoadConfig) error {
 		excludes[i] = k
 		i++
 	}
-	if err := chrootarchive.Untar(imageLoadConfig.InTar, repoDir, &archive.TarOptions{ExcludePatterns: excludes}); err != nil {
+	if err := chrootarchive.Untar(inTar, repoDir, &archive.TarOptions{ExcludePatterns: excludes}); err != nil {
 		return err
 	}
 
@@ -59,7 +52,7 @@ func (s *TagStore) Load(imageLoadConfig *ImageLoadConfig) error {
 
 	for _, d := range dirs {
 		if d.IsDir() {
-			if err := s.recursiveLoad(imageLoadConfig.Engine, d.Name(), tmpImageDir); err != nil {
+			if err := s.recursiveLoad(d.Name(), tmpImageDir); err != nil {
 				return err
 			}
 		}
@@ -74,7 +67,7 @@ func (s *TagStore) Load(imageLoadConfig *ImageLoadConfig) error {
 
 		for imageName, tagMap := range repositories {
 			for tag, address := range tagMap {
-				if err := s.SetLoad(imageName, tag, address, true, imageLoadConfig.OutStream); err != nil {
+				if err := s.SetLoad(imageName, tag, address, true, outStream); err != nil {
 					return err
 				}
 			}
@@ -86,7 +79,7 @@ func (s *TagStore) Load(imageLoadConfig *ImageLoadConfig) error {
 	return nil
 }
 
-func (s *TagStore) recursiveLoad(eng *engine.Engine, address, tmpImageDir string) error {
+func (s *TagStore) recursiveLoad(address, tmpImageDir string) error {
 	if _, err := s.LookupImage(address); err != nil {
 		logrus.Debugf("Loading %s", address)
 
@@ -126,7 +119,7 @@ func (s *TagStore) recursiveLoad(eng *engine.Engine, address, tmpImageDir string
 
 		if img.Parent != "" {
 			if !s.graph.Exists(img.Parent) {
-				if err := s.recursiveLoad(eng, img.Parent, tmpImageDir); err != nil {
+				if err := s.recursiveLoad(img.Parent, tmpImageDir); err != nil {
 					return err
 				}
 			}

+ 3 - 4
graph/load_unsupported.go

@@ -4,10 +4,9 @@ package graph
 
 import (
 	"fmt"
-
-	"github.com/docker/docker/engine"
+	"io"
 )
 
-func (s *TagStore) CmdLoad(job *engine.Job) error {
-	return fmt.Errorf("CmdLoad is not supported on this platform")
+func (s *TagStore) Load(inTar io.ReadCloser, outStream io.Writer) error {
+	return fmt.Errorf("Load is not supported on this platform")
 }

+ 33 - 43
graph/service.go

@@ -5,57 +5,47 @@ import (
 	"io"
 
 	"github.com/Sirupsen/logrus"
-	"github.com/docker/docker/engine"
+	"github.com/docker/docker/api/types"
 )
 
-func (s *TagStore) Install(eng *engine.Engine) error {
-	for name, handler := range map[string]engine.Handler{
-		"image_inspect": s.CmdLookup,
-		"viz":           s.CmdViz,
-	} {
-		if err := eng.Register(name, handler); err != nil {
-			return fmt.Errorf("Could not register %q: %v", name, err)
-		}
+func (s *TagStore) LookupRaw(name string) ([]byte, error) {
+	image, err := s.LookupImage(name)
+	if err != nil || image == nil {
+		return nil, fmt.Errorf("No such image %s", name)
+	}
+
+	imageInspectRaw, err := image.RawJson()
+	if err != nil {
+		return nil, err
 	}
-	return nil
+
+	return imageInspectRaw, nil
 }
 
-// CmdLookup return an image encoded in JSON
-func (s *TagStore) CmdLookup(job *engine.Job) error {
-	if len(job.Args) != 1 {
-		return fmt.Errorf("usage: %s NAME", job.Name)
+// Lookup return an image encoded in JSON
+func (s *TagStore) Lookup(name string) (*types.ImageInspect, error) {
+	image, err := s.LookupImage(name)
+	if err != nil || image == nil {
+		return nil, fmt.Errorf("No such image: %s", name)
 	}
-	name := job.Args[0]
-	if image, err := s.LookupImage(name); err == nil && image != nil {
-		if job.GetenvBool("raw") {
-			b, err := image.RawJson()
-			if err != nil {
-				return err
-			}
-			job.Stdout.Write(b)
-			return nil
-		}
 
-		out := &engine.Env{}
-		out.SetJson("Id", image.ID)
-		out.SetJson("Parent", image.Parent)
-		out.SetJson("Comment", image.Comment)
-		out.SetAuto("Created", image.Created)
-		out.SetJson("Container", image.Container)
-		out.SetJson("ContainerConfig", image.ContainerConfig)
-		out.Set("DockerVersion", image.DockerVersion)
-		out.SetJson("Author", image.Author)
-		out.SetJson("Config", image.Config)
-		out.Set("Architecture", image.Architecture)
-		out.Set("Os", image.OS)
-		out.SetInt64("Size", image.Size)
-		out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size)
-		if _, err = out.WriteTo(job.Stdout); err != nil {
-			return err
-		}
-		return nil
+	imageInspect := &types.ImageInspect{
+		Id:              image.ID,
+		Parent:          image.Parent,
+		Comment:         image.Comment,
+		Created:         image.Created,
+		Container:       image.Container,
+		ContainerConfig: &image.ContainerConfig,
+		DockerVersion:   image.DockerVersion,
+		Author:          image.Author,
+		Config:          image.Config,
+		Architecture:    image.Architecture,
+		Os:              image.OS,
+		Size:            image.Size,
+		VirtualSize:     image.GetParentsSize(0) + image.Size,
 	}
-	return fmt.Errorf("No such image: %s", name)
+
+	return imageInspect, nil
 }
 
 // ImageTarLayer return the tarLayer of the image

+ 0 - 39
graph/viz.go

@@ -1,39 +0,0 @@
-package graph
-
-import (
-	"fmt"
-	"strings"
-
-	"github.com/docker/docker/engine"
-	"github.com/docker/docker/image"
-)
-
-func (s *TagStore) CmdViz(job *engine.Job) error {
-	images, _ := s.graph.Map()
-	if images == nil {
-		return nil
-	}
-	job.Stdout.Write([]byte("digraph docker {\n"))
-
-	var (
-		parentImage *image.Image
-		err         error
-	)
-	for _, image := range images {
-		parentImage, err = image.GetParent()
-		if err != nil {
-			return fmt.Errorf("Error while getting parent image: %v", err)
-		}
-		if parentImage != nil {
-			job.Stdout.Write([]byte(" \"" + parentImage.ID + "\" -> \"" + image.ID + "\"\n"))
-		} else {
-			job.Stdout.Write([]byte(" base -> \"" + image.ID + "\" [style=invis]\n"))
-		}
-	}
-
-	for id, repos := range s.GetRepoRefs() {
-		job.Stdout.Write([]byte(" \"" + id + "\" [label=\"" + id + "\\n" + strings.Join(repos, "\\n") + "\",shape=box,fillcolor=\"paleturquoise\",style=\"filled,rounded\"];\n"))
-	}
-	job.Stdout.Write([]byte(" base [style=invisible]\n}\n"))
-	return nil
-}

+ 9 - 4
integration/runtime_test.go

@@ -125,17 +125,22 @@ func init() {
 
 func setupBaseImage() {
 	eng := newTestEngine(std_log.New(os.Stderr, "", 0), false, unitTestStoreBase)
-	job := eng.Job("image_inspect", unitTestImageName)
-	img, _ := job.Stdout.AddEnv()
+	d := getDaemon(eng)
+
+	_, err := d.Repositories().Lookup(unitTestImageName)
 	// If the unit test is not found, try to download it.
-	if err := job.Run(); err != nil || img.Get("Id") != unitTestImageID {
+	if err != nil {
+		// seems like we can just ignore the error here...
+		// there was a check of imgId from job stdout against unittestid but
+		// if there was an error how could the imgid from the job
+		// be compared?! it's obvious it's different, am I totally wrong?
+
 		// Retrieve the Image
 		imagePullConfig := &graph.ImagePullConfig{
 			Parallel:   true,
 			OutStream:  ioutils.NopWriteCloser(os.Stdout),
 			AuthConfig: &cliconfig.AuthConfig{},
 		}
-		d := getDaemon(eng)
 		if err := d.Repositories().Pull(unitTestImageName, "", imagePullConfig); err != nil {
 			logrus.Fatalf("Unable to pull the test image: %s", err)
 		}