|
@@ -60,6 +60,7 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
|
|
|
|
|
|
type pluginRequest struct {
|
|
|
Name string
|
|
|
+ Opts map[string]string
|
|
|
}
|
|
|
|
|
|
type pluginResp struct {
|
|
@@ -70,6 +71,7 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
|
|
|
type vol struct {
|
|
|
Name string
|
|
|
Mountpoint string
|
|
|
+ Ninja bool // hack used to trigger an null volume return on `Get`
|
|
|
}
|
|
|
var volList []vol
|
|
|
|
|
@@ -107,7 +109,8 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
|
|
|
send(w, err)
|
|
|
return
|
|
|
}
|
|
|
- volList = append(volList, vol{Name: pr.Name})
|
|
|
+ _, isNinja := pr.Opts["ninja"]
|
|
|
+ volList = append(volList, vol{Name: pr.Name, Ninja: isNinja})
|
|
|
send(w, nil)
|
|
|
})
|
|
|
|
|
@@ -126,6 +129,10 @@ func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) {
|
|
|
|
|
|
for _, v := range volList {
|
|
|
if v.Name == pr.Name {
|
|
|
+ if v.Ninja {
|
|
|
+ send(w, map[string]vol{})
|
|
|
+ return
|
|
|
+ }
|
|
|
v.Mountpoint = hostVolumePath(pr.Name)
|
|
|
send(w, map[string]vol{"Volume": v})
|
|
|
return
|
|
@@ -423,3 +430,12 @@ func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverWithDaemnRestart(c *
|
|
|
c.Assert(mounts, checker.HasLen, 1)
|
|
|
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")
|
|
|
+}
|