Browse code

Fix volume driver API compatibility mode (a little)

Signed-off-by: Stephen Rust <srust@blockbridge.com>

Stephen Rust authored on 2016/02/03 01:35:05
Showing 3 changed files
... ...
@@ -24,11 +24,18 @@ func init() {
24 24
 	})
25 25
 }
26 26
 
27
+type vol struct {
28
+	Name       string
29
+	Mountpoint string
30
+	Opts       map[string]string
31
+}
32
+
27 33
 type DockerExternalVolumeSuiteCompatV1_1 struct {
28
-	server *httptest.Server
29
-	ds     *DockerSuite
30
-	d      *Daemon
31
-	ec     *eventCounter
34
+	server  *httptest.Server
35
+	ds      *DockerSuite
36
+	d       *Daemon
37
+	ec      *eventCounter
38
+	volList []vol
32 39
 }
33 40
 
34 41
 func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpTest(c *check.C) {
... ...
@@ -47,6 +54,7 @@ func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpSuite(c *check.C) {
47 47
 
48 48
 	type pluginRequest struct {
49 49
 		Name string
50
+		Opts map[string]string
50 51
 	}
51 52
 
52 53
 	type pluginResp struct {
... ...
@@ -54,12 +62,6 @@ func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpSuite(c *check.C) {
54 54
 		Err        string `json:",omitempty"`
55 55
 	}
56 56
 
57
-	type vol struct {
58
-		Name       string
59
-		Mountpoint string
60
-	}
61
-	var volList []vol
62
-
63 57
 	read := func(b io.ReadCloser) (pluginRequest, error) {
64 58
 		defer b.Close()
65 59
 		var pr pluginRequest
... ...
@@ -94,7 +96,7 @@ func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpSuite(c *check.C) {
94 94
 			send(w, err)
95 95
 			return
96 96
 		}
97
-		volList = append(volList, vol{Name: pr.Name})
97
+		s.volList = append(s.volList, vol{Name: pr.Name, Opts: pr.Opts})
98 98
 		send(w, nil)
99 99
 	})
100 100
 
... ...
@@ -111,13 +113,13 @@ func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpSuite(c *check.C) {
111 111
 			return
112 112
 		}
113 113
 
114
-		for i, v := range volList {
114
+		for i, v := range s.volList {
115 115
 			if v.Name == pr.Name {
116 116
 				if err := os.RemoveAll(hostVolumePath(v.Name)); err != nil {
117 117
 					send(w, fmt.Sprintf(`{"Err": "%v"}`, err))
118 118
 					return
119 119
 				}
120
-				volList = append(volList[:i], volList[i+1:]...)
120
+				s.volList = append(s.volList[:i], s.volList[i+1:]...)
121 121
 				break
122 122
 			}
123 123
 		}
... ...
@@ -213,3 +215,20 @@ func (s *DockerExternalVolumeSuiteCompatV1_1) TestExternalVolumeDriverCompatV1_1
213 213
 	out, err = s.d.Cmd("volume", "rm", "foo")
214 214
 	c.Assert(err, checker.IsNil, check.Commentf(out))
215 215
 }
216
+
217
+func (s *DockerExternalVolumeSuiteCompatV1_1) TestExternalVolumeDriverCompatOptionsV1_1(c *check.C) {
218
+	err := s.d.StartWithBusybox()
219
+	c.Assert(err, checker.IsNil)
220
+
221
+	out, err := s.d.Cmd("volume", "create", "--name", "optvol", "--driver", "test-external-volume-driver", "--opt", "opt1=opt1val", "--opt", "opt2=opt2val")
222
+	c.Assert(err, checker.IsNil, check.Commentf(out))
223
+
224
+	out, err = s.d.Cmd("volume", "inspect", "optvol")
225
+	c.Assert(err, checker.IsNil, check.Commentf(out))
226
+
227
+	c.Assert(s.volList[0].Opts["opt1"], checker.Equals, "opt1val")
228
+	c.Assert(s.volList[0].Opts["opt2"], checker.Equals, "opt2val")
229
+
230
+	out, err = s.d.Cmd("volume", "rm", "optvol")
231
+	c.Assert(err, checker.IsNil, check.Commentf(out))
232
+}
... ...
@@ -15,7 +15,20 @@ func (a *volumeDriverAdapter) Name() string {
15 15
 }
16 16
 
17 17
 func (a *volumeDriverAdapter) Create(name string, opts map[string]string) (volume.Volume, error) {
18
-	err := a.proxy.Create(name, opts)
18
+	// First try a Get. For drivers that support Get this will return any
19
+	// existing volume.
20
+	v, err := a.proxy.Get(name)
21
+	if v != nil {
22
+		return &volumeAdapter{
23
+			proxy:      a.proxy,
24
+			name:       v.Name,
25
+			driverName: a.Name(),
26
+			eMount:     v.Mountpoint,
27
+		}, nil
28
+	}
29
+
30
+	// Driver didn't support Get or volume didn't exist. Perform Create.
31
+	err = a.proxy.Create(name, opts)
19 32
 	if err != nil {
20 33
 		return nil, err
21 34
 	}
... ...
@@ -192,9 +192,6 @@ func (s *VolumeStore) create(name, driverName string, opts map[string]string) (v
192 192
 		return nil, &OpErr{Op: "create", Name: name, Err: err}
193 193
 	}
194 194
 
195
-	if v, err := vd.Get(name); err == nil {
196
-		return v, nil
197
-	}
198 195
 	return vd.Create(name, opts)
199 196
 }
200 197