github.com/DaoCloud/dao@v0.0.0-20161212064103-c3dbfd13ee36/api/client/network/list.go (about) 1 package network 2 3 import ( 4 "fmt" 5 "sort" 6 "text/tabwriter" 7 8 "golang.org/x/net/context" 9 10 "github.com/docker/docker/api/client" 11 "github.com/docker/docker/cli" 12 "github.com/docker/docker/pkg/stringid" 13 "github.com/docker/engine-api/types" 14 "github.com/docker/engine-api/types/filters" 15 "github.com/spf13/cobra" 16 ) 17 18 type byNetworkName []types.NetworkResource 19 20 func (r byNetworkName) Len() int { return len(r) } 21 func (r byNetworkName) Swap(i, j int) { r[i], r[j] = r[j], r[i] } 22 func (r byNetworkName) Less(i, j int) bool { return r[i].Name < r[j].Name } 23 24 type listOptions struct { 25 quiet bool 26 noTrunc bool 27 filter []string 28 } 29 30 func newListCommand(dockerCli *client.DockerCli) *cobra.Command { 31 var opts listOptions 32 33 cmd := &cobra.Command{ 34 Use: "ls [OPTIONS]", 35 Aliases: []string{"list"}, 36 Short: "罗列所有网络", 37 Args: cli.NoArgs, 38 RunE: func(cmd *cobra.Command, args []string) error { 39 return runList(dockerCli, opts) 40 }, 41 } 42 43 flags := cmd.Flags() 44 45 flags.BoolVarP(&opts.quiet, "quiet", "q", false, "仅显示网络ID") 46 flags.BoolVar(&opts.noTrunc, "no-trunc", false, "不截断命令输出内容") 47 flags.StringSliceVarP(&opts.filter, "filter", "f", []string{}, "提供一些过滤值(比如 'dangling=true')") 48 49 return cmd 50 } 51 52 func runList(dockerCli *client.DockerCli, opts listOptions) error { 53 client := dockerCli.Client() 54 55 netFilterArgs := filters.NewArgs() 56 for _, f := range opts.filter { 57 var err error 58 netFilterArgs, err = filters.ParseFlag(f, netFilterArgs) 59 if err != nil { 60 return err 61 } 62 } 63 64 options := types.NetworkListOptions{ 65 Filters: netFilterArgs, 66 } 67 68 networkResources, err := client.NetworkList(context.Background(), options) 69 if err != nil { 70 return err 71 } 72 73 w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0) 74 if !opts.quiet { 75 fmt.Fprintf(w, "网络ID\t名称\t驱动\t范围") 76 fmt.Fprintf(w, "\n") 77 } 78 79 sort.Sort(byNetworkName(networkResources)) 80 for _, networkResource := range networkResources { 81 ID := networkResource.ID 82 netName := networkResource.Name 83 driver := networkResource.Driver 84 scope := networkResource.Scope 85 if !opts.noTrunc { 86 ID = stringid.TruncateID(ID) 87 } 88 if opts.quiet { 89 fmt.Fprintln(w, ID) 90 continue 91 } 92 fmt.Fprintf(w, "%s\t%s\t%s\t%s\t", 93 ID, 94 netName, 95 driver, 96 scope) 97 fmt.Fprint(w, "\n") 98 } 99 w.Flush() 100 return nil 101 }