github.com/alexandrev/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  }