github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/cli/command/volume/create.go (about)

     1  package volume
     2  
     3  import (
     4  	"fmt"
     5  
     6  	volumetypes "github.com/docker/docker/api/types/volume"
     7  	"github.com/docker/docker/cli"
     8  	"github.com/docker/docker/cli/command"
     9  	"github.com/docker/docker/opts"
    10  	runconfigopts "github.com/docker/docker/runconfig/opts"
    11  	"github.com/spf13/cobra"
    12  	"golang.org/x/net/context"
    13  )
    14  
    15  type createOptions struct {
    16  	name       string
    17  	driver     string
    18  	driverOpts opts.MapOpts
    19  	labels     opts.ListOpts
    20  }
    21  
    22  func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command {
    23  	opts := createOptions{
    24  		driverOpts: *opts.NewMapOpts(nil, nil),
    25  		labels:     opts.NewListOpts(opts.ValidateEnv),
    26  	}
    27  
    28  	cmd := &cobra.Command{
    29  		Use:   "create [OPTIONS] [VOLUME]",
    30  		Short: "Create a volume",
    31  		Args:  cli.RequiresMaxArgs(1),
    32  		RunE: func(cmd *cobra.Command, args []string) error {
    33  			if len(args) == 1 {
    34  				if opts.name != "" {
    35  					fmt.Fprint(dockerCli.Err(), "Conflicting options: either specify --name or provide positional arg, not both\n")
    36  					return cli.StatusError{StatusCode: 1}
    37  				}
    38  				opts.name = args[0]
    39  			}
    40  			return runCreate(dockerCli, opts)
    41  		},
    42  	}
    43  	flags := cmd.Flags()
    44  	flags.StringVarP(&opts.driver, "driver", "d", "local", "Specify volume driver name")
    45  	flags.StringVar(&opts.name, "name", "", "Specify volume name")
    46  	flags.Lookup("name").Hidden = true
    47  	flags.VarP(&opts.driverOpts, "opt", "o", "Set driver specific options")
    48  	flags.Var(&opts.labels, "label", "Set metadata for a volume")
    49  
    50  	return cmd
    51  }
    52  
    53  func runCreate(dockerCli *command.DockerCli, opts createOptions) error {
    54  	client := dockerCli.Client()
    55  
    56  	volReq := volumetypes.VolumesCreateBody{
    57  		Driver:     opts.driver,
    58  		DriverOpts: opts.driverOpts.GetAll(),
    59  		Name:       opts.name,
    60  		Labels:     runconfigopts.ConvertKVStringsToMap(opts.labels.GetAll()),
    61  	}
    62  
    63  	vol, err := client.VolumeCreate(context.Background(), volReq)
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	fmt.Fprintf(dockerCli.Out(), "%s\n", vol.Name)
    69  	return nil
    70  }