Signed-off-by: Madhu Venugopal <madhu@docker.com>
| ... | ... |
@@ -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 |
} |