diff --git a/cli/command/secret/inspect.go b/cli/command/secret/inspect.go index 04a5bd8a88..a82a26e4a8 100644 --- a/cli/command/secret/inspect.go +++ b/cli/command/secret/inspect.go @@ -9,18 +9,18 @@ import ( ) type inspectOptions struct { - name string + names []string format string } func newSecretInspectCommand(dockerCli *command.DockerCli) *cobra.Command { opts := inspectOptions{} cmd := &cobra.Command{ - Use: "inspect [name]", + Use: "inspect SECRET [SECRET]", Short: "Inspect a secret", - Args: cli.ExactArgs(1), + Args: cli.RequiresMinArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - opts.name = args[0] + opts.names = args return runSecretInspect(dockerCli, opts) }, } @@ -33,23 +33,13 @@ func runSecretInspect(dockerCli *command.DockerCli, opts inspectOptions) error { client := dockerCli.Client() ctx := context.Background() - // attempt to lookup secret by name - secrets, err := getSecretsByName(ctx, client, []string{opts.name}) + ids, err := getCliRequestedSecretIDs(ctx, client, opts.names) if err != nil { return err } - - id := opts.name - for _, s := range secrets { - if s.Spec.Annotations.Name == opts.name { - id = s.ID - break - } - } - - getRef := func(name string) (interface{}, []byte, error) { + getRef := func(id string) (interface{}, []byte, error) { return client.SecretInspectWithRaw(ctx, id) } - return inspect.Inspect(dockerCli.Out(), []string{id}, opts.format, getRef) + return inspect.Inspect(dockerCli.Out(), ids, opts.format, getRef) } diff --git a/cli/command/secret/remove.go b/cli/command/secret/remove.go index 44a71ef013..75b4be622b 100644 --- a/cli/command/secret/remove.go +++ b/cli/command/secret/remove.go @@ -10,17 +10,17 @@ import ( ) type removeOptions struct { - ids []string + names []string } func newSecretRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { return &cobra.Command{ - Use: "rm [id]", + Use: "rm SECRET [SECRET]", Short: "Remove a secret", Args: cli.RequiresMinArgs(1), RunE: func(cmd *cobra.Command, args []string) error { opts := removeOptions{ - ids: args, + names: args, } return runSecretRemove(dockerCli, opts) }, @@ -31,32 +31,14 @@ func runSecretRemove(dockerCli *command.DockerCli, opts removeOptions) error { client := dockerCli.Client() ctx := context.Background() - // attempt to lookup secret by name - secrets, err := getSecretsByName(ctx, client, opts.ids) + ids, err := getCliRequestedSecretIDs(ctx, client, opts.names) if err != nil { return err } - ids := opts.ids - - names := make(map[string]int) - for _, id := range ids { - names[id] = 1 - } - - if len(secrets) > 0 { - ids = []string{} - - for _, s := range secrets { - if _, ok := names[s.Spec.Annotations.Name]; ok { - ids = append(ids, s.ID) - } - } - } - for _, id := range ids { if err := client.SecretRemove(ctx, id); err != nil { - return err + fmt.Fprintf(dockerCli.Out(), "WARN: %s\n", err) } fmt.Fprintln(dockerCli.Out(), id) diff --git a/cli/command/secret/utils.go b/cli/command/secret/utils.go index c6e3cb61a2..0134853e09 100644 --- a/cli/command/secret/utils.go +++ b/cli/command/secret/utils.go @@ -18,3 +18,30 @@ func getSecretsByName(ctx context.Context, client client.APIClient, names []stri Filters: args, }) } + +func getCliRequestedSecretIDs(ctx context.Context, client client.APIClient, names []string) ([]string, error) { + ids := names + + // attempt to lookup secret by name + secrets, err := getSecretsByName(ctx, client, ids) + if err != nil { + return nil, err + } + + lookup := make(map[string]struct{}) + for _, id := range ids { + lookup[id] = struct{}{} + } + + if len(secrets) > 0 { + ids = []string{} + + for _, s := range secrets { + if _, ok := lookup[s.Spec.Annotations.Name]; ok { + ids = append(ids, s.ID) + } + } + } + + return ids, nil +} diff --git a/integration-cli/docker_cli_secret_inspect_test.go b/integration-cli/docker_cli_secret_inspect_test.go new file mode 100644 index 0000000000..0985a2bd59 --- /dev/null +++ b/integration-cli/docker_cli_secret_inspect_test.go @@ -0,0 +1,68 @@ +// +build !windows + +package main + +import ( + "encoding/json" + + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/pkg/integration/checker" + "github.com/go-check/check" +) + +func (s *DockerSwarmSuite) TestSecretInspect(c *check.C) { + d := s.AddDaemon(c, true, true) + + testName := "test_secret" + id := d.createSecret(c, swarm.SecretSpec{ + swarm.Annotations{ + Name: testName, + }, + []byte("TESTINGDATA"), + }) + c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) + + secret := d.getSecret(c, id) + c.Assert(secret.Spec.Name, checker.Equals, testName) + + out, err := d.Cmd("secret", "inspect", testName) + c.Assert(err, checker.IsNil, check.Commentf(out)) + + var secrets []swarm.Secret + c.Assert(json.Unmarshal([]byte(out), &secrets), checker.IsNil) + c.Assert(secrets, checker.HasLen, 1) +} + +func (s *DockerSwarmSuite) TestSecretInspectMultiple(c *check.C) { + d := s.AddDaemon(c, true, true) + + testNames := []string{ + "test0", + "test1", + } + for _, n := range testNames { + id := d.createSecret(c, swarm.SecretSpec{ + swarm.Annotations{ + Name: n, + }, + []byte("TESTINGDATA"), + }) + c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) + + secret := d.getSecret(c, id) + c.Assert(secret.Spec.Name, checker.Equals, n) + + } + + args := []string{ + "secret", + "inspect", + } + args = append(args, testNames...) + out, err := d.Cmd(args...) + c.Assert(err, checker.IsNil, check.Commentf(out)) + + var secrets []swarm.Secret + c.Assert(json.Unmarshal([]byte(out), &secrets), checker.IsNil) + c.Assert(secrets, checker.HasLen, 2) +}