github.com/walkingsparrow/docker@v1.4.2-0.20151218153551-b708a2249bfa/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 dockerCmd(c, "volume", "create") 15 16 _, err := runCommand(exec.Command(dockerBinary, "volume", "create", "-d", "nosuchdriver")) 17 c.Assert(err, check.Not(check.IsNil)) 18 19 out, _ := dockerCmd(c, "volume", "create", "--name=test") 20 name := strings.TrimSpace(out) 21 c.Assert(name, check.Equals, "test") 22 } 23 24 func (s *DockerSuite) TestVolumeCliCreateOptionConflict(c *check.C) { 25 dockerCmd(c, "volume", "create", "--name=test") 26 out, _, err := dockerCmdWithError("volume", "create", "--name", "test", "--driver", "nosuchdriver") 27 c.Assert(err, check.NotNil, check.Commentf("volume create exception name already in use with another driver")) 28 stderr := derr.ErrorVolumeNameTaken.WithArgs("test", volume.DefaultDriverName).Error() 29 c.Assert(strings.Contains(out, strings.TrimPrefix(stderr, "volume name taken: ")), check.Equals, true) 30 31 out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Driver }}'", "test") 32 _, _, err = dockerCmdWithError("volume", "create", "--name", "test", "--driver", strings.TrimSpace(out)) 33 c.Assert(err, check.IsNil) 34 } 35 36 func (s *DockerSuite) TestVolumeCliInspect(c *check.C) { 37 c.Assert( 38 exec.Command(dockerBinary, "volume", "inspect", "doesntexist").Run(), 39 check.Not(check.IsNil), 40 check.Commentf("volume inspect should error on non-existent volume"), 41 ) 42 43 out, _ := dockerCmd(c, "volume", "create") 44 name := strings.TrimSpace(out) 45 out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Name }}'", name) 46 c.Assert(strings.TrimSpace(out), check.Equals, name) 47 48 dockerCmd(c, "volume", "create", "--name", "test") 49 out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Name }}'", "test") 50 c.Assert(strings.TrimSpace(out), check.Equals, "test") 51 } 52 53 func (s *DockerSuite) TestVolumeCliInspectMulti(c *check.C) { 54 dockerCmd(c, "volume", "create", "--name", "test1") 55 dockerCmd(c, "volume", "create", "--name", "test2") 56 dockerCmd(c, "volume", "create", "--name", "not-shown") 57 58 out, _, err := dockerCmdWithError("volume", "inspect", "--format='{{ .Name }}'", "test1", "test2", "doesntexist", "not-shown") 59 c.Assert(err, checker.NotNil) 60 outArr := strings.Split(strings.TrimSpace(out), "\n") 61 c.Assert(len(outArr), check.Equals, 3, check.Commentf("\n%s", out)) 62 63 c.Assert(out, checker.Contains, "test1") 64 c.Assert(out, checker.Contains, "test2") 65 c.Assert(out, checker.Contains, "Error: No such volume: doesntexist") 66 c.Assert(out, checker.Not(checker.Contains), "not-shown") 67 } 68 69 func (s *DockerSuite) TestVolumeCliLs(c *check.C) { 70 prefix := "" 71 if daemonPlatform == "windows" { 72 prefix = "c:" 73 } 74 out, _ := dockerCmd(c, "volume", "create") 75 id := strings.TrimSpace(out) 76 77 dockerCmd(c, "volume", "create", "--name", "test") 78 dockerCmd(c, "run", "-v", prefix+"/foo", "busybox", "ls", "/") 79 80 out, _ = dockerCmd(c, "volume", "ls") 81 outArr := strings.Split(strings.TrimSpace(out), "\n") 82 c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out)) 83 84 // Since there is no guarantee of ordering of volumes, we just make sure the names are in the output 85 c.Assert(strings.Contains(out, id+"\n"), check.Equals, true) 86 c.Assert(strings.Contains(out, "test\n"), check.Equals, true) 87 } 88 89 func (s *DockerSuite) TestVolumeCliLsFilterDangling(c *check.C) { 90 prefix := "" 91 if daemonPlatform == "windows" { 92 prefix = "c:" 93 } 94 dockerCmd(c, "volume", "create", "--name", "testnotinuse1") 95 dockerCmd(c, "volume", "create", "--name", "testisinuse1") 96 dockerCmd(c, "volume", "create", "--name", "testisinuse2") 97 98 // Make sure both "created" (but not started), and started 99 // containers are included in reference counting 100 dockerCmd(c, "run", "--name", "volume-test1", "-v", "testisinuse1:"+prefix+"/foo", "busybox", "true") 101 dockerCmd(c, "create", "--name", "volume-test2", "-v", "testisinuse2:"+prefix+"/foo", "busybox", "true") 102 103 out, _ := dockerCmd(c, "volume", "ls") 104 105 // No filter, all volumes should show 106 c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) 107 c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output")) 108 c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output")) 109 110 out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=false") 111 112 // Same as above, but explicitly disabling dangling 113 c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) 114 c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output")) 115 c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output")) 116 117 out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=true") 118 119 // Filter "dangling" volumes; only "dangling" (unused) volumes should be in the output 120 c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) 121 c.Assert(out, check.Not(checker.Contains), "testisinuse1\n", check.Commentf("volume 'testisinuse1' in output, but not expected")) 122 c.Assert(out, check.Not(checker.Contains), "testisinuse2\n", check.Commentf("volume 'testisinuse2' in output, but not expected")) 123 } 124 125 func (s *DockerSuite) TestVolumeCliRm(c *check.C) { 126 prefix := "" 127 if daemonPlatform == "windows" { 128 prefix = "c:" 129 } 130 out, _ := dockerCmd(c, "volume", "create") 131 id := strings.TrimSpace(out) 132 133 dockerCmd(c, "volume", "create", "--name", "test") 134 dockerCmd(c, "volume", "rm", id) 135 dockerCmd(c, "volume", "rm", "test") 136 137 out, _ = dockerCmd(c, "volume", "ls") 138 outArr := strings.Split(strings.TrimSpace(out), "\n") 139 c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out)) 140 141 volumeID := "testing" 142 dockerCmd(c, "run", "-v", volumeID+":"+prefix+"/foo", "--name=test", "busybox", "sh", "-c", "echo hello > /foo/bar") 143 out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "volume", "rm", "testing")) 144 c.Assert( 145 err, 146 check.Not(check.IsNil), 147 check.Commentf("Should not be able to remove volume that is in use by a container\n%s", out)) 148 149 out, _ = dockerCmd(c, "run", "--volumes-from=test", "--name=test2", "busybox", "sh", "-c", "cat /foo/bar") 150 c.Assert(strings.TrimSpace(out), check.Equals, "hello") 151 dockerCmd(c, "rm", "-fv", "test2") 152 dockerCmd(c, "volume", "inspect", volumeID) 153 dockerCmd(c, "rm", "-f", "test") 154 155 out, _ = dockerCmd(c, "run", "--name=test2", "-v", volumeID+":"+prefix+"/foo", "busybox", "sh", "-c", "cat /foo/bar") 156 c.Assert(strings.TrimSpace(out), check.Equals, "hello", check.Commentf("volume data was removed")) 157 dockerCmd(c, "rm", "test2") 158 159 dockerCmd(c, "volume", "rm", volumeID) 160 c.Assert( 161 exec.Command("volume", "rm", "doesntexist").Run(), 162 check.Not(check.IsNil), 163 check.Commentf("volume rm should fail with non-existent volume"), 164 ) 165 } 166 167 func (s *DockerSuite) TestVolumeCliNoArgs(c *check.C) { 168 out, _ := dockerCmd(c, "volume") 169 // no args should produce the cmd usage output 170 usage := "Usage: docker volume [OPTIONS] [COMMAND]" 171 c.Assert(out, checker.Contains, usage) 172 173 // invalid arg should error and show the command usage on stderr 174 _, stderr, _, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "somearg")) 175 c.Assert(err, check.NotNil, check.Commentf(stderr)) 176 c.Assert(stderr, checker.Contains, usage) 177 178 // invalid flag should error and show the flag error and cmd usage 179 _, stderr, _, err = runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "--no-such-flag")) 180 c.Assert(err, check.NotNil, check.Commentf(stderr)) 181 c.Assert(stderr, checker.Contains, usage) 182 c.Assert(stderr, checker.Contains, "flag provided but not defined: --no-such-flag") 183 } 184 185 func (s *DockerSuite) TestVolumeCliInspectTmplError(c *check.C) { 186 out, _ := dockerCmd(c, "volume", "create") 187 name := strings.TrimSpace(out) 188 189 out, exitCode, err := dockerCmdWithError("volume", "inspect", "--format='{{ .FooBar }}'", name) 190 c.Assert(err, checker.NotNil, check.Commentf("Output: %s", out)) 191 c.Assert(exitCode, checker.Equals, 1, check.Commentf("Output: %s", out)) 192 c.Assert(out, checker.Contains, "Template parsing error") 193 }