From 99393cf3cfd08de769f0c37f06b912fb3771a080 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 6 Sep 2013 12:04:00 +0200 Subject: [PATCH] Delete corresponding Devices when deleting Images If an image is deleted and there is a corresponding device for that image we also delete the image. --- runtime.go | 13 +++++++++++++ runtime_test.go | 2 +- server.go | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/runtime.go b/runtime.go index 220ca1af6c..7d1c10a279 100644 --- a/runtime.go +++ b/runtime.go @@ -291,6 +291,19 @@ func (runtime *Runtime) Destroy(container *Container) error { return nil } +func (runtime *Runtime) DeleteImage(id string) error { + err := runtime.graph.Delete(id) + if err != nil { + return err + } + if runtime.GetMountMethod() == MountMethodDeviceMapper && runtime.deviceSet.HasDevice(id) { + if err := runtime.deviceSet.RemoveDevice(id); err != nil { + return fmt.Errorf("Unable to remove device for %v: %v", id, err) + } + } + return nil +} + func (runtime *Runtime) restore() error { wheel := "-\\|/" if os.Getenv("DEBUG") == "" && os.Getenv("TEST") == "" { diff --git a/runtime_test.go b/runtime_test.go index 503f519d12..f9a209008c 100644 --- a/runtime_test.go +++ b/runtime_test.go @@ -57,7 +57,7 @@ func cleanup(runtime *Runtime) error { } for _, image := range images { if image.ID != unitTestImageID { - runtime.graph.Delete(image.ID) + runtime.DeleteImage(image.ID) } } return nil diff --git a/server.go b/server.go index f0f6f40257..f3081db81a 100644 --- a/server.go +++ b/server.go @@ -1025,7 +1025,7 @@ func (srv *Server) deleteImageAndChildren(id string, imgs *[]APIRmi) error { if err := srv.runtime.repositories.DeleteAll(id); err != nil { return err } - err := srv.runtime.graph.Delete(id) + err := srv.runtime.DeleteImage(id) if err != nil { return err } @@ -1099,7 +1099,7 @@ func (srv *Server) ImageDelete(name string, autoPrune bool) ([]APIRmi, error) { return nil, fmt.Errorf("No such image: %s", name) } if !autoPrune { - if err := srv.runtime.graph.Delete(img.ID); err != nil { + if err := srv.runtime.DeleteImage(img.ID); err != nil { return nil, fmt.Errorf("Error deleting image %s: %s", name, err) } return nil, nil