Merge pull request #20682 from cpuguy83/fix_volplugin_panics

Fix panic when plugin responds with null volume
This commit is contained in:
Vincent Demeester 2016-02-25 09:32:54 +01:00
commit 0ad04242b4
2 changed files with 27 additions and 2 deletions

View File

@ -60,6 +60,7 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
type pluginRequest struct { type pluginRequest struct {
Name string Name string
Opts map[string]string
} }
type pluginResp struct { type pluginResp struct {
@ -70,6 +71,7 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
type vol struct { type vol struct {
Name string Name string
Mountpoint string Mountpoint string
Ninja bool // hack used to trigger an null volume return on `Get`
} }
var volList []vol var volList []vol
@ -107,7 +109,8 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
send(w, err) send(w, err)
return return
} }
volList = append(volList, vol{Name: pr.Name}) _, isNinja := pr.Opts["ninja"]
volList = append(volList, vol{Name: pr.Name, Ninja: isNinja})
send(w, nil) send(w, nil)
}) })
@ -126,6 +129,10 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
for _, v := range volList { for _, v := range volList {
if v.Name == pr.Name { if v.Name == pr.Name {
if v.Ninja {
send(w, map[string]vol{})
return
}
v.Mountpoint = hostVolumePath(pr.Name) v.Mountpoint = hostVolumePath(pr.Name)
send(w, map[string]vol{"Volume": v}) send(w, map[string]vol{"Volume": v})
return return
@ -423,3 +430,12 @@ func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverWithDaemnRestart(c *
c.Assert(mounts, checker.HasLen, 1) c.Assert(mounts, checker.HasLen, 1)
c.Assert(mounts[0].Driver, checker.Equals, "test-external-volume-driver") c.Assert(mounts[0].Driver, checker.Equals, "test-external-volume-driver")
} }
// Ensures that the daemon handles when the plugin responds to a `Get` request with a null volume and a null error.
// Prior the daemon would panic in this scenario.
func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverGetEmptyResponse(c *check.C) {
dockerCmd(c, "volume", "create", "-d", "test-external-volume-driver", "--name", "abc", "--opt", "ninja=1")
out, _, err := dockerCmdWithError("volume", "inspect", "abc")
c.Assert(err, checker.NotNil, check.Commentf(out))
c.Assert(out, checker.Contains, "No such volume")
}

View File

@ -1,6 +1,10 @@
package volumedrivers package volumedrivers
import "github.com/docker/docker/volume" import (
"fmt"
"github.com/docker/docker/volume"
)
type volumeDriverAdapter struct { type volumeDriverAdapter struct {
name string name string
@ -49,6 +53,11 @@ func (a *volumeDriverAdapter) Get(name string) (volume.Volume, error) {
return nil, err return nil, err
} }
// plugin may have returned no volume and no error
if v == nil {
return nil, fmt.Errorf("no such volume")
}
return &volumeAdapter{ return &volumeAdapter{
proxy: a.proxy, proxy: a.proxy,
name: v.Name, name: v.Name,