docker_cli_volume_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package main
  2. import (
  3. "os/exec"
  4. "strings"
  5. derr "github.com/docker/docker/errors"
  6. "github.com/docker/docker/pkg/integration/checker"
  7. "github.com/docker/docker/volume"
  8. "github.com/go-check/check"
  9. )
  10. func (s *DockerSuite) TestVolumeCliCreate(c *check.C) {
  11. testRequires(c, DaemonIsLinux)
  12. dockerCmd(c, "volume", "create")
  13. _, err := runCommand(exec.Command(dockerBinary, "volume", "create", "-d", "nosuchdriver"))
  14. c.Assert(err, check.Not(check.IsNil))
  15. out, _ := dockerCmd(c, "volume", "create", "--name=test")
  16. name := strings.TrimSpace(out)
  17. c.Assert(name, check.Equals, "test")
  18. }
  19. func (s *DockerSuite) TestVolumeCliCreateOptionConflict(c *check.C) {
  20. dockerCmd(c, "volume", "create", "--name=test")
  21. out, _, err := dockerCmdWithError("volume", "create", "--name", "test", "--driver", "nosuchdriver")
  22. c.Assert(err, check.NotNil, check.Commentf("volume create exception name already in use with another driver"))
  23. stderr := derr.ErrorVolumeNameTaken.WithArgs("test", volume.DefaultDriverName).Error()
  24. c.Assert(strings.Contains(out, strings.TrimPrefix(stderr, "volume name taken: ")), check.Equals, true)
  25. out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Driver }}'", "test")
  26. _, _, err = dockerCmdWithError("volume", "create", "--name", "test", "--driver", strings.TrimSpace(out))
  27. c.Assert(err, check.IsNil)
  28. }
  29. func (s *DockerSuite) TestVolumeCliInspect(c *check.C) {
  30. testRequires(c, DaemonIsLinux)
  31. c.Assert(
  32. exec.Command(dockerBinary, "volume", "inspect", "doesntexist").Run(),
  33. check.Not(check.IsNil),
  34. check.Commentf("volume inspect should error on non-existant volume"),
  35. )
  36. out, _ := dockerCmd(c, "volume", "create")
  37. name := strings.TrimSpace(out)
  38. out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Name }}'", name)
  39. c.Assert(strings.TrimSpace(out), check.Equals, name)
  40. dockerCmd(c, "volume", "create", "--name", "test")
  41. out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Name }}'", "test")
  42. c.Assert(strings.TrimSpace(out), check.Equals, "test")
  43. }
  44. func (s *DockerSuite) TestVolumeCliLs(c *check.C) {
  45. testRequires(c, DaemonIsLinux)
  46. out, _ := dockerCmd(c, "volume", "create")
  47. id := strings.TrimSpace(out)
  48. dockerCmd(c, "volume", "create", "--name", "test")
  49. dockerCmd(c, "run", "-v", "/foo", "busybox", "ls", "/")
  50. out, _ = dockerCmd(c, "volume", "ls")
  51. outArr := strings.Split(strings.TrimSpace(out), "\n")
  52. c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out))
  53. // Since there is no guarentee of ordering of volumes, we just make sure the names are in the output
  54. c.Assert(strings.Contains(out, id+"\n"), check.Equals, true)
  55. c.Assert(strings.Contains(out, "test\n"), check.Equals, true)
  56. }
  57. func (s *DockerSuite) TestVolumeCliLsFilterDangling(c *check.C) {
  58. testRequires(c, DaemonIsLinux)
  59. dockerCmd(c, "volume", "create", "--name", "testnotinuse1")
  60. dockerCmd(c, "volume", "create", "--name", "testisinuse1")
  61. dockerCmd(c, "volume", "create", "--name", "testisinuse2")
  62. // Make sure both "created" (but not started), and started
  63. // containers are included in reference counting
  64. dockerCmd(c, "run", "--name", "volume-test1", "-v", "testisinuse1:/foo", "busybox", "true")
  65. dockerCmd(c, "create", "--name", "volume-test2", "-v", "testisinuse2:/foo", "busybox", "true")
  66. out, _ := dockerCmd(c, "volume", "ls")
  67. // No filter, all volumes should show
  68. c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output"))
  69. c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output"))
  70. c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output"))
  71. out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=false")
  72. // Same as above, but expicitly disabling dangling
  73. c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output"))
  74. c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output"))
  75. c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output"))
  76. out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=true")
  77. // Filter "dangling" volumes; ony "dangling" (unused) volumes should be in the output
  78. c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output"))
  79. c.Assert(out, check.Not(checker.Contains), "testisinuse1\n", check.Commentf("volume 'testisinuse1' in output, but not expected"))
  80. c.Assert(out, check.Not(checker.Contains), "testisinuse2\n", check.Commentf("volume 'testisinuse2' in output, but not expected"))
  81. }
  82. func (s *DockerSuite) TestVolumeCliRm(c *check.C) {
  83. testRequires(c, DaemonIsLinux)
  84. out, _ := dockerCmd(c, "volume", "create")
  85. id := strings.TrimSpace(out)
  86. dockerCmd(c, "volume", "create", "--name", "test")
  87. dockerCmd(c, "volume", "rm", id)
  88. dockerCmd(c, "volume", "rm", "test")
  89. out, _ = dockerCmd(c, "volume", "ls")
  90. outArr := strings.Split(strings.TrimSpace(out), "\n")
  91. c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out))
  92. volumeID := "testing"
  93. dockerCmd(c, "run", "-v", volumeID+":/foo", "--name=test", "busybox", "sh", "-c", "echo hello > /foo/bar")
  94. out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "volume", "rm", "testing"))
  95. c.Assert(
  96. err,
  97. check.Not(check.IsNil),
  98. check.Commentf("Should not be able to remove volume that is in use by a container\n%s", out))
  99. out, _ = dockerCmd(c, "run", "--volumes-from=test", "--name=test2", "busybox", "sh", "-c", "cat /foo/bar")
  100. c.Assert(strings.TrimSpace(out), check.Equals, "hello")
  101. dockerCmd(c, "rm", "-fv", "test2")
  102. dockerCmd(c, "volume", "inspect", volumeID)
  103. dockerCmd(c, "rm", "-f", "test")
  104. out, _ = dockerCmd(c, "run", "--name=test2", "-v", volumeID+":/foo", "busybox", "sh", "-c", "cat /foo/bar")
  105. c.Assert(strings.TrimSpace(out), check.Equals, "hello", check.Commentf("volume data was removed"))
  106. dockerCmd(c, "rm", "test2")
  107. dockerCmd(c, "volume", "rm", volumeID)
  108. c.Assert(
  109. exec.Command("volume", "rm", "doesntexist").Run(),
  110. check.Not(check.IsNil),
  111. check.Commentf("volume rm should fail with non-existant volume"),
  112. )
  113. }
  114. func (s *DockerSuite) TestVolumeCliNoArgs(c *check.C) {
  115. out, _ := dockerCmd(c, "volume")
  116. // no args should produce the cmd usage output
  117. usage := "Usage: docker volume [OPTIONS] [COMMAND]"
  118. c.Assert(out, checker.Contains, usage)
  119. // invalid arg should error and show the command usage on stderr
  120. _, stderr, _, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "somearg"))
  121. c.Assert(err, check.NotNil, check.Commentf(stderr))
  122. c.Assert(stderr, checker.Contains, usage)
  123. // invalid flag should error and show the flag error and cmd usage
  124. _, stderr, _, err = runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "--no-such-flag"))
  125. c.Assert(err, check.NotNil, check.Commentf(stderr))
  126. c.Assert(stderr, checker.Contains, usage)
  127. c.Assert(stderr, checker.Contains, "flag provided but not defined: --no-such-flag")
  128. }