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