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