Skip to content

Commit

Permalink
remove images by name or ID, not always ID
Browse files Browse the repository at this point in the history
Signed-off-by: Victor Vieux <[email protected]>
  • Loading branch information
vieux committed May 14, 2015
1 parent b89d07a commit 2cb0395
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 32 deletions.
32 changes: 7 additions & 25 deletions api/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -477,36 +477,18 @@ func deleteImages(c *context, w http.ResponseWriter, r *http.Request) {
}
var name = mux.Vars(r)["name"]

matchedImages := []*cluster.Image{}
for _, image := range c.cluster.Images() {
if image.Match(name) {
matchedImages = append(matchedImages, image)
}
out, err := c.cluster.RemoveImages(name)
if err != nil {
httpError(w, err.Error(), http.StatusInternalServerError)
return
}

if len(matchedImages) == 0 {
if len(out) == 0 {
httpError(w, fmt.Sprintf("No such image %s", name), http.StatusNotFound)
return
}

out := []*dockerclient.ImageDelete{}
errs := []string{}
for _, image := range matchedImages {
content, err := c.cluster.RemoveImage(image)
if err != nil {
errs = append(errs, fmt.Sprintf("%s: %s", image.Engine.Name, err.Error()))
continue
}
out = append(out, content...)
}

if len(errs) != 0 {
httpError(w, strings.Join(errs, ""), http.StatusInternalServerError)
} else {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(NewWriteFlusher(w)).Encode(out)
}

w.Header().Set("Content-Type", "application/json")
json.NewEncoder(NewWriteFlusher(w)).Encode(out)
}

// GET /_ping
Expand Down
4 changes: 2 additions & 2 deletions cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ type Cluster interface {
// Return one image matching `IDOrName`
Image(IDOrName string) *Image

// Remove an image from the cluster
RemoveImage(image *Image) ([]*dockerclient.ImageDelete, error)
// Remove images from the cluster
RemoveImages(name string) ([]*dockerclient.ImageDelete, error)

// Return all containers
Containers() []*Container
Expand Down
4 changes: 2 additions & 2 deletions cluster/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,8 @@ func (e *Engine) updateSpecs() error {
}

// RemoveImage deletes an image from the engine.
func (e *Engine) RemoveImage(image *Image) ([]*dockerclient.ImageDelete, error) {
return e.client.RemoveImage(image.Id)
func (e *Engine) RemoveImage(image *Image, name string) ([]*dockerclient.ImageDelete, error) {
return e.client.RemoveImage(name)
}

// RefreshImages refreshes the list of images on the engine.
Expand Down
27 changes: 24 additions & 3 deletions cluster/swarm/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,11 +242,32 @@ 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) {
// RemoveImages removes all the images that match `name` from the cluster
func (c *Cluster) RemoveImages(name string) ([]*dockerclient.ImageDelete, error) {
c.Lock()
defer c.Unlock()
return image.Engine.RemoveImage(image)

out := []*dockerclient.ImageDelete{}
errs := []string{}
var err error
for _, n := range c.engines {
for _, image := range n.Images() {
if image.Match(name) {
content, err := image.Engine.RemoveImage(image, name)
if err != nil {
errs = append(errs, fmt.Sprintf("%s: %s", image.Engine.Name, err.Error()))
continue
}
out = append(out, content...)
}
}
}

if len(errs) > 0 {
err = errors.New(strings.Join(errs, "\n"))
}

return out, err
}

// Pull is exported
Expand Down

0 comments on commit 2cb0395

Please sign in to comment.