Browse code

Extend test coverage of secrets

Actually look inside the container to see if the secret data is present
and correct. Test absolute paths, relative paths, and just a basename.
Test the scenario where a service references the same secret under
different targets.

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>

Aaron Lehmann authored on 2017/04/29 08:45:37
Showing 1 changed files
... ...
@@ -5,6 +5,7 @@ package main
5 5
 import (
6 6
 	"encoding/json"
7 7
 	"fmt"
8
+	"path/filepath"
8 9
 	"strings"
9 10
 
10 11
 	"github.com/docker/docker/api/types"
... ...
@@ -100,38 +101,114 @@ func (s *DockerSwarmSuite) TestServiceCreateWithSecretSourceTargetPaths(c *check
100 100
 	d := s.AddDaemon(c, true, true)
101 101
 
102 102
 	testPaths := map[string]string{
103
-		"app":         "/etc/secret",
104
-		"test_secret": "test_secret",
103
+		"app":                  "/etc/secret",
104
+		"test_secret":          "test_secret",
105
+		"relative_secret":      "relative/secret",
106
+		"escapes_in_container": "../secret",
105 107
 	}
108
+
109
+	var secretFlags []string
110
+
106 111
 	for testName, testTarget := range testPaths {
107
-		serviceName := "svc-" + testName
108 112
 		id := d.CreateSecret(c, swarm.SecretSpec{
109 113
 			Annotations: swarm.Annotations{
110 114
 				Name: testName,
111 115
 			},
112
-			Data: []byte("TESTINGDATA"),
116
+			Data: []byte("TESTINGDATA " + testName + " " + testTarget),
113 117
 		})
114 118
 		c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id))
115 119
 
116
-		out, err := d.Cmd("service", "create", "--name", serviceName, "--secret", fmt.Sprintf("source=%s,target=%s", testName, testTarget), "busybox", "top")
117
-		c.Assert(err, checker.IsNil, check.Commentf(out))
120
+		secretFlags = append(secretFlags, "--secret", fmt.Sprintf("source=%s,target=%s", testName, testTarget))
121
+	}
122
+
123
+	serviceName := "svc"
124
+	serviceCmd := []string{"service", "create", "--name", serviceName}
125
+	serviceCmd = append(serviceCmd, secretFlags...)
126
+	serviceCmd = append(serviceCmd, "busybox", "top")
127
+	out, err := d.Cmd(serviceCmd...)
128
+	c.Assert(err, checker.IsNil, check.Commentf(out))
129
+
130
+	out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName)
131
+	c.Assert(err, checker.IsNil)
132
+
133
+	var refs []swarm.SecretReference
134
+	c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil)
135
+	c.Assert(refs, checker.HasLen, len(testPaths))
136
+
137
+	var tasks []swarm.Task
138
+	waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) {
139
+		tasks = d.GetServiceTasks(c, serviceName)
140
+		return len(tasks) > 0, nil
141
+	}, checker.Equals, true)
118 142
 
119
-		out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName)
143
+	task := tasks[0]
144
+	waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) {
145
+		if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" {
146
+			task = d.GetTask(c, task.ID)
147
+		}
148
+		return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil
149
+	}, checker.Equals, true)
150
+
151
+	for testName, testTarget := range testPaths {
152
+		path := testTarget
153
+		if !filepath.IsAbs(path) {
154
+			path = filepath.Join("/run/secrets", path)
155
+		}
156
+		out, err := d.Cmd("exec", task.Status.ContainerStatus.ContainerID, "cat", path)
120 157
 		c.Assert(err, checker.IsNil)
158
+		c.Assert(out, checker.Equals, "TESTINGDATA "+testName+" "+testTarget)
159
+	}
121 160
 
122
-		var refs []swarm.SecretReference
123
-		c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil)
124
-		c.Assert(refs, checker.HasLen, 1)
161
+	out, err = d.Cmd("service", "rm", serviceName)
162
+	c.Assert(err, checker.IsNil, check.Commentf(out))
163
+}
125 164
 
126
-		c.Assert(refs[0].SecretName, checker.Equals, testName)
127
-		c.Assert(refs[0].File, checker.Not(checker.IsNil))
128
-		c.Assert(refs[0].File.Name, checker.Equals, testTarget)
165
+func (s *DockerSwarmSuite) TestServiceCreateWithSecretReferencedTwice(c *check.C) {
166
+	d := s.AddDaemon(c, true, true)
129 167
 
130
-		out, err = d.Cmd("service", "rm", serviceName)
131
-		c.Assert(err, checker.IsNil, check.Commentf(out))
168
+	id := d.CreateSecret(c, swarm.SecretSpec{
169
+		Annotations: swarm.Annotations{
170
+			Name: "mysecret",
171
+		},
172
+		Data: []byte("TESTINGDATA"),
173
+	})
174
+	c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id))
175
+
176
+	serviceName := "svc"
177
+	out, err := d.Cmd("service", "create", "--name", serviceName, "--secret", "source=mysecret,target=target1", "--secret", "source=mysecret,target=target2", "busybox", "top")
178
+	c.Assert(err, checker.IsNil, check.Commentf(out))
179
+
180
+	out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName)
181
+	c.Assert(err, checker.IsNil)
182
+
183
+	var refs []swarm.SecretReference
184
+	c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil)
185
+	c.Assert(refs, checker.HasLen, 2)
186
+
187
+	var tasks []swarm.Task
188
+	waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) {
189
+		tasks = d.GetServiceTasks(c, serviceName)
190
+		return len(tasks) > 0, nil
191
+	}, checker.Equals, true)
192
+
193
+	task := tasks[0]
194
+	waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) {
195
+		if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" {
196
+			task = d.GetTask(c, task.ID)
197
+		}
198
+		return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil
199
+	}, checker.Equals, true)
132 200
 
133
-		d.DeleteSecret(c, testName)
201
+	for _, target := range []string{"target1", "target2"} {
202
+		c.Assert(err, checker.IsNil, check.Commentf(out))
203
+		path := filepath.Join("/run/secrets", target)
204
+		out, err := d.Cmd("exec", task.Status.ContainerStatus.ContainerID, "cat", path)
205
+		c.Assert(err, checker.IsNil)
206
+		c.Assert(out, checker.Equals, "TESTINGDATA")
134 207
 	}
208
+
209
+	out, err = d.Cmd("service", "rm", serviceName)
210
+	c.Assert(err, checker.IsNil, check.Commentf(out))
135 211
 }
136 212
 
137 213
 func (s *DockerSwarmSuite) TestServiceCreateMountTmpfs(c *check.C) {