Browse code

review updates

- use Filters instead of Filter for secret list
- UID, GID -> string
- getSecrets -> getSecretsByName
- updated test case for secrets with better source
- use golang.org/x/context instead of context
- for grpc conversion allocate with make
- check for nil with task.Spec.GetContainer()

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>

Evan Hazlett authored on 2016/11/04 03:09:13
Showing 14 changed files
... ...
@@ -267,14 +267,13 @@ func (sr *swarmRouter) getSecrets(ctx context.Context, w http.ResponseWriter, r
267 267
 	if err := httputils.ParseForm(r); err != nil {
268 268
 		return err
269 269
 	}
270
-	filter, err := filters.FromParam(r.Form.Get("filters"))
270
+	filters, err := filters.FromParam(r.Form.Get("filters"))
271 271
 	if err != nil {
272 272
 		return err
273 273
 	}
274 274
 
275
-	secrets, err := sr.backend.GetSecrets(basictypes.SecretListOptions{Filter: filter})
275
+	secrets, err := sr.backend.GetSecrets(basictypes.SecretListOptions{Filters: filters})
276 276
 	if err != nil {
277
-		logrus.Errorf("Error getting secrets: %v", err)
278 277
 		return err
279 278
 	}
280 279
 
... ...
@@ -289,7 +288,6 @@ func (sr *swarmRouter) createSecret(ctx context.Context, w http.ResponseWriter,
289 289
 
290 290
 	id, err := sr.backend.CreateSecret(secret)
291 291
 	if err != nil {
292
-		logrus.Errorf("Error creating secret %s: %v", id, err)
293 292
 		return err
294 293
 	}
295 294
 
... ...
@@ -300,7 +298,6 @@ func (sr *swarmRouter) createSecret(ctx context.Context, w http.ResponseWriter,
300 300
 
301 301
 func (sr *swarmRouter) removeSecret(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
302 302
 	if err := sr.backend.RemoveSecret(vars["id"]); err != nil {
303
-		logrus.Errorf("Error removing secret %s: %v", vars["id"], err)
304 303
 		return err
305 304
 	}
306 305
 
... ...
@@ -310,7 +307,6 @@ func (sr *swarmRouter) removeSecret(ctx context.Context, w http.ResponseWriter,
310 310
 func (sr *swarmRouter) getSecret(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
311 311
 	secret, err := sr.backend.GetSecret(vars["id"])
312 312
 	if err != nil {
313
-		logrus.Errorf("Error getting secret %s: %v", vars["id"], err)
314 313
 		return err
315 314
 	}
316 315
 
... ...
@@ -6,7 +6,7 @@ type ContainerSecret struct {
6 6
 	Name   string
7 7
 	Target string
8 8
 	Data   []byte
9
-	UID    int
10
-	GID    int
9
+	UID    string
10
+	GID    string
11 11
 	Mode   os.FileMode
12 12
 }
... ...
@@ -520,5 +520,5 @@ type SecretCreateResponse struct {
520 520
 
521 521
 // SecretListOptions holds parameters to list secrets
522 522
 type SecretListOptions struct {
523
-	Filter filters.Args
523
+	Filters filters.Args
524 524
 }
... ...
@@ -35,7 +35,7 @@ func runSecretInspect(dockerCli *command.DockerCli, opts inspectOptions) error {
35 35
 	ctx := context.Background()
36 36
 
37 37
 	// attempt to lookup secret by name
38
-	secrets, err := getSecrets(client, ctx, []string{opts.name})
38
+	secrets, err := getSecretsByName(client, ctx, []string{opts.name})
39 39
 	if err != nil {
40 40
 		return err
41 41
 	}
... ...
@@ -32,7 +32,7 @@ func runSecretRemove(dockerCli *command.DockerCli, opts removeOptions) error {
32 32
 	ctx := context.Background()
33 33
 
34 34
 	// attempt to lookup secret by name
35
-	secrets, err := getSecrets(client, ctx, opts.ids)
35
+	secrets, err := getSecretsByName(client, ctx, opts.ids)
36 36
 	if err != nil {
37 37
 		return err
38 38
 	}
... ...
@@ -9,13 +9,13 @@ import (
9 9
 	"github.com/docker/docker/client"
10 10
 )
11 11
 
12
-func getSecrets(client client.APIClient, ctx context.Context, names []string) ([]swarm.Secret, error) {
12
+func getSecretsByName(client client.APIClient, ctx context.Context, names []string) ([]swarm.Secret, error) {
13 13
 	args := filters.NewArgs()
14 14
 	for _, n := range names {
15 15
 		args.Add("names", n)
16 16
 	}
17 17
 
18 18
 	return client.SecretList(ctx, types.SecretListOptions{
19
-		Filter: args,
19
+		Filters: args,
20 20
 	})
21 21
 }
... ...
@@ -108,45 +108,45 @@ func TestHealthCheckOptionsToHealthConfigConflict(t *testing.T) {
108 108
 }
109 109
 
110 110
 func TestSecretOptionsSimple(t *testing.T) {
111
-	var opt SecretOpt
111
+	var opt opts.SecretOpt
112 112
 
113
-	testCase := "source=/foo,target=testing"
113
+	testCase := "source=foo,target=testing"
114 114
 	assert.NilError(t, opt.Set(testCase))
115 115
 
116 116
 	reqs := opt.Value()
117 117
 	assert.Equal(t, len(reqs), 1)
118 118
 	req := reqs[0]
119
-	assert.Equal(t, req.source, "/foo")
120
-	assert.Equal(t, req.target, "testing")
119
+	assert.Equal(t, req.Source, "foo")
120
+	assert.Equal(t, req.Target, "testing")
121 121
 }
122 122
 
123 123
 func TestSecretOptionsCustomUidGid(t *testing.T) {
124
-	var opt SecretOpt
124
+	var opt opts.SecretOpt
125 125
 
126
-	testCase := "source=/foo,target=testing,uid=1000,gid=1001"
126
+	testCase := "source=foo,target=testing,uid=1000,gid=1001"
127 127
 	assert.NilError(t, opt.Set(testCase))
128 128
 
129 129
 	reqs := opt.Value()
130 130
 	assert.Equal(t, len(reqs), 1)
131 131
 	req := reqs[0]
132
-	assert.Equal(t, req.source, "/foo")
133
-	assert.Equal(t, req.target, "testing")
134
-	assert.Equal(t, req.uid, "1000")
135
-	assert.Equal(t, req.gid, "1001")
132
+	assert.Equal(t, req.Source, "foo")
133
+	assert.Equal(t, req.Target, "testing")
134
+	assert.Equal(t, req.UID, "1000")
135
+	assert.Equal(t, req.GID, "1001")
136 136
 }
137 137
 
138 138
 func TestSecretOptionsCustomMode(t *testing.T) {
139
-	var opt SecretOpt
139
+	var opt opts.SecretOpt
140 140
 
141
-	testCase := "source=/foo,target=testing,uid=1000,gid=1001,mode=0444"
141
+	testCase := "source=foo,target=testing,uid=1000,gid=1001,mode=0444"
142 142
 	assert.NilError(t, opt.Set(testCase))
143 143
 
144 144
 	reqs := opt.Value()
145 145
 	assert.Equal(t, len(reqs), 1)
146 146
 	req := reqs[0]
147
-	assert.Equal(t, req.source, "/foo")
148
-	assert.Equal(t, req.target, "testing")
149
-	assert.Equal(t, req.uid, "1000")
150
-	assert.Equal(t, req.gid, "1001")
151
-	assert.Equal(t, req.mode, os.FileMode(0444))
147
+	assert.Equal(t, req.Source, "foo")
148
+	assert.Equal(t, req.Target, "testing")
149
+	assert.Equal(t, req.UID, "1000")
150
+	assert.Equal(t, req.GID, "1001")
151
+	assert.Equal(t, req.Mode, os.FileMode(0444))
152 152
 }
... ...
@@ -1,13 +1,13 @@
1 1
 package service
2 2
 
3 3
 import (
4
-	"context"
5 4
 	"fmt"
6 5
 
7 6
 	"github.com/docker/docker/api/types"
8 7
 	"github.com/docker/docker/api/types/filters"
9 8
 	swarmtypes "github.com/docker/docker/api/types/swarm"
10 9
 	"github.com/docker/docker/client"
10
+	"golang.org/x/net/context"
11 11
 )
12 12
 
13 13
 // parseSecrets retrieves the secrets from the requested names and converts
... ...
@@ -39,7 +39,7 @@ func parseSecrets(client client.APIClient, requestedSecrets []*types.SecretReque
39 39
 	}
40 40
 
41 41
 	secrets, err := client.SecretList(ctx, types.SecretListOptions{
42
-		Filter: args,
42
+		Filters: args,
43 43
 	})
44 44
 	if err != nil {
45 45
 		return nil, err
... ...
@@ -14,8 +14,8 @@ import (
14 14
 func (cli *Client) SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) {
15 15
 	query := url.Values{}
16 16
 
17
-	if options.Filter.Len() > 0 {
18
-		filterJSON, err := filters.ToParam(options.Filter)
17
+	if options.Filters.Len() > 0 {
18
+		filterJSON, err := filters.ToParam(options.Filters)
19 19
 		if err != nil {
20 20
 			return nil, err
21 21
 		}
... ...
@@ -45,7 +45,7 @@ func TestSecretList(t *testing.T) {
45 45
 		},
46 46
 		{
47 47
 			options: types.SecretListOptions{
48
-				Filter: filters,
48
+				Filters: filters,
49 49
 			},
50 50
 			expectedQueryParams: map[string]string{
51 51
 				"filters": `{"label":{"label1":true,"label2":true}}`,
... ...
@@ -78,7 +78,7 @@ func containerSpecFromGRPC(c *swarmapi.ContainerSpec) types.ContainerSpec {
78 78
 }
79 79
 
80 80
 func secretReferencesToGRPC(sr []*types.SecretReference) []*swarmapi.SecretReference {
81
-	refs := []*swarmapi.SecretReference{}
81
+	refs := make([]*swarmapi.SecretReference, 0, len(sr))
82 82
 	for _, s := range sr {
83 83
 		refs = append(refs, &swarmapi.SecretReference{
84 84
 			SecretID:   s.SecretID,
... ...
@@ -97,7 +97,7 @@ func secretReferencesToGRPC(sr []*types.SecretReference) []*swarmapi.SecretRefer
97 97
 	return refs
98 98
 }
99 99
 func secretReferencesFromGRPC(sr []*swarmapi.SecretReference) []*types.SecretReference {
100
-	refs := []*types.SecretReference{}
100
+	refs := make([]*types.SecretReference, 0, len(sr))
101 101
 	for _, s := range sr {
102 102
 		target := s.GetFile()
103 103
 		if target == nil {
... ...
@@ -5,7 +5,6 @@ import (
5 5
 	"encoding/json"
6 6
 	"fmt"
7 7
 	"io"
8
-	"strconv"
9 8
 	"strings"
10 9
 	"syscall"
11 10
 	"time"
... ...
@@ -219,7 +218,11 @@ func (c *containerAdapter) create(ctx context.Context) error {
219 219
 		}
220 220
 	}
221 221
 
222
-	secrets := []*containertypes.ContainerSecret{}
222
+	container := c.container.task.Spec.GetContainer()
223
+	if container == nil {
224
+		return fmt.Errorf("unable to get container from task spec")
225
+	}
226
+	secrets := make([]*containertypes.ContainerSecret, 0, len(container.Secrets))
223 227
 	for _, s := range c.container.task.Spec.GetContainer().Secrets {
224 228
 		sec := c.secrets.Get(s.SecretID)
225 229
 		if sec == nil {
... ...
@@ -233,23 +236,13 @@ func (c *containerAdapter) create(ctx context.Context) error {
233 233
 			logrus.Warnf("secret target was not a file: secret=%s", s.SecretID)
234 234
 			continue
235 235
 		}
236
-		// convert uid / gid string to int
237
-		uid, err := strconv.Atoi(target.UID)
238
-		if err != nil {
239
-			return err
240
-		}
241
-
242
-		gid, err := strconv.Atoi(target.GID)
243
-		if err != nil {
244
-			return err
245
-		}
246 236
 
247 237
 		secrets = append(secrets, &containertypes.ContainerSecret{
248 238
 			Name:   name,
249 239
 			Target: target.Name,
250 240
 			Data:   sec.Spec.Data,
251
-			UID:    uid,
252
-			GID:    gid,
241
+			UID:    target.UID,
242
+			GID:    target.GID,
253 243
 			Mode:   target.Mode,
254 244
 		})
255 245
 	}
... ...
@@ -29,7 +29,7 @@ func (c *Cluster) GetSecrets(options apitypes.SecretListOptions) ([]types.Secret
29 29
 		return nil, c.errNoManager()
30 30
 	}
31 31
 
32
-	filters, err := newListSecretsFilters(options.Filter)
32
+	filters, err := newListSecretsFilters(options.Filters)
33 33
 	if err != nil {
34 34
 		return nil, err
35 35
 	}
... ...
@@ -97,6 +97,7 @@ func (c *Cluster) RemoveSecret(id string) error {
97 97
 }
98 98
 
99 99
 // UpdateSecret updates a secret in a managed swarm cluster.
100
+// Note: this is not exposed to the CLI but is available from the API only
100 101
 func (c *Cluster) UpdateSecret(id string, version uint64, spec types.SecretSpec) error {
101 102
 	c.RLock()
102 103
 	defer c.RUnlock()
... ...
@@ -191,7 +191,16 @@ func (daemon *Daemon) setupSecretDir(c *container.Container) (setupErr error) {
191 191
 			return errors.Wrap(err, "error injecting secret")
192 192
 		}
193 193
 
194
-		if err := os.Chown(fPath, s.UID, s.GID); err != nil {
194
+		uid, err := strconv.Atoi(s.UID)
195
+		if err != nil {
196
+			return err
197
+		}
198
+		gid, err := strconv.Atoi(s.GID)
199
+		if err != nil {
200
+			return err
201
+		}
202
+
203
+		if err := os.Chown(fPath, uid, gid); err != nil {
195 204
 			return errors.Wrap(err, "error setting ownership for secret")
196 205
 		}
197 206
 	}