github.com/hustcat/docker@v1.3.3-0.20160314103604-901c67a8eeab/api/client/volume.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"text/tabwriter"
     7  
     8  	Cli "github.com/docker/docker/cli"
     9  	"github.com/docker/docker/opts"
    10  	flag "github.com/docker/docker/pkg/mflag"
    11  	"github.com/docker/engine-api/types"
    12  	"github.com/docker/engine-api/types/filters"
    13  )
    14  
    15  // CmdVolume is the parent subcommand for all volume commands
    16  //
    17  // Usage: docker volume <COMMAND> <OPTS>
    18  func (cli *DockerCli) CmdVolume(args ...string) error {
    19  	description := Cli.DockerCommands["volume"].Description + "\n\nCommands:\n"
    20  	commands := [][]string{
    21  		{"create", "Create a volume"},
    22  		{"inspect", "Return low-level information on a volume"},
    23  		{"ls", "List volumes"},
    24  		{"rm", "Remove a volume"},
    25  	}
    26  
    27  	for _, cmd := range commands {
    28  		description += fmt.Sprintf("  %-25.25s%s\n", cmd[0], cmd[1])
    29  	}
    30  
    31  	description += "\nRun 'docker volume COMMAND --help' for more information on a command"
    32  	cmd := Cli.Subcmd("volume", []string{"[COMMAND]"}, description, false)
    33  
    34  	cmd.Require(flag.Exact, 0)
    35  	err := cmd.ParseFlags(args, true)
    36  	cmd.Usage()
    37  	return err
    38  }
    39  
    40  // CmdVolumeLs outputs a list of Docker volumes.
    41  //
    42  // Usage: docker volume ls [OPTIONS]
    43  func (cli *DockerCli) CmdVolumeLs(args ...string) error {
    44  	cmd := Cli.Subcmd("volume ls", nil, "List volumes", true)
    45  
    46  	quiet := cmd.Bool([]string{"q", "-quiet"}, false, "Only display volume names")
    47  	flFilter := opts.NewListOpts(nil)
    48  	cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e. 'dangling=true')")
    49  
    50  	cmd.Require(flag.Exact, 0)
    51  	cmd.ParseFlags(args, true)
    52  
    53  	volFilterArgs := filters.NewArgs()
    54  	for _, f := range flFilter.GetAll() {
    55  		var err error
    56  		volFilterArgs, err = filters.ParseFlag(f, volFilterArgs)
    57  		if err != nil {
    58  			return err
    59  		}
    60  	}
    61  
    62  	volumes, err := cli.client.VolumeList(volFilterArgs)
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
    68  	if !*quiet {
    69  		for _, warn := range volumes.Warnings {
    70  			fmt.Fprintln(cli.err, warn)
    71  		}
    72  		fmt.Fprintf(w, "DRIVER \tVOLUME NAME")
    73  		fmt.Fprintf(w, "\n")
    74  	}
    75  
    76  	sort.Sort(byVolumeName(volumes.Volumes))
    77  	for _, vol := range volumes.Volumes {
    78  		if *quiet {
    79  			fmt.Fprintln(w, vol.Name)
    80  			continue
    81  		}
    82  		fmt.Fprintf(w, "%s\t%s\n", vol.Driver, vol.Name)
    83  	}
    84  	w.Flush()
    85  	return nil
    86  }
    87  
    88  type byVolumeName []*types.Volume
    89  
    90  func (r byVolumeName) Len() int      { return len(r) }
    91  func (r byVolumeName) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
    92  func (r byVolumeName) Less(i, j int) bool {
    93  	return r[i].Name < r[j].Name
    94  }
    95  
    96  // CmdVolumeInspect displays low-level information on one or more volumes.
    97  //
    98  // Usage: docker volume inspect [OPTIONS] VOLUME [VOLUME...]
    99  func (cli *DockerCli) CmdVolumeInspect(args ...string) error {
   100  	cmd := Cli.Subcmd("volume inspect", []string{"VOLUME [VOLUME...]"}, "Return low-level information on a volume", true)
   101  	tmplStr := cmd.String([]string{"f", "-format"}, "", "Format the output using the given go template")
   102  
   103  	cmd.Require(flag.Min, 1)
   104  	cmd.ParseFlags(args, true)
   105  
   106  	if err := cmd.Parse(args); err != nil {
   107  		return nil
   108  	}
   109  
   110  	inspectSearcher := func(name string) (interface{}, []byte, error) {
   111  		i, err := cli.client.VolumeInspect(name)
   112  		return i, nil, err
   113  	}
   114  
   115  	return cli.inspectElements(*tmplStr, cmd.Args(), inspectSearcher)
   116  }
   117  
   118  // CmdVolumeCreate creates a new volume.
   119  //
   120  // Usage: docker volume create [OPTIONS]
   121  func (cli *DockerCli) CmdVolumeCreate(args ...string) error {
   122  	cmd := Cli.Subcmd("volume create", nil, "Create a volume", true)
   123  	flDriver := cmd.String([]string{"d", "-driver"}, "local", "Specify volume driver name")
   124  	flName := cmd.String([]string{"-name"}, "", "Specify volume name")
   125  
   126  	flDriverOpts := opts.NewMapOpts(nil, nil)
   127  	cmd.Var(flDriverOpts, []string{"o", "-opt"}, "Set driver specific options")
   128  
   129  	cmd.Require(flag.Exact, 0)
   130  	cmd.ParseFlags(args, true)
   131  
   132  	volReq := types.VolumeCreateRequest{
   133  		Driver:     *flDriver,
   134  		DriverOpts: flDriverOpts.GetAll(),
   135  		Name:       *flName,
   136  	}
   137  
   138  	vol, err := cli.client.VolumeCreate(volReq)
   139  	if err != nil {
   140  		return err
   141  	}
   142  
   143  	fmt.Fprintf(cli.out, "%s\n", vol.Name)
   144  	return nil
   145  }
   146  
   147  // CmdVolumeRm removes one or more volumes.
   148  //
   149  // Usage: docker volume rm VOLUME [VOLUME...]
   150  func (cli *DockerCli) CmdVolumeRm(args ...string) error {
   151  	cmd := Cli.Subcmd("volume rm", []string{"VOLUME [VOLUME...]"}, "Remove a volume", true)
   152  	cmd.Require(flag.Min, 1)
   153  	cmd.ParseFlags(args, true)
   154  
   155  	var status = 0
   156  
   157  	for _, name := range cmd.Args() {
   158  		if err := cli.client.VolumeRemove(name); err != nil {
   159  			fmt.Fprintf(cli.err, "%s\n", err)
   160  			status = 1
   161  			continue
   162  		}
   163  		fmt.Fprintf(cli.out, "%s\n", name)
   164  	}
   165  
   166  	if status != 0 {
   167  		return Cli.StatusError{StatusCode: status}
   168  	}
   169  	return nil
   170  }