github.com/ncdc/docker@v0.10.1-0.20160129113957-6c6729ef5b74/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  }