github.com/vincentwoo/docker@v0.7.3-0.20160116130405-82401a4b13c0/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 // Same as above, but explicitly disabling dangling 110 c.Assert(out, 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 122 func (s *DockerSuite) TestVolumeCliRm(c *check.C) { 123 prefix := "" 124 if daemonPlatform == "windows" { 125 prefix = "c:" 126 } 127 out, _ := dockerCmd(c, "volume", "create") 128 id := strings.TrimSpace(out) 129 130 dockerCmd(c, "volume", "create", "--name", "test") 131 dockerCmd(c, "volume", "rm", id) 132 dockerCmd(c, "volume", "rm", "test") 133 134 out, _ = dockerCmd(c, "volume", "ls") 135 outArr := strings.Split(strings.TrimSpace(out), "\n") 136 c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out)) 137 138 volumeID := "testing" 139 dockerCmd(c, "run", "-v", volumeID+":"+prefix+"/foo", "--name=test", "busybox", "sh", "-c", "echo hello > /foo/bar") 140 out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "volume", "rm", "testing")) 141 c.Assert( 142 err, 143 check.Not(check.IsNil), 144 check.Commentf("Should not be able to remove volume that is in use by a container\n%s", out)) 145 146 out, _ = dockerCmd(c, "run", "--volumes-from=test", "--name=test2", "busybox", "sh", "-c", "cat /foo/bar") 147 c.Assert(strings.TrimSpace(out), check.Equals, "hello") 148 dockerCmd(c, "rm", "-fv", "test2") 149 dockerCmd(c, "volume", "inspect", volumeID) 150 dockerCmd(c, "rm", "-f", "test") 151 152 out, _ = dockerCmd(c, "run", "--name=test2", "-v", volumeID+":"+prefix+"/foo", "busybox", "sh", "-c", "cat /foo/bar") 153 c.Assert(strings.TrimSpace(out), check.Equals, "hello", check.Commentf("volume data was removed")) 154 dockerCmd(c, "rm", "test2") 155 156 dockerCmd(c, "volume", "rm", volumeID) 157 c.Assert( 158 exec.Command("volume", "rm", "doesntexist").Run(), 159 check.Not(check.IsNil), 160 check.Commentf("volume rm should fail with non-existent volume"), 161 ) 162 } 163 164 func (s *DockerSuite) TestVolumeCliNoArgs(c *check.C) { 165 out, _ := dockerCmd(c, "volume") 166 // no args should produce the cmd usage output 167 usage := "Usage: docker volume [OPTIONS] [COMMAND]" 168 c.Assert(out, checker.Contains, usage) 169 170 // invalid arg should error and show the command usage on stderr 171 _, stderr, _, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "somearg")) 172 c.Assert(err, check.NotNil, check.Commentf(stderr)) 173 c.Assert(stderr, checker.Contains, usage) 174 175 // invalid flag should error and show the flag error and cmd usage 176 _, stderr, _, err = runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "--no-such-flag")) 177 c.Assert(err, check.NotNil, check.Commentf(stderr)) 178 c.Assert(stderr, checker.Contains, usage) 179 c.Assert(stderr, checker.Contains, "flag provided but not defined: --no-such-flag") 180 } 181 182 func (s *DockerSuite) TestVolumeCliInspectTmplError(c *check.C) { 183 out, _ := dockerCmd(c, "volume", "create") 184 name := strings.TrimSpace(out) 185 186 out, exitCode, err := dockerCmdWithError("volume", "inspect", "--format='{{ .FooBar }}'", name) 187 c.Assert(err, checker.NotNil, check.Commentf("Output: %s", out)) 188 c.Assert(exitCode, checker.Equals, 1, check.Commentf("Output: %s", out)) 189 c.Assert(out, checker.Contains, "Template parsing error") 190 }