11package main
22
33import (
4+ "encoding/json"
45 "io/ioutil"
56 "os"
7+ "sort"
68
9+ "github.com/docker/docker/api/types/swarm"
10+ "github.com/docker/docker/integration-cli/checker"
711 "github.com/docker/docker/pkg/integration/checker"
812 "github.com/go-check/check"
913)
1014
1115func (s * DockerSwarmSuite ) TestStackRemove (c * check.C ) {
12- testRequires (c , ExperimentalDaemon )
1316 d := s .AddDaemon (c , true , true )
1417
1518 stackArgs := append ([]string {"stack" , "remove" , "UNKNOWN_STACK" })
@@ -20,7 +23,6 @@ func (s *DockerSwarmSuite) TestStackRemove(c *check.C) {
2023}
2124
2225func (s * DockerSwarmSuite ) TestStackTasks (c * check.C ) {
23- testRequires (c , ExperimentalDaemon )
2426 d := s .AddDaemon (c , true , true )
2527
2628 stackArgs := append ([]string {"stack" , "ps" , "UNKNOWN_STACK" })
@@ -31,7 +33,6 @@ func (s *DockerSwarmSuite) TestStackTasks(c *check.C) {
3133}
3234
3335func (s * DockerSwarmSuite ) TestStackServices (c * check.C ) {
34- testRequires (c , ExperimentalDaemon )
3536 d := s .AddDaemon (c , true , true )
3637
3738 stackArgs := append ([]string {"stack" , "services" , "UNKNOWN_STACK" })
@@ -42,7 +43,6 @@ func (s *DockerSwarmSuite) TestStackServices(c *check.C) {
4243}
4344
4445func (s * DockerSwarmSuite ) TestStackDeployComposeFile (c * check.C ) {
45- testRequires (c , ExperimentalDaemon )
4646 d := s .AddDaemon (c , true , true )
4747
4848 testStackName := "testdeploy"
@@ -65,6 +65,43 @@ func (s *DockerSwarmSuite) TestStackDeployComposeFile(c *check.C) {
6565 c .Assert (out , check .Equals , "NAME SERVICES\n " )
6666}
6767
68+ func (s * DockerSwarmSuite ) TestStackDeployWithSecretsTwice (c * check.C ) {
69+ d := s .AddDaemon (c , true , true )
70+
71+ testStackName := "testdeploy"
72+ stackArgs := []string {
73+ "stack" , "deploy" ,
74+ "--compose-file" , "fixtures/deploy/secrets.yaml" ,
75+ testStackName ,
76+ }
77+ out , err := d .Cmd (stackArgs ... )
78+ c .Assert (err , checker .IsNil , check .Commentf (out ))
79+
80+ out , err = d .Cmd ("service" , "inspect" , "--format" , "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}" , "testdeploy_web" )
81+ c .Assert (err , checker .IsNil )
82+
83+ var refs []swarm.SecretReference
84+ c .Assert (json .Unmarshal ([]byte (out ), & refs ), checker .IsNil )
85+ c .Assert (refs , checker .HasLen , 2 )
86+
87+ sort .Sort (sortSecrets (refs ))
88+ c .Assert (refs [0 ].SecretName , checker .Equals , "testdeploy_special" )
89+ c .Assert (refs [0 ].File .Name , checker .Equals , "special" )
90+ c .Assert (refs [1 ].SecretName , checker .Equals , "testdeploy_super" )
91+ c .Assert (refs [1 ].File .Name , checker .Equals , "foo.txt" )
92+ c .Assert (refs [1 ].File .Mode , checker .Equals , os .FileMode (0400 ))
93+
94+ // Deploy again to ensure there are no errors when secret hasn't changed
95+ out , err = d .Cmd (stackArgs ... )
96+ c .Assert (err , checker .IsNil , check .Commentf (out ))
97+ }
98+
99+ type sortSecrets []swarm.SecretReference
100+
101+ func (s sortSecrets ) Len () int { return len (s ) }
102+ func (s sortSecrets ) Swap (i , j int ) { s [i ], s [j ] = s [j ], s [i ] }
103+ func (s sortSecrets ) Less (i , j int ) bool { return s [i ].SecretName < s [j ].SecretName }
104+
68105// testDAB is the DAB JSON used for testing.
69106// TODO: Use template/text and substitute "Image" with the result of
70107// `docker inspect --format '{{index .RepoDigests 0}}' busybox:latest`
0 commit comments