github.com/ncdc/docker@v0.10.1-0.20160129113957-6c6729ef5b74/integration-cli/docker_cli_volume_driver_compat_unix_test.go (about) 1 // +build !windows 2 3 package main 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "io" 9 "io/ioutil" 10 "net/http" 11 "net/http/httptest" 12 "os" 13 "path/filepath" 14 "strings" 15 16 "github.com/docker/docker/pkg/integration/checker" 17 18 "github.com/go-check/check" 19 ) 20 21 func init() { 22 check.Suite(&DockerExternalVolumeSuiteCompatV1_1{ 23 ds: &DockerSuite{}, 24 }) 25 } 26 27 type DockerExternalVolumeSuiteCompatV1_1 struct { 28 server *httptest.Server 29 ds *DockerSuite 30 d *Daemon 31 ec *eventCounter 32 } 33 34 func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpTest(c *check.C) { 35 s.d = NewDaemon(c) 36 s.ec = &eventCounter{} 37 } 38 39 func (s *DockerExternalVolumeSuiteCompatV1_1) TearDownTest(c *check.C) { 40 s.d.Stop() 41 s.ds.TearDownTest(c) 42 } 43 44 func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpSuite(c *check.C) { 45 mux := http.NewServeMux() 46 s.server = httptest.NewServer(mux) 47 48 type pluginRequest struct { 49 Name string 50 } 51 52 type pluginResp struct { 53 Mountpoint string `json:",omitempty"` 54 Err string `json:",omitempty"` 55 } 56 57 type vol struct { 58 Name string 59 Mountpoint string 60 } 61 var volList []vol 62 63 read := func(b io.ReadCloser) (pluginRequest, error) { 64 defer b.Close() 65 var pr pluginRequest 66 if err := json.NewDecoder(b).Decode(&pr); err != nil { 67 return pr, err 68 } 69 return pr, nil 70 } 71 72 send := func(w http.ResponseWriter, data interface{}) { 73 switch t := data.(type) { 74 case error: 75 http.Error(w, t.Error(), 500) 76 case string: 77 w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") 78 fmt.Fprintln(w, t) 79 default: 80 w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") 81 json.NewEncoder(w).Encode(&data) 82 } 83 } 84 85 mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { 86 s.ec.activations++ 87 send(w, `{"Implements": ["VolumeDriver"]}`) 88 }) 89 90 mux.HandleFunc("/VolumeDriver.Create", func(w http.ResponseWriter, r *http.Request) { 91 s.ec.creations++ 92 pr, err := read(r.Body) 93 if err != nil { 94 send(w, err) 95 return 96 } 97 volList = append(volList, vol{Name: pr.Name}) 98 send(w, nil) 99 }) 100 101 mux.HandleFunc("/VolumeDriver.Remove", func(w http.ResponseWriter, r *http.Request) { 102 s.ec.removals++ 103 pr, err := read(r.Body) 104 if err != nil { 105 send(w, err) 106 return 107 } 108 109 if err := os.RemoveAll(hostVolumePath(pr.Name)); err != nil { 110 send(w, &pluginResp{Err: err.Error()}) 111 return 112 } 113 114 for i, v := range volList { 115 if v.Name == pr.Name { 116 if err := os.RemoveAll(hostVolumePath(v.Name)); err != nil { 117 send(w, fmt.Sprintf(`{"Err": "%v"}`, err)) 118 return 119 } 120 volList = append(volList[:i], volList[i+1:]...) 121 break 122 } 123 } 124 send(w, nil) 125 }) 126 127 mux.HandleFunc("/VolumeDriver.Path", func(w http.ResponseWriter, r *http.Request) { 128 s.ec.paths++ 129 130 pr, err := read(r.Body) 131 if err != nil { 132 send(w, err) 133 return 134 } 135 p := hostVolumePath(pr.Name) 136 send(w, &pluginResp{Mountpoint: p}) 137 }) 138 139 mux.HandleFunc("/VolumeDriver.Mount", func(w http.ResponseWriter, r *http.Request) { 140 s.ec.mounts++ 141 142 pr, err := read(r.Body) 143 if err != nil { 144 send(w, err) 145 return 146 } 147 148 p := hostVolumePath(pr.Name) 149 if err := os.MkdirAll(p, 0755); err != nil { 150 send(w, &pluginResp{Err: err.Error()}) 151 return 152 } 153 154 if err := ioutil.WriteFile(filepath.Join(p, "test"), []byte(s.server.URL), 0644); err != nil { 155 send(w, err) 156 return 157 } 158 159 send(w, &pluginResp{Mountpoint: p}) 160 }) 161 162 mux.HandleFunc("/VolumeDriver.Unmount", func(w http.ResponseWriter, r *http.Request) { 163 s.ec.unmounts++ 164 165 _, err := read(r.Body) 166 if err != nil { 167 send(w, err) 168 return 169 } 170 171 send(w, nil) 172 }) 173 174 err := os.MkdirAll("/etc/docker/plugins", 0755) 175 c.Assert(err, checker.IsNil) 176 177 err = ioutil.WriteFile("/etc/docker/plugins/test-external-volume-driver.spec", []byte(s.server.URL), 0644) 178 c.Assert(err, checker.IsNil) 179 } 180 181 func (s *DockerExternalVolumeSuiteCompatV1_1) TearDownSuite(c *check.C) { 182 s.server.Close() 183 184 err := os.RemoveAll("/etc/docker/plugins") 185 c.Assert(err, checker.IsNil) 186 } 187 188 func (s *DockerExternalVolumeSuiteCompatV1_1) TestExternalVolumeDriverCompatV1_1(c *check.C) { 189 err := s.d.StartWithBusybox() 190 c.Assert(err, checker.IsNil) 191 192 out, err := s.d.Cmd("run", "--name=test", "-v", "foo:/bar", "--volume-driver", "test-external-volume-driver", "busybox", "sh", "-c", "echo hello > /bar/hello") 193 c.Assert(err, checker.IsNil, check.Commentf(out)) 194 out, err = s.d.Cmd("rm", "test") 195 c.Assert(err, checker.IsNil, check.Commentf(out)) 196 197 out, err = s.d.Cmd("run", "--name=test2", "-v", "foo:/bar", "busybox", "cat", "/bar/hello") 198 c.Assert(err, checker.IsNil, check.Commentf(out)) 199 c.Assert(strings.TrimSpace(out), checker.Equals, "hello") 200 201 err = s.d.Restart() 202 c.Assert(err, checker.IsNil) 203 204 out, err = s.d.Cmd("start", "-a", "test2") 205 c.Assert(strings.TrimSpace(out), checker.Equals, "hello") 206 207 out, err = s.d.Cmd("rm", "test2") 208 c.Assert(err, checker.IsNil, check.Commentf(out)) 209 210 out, err = s.d.Cmd("volume", "inspect", "foo") 211 c.Assert(err, checker.IsNil, check.Commentf(out)) 212 213 out, err = s.d.Cmd("volume", "rm", "foo") 214 c.Assert(err, checker.IsNil, check.Commentf(out)) 215 }