mirror of https://github.com/docker/docs.git
Merge pull request #20682 from cpuguy83/fix_volplugin_panics
Fix panic when plugin responds with null volume
This commit is contained in:
commit
0ad04242b4
|
@ -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")
|
||||||
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue