github.com/walkingsparrow/docker@v1.4.2-0.20151218153551-b708a2249bfa/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  	dockerCmd(c, "volume", "create")
    15  
    16  	_, err := runCommand(exec.Command(dockerBinary, "volume", "create", "-d", "nosuchdriver"))
    17  	c.Assert(err, check.Not(check.IsNil))
    18  
    19  	out, _ := dockerCmd(c, "volume", "create", "--name=test")
    20  	name := strings.TrimSpace(out)
    21  	c.Assert(name, check.Equals, "test")
    22  }
    23  
    24  func (s *DockerSuite) TestVolumeCliCreateOptionConflict(c *check.C) {
    25  	dockerCmd(c, "volume", "create", "--name=test")
    26  	out, _, err := dockerCmdWithError("volume", "create", "--name", "test", "--driver", "nosuchdriver")
    27  	c.Assert(err, check.NotNil, check.Commentf("volume create exception name already in use with another driver"))
    28  	stderr := derr.ErrorVolumeNameTaken.WithArgs("test", volume.DefaultDriverName).Error()
    29  	c.Assert(strings.Contains(out, strings.TrimPrefix(stderr, "volume name taken: ")), check.Equals, true)
    30  
    31  	out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Driver }}'", "test")
    32  	_, _, err = dockerCmdWithError("volume", "create", "--name", "test", "--driver", strings.TrimSpace(out))
    33  	c.Assert(err, check.IsNil)
    34  }
    35  
    36  func (s *DockerSuite) TestVolumeCliInspect(c *check.C) {
    37  	c.Assert(
    38  		exec.Command(dockerBinary, "volume", "inspect", "doesntexist").Run(),
    39  		check.Not(check.IsNil),
    40  		check.Commentf("volume inspect should error on non-existent volume"),
    41  	)
    42  
    43  	out, _ := dockerCmd(c, "volume", "create")
    44  	name := strings.TrimSpace(out)
    45  	out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Name }}'", name)
    46  	c.Assert(strings.TrimSpace(out), check.Equals, name)
    47  
    48  	dockerCmd(c, "volume", "create", "--name", "test")
    49  	out, _ = dockerCmd(c, "volume", "inspect", "--format='{{ .Name }}'", "test")
    50  	c.Assert(strings.TrimSpace(out), check.Equals, "test")
    51  }
    52  
    53  func (s *DockerSuite) TestVolumeCliInspectMulti(c *check.C) {
    54  	dockerCmd(c, "volume", "create", "--name", "test1")
    55  	dockerCmd(c, "volume", "create", "--name", "test2")
    56  	dockerCmd(c, "volume", "create", "--name", "not-shown")
    57  
    58  	out, _, err := dockerCmdWithError("volume", "inspect", "--format='{{ .Name }}'", "test1", "test2", "doesntexist", "not-shown")
    59  	c.Assert(err, checker.NotNil)
    60  	outArr := strings.Split(strings.TrimSpace(out), "\n")
    61  	c.Assert(len(outArr), check.Equals, 3, check.Commentf("\n%s", out))
    62  
    63  	c.Assert(out, checker.Contains, "test1")
    64  	c.Assert(out, checker.Contains, "test2")
    65  	c.Assert(out, checker.Contains, "Error: No such volume: doesntexist")
    66  	c.Assert(out, checker.Not(checker.Contains), "not-shown")
    67  }
    68  
    69  func (s *DockerSuite) TestVolumeCliLs(c *check.C) {
    70  	prefix := ""
    71  	if daemonPlatform == "windows" {
    72  		prefix = "c:"
    73  	}
    74  	out, _ := dockerCmd(c, "volume", "create")
    75  	id := strings.TrimSpace(out)
    76  
    77  	dockerCmd(c, "volume", "create", "--name", "test")
    78  	dockerCmd(c, "run", "-v", prefix+"/foo", "busybox", "ls", "/")
    79  
    80  	out, _ = dockerCmd(c, "volume", "ls")
    81  	outArr := strings.Split(strings.TrimSpace(out), "\n")
    82  	c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out))
    83  
    84  	// Since there is no guarantee of ordering of volumes, we just make sure the names are in the output
    85  	c.Assert(strings.Contains(out, id+"\n"), check.Equals, true)
    86  	c.Assert(strings.Contains(out, "test\n"), check.Equals, true)
    87  }
    88  
    89  func (s *DockerSuite) TestVolumeCliLsFilterDangling(c *check.C) {
    90  	prefix := ""
    91  	if daemonPlatform == "windows" {
    92  		prefix = "c:"
    93  	}
    94  	dockerCmd(c, "volume", "create", "--name", "testnotinuse1")
    95  	dockerCmd(c, "volume", "create", "--name", "testisinuse1")
    96  	dockerCmd(c, "volume", "create", "--name", "testisinuse2")
    97  
    98  	// Make sure both "created" (but not started), and started
    99  	// containers are included in reference counting
   100  	dockerCmd(c, "run", "--name", "volume-test1", "-v", "testisinuse1:"+prefix+"/foo", "busybox", "true")
   101  	dockerCmd(c, "create", "--name", "volume-test2", "-v", "testisinuse2:"+prefix+"/foo", "busybox", "true")
   102  
   103  	out, _ := dockerCmd(c, "volume", "ls")
   104  
   105  	// No filter, all volumes should show
   106  	c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output"))
   107  	c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output"))
   108  	c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output"))
   109  
   110  	out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=false")
   111  
   112  	// Same as above, but explicitly disabling dangling
   113  	c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output"))
   114  	c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output"))
   115  	c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output"))
   116  
   117  	out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=true")
   118  
   119  	// Filter "dangling" volumes; only "dangling" (unused) volumes should be in the output
   120  	c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output"))
   121  	c.Assert(out, check.Not(checker.Contains), "testisinuse1\n", check.Commentf("volume 'testisinuse1' in output, but not expected"))
   122  	c.Assert(out, check.Not(checker.Contains), "testisinuse2\n", check.Commentf("volume 'testisinuse2' in output, but not expected"))
   123  }
   124  
   125  func (s *DockerSuite) TestVolumeCliRm(c *check.C) {
   126  	prefix := ""
   127  	if daemonPlatform == "windows" {
   128  		prefix = "c:"
   129  	}
   130  	out, _ := dockerCmd(c, "volume", "create")
   131  	id := strings.TrimSpace(out)
   132  
   133  	dockerCmd(c, "volume", "create", "--name", "test")
   134  	dockerCmd(c, "volume", "rm", id)
   135  	dockerCmd(c, "volume", "rm", "test")
   136  
   137  	out, _ = dockerCmd(c, "volume", "ls")
   138  	outArr := strings.Split(strings.TrimSpace(out), "\n")
   139  	c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out))
   140  
   141  	volumeID := "testing"
   142  	dockerCmd(c, "run", "-v", volumeID+":"+prefix+"/foo", "--name=test", "busybox", "sh", "-c", "echo hello > /foo/bar")
   143  	out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "volume", "rm", "testing"))
   144  	c.Assert(
   145  		err,
   146  		check.Not(check.IsNil),
   147  		check.Commentf("Should not be able to remove volume that is in use by a container\n%s", out))
   148  
   149  	out, _ = dockerCmd(c, "run", "--volumes-from=test", "--name=test2", "busybox", "sh", "-c", "cat /foo/bar")
   150  	c.Assert(strings.TrimSpace(out), check.Equals, "hello")
   151  	dockerCmd(c, "rm", "-fv", "test2")
   152  	dockerCmd(c, "volume", "inspect", volumeID)
   153  	dockerCmd(c, "rm", "-f", "test")
   154  
   155  	out, _ = dockerCmd(c, "run", "--name=test2", "-v", volumeID+":"+prefix+"/foo", "busybox", "sh", "-c", "cat /foo/bar")
   156  	c.Assert(strings.TrimSpace(out), check.Equals, "hello", check.Commentf("volume data was removed"))
   157  	dockerCmd(c, "rm", "test2")
   158  
   159  	dockerCmd(c, "volume", "rm", volumeID)
   160  	c.Assert(
   161  		exec.Command("volume", "rm", "doesntexist").Run(),
   162  		check.Not(check.IsNil),
   163  		check.Commentf("volume rm should fail with non-existent volume"),
   164  	)
   165  }
   166  
   167  func (s *DockerSuite) TestVolumeCliNoArgs(c *check.C) {
   168  	out, _ := dockerCmd(c, "volume")
   169  	// no args should produce the cmd usage output
   170  	usage := "Usage:	docker volume [OPTIONS] [COMMAND]"
   171  	c.Assert(out, checker.Contains, usage)
   172  
   173  	// invalid arg should error and show the command usage on stderr
   174  	_, stderr, _, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "somearg"))
   175  	c.Assert(err, check.NotNil, check.Commentf(stderr))
   176  	c.Assert(stderr, checker.Contains, usage)
   177  
   178  	// invalid flag should error and show the flag error and cmd usage
   179  	_, stderr, _, err = runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "--no-such-flag"))
   180  	c.Assert(err, check.NotNil, check.Commentf(stderr))
   181  	c.Assert(stderr, checker.Contains, usage)
   182  	c.Assert(stderr, checker.Contains, "flag provided but not defined: --no-such-flag")
   183  }
   184  
   185  func (s *DockerSuite) TestVolumeCliInspectTmplError(c *check.C) {
   186  	out, _ := dockerCmd(c, "volume", "create")
   187  	name := strings.TrimSpace(out)
   188  
   189  	out, exitCode, err := dockerCmdWithError("volume", "inspect", "--format='{{ .FooBar }}'", name)
   190  	c.Assert(err, checker.NotNil, check.Commentf("Output: %s", out))
   191  	c.Assert(exitCode, checker.Equals, 1, check.Commentf("Output: %s", out))
   192  	c.Assert(out, checker.Contains, "Template parsing error")
   193  }