// +build linux package volume import ( "context" "testing" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/volume" "github.com/docker/docker/integration-cli/daemon" ) // TestCreateDerefOnError ensures that if a volume create fails, that the plugin is dereferenced // Normally 1 volume == 1 reference to a plugin, which prevents a plugin from being removed. // If the volume create fails, we should make sure to dereference the plugin. func TestCreateDerefOnError(t *testing.T) { t.Parallel() d := daemon.New(t, "", dockerdBinary, daemon.Config{}) d.Start(t) defer d.Stop(t) c, err := d.NewClient() if err != nil { t.Fatal(err) } pName := "testderef" createPlugin(t, c, pName, "create-error", asVolumeDriver) if err := c.PluginEnable(context.Background(), pName, types.PluginEnableOptions{Timeout: 30}); err != nil { t.Fatal(err) } _, err = c.VolumeCreate(context.Background(), volume.VolumesCreateBody{ Driver: pName, Name: "fake", }) if err == nil { t.Fatal("volume create should have failed") } if err := c.PluginDisable(context.Background(), pName, types.PluginDisableOptions{}); err != nil { t.Fatal(err) } if err := c.PluginRemove(context.Background(), pName, types.PluginRemoveOptions{}); err != nil { t.Fatal(err) } }