docker_cli_volume_test.go 5.8 KB

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