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  }