Quellcode durchsuchen

[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 <tophj@linux.vnet.ibm.com>
Christopher Jones vor 8 Jahren
Ursprung
Commit
fb11164c4f
1 geänderte Dateien mit 12 neuen und 6 gelöschten Zeilen
  1. 12 6
      plugin/backend_linux.go

+ 12 - 6
plugin/backend_linux.go

@@ -5,7 +5,6 @@ package plugin
 import (
 import (
 	"bytes"
 	"bytes"
 	"encoding/json"
 	"encoding/json"
-	"errors"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 	"io/ioutil"
 	"io/ioutil"
@@ -23,6 +22,7 @@ import (
 	"github.com/docker/docker/plugin/distribution"
 	"github.com/docker/docker/plugin/distribution"
 	"github.com/docker/docker/plugin/v2"
 	"github.com/docker/docker/plugin/v2"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
+	"github.com/pkg/errors"
 	"golang.org/x/net/context"
 	"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.
 // 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)
 	p, err := pm.pluginStore.GetByName(name)
 	pm.mu.RLock()
 	pm.mu.RLock()
 	c := pm.cMap[p]
 	c := pm.cMap[p]
@@ -294,12 +294,18 @@ func (pm *Manager) Remove(name string, config *types.PluginRmConfig) error {
 	}
 	}
 
 
 	id := p.GetID()
 	id := p.GetID()
-	pm.pluginStore.Remove(p)
 	pluginDir := filepath.Join(pm.libRoot, id)
 	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
 	return nil
 }
 }