diff --git a/api/api.go b/api/api.go index e35d85a133..3ee203afae 100644 --- a/api/api.go +++ b/api/api.go @@ -353,7 +353,7 @@ func deleteImages(c *context, w http.ResponseWriter, r *http.Request) { out := []*dockerclient.ImageDelete{} errs := []string{} for _, image := range matchedImages { - content, err := image.Node.DockerClient().RemoveImage(name) + content, err := c.cluster.RemoveImage(image) if err != nil { errs = append(errs, fmt.Sprintf("%s: %s", image.Node.Name(), err.Error())) continue diff --git a/api/events_test.go b/api/events_test.go index dc8747247e..eafbdd7639 100644 --- a/api/events_test.go +++ b/api/events_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/docker/swarm/cluster" - "github.com/samalba/dockerclient" "github.com/stretchr/testify/assert" ) @@ -20,7 +19,6 @@ func (fw *FakeWriter) Write(p []byte) (n int, err error) { type FakeNode struct{} -func (fn *FakeNode) DockerClient() dockerclient.Client { return nil } func (fn *FakeNode) ID() string { return "node_id" } func (fn *FakeNode) Name() string { return "node_name" } func (fn *FakeNode) IP() string { return "node_ip" } diff --git a/cluster/cluster.go b/cluster/cluster.go index 1844363b35..090a52e59d 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -15,6 +15,9 @@ type Cluster interface { // Return one image matching `IdOrName` Image(IdOrName string) *Image + // Remove an image from the cluster + RemoveImage(image *Image) ([]*dockerclient.ImageDelete, error) + // Return all containers Containers() []*Container diff --git a/cluster/node.go b/cluster/node.go index 8c26bcf150..a27b73c547 100644 --- a/cluster/node.go +++ b/cluster/node.go @@ -1,14 +1,8 @@ package cluster -import ( - "fmt" - - "github.com/samalba/dockerclient" -) +import "fmt" type Node interface { - DockerClient() dockerclient.Client - ID() string Name() string diff --git a/cluster/swarm/cluster.go b/cluster/swarm/cluster.go index 97eb90c0e9..9ccd7d8a43 100644 --- a/cluster/swarm/cluster.go +++ b/cluster/swarm/cluster.go @@ -186,6 +186,16 @@ func (c *Cluster) Image(IdOrName string) *cluster.Image { return nil } +// RemoveImage removes an image from the cluster +func (c *Cluster) RemoveImage(image *cluster.Image) ([]*dockerclient.ImageDelete, error) { + c.Lock() + defer c.Unlock() + if n, ok := image.Node.(*node); ok { + return n.removeImage(image) + } + return nil, nil +} + func (c *Cluster) Pull(name string, callback func(what, status string)) { size := len(c.nodes) done := make(chan bool, size) diff --git a/cluster/swarm/node.go b/cluster/swarm/node.go index cbcef9b038..bd67309f29 100644 --- a/cluster/swarm/node.go +++ b/cluster/swarm/node.go @@ -54,10 +54,6 @@ type node struct { overcommitRatio int64 } -func (n *node) DockerClient() dockerclient.Client { - return n.client -} - func (n *node) ID() string { return n.id } @@ -167,6 +163,11 @@ func (n *node) updateSpecs() error { return nil } +// Delete an image from the node. +func (n *node) removeImage(image *cluster.Image) ([]*dockerclient.ImageDelete, error) { + return n.client.RemoveImage(image.Id) +} + // Refresh the list of images on the node. func (n *node) refreshImages() error { images, err := n.client.ListImages() diff --git a/scheduler/filter/fakenode_test.go b/scheduler/filter/fakenode_test.go index afcda1982a..54dea30915 100644 --- a/scheduler/filter/fakenode_test.go +++ b/scheduler/filter/fakenode_test.go @@ -1,9 +1,6 @@ package filter -import ( - "github.com/docker/swarm/cluster" - "github.com/samalba/dockerclient" -) +import "github.com/docker/swarm/cluster" type FakeNode struct { id string @@ -14,12 +11,11 @@ type FakeNode struct { labels map[string]string } -func (fn *FakeNode) DockerClient() dockerclient.Client { return nil } -func (fn *FakeNode) ID() string { return fn.id } -func (fn *FakeNode) Name() string { return fn.name } -func (fn *FakeNode) IP() string { return "" } -func (fn *FakeNode) Addr() string { return fn.addr } -func (fn *FakeNode) Images() []*cluster.Image { return fn.images } +func (fn *FakeNode) ID() string { return fn.id } +func (fn *FakeNode) Name() string { return fn.name } +func (fn *FakeNode) IP() string { return "" } +func (fn *FakeNode) Addr() string { return fn.addr } +func (fn *FakeNode) Images() []*cluster.Image { return fn.images } func (fn *FakeNode) Image(id string) *cluster.Image { for _, image := range fn.images { if image.Id == id { diff --git a/scheduler/strategy/fakenode_test.go b/scheduler/strategy/fakenode_test.go index 67e3d7d18e..bd5c997c08 100644 --- a/scheduler/strategy/fakenode_test.go +++ b/scheduler/strategy/fakenode_test.go @@ -4,7 +4,6 @@ import ( "errors" "github.com/docker/swarm/cluster" - "github.com/samalba/dockerclient" ) type FakeNode struct { @@ -18,7 +17,6 @@ type FakeNode struct { containers []*cluster.Container } -func (fn *FakeNode) DockerClient() dockerclient.Client { return nil } func (fn *FakeNode) ID() string { return fn.id } func (fn *FakeNode) Name() string { return fn.name } func (fn *FakeNode) IP() string { return "" }