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