docker_cli_start_volume_driver_unix_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // +build !windows
  2. package main
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "net/http/httptest"
  9. "os"
  10. "os/exec"
  11. "path/filepath"
  12. "strings"
  13. "github.com/go-check/check"
  14. )
  15. func init() {
  16. check.Suite(&ExternalVolumeSuite{
  17. ds: &DockerSuite{},
  18. })
  19. }
  20. type ExternalVolumeSuite struct {
  21. server *httptest.Server
  22. ds *DockerSuite
  23. }
  24. func (s *ExternalVolumeSuite) SetUpTest(c *check.C) {
  25. s.ds.SetUpTest(c)
  26. }
  27. func (s *ExternalVolumeSuite) TearDownTest(c *check.C) {
  28. s.ds.TearDownTest(c)
  29. }
  30. func (s *ExternalVolumeSuite) SetUpSuite(c *check.C) {
  31. mux := http.NewServeMux()
  32. s.server = httptest.NewServer(mux)
  33. type pluginRequest struct {
  34. name string
  35. }
  36. hostVolumePath := func(name string) string {
  37. return fmt.Sprintf("/var/lib/docker/volumes/%s", name)
  38. }
  39. mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
  40. w.Header().Set("Content-Type", "appplication/vnd.docker.plugins.v1+json")
  41. fmt.Fprintln(w, `{"Implements": ["VolumeDriver"]}`)
  42. })
  43. mux.HandleFunc("/VolumeDriver.Create", func(w http.ResponseWriter, r *http.Request) {
  44. w.Header().Set("Content-Type", "appplication/vnd.docker.plugins.v1+json")
  45. fmt.Fprintln(w, `{}`)
  46. })
  47. mux.HandleFunc("/VolumeDriver.Remove", func(w http.ResponseWriter, r *http.Request) {
  48. w.Header().Set("Content-Type", "appplication/vnd.docker.plugins.v1+json")
  49. fmt.Fprintln(w, `{}`)
  50. })
  51. mux.HandleFunc("/VolumeDriver.Path", func(w http.ResponseWriter, r *http.Request) {
  52. var pr pluginRequest
  53. if err := json.NewDecoder(r.Body).Decode(&pr); err != nil {
  54. http.Error(w, err.Error(), 500)
  55. }
  56. p := hostVolumePath(pr.name)
  57. w.Header().Set("Content-Type", "appplication/vnd.docker.plugins.v1+json")
  58. fmt.Fprintln(w, fmt.Sprintf("{\"Mountpoint\": \"%s\"}", p))
  59. })
  60. mux.HandleFunc("/VolumeDriver.Mount", func(w http.ResponseWriter, r *http.Request) {
  61. var pr pluginRequest
  62. if err := json.NewDecoder(r.Body).Decode(&pr); err != nil {
  63. http.Error(w, err.Error(), 500)
  64. }
  65. p := hostVolumePath(pr.name)
  66. if err := os.MkdirAll(p, 0755); err != nil {
  67. http.Error(w, err.Error(), 500)
  68. }
  69. if err := ioutil.WriteFile(filepath.Join(p, "test"), []byte(s.server.URL), 0644); err != nil {
  70. http.Error(w, err.Error(), 500)
  71. }
  72. w.Header().Set("Content-Type", "appplication/vnd.docker.plugins.v1+json")
  73. fmt.Fprintln(w, fmt.Sprintf("{\"Mountpoint\": \"%s\"}", p))
  74. })
  75. mux.HandleFunc("/VolumeDriver.Umount", func(w http.ResponseWriter, r *http.Request) {
  76. var pr pluginRequest
  77. if err := json.NewDecoder(r.Body).Decode(&pr); err != nil {
  78. http.Error(w, err.Error(), 500)
  79. }
  80. p := hostVolumePath(pr.name)
  81. if err := os.RemoveAll(p); err != nil {
  82. http.Error(w, err.Error(), 500)
  83. }
  84. w.Header().Set("Content-Type", "appplication/vnd.docker.plugins.v1+json")
  85. fmt.Fprintln(w, `{}`)
  86. })
  87. if err := os.MkdirAll("/usr/share/docker/plugins", 0755); err != nil {
  88. c.Fatal(err)
  89. }
  90. if err := ioutil.WriteFile("/usr/share/docker/plugins/test-external-volume-driver.spec", []byte(s.server.URL), 0644); err != nil {
  91. c.Fatal(err)
  92. }
  93. }
  94. func (s *ExternalVolumeSuite) TearDownSuite(c *check.C) {
  95. s.server.Close()
  96. if err := os.RemoveAll("/usr/share/docker/plugins"); err != nil {
  97. c.Fatal(err)
  98. }
  99. }
  100. func (s *ExternalVolumeSuite) TestStartExternalVolumeDriver(c *check.C) {
  101. runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "-v", "external-volume-test:/tmp/external-volume-test", "--volume-driver", "test-external-volume-driver", "busybox:latest", "cat", "/tmp/external-volume-test/test")
  102. out, stderr, exitCode, err := runCommandWithStdoutStderr(runCmd)
  103. if err != nil && exitCode != 0 {
  104. c.Fatal(out, stderr, err)
  105. }
  106. if !strings.Contains(out, s.server.URL) {
  107. c.Fatalf("External volume mount failed. Output: %s\n", out)
  108. }
  109. }
  110. func (s *ExternalVolumeSuite) TestStartExternalVolumeNamedDriver(c *check.C) {
  111. runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "-v", "test-external-volume-driver/volume-1:/tmp/external-volume-test", "busybox:latest", "cat", "/tmp/external-volume-test/test")
  112. out, stderr, exitCode, err := runCommandWithStdoutStderr(runCmd)
  113. if err != nil && exitCode != 0 {
  114. c.Fatal(out, stderr, err)
  115. }
  116. if !strings.Contains(out, s.server.URL) {
  117. c.Fatalf("External volume mount failed. Output: %s\n", out)
  118. }
  119. }