github.com/kunnos/engine@v1.13.1/integration-cli/docker_cli_stack_test.go (about)

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