github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/integration-cli/docker_cli_stack_test.go (about)

     1  // +build !windows
     2  
     3  package main
     4  
     5  import (
     6  	"encoding/json"
     7  	"io/ioutil"
     8  	"os"
     9  	"sort"
    10  	"strings"
    11  
    12  	"github.com/docker/docker/api/types/swarm"
    13  	"github.com/docker/docker/integration-cli/checker"
    14  	icmd "github.com/docker/docker/pkg/testutil/cmd"
    15  	"github.com/go-check/check"
    16  )
    17  
    18  var cleanSpaces = func(s string) string {
    19  	lines := strings.Split(s, "\n")
    20  	for i, line := range lines {
    21  		spaceIx := strings.Index(line, " ")
    22  		if spaceIx > 0 {
    23  			lines[i] = line[:spaceIx+1] + strings.TrimLeft(line[spaceIx:], " ")
    24  		}
    25  	}
    26  	return strings.Join(lines, "\n")
    27  }
    28  
    29  func (s *DockerSwarmSuite) TestStackRemoveUnknown(c *check.C) {
    30  	d := s.AddDaemon(c, true, true)
    31  
    32  	stackArgs := append([]string{"stack", "remove", "UNKNOWN_STACK"})
    33  
    34  	out, err := d.Cmd(stackArgs...)
    35  	c.Assert(err, checker.IsNil)
    36  	c.Assert(out, check.Equals, "Nothing found in stack: UNKNOWN_STACK\n")
    37  }
    38  
    39  func (s *DockerSwarmSuite) TestStackPSUnknown(c *check.C) {
    40  	d := s.AddDaemon(c, true, true)
    41  
    42  	stackArgs := append([]string{"stack", "ps", "UNKNOWN_STACK"})
    43  
    44  	out, err := d.Cmd(stackArgs...)
    45  	c.Assert(err, checker.IsNil)
    46  	c.Assert(out, check.Equals, "Nothing found in stack: UNKNOWN_STACK\n")
    47  }
    48  
    49  func (s *DockerSwarmSuite) TestStackServicesUnknown(c *check.C) {
    50  	d := s.AddDaemon(c, true, true)
    51  
    52  	stackArgs := append([]string{"stack", "services", "UNKNOWN_STACK"})
    53  
    54  	out, err := d.Cmd(stackArgs...)
    55  	c.Assert(err, checker.IsNil)
    56  	c.Assert(out, check.Equals, "Nothing found in stack: UNKNOWN_STACK\n")
    57  }
    58  
    59  func (s *DockerSwarmSuite) TestStackDeployComposeFile(c *check.C) {
    60  	d := s.AddDaemon(c, true, true)
    61  
    62  	testStackName := "testdeploy"
    63  	stackArgs := []string{
    64  		"stack", "deploy",
    65  		"--compose-file", "fixtures/deploy/default.yaml",
    66  		testStackName,
    67  	}
    68  	out, err := d.Cmd(stackArgs...)
    69  	c.Assert(err, checker.IsNil, check.Commentf(out))
    70  
    71  	out, err = d.Cmd("stack", "ls")
    72  	c.Assert(err, checker.IsNil)
    73  	c.Assert(cleanSpaces(out), check.Equals, "NAME SERVICES\n"+"testdeploy 2\n")
    74  
    75  	out, err = d.Cmd("stack", "rm", testStackName)
    76  	c.Assert(err, checker.IsNil)
    77  	out, err = d.Cmd("stack", "ls")
    78  	c.Assert(err, checker.IsNil)
    79  	c.Assert(cleanSpaces(out), check.Equals, "NAME SERVICES\n")
    80  }
    81  
    82  func (s *DockerSwarmSuite) TestStackDeployWithSecretsTwice(c *check.C) {
    83  	d := s.AddDaemon(c, true, true)
    84  
    85  	out, err := d.Cmd("secret", "create", "outside", "fixtures/secrets/default")
    86  	c.Assert(err, checker.IsNil, check.Commentf(out))
    87  
    88  	testStackName := "testdeploy"
    89  	stackArgs := []string{
    90  		"stack", "deploy",
    91  		"--compose-file", "fixtures/deploy/secrets.yaml",
    92  		testStackName,
    93  	}
    94  	out, err = d.Cmd(stackArgs...)
    95  	c.Assert(err, checker.IsNil, check.Commentf(out))
    96  
    97  	out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", "testdeploy_web")
    98  	c.Assert(err, checker.IsNil)
    99  
   100  	var refs []swarm.SecretReference
   101  	c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil)
   102  	c.Assert(refs, checker.HasLen, 3)
   103  
   104  	sort.Sort(sortSecrets(refs))
   105  	c.Assert(refs[0].SecretName, checker.Equals, "outside")
   106  	c.Assert(refs[1].SecretName, checker.Equals, "testdeploy_special")
   107  	c.Assert(refs[1].File.Name, checker.Equals, "special")
   108  	c.Assert(refs[2].SecretName, checker.Equals, "testdeploy_super")
   109  	c.Assert(refs[2].File.Name, checker.Equals, "foo.txt")
   110  	c.Assert(refs[2].File.Mode, checker.Equals, os.FileMode(0400))
   111  
   112  	// Deploy again to ensure there are no errors when secret hasn't changed
   113  	out, err = d.Cmd(stackArgs...)
   114  	c.Assert(err, checker.IsNil, check.Commentf(out))
   115  }
   116  
   117  func (s *DockerSwarmSuite) TestStackRemove(c *check.C) {
   118  	d := s.AddDaemon(c, true, true)
   119  
   120  	stackName := "testdeploy"
   121  	stackArgs := []string{
   122  		"stack", "deploy",
   123  		"--compose-file", "fixtures/deploy/remove.yaml",
   124  		stackName,
   125  	}
   126  	result := icmd.RunCmd(d.Command(stackArgs...))
   127  	result.Assert(c, icmd.Expected{
   128  		Err: icmd.None,
   129  		Out: "Creating service testdeploy_web",
   130  	})
   131  
   132  	result = icmd.RunCmd(d.Command("service", "ls"))
   133  	result.Assert(c, icmd.Success)
   134  	c.Assert(
   135  		strings.Split(strings.TrimSpace(result.Stdout()), "\n"),
   136  		checker.HasLen, 2)
   137  
   138  	result = icmd.RunCmd(d.Command("stack", "rm", stackName))
   139  	result.Assert(c, icmd.Success)
   140  	stderr := result.Stderr()
   141  	c.Assert(stderr, checker.Contains, "Removing service testdeploy_web")
   142  	c.Assert(stderr, checker.Contains, "Removing network testdeploy_default")
   143  	c.Assert(stderr, checker.Contains, "Removing secret testdeploy_special")
   144  }
   145  
   146  type sortSecrets []swarm.SecretReference
   147  
   148  func (s sortSecrets) Len() int           { return len(s) }
   149  func (s sortSecrets) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
   150  func (s sortSecrets) Less(i, j int) bool { return s[i].SecretName < s[j].SecretName }
   151  
   152  // testDAB is the DAB JSON used for testing.
   153  // TODO: Use template/text and substitute "Image" with the result of
   154  // `docker inspect --format '{{index .RepoDigests 0}}' busybox:latest`
   155  const testDAB = `{
   156      "Version": "0.1",
   157      "Services": {
   158  	"srv1": {
   159  	    "Image": "busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0",
   160  	    "Command": ["top"]
   161  	},
   162  	"srv2": {
   163  	    "Image": "busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0",
   164  	    "Command": ["tail"],
   165  	    "Args": ["-f", "/dev/null"]
   166  	}
   167      }
   168  }`
   169  
   170  func (s *DockerSwarmSuite) TestStackDeployWithDAB(c *check.C) {
   171  	testRequires(c, ExperimentalDaemon)
   172  	// setup
   173  	testStackName := "test"
   174  	testDABFileName := testStackName + ".dab"
   175  	defer os.RemoveAll(testDABFileName)
   176  	err := ioutil.WriteFile(testDABFileName, []byte(testDAB), 0444)
   177  	c.Assert(err, checker.IsNil)
   178  	d := s.AddDaemon(c, true, true)
   179  	// deploy
   180  	stackArgs := []string{
   181  		"stack", "deploy",
   182  		"--bundle-file", testDABFileName,
   183  		testStackName,
   184  	}
   185  	out, err := d.Cmd(stackArgs...)
   186  	c.Assert(err, checker.IsNil)
   187  	c.Assert(out, checker.Contains, "Loading bundle from test.dab\n")
   188  	c.Assert(out, checker.Contains, "Creating service test_srv1\n")
   189  	c.Assert(out, checker.Contains, "Creating service test_srv2\n")
   190  	// ls
   191  	stackArgs = []string{"stack", "ls"}
   192  	out, err = d.Cmd(stackArgs...)
   193  	c.Assert(err, checker.IsNil)
   194  	c.Assert(cleanSpaces(out), check.Equals, "NAME SERVICES\n"+"test 2\n")
   195  	// rm
   196  	stackArgs = []string{"stack", "rm", testStackName}
   197  	out, err = d.Cmd(stackArgs...)
   198  	c.Assert(err, checker.IsNil)
   199  	c.Assert(out, checker.Contains, "Removing service test_srv1\n")
   200  	c.Assert(out, checker.Contains, "Removing service test_srv2\n")
   201  	// ls (empty)
   202  	stackArgs = []string{"stack", "ls"}
   203  	out, err = d.Cmd(stackArgs...)
   204  	c.Assert(err, checker.IsNil)
   205  	c.Assert(cleanSpaces(out), check.Equals, "NAME SERVICES\n")
   206  }