Browse code

Initialize activateWait for plugins activated by json spec

Signed-off-by: Madhu Venugopal <madhu@docker.com>

Madhu Venugopal authored on 2016/04/20 21:38:34
Showing 2 changed files
... ...
@@ -16,6 +16,7 @@ import (
16 16
 	"github.com/docker/docker/daemon/graphdriver"
17 17
 	"github.com/docker/docker/daemon/graphdriver/vfs"
18 18
 	"github.com/docker/docker/pkg/archive"
19
+	"github.com/docker/docker/pkg/plugins"
19 20
 	"github.com/go-check/check"
20 21
 )
21 22
 
... ...
@@ -26,10 +27,11 @@ func init() {
26 26
 }
27 27
 
28 28
 type DockerExternalGraphdriverSuite struct {
29
-	server *httptest.Server
30
-	ds     *DockerSuite
31
-	d      *Daemon
32
-	ec     *graphEventsCounter
29
+	server  *httptest.Server
30
+	jserver *httptest.Server
31
+	ds      *DockerSuite
32
+	d       *Daemon
33
+	ec      map[string]*graphEventsCounter
33 34
 }
34 35
 
35 36
 type graphEventsCounter struct {
... ...
@@ -51,7 +53,6 @@ type graphEventsCounter struct {
51 51
 
52 52
 func (s *DockerExternalGraphdriverSuite) SetUpTest(c *check.C) {
53 53
 	s.d = NewDaemon(c)
54
-	s.ec = &graphEventsCounter{}
55 54
 }
56 55
 
57 56
 func (s *DockerExternalGraphdriverSuite) TearDownTest(c *check.C) {
... ...
@@ -60,9 +61,30 @@ func (s *DockerExternalGraphdriverSuite) TearDownTest(c *check.C) {
60 60
 }
61 61
 
62 62
 func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
63
+	s.ec = make(map[string]*graphEventsCounter)
64
+	s.setUpPluginViaSpecFile(c)
65
+	s.setUpPluginViaJSONFile(c)
66
+}
67
+
68
+func (s *DockerExternalGraphdriverSuite) setUpPluginViaSpecFile(c *check.C) {
63 69
 	mux := http.NewServeMux()
64 70
 	s.server = httptest.NewServer(mux)
65 71
 
72
+	s.setUpPlugin(c, "test-external-graph-driver", "spec", mux, []byte(s.server.URL))
73
+}
74
+
75
+func (s *DockerExternalGraphdriverSuite) setUpPluginViaJSONFile(c *check.C) {
76
+	mux := http.NewServeMux()
77
+	s.jserver = httptest.NewServer(mux)
78
+
79
+	p := plugins.Plugin{Name: "json-external-graph-driver", Addr: s.jserver.URL}
80
+	b, err := json.Marshal(p)
81
+	c.Assert(err, check.IsNil)
82
+
83
+	s.setUpPlugin(c, "json-external-graph-driver", "json", mux, b)
84
+}
85
+
86
+func (s *DockerExternalGraphdriverSuite) setUpPlugin(c *check.C, name string, ext string, mux *http.ServeMux, b []byte) {
66 87
 	type graphDriverRequest struct {
67 88
 		ID         string `json:",omitempty"`
68 89
 		Parent     string `json:",omitempty"`
... ...
@@ -100,24 +122,25 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
100 100
 		return nil
101 101
 	}
102 102
 
103
-	base, err := ioutil.TempDir("", "external-graph-test")
103
+	base, err := ioutil.TempDir("", name)
104 104
 	c.Assert(err, check.IsNil)
105 105
 	vfsProto, err := vfs.Init(base, []string{}, nil, nil)
106 106
 	c.Assert(err, check.IsNil, check.Commentf("error initializing graph driver"))
107 107
 	driver := graphdriver.NewNaiveDiffDriver(vfsProto, nil, nil)
108 108
 
109
+	s.ec[ext] = &graphEventsCounter{}
109 110
 	mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
110
-		s.ec.activations++
111
+		s.ec[ext].activations++
111 112
 		respond(w, `{"Implements": ["GraphDriver"]}`)
112 113
 	})
113 114
 
114 115
 	mux.HandleFunc("/GraphDriver.Init", func(w http.ResponseWriter, r *http.Request) {
115
-		s.ec.init++
116
+		s.ec[ext].init++
116 117
 		respond(w, "{}")
117 118
 	})
118 119
 
119 120
 	mux.HandleFunc("/GraphDriver.CreateReadWrite", func(w http.ResponseWriter, r *http.Request) {
120
-		s.ec.creations++
121
+		s.ec[ext].creations++
121 122
 
122 123
 		var req graphDriverRequest
123 124
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -131,7 +154,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
131 131
 	})
132 132
 
133 133
 	mux.HandleFunc("/GraphDriver.Create", func(w http.ResponseWriter, r *http.Request) {
134
-		s.ec.creations++
134
+		s.ec[ext].creations++
135 135
 
136 136
 		var req graphDriverRequest
137 137
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -145,7 +168,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
145 145
 	})
146 146
 
147 147
 	mux.HandleFunc("/GraphDriver.Remove", func(w http.ResponseWriter, r *http.Request) {
148
-		s.ec.removals++
148
+		s.ec[ext].removals++
149 149
 
150 150
 		var req graphDriverRequest
151 151
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -160,7 +183,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
160 160
 	})
161 161
 
162 162
 	mux.HandleFunc("/GraphDriver.Get", func(w http.ResponseWriter, r *http.Request) {
163
-		s.ec.gets++
163
+		s.ec[ext].gets++
164 164
 
165 165
 		var req graphDriverRequest
166 166
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -176,7 +199,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
176 176
 	})
177 177
 
178 178
 	mux.HandleFunc("/GraphDriver.Put", func(w http.ResponseWriter, r *http.Request) {
179
-		s.ec.puts++
179
+		s.ec[ext].puts++
180 180
 
181 181
 		var req graphDriverRequest
182 182
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -191,7 +214,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
191 191
 	})
192 192
 
193 193
 	mux.HandleFunc("/GraphDriver.Exists", func(w http.ResponseWriter, r *http.Request) {
194
-		s.ec.exists++
194
+		s.ec[ext].exists++
195 195
 
196 196
 		var req graphDriverRequest
197 197
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -201,12 +224,12 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
201 201
 	})
202 202
 
203 203
 	mux.HandleFunc("/GraphDriver.Status", func(w http.ResponseWriter, r *http.Request) {
204
-		s.ec.stats++
204
+		s.ec[ext].stats++
205 205
 		respond(w, &graphDriverResponse{Status: driver.Status()})
206 206
 	})
207 207
 
208 208
 	mux.HandleFunc("/GraphDriver.Cleanup", func(w http.ResponseWriter, r *http.Request) {
209
-		s.ec.cleanups++
209
+		s.ec[ext].cleanups++
210 210
 		err := driver.Cleanup()
211 211
 		if err != nil {
212 212
 			respond(w, err)
... ...
@@ -216,7 +239,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
216 216
 	})
217 217
 
218 218
 	mux.HandleFunc("/GraphDriver.GetMetadata", func(w http.ResponseWriter, r *http.Request) {
219
-		s.ec.metadata++
219
+		s.ec[ext].metadata++
220 220
 
221 221
 		var req graphDriverRequest
222 222
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -232,7 +255,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
232 232
 	})
233 233
 
234 234
 	mux.HandleFunc("/GraphDriver.Diff", func(w http.ResponseWriter, r *http.Request) {
235
-		s.ec.diff++
235
+		s.ec[ext].diff++
236 236
 
237 237
 		var req graphDriverRequest
238 238
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -248,7 +271,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
248 248
 	})
249 249
 
250 250
 	mux.HandleFunc("/GraphDriver.Changes", func(w http.ResponseWriter, r *http.Request) {
251
-		s.ec.changes++
251
+		s.ec[ext].changes++
252 252
 		var req graphDriverRequest
253 253
 		if err := decReq(r.Body, &req, w); err != nil {
254 254
 			return
... ...
@@ -263,7 +286,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
263 263
 	})
264 264
 
265 265
 	mux.HandleFunc("/GraphDriver.ApplyDiff", func(w http.ResponseWriter, r *http.Request) {
266
-		s.ec.applydiff++
266
+		s.ec[ext].applydiff++
267 267
 		var diff archive.Reader = r.Body
268 268
 		defer r.Body.Close()
269 269
 
... ...
@@ -283,7 +306,7 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
283 283
 	})
284 284
 
285 285
 	mux.HandleFunc("/GraphDriver.DiffSize", func(w http.ResponseWriter, r *http.Request) {
286
-		s.ec.diffsize++
286
+		s.ec[ext].diffsize++
287 287
 
288 288
 		var req graphDriverRequest
289 289
 		if err := decReq(r.Body, &req, w); err != nil {
... ...
@@ -301,19 +324,26 @@ func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) {
301 301
 	err = os.MkdirAll("/etc/docker/plugins", 0755)
302 302
 	c.Assert(err, check.IsNil, check.Commentf("error creating /etc/docker/plugins"))
303 303
 
304
-	err = ioutil.WriteFile("/etc/docker/plugins/test-external-graph-driver.spec", []byte(s.server.URL), 0644)
305
-	c.Assert(err, check.IsNil, check.Commentf("error writing to /etc/docker/plugins/test-external-graph-driver.spec"))
304
+	specFile := "/etc/docker/plugins/" + name + "." + ext
305
+	err = ioutil.WriteFile(specFile, b, 0644)
306
+	c.Assert(err, check.IsNil, check.Commentf("error writing to %s", specFile))
306 307
 }
307 308
 
308 309
 func (s *DockerExternalGraphdriverSuite) TearDownSuite(c *check.C) {
309 310
 	s.server.Close()
311
+	s.jserver.Close()
310 312
 
311 313
 	err := os.RemoveAll("/etc/docker/plugins")
312 314
 	c.Assert(err, check.IsNil, check.Commentf("error removing /etc/docker/plugins"))
313 315
 }
314 316
 
315 317
 func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriver(c *check.C) {
316
-	if err := s.d.StartWithBusybox("-s", "test-external-graph-driver"); err != nil {
318
+	s.testExternalGraphDriver("test-external-graph-driver", "spec", c)
319
+	s.testExternalGraphDriver("json-external-graph-driver", "json", c)
320
+}
321
+
322
+func (s *DockerExternalGraphdriverSuite) testExternalGraphDriver(name string, ext string, c *check.C) {
323
+	if err := s.d.StartWithBusybox("-s", name); err != nil {
317 324
 		b, _ := ioutil.ReadFile(s.d.LogFileName())
318 325
 		c.Assert(err, check.IsNil, check.Commentf("\n%s", string(b)))
319 326
 	}
... ...
@@ -321,11 +351,11 @@ func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriver(c *check.C) {
321 321
 	out, err := s.d.Cmd("run", "-d", "--name=graphtest", "busybox", "sh", "-c", "echo hello > /hello")
322 322
 	c.Assert(err, check.IsNil, check.Commentf(out))
323 323
 
324
-	err = s.d.Restart("-s", "test-external-graph-driver")
324
+	err = s.d.Restart("-s", name)
325 325
 
326 326
 	out, err = s.d.Cmd("inspect", "--format='{{.GraphDriver.Name}}'", "graphtest")
327 327
 	c.Assert(err, check.IsNil, check.Commentf(out))
328
-	c.Assert(strings.TrimSpace(out), check.Equals, "test-external-graph-driver")
328
+	c.Assert(strings.TrimSpace(out), check.Equals, name)
329 329
 
330 330
 	out, err = s.d.Cmd("diff", "graphtest")
331 331
 	c.Assert(err, check.IsNil, check.Commentf(out))
... ...
@@ -342,19 +372,19 @@ func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriver(c *check.C) {
342 342
 
343 343
 	// Don't check s.ec.exists, because the daemon no longer calls the
344 344
 	// Exists function.
345
-	c.Assert(s.ec.activations, check.Equals, 2)
346
-	c.Assert(s.ec.init, check.Equals, 2)
347
-	c.Assert(s.ec.creations >= 1, check.Equals, true)
348
-	c.Assert(s.ec.removals >= 1, check.Equals, true)
349
-	c.Assert(s.ec.gets >= 1, check.Equals, true)
350
-	c.Assert(s.ec.puts >= 1, check.Equals, true)
351
-	c.Assert(s.ec.stats, check.Equals, 3)
352
-	c.Assert(s.ec.cleanups, check.Equals, 2)
353
-	c.Assert(s.ec.applydiff >= 1, check.Equals, true)
354
-	c.Assert(s.ec.changes, check.Equals, 1)
355
-	c.Assert(s.ec.diffsize, check.Equals, 0)
356
-	c.Assert(s.ec.diff, check.Equals, 0)
357
-	c.Assert(s.ec.metadata, check.Equals, 1)
345
+	c.Assert(s.ec[ext].activations, check.Equals, 2)
346
+	c.Assert(s.ec[ext].init, check.Equals, 2)
347
+	c.Assert(s.ec[ext].creations >= 1, check.Equals, true)
348
+	c.Assert(s.ec[ext].removals >= 1, check.Equals, true)
349
+	c.Assert(s.ec[ext].gets >= 1, check.Equals, true)
350
+	c.Assert(s.ec[ext].puts >= 1, check.Equals, true)
351
+	c.Assert(s.ec[ext].stats, check.Equals, 3)
352
+	c.Assert(s.ec[ext].cleanups, check.Equals, 2)
353
+	c.Assert(s.ec[ext].applydiff >= 1, check.Equals, true)
354
+	c.Assert(s.ec[ext].changes, check.Equals, 1)
355
+	c.Assert(s.ec[ext].diffsize, check.Equals, 0)
356
+	c.Assert(s.ec[ext].diff, check.Equals, 0)
357
+	c.Assert(s.ec[ext].metadata, check.Equals, 1)
358 358
 }
359 359
 
360 360
 func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriverPull(c *check.C) {
... ...
@@ -9,6 +9,7 @@ import (
9 9
 	"os"
10 10
 	"path/filepath"
11 11
 	"strings"
12
+	"sync"
12 13
 )
13 14
 
14 15
 var (
... ...
@@ -118,6 +119,7 @@ func readPluginJSONInfo(name, path string) (*Plugin, error) {
118 118
 	if len(p.TLSConfig.CAFile) == 0 {
119 119
 		p.TLSConfig.InsecureSkipVerify = true
120 120
 	}
121
+	p.activateWait = sync.NewCond(&sync.Mutex{})
121 122
 
122 123
 	return &p, nil
123 124
 }