From a260417927a95ad356d7bab6da1d1c972c9d7bfe Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 12 Dec 2016 20:18:17 -0600 Subject: [PATCH] [plugins] return err when failing remove Fixes a case where removing the plugin from disk would fail silently. Also moves pluginStore remove after we remove from disk, so 'docker plugin ls' doesn't isn't empty in case it errors out. Signed-off-by: Christopher Jones (cherry picked from commit fb11164c4f71315c96ddf3de46ff4689a5bac59c) Signed-off-by: Victor Vieux --- plugin/backend_linux.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/plugin/backend_linux.go b/plugin/backend_linux.go index 739f7b83cd..1bad3713f4 100644 --- a/plugin/backend_linux.go +++ b/plugin/backend_linux.go @@ -5,7 +5,6 @@ package plugin import ( "bytes" "encoding/json" - "errors" "fmt" "io" "io/ioutil" @@ -23,6 +22,7 @@ import ( "github.com/docker/docker/plugin/distribution" "github.com/docker/docker/plugin/v2" "github.com/docker/docker/reference" + "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -268,7 +268,7 @@ func (pm *Manager) Push(name string, metaHeader http.Header, authConfig *types.A } // Remove deletes plugin's root directory. -func (pm *Manager) Remove(name string, config *types.PluginRmConfig) error { +func (pm *Manager) Remove(name string, config *types.PluginRmConfig) (err error) { p, err := pm.pluginStore.GetByName(name) pm.mu.RLock() c := pm.cMap[p] @@ -294,12 +294,18 @@ func (pm *Manager) Remove(name string, config *types.PluginRmConfig) error { } id := p.GetID() - pm.pluginStore.Remove(p) pluginDir := filepath.Join(pm.libRoot, id) - if err := os.RemoveAll(pluginDir); err != nil { - logrus.Warnf("unable to remove %q from plugin remove: %v", pluginDir, err) + + defer func() { + if err == nil || config.ForceRemove { + pm.pluginStore.Remove(p) + pm.pluginEventLogger(id, name, "remove") + } + }() + + if err = os.RemoveAll(pluginDir); err != nil { + return errors.Wrap(err, "failed to remove plugin directory") } - pm.pluginEventLogger(id, name, "remove") return nil }