github.com/justincormack/cli@v0.0.0-20201215022714-831ebeae9675/cli/command/secret/create.go (about) 1 package secret 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "io/ioutil" 8 9 "github.com/docker/cli/cli" 10 "github.com/docker/cli/cli/command" 11 "github.com/docker/cli/opts" 12 "github.com/docker/docker/api/types/swarm" 13 "github.com/docker/docker/pkg/system" 14 "github.com/pkg/errors" 15 "github.com/spf13/cobra" 16 ) 17 18 type createOptions struct { 19 name string 20 driver string 21 templateDriver string 22 file string 23 labels opts.ListOpts 24 } 25 26 func newSecretCreateCommand(dockerCli command.Cli) *cobra.Command { 27 options := createOptions{ 28 labels: opts.NewListOpts(opts.ValidateLabel), 29 } 30 31 cmd := &cobra.Command{ 32 Use: "create [OPTIONS] SECRET [file|-]", 33 Short: "Create a secret from a file or STDIN as content", 34 Args: cli.RequiresRangeArgs(1, 2), 35 RunE: func(cmd *cobra.Command, args []string) error { 36 options.name = args[0] 37 if len(args) == 2 { 38 options.file = args[1] 39 } 40 return runSecretCreate(dockerCli, options) 41 }, 42 } 43 flags := cmd.Flags() 44 flags.VarP(&options.labels, "label", "l", "Secret labels") 45 flags.StringVarP(&options.driver, "driver", "d", "", "Secret driver") 46 flags.SetAnnotation("driver", "version", []string{"1.31"}) 47 flags.StringVar(&options.templateDriver, "template-driver", "", "Template driver") 48 flags.SetAnnotation("template-driver", "version", []string{"1.37"}) 49 50 return cmd 51 } 52 53 func runSecretCreate(dockerCli command.Cli, options createOptions) error { 54 client := dockerCli.Client() 55 ctx := context.Background() 56 57 if options.driver != "" && options.file != "" { 58 return errors.Errorf("When using secret driver secret data must be empty") 59 } 60 61 secretData, err := readSecretData(dockerCli.In(), options.file) 62 if err != nil { 63 return errors.Errorf("Error reading content from %q: %v", options.file, err) 64 } 65 spec := swarm.SecretSpec{ 66 Annotations: swarm.Annotations{ 67 Name: options.name, 68 Labels: opts.ConvertKVStringsToMap(options.labels.GetAll()), 69 }, 70 Data: secretData, 71 } 72 if options.driver != "" { 73 spec.Driver = &swarm.Driver{ 74 Name: options.driver, 75 } 76 } 77 if options.templateDriver != "" { 78 spec.Templating = &swarm.Driver{ 79 Name: options.templateDriver, 80 } 81 } 82 r, err := client.SecretCreate(ctx, spec) 83 if err != nil { 84 return err 85 } 86 87 fmt.Fprintln(dockerCli.Out(), r.ID) 88 return nil 89 } 90 91 func readSecretData(in io.ReadCloser, file string) ([]byte, error) { 92 // Read secret value from external driver 93 if file == "" { 94 return nil, nil 95 } 96 if file != "-" { 97 var err error 98 in, err = system.OpenSequential(file) 99 if err != nil { 100 return nil, err 101 } 102 defer in.Close() 103 } 104 data, err := ioutil.ReadAll(in) 105 if err != nil { 106 return nil, err 107 } 108 return data, nil 109 }