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 }